ZInfo for Z1

This commit is contained in:
Peter Ferrie 2018-04-12 20:50:28 -07:00
parent 42c3a9a1d4
commit 89b8fecb6c
3 changed files with 855 additions and 790 deletions

View File

@ -1,790 +0,0 @@
;license:MIT
;(c) 2018 by qkumba
!to "info#063000",plain
*=$3000
save_name = $300
;;read_size = ?? can be as large as $4000-$300 bytes
read_buffer = $3500 ;read_size bytes, must be page-aligned
file_buffer = $7400 ;$400 bytes, must not overlap with read_buffer, must be page-aligned
record_size = $40
info_buffer = $7200 ;record_size*8 (currently $200) bytes, can be anywhere
zpage_info = $fe ;word
zpage_ptr = $fd
name_offset = 0 ;1+37 bytes
time_offset = 42 ;1+8 bytes ("12:01 pm")
score_offset = 51 ;1+6 bytes (-12345)
moves_offset = 58 ;1+5 bytes (12345)
;zpage used by Infocom code
zp_8C = $8c
zp_8D = $8d
zp_8E = $8e ;word
zp_9C = $9c
zp_9D = $9d
zp_9E = $9e
zp_9F = $9f
zp_A0 = $a0 ;word
zp_A3 = $a3
zp_AC = $ac
zp_AD = $ad
zp_B0 = $b0 ;word
zp_B2 = $b2
zp_B3 = $b3
zp_C9 = $c9
zp_CA = $ca
zp_CB = $cb
zp_CC = $cc
zp_CD = $cd
zp_CE = $ce
zp_CF = $cf
zp_D3 = $d3
zp_D4 = $d4
zp_D5 = $d5
zp_D6 = $d6
zp_D7 = $d7
zp_D8 = $d8
zp_DB = $db
zp_DC = $dc
;set prefix if not defined, needed only if stand-alone code
- jsr $bf00
op_c7
!byte $c7
!word c7_parms
ldx $200
bne +
lda $bf30
sta c5_parms+1
jsr $bf00
!byte $c5
!word c5_parms
ldx $201
inx
txa
and #$0f
sta $200
lda #$2f
sta $201
dec op_c7
bne -
+
jsr exchange
lda #>info_buffer
sta zpage_info+1
lda #<info_buffer
sta zpage_info
jsr $bf00
!byte $c8 ;open file
!word c8_parms
lda c8_handle
sta ce_handle
sta ca_handle
;position to file offset
lda #0
sta position+1
fetch_info
ldy #name_offset
sty zpage_ptr
!if name_offset=0 {
tya
} else {
lda #0
}
sta (zpage_info),y
position
lda #0
ldx #0
stx ce_offset+2
asl
asl
asl
asl
asl
asl
ora #3
sta ce_offset+1
rol ce_offset+2
jsr $bf00
!byte $ce ;seek
!word ce_parms
bcs nextpos
lda #1
sta ca_size+1
jsr $bf00
!byte $ca ;read file
!word ca_parms
lda read_buffer+$0e
sta ca_size+1
inc ca_offset+1
jsr $bf00
!byte $ca ;read file
!word ca_parms
dec ca_offset+1
jsr dump_info
nextpos
clc
lda zpage_info
adc #record_size
sta zpage_info
bcc +
inc zpage_info+1
+ inc position+1
lda position+1
cmp #8
bcc fetch_info
jsr $bf00
!byte $cc ;close file
!word cc_parms
exchange
ldx #(zp_DC-zp_8C)
- ldy zpage_old-1,x
lda zp_8C-1,x
sty zp_8C-1,x
sta zpage_old-1,x
dex
bne -
rts
c7_parms
!byte 1
!word $200
c5_parms
!byte 2
!byte 0
!word $201
c8_parms
!byte 3
!word save_name
!word file_buffer
c8_handle
!byte 0
ce_parms
!byte 2
ce_handle
!byte 0
ce_offset
!byte 0,0,0
ca_parms
!byte 4
ca_handle
!byte 0
ca_offset
!word read_buffer
ca_size
!word 0
!word $ffff
cc_parms
!byte 1
!byte 0
dump_info
tsx
stx stack_pointer+1
;set up pointers for decompression and "score" display
lda #>read_buffer
sta zp_A3
lda read_buffer+1
and #2
sta zp_DC
clc
lda read_buffer+$0d
sta zp_AC
lda read_buffer+$0c
adc #>read_buffer
sta zp_AD
clc
lda read_buffer+$19
sta zp_B0
lda read_buffer+$18
adc #>read_buffer
sta zp_B0+1
clc
lda read_buffer+$0b
sta zp_B2
lda read_buffer+$0a
adc #>read_buffer
sta zp_B3
;dump info, actual Infocom code in upper-case
lda #42
sta max_chars
LDA #$10 ; location
JSR fetch_obj
LDA zp_8C
JSR decompress
lda zpage_ptr
!if name_offset>0 {
sec
sbc #name_offset
}
ldy #name_offset
sta (zpage_info),y
ldy #time_offset
sty zpage_ptr
lda #0
sta max_chars ;can't overflow anymore
sta (zpage_info),y
LDA #$11 ; score
JSR fetch_obj
LDA zp_DC
BNE loc_1627
ldy #score_offset
sty zpage_ptr
LDA zp_8C
STA zp_D3
LDA zp_8D
STA zp_D4
JSR sub_215D
sec
lda zpage_ptr
sbc #score_offset
ldy #score_offset
sta (zpage_info),y
JMP loc_165F
loc_1627:
LDA zp_8C
BNE loc_164B
LDA #$18
loc_164B:
CMP #$0D
BCC loc_1651
SBC #$0C
loc_1651:
STA zp_D3
LDA #$00
STA zp_D4
JSR sub_215D
LDA #$3A
JSR emit_char
loc_165F:
LDA #$12 ; moves or minutes
JSR fetch_obj
LDA zp_8C
STA zp_D3
LDA zp_8D
STA zp_D4
LDA zp_DC
BNE loc_1676
ldy #moves_offset
sty zpage_ptr
JSR sub_215D
sec
lda zpage_ptr
sbc #moves_offset
ldy #moves_offset
sta (zpage_info),y
rts
loc_1676:
LDA zp_8C
CMP #$0A
BCS loc_1681
LDA #$30
JSR emit_char
loc_1681:
JSR sub_215D
LDA #$20
JSR emit_char
LDA #$11 ; hours
JSR fetch_obj
LDA zp_8C
CMP #$0C
BCS loc_1698
LDA #$61
BNE loc_169A
loc_1698:
LDA #$70
loc_169A:
JSR emit_char
LDA #$6D
JSR emit_char
sec
lda zpage_ptr
sbc #time_offset
ldy #time_offset
sta (zpage_info),y
rts
loc_1459:
jmp * ;internal error
fetch_obj:
JSR sub_1A70
LDA (zp_8E),Y
STA zp_8D
INY
LDA (zp_8E),Y
STA zp_8C
RTS
sub_1A70:
SEC
SBC #$10
LDY #0
STY zp_8E+1
ASL
ROL zp_8E+1
CLC
ADC zp_AC
STA zp_8E
LDA zp_8E+1
ADC zp_AD
STA zp_8E+1
locret_1A85:
RTS
decompress:
JSR sub_26A0
LDY #7
LDA (zp_8E),Y
TAX
INY
LDA (zp_8E),Y
STA zp_8E
STX zp_8E+1
INC zp_8E
BNE loc_1D23
INC zp_8E+1
loc_1D23:
JSR sub_2474
JMP sub_2495
sub_1FE2:
LDA #0
SEC
SBC zp_D3
STA zp_D3
LDA #0
SBC zp_D4
STA zp_D4
RTS
sub_1FF0:
LDA zp_D5
ORA zp_D6
BEQ loc_2021
JSR sub_2026
loc_1FF9:
ROL zp_D3
ROL zp_D4
ROL zp_D7
ROL zp_D8
LDA zp_D7
SEC
SBC zp_D5
TAY
LDA zp_D8
SBC zp_D6
BCC loc_2011
STY zp_D7
STA zp_D8
loc_2011:
DEX
BNE loc_1FF9
ROL zp_D3
ROL zp_D4
LDA zp_D7
STA zp_D5
LDA zp_D8
STA zp_D6
RTS
loc_2021:
LDA #8
JMP loc_1459
sub_2026:
LDX #$10
LDA #0
STA zp_D7
STA zp_D8
CLC
RTS
sub_215D:
LDA zp_D4
BPL loc_2169
LDA #$2D
JSR emit_char
JSR sub_1FE2
loc_2169:
LDA #0
STA zp_DB
loc_216D:
LDA zp_D3
ORA zp_D4
BEQ loc_2185
LDA #$A
STA zp_D5
LDA #0
STA zp_D6
JSR sub_1FF0
LDA zp_D5
PHA
INC zp_DB
BNE loc_216D
loc_2185:
LDA zp_DB
BNE loc_218E
LDA #$30
JMP emit_char
loc_218E:
PLA
CLC
ADC #$30
JSR emit_char
DEC zp_DB
BNE loc_218E
RTS
sub_237E:
LDA zp_9D
CLC
ADC zp_A3
STA zp_A0+1
LDX #$FF
STX zp_9F
INX
STX zp_A0
loc_23A0:
LDY zp_9C
LDA (zp_A0),Y
INC zp_9C
BNE loc_23B2
LDY #0
STY zp_9F
INC zp_9D
BNE loc_23B2
INC zp_9E
loc_23B2:
TAY
RTS
sub_2474:
LDA zp_8E
STA zp_9C
LDA zp_8E+1
STA zp_9D
LDA #0
STA zp_9E
STA zp_9F
RTS
sub_2483:
LDA zp_8E
ASL
STA zp_9C
LDA zp_8E+1
ROL
STA zp_9D
LDA #0
STA zp_9F
ROL
STA zp_9E
locret_2494:
RTS
sub_2495:
LDX #0
STX zp_C9
STX zp_CD
DEX
STX zp_CA
loc_249E:
JSR sub_2569
BCS locret_2494
STA zp_CB
TAX
BEQ loc_24E9
CMP #4
BCC loc_2507
CMP #6
BCC loc_24ED
JSR sub_255D
TAX
BNE loc_24C1
LDA #$5B
loc_24B8:
CLC
ADC zp_CB
loc_24BB:
JSR emit_char
JMP loc_249E
loc_24C1:
CMP #1
BNE loc_24C9
LDA #$3B
BNE loc_24B8
loc_24C9:
LDA zp_CB
SEC
SBC #6
BEQ loc_24D7
TAX
LDA byte_2686,X
JMP loc_24BB
loc_24D7:
JSR sub_2569
ASL
ASL
ASL
ASL
ASL
STA zp_CB
JSR sub_2569
ORA zp_CB
JMP loc_24BB
loc_24E9:
LDA #$20
BNE loc_24BB
loc_24ED:
SEC
SBC #3
TAY
JSR sub_255D
BNE loc_24FB
STY zp_CA
JMP loc_249E
loc_24FB:
STY zp_C9
CMP zp_C9
BEQ loc_249E
LDA #0
STA zp_C9
BEQ loc_249E
loc_2507:
SEC
SBC #1
ASL
ASL
ASL
ASL
ASL
ASL
STA zp_CC
JSR sub_2569
ASL
CLC
ADC zp_CC
TAY
LDA (zp_B0),Y
STA zp_8E+1
INY
LDA (zp_B0),Y
STA zp_8E
LDA zp_9E
PHA
LDA zp_9D
PHA
LDA zp_9C
PHA
LDA zp_C9
PHA
LDA zp_CD
PHA
LDA zp_CF
PHA
LDA zp_CE
PHA
JSR sub_2483
JSR sub_2495
PLA
STA zp_CE
PLA
STA zp_CF
PLA
STA zp_CD
PLA
STA zp_C9
PLA
STA zp_9C
PLA
STA zp_9D
PLA
STA zp_9E
LDX #$FF
STX zp_CA
INX
STX zp_9F
JMP loc_249E
sub_255D:
LDA zp_CA
BPL loc_2564
LDA zp_C9
RTS
loc_2564:
LDY #$FF
STY zp_CA
RTS
sub_2569:
LDA zp_CD
BPL loc_256F
SEC
RTS
loc_256F:
BNE loc_2584
INC zp_CD
JSR sub_237E
STA zp_CF
JSR sub_237E
STA zp_CE
LDA zp_CF
LSR
LSR
JMP loc_25AD
loc_2584:
SEC
SBC #1
BNE loc_259F
LDA #2
STA zp_CD
LDA zp_CE
STA zp_8E
LDA zp_CF
ASL zp_8E
ROL
ASL zp_8E
ROL
ASL zp_8E
ROL
JMP loc_25AD
loc_259F:
LDA #0
STA zp_CD
LDA zp_CF
BPL loc_25AB
LDA #$FF
STA zp_CD
loc_25AB:
LDA zp_CE
loc_25AD:
AND #$1F
CLC
RTS
byte_2686:
!BYTE 0
!BYTE $D, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '!', '?', '_'
!BYTE '#', $27, '"', '/', $5C, '-', ':', '(', ')'
sub_26A0:
STA zp_8E
LDX #0
STX zp_8E+1
ASL
ROL zp_8E+1
ASL
ROL zp_8E+1
ASL
ROL zp_8E+1
CLC
ADC zp_8E
BCC loc_26B6
INC zp_8E+1
loc_26B6:
CLC
ADC #$35
BCC loc_26BD
INC zp_8E+1
loc_26BD:
CLC
ADC zp_B2
STA zp_8E
LDA zp_8E+1
ADC zp_B3
STA zp_8E+1
RTS
emit_char
sty yreg+1
inc zpage_ptr
ldy zpage_ptr
sta (zpage_info),y
dec max_chars
beq fail_slot
yreg
ldy #0
rts
fail_slot
stack_pointer
ldx #0
txs
rts
max_chars !byte 0
zpage_old
!if *+(zp_DC-zp_8C)>=read_buffer {
!error "Code is too large"
}

682
src/zinfo/z1/z1.s Normal file
View File

@ -0,0 +1,682 @@
;license:MIT
;(c) 2018 by qkumba
!cpu 6502
!to "build/zinfo1#063000",plain
*=$3000
save_name = $2006
read_buffer = $3500 ;512 bytes
file_buffer = $3900 ;$400 bytes, must not overlap with read_buffer, must be page-aligned
record_size = $40
info_buffer = $2000 ;record_size*8 (currently $200) bytes, can be anywhere
zpage_info = $fe ;word
zpage_ptr = $fd
name_offset = 0 ;1+37 bytes
time_offset = 42 ;1+8 bytes ("12:01 pm")
score_offset = 51 ;1+6 bytes (-12345)
moves_offset = 58 ;1+5 bytes (12345)
;zpage used by Infocom code
zp_91 = $91
zp_92 = $92
zp_93 = $93
zp_94 = $94
zp_95 = $95
zp_96 = $96
zp_98 = $98
zp_99 = $99
zp_BA = $BA
zp_BB = $BB
zp_CE = $CE
zp_CF = $CF
zp_D0 = $D0
zp_D1 = $D1
zp_D2 = $D2
zp_E2 = $E2
zp_E3 = $E3
zp_E4 = $E4
zp_E5 = $E5
zp_E6 = $E6
zp_E7 = $E7
jsr $bf00
!byte $c8 ;open file
!word c8_parms
bcs quit
lda c8_handle
sta ce_handle
sta ca_handle
jsr exchange
lda #>info_buffer
sta zpage_info+1
lda #<info_buffer
sta zpage_info
zero_info
ldy #name_offset
sty zpage_ptr
!if name_offset=0 {
tya
} else {
lda #0
}
sta (zpage_info),y
clc
lda zpage_info
adc #record_size
sta zpage_info
bcc +
inc zpage_info+1
+ inc index+1
index
lda #0
cmp #8
bcc zero_info
lda #>info_buffer
sta zpage_info+1
lda #<info_buffer
sta zpage_info
fetch_info
jsr $bf00
!byte $ca ;read file
!word ca_parms
jsr dump_info
jsr $bf00
!byte $cc ;close file
!word cc_parms
exchange
ldx #(zp_E7-zp_91)
- ldy zpage_old-1,x
lda zp_91-1,x
sty zp_91-1,x
sta zpage_old-1,x
dex
bne -
quit
rts
load_page
cmp zp_BB
beq seek_ret
sta zp_BB
clc
ce_base1
adc #3
sta ce_offset+1
lda #0
ce_base2
adc #0
sta ce_offset+2
seekread
jsr $bf00
!byte $ce ;seek
!word ce_parms
bcs seek_ret
jsr $bf00
!byte $ca ;read file
!word ca_parms
seek_ret
rts
c7_parms
!byte 1
!word $200
c5_parms
!byte 2
!byte 0
!word $201
c8_parms
!byte 3
!word save_name
!word file_buffer
c8_handle
!byte 0
ce_parms
!byte 2
ce_handle
!byte 0
ce_offset
!byte 0,0,0
ca_parms
!byte 4
ca_handle
!byte 0
ca_offset
!word read_buffer
ca_size
!word $100
!word $ffff
cc_parms
!byte 1
!byte 0
dump_info
tsx
stx stack_pointer+1
;set up pointers for decompression and score display
lda #$3c ;read_buffer+$0d
sta zp_98
lda #$20 ;read_buffer+$0c
sta zp_99
lda #$40 ;read_buffer+$0b
sta zp_BA
lda #$00 ;read_buffer+$0a
sta zp_BB
;dump info, actual Infocom code in upper-case
lda #42
sta max_chars
LDA #$10 ; location
JSR fetch_obj
LDA zp_E4
JSR decompress
lda zpage_ptr
!if name_offset>0 {
sec
sbc #name_offset
}
ldy #name_offset
sta (zpage_info),y
lda #0
sta max_chars ;can't overflow anymore
ldy #time_offset
sta (zpage_info),y
LDA #$11 ; score
JSR fetch_obj
ldy #score_offset
sty zpage_ptr
JSR sub_1521
sec
lda zpage_ptr
sbc #score_offset
ldy #score_offset
sta (zpage_info),y
LDA #$12 ; moves
JSR fetch_obj
ldy #moves_offset
sty zpage_ptr
JSR sub_1521
sec
lda zpage_ptr
sbc #moves_offset
ldy #moves_offset
sta (zpage_info),y
rts
fetch_obj:
SEC
SBC #$10
ASL
STA zp_E2
LDA #0
ROL
STA zp_E3
CLC
LDA zp_98
ADC zp_E2
STA zp_E2
LDA zp_99
ADC zp_E3
STA zp_E3
LDY #0
lda zp_E3
pha
jsr load_page
lda #>read_buffer
sta zp_E3
LDA (zp_E2),Y
STA zp_E5
INY
LDA (zp_E2),Y
STA zp_E4
pla
sta zp_E3
RTS
decompress:
JSR sub_170D
LDY #7
jsr load_page
lda #>read_buffer
sta zp_E5
LDA (zp_E4),Y
STA zp_E3
INY
LDA (zp_E4),Y
STA zp_E2
LDA zp_E2
STA zp_E4
LDA zp_E3
STA zp_E5
INC zp_E4
BNE loc_E01
INC zp_E5
loc_E01:
JSR sub_1823
JMP loc_1948
sub_1521:
LDA zp_E5
BPL loc_1528
JSR sub_155A
loc_1528:
LDA #0
STA zp_E6
loc_152C:
LDA zp_E5
ORA zp_E4
BEQ loc_1545
LDA #$A
STA zp_E2
LDA #0
STA zp_E3
JSR sub_1613
LDA zp_E2
PHA
INC zp_E6
JMP loc_152C
loc_1545:
LDA zp_E6
BEQ loc_1555
loc_1549:
PLA
CLC
ADC #$30
JSR emit_char
DEC zp_E6
BNE loc_1549
RTS
loc_1555:
LDA #$30
JMP emit_char
sub_155A:
LDA #$2D
JSR emit_char
JMP loc_1677
sub_1613:
LDA zp_E6
PHA
LDA zp_E7
PHA
LDA zp_E4
STA zp_E6
LDA zp_E5
STA zp_E7
LDA #0
STA zp_E4
LDA #0
STA zp_E5
LDX #$11
loc_162B:
SEC
LDA zp_E4
SBC zp_E2
TAY
LDA zp_E5
SBC zp_E3
BCC loc_163C
STA zp_E5
TYA
STA zp_E4
loc_163C:
ROL zp_E6
ROL zp_E7
ROL zp_E4
ROL zp_E5
DEX
BNE loc_162B
CLC
LDA zp_E5
ROR
STA zp_E3
LDA zp_E4
ROR
STA zp_E2
LDA zp_E6
STA zp_E4
LDA zp_E7
STA zp_E5
PLA
STA zp_E7
PLA
STA zp_E6
RTS
loc_1677:
SEC
LDA #0
SBC zp_E4
STA zp_E4
LDA #0
SBC zp_E5
STA zp_E5
RTS
sub_170D:
STA zp_E4
LDA #0
STA zp_E5
LDA zp_E4
ASL zp_E4
ROL zp_E5
ASL zp_E4
ROL zp_E5
ASL zp_E4
ROL zp_E5
CLC
ADC zp_E4
BCC loc_1729
INC zp_E5
CLC
loc_1729:
ADC #$35
STA zp_E4
BCC loc_1731
INC zp_E5
loc_1731:
lda zp_BA
CLC
ADC zp_E4
STA zp_E4
lda #0
ADC zp_E5
STA zp_E5
RTS
sub_1823:
LDA zp_E4
STA zp_93
LDA zp_E5
STA zp_91
LDA #0
STA zp_92
loc_182F:
LDA #0
STA zp_96
RTS
sub_1863:
JSR sub_1870
PHA
JSR sub_1870
STA zp_E4
PLA
STA zp_E5
RTS
sub_1870:
LDA zp_96
BEQ loc_1889
LDY zp_93
lda zp_95
pha
jsr load_page
lda #>read_buffer
sta zp_95
LDA (zp_94),Y
STY zp_93
tay
pla
sta zp_95
tya
inc zp_93
BEQ loc_187E
RTS
loc_187E:
LDY #0
STY zp_96
INC zp_91
BNE locret_1888
INC zp_92
locret_1888:
RTS
loc_1889:
LDA zp_91
STA zp_95
LDA #0
STA zp_94
LDA #$FF
STA zp_96
JMP sub_1870
loc_1948:
LDA #0
STA zp_CF
STA zp_D0
LDA #$FF
STA zp_CE
loc_1952:
JSR sub_1A08
BCC loc_1958
RTS
loc_1958:
STA zp_E6
BEQ loc_19AB
CMP #1
BEQ loc_19B0
CMP #4
BCC loc_19BA
CMP #6
BCC loc_19CA
JSR sub_19FC
ORA #0
BNE loc_197A
LDA #$5B
loc_1971:
CLC
ADC zp_E6
loc_1974:
JSR emit_char
JMP loc_1952
loc_197A:
CMP #1
BNE loc_1983
LDA #$3B
JMP loc_1971
loc_1983:
LDA zp_E6
SEC
SBC #7
BCC loc_1991
TAY
LDA byte_19E3,Y
JMP loc_1974
loc_1991:
JSR sub_1A08
ASL
ASL
ASL
ASL
ASL
PHA
JSR sub_1A08
STA zp_E6
PLA
ORA zp_E6
CMP #9
BNE loc_1974
LDA #$20
JMP loc_1974
loc_19AB:
LDA #$20
JMP loc_1974
loc_19B0:
LDA #$D
JSR emit_char
LDA #$A
JMP loc_1974
loc_19BA:
JSR sub_19FC
CLC
ADC #2
ADC zp_E6
JSR sub_19D8
STA zp_CE
JMP loc_1952
loc_19CA:
JSR sub_19FC
CLC
ADC zp_E6
JSR sub_19D8
STA zp_CF
JMP loc_1952
sub_19D8:
CMP #3
BCC locret_19E2
SEC
SBC #3
JMP sub_19D8
locret_19E2:
RTS
byte_19E3:
!BYTE '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '!', '?', '_', '#'
!BYTE $27, '"', '/', $5C, '|', '-', ':', '(', ')'
sub_19FC:
LDA zp_CE
BPL loc_1A03
LDA zp_CF
RTS
loc_1A03:
LDY #$FF
STY zp_CE
RTS
sub_1A08:
LDA zp_D0
BPL loc_1A0E
SEC
RTS
loc_1A0E:
BNE loc_1A25
INC zp_D0
JSR sub_1863
LDA zp_E4
STA zp_D1
LDA zp_E5
STA zp_D2
LDA zp_D2
LSR
LSR
AND #$1F
CLC
RTS
loc_1A25:
SEC
SBC #1
BNE loc_1A42
LDA #2
STA zp_D0
LDA zp_D2
LSR
LDA zp_D1
ROR
TAY
LDA zp_D2
LSR
LSR
TYA
ROR
LSR
LSR
LSR
AND #$1F
CLC
RTS
loc_1A42:
LDA #0
STA zp_D0
LDA zp_D2
BPL loc_1A4E
LDA #$FF
STA zp_D0
loc_1A4E:
LDA zp_D1
AND #$1F
CLC
RTS
emit_char
sty yreg+1
inc zpage_ptr
ldy zpage_ptr
sta (zpage_info),y
dec max_chars
beq fail_slot
yreg
ldy #0
rts
fail_slot
stack_pointer
ldx #0
txs
rts
max_chars !byte 0
zpage_old
!if *+(zp_E7-zp_91)>=read_buffer {
!error "Code is too large"
}

173
src/zinfo/zinfo.system.s Normal file
View File

@ -0,0 +1,173 @@
;license:MIT
;(c) 2018 by qkumba
!to "ZINFO.SYSTEM",plain
*=$2000
jmp init
!byte $ee,$ee,64
!fill 64
filetype=$f5
auxtype=$8000 ;really $80xx
;get prefix, if any
init
lda $bf30
sta c5_parms+1
- jsr $bf00
op_c7
!byte $c7
!word c7_parms
ldx $200
bne +
;if not, get volume name
jsr $bf00
!byte $c5
!word c5_parms
ldx $201
inx
txa
and #$0f
sta $200
lda #$2f
sta $201
;set that as prefix
dec op_c7
bne -
+ lda #$2f
cmp $200,x
beq +
inc $200
sta $201,x
;get attributes for passed file
+ jsr $bf00
!byte $c4
!word c4_parms
bcc +
quit jsr $bf00
!byte $65
!word quit_parms
+ lda c4_parms+4
cmp #filetype
bne quit
lda c4_parms+6
cmp #>auxtype
bne quit
;select interpreter by auxtype
;1, 2, 3, 4, 5, "$55" (special case)
lda c4_parms+5
beq quit
cmp #$55
beq +
cmp #6
bcs quit
dec filename
ora #$30
sta version
+
;get volume name
inc c5_parms+3
jsr $bf00
!byte $c5
!word c5_parms
ldx $301
inx
txa
and #$0f
sta $300
lda #$2f
sta $301
;use that for intepreter location
jsr $bf00
!byte $c6
!word c6_parms
;open/read/close
jsr $bf00
!byte $c8
!word c8_parms
lda c8_parms+5
sta ca_parms+1
jsr $bf00
!byte $ca
!word ca_parms
jsr $bf00
!byte $cc
!word cc_parms
;replace suffix
ldy $2006
inc $2006
lda #'V'
sta $2006+1,y
lda #'A'
sta $2006,y
lda #'S'
sta $2006-1,y
;set prefix to passed file
jsr $bf00
!byte $c6
!word c7_parms
;run interpreter
jmp $3000
c7_parms
cc_parms
!byte 1
!word $200
c5_parms
!byte 2
!byte 0
!word $201
!byte $d1
c6_parms
!byte 1
!word $300
c4_parms
!byte $0a
!word $2006
!text "qkumba was here"
c8_parms
!byte 3
!word filename
!word $800
!byte 0
quit_parms
ca_parms
!byte 4
!byte $ff
!word $3000
!word $ffff
!word $ffff
filename
!byte (filename_e-filename)-1
!text "LIB/ZINFO"
version !text "5U"
filename_e
!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE