;; ;; Kitsune's Curse ;; Copyright (C) 2020-2023 Juan J. Martinez ;; ;; 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 . ;; ;; ;; 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