Initial commit
This commit is contained in:
		
							
								
								
									
										287
									
								
								06-07-08-09-SystemOnChip/SystemOnChip/hdl/beamer.asm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								06-07-08-09-SystemOnChip/SystemOnChip/hdl/beamer.asm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,287 @@ | ||||
|                 ;=============================================================== | ||||
|                 ; Beamer control | ||||
|                 ;=============================================================== | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; register definitions | ||||
|                 ;   s0, s1: used for INPUT and OUTPUT operations | ||||
|                 ;   S2: returns UART data byte | ||||
|                 ;   S3: uart protocol checksum | ||||
|                 ;   S4: uart protocol packet id | ||||
|                 ;   S5: uart protocol command id | ||||
|                 ;   S6: uart protocol address | ||||
|                 ;   S7: uart protocol data | ||||
|                 ;   S8: copy of UART data byte for debug | ||||
|                 ;--------------------------------------------------------------- | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; GPIO definitions | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 CONSTANT  gpioBaseAddress,  0000 | ||||
|                 CONSTANT  gpioDataOffset,   0000 | ||||
|                 CONSTANT  gpioEnableOffset, 0001 | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; UART definitions | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 CONSTANT  uartBaseAddress,  0010 | ||||
|                 CONSTANT  uartBaudOffset,   0002 | ||||
|                 CONSTANT  uartStatusOffset, 0001 | ||||
|                 CONSTANT  uartDataReady,    0001 | ||||
|                 CONSTANT  uartSending,      0002 | ||||
| ;                CONSTANT  uartBaudCount,    023D        ; 66E6 / 115 200 = 573 | ||||
|                 CONSTANT  uartBaudCount,    0042        ; 66E6 / 1E6 = 66 | ||||
| ;                CONSTANT  uartpollDelay,    0100 | ||||
|                 CONSTANT  uartpollDelay,    0040 | ||||
|                 CONSTANT  commandNack,      0000 | ||||
|                 CONSTANT  commandWriteMem,  0003 | ||||
|                 CONSTANT  commandReadMem,   0004 | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; beamer peripheral definitions | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 CONSTANT  beamerBaseAddress,0020 | ||||
|                 CONSTANT  beamerCtlOffset,  0000 | ||||
|                 CONSTANT  beamerSpeedOffset,0001 | ||||
|                 CONSTANT  beamerCtlInit,    0401 | ||||
| ;                CONSTANT  beamerCtlInit,    1001 | ||||
|                 CONSTANT  beamerSpeedInit,  0004 | ||||
|  | ||||
|                 ;=============================================================== | ||||
|                 ; initializations | ||||
|                 ;=============================================================== | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; initialize GPIO | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 LOAD      s0, gpioBaseAddress | ||||
|                 ADD       s0, gpioDataOffset | ||||
|                 LOAD      s1, AA | ||||
|                 OUTPUT    s1, (s0) | ||||
|                 LOAD      s0, gpioBaseAddress | ||||
|                 ADD       s0, gpioEnableOffset | ||||
|                 LOAD      s1, 0F | ||||
|                 OUTPUT    s1, (s0) | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; initialize UART | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 LOAD      s0, uartBaseAddress | ||||
|                 ADD       s0, uartBaudOffset | ||||
|                 LOAD      s1, uartBaudCount | ||||
|                 OUTPUT    s1, (s0) | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; initialize beamer peripheral | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 LOAD      s0, beamerBaseAddress | ||||
|                 ADD       s0, beamerCtlOffset | ||||
|                 LOAD      s1, beamerCtlInit | ||||
|                 OUTPUT    s1, (s0) | ||||
|                 LOAD      s0, beamerBaseAddress | ||||
|                 ADD       s0, beamerSpeedOffset | ||||
|                 LOAD      s1, beamerSpeedInit | ||||
|                 OUTPUT    s1, (s0) | ||||
|  | ||||
|                 ;=============================================================== | ||||
|                 ; Main loop | ||||
|                 ;=============================================================== | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; Process commands from serial port | ||||
|                 ;--------------------------------------------------------------- | ||||
|           main: CALL      uartGetCmd            ; get command from UART | ||||
|                 COMPARE   s3, 0000              ; check function return | ||||
|                 JUMP      nz, commandAbort | ||||
|                 COMPARE   s5, commandWriteMem   ; check for WRITE_MEM command | ||||
|                 JUMP      nz, commandRead | ||||
|                 OUTPUT    s7, (s6)              ; write word to memory location | ||||
|                 CALL      sendWriteOk           ; send write acknowledge | ||||
|                 JUMP      main | ||||
|    commandRead: INPUT     s7, (s6)              ; write word in memory location | ||||
|                 CALL      sendReadData          ; send back read data | ||||
|                 JUMP      main | ||||
|   commandAbort: CALL      sendNAck | ||||
|                 JUMP      main | ||||
|  | ||||
|                 ;=============================================================== | ||||
|                 ; Subroutines | ||||
|                 ;=============================================================== | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; Get command from serial port | ||||
|                 ;--------------------------------------------------------------- | ||||
|     uartGetCmd: CALL      uartGetByte           ; get command header | ||||
|                 COMPARE   s2, 00AA | ||||
|                 JUMP      nz, uartGetCmd        ; loop until byte is AAh | ||||
|                 LOAD      s3, s2                ; prepare checksum | ||||
|                 CALL      uartGetByte           ; get packet id | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 LOAD      s4, s2                ; store id for reply | ||||
|                 CALL      uartGetByte           ; get command | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 COMPARE   s2, commandWriteMem   ; check for WRITE_MEM command | ||||
|                 JUMP      z , commandOk | ||||
|                 COMPARE   s2, commandReadMem    ; check for READ_MEM command | ||||
|                 JUMP      z , commandOk | ||||
|                 JUMP      commandKo             ; no match | ||||
|      commandOk: LOAD      s5, s2                ; store command for action | ||||
|                 CALL      uartGetByte           ; get data length | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 COMPARE   s5, commandWriteMem   ; check for WRITE_MEM command | ||||
|                 JUMP      z , testWrLength      ; go to test write command length | ||||
|                 COMPARE   s2, 0002              ; verify READ_MEM length | ||||
|                 JUMP      nz, commandKo | ||||
|                 JUMP      getAddress | ||||
|   testWrLength: COMPARE   s2, 0004              ; verify WRITE_MEM length | ||||
|                 JUMP      nz, commandKo | ||||
|     getAddress: CALL      uartGetByte           ; get address low | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 LOAD      s6, s2                ; store address low | ||||
|                 CALL      uartGetByte           ; get address high | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      shiftS2L8 | ||||
|                 ADD       s6, s2                ; build address from low and high | ||||
|                 COMPARE   s5, commandReadMem    ; check for READ_MEM command | ||||
|                 JUMP      z , getChecksum       ; skip reading data word | ||||
|                 CALL      uartGetByte           ; get data low | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 LOAD      s7, s2                ; store data low | ||||
|                 CALL      uartGetByte           ; get data high | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      shiftS2L8 | ||||
|                 ADD       s7, s2                ; build data from low and high | ||||
|    getChecksum: CALL      uartGetByte           ; get checksum | ||||
|                 AND       s3, 00FF              ; limit calculated checksum to 8 bit | ||||
|                 COMPARE   s3, s2                ; test checksum | ||||
|                 JUMP      nz, commandKo | ||||
|                 LOAD      s3, 0000              ; return OK | ||||
|                 RETURN | ||||
|      commandKo: LOAD      s3, 0001              ; return KO | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; send NACK reply | ||||
|                 ;--------------------------------------------------------------- | ||||
|       sendNAck: LOAD      s2, 00AA              ; send header | ||||
|                 LOAD      s3, s2                ; prepare checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s4                ; packet id | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, commandNack       ; negative Acknowledge | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, 0000              ; packet length: no data | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s3                ; checksum | ||||
|                 CALL      uartSendByte | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; send WRITE_MEM reply | ||||
|                 ;--------------------------------------------------------------- | ||||
|    sendWriteOk: LOAD      s2, 00AA              ; send header | ||||
|                 LOAD      s3, s2                ; prepare checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s4                ; packet id | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s5                ; received command | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, 0000              ; packet length: no data | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s3                ; checksum | ||||
|                 CALL      uartSendByte | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; send READ_MEM reply | ||||
|                 ;--------------------------------------------------------------- | ||||
|   sendReadData: LOAD      s2, 00AA              ; send header | ||||
|                 LOAD      s3, s2                ; prepare checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s4                ; packet id | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s5                ; received command | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, 0002              ; packet length: 2 bytes | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s7                ; data low | ||||
|                 AND       s2, 00FF              ; keep low byte only | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s7                ; data high | ||||
|                 CALL      shiftS2R8             ; shift MSBs down to LSBs | ||||
|                 ADD       s3, s2                ; calculate checksum | ||||
|                 CALL      uartSendByte | ||||
|                 LOAD      s2, s3                ; checksum | ||||
|                 CALL      uartSendByte | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; Get byte from serial port | ||||
|                 ;--------------------------------------------------------------- | ||||
|    uartGetByte: LOAD      s0, uartBaseAddress   ; read UART satus register | ||||
|                 ADD       s0, 01 | ||||
| ;load s8, 0100 | ||||
|      checkStat: LOAD      s2, uartpollDelay     ; add delay between bus reads | ||||
|         delay0: SUB       s2, 0001 | ||||
|                 JUMP      nz, delay0 | ||||
| ;sub s8, 0001 | ||||
| ;jump nz, continue | ||||
| ;load s2, 0035 | ||||
| ;call uartSendByte | ||||
| ;load s8, 0100 | ||||
| continue:       INPUT     s1, (s0) | ||||
|                 INPUT     s1, (s0) | ||||
|                 TEST      s1, uartDataReady     ; check "data ready" bit | ||||
|                 JUMP      z , checkStat         ; loop until bit is '1' | ||||
|                 LOAD      s0, uartBaseAddress   ; read UART data register | ||||
|                 INPUT     s2, (s0) | ||||
|                 INPUT     s2, (s0) | ||||
| ;LOAD s8, s2 | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; Send byte to serial port | ||||
|                 ;--------------------------------------------------------------- | ||||
|   uartSendByte: LOAD      s0, uartBaseAddress   ; read UART satus register | ||||
|                 ADD       s0, uartStatusOffset | ||||
|     readStatus: INPUT     s1, (s0) | ||||
|                 INPUT     s1, (s0) | ||||
|                 TEST      s1, uartSending       ; check "sending data" bit | ||||
|                 JUMP      z , sendByte          ; loop until bit is '1' | ||||
|                 LOAD      s1, uartpollDelay     ; add delay between bus reads | ||||
|         delay1: SUB       s1, 0001 | ||||
|                 JUMP      nz, delay1 | ||||
|                 JUMP      readStatus | ||||
|       sendByte: LOAD      s0, uartBaseAddress   ; write UART data register | ||||
|                 OUTPUT    s2, (s0) | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; shift s2 8 bits to the left | ||||
|                 ;--------------------------------------------------------------- | ||||
|      shiftS2L8: LOAD      s0, 8                 ; loop count | ||||
|  shiftLeftLoop: SL0       s2 | ||||
|                 SUB       s0, 0001 | ||||
|                 JUMP      nz, shiftLeftLoop | ||||
|                 RETURN | ||||
|  | ||||
|                 ;--------------------------------------------------------------- | ||||
|                 ; shift s2 8 bits to the right | ||||
|                 ;--------------------------------------------------------------- | ||||
|      shiftS2R8: LOAD      s0, 8                 ; loop count | ||||
| shiftRightLoop: SR0       s2 | ||||
|                 SUB       s0, 0001 | ||||
|                 JUMP      nz, shiftRightLoop | ||||
|                 RETURN | ||||
|  | ||||
|                 ;=============================================================== | ||||
|                 ; End of instruction memory | ||||
|                 ;=============================================================== | ||||
| ADDRESS 3FF | ||||
|    endOfMemory: JUMP      endOfMemory | ||||
		Reference in New Issue
	
	Block a user