;VFD Control Program ;disassembled ; Error in Interrupt routine ; PSW may be wrong after recive ;*************************************** ;VFD write Macro WRPULSE macro MOV RD, C ;CY on data Line CLR WR ;pulse SETB WR ; endM ;Data Load Macro LOADTAB macro INC A ;01..0x80 MOVC A, @A+PC ;read from RET + 1 RET ; endM _ACK EQU 06 _BUFSIZE EQU 20 _ClearScr EQU 1Fh ;**************************************** DSEG at 10h curState: ds 1 ;10h Byte11: ds 1 StrLen: ds 1 ;12h chksum: ds 1 ;13h RecPtr: ds 1 ;14h RecPtr CursorPos: ds 1 ;15h LinePtr RecBuffer: ds _BUFSIZE+1 ;16h Line1: ds _BUFSIZE ;2Bh Line 1 Line2: ds _BUFSIZE ;3Fh Line 2 StackP: ds 1 ;*********************************** CSEG at 0 AJMP Init org 3h RETI org 0Bh RETI org 13h RETI org 1Bh RETI org 23h LJMP Serial_IRQ ;_0023 ;*********************** org 30h Init: ;_0030: MOV SP, #StackP ; MOV PSW, #0h ; MOV SCON,#0D0h ;1101 0000 SMode3 9 Bit (with parity) MOV IE, #0h ; MOV IP, #0h ; MOV TMOD,#21h ;T1 Mode2 T0 Mode1 MOV TCON,#50h ;0101 0000 T1 Run MOV TH1, #0FDh ;9600 baud @11.059 MOV PCON,#0h ; CLR A ; MOV R0, #7Fh ;clear DMem InitMem: ;_004E: MOV @R0, A ; DJNZ R0, InitMem ; MOV R1, #Line1 ; InitBuffer: ;_0053: MOV @R1, #' ' ;Fill with Space INC R1 ; MOV A, R1 ; XRL A, #(Line1+2*_BUFSIZE); 40 Bytes JNZ InitBuffer ; CLR P1.3 ; CLR INT1 ; CLR P1.4 ; CLR T0 ; CLR T1 ; SETB P1.5 ; MOV R3, #40 ;40 times InitDisplay: ;_0069: CLR P1.7 ; CLR P1.6 ; SETB P1.6 ; DJNZ R3, InitDisplay; MOV R3, #40 ;40 times InitVFD: ;_0073: CLR RD ; CLR WR ; SETB WR ; DJNZ R3, InitVFD ; ;Alternative: ; MOV R3, #40 ;40 times ; CLR P1.7 ; ; CLR RD ; ;InitDisplay: ;_0069: ; CLR P1.6 ; ; SETB P1.6 ; ; CLR WR ; ; SETB WR ; ; DJNZ R3, InitDisplay; MOV R4, #Line1 ;R4 points to Line 0 SETB PS ; SETB ES ;Enable RS232 SETB EA ; CLR P1.0 ; ;************************** Main_Loop: ;_0085: MOV R2, #10h ;wait DJNZ R2, $ ; SETB T1 ; CLR T1 ; SETB T0 ; SETB P1.4 ; MOV A, R4 ; MOV R1, A ; ;Load Char MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable0 ; Line 0 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable1 ; Line 1 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable2 ; Line 2 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable3 ; Line 3 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable4 ; Line 4 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable5 ; Line 5 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #7Fh ; LCALL LoadTable6 ; Line 6 LCALL VFD_Shift ; MOV A, @R1 ; ANL A, #80h ; JZ _00D9 ; MOV A, #4h ; _00D9: LCALL VFD_Shift ; CLR P1.4 ; CLR T0 ; INC R4 ;next char SETB P1.6 ; CLR P1.6 ; CLR P1.7 ; MOV A, R4 ; XRL A, #(Line1+2*_BUFSIZE); all data send? JNZ _00F0 ; MOV R4, #Line1 ; then start at Line 1 again SETB P1.7 ; _00F0: MOV A, R6 ; RS233 data JNZ StateMachine ; AJMP Main_Loop ; ;************************ StateMachine: ;_00F5: MOV R7, A ; then save it MOV R6, #0h ; MOV A, curState ;curState RL A ; MOV DPTR, #StateTable; JMP @A+DPTR ; StateTable: ;_00FF: AJMP State_0 ;cmdstate AJMP State_1 ;strLenstate AJMP State_2 ;recivestate AJMP State_3 ;FillState AJMP State_4 ;SetPos AJMP State_5 ; AJMP State_6 ; AJMP State_7 ;nullState State_0: ;_010F: MOV A, R7 ; XRL A, #2h ; JZ cmd_Line1 ;case 2 MOV A, R7 ; XRL A, #3h ; JZ cmd_SetCursor ;case 3 MOV A, R7 ; XRL A, #4h ; JZ cmd_Line2 ;case 4 AJMP GotoState0 ; Cmd_Line1: ;cmd_2: _0120: MOV CursorPos, #Line1;Line 1 INC curState ;state=1 AJMP Main_Loop ; cmd_SetCursor: ;cmd_3: _0127: MOV curState, #4h ;state=4 AJMP Main_Loop ; Cmd_Line2: ;cmd_4: _012C: MOV CursorPos, #Line2;Line 2 INC curState ;state=1 AJMP Main_Loop ; ;StrLen? State_1: ;_0133: MOV A, R7 ; MOV Byte11, A ;curdata MOV StrLen, A ;loops MOV chksum, #0h ; MOV RecPtr, #RecBuffer;Rec Ptr to RecBuffer INC curState ;state=2 AJMP Main_Loop ; ;ReadData State_2: ;_0142: MOV A, R7 ;save V24 Data MOV R0, RecPtr ; MOV @R0, A ; XRL chksum, A ;chk sum MOV A, RecPtr ; XRL A, #Line1-1 ;BufferEnd 2Ah JZ _0150 ; INC RecPtr ; _0150: DJNZ StrLen, _0155 ;check lenght INC curState ;State=3 _0155: AJMP Main_Loop ;wait for next char ;Fill Line Buffer State_3: ;_0157: MOV A, R7 ; XRL A, chksum ; JNZ GotoState0 ; MOV curState, #0h ; MOV R0, #RecBuffer ; MOV R1, CursorPos ; MOV A, Byte11 ; CJNE A, #20, _0168 ; _0168: JC _016D ; MOV Byte11, #20 ; 20 times _016D: MOV A, @R0 ; MOV @R1, A ; INC R0 ; INC R1 ; DEC Byte11 ; MOV A, Byte11 ; JZ Send_Ack ; AJMP _016D ;Loop ;Set Cursor Pos State_4: ;_0179: MOV A, R7 ; CLR C ; ADD A, #0D7h ;-41 JC GotoState0 ; MOV A, R7 ; ADD A, #Line1 ; MOV CursorPos, A ; INC curState ;State =5 MOV chksum, #0h ; AJMP Main_Loop ; State_5: ;_018B: MOV R0, #RecBuffer ; MOV A, R7 ; MOV @R0, A ; MOV chksum, A ; INC curState ;State = 6 AJMP Main_Loop ; State_6: ;_0195: MOV A, R7 ; XRL A, chksum ; JNZ GotoState0 ; MOV curState, #0h ; MOV A, R7 ; XRL A, #_ClearScr ; JZ _01AA ; MOV A, RecBuffer ; MOV R0, CursorPos ; DEC R0 ; MOV @R0, A ; AJMP Send_Ack ; _01AA: MOV A, #2*_BUFSIZE ;40 times MOV R0, #Line1 ; _01AE: MOV @R0, #' ' ; space DEC A ; JZ Send_Ack ; INC R0 ; AJMP _01AE ; State_7: ;_01B6: AJMP GotoState0 ; Send_Ack: ;_01B8: CLR TB8 ; MOV SBUF, #_ACK ;ACK AJMP Main_Loop ; GotoState0: ;_01BF: MOV curState, #0h ; AJMP Main_Loop ; ;************************ VFD_Shift: ;_01C4: RRC A ;Bit 0 WRPULSE ; write carry RRC A ;Bit 1 WRPULSE ; write carry RRC A ;Bit 2 WRPULSE ; write carry RRC A ;Bit 3 WRPULSE ; write carry RRC A ;Bit 4 WRPULSE ; write carry RET ; ;************************ ;PUSH PSW fehlt ???? Serial_IRQ: ;_01E8: PUSH ACC ; ; PUSH PSW CLR TI ; CLR RI ; MOV A, SBUF ; JZ IRQ_NOK ;Zero Byte not allowed JB P, IRQ_CHKP ;P and RB8 must be same JB RB8, IRQ_NOK ; even Parity AJMP IRQ_OK ; IRQ_CHKP: ;_01FA JNB RB8, IRQ_NOK ;Parity wrong Error IRQ_OK: ;_01FD MOV R6, A ; ; POP PSW POP ACC ; RETI ; IRQ_NOK: ;_0201 MOV curState, #0h ;Reset State Machine ; POP PSW POP ACC ; RETI ; ;************************ LoadTable0: ;_0207: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,04h,0Ah,0Ah,04h,03h,06h,06h ;20 DB 08h,02h,00h,00h,00h,00h,00h,00h DB 0Eh,04h,0Eh,1Fh,08h,1Fh,0Ch,1Fh ;30 DB 0Eh,0Eh,00h,00h,08h,00h,02h,0Eh DB 0Eh,0Eh,0Fh,0Eh,07h,1Fh,1Fh,0Eh ;40 DB 11h,0Eh,1Ch,11h,01h,11h,11h,0Eh DB 0Fh,0Eh,0Fh,1Eh,1Fh,11h,11h,11h ;50 DB 11h,11h,1Fh,0Eh,00h,0Eh,04h,00h DB 04h,00h,01h,00h,10h,00h,0Ch,00h ;60 DB 01h,04h,08h,01h,06h,00h,00h,00h DB 00h,00h,00h,00h,02h,00h,00h,00h ;70 DB 00h,00h,00h,08h,04h,02h,02h,1Fh LoadTable1: ;_028A: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,04h,0Ah,0Ah,1Eh,13h,09h,04h ;20 DB 04h,04h,04h,04h,00h,00h,00h,10h DB 11h,06h,11h,08h,0Ch,01h,02h,10h ;30 DB 11h,11h,06h,06h,04h,00h,04h,11h DB 11h,11h,11h,11h,09h,01h,01h,11h ;40 DB 11h,04h,08h,09h,01h,1Bh,11h,11h DB 11h,11h,11h,01h,04h,11h,11h,11h ;50 DB 11h,11h,10h,02h,03h,90h,0Ah,00h ;special 0x90???? DB 04h,00h,01h,00h,10h,00h,12h,1Eh ;60 DB 01h,00h,00h,01h,04h,00h,00h,00h DB 00h,00h,00h,00h,02h,00h,00h,00h ;70 DB 00h,00h,00h,04h,04h,04h,15h,1Fh LoadTable2: ;_030D: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,04h,0Ah,1Fh,05h,08h,05h,02h ;20 DB 02h,08h,15h,04h,00h,00h,00h,08h DB 19h,04h,10h,04h,0Ah,0Fh,01h,08h ;30 DB 11h,11h,06h,06h,02h,1Fh,08h,10h DB 10h,11h,11h,01h,11h,01h,01h,01h ;40 DB 11h,04h,08h,05h,01h,15h,13h,11h DB 11h,11h,11h,01h,04h,11h,11h,11h ;50 DB 0Ah,11h,08h,02h,02h,08h,11h,00h DB 08h,0Eh,0Dh,0Eh,16h,0Eh,02h,11h ;60 DB 0Dh,06h,0Ch,09h,04h,0Bh,0Dh,0Eh DB 0Fh,16h,0Dh,0Eh,07h,11h,11h,11h ;70 DB 11h,11h,1Fh,04h,04h,04h,08h,1Fh LoadTable3: ;_0390: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,04h,00h,0Ah,0Eh,04h,02h,00h ;20 DB 02h,08h,0Eh,1Fh,00h,1Fh,00h,04h DB 15h,04h,08h,08h,09h,10h,0Fh,04h ;30 DB 0Eh,1Eh,00h,00h,01h,00h,10h,08h DB 16h,11h,0Fh,01h,11h,0Fh,0Fh,1Dh ;40 DB 1Fh,04h,08h,03h,01h,15h,15h,11h DB 0Fh,11h,0Fh,0Eh,04h,11h,11h,15h ;50 DB 04h,0Ah,04h,02h,04h,08h,00h,00h DB 00h,10h,13h,01h,19h,11h,07h,11h ;60 DB 13h,04h,08h,05h,04h,15h,13h,11h DB 11h,19h,13h,01h,02h,11h,11h,11h ;70 DB 0Ah,11h,08h,02h,00h,08h,00h,1Fh LoadTable4: ;_0413: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,1Fh,14h,02h,15h,00h ;20 DB 02h,08h,15h,04h,06h,00h,00h,02h DB 13h,04h,04h,10h,1Fh,10h,11h,02h ;30 DB 11h,10h,06h,06h,02h,1Fh,08h,04h DB 15h,1Fh,11h,01h,11h,01h,01h,11h ;40 DB 11h,04h,08h,05h,01h,11h,19h,11h DB 01h,15h,05h,10h,04h,11h,11h,15h ;50 DB 0Ah,04h,02h,02h,08h,08h,00h,00h DB 00h,1Eh,11h,01h,11h,1Fh,02h,1Eh ;60 DB 11h,04h,08h,03h,04h,15h,11h,11h DB 0Fh,1Eh,01h,0Eh,02h,11h,11h,15h ;70 DB 04h,1Eh,04h,04h,04h,04h,00h,1Fh LoadTable5: ;_0496: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,0Ah,0Fh,19h,09h,00h ;20 DB 04h,04h,04h,04h,04h,00h,06h,01h DB 11h,04h,02h,11h,08h,11h,11h,02h ;30 DB 11h,08h,06h,04h,04h,00h,04h,00h DB 15h,11h,11h,11h,09h,01h,01h,11h ;40 DB 11h,04h,09h,09h,01h,11h,11h,11h DB 01h,09h,09h,10h,04h,11h,0Ah,15h ;50 DB 11h,04h,01h,02h,10h,08h,00h,00h DB 00h,11h,11h,11h,11h,01h,02h,10h ;60 DB 11h,04h,09h,05h,04h,11h,11h,11h DB 01h,10h,01h,10h,12h,19h,0Ah,15h ;70 DB 0Ah,10h,02h,04h,04h,04h,00h,1Fh LoadTable6: ;_0519: LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,04h,00h,0Ah,04h,18h,16h,00h ;20 DB 08h,02h,00h,00h,02h,00h,06h,00h DB 0Eh,0Eh,1Fh,0Eh,08h,0Eh,0Eh,02h ;30 DB 0Eh,06h,00h,02h,08h,00h,02h,04h DB 0Eh,11h,0Fh,0Eh,07h,1Fh,01h,1Eh ;40 DB 11h,0Eh,06h,11h,1Fh,11h,11h,0Eh DB 01h,16h,11h,0Fh,04h,0Eh,04h,0Ah ;50 DB 11h,04h,1Fh,0Eh,00h,0Eh,00h,1Fh DB 00h,1Eh,0Fh,0Eh,1Eh,1Eh,02h,0Fh ;60 DB 11h,0Eh,06h,09h,0Eh,11h,11h,0Eh DB 01h,10h,01h,0Fh,0Ch,16h,04h,0Ah ;70 DB 11h,0Eh,1Fh,18h,04h,02h,00h,1Fh LoadTabble7: ;059C ;Table not used ; LOADTAB DB 00h,00h,00h,00h,00h,00h,00h,00h ;00 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;10 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,04h,00h,0Ah,04h,18h,16h,00h ;20 DB 08h,02h,00h,00h,02h,00h,06h,00h DB 0Eh,0Eh,1Fh,0Eh,08h,0Eh,0Eh,02h ;30 DB 0Eh,06h,00h,02h,08h,00h,02h,04h DB 0Eh,11h,0Fh,0Eh,07h,1Fh,01h,1Eh ;40 DB 11h,0Eh,06h,11h,1Fh,11h,11h,0Eh DB 01h,16h,11h,0Fh,04h,0Eh,04h,0Ah ;50 DB 11h,04h,1Fh,0Eh,00h,0Eh,00h,1Fh DB 00h,1Eh,0Fh,0Eh,00h,00h,00h,00h ;60 DB 00h,00h,00h,00h,00h,00h,00h,00h DB 00h,00h,00h,00h,00h,00h,00h,00h ;70 DB 00h,00h,00h,00h,00h,00h,00h,00h END