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