;; Here is some code to initialise the firmware and load a file ;; it is very useful to use this in a multiload game to load the ;; levels (after you have cracked it and saved them out). ;; ;; I do not authorise cracking software and piracy. ;; ;; NOTE: ;; ;; 1. Routine cannot be in &0000-&3fff (lower rom initialised into this ;; area) ;; 2. You cannot load a file into a area used by firmware (0000-&0040) ;; or &a600-&c000. If the program requires this, then load it to ;; somewhere else and LDIR/LDDR it to it's place. ;; 3. This code will initialise the firmware for it's loading, so you ;; must copy the data areas used by the firmware, load the file, ;; and copy them back, (or the game will crash). ;; Use the screen memory or the 2nd bank of 64k. ;; 4. Put this code where the loader for the levels is in the original game ;; 5. Dont forget to modify this code appropiatly. This is just an example. .routine_address equ &a600 org routine_address nolist write"loader" let mode=0 ;screen mode .load_address equ &0040 ;address to put file .km_initialise equ &bb00 .txt_output equ &bb5a .cas_in_open equ &bc77 .cas_in_direct equ &bc83 .cas_in_close equ &bc7a .cas_in_abandon equ &bc7d .kl_init_back equ &bcce .kl_l_rom_disable equ &b909 ;; ** STORE DATA USED BY PROGRAM THAT WILL BE CORRUPTED BY INITIALISATION OF ** ;; ** FIRMWARE ** di ld (stack+1),sp ;save stack used by program ld sp,&c000 ;new stack used by firmware and load routines ;; ** SAVE DATA OVERWRITTEN BY FIRMWARE ** ;; !!EXAMPLE!! ld hl,&a800 ld de,&c000 ;upper firmware area (&a800?-&c000) ld a,4 .next push af push de ld bc,&600 ldir pop de ld a,d add a,8 ld d,a pop af dec a jr nz,next ld h,&00 ;firmware lower jumpblock (&0000-&0040) ld l,0 ld c,&40 ldir ;; ** INITIALISE ALTERNATE REGISTER SET FOR FIRMWARE ** exx ld bc,&7f00+%10001000+mode ;initialise lower rom and select mode out (c),c ;this routine must be located above &4000 exx ex af,af' xor a ex af,af' ;; ** INITIALISE FIRMWARE ** call &0044 ;initialise lower jumpblock (&0000-&0040) ;and high kernal jumpblock (&b800-&bae4) call &08bd ;initialise firmware jumpblock entries ;(&bb00- ...) call km_initialise ;initialise keyboard manager call kl_l_rom_disable ;disable lower rom ;; ** INITIALISE DISK ROM FOR LOADING/SAVING ** ld c,7 ;disk rom ld de,&0040 ;lowest useable byte of memory ld hl,&b0ff ;highest useable byte of memory call kl_init_back ;initialise disk rom xor a ;select drive (A) ld (&ac00),a ld a,&ff ld (&be78),a ;turn of disc error messages ld a,&c9 ld (txt_output),a ;prevent printing of text characters ;don't get error messages corrupting screen ;; ** LOAD FILE USING FIRMWARE ** ld b,end_filename-filename ;length of filename ld hl,filename ;address of filename in memory ld de,load_address ;address to put file/2k buffer to use (unused since ;read direct used push de call cas_in_open ;open file pop hl ;HL = load address, BC = length of file call cas_in_direct ;read it call cas_in_close ;close it ;; ** RESTORE DATA WHICH WOULD HAVE BEEN OVERWRITTEN BY FIRMWARE ** ;; !!EXAMPLE!! di ld hl,&c000 ;copy back data ld de,&a800 ld a,4 .next2 push af push hl ld bc,&0600 ldir pop hl ld a,h add a,8 ld h,a pop af dec a jr nz,next2 ld d,&00 ;copy back &0000-&0040 ld e,0 ld c,&40 ldir .stack ld sp,0 ;old stack back and... ret ;...exit to program!! .filename defb "loadfile.dat"