****************************** * MAGNETIC STRIP CARD READER * * BY WALID MAALOULI * * MAY 2009 * ****************************** DEF START REF KSCAN,VWTR,VSBW,VMBW,VSBR KEYADR EQU >8374 * KEYBOARD SELECTION ADDRESS FOR KSCAN KEY EQU >8375 * ADDRESS OF KEY PRESSED VALUE GPLSTS EQU >837C * GPL STATUS BYTE RETURN BSS 2 * PROGRAM RETURN ADDRESS SAVRTN BSS 2 * SUBROUTINE RETURN ADDRESS BUFFER BSS 500 * CODED CARD DATA STORAGE SPACE CRDDAT BSS 50 * DECODED CARD DATA STORAGE SPACE START MOV R11,@RETURN * SAVE PROGRAM RETURN ADDRESS LI R0,>F000 * VALUE FOR VR1 FOR TEXT MODE MOVB R0,@>83D4 * SAVE VALUE IN INTERPRETER WORKSPACE LI R0,>01F0 * SELECT TEXT MODE IN VR1 BLWP @VWTR * START TEXT MODE BL @CLS * CLEAR SCREEN LI R0,>0731 * SET COLORS GREEN ON BLACK BLWP @VWTR * APPLY COLORS LI R12,>0024 * CRU ADDRESS OF KEYBOARD COLUMN DECODER LI R1,>0600 * SELECT COLUMN 6 (JOYSTICK #1) LDCR R1,3 * LOAD SELECTION INTO CRU CLR R3 * R3 IS DATA BUFFER POINTER CLR R0 LI R12,>0006 * CRU ADDRESS OF KEYBOARD ROWS LOOP1 STCR R6,5 * READ JOYSTICK PORT STATUS AND STORE IN R6 INV R6 * MAKE ACTIVE HIGH A 1 SLA R6,6 * PLACE RIGHT IN CARRY AND LEFT IN MSB JNC LOOP1 * RESCAN IF CARD NOT PRESENT JLT LOOP1 * RESCAN IF CLOCK SIGNAL NOT PRESENT SLA R6,2 * CHECK IF FIRE PRESSED (READ DATA) JOC SETONE * MOVB @ZERO,R1 * PLACE A 0 IN R1 BLWP @VSBW * DISPLAY 0 ON SCREEN INC R0 * NEXT SCREEN POSITION TB 2 * CHECK IF CARD STILL PRESENT JNE LOOP1 * RESCAN PORTS IF YES JMP DECODE SETONE MOVB @ONE,R1 * PLACE A 1 IN R1 BLWP @VSBW * DISPLAY A 1 ON SCREEN INC R0 * NEXT SCREEN POSITION TB 2 * CHECK IF CARD STILL PRESENT JNE LOOP1 * RESCAN PORTS IF YES DECODE MOVB @DELIM,R1 * PLACE DATA DELIMITER (ASCII !) AT END OF DATA BLWP @VSBW * DISPLAY DELIMITER ON SCREEN CLR R0 * RESET SCREEN TO ORIGIN CLR R1 LOOP3 BLWP @VSBR * READ DATA FROM SCREEN VDP MOVB R1,@BUFFER(R3) * SAVE DATA IN CODED BUFFER CI R1,>2100 * CHECK IF SCREEN DELIMITER REACHED JEQ CONT INC R3 * NEXT BUFFER POSITION INC R0 * NEXT SCREEN VDP POSITION JMP LOOP3 * REDO UNTIL DATA DELIMITER REACHED CONT BL @CLS * CLEAR THE SCREEN CLR R0 * RESET SCREEN TO ORIGIN CLR R3 * RESET BUFFER POINTER CLR R1 * LOOP BELOW SKIPS LEADING ZEROES IN DATA BUFFER REDO MOVB @BUFFER(R3),R1 * PLACE DATA BYTE FROM BUFFER INTO R1 INC R3 * NEXT BUFFER POSITION CI R1,>3000 * COMPARE R1 TO ZERO JEQ REDO * END LOOP LI R4,4 * 5 BYTE BLOCKS - 1ST BYTE ALREADY READ CLR R9 * DECODED BUFFER POINTER LOOP2 MOVB @BUFFER(R3),R1 * READ DATA BYTE FROM BUFFER CI R1,>2100 * CHECK IF DATA DELIMITER PRESENT (ASCII !) JEQ QUIT * QUIT PROGRAM IF FOUND INC R3 * NEXT BUFFER POSITION DEC R4 * KEEP TRACK OF BYTES LEFT IN BLOCK JNE LOOP2 MOV R3,R5 * COPY BUFFER POINTER TO R5 AI R5,-5 * ROLL BACK POINTER TO START OF 5 BYTE DATA GROUP MOV R5,R8 * SAVE POINTER IN R8 CLR R7 CLR R6 LI R4,5 LOOP4 CB @BUFFER(R5),@BINARY(R6) * CHECK IF CURRENT BYTE MATCHES BINARY TABLE JNE NEXT * IF NOT THEN GO TO NEXT BINARY DATA GROUP INC R5 * NEXT BUFFER POSITION INC R6 * NEXT BYTE IN BINARY DATA GROUP DEC R4 * 5 BYTES IN EACH DATA GROUP JNE LOOP4 * CONTINUE UNTIL ALL 5 BYTES COMPARED MOVB @BCD(R7),@CRDDAT(R9) * DECODE BINARY DATA AND SAVE IN BUFFER CI R7,15 * CHECK IF END SENTINEL CHARACTER FOUND JEQ DISPLY * IF YES THEN DISPLAY CARD INFO JMP CONT1 * DECODE NEXT GROUP OF 5 BYTES NEXT INC R7 * NEXT POSITION IN BCD DATA TABLE CI R7,16 * CHECK IF END OF TABLE REACHED JNE NEXT1 * COMPARE TO NEXT BINARY DATA GROUP LI R1,>2A00 * PLACE A * IN BUFFER (UNREADABLE CHARACTER) MOVB R1,@CRDDAT(R9) JMP CONT1 * COMPARE NEXT BINARY DATA GROUP NEXT1 MOV R8,R5 * RESTORE BUFFER POINTER AI R4,-5 * FIND WHERE WE ARE IN DATA GROUP A R4,R6 * RESET POINTER TO BEGINING OF DATA GROUP AI R6,5 * MOVE TO NEXT GROUP LI R4,5 * RESET COUNTER JMP LOOP4 * START BYTE COMPARISION AGAIN CONT1 INC R9 * NEXT DECODED BUFFER POSITION LI R4,5 * 5 BYTE DATA GROUPS JMP LOOP2 * GET THE NEXT DATA GROUP DISPLY LI R1,CREDIT * POINT TO CREDIT TEXT LI R2,33 * LENGTH OF CREDIT TEXT LI R0,3 * SCREEN LOCATION OF TEXT BLWP @VMBW * PLACE TEXT ON SCREEN AI R1,33 * NEXT CREDIT TEXT LI R2,30 LI R0,43 BLWP @VMBW LI R0,120 LI R9,1 * POINT TO SECOND BYTE IN DECODED BUFFER LI R7,16 * 16 NUMBERS IN CARD ACCOUNT LI R1,CRDNUM * POINT TO CARD NUMBER TEXT PROMPT LI R2,13 * LENGTH OF PROMPT BLWP @VMBW * DISPLAY PROMPT LI R0,133 * LOCATE SCREEN POINTER AFTER PROMPT CONT2 MOVB @CRDDAT(R9),R1 * READ BYTE FROM DECODED BUFFER BLWP @VSBW * DISPLAY BYTE INC R0 * NEXT SCREEN POSITION INC R9 * NEXT BUFFER POSITION DEC R7 * KEEP TRACK OF CARD ACCOUNT NUMBERS LEFT JNE CONT2 LI R0,160 INC R9 LI R1,EXPYR LI R2,17 BLWP @VMBW LI R0,177 LI R7,2 CONT3 MOVB @CRDDAT(R9),R1 BLWP @VSBW INC R9 INC R0 DEC R7 JNE CONT3 LI R0,200 LI R1,EXPMON LI R2,18 BLWP @VMBW LI R0,218 LI R7,2 CONT4 MOVB @CRDDAT(R9),R1 BLWP @VSBW INC R9 INC R0 DEC R7 JNE CONT4 QUIT BL @KEYINP * CHECK FOR KEYPRESS MOV @RETURN,R11 B *R11 ******************************************************************************** * TEXT MODE SCREEN CLEARING ROUTINE CLS CLR R1 CLR R0 LI R2,960 * 960 SCREEN POSITIONS LOOP BLWP @VSBW * CLEAR SCREEN POSITION INC R0 * NEXT SCREEN POSITION DEC R2 * KEEP TRACK OF REMAINING SCREEN POSITIONS JNE LOOP RT ******************************************************************************** * KEY INPUT ROUTINE KEYINP CLR @GPLSTS * CLEAR GPL STATUS BYTE BLWP @KSCAN * CHECK FOR KEYPRESS CB @ANYKEY,@GPLSTS * CHECK IF BIT 2 OF GPL STATUS BYTE IS SET JNE KEYINP RT ******************************************************************************** ANYKEY BYTE >20 * MASK FOR BIT 2 OF GPL STATUS BYTE ZERO BYTE >30 * ASCII ZERO ONE BYTE >31 * ASCII ONE DELIM BYTE >21 * DATA DELIMITER IN BUFFER (ASCII !) BINARY BYTE >30,>30,>30,>30,>31 BYTE >31,>30,>30,>30,>30 BYTE >30,>31,>30,>30,>30 BYTE >31,>31,>30,>30,>31 BYTE >30,>30,>31,>30,>30 BYTE >31,>30,>31,>30,>31 BYTE >30,>31,>31,>30,>31 BYTE >31,>31,>31,>30,>30 BYTE >30,>30,>30,>31,>30 BYTE >31,>30,>30,>31,>31 BYTE >30,>31,>30,>31,>31 BYTE >31,>31,>30,>31,>30 BYTE >30,>30,>31,>31,>31 BYTE >31,>30,>31,>31,>30 BYTE >30,>31,>31,>31,>30 BYTE >31,>31,>31,>31,>31 BCD BYTE >30,>31,>32,>33,>34 BYTE >35,>36,>37,>38,>39 BYTE >3A,>3B,>3C,>3D,>3E BYTE >3F CREDIT TEXT 'Credit Card Magnetic Strip Reader' TEXT ' By Walid Maalouli - May 2009' CRDNUM TEXT 'Card number: ' EXPMON TEXT 'Expiration month: ' EXPYR TEXT 'Expiration year: ' ******************************************************************************** END START