passport/src/compare.a

248 lines
5.5 KiB
Plaintext
Raw Normal View History

2017-01-08 03:35:35 +00:00
WILDCARD = $97
;-------------------------------
; SearchTrack subroutine
; written by qkumba
; search for a string occurring anywhere
; in the data buffer for the current track
; #WILDCARD in search string matches any 1 byte
; (like "." character in regular expressions)
; in: Y = string length
; stack = string to find
; out: C clear if string found
; or set if not found
; If C is clear, then
2021-06-13 05:06:09 +00:00
; A = @gDisplayBytes = sector where string was found
2017-01-08 03:35:35 +00:00
; X = starting offset where string was found
; all other registers and flags clobbered
;-------------------------------
SearchTrack
2017-02-21 00:50:38 +00:00
;set end point for the search
lda #BASEPAGE+$10
sta .endvalue+1
lda #BASEPAGE
bne SearchSectors
;-------------------------------
; SearchSector subroutine
; written by qkumba
; same as SearchTrack, but for a single sector
2021-06-20 21:35:48 +00:00
; in: A = high byte of sector address in data buffer (e.g. $10 for sector 0)
2017-02-21 00:50:38 +00:00
; Y = string length
; stack = string to find
; out: C clear if string found
; or set if not found
; If C is clear, then
; X = starting offset where string was found
; all other registers and flags clobbered
;-------------------------------
SearchSector
;set end point for the search
tax
inx
stx .endvalue+1
; set high part of initial search position
SearchSectors
sta search+2
2017-01-08 03:35:35 +00:00
pla
sta match_buffer1+1
sta match_all+1
pla
sta match_buffer1+2
sta match_all+2
tax
sty match_size1+1
sty match_size2+1
; fetch last byte to improve search speed
match_buffer1
lda $d1d1,y ; modified at runtime
sta check_byte1+1
sta check_byte2+1
; set low part of initial search position
tya
dey
sty cont_search+1
; set return address
clc
adc match_buffer1+1
tay
bcc plus01
inx
plus01
txa
pha
tya
pha
; set match position
inc match_all+1
bne plus02
inc match_all+2
plus02
lda #<cont_search-branch_cont-2
sta branch_cont+1
; search...
cont_search
ldy #$d1 ; modified at runtime
search
lda $d100,y ; modified at runtime
iny
beq check_end
check_byte1
cmp #$d1 ; modified at runtime
bne search
; point to first byte
sty cont_search+1
check_match
tya
match_size1
sbc #$d1 ; modified at runtime
sta match_buffer2+1
ldx search+2
bcs plus03
dex
plus03
stx match_buffer2+2
ldy #$00
match_all
lda $d1d1,y ; modified at runtime
cmp #WILDCARD
beq found_wild
match_buffer2
cmp $d1d1,y ; modified at runtime
branch_cont
bne cont_search
found_wild
iny
match_size2
cpy #$d1 ; modified at runtime
bne match_all
; point to start of match
ldx match_buffer2+1
lda match_buffer2+2
sec
sbc #BASEPAGE
2021-06-13 05:06:09 +00:00
sta gDisplayBytes
2021-06-13 05:43:46 +00:00
clc
2017-01-08 03:35:35 +00:00
rts
; cold path
check_end
inc search+2
ldx search+2
2017-02-21 00:50:38 +00:00
.endvalue
cpx #$D1
2017-01-08 03:35:35 +00:00
bne check_byte1
ldx #<all_done_set-branch_cont-2
stx branch_cont+1
check_byte2
cmp #$d1 ; modified at runtime
beq check_match
all_done_set
sec
rts
2021-06-21 15:57:02 +00:00
; utility functions for common cases
; (from the caller's perspective, these have the side effect of setting Y,
; since the compare routine will 'save' and 'restore' the value we're setting here)
compare3
ldy #$03
!byte $2C
; /!\ execution falls through here
compare2
ldy #$02
!byte $2C
; /!\ execution falls through here
2021-06-21 15:24:21 +00:00
compare1
ldy #$01
; /!\ execution falls through here
2017-01-08 03:35:35 +00:00
;-------------------------------
; compare subroutine
; in: A = sector
; X = offset
; Y = string length
; stack = string to compare
; #WILDCARD in search string matches any 1 byte
; (like "." character in regular expressions)
2021-06-13 05:43:46 +00:00
; out: C = 0 if string matches, and gDisplayBytes set to A
; C = 1 if not matched
2021-06-12 04:50:09 +00:00
; A,X,Y preserved
2017-01-08 03:35:35 +00:00
; $tmp zero page clobbered
; $cmp1 zero page clobbered
; $cmp2 zero page clobbered
; stack set to first instruction after string
;-------------------------------
compare
2021-06-19 17:07:09 +00:00
sta tmpa
2017-01-08 03:35:35 +00:00
clc
adc #BASEPAGE
2021-06-19 17:07:09 +00:00
!byte $2C
2017-01-08 03:35:35 +00:00
CompareMemory
2021-06-19 17:07:09 +00:00
sta tmpa
2017-01-08 03:35:35 +00:00
sta cmp1+1
stx cmp1
2021-06-19 17:07:09 +00:00
sty tmpy
2017-01-08 03:35:35 +00:00
pla
sta cmp2
pla
sta cmp2+1
tax
tya
clc
adc cmp2
bcc +
inx
2021-06-19 17:07:09 +00:00
+ sta modtmp
2017-01-08 03:35:35 +00:00
txa
pha
2021-06-19 17:07:09 +00:00
lda modtmp
2017-01-08 03:35:35 +00:00
pha
2021-04-20 04:27:11 +00:00
@cmp
2017-01-08 03:35:35 +00:00
lda (cmp2),y
dey
2021-04-20 04:27:11 +00:00
bmi @success
2017-01-08 03:35:35 +00:00
cmp (cmp1),y
2021-04-20 04:27:11 +00:00
beq @cmp
2017-01-08 03:35:35 +00:00
cmp #WILDCARD
2021-04-20 04:27:11 +00:00
beq @cmp
2017-01-08 03:35:35 +00:00
sec
!byte $24 ; hide CLC
2021-04-20 04:27:11 +00:00
@success clc
2021-06-19 17:07:09 +00:00
lda tmpa
2017-01-08 03:35:35 +00:00
ldx cmp1
2021-06-19 17:07:09 +00:00
ldy tmpy
2021-06-13 05:43:46 +00:00
bcs +
sta gDisplayBytes
+ rts