From 6c9515b63c910525166220e00ec9e28024499abc Mon Sep 17 00:00:00 2001 From: Martin Haye Date: Mon, 8 Aug 2016 07:47:01 -0700 Subject: [PATCH] Lots of progress toward freeing up up. --- Platform/Apple/virtual/src/core/mem.s | 254 ++++++++++-------- Platform/Apple/virtual/src/include/global.i | 40 +-- Platform/Apple/virtual/src/include/mem.i | 18 +- Platform/Apple/virtual/src/plasma/diskops.pla | 3 +- .../Apple/virtual/src/plasma/gameloop.pla | 51 ++-- 5 files changed, 212 insertions(+), 154 deletions(-) diff --git a/Platform/Apple/virtual/src/core/mem.s b/Platform/Apple/virtual/src/core/mem.s index b7e2185c..e6d0abe3 100644 --- a/Platform/Apple/virtual/src/core/mem.s +++ b/Platform/Apple/virtual/src/core/mem.s @@ -29,8 +29,8 @@ MAX_SEGS = 96 DO_COMP_CHECKSUMS = 0 ; during compression debugging DEBUG_DECOMP = 0 -DEBUG = 1 -SANITY_CHECK = 1 ; also prints out request data +DEBUG = 0 +SANITY_CHECK = 0 ; also prints out request data ; Zero page temporary variables tmp = $2 ; len 2 @@ -78,11 +78,11 @@ prodosMemMap = $BF58 ; Relocate all the pieces to their correct locations and perform patching. relocate: ; put something interesting on the screen :) - jsr home + jsr ROM_home ldy #0 - lda .welcomeText,y beq + - jsr cout + jsr ROM_cout iny bne - jmp + @@ -175,18 +175,23 @@ relocate: iny bne .st2 inx - cpx #$F8 bne .clrlup -; it's very convenient to have the monitor in the LC for debugging +; Copy the vectors + ldx #6 bit setLcWr+lcBank1 ; read from ROM, write to LC RAM -.cpmon stx .ld3+2 - stx .st3+2 -.ld3 lda $F800,Y -.st3 sta $F800,Y - iny - bne .ld3 - inx - bne .cpmon +- lda $FFFA,x + sta $FFFA,x + dex + bpl - + ; set up a BRK/IRQ vector in low mem + lda $FFFE + sta _jbrk+1 + lda $FFFF + sta _jbrk+2 + lda #brkHandler + sta $FFFF ; Place the bulk of the memory manager code into the newly cleared LC ldx #>hiMemBegin .cpmm stx .ld4+2 @@ -203,7 +208,6 @@ relocate: bcc + +internalErr 'N' ; mem mgr got too big! + - ; fall through into init... ;------------------------------------------------------------------------------ @@ -262,9 +266,9 @@ init: !zone lda #1 sta scanStart+1 ; make reset go to monitor - lda #monitor + lda #>goToMonitor sta resetVec+1 eor #$A5 sta resetVec+2 @@ -397,6 +401,9 @@ loMemBegin: !pseudopc $800 { ; Vectors for debug macros jmp __iosaveROM jmp __iorestLC + jmp __safeCout + jmp __safePrbyte + jmp __safeHome jmp __writeStr jmp __prByte jmp __prSpace @@ -407,6 +414,8 @@ loMemBegin: !pseudopc $800 { jmp __crout jmp __waitKey jmp __internalErr +_fixedRTS: + rts ; fixed place to find RTS, for setting V flag j_main_dispatch: bit setLcRW+lcBank1 ; switch in mem mgr @@ -439,21 +448,22 @@ inlineFatal: fatalError: !zone sty pTmp+1 ; save message ptr hi... stx pTmp ; ...and lo - jsr setnorm ; set up text mode and vectors + jsr saveLCState + jsr ROM_setnorm ; set up text mode and vectors bit setText bit page1 - jsr setvid - jsr setkbd + jsr ROM_setvid + jsr ROM_setkbd lda $24 ; check if we're already at start of screen line beq + ; no, no need for CR - jsr crout ; carriage return to get to start of screen line + jsr ROM_crout ; carriage return to get to start of screen line + ldy #40 ; set up to print 40 dashes lda #'-' -.dash: jsr cout +.dash: jsr ROM_cout dey bne .dash + jsr restLCState +prStr : !text "FATAL ERROR: ",0 - ldx #$FF ; for asm str, max length lda (pTmp),y ; first byte (Y ends at 0 in loop above) bmi .msg ; if hi bit, it's a zero-terminated asm string @@ -462,11 +472,12 @@ fatalError: !zone .msg lda (pTmp),y beq .done ora #$80 ; set hi bit of PLASMA strings for cout - jsr cout + +safeCout iny dex bne .msg -.done: jsr bell +.done: bit setROM + jsr ROM_bell .hang: jmp .hang ; loop forever ;------------------------------------------------------------------------------ @@ -527,6 +538,25 @@ exitProDOS: !zone ; manager lives, and it's the only code that calls ProDOS. rti ; RTI pops P-reg and *exact* return addr (not adding 1) +;------------------------------------------------------------------------------ +; BRK and IRQ handler: switch to ROM, call default handler, switch back +brkHandler: + sta $45 ; preserve A reg + pla ; retrieve saved P reg + pha + and #$10 ; check for BRK bit + beq _jbrk ; if not brk, handle without bank switch + bit setROM ; for BRK, do bank switch + bit $c051 ; also switch to text screen 1 + bit $c054 +_jbrk jmp $1111 ; self-modified by init + +;------------------------------------------------------------------------------ +; On reset, jump to monitor (in ROM) +goToMonitor: + bit setROM + jmp ROM_monitor + ;------------------------------------------------------------------------------ ; Utility routine for convenient assembly routines in PLASMA code. ; Params: Y=number of parameters passed from PLASMA routine @@ -589,6 +619,11 @@ frameChk: ; Save registers and also the state of the language card switches, then switch ; to ROM. __iosaveROM: !zone { + jsr saveLCState + jmp ROM_iosave +} + +saveLCState: !zone { php pha lda rdLCBnk2 @@ -596,29 +631,25 @@ __iosaveROM: !zone { bit setROM pla plp - jmp iosave -} - -; Restore registers and also the state of the language card switches. -__iorestLC: !zone { - jsr iorest - php - jsr restLCState - plp rts } -; Restore the state of the language card bank switch -restLCState: !zone { +; Restore registers and also the state of the language card switches. +__iorestLC: + jsr ROM_iorest + ; fall through to restLCState +restLCState: ; Restore the state of the language card bank switch + php bit savedLCBnk2State bmi + bit setLcRW+lcBank1 bit setLcRW+lcBank1 + plp rts + bit setLcRW+lcBank2 bit setLcRW+lcBank2 + plp rts -} ; Fetch a byte pointed to by the first entry on the stack, and advance that entry. ; Does LC switching to be sure to get the byte from the correct bank (if it happens @@ -646,10 +677,10 @@ __writeStr: !zone { tsx .loop: jsr _getStackByte beq .done - jsr cout + jsr ROM_cout cmp #$AE ; "." bne .loop - jsr crout + jsr ROM_crout jmp .loop .done: jmp __iorestLC } @@ -667,10 +698,23 @@ _prShared: !zone { jsr _getStackByte sta .ld+2 .ld: lda $2000,y - jsr prbyte + jsr ROM_prbyte ; not safePrbyte, because we already switched to ROM dey bpl .ld - +prSpace + lda #$A0 + jsr ROM_cout ; not safeCout, because we already switched to ROM + jmp __iorestLC +} + +__safeCout: !zone { + jsr saveLCState + jsr ROM_cout + jmp restLCState +} + +safePrhex: !zone { + jsr __iosaveROM + jsr ROM_prhex jmp __iorestLC } @@ -678,7 +722,7 @@ __prSpace: !zone { php pha lda #$A0 - jsr cout + jsr __safeCout pla plp rts @@ -690,48 +734,45 @@ __prWord: !zone { bne _prShared ; always taken } -__prA: !zone { - php - pha - jsr prbyte - pla - plp - rts -} - -__prX: !zone { - php - pha - txa - jsr prbyte - pla - plp - rts -} +__safePrbyte: + jsr saveLCState + jsr ROM_prbyte + jmp restLCState -__prY: !zone { - php - pha - tya - jsr prbyte - pla - plp - rts -} +__safeHome: + jsr saveLCState + jsr ROM_home + jmp restLCState + +__prA: jsr __iosaveROM + lda $45 ; A reg stored here +pr_AXY_shared: + jsr ROM_prbyte + jmp __iorestLC + +__prX: + jsr __iosaveROM + lda $46 ; X reg stored here + jmp pr_AXY_shared + +__prY: + jsr __iosaveROM + lda $47 ; y reg stored here + jmp pr_AXY_shared __crout: !zone { - php - pha - jsr crout - pla - plp - rts + jsr __iosaveROM + jsr ROM_crout + jmp __iorestLC } __waitKey: !zone { jsr __iosaveROM - jsr rdkey - jmp __iorestLC + jsr ROM_rdkey + pha + jsr __iorestLC + pla + rts } ; Support for very compact abort in the case of internal errors. Prints @@ -740,7 +781,7 @@ __internalErr: !zone { +prStr : !text $8D,"err=",0 tsx jsr _getStackByte - jsr cout + jsr __safeCout jsr inlineFatal : !text "Internal",0 } @@ -906,6 +947,12 @@ retPSrc: heapIntern: !zone stx pTmp sty pTmp+1 + + ; FOO + lda #$60 + sta tmp + jsr tmp + jsr startHeapScan bcs .notfnd ; handle case of empty heap .blklup bvs .nxtblk @@ -1041,9 +1088,7 @@ heapCheck: !zone } ; if DEBUG heapCorrupt: - ldx pTmp - lda pTmp+1 - jsr prntax + +prWord pTmp jsr inlineFatal : !text "HeapCorrupt",0 ; Begin a heap scan by setting pTmp to start-of-heap, then returns @@ -1091,7 +1136,7 @@ getHeapBlk: tax cpx nTypes bcs heapCorrupt - bit monrts ; set V flag + bit fixedRTS ; set V flag lda typeLen,x bvs .gotlen ; always taken @@ -1112,7 +1157,7 @@ gc1_mark: !zone bvc .start ; Phase 3 of Garbage Collection: fix all pointers gc3_fix: - bit monrts ; set V flag to mark phase 3 + bit fixedRTS ; set V flag to mark phase 3 .start lda #0 sta resNum ; initialize block counter (note: blk #0 in hash is not used) .outer inc resNum ; advance to next block in hash @@ -1488,7 +1533,7 @@ saneEnd: !zone { printMem: !zone lda $24 ; check if we're already at start of screen line beq + ; no, no need for CR - jsr crout ; carriage return to get to start of screen line + +crout + lda isAuxCmd bne aux_printMem main_printMem: @@ -1504,15 +1549,15 @@ aux_printMem: dex bne - lda #'$' - jsr cout + +safeCout lda tSegAdrHi,y - jsr prbyte + +safePrbyte lda tSegAdrLo,y - jsr prbyte + +safePrbyte lda #',' - jsr cout + +safeCout lda #'L' - jsr cout + +safeCout lda tSegLink,y tax lda tSegAdrLo,x @@ -1521,9 +1566,9 @@ aux_printMem: pha lda tSegAdrHi,x sbc tSegAdrHi,y - jsr prbyte + +safePrbyte pla - jsr prbyte + +safePrbyte lda tSegType,y tax and #$40 @@ -1534,15 +1579,15 @@ aux_printMem: cpx #0 bmi ++ lda #'-' -++ jsr cout +++ +safeCout txa and #$F tax - jsr prhex + jsr safePrhex txa beq + lda #':' - jsr cout + +safeCout lda tSegRes,y +prA jmp .next @@ -1555,7 +1600,8 @@ aux_printMem: tay beq + jmp .printSegs -+ jmp crout ++ +crout + rts ;------------------------------------------------------------------------------ reset: !zone @@ -2049,15 +2095,15 @@ openPartition: !zone sta readAddr jmp readToMain ; finish by reading the rest of the header ; ask user to insert the disk -.insert jsr home +.insert +safeHome +prStr : !text "Insert disk ",0 bit $c051 lda curPartition clc adc #"0" - jsr cout - jsr rdkey - jsr home + +safeCout + +waitKey + +safeHome bit $c050 jmp .open ; try again .fileStr !raw "/GAME.PART.1",0 ; 'raw' chars to get lo-bit ascii that ProDOS likes. @@ -2296,18 +2342,16 @@ disk_finishLoad: !zone .debug1:+prStr : !text "Ld t=",0 pha lda resType - jsr prhex - lda #" " - jsr cout + jsr safePrhex + +prSpace pla +prStr : !text "n=",0 +prByte resNum +prStr : !text "aux=",0 pha lda isAuxCmd - jsr prhex - lda #" " - jsr cout + jsr safePrhex + +prSpace pla rts .debug2:+prStr : !text "rawLen=",0 diff --git a/Platform/Apple/virtual/src/include/global.i b/Platform/Apple/virtual/src/include/global.i index 8984c825..11a0a38b 100644 --- a/Platform/Apple/virtual/src/include/global.i +++ b/Platform/Apple/virtual/src/include/global.i @@ -96,24 +96,24 @@ setLcRW = $C083 lcBank2 = 0 lcBank1 = 8 -; ROM routines -prntax = $F941 -textinit = $FB2F -home = $FC58 -rdkey = $FD0C -getln1 = $FD6F -crout = $FD8E -prbyte = $FDDA -prhex = $FDE3 -cout = $FDED -setnorm = $FE84 -setkbd = $FE89 -setvid = $FE93 -prerr = $FF2D -bell = $FF3A -iosave = $FF4A -iorest = $FF3F -monrts = $FF58 -monitor = $FF69 -getnum = $FFA7 +; ROM routines (call with care after switching to ROM bank) +ROM_prntax = $F941 +ROM_textinit = $FB2F +ROM_home = $FC58 +ROM_rdkey = $FD0C +ROM_getln1 = $FD6F +ROM_crout = $FD8E +ROM_prbyte = $FDDA +ROM_prhex = $FDE3 +ROM_cout = $FDED +ROM_setnorm = $FE84 +ROM_setkbd = $FE89 +ROM_setvid = $FE93 +ROM_prerr = $FF2D +ROM_bell = $FF3A +ROM_iosave = $FF4A +ROM_iorest = $FF3F +ROM_monrts = $FF58 +ROM_monitor = $FF69 +ROM_getnum = $FFA7 diff --git a/Platform/Apple/virtual/src/include/mem.i b/Platform/Apple/virtual/src/include/mem.i index 6b02d429..d4f8ad9e 100644 --- a/Platform/Apple/virtual/src/include/mem.i +++ b/Platform/Apple/virtual/src/include/mem.i @@ -400,7 +400,10 @@ _asmPlasm_bank2 = _asmPlasm+3 ; Debug support routines (defined in core/mem.s) _iosaveROM = _asmPlasm_bank2+3 _iorestLC = _iosaveROM+3 -_writeStr = _iorestLC+3 +_safeCout = _iorestLC+3 +_safePrbyte = _safeCout+3 +_safeHome = _safePrbyte+3 +_writeStr = _safeHome+3 _prByte = _writeStr+3 _prSpace = _prByte+3 _prWord = _prSpace+3 @@ -410,6 +413,7 @@ _prY = _prX+3 _crout = _prY+3 _waitKey = _crout+3 _internalErr = _waitKey+3 +fixedRTS = _internalErr+3 ; Debug macros !macro iosaveROM { @@ -420,6 +424,18 @@ _internalErr = _waitKey+3 jsr _iorestLC } +!macro safeCout { + jsr _safeCout +} + +!macro safePrbyte { + jsr _safeCout +} + +!macro safeHome { + jsr _safeHome +} + !macro prStr { jsr _writeStr } diff --git a/Platform/Apple/virtual/src/plasma/diskops.pla b/Platform/Apple/virtual/src/plasma/diskops.pla index a9063fbd..ba522325 100644 --- a/Platform/Apple/virtual/src/plasma/diskops.pla +++ b/Platform/Apple/virtual/src/plasma/diskops.pla @@ -149,7 +149,8 @@ end // Params: None asm home +asmPlasm 0 - jmp home + +safeHome + rts end /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index d91e858b..57225298 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -270,8 +270,11 @@ export asm finishString !zone { +asmPlasm 1 sta tmp ; save isPlural flag - jsr setvid ; put the cout vector back to default - bit monrts ; V flag for prev-is-punctuation + lda #$F0 ; put the cout vector back to default + sta cswl + lda #$FD + sty cswh + bit fixedRTS; V flag for prev-is-punctuation ldy #1 ; dest offset in Y ldx #1 ; source offset in X cpx inbuf @@ -327,7 +330,7 @@ export asm finishString bcc + clv ; clear last-is-punc flag bvc .store ; always taken -+ bit monrts ; set prev-is-punc flag ++ bit fixedRTS; set prev-is-punc flag sty tmp+1 ; save dest offset of last punctuation .store @@ -489,7 +492,7 @@ export asm puts iny - lda (pTmp),y ora #$80 - jsr cout + +safeCout iny dex bne - @@ -500,7 +503,9 @@ end // Get a character from the keyboard export asm rdkey +asmPlasm 0 - jmp rdkey + +waitKey + ldy #0 + rts end /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -526,7 +531,7 @@ asm partialPrintf ora #$80 cmp #'%' ; stop if we hit % code beq + - jsr cout + +safeCout iny dec tmp ; otherwise go until end of string bne - @@ -545,9 +550,8 @@ end // Print a 16-bit hex value asm printHex +asmPlasm 1 - tax - tya - jmp prntax + +prYA + rts end /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -555,30 +559,37 @@ end asm printChar +asmPlasm 1 ora #$80 - jmp cout + jmp _safeCout end /////////////////////////////////////////////////////////////////////////////////////////////////// // Print a carriage return asm crout +asmPlasm 0 - jmp crout + lda #$8D + jmp _safeCout end /////////////////////////////////////////////////////////////////////////////////////////////////// // Ring the bell export asm beep +asmPlasm 0 - jmp bell + +iosaveROM + jsr ROM_bell + jmp _iorestLC end /////////////////////////////////////////////////////////////////////////////////////////////////// // Read a string from the keyboard, turn it into a PLASMA string and return a pointer to the string. asm readStr +asmPlasm 0 - jsr getln1 + +iosaveROM + jsr ROM_getln1 txa pha + +iorestLC + pla + pha beq + - lda inbuf-1,x and #$7F @@ -670,20 +681,6 @@ export asm brk brk end - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// Clear the screen and reboot the machine -// Params: None -export asm reboot - bit setROM - jsr home - bit setText - bit page1 - inc $3F4 ; invalidate reset vector - jmp $FA62 ; and reset -end - - /////////////////////////////////////////////////////////////////////////////////////////////////// // Set up the font engine // Params: pFont