passport/src/print.a

373 lines
8.5 KiB
Plaintext
Raw Permalink Normal View History

2017-01-08 03:35:35 +00:00
;-------------------------------
; PrintByID
; Print a string from the string table
2021-07-07 16:01:15 +00:00
;
; Handles string substitutions and
2017-01-08 03:35:35 +00:00
; auto-uppercases on older machines
2021-07-07 16:01:15 +00:00
;
; fully re-entrant to support nested
; string substitutions (see strings/en.a)
;
; in: string ID (byte) on stack
; out: all registers preserved
2021-06-13 05:06:09 +00:00
; oVerflow bit clear
; all other flags clobbered
; stack set to after params
2017-01-08 03:35:35 +00:00
;-------------------------------
PrintByID
sta @tmpa+1
sty @tmpy+1
; get pointer to stack-based params then move the stack beyond them
pla
sta $00
clc
adc #$01
tay
pla
sta $01
adc #$00
pha
tya
pha
; save all registers and this routine's internal pointers
; (can't use SaveAXY because this routine needs to be re-entrant)
@tmpa lda #$FD ; SMC
pha
@tmpy lda #$FD ; SMC
pha
txa
pha
lda @print+1
pha
lda @print+2
pha
ldy #1
lda ($00), y ; get ID of string to print
2017-01-08 03:35:35 +00:00
tax
lda StringTableLow, x
2021-04-20 04:27:11 +00:00
sta @print+1
lda StringTableHigh, x
2021-04-20 04:27:11 +00:00
sta @print+2
dey ; Y=0
2021-04-20 04:27:11 +00:00
@print
2017-01-08 03:35:35 +00:00
lda $FFFF ; modified at runtime
beq @done
cpy #0 ; are we in substitution mode or include mode?
bmi @include ; yes, include mode
2021-04-20 04:27:11 +00:00
beq @nosub ; no -> branch
2017-01-08 03:35:35 +00:00
ldy #0
cmp #"t" ; "%t" = current track
2021-04-20 04:27:11 +00:00
bne @sub1
2017-01-08 03:35:35 +00:00
lda gTrack
2021-04-20 04:27:11 +00:00
bpl @printbyte ; unconditional branch
@sub1
2017-01-08 03:35:35 +00:00
cmp #"s" ; "%s" = current sector
2021-04-20 04:27:11 +00:00
bne @sub2
2017-01-08 03:35:35 +00:00
lda gSector
2021-04-20 04:27:11 +00:00
bpl @printbyte ; unconditional branch
@sub2
2017-01-08 03:35:35 +00:00
cmp #"S" ; write slot
2021-04-20 04:27:11 +00:00
bne @sub3
2017-01-08 03:35:35 +00:00
lda SLOT
2021-04-20 04:27:11 +00:00
bne @printsd ; unconditional branch
@sub3
2017-01-08 03:35:35 +00:00
cmp #"D" ; write drive
2021-04-20 04:27:11 +00:00
bne @sub4
2017-01-08 03:35:35 +00:00
lda DRIVE
2021-04-20 04:27:11 +00:00
@printsd
2017-01-08 03:35:35 +00:00
ora #$80
jsr PrintA
bvc @next ; unconditional branch
2021-04-20 04:27:11 +00:00
@sub4
2017-01-08 03:35:35 +00:00
cmp #"0" ; "%0" through "%9"
2021-04-20 04:27:11 +00:00
bcc @nosub
2017-01-08 03:35:35 +00:00
cmp #":"
2021-04-20 04:27:11 +00:00
bcs @nosub
2017-01-08 03:35:35 +00:00
tax
2022-07-11 17:32:29 +00:00
lda gDisplayBytes-$B0, x
2021-04-20 04:27:11 +00:00
@printbyte
2017-01-08 03:35:35 +00:00
jsr PrintByte
bvc @next ; unconditional branch
2021-04-20 04:27:11 +00:00
@nosub
2017-01-08 03:35:35 +00:00
cmp #"%"
bne @stillnosub
iny ; Y=#$01 (substitution mode, next character will be interpreted)
bne @next ; unconditional branch
@stillnosub
cmp #"@"
bne +
dey ; Y=#$FF (include mode, next character will be interpreted)
bne @next ; unconditional branch
+ cmp #$E1
2021-04-20 04:27:11 +00:00
bcc @noforce
2017-01-08 03:35:35 +00:00
and kForceLower
2021-04-20 04:27:11 +00:00
@noforce
2017-01-08 03:35:35 +00:00
jsr COUT
@next
2021-04-20 04:27:11 +00:00
inc @print+1
bne @print
inc @print+2
bne @print ; unconditional branch
@done
pla
sta @print+2
pla
sta @print+1
pla
tax
pla
tay
pla
2021-06-13 05:06:09 +00:00
clv
2017-01-08 03:35:35 +00:00
rts
@include
sta @id
jsr PrintByID
@id !byte $FD ; SMC
ldy #0
beq @next ; unconditional branch
2017-01-08 03:35:35 +00:00
;-------------------------------
; PrintByte
; print a hexadecimal byte
; in: A contains byte to print
; out: all registers preserved
2017-01-08 03:35:35 +00:00
; all flags clobbered
; @tmpa clobbered
; @tmpx clobbered
; @tmpy clobbered
;-------------------------------
PrintByte
2021-04-20 04:27:11 +00:00
jsr SaveAXY
2017-01-08 03:35:35 +00:00
jsr PRBYTE
2021-07-11 04:51:32 +00:00
bcc LoadAXY ; always branches
2017-01-08 03:35:35 +00:00
;-------------------------------
; PrintA
; print a single character through COUT
; in: A contains character to print
; out: all registers preserved
2017-01-08 03:35:35 +00:00
; all flags clobbered
; @tmpa clobbered
; @tmpx clobbered
; @tmpy clobbered
;-------------------------------
PrintA
2021-04-20 04:27:11 +00:00
jsr SaveAXY
2017-01-08 03:35:35 +00:00
jsr COUT
2021-04-20 04:27:11 +00:00
; /!\ execution falls through here
LoadAXY
2017-01-08 03:35:35 +00:00
lda tmpa
ldx tmpx
ldy tmpy
2021-07-11 04:51:32 +00:00
; /!\ execution falls through here
2021-04-20 04:27:11 +00:00
SaveAXY
2019-04-16 05:39:12 +00:00
sta tmpa
stx tmpx
sty tmpy
2021-07-11 04:51:32 +00:00
clv
2019-04-16 05:39:12 +00:00
rts
2017-01-08 03:35:35 +00:00
;-------------------------------
; ClearScreen
;-------------------------------
ClearScreen
jsr TEXT
lda $C061
2021-07-03 23:13:55 +00:00
bmi +
2017-01-08 03:35:35 +00:00
lda $C062
2021-04-20 05:10:23 +00:00
bpl @home
2021-07-03 23:13:55 +00:00
+ inc gMode
@home jmp HOME
2021-04-20 20:02:07 +00:00
;-------------------------------
; CheckCache
; Intercept text about to be scrolled off the screen
; Cache it in spare LC space for viewing later
;-------------------------------
CheckCache
ldx $25
cpx #$17
bne .nocache
ldx $24
cpx #$27
beq .docache
cmp #$8D
bne .nocache
.docache
pha
cmp #$8D
beq .skipcr
sta $7F7
.skipcr
bit $C081
bit $C081
ldx #$27
cachesrc
lda $700, x
CacheDst
sta $D400, x
dex
bpl cachesrc
lda CacheDst+1
adc #$27
sta CacheDst+1
bcc .skiphi
inc CacheDst+2
.skiphi
pla
.nocache
jmp $FDF0
;-------------------------------
; CheckLogKeys
; Enable scrolling of log, if more than once screen worth
; Left/Right (all)
; Up/Down (not II or II+)
;-------------------------------
CheckLogKeys
ldx CacheDst+1
ldy CacheDst+2
stx .startline1+1
sty .startline1+2
stx .startline2+1
sty .startline2+2
2021-04-22 01:29:43 +00:00
cpy #$D4
bne .skipkey
cpx #0
2021-06-07 21:27:54 +00:00
bne .skipkey
.nolog
rts
2021-04-20 20:02:07 +00:00
.checkkey
jsr WaitForKey
2021-04-22 01:29:43 +00:00
2021-04-20 20:02:07 +00:00
.skipkey
cmp #k_up
beq .checkup
cmp #k_right
beq .checkdown
cmp #k_down
beq .checkdown
2021-06-07 21:27:54 +00:00
cmp #k_left
bne .nolog
2021-04-20 20:02:07 +00:00
.checkup
lda .startline1+2
cmp #$D4
bne .scrollup
lda .startline1+1
beq .checkkey
.scrollup
jsr .substart
bit $C081
bit $C081
ldx #$27
.copyend1
lda $7D0,x
.endline1
sta $D428,x
dex
bpl .copyend1
ldx #22
.scrollscreen
txa
jsr $FBC1 ;BASCALC
lda $28
sta $2A
lda $29
sta $2B
inx
txa
jsr $FBC1 ;BASCALC
ldy #$27
.copyline
lda ($2A),y
sta ($28),y
dey
bpl .copyline
dex
dex
cpx #5
bne .scrollscreen
bit $C083
ldx #$27
.copystart1
.startline1
lda $D400,x
sta $700,x
dex
bpl .copystart1
bit $C081
jmp .checkkey
.checkdown
2021-04-22 01:29:43 +00:00
lda .startline1+2
2021-04-20 20:02:07 +00:00
cmp CacheDst+2
bne .scrolldown
2021-04-22 01:29:43 +00:00
lda .startline1+1
2021-04-20 20:02:07 +00:00
cmp CacheDst+1
beq .checkkey
.scrolldown
bit $C081
bit $C081
ldx #$27
.copystart2
lda $700,x
.startline2
sta $D400,x
dex
bpl .copystart2
lda #$8D
jsr $FDF0
bit $C083
bit $C083
ldx #$27
.copyend2
.endline2
lda $D428,x
sta $7D0,x
dex
bpl .copyend2
bit $C081
jsr .addstart
jmp .checkkey
.substart
sec
lda .startline1+1
sta .endline1+1
sta .endline2+1
sbc #$28
sta .startline1+1
sta .startline2+1
lda .startline1+2
sta .endline1+2
sta .endline2+2
sbc #0
sta .startline1+2
sta .startline2+2
rts
.addstart
clc
lda .endline1+1
sta .startline1+1
sta .startline2+1
adc #$28
sta .endline1+1
sta .endline2+1
lda .endline1+2
sta .startline1+2
sta .startline2+2
adc #0
sta .endline1+2
sta .endline2+2
rts