z3 with dynamic patching and branding

This commit is contained in:
Peter Ferrie 2018-03-07 23:04:21 -08:00
parent b2dd81c91c
commit e1c7640c82
5 changed files with 620 additions and 577 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,414 +0,0 @@
;license:MIT
;(c) 2017-2018 by qkumba
!cpu 6502
*=$b0e
gamename=$306
savename=$350
scrpname=$390
xstart
- 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 -
+
lda $305
eor $304
eor $303
eor $302
eor $301
eor $300
eor #$a5
beq +
lda #$D9
sta $300 ;80-cols
ldx #1
stx $301 ;lowercase
dex
stx $303 ;no script
dex
stx $302 ;no load
+
ldx $300
cpx #$ce
beq skip80
lda $bf98
and #2
bne okay80
ldx #$ce
skip80
lda #$df
sta mapmask+1
okay80
stx $1793
lda $301
beq +
lda $bf98
bpl +
inc $17ba
bne ++
+
inc $17b6
++
lda $303
beq +
lda #<print
sta $18ba
lda #>print
sta $18bb
lda #<printer
sta $1364
lda #>printer
sta $1365
lda $304
beq +
lda #<callbackprn1
sta $11de
lda #>callbackprn1
sta $11df
+
ldx $302
inx
beq +
lda $11de
sta loadcall1+1
lda $11df
sta loadcall2+1
lda #<callback1
sta $11de
lda #>callback1
sta $11df
+
no_opt
ldy gamename
lda #'V'
sta savename+1,y
lda #'A'
sta savename,y
lda #'S'
sta savename-1,y
lda #'G'
sta scrpname+1,y
lda #'O'
sta scrpname,y
lda #'L'
sta scrpname-1,y
dey
dey
-
lda gamename,y
sta savename,y
sta scrpname,y
dey
bpl -
inc savename
inc scrpname
jsr closefile
jmp $173d
c7_parms
!byte 1
!word $200
c5_parms
!byte 2
!byte 0
!word $201
xend
*=$c11
ora #$ca
sta pro_op
lda #0
sta ce_parms+2
sta ce_parms+4
sec
lda $65
adjust
sbc #0
asl
asl
asl
rol ce_parms+4
asl
rol ce_parms+4
ora $64
sta ce_parms+3
- jsr $bf00
!byte $ce ;seek
!word ce_parms
bcc +
jsr $bf00
!byte $d0 ;set EOF
!word ce_parms
bcc -
+
jsr $bf00
pro_op
!byte $ca ;read file
!word ca_parms
bcs jmpquit
- rts
printer
cmp #$8d
bne -
iny
sty cb_parms+4
dey
lda #<scrpname
sta c8_parms+1
ldx #(<gamename xor <scrpname)
jsr closefile1
jsr $bf00
!byte $d1
!word ce_parms
jsr $bf00
!byte $ce
!word ce_parms
jsr $bf00
!byte $cb
!word cb_parms
bcc closefile
jmpquit jmp $dfe
savefile
jsr $bf00
!byte $c0
!word c0_parms
lda $e5a
sta c0_parms+5
jsr $bf00
!byte $c3
!word c0_parms
ldx #$e6
!byte $2c
loadfile
ldx #$b8
lda #$0d
pha
txa
pha
closefile
ldx #(<gamename xor <savename)
closefile1
jsr xclose
jsr xopen
lda adjust+1
eor #3
sta adjust+1
txa
eor c8_parms+1
sta c8_parms+1
rts
callback1
lda xrestore,y
cmp #$8d
bne +
ldx #<callback2
stx $11de
;!if #>callback1 != #>callback2 {
; ldx #>callback2
; stx $11df
;}
+ rts
callback2
lda $302
ora #$b0
ldx #<callback3
stx $11de
;!if #>callback2 != #>callback3 {
; ldx #>callback3
; stx $11df
;}
+ rts
callback3
lda #$D9
loadcall1
ldx #$0c
stx $11de
loadcall2
ldx #$fd
stx $11df
rts
xrestore
!byte $d2,$c5,$d3,$d4,$cf,$d2,$c5,$8d
callbackprn1
lda xscript,y
cmp #$8d
bne +
ldx #$0c
stx $11de
ldx #$fd
stx $11df
+ rts
xscript
!byte $d3,$c3,$d2,$c9,$d0,$d4,$8d
print
jsr $bf00
!byte $c1
!word c1_parms
lda #<scrpname
sta c0_parms+1
jsr $bf00
!byte $c0
!word c0_parms
inc $1363
lda #<savename
sta c0_parms+1
rts
xclose
jsr $bf00
!byte $cc
!word cc_parms
rts
xopen
jsr $bf00
!byte $c8
!word c8_parms
lda c8_parms+5
sta ce_parms+1
sta ca_parms+1
sta cb_parms+1
rts
casemap
ldy $32
bmi +
cmp #$61
bcc +
cmp #$7b
bcs +
mapmask
and #$ff
+ sta $200,x
- rts
waitkey
jsr $12f8
lda $c010
- lda $c000
bpl -
quit
jsr xclose
jsr $bf00
!byte $65
!word quit_parms
c8_parms
!byte 3
!word gamename
!word $800
!byte 0
c0_parms
!byte 7
!word savename
!byte %11000011
!byte 04
!word 0
!byte 1
!word 0
!word 0
ce_parms
!byte 2
!byte 0
!byte 0
!byte 0
!byte 0
ca_parms
!byte 4
!byte $ff
!word $2900
!word $100
!word $ffff
cc_parms
!byte 1
!byte 0
c1_parms
!byte 1
!word scrpname
cb_parms
!byte 4
!byte $ff
!word $200
!word $00ff
!word $ffff
quit_parms
!byte 4
!byte 0
!word 0
!byte 0
!word 0
!ifdef PASS2 {
!warn "savefile=",savefile
!warn "loadfile=",loadfile
!warn "closefile=",closefile
!warn "casemap=",casemap
!warn "quit=",quit
!warn "waitkey=",waitkey
!warn "base=",$c11-(xend-xstart)
!if >callback1 != >callback2 {
!warn "callbacks=", >callback1, >callback2
}
!if >callback2 != >callback3 {
!warn "callbacks=", >callback2, >callback3
}
} else {
!set PASS2=1
}

View File

@ -5,218 +5,675 @@
!to "build/ONBEYONDZ3",plain
*=$3000
vars=$306
eip=$b0e
!macro version {!text "1/180221"}
;user-defined options
verbose_info = 0 ;set to 1 to enable display of memory usage
gamename=$306
savename=$350
scrpname=$390
;unpacker variables, no need to change these
src = $0
dst = $2
ecx = $4
last = $6
tmp = $8
src = $0
dst = $2
ecx = $4
last = $6
tmp = $8
init
ldy $2006
- lda $2006,y
sta $306,y
dey
bpl -
- 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 -
+
lda #>pakoff
sta src+1
lda #<pakoff
sta src
lda #>eip
sta dst+1
lda #<eip
sta dst
ldy $2006
lda #'3'
sta gamename,y
lda #'Z'
sta gamename-1,y
lda #'V'
sta savename+1,y
lda #'A'
sta savename,y
lda #'S'
sta savename-1,y
lda #'G'
sta scrpname+1,y
lda #'O'
sta scrpname,y
lda #'L'
sta scrpname-1,y
dey
dey
- lda $2006,y
sta gamename,y
sta savename,y
sta scrpname,y
dey
bpl -
inc savename
inc scrpname
jsr unpack
jmp eip
lda #>pakoff
sta src + 1
lda #<pakoff
sta src
lda #$0d
sta dst + 1
lda #$7d
sta dst
jsr unpack
;init interpreter
jsr $d7d
;copy new RWTS and interpreter support routines
ldy #0
- lda unrelochdd, y
sta $c11, y
iny
bne -
ldy #<(hddcodeend - $c11)
- lda unrelochdd + $ff, y
sta $d10, y
dey
bne -
lda $305
eor $304
eor $303
eor $302
eor $301
eor $300
eor #$a5
beq +
lda #$D9
sta $300 ;80-cols
ldx #1
stx $301 ;lowercase
dex
stx $303 ;no script
dex
stx $302 ;no load
+
ldx $300
cpx #$ce
beq skip80
lda $bf98
and #2
bne okay80
ldx #$ce
skip80
lda #$df
sta mapmask+1
okay80
stx $1793
lda $301
beq +
lda $bf98
bpl +
inc $17ba
bne ++
+
inc $17b6
++
lda $303
beq +
lda #<print
sta $18ba
lda #>print
sta $18bb
lda #<printer
sta $1364
lda #>printer
sta $1365
lda $304
beq +
lda #<callbackprn1
sta $11de
lda #>callbackprn1
sta $11df
+
ldx $302
inx
beq +
lda $11de
sta loadcall1+1
lda $11df
sta loadcall2+1
lda #<callback1
sta $11de
lda #>callback1
sta $11df
+
lda #<brand
sta $17eb
lda #>brand
sta $17ec
lda #<savefile
sta $d7d+$340
lda #>savefile
sta $d7d+$341
lda #<loadfile
sta $d7d+$3d2
lda #>loadfile
sta $d7d+$3d3
lda #<closefile
sta $d7d+$36c
sta $d7d+$449
lda #>closefile
sta $d7d+$36d
sta $d7d+$44a
lda #$20
sta $d7d+$76b
lda #<casemap
sta $d7d+$76c
lda #>casemap
sta $d7d+$76d
lda #<quit
sta $d7d+$709
lda #>quit
sta $d7d+$70a
lda #<waitkey
sta $d7d+$6fa
lda #>waitkey
sta $d7d+$6fb
jsr closefile
jmp $173d
c7_parms
!byte 1
!word $200
c5_parms
!byte 2
!byte 0
!word $201
brand
jsr $12f8
lda #$f8
sta $17eb
lda #$12
sta $17ec
lda #$17
sta $25
lda #0
sta $24
sta $57b
jsr $fc22
lda #>brandtext
ldx #<brandtext
ldy #(brandtext_e-brandtext)
jmp $12f8
brandtext
!text "On Beyond Z-Machine! revision "
+version
brandtext_e
unrelochdd
!pseudopc $c11 {
ora #$ca
sta pro_op
lda #0
sta ce_parms+2
sta ce_parms+4
sec
lda $65
adjust
sbc #0
asl
asl
asl
rol ce_parms+4
asl
rol ce_parms+4
ora $64
sta ce_parms+3
- jsr $bf00
!byte $ce ;seek
!word ce_parms
bcc +
jsr $bf00
!byte $d0 ;set EOF
!word ce_parms
bcc -
+
jsr $bf00
pro_op
!byte $ca ;read file
!word ca_parms
bcs jmpquit
- rts
printer
cmp #$8d
bne -
iny
sty cb_parms+4
dey
lda #<scrpname
sta c8_parms+1
ldx #(<gamename xor <scrpname)
jsr closefile1
jsr $bf00
!byte $d1
!word ce_parms
jsr $bf00
!byte $ce
!word ce_parms
jsr $bf00
!byte $cb
!word cb_parms
bcc closefile
jmpquit
jmp $dfe
savefile
jsr $bf00
!byte $c0
!word c0_parms
lda $e5a
sta c0_parms+5
jsr $bf00
!byte $c3
!word c0_parms
ldx #$e6
!byte $2c
loadfile
ldx #$b8
lda #$0d
pha
txa
pha
closefile
ldx #(<gamename xor <savename)
closefile1
jsr xclose
jsr xopen
lda adjust+1
eor #3
sta adjust+1
txa
eor c8_parms+1
sta c8_parms+1
rts
callback1
lda xrestore,y
cmp #$8d
bne +
ldx #<callback2
stx $11de
;!if #>callback1 != #>callback2 {
; ldx #>callback2
; stx $11df
;}
+ rts
callback2
lda $302
ora #$b0
ldx #<callback3
stx $11de
;!if #>callback2 != #>callback3 {
; ldx #>callback3
; stx $11df
;}
+ rts
callback3
lda #$D9
loadcall1
ldx #$0c
stx $11de
loadcall2
ldx #$fd
stx $11df
rts
xrestore
!byte $d2,$c5,$d3,$d4,$cf,$d2,$c5,$8d
callbackprn1
lda xscript,y
cmp #$8d
bne +
ldx #$0c
stx $11de
ldx #$fd
stx $11df
+ rts
xscript
!byte $d3,$c3,$d2,$c9,$d0,$d4,$8d
print
jsr $bf00
!byte $c1
!word c1_parms
lda #<scrpname
sta c0_parms+1
jsr $bf00
!byte $c0
!word c0_parms
inc $1363
lda #<savename
sta c0_parms+1
rts
xclose
jsr $bf00
!byte $cc
!word cc_parms
rts
xopen
jsr $bf00
!byte $c8
!word c8_parms
lda c8_parms+5
sta ce_parms+1
sta ca_parms+1
sta cb_parms+1
rts
casemap
ldy $32
bmi +
cmp #$61
bcc +
cmp #$7b
bcs +
mapmask
and #$ff
+ sta $200,x
- rts
waitkey
jsr $12f8
lda $c010
- lda $c000
bpl -
quit
jsr xclose
jsr $bf00
!byte $65
!word quit_parms
c8_parms
!byte 3
!word gamename
!word $800
!byte 0
c0_parms
!byte 7
!word savename
!byte %11000011
!byte 04
!word 0
cc_parms
!byte 1
!word 0
!word 0
ce_parms
!byte 2
!byte 0
!byte 0
!byte 0
!byte 0
ca_parms
!byte 4
!byte $ff
!word $2900
!word $100
!word $ffff
c1_parms
!byte 1
!word scrpname
cb_parms
quit_parms
!byte 4
!byte $ff
!word $200
!word $00ff
!word $ffff
hddcodeend
}
unpack ;unpacker entrypoint
lda #0
sta last
sta ecx+1
lda #0
sta last
sta ecx+1
literal
jsr getput
ldy #2
jsr getput
ldy #2
nexttag
jsr getbit
bcc literal
jsr getbit
bcc codepair
jsr getbit
bcs onebyte
jsr getsrc
lsr
beq donedepacking
ldx #0
stx ecx
rol ecx
stx last+1
tax
bne domatch_with_2inc
jsr getbit
bcc literal
jsr getbit
bcc codepair
jsr getbit
bcs onebyte
jsr getsrc
lsr
beq donedepacking
ldx #0
stx ecx
rol ecx
stx last+1
tax
bne domatch_with_2inc
getbit
asl last
bne .stillbitsleft
jsr getsrc
asl
sta last
inc last
asl last
bne .stillbitsleft
jsr getsrc
sec
rol
sta last
.stillbitsleft
donedepacking
rts
rts
onebyte
ldy #1
sty ecx
iny
lda #0
sta tmp+1
lda #$10
ldy #0
sty tmp+1
iny
sty ecx
iny
lda #$10
.getmorebits
pha
jsr getbit
pla
rol
bcc .getmorebits
bne domatch
jsr putdst
pha
jsr getbit
pla
rol
bcc .getmorebits
bne domatch
jsr putdst
linktag
bne nexttag
bne nexttag
codepair
jsr getgamma
- jsr dececx
dey
bne -
tay
ora ecx+1
beq +
jsr getgamma
- jsr dececx
dey
bne -
tay
beq +
normalcodepair
dey
sty last+1
jsr getsrc
tax
!byte $a9
+ iny
jsr getgamma
cpy #$7d
bcs domatch_with_2inc
cpy #5
bcs domatch_with_inc
txa
bmi domatch_new_lastpos
tya
bne domatch_new_lastpos
dey
sty last+1
jsr getsrc
tax
!byte $a9
+ iny
jsr getgamma
cpy #$7d
bcs domatch_with_2inc
cpy #5
bcs domatch_with_inc
txa
bmi domatch_new_lastpos
tya
bne domatch_new_lastpos
domatch_with_2inc
inc ecx
bne domatch_with_inc
inc ecx+1
clc
!byte $24
set_carry
sec
domatch_with_inc
inc ecx
bne domatch_new_lastpos
inc ecx+1
inc ecx
bne test_carry
inc ecx+1
test_carry
bcc set_carry
domatch_new_lastpos
domatch_lastpos
ldy #1
lda last+1
sta tmp+1
txa
ldy #1
lda last+1
sta tmp+1
txa
domatch
sta tmp
lda src+1
pha
lda src
pha
lda dst
sec
sbc tmp
sta src
lda dst+1
sbc tmp+1
sta src+1
- jsr getput
jsr dececx
ora ecx+1
bne -
pla
sta src
pla
sta src+1
bne linktag
sta tmp
lda src+1
pha
lda src
pha
lda dst
sec
sbc tmp
sta src
lda dst+1
sbc tmp+1
sta src+1
;;access1
;; sta $c003
- jsr getput
jsr dececx
ora ecx+1
bne -
;; sta $c002
pla
sta src
pla
sta src+1
bne linktag
getgamma
lda #1
sta ecx
sta ecx+1
dec ecx+1
lda #1
sta ecx
.getgammaloop
jsr getbit
rol ecx
rol ecx+1
jsr getbit
bcs .getgammaloop
rts
jsr getbit
rol ecx
rol ecx+1
jsr getbit
bcs .getgammaloop
rts
dececx
lda ecx
bne +
dec ecx+1
+ dec ecx
lda ecx
rts
lda ecx
bne +
dec ecx+1
+ dec ecx
lda ecx
rts
getput
jsr getsrc
jsr getsrc
putdst
sty tmp
ldy #0
sta (dst), y
inc dst
bne +
inc dst+1
bne +
sty tmp
ldy #0
sta (dst), y
inc dst
bne +
inc dst+1
bne +
getsrc
sty tmp
ldy #0
lda (src), y
inc src
bne +
inc src+1
+ ldy tmp
rts
sty tmp
ldy #0
lda (src), y
inc src
bne +
inc src+1
+ ldy tmp
rts
cc_parms
c7_parms !byte 1
!word $200
c5_parms !byte 2
!byte 0
!word $201
!byte $d1
c4_parms !byte $0a
!word $2006
!text "qkumba was here"
quit_parms !byte 4
!ifdef PASS2 {
!if >callback1 != >callback2 {
!if verbose_info = 1 {
!warn "callbacks=", >callback1, >callback2
} ;verbose_info
}
!if >callback2 != >callback3 {
!if verbose_info = 1 {
!warn "callbacks=", >callback2, >callback3
} ;verbose_info
}
} else {
!set PASS2=1
}
pakoff
!bin "src/onbeyond/z3/0800-23ff.pak"
!bin "src/onbeyond/z3/0d7d-2739.pak"
!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE