;=============================================================== ; 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