Barcode reader Jurgen Kramer, 01-01-93 ; BARCODE.ASM - Read Bar Codes ; NMS1170 Bar Code Reader ; (C) 1993 KMcs ; Written by Jurgen Kramer - 17/10/93 - IOPRT: EQU 18H LINL40: EQU 0F3AEH CHGMOD: EQU 5FH ERAFNK: EQU 0CCH CHPUT: EQU 0A2H DCOMPR: EQU 20H CR: EQU 0DH LF: EQU 0AH EOT: EQU 0 ; Read I/O port ; bit 7: Buffer status ; 0 = Barcode staat gereed ; 1 = Einde barcode ; bit 6....0 = ASCII teken, barcode cijfer of Code ID ; ; Write I/O port ; bit 7 en 6 = Command bits ; bit 5....0 = Data bits ; ; Commands: ; ; 00 : Pairs length ; Stel de barcode lengte in voor Interleaved 2 of 5. ; 0 betekent een variabele lengte ; ; 01 : Decoding symbologies ; b0 = 1: Code 3 or 9 ; b1 = 1: UPC ; b2 = 1: EAN ; b3 = 1: Interleaved 2 or 5 ; b4 = 1: Msi/Plessey ; b5 = 1: Codabar ; ; Het wordt aangeraden maximaal een optie tegelijk aan te zetten voor een ; zo hoog mogelijke leeszekerheid. Mochten er toch meerdere tegelijk worden ; aangezet, dan is het aan te raden het Code ID meet te laten sturen. ; ; 10 : Enable Format Options ; b5 = 1: Code ID meesturen ; b4 = 1: Start/Stop tekens sturen bij Codabar ; b3 = 1: Code 3 of 9 decoderen in full-ASCII ; b2 = 1: 'Addena' van de UPC en EAN codes meesturen bij links naar ; rechts inlezen van de barcode ; ; 11 : Enable / Disable scan ; b3 = 1: Enable scan ; b2 = 1: Disable scan ; ; ; Code ID of a barcode ; ; Het code ID staat als eerste teken voor de eigenlijke barcode en bestaat uit ; een letter. Als het een kleine letter is, dan is bit 5 gezet en is de barcode ; van rechts naar links ingelezen. Als het een hoofdletter is, dan is de ; barcode van links naar rechts ingelezen. De richting waarin de barcode ; ingelezen is is niet van belang voor de barcode die achter het code ID staat. ; Deze wordt altijd in de juiste volgorde doorgegeven. ; ; a / A = Codabar ; b / B = Code 3 of 9 ; c / C = UPC ; d / D = EAN ; e / E = Interleaved 2 of 5 ; g / G = Msi/Plessey ; ORG 0C000H INIT: PUSH AF PUSH DE PUSH BC PUSH HL EI ; Enable interrupt LD A,00000000B ; Pairs length > variable length OUT (IOPRT),A HALT LD A,01111111B ; Decoding symbologies > all OUT (IOPRT),A HALT LD A,10111111B ; Enable format options > Send code ID etc. OUT (IOPRT),A HALT LD A,11001000B ; Enable scan OUT (IOPRT),A HALT DI LD A,80 LD (LINL40),A XOR A LD (STATUS),A CALL CHGMOD ; Init screen 0 width 80 CALL ERAFNK ; Keys off LD HL,INITXT CALL PRINT ; Print init text LD HL,6*80 LD (CSRXY),HL LD A,00001101B OUT (0ABH),A ; Caps led off ; Read & print barcode LOOP: CALL READKY ; Test spacebar JR Z,ENDE ; Spacebar pressed HALT IN A,(IOPRT) BIT 7,A ; Test status JR NZ,LOOP ; No barcode ready CALL READY LD HL,BUFFER AND 01111111B ; Mask code ID & direction NXTCHR: LD (HL),A ; Store character INC HL HALT IN A,(IOPRT) BIT 7,A ; End of barcode JR Z,NXTCHR DI AND 01111111B LD (HL),A ; Store last character INC HL LD (HL),0 ; Mark end of barcode LD HL,(CSRXY) LD BC,80 ADD HL,BC LD DE,20*80 RST DCOMPR CALL Z,CLRSCR LD (CSRXY),HL CALL SETWRT LD DE,BUFFER LD A,(DE) ; Get code ID BIT 5,A ; Test direction PUSH AF ; Save zero-flag LD HL,BARTYP LD DE,20 RES 5,A ; Upper case SUB 41H SRHCOD: AND A JR Z,WRSORT ADD HL,DE DEC A JR SRHCOD WRSORT: LD B,E OTIR ; Write barcode type LD DE,BUFFER+1 WRCODE: LD A,(DE) ; Get charater of barcode AND A ; Last character JR Z,PRDIR OUT (C),A ; Write char. INC DE JR WRCODE PRDIR: LD HL,(CSRXY) LD DE,40 ADD HL,DE CALL SETWRT POP AF LD HL,LFTTXT JR Z,RGTLFT LD HL,RGTTXT RGTLFT: LD B,10 OTIR ; Print direction CALL READY JR LOOP ENDE: POP HL POP DE POP BC POP AF RET READY: PUSH AF LD HL,4*80+67 CALL SETWRT LD A,(STATUS) XOR 1 LD (STATUS),A LD HL,BSYTXT LD A,00001100B JR NZ,BUSY LD HL,RDYTXT XOR 1 BUSY: OUT (0ABH),A ; Toggle CAPS led LD B,5 OTIR POP AF RET CLRSCR: LD HL,6*80 CALL SETWRT LD H,4 LD A," " FILL: OUT (C),A ; 256 * space DJNZ FILL DEC H JR NZ,FILL LD B,96 FILL2: OUT (C),A DJNZ FILL2 LD HL,7*80 RET PRINT: LD A,(HL) AND A RET Z CALL CHPUT INC HL JR PRINT READKY: DI IN A,(0AAH) AND 0F0H OR 8 OUT (0AAH),A IN A,(0A9H) BIT 0,A EI RET ; SETWRT ; DOEL: zet VDP om te schrijven naar page 0 ; INVOER: HL=VRAM adres ; UITVOER: C bevat data schrijfprt. SETWRT: DI LD BC,99H LD A,H AND 0C0H OR B RLCA RLCA OUT (C),A ; schrijf drie hoogste LD A,8EH ; bits naar reg. 14 OUT (C),A LD A,H OUT (C),L ; schrijf 8 laagste bits AND 3FH ; zet bit 6 om te OR 40H ; schrijven OUT (C),A ; schrijf restbits DEC C EI RET INITXT: DEFB "Barcode tester version 1.0 (C) 1993 KMcs",CR,LF DEFB "Written by Jurgen Kramer - 23/10/93 -",CR,LF,CR,LF DEFB CR,LF,9,9,9,9,9,9,9," STATUS: READY",CR,LF DEFB "Type: Barcode: Direction:",CR,LF,EOT BARTYP: DEFB "Codabar " ; A / a DEFB "Code 3 / 9 " ; B / b DEFB "UPC " ; C / c DEFB "EAN " ; D / d DEFB "Interleaved 2 / 5 " ; E / e DEFB " " ; dummy DEFB "Msi / Plessey " ; G / g RGTTXT: DEFB "right-left" LFTTXT: DEFB "left-right" STATUS: DEFB 0 RDYTXT: DEFB "READY" BSYTXT: DEFB "BUSY " CSRXY: DEFW 6*80 BUFFER: DS 20 KEEP: DEFB 0 |