From 315c6b6936ef63e9056c452770a173a7e6d8c926 Mon Sep 17 00:00:00 2001 From: Martin Haye Date: Tue, 3 Mar 2015 09:03:22 -0800 Subject: [PATCH] More work on 2D script triggers. --- Platform/Apple/virtual/build.xml | 2 +- Platform/Apple/virtual/src/core/mem.s | 46 ++++++++-- Platform/Apple/virtual/src/include/plasma.i | 1 + .../Apple/virtual/src/plasma/gameloop.pla | 86 ++++++++++++------- 4 files changed, 96 insertions(+), 39 deletions(-) diff --git a/Platform/Apple/virtual/build.xml b/Platform/Apple/virtual/build.xml index 85e0b614..4ae7f65a 100644 --- a/Platform/Apple/virtual/build.xml +++ b/Platform/Apple/virtual/build.xml @@ -32,7 +32,7 @@ Building core. - Building PLASMA. + Building game loop. Building raycast. diff --git a/Platform/Apple/virtual/src/core/mem.s b/Platform/Apple/virtual/src/core/mem.s index 4702eff6..75ae919a 100644 --- a/Platform/Apple/virtual/src/core/mem.s +++ b/Platform/Apple/virtual/src/core/mem.s @@ -88,7 +88,7 @@ partFileRef: !byte 0 fixupHint: !word 0 ;------------------------------------------------------------------------------ -!source "../include/debug.i" +!if DEBUG { !source "../include/debug.i" } ;------------------------------------------------------------------------------ grabSegment: !zone @@ -238,9 +238,11 @@ main_dispatch: !zone + cmp #FREE_MEMORY bne + jmp main_free +!if DEBUG { + cmp #DEBUG_MEM bne + jmp main_debug +} + cmp #CALC_FREE bne shared_dispatch jmp main_calcFree @@ -276,9 +278,11 @@ aux_dispatch: !zone + cmp #FREE_MEMORY bne + jmp aux_free +!if DEBUG { + cmp #DEBUG_MEM bne + jmp aux_debug +} + cmp #CALC_FREE bne + jmp aux_calcFree @@ -287,7 +291,7 @@ aux_dispatch: !zone ;------------------------------------------------------------------------------ ; Sanity check mode !if SANITY_CHECK { -saneStart: !zone +saneStart: !zone { pha tya pha @@ -298,23 +302,33 @@ saneStart: !zone tax pla tay - +prChr 'M'+$80 + +prChr 'M' pla : pha : +prA +prX : +prY pla rts +} -saneCheck: !zone - rts +saneCheck: !zone { + lda $BF00 + cmp #$4C + beq + + brk ++ lda $E1 + cmp #$BE + bcc + + brk ++ rts +} -saneEnd: !zone +saneEnd: !zone { pha tya pha txa pha jsr saneCheck - +prChr 'm'+$80 + +prChr 'm' +crout pla tax @@ -323,6 +337,7 @@ saneEnd: !zone pla rts } +} ;------------------------------------------------------------------------------ ; Print fatal error message (custom or predefined) and print the @@ -397,7 +412,13 @@ fatalError: !zone init: !zone ; put something interesting on the screen :) jsr home - +prStr : !text "Welcome to MythOS.",0 + ldx #0 +- lda .welcomeStr,x + beq + + jsr cout + inx + bne - ++ ; close all files lda #0 jsr closeFile @@ -489,14 +510,20 @@ init: !zone cpy #MAX_SEGS ; did all segments yet? bne .loop ; no, loop again ; Allocate space for the PLASMA frame stack +!if SANITY_CHECK { + lda #$20 + sta framePtr+1 ; because sanity check verifies it's not $BE or $BF +} ldx #0 ldy #2 ; 2 pages lda #REQUEST_MEMORY jsr mainLoader stx framePtr + stx outerFramePtr iny ; twice for 2 pages: initial pointer at top of new space iny sty framePtr+1 + sty outerFramePtr+1 dey dey lda #LOCK_MEMORY ; lock it in place forever @@ -518,8 +545,10 @@ init: !zone jsr mainLoader ldx #$10 ; initial eval stack index .gomod: jmp $1111 ; jump to module for further bootstrapping +.welcomeStr !text "Welcome to MythOS.",$8D,0 ;------------------------------------------------------------------------------ +!if DEBUG { printMem: !zone jsr main_debug jmp aux_debug @@ -561,6 +590,7 @@ aux_debug: jsr cout txa jmp prbyte +} ;------------------------------------------------------------------------------ reset: !zone diff --git a/Platform/Apple/virtual/src/include/plasma.i b/Platform/Apple/virtual/src/include/plasma.i index fff6d0c7..27b5ebd0 100644 --- a/Platform/Apple/virtual/src/include/plasma.i +++ b/Platform/Apple/virtual/src/include/plasma.i @@ -2,3 +2,4 @@ evalStkL = $C0 evalStkH = $D0 framePtr = $E0 +outerFramePtr = $E2 \ No newline at end of file diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index 963f5c5a..0fcbd89d 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -98,10 +98,6 @@ const wndbtm = $73 // bottom+1 of text window const cursh = $74 // Cursor H-pos 0-39 const cursv = $75 // Cursor V-pos 0-23 -/////////////////////////////////////////////////////////////////////////////////////////////////// -// Strings. -byte helloStr[] = "Loading Lawless Legends.\n" - /////////////////////////////////////////////////////////////////////////////////////////////////// // Global variables byte mapNum = OVERMAP_NUM @@ -121,7 +117,7 @@ byte cacheSky, cacheGround word cacheX, cacheY byte cacheDir byte resetLocFromCache = FALSE -byte anyText = FALSE +byte textDrawn = FALSE // Movement amounts when walking at each angle // Each entry consists of an X bump and a Y bump, in 8.8 fixed point @@ -448,6 +444,14 @@ asm goMon jmp $FF69 end +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Jump straight to the system monitor +// Params: None +asm brk + bit setROM + brk +end + /////////////////////////////////////////////////////////////////////////////////////////////////// // Use the font engine to clear the current text window // Params: None @@ -470,9 +474,6 @@ asm displayStr bit setROM txa pha - ; record that text was drawn - for clear window on next script phase - lda #1 - sta textDrawn lda evalStkL,x sta pTmp lda evalStkH,x @@ -569,6 +570,9 @@ end /////////////////////////////////////////////////////////////////////////////////////////////////// // Is there a script attached to the player's current position? def isScripted() + puts("avatarTile=") + printHex(^avatarTile) + crout() return ^avatarTile & $20 end @@ -700,7 +704,7 @@ def initMap3D() // Initialize the map scripts setWindow2() clearWindow() - anyText = FALSE + textDrawn = FALSE prevX = -1 prevY = -1 @@ -760,16 +764,17 @@ def initMap2D() // Start up the font engine initFontEngine(pFont) - // Start up the tile engine - initDisplayEngine(mapNum) - // For now prevX = -1 prevY = -1 triggerTbl = NULL prevMapNum = mapNum prevMapIs3D = mapIs3D - pScripts = NULL + + // Start up the tile engine + initDisplayEngine(mapNum) + + // And do the first draw. renderFrame() redraw = FALSE end @@ -832,15 +837,17 @@ def callScripts(x, y) word p word pNext word script - - printHex($1001) + + puts("callScripts: x=") printHex(x) crout() - + p = triggerTbl while TRUE - printHex($1002) + ^$c051 + puts("y loop, p=") printHex(p) + puts("^p=") printHex(^p) crout() getUpperKey @@ -848,22 +855,33 @@ def callScripts(x, y) if ^p == $FF return fin - pNext = p + p.1 + pNext = p + p->1 + puts("p->1=") + printHex(p->1) + crout() + puts("pNext=") + printHex(pNext) + crout() if ^p == y + p = p + 2 while p < pNext - printHex($1003) + puts(" x loop, p=") printHex(p) + puts("^p=") printHex(^p) + puts("x=") + printHex(x) crout() - if ^p == x - script = p:1 - printHex($1004) + if x == ^p + script = p->>x + puts(" script=") printHex(script) crout() *script fin p = p + 3 + getUpperKey loop fin p = pNext @@ -875,6 +893,9 @@ end def checkScripts() word x word y + puts("checkScripts: triggerTbl=") + printHex(triggerTbl) + crout() if !triggerTbl return fin @@ -885,17 +906,20 @@ def checkScripts() x = ^avatarX y = ^avatarY fin + puts("x=") + printHex(x) + puts(", y=") + printHex(y) + crout() if x <> prevX or y <> prevY prevX = x prevY = y - if anyText + if textDrawn clearWindow() - anyText = FALSE + textDrawn = FALSE fin if isScripted() - textDrawn = FALSE callScripts(x, y) - anyText = ^textDrawn fin fin if (mapNum <> prevMapNum) or (mapIs3D <> prevMapIs3D) @@ -1018,7 +1042,7 @@ def teleport(x, y, dir) prevX = x prevY = y clearWindow() - anyText = FALSE + textDrawn = FALSE ^playerDir = dir redraw = TRUE end @@ -1056,7 +1080,7 @@ end // Called by scripts to display a string. We set the flag noting that something has been // displayed, then use an assembly routine to do the work. def scriptDisplayStr(str) - anyText = TRUE + textDrawn = TRUE displayStr(str) end @@ -1070,7 +1094,7 @@ def getYN() return 1 elsif key == 'N' clearWindow() - anyText = FALSE + textDrawn = FALSE return 0 fin beep() @@ -1119,14 +1143,16 @@ end /////////////////////////////////////////////////////////////////////////////////////////////////// // Load and display the title screen. def loadTitle() - puts(@helloStr) + puts("Loading Lawless Legends.\n") // Load the title screen + puts("Loading title screen.\n") loader(SET_MEM_TARGET, MAIN_MEM, $2000) loader(QUEUE_LOAD, MAIN_MEM, 1<<8 | RES_TYPE_SCREEN) // title screen is fixed at #1 loader(LOCK_MEMORY, MAIN_MEM, $2000) loader(FINISH_LOAD, MAIN_MEM, 1) // 1 = keep open titleLoaded = TRUE + puts("Title loaded.\n") ^$c050 ^$c057 ^$c054