mirror of
https://github.com/badvision/lawless-legends.git
synced 2025-01-12 12:30:07 +00:00
Hacked into PLASMA's memory accessors to give VM code transparent read/write access to main language card $E000.FFFF, and aux bank 1 language card $D000.DFFF.
This commit is contained in:
parent
868837d040
commit
95c549984c
@ -35,6 +35,9 @@ pDst = $E ; len 2
|
|||||||
ucLen = $10 ; len 2
|
ucLen = $10 ; len 2
|
||||||
checksum = $12 ; len 1
|
checksum = $12 ; len 1
|
||||||
|
|
||||||
|
plasmaNextOp = $F0 ; PLASMA's dispatch loop
|
||||||
|
plasmaXTbl = $D300 ; op table for auXiliary code execution
|
||||||
|
|
||||||
; Memory buffers
|
; Memory buffers
|
||||||
fileBuf = $4000 ; len $400
|
fileBuf = $4000 ; len $400
|
||||||
diskBuf = $4400 ; len $800
|
diskBuf = $4400 ; len $800
|
||||||
@ -54,7 +57,7 @@ gcHash_dstHi = $5500
|
|||||||
prodosMemMap = $BF58
|
prodosMemMap = $BF58
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
; Relocate all the pieces to their correct locations
|
; Relocate all the pieces to their correct locations and perform patching.
|
||||||
relocate:
|
relocate:
|
||||||
; first our lo memory piece goes to $800
|
; first our lo memory piece goes to $800
|
||||||
ldy #0
|
ldy #0
|
||||||
@ -152,10 +155,63 @@ relocate:
|
|||||||
bne .cpmm
|
bne .cpmm
|
||||||
lda .st4+2
|
lda .st4+2
|
||||||
cmp #$E0
|
cmp #$E0
|
||||||
bcc init
|
bcc +
|
||||||
lda #"b"
|
lda #"b"
|
||||||
jsr cout
|
jsr cout
|
||||||
brk ; mem mgr got too big!
|
brk ; mem mgr got too big!
|
||||||
|
+
|
||||||
|
|
||||||
|
; Patch PLASMA's memory accessors to gain access to writing main LC, and
|
||||||
|
; to read/write bank 2 in aux LC.
|
||||||
|
|
||||||
|
; first copy the stub code into PLASMA's bank
|
||||||
|
bit setLcRW+lcBank2 ; PLASMA's bank
|
||||||
|
ldx #(plasmaAccessorsEnd-plasmaAccessorsStart-1)
|
||||||
|
- lda plasmaAccessorsStart,x
|
||||||
|
sta LBXX,x
|
||||||
|
dex
|
||||||
|
bpl -
|
||||||
|
|
||||||
|
; now record PLASMA's original routines, and patch it to call our stubs
|
||||||
|
lda plasmaXTbl+$60 ; LBX
|
||||||
|
sta oLBX+1
|
||||||
|
lda #<LBXX
|
||||||
|
sta plasmaXTbl+$60
|
||||||
|
lda plasmaXTbl+$61
|
||||||
|
sta oLBX+2
|
||||||
|
lda #>LBXX
|
||||||
|
sta plasmaXTbl+$61
|
||||||
|
|
||||||
|
lda plasmaXTbl+$62 ; LWX
|
||||||
|
sta oLWX+1
|
||||||
|
lda #<LWXX
|
||||||
|
sta plasmaXTbl+$62
|
||||||
|
lda plasmaXTbl+$63
|
||||||
|
sta oLWX+2
|
||||||
|
lda #>LWXX
|
||||||
|
sta plasmaXTbl+$63
|
||||||
|
|
||||||
|
lda plasmaXTbl+$70 ; SBX
|
||||||
|
sta oSBX+1
|
||||||
|
lda #<SBXX
|
||||||
|
sta plasmaXTbl+$70
|
||||||
|
iny
|
||||||
|
lda plasmaXTbl+$71
|
||||||
|
sta oSBX+2
|
||||||
|
lda #>SBXX
|
||||||
|
sta plasmaXTbl+$71
|
||||||
|
|
||||||
|
lda plasmaXTbl+$72 ; SWX
|
||||||
|
sta oSWX+1
|
||||||
|
lda #<SWXX
|
||||||
|
sta plasmaXTbl+$72
|
||||||
|
iny
|
||||||
|
lda plasmaXTbl+$73
|
||||||
|
sta oSWX+2
|
||||||
|
lda #>SWXX
|
||||||
|
sta plasmaXTbl+$73
|
||||||
|
|
||||||
|
; fall through into init...
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
init: !zone
|
init: !zone
|
||||||
@ -312,6 +368,57 @@ init: !zone
|
|||||||
ldx #$10 ; initial eval stack index
|
ldx #$10 ; initial eval stack index
|
||||||
.gomod: jmp $1111 ; jump to module for further bootstrapping
|
.gomod: jmp $1111 ; jump to module for further bootstrapping
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; Special PLASMA memory accessors
|
||||||
|
|
||||||
|
plasmaAccessorsStart:
|
||||||
|
!pseudopc $DF00 {
|
||||||
|
|
||||||
|
; Plasma load byte/word with special handling for $D000.DFFF in aux language card
|
||||||
|
LBXX: !zone {
|
||||||
|
clv ; clear V to denote LBX (as opposed to LWX)
|
||||||
|
bvc .shld ; always taken
|
||||||
|
LWXX: bit monrts ; set V to denote LWX (not LBX)
|
||||||
|
.shld lda evalStkH,x ; hi byte of address to load from
|
||||||
|
cmp #$D0
|
||||||
|
bcc .norm
|
||||||
|
cmp #$E0
|
||||||
|
bcs .norm
|
||||||
|
sty tmp
|
||||||
|
jsr l_LXXX ; helper function in low memory because it switches us out (we're in main LC)
|
||||||
|
ldy tmp
|
||||||
|
jmp plasmaNextOp
|
||||||
|
.norm bvs oLWX
|
||||||
|
oLBX: jmp $1111 ; modified to be addr of original LBX
|
||||||
|
oLWX: jmp $1111 ; modified to be addr of original LWX
|
||||||
|
|
||||||
|
} ; zone
|
||||||
|
|
||||||
|
; Plasma store byte/word with special handling for $D000.DFFF and $E000.FFFF
|
||||||
|
SBXX: !zone {
|
||||||
|
clv ; clear V to denote SBX (as opposed to SWX)
|
||||||
|
bvc .shst ; always taken
|
||||||
|
SWXX: bit monrts ; set V to denote SWX (not SBX)
|
||||||
|
.shst lda evalStkH+1,x ; get hi byte of pointer to store to
|
||||||
|
cmp #$D0 ; in $0000.CFFF range,
|
||||||
|
bcc .norm ; just do normal store
|
||||||
|
bit setLcRW+lcBank2 ; PLASMA normally write-protects the LC,
|
||||||
|
bit setLcRW+lcBank2 ; but let's allow writing there
|
||||||
|
cmp #$E0 ; in $E000.FFFF range do normal store after write-enable
|
||||||
|
bcs .norm
|
||||||
|
sty tmp
|
||||||
|
jsr l_SXXX ; helper function in low memory because it switches us out (we're in main LC)
|
||||||
|
ldy tmp
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
jmp plasmaNextOp
|
||||||
|
.norm bvs oSWX
|
||||||
|
oSBX: jmp $1111 ; modified to be addr of original SBX
|
||||||
|
oSWX: jmp $1111 ; modified to be addr of original SWX
|
||||||
|
} ; zone
|
||||||
|
} ; pseudopc
|
||||||
|
plasmaAccessorsEnd:
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
; Vectors and debug support code - these go in low memory at $800
|
; Vectors and debug support code - these go in low memory at $800
|
||||||
loMemBegin: !pseudopc $800 {
|
loMemBegin: !pseudopc $800 {
|
||||||
@ -450,6 +557,47 @@ exitProDOS: !zone
|
|||||||
; manager lives, and it's the only code that calls ProDOS.
|
; manager lives, and it's the only code that calls ProDOS.
|
||||||
rti ; RTI pops P-reg and *exact* return addr (not adding 1)
|
rti ; RTI pops P-reg and *exact* return addr (not adding 1)
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; Replacement memory accessors for PLASMA, so we can utilize language card mem
|
||||||
|
; including the hard-to-reach aux-bank $D000.DFFF
|
||||||
|
|
||||||
|
l_LXXX: !zone {
|
||||||
|
sta .ld+2
|
||||||
|
lda evalStkL,x
|
||||||
|
sta .ld+1
|
||||||
|
sta setAuxZP
|
||||||
|
ldy #1
|
||||||
|
.ldlup sta .lhb+1
|
||||||
|
.ld lda $1111,y ; self-modified above
|
||||||
|
dey
|
||||||
|
bne .ldlup
|
||||||
|
sta clrAuxZP
|
||||||
|
sta evalStkL,x
|
||||||
|
bvc +
|
||||||
|
.lhb lda #11 ; self-modified above
|
||||||
|
sta evalStkH,x
|
||||||
|
+ rts
|
||||||
|
}
|
||||||
|
|
||||||
|
l_SXXX: !zone {
|
||||||
|
sta .st+2 ; in $D000.DFFF range, we jump through hoops to write to AUX LC
|
||||||
|
lda evalStkL+1,x ; lo byte of pointer
|
||||||
|
sta .st+1
|
||||||
|
lda evalStkH,x ; hi byte of value to store
|
||||||
|
sta .shb+1
|
||||||
|
lda evalStkL,x ; lo byte of value
|
||||||
|
sta setAuxZP ; switch to aux LC
|
||||||
|
+ ldy #0
|
||||||
|
.st sta $1111,y ; self-modified above
|
||||||
|
bvc + ; for SBX, don't write hi byte
|
||||||
|
.shb lda #11 ; self-modified above
|
||||||
|
iny
|
||||||
|
cpy #2
|
||||||
|
bne .st ; loop to write hi byte also
|
||||||
|
+ sta clrAuxZP ; back to main LC
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
; Utility routine for convenient assembly routines in PLASMA code.
|
; Utility routine for convenient assembly routines in PLASMA code.
|
||||||
; Params: Y=number of parameters passed from PLASMA routine
|
; Params: Y=number of parameters passed from PLASMA routine
|
||||||
@ -897,14 +1045,14 @@ gc1_mark: !zone
|
|||||||
bvc .start
|
bvc .start
|
||||||
; Phase 3 of Garbage Collection: fix all pointers
|
; Phase 3 of Garbage Collection: fix all pointers
|
||||||
gc3_fix:
|
gc3_fix:
|
||||||
bit .rts ; set V flag to mark phase 3
|
bit monrts ; set V flag to mark phase 3
|
||||||
.start lda #0
|
.start lda #0
|
||||||
sta resNum ; initialize block counter (note: blk #0 in hash is not used)
|
sta resNum ; initialize block counter (note: blk #0 in hash is not used)
|
||||||
.outer inc resNum ; advance to next block in hash
|
.outer inc resNum ; advance to next block in hash
|
||||||
ldx resNum
|
ldx resNum
|
||||||
cpx gcHash_top ; finished all blocks?
|
cpx gcHash_top ; finished all blocks?
|
||||||
beq .trav ; last blk? if so still need to trav it
|
beq .trav ; last blk? if so still need to trav it
|
||||||
bcs .rts ; or if past last blk, we're done
|
bcs .done ; or if past last blk, we're done
|
||||||
.trav ldy gcHash_srcLo,x ; get pointer to block, lo byte first
|
.trav ldy gcHash_srcLo,x ; get pointer to block, lo byte first
|
||||||
lda gcHash_srcHi,x ; then hi byte
|
lda gcHash_srcHi,x ; then hi byte
|
||||||
bvc +
|
bvc +
|
||||||
@ -947,7 +1095,7 @@ gc3_fix:
|
|||||||
+ ldx tmp+1 ; restore type entry index
|
+ ldx tmp+1 ; restore type entry index
|
||||||
inx ; next offset entry
|
inx ; next offset entry
|
||||||
bne .ldof ; always taken
|
bne .ldof ; always taken
|
||||||
.rts rts ; this needs to be an RTS instruction - used to set V flag
|
.done rts
|
||||||
.corrup jmp heapCorrupt
|
.corrup jmp heapCorrupt
|
||||||
|
|
||||||
; Phase 2 of Garbage Collection: sweep all accessible blocks together
|
; Phase 2 of Garbage Collection: sweep all accessible blocks together
|
||||||
|
@ -1553,8 +1553,6 @@ def findTestString(len)
|
|||||||
for t = 1 to len
|
for t = 1 to len
|
||||||
p2 = p2+1
|
p2 = p2+1
|
||||||
printf1("Setting %x to 'X'\n", p2)
|
printf1("Setting %x to 'X'\n", p2)
|
||||||
^$c083
|
|
||||||
^$c083
|
|
||||||
p2->0 = 'X'
|
p2->0 = 'X'
|
||||||
next
|
next
|
||||||
return p
|
return p
|
||||||
|
Loading…
x
Reference in New Issue
Block a user