diff --git a/NeutTower.dsk b/NeutTower.dsk index 4798263..fee1824 100644 Binary files a/NeutTower.dsk and b/NeutTower.dsk differ diff --git a/asm/asm.fnl b/asm/asm.fnl index f25b3c9..0eb2f6f 100644 --- a/asm/asm.fnl +++ b/asm/asm.fnl @@ -126,7 +126,7 @@ (not= (type dat) :table) (error (.. "Invalid operation " dat)) - + (let [opcode (. dat 1) parser (. dat-parser opcode) pdat @@ -227,7 +227,7 @@ (fn pdat-processor.pad.bytes [pad] (string.rep "\0" pad.size)) (fn pdat-processor.block.symbols [block] - (lume.keys block.symbols)) + (lume.concat (lume.keys block.symbols) (lume.keys block.globals))) (fn pdat-processor.block.patch [block env] (local block-env (make-env block env)) diff --git a/game/defs.fnl b/game/defs.fnl index 5b0e8e5..4264781 100644 --- a/game/defs.fnl +++ b/game/defs.fnl @@ -4,9 +4,17 @@ (local asm (require :asm.asm)) (local VM (require :asm.vm)) (local tiles (require :game.tiles)) +(local Prodos (require :asm.prodos)) (local prg (asm.new)) -(local vm (VM.new prg)) +(local vm (VM.new prg {:org 0xc00})) +(Prodos.install-words vm) + +(local org { + :boot vm.code + :code (prg:org 0x4000) +}) + (local mapw 20) (local maph 12) @@ -16,10 +24,6 @@ :bell :0xff3a }) -(local org { -; :level (prg:org 0x5100) - :code vm.code -}) (local controlstate { :jaye 0 @@ -47,6 +51,27 @@ (for [_ 1 n] (table.insert block [:block [:asl :a] [:adc 0]])) block) +; core graphics words needed for booting +(vm:def :hires + [:sta :0xc050] + [:sta :0xc057] + [:sta :0xc052] + [:sta :0xc054]) + +(vm:def :cleargfx + (vm:push 0x4000) + [:block :page + [:dec vm.TOPH :x] + [:lda 0] + [:block :start + [:sta [vm.TOP :x]] + [:inc vm.TOP :x] + [:bne :start]] + [:lda vm.TOPH :x] + [:cmp 0x20] + [:bne :page]] + (vm:drop)) + ; a handful of debugging words (vm:def :. [:lda vm.TOPH :x] @@ -141,5 +166,7 @@ (let [tilelist (tiles.loadgfx tiles.fn-tiles)] (fn [label] (tiles.find-itile tilelist label)))) +(set vm.code org.code) + {: vm : prg : mapw : maph : mon : org : achar : astr : style : rot8l : deflevel : say : say-runon : itile : controlstate} diff --git a/game/disk.fnl b/game/disk.fnl index 4f9a027..de61ad5 100644 --- a/game/disk.fnl +++ b/game/disk.fnl @@ -3,8 +3,34 @@ (local Prodos (require :asm.prodos)) (local util (require :lib.util)) (local {: lo : hi} util) +(local {: org} (require :game.defs)) -(fn org-loader [org] +(fn append-boot-loader [prg] + (local vm prg.vm) + (set vm.code org.boot) + (set prg.files []) + + (vm:word :loadfile ; length addr filename -- + 0xbb00 :open :read :drop :close) + (vm:word :loadscreen :cleargfx 0x2000 0x2000 :