diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-11-05 11:22:55 +0000 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-11-05 11:31:28 +0000 |
commit | 2fbdf974338bde8576efdae40a819a76b2391033 (patch) | |
tree | 64d41a37470143f142344f9a439d96de3e7918c2 /src/loader.s | |
download | kitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.tar.gz kitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.zip |
Initial import of the open source release
Diffstat (limited to 'src/loader.s')
-rw-r--r-- | src/loader.s | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/src/loader.s b/src/loader.s new file mode 100644 index 0000000..a41d3ba --- /dev/null +++ b/src/loader.s @@ -0,0 +1,252 @@ +;; +;; Kitsune's Curse +;; Copyright (C) 2020-2023 Juan J. Martinez <jjm@usebox.net> +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. +;; +;; +;; TAPE LOADER +;; + +.include "cpcfirm.inc" +.include "../build/loader.opt" + +loader: + +.ifeq DISK + ; loading from disk + + ld hl, (#0xbe7d) ; save current drive + ld a, (hl) + ld (#drive+1), a +.endif ; end disk code + + ld c, #0xff + ld hl, #start + call mc_start_program + +start: + call kl_rom_walk + +.ifeq DISK +drive: + ld a, #0 ; restore drive + ld hl, (#0xbe7d) + ld (hl), a +.endif ; end disk code + + ld bc, #0 ; set border + call scr_set_border + + ld bc, #0 ; bg color + xor a + call scr_set_ink + + xor a ; set mode 0 + call scr_set_mode + + ld a, #0xff + call cas_noisy ; disable tape texts + +.ifeq DISK + ; first file is the SCRX + call load_file + +.else ; tape code + + ld ix, #TMP_ADDR + ld de, #SCRX_SIZE + call turboload + +.endif ; end tape code + + ; setup the palette + ld hl, #TMP_ADDR + #4 + call set_palette + + ; border is already 0 + + ld hl, #TMP_ADDR + #0x14 ; compressed data + ld de, #0xc000 ; uncompress into the screen + call aplib_depack + + ; loader size limited to 1024 bytes! +LOADER_END = LOADER_ADDR + 1024 + +.ifeq DISK + + ld hl, #fname_end - #1 + inc (hl) + ; load the code + call load_file + +.else ; tape code + + ; change stripes + ld a, #20 + ld (#turbo_col + 1), a + + ; load the compressed app + ld ix, #LOADER_END + ld de, #APP_SIZE_PAK + call turboload + +.endif ; tape code ends + + di + ; disable the firmware + im 1 + ld hl, #0x38 + ld (hl), #0xfb + inc hl + ld (hl), #0xc9 + + ; put the stack as high as we can + ld sp, #0xc000 + ei + + ; disable upper/lower roms + ld bc, #0x7f8c + out (c), c + + ; relocate the compressed data + ld bc, #APP_SIZE_PAK + ld hl, #LOADER_END + #APP_SIZE_PAK + ld de, #LOADER_END + #APP_SIZE + #PAK_SLOP +data_relocation_loop: + ld a, (hl) + ld (de), a + dec hl + dec de + ld a, b + or c + dec bc + jr nz, data_relocation_loop + + ; uncompress after the loader + ld hl, #LOADER_END + #APP_SIZE - (#APP_SIZE_PAK - #PAK_SLOP) + ld de, #LOADER_END + call aplib_depack + + ; relocate app to its final address + ld bc, #APP_SIZE + ld hl, #LOADER_END + #APP_SIZE + ld de, #APP_ADDR + #APP_SIZE +relocation_loop: + ld a, (hl) + ld (de), a + dec hl + dec de + ld a, b + or c + dec bc + jr nz, relocation_loop + + ; jp to the app entry point + .db #0xc3 + .dw #APP_EP + +set_palette: + push hl + call wait_vsync + + halt + halt + + call wait_vsync + pop hl + + xor a +set_palette_loop: + push hl + push af + ld c, (hl) + ld b, c + call scr_set_ink + pop af + pop hl + inc hl + inc a + cp #0x10 + jr nz, set_palette_loop + + halt + halt + halt + halt + halt + halt + ret + +wait_vsync: + ld b, #0xf5 + keep_waiting: + in a, (c) + rra + jr nc, keep_waiting + ret + +.ifeq DISK + +load_file: + ld hl, #fname + ld b, #fname_end-#fname + + ld de, #0x400 ; temp mem (only used in tape mode) + call cas_in_open + + push de + pop hl + call cas_in_direct + + call cas_in_close + ret + +fname: + .str "MAIN.BI0" +fname_end: + +.else ; tape code + +turboload: + di + ex af, af' + push af + ex af, af' + exx + push de + push bc + push hl + exx + xor a + ld r, a + dec a + call _turboload + jp nc, 0 + exx + pop hl + pop bc + pop de + exx + ex af, af' + pop af + ex af, af' + ei + ret + +.include "turboload.s" +.endif ; end tape code + +.area _DATA + |