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