54 lines
1.7 KiB
Text
54 lines
1.7 KiB
Text
.TITLE PALIN
|
|
.MCALL .GTLIN,.PRINT,.EXIT
|
|
PALIN:: .GTLIN #INBUF ; READ INPUT
|
|
MOV #INBUF,R0
|
|
TSTB (R0) ; END OF INPUT?
|
|
BEQ 3$
|
|
JSR PC,EPALIN ; CHECK (EXACT) PALINDROME
|
|
BNE 1$
|
|
.PRINT #4$
|
|
BR PALIN
|
|
1$: MOV #INBUF,R0 ; CHECK INEXACT PALINDROME
|
|
JSR PC,IPALIN
|
|
BNE 2$
|
|
.PRINT #5$
|
|
BR PALIN
|
|
2$: .PRINT #6$ ; NOT A PALINDROME AT ALL
|
|
BR PALIN
|
|
3$: .EXIT
|
|
4$: .ASCIZ /EXACT PALINDROME/
|
|
5$: .ASCIZ /INEXACT PALINDROME/
|
|
6$: .ASCIZ /NOT A PALINDROME/
|
|
.EVEN
|
|
|
|
; IS STRING AT R0 AN EXACT PALINDROME?
|
|
; ZERO FLAG SET IF TRUE
|
|
EPALIN: MOV R0,R1
|
|
1$: TSTB (R1)+ ; FIND END OF STRING
|
|
BNE 1$
|
|
DEC R1
|
|
2$: CMPB (R0)+,-(R1) ; SCAN BACKWARDS AND FORWARDS
|
|
BNE 4$ ; NOT PALINDROME?
|
|
CMP R0,R1 ; DONE YET?
|
|
BLT 2$
|
|
3$: CLR R1
|
|
4$: RTS PC
|
|
|
|
; IS STRING AT R0 AN INEXACT PALINDROME?
|
|
IPALIN: MOV #3$,R1 ; COPY TO BUFFER
|
|
BR 2$
|
|
1$: BICB #40,R2 ; MAKE UPPERCASE IF LETTER
|
|
CMPB R2,#101 ; < A = DISREGARD
|
|
BLT 2$
|
|
CMPB R2,#132 ; > Z = DISREGARD
|
|
BGT 2$
|
|
MOVB R2,(R1)+ ; STORE IN BUFFER
|
|
2$: MOVB (R0)+,R2 ; GET CHARACTER
|
|
BNE 1$ ; END?
|
|
CLRB (R1) ; ZERO TERMINATE BUFFER
|
|
MOV #3$,R0 ; NOW SEE IF RESULT IS EXACT PALINDROME
|
|
BR EPALIN
|
|
3$: .BLKB 200 ; BUFFER
|
|
|
|
INBUF: .BLKB 200
|
|
.END PALIN
|