49 lines
1.7 KiB
Plaintext
49 lines
1.7 KiB
Plaintext
.TITLE DAMMAL
|
|
.MCALL .GTLIN,.PRINT,.EXIT
|
|
DAMMAL::JMP DEMO
|
|
|
|
; VALIDATE DAMM STRING IN R0; ZERO FLAG SET IF VALID
|
|
DAMM: CLR R2 ; INTERIM DIGIT
|
|
BR 2$
|
|
1$: SUB #60,R1 ; DIGIT?
|
|
BCS 3$ ; IF NOT, NOT VALID
|
|
CMP R1,#^D9
|
|
BGT 3$
|
|
MOV R2,R3 ; CALCULATE DAMM TABLE INDEX
|
|
ASL R3
|
|
ASL R3
|
|
ADD R2,R3
|
|
ASL R3
|
|
ADD R1,R3
|
|
MOVB 4$(R3),R2 ; GET NEW INTERIM DIGIT FROM TABLE
|
|
2$: MOVB (R0)+,R1 ; NEXT CHAR
|
|
BNE 1$ ; END OF STRING?
|
|
TST R2 ; IF SO, CHECK IF INTERIM DIGIT IS 0
|
|
3$: RTS PC
|
|
4$: .BYTE ^D0,^D3,^D1,^D7,^D5,^D9,^D8,^D6,^D4,^D2
|
|
.BYTE ^D7,^D0,^D9,^D2,^D1,^D5,^D4,^D8,^D6,^D3
|
|
.BYTE ^D4,^D2,^D0,^D6,^D8,^D7,^D1,^D3,^D5,^D9
|
|
.BYTE ^D1,^D7,^D5,^D0,^D9,^D8,^D3,^D4,^D2,^D6
|
|
.BYTE ^D6,^D1,^D2,^D3,^D0,^D4,^D5,^D9,^D7,^D8
|
|
.BYTE ^D3,^D6,^D7,^D4,^D2,^D0,^D9,^D5,^D8,^D1
|
|
.BYTE ^D5,^D8,^D6,^D9,^D7,^D2,^D0,^D1,^D3,^D4
|
|
.BYTE ^D8,^D9,^D4,^D5,^D3,^D6,^D2,^D0,^D1,^D7
|
|
.BYTE ^D9,^D4,^D4,^D8,^D6,^D1,^D7,^D2,^D0,^D5
|
|
.BYTE ^D2,^D5,^D8,^D1,^D4,^D3,^D6,^D7,^D9,^D0
|
|
|
|
DEMO: .GTLIN #5$ ; READ LINE
|
|
MOV #5$,R0
|
|
TSTB (R0) ; EMPTY LINE?
|
|
BNE 1$
|
|
.EXIT ; IF SO, STOP
|
|
1$: JSR PC,DAMM ; TEST LINE
|
|
BNE 2$ ; FAIL?
|
|
.PRINT #3$
|
|
BR DEMO
|
|
2$: .PRINT #4$ ; PASS?
|
|
BR DEMO
|
|
3$: .ASCIZ /PASS/
|
|
4$: .ASCIZ /FAIL/
|
|
5$: .BLKB 200
|
|
.END DAMMAL
|