;; "INSTALL.S" ;; ;; Assemble this code with Maxam, or compatible assembler. ;; ;; ** INSTALL ROUTINE TO PUT YOUR CODE INTO THE MULTIFACE RAM ** ;; ;; - example code to show how the multiface ram can be used for your ;; own programs ;; ;; - this code is not optimized. ;; ;; Code released under the Gnu Public License v1 ;; ;; Code by Kevin Thacker .km_wait_char equ &bb06 .txt_output equ &bb5a .cas_in_open equ &bc77 .cas_in_direct equ &bc83 .cas_in_close equ &bc7a org &4000 ;install code can be located any where except ;&0000-&4000, because this memory range is ;used by the multiface. So if this memory address ;was used when the multiface ;is enabled your program will not be there ;to execute and the CPU would execute the multiface ;ROM code. nolist ;; ** LOAD YOUR CODE (TO BE PUT INTO MULTIFACE RAM) INTO BUFFER ** ld b,end_filename-filename ld hl,filename ld de,two_k_buffer call cas_in_open ;...open file ld (start_address),de ld hl,buffer ;address to store code in installer call cas_in_direct ;...load data ld (length),bc ;length of code call cas_in_close ;...close file ;; ** DETECT IF MULTIFACE IS VISIBLE ** ;; - this works by poking a value into the ram area which is also ;; used by the multiface ram. ;; - if the multiface is visible, and the RAM is enabled, and we poke ;; a value in, this will not effect the original value we poked. ;; - if the multiface is invisible, even if the RAM is enabled, the original ;; value we poked will now be different. xor a ld (&3000),a ;memory address which is in the range used by ;the multiface RAM ld bc,&FEE8 ;enable ram out (c),c dec a ld (&3000),a ;store a different value ld bc,&FEEA out (c),c ;disable ram ld a,(&3000) ;check value in normal ram or a ;if it is not zero, then the multiface is not ;"visible" jp nz,multiface_not_visible ;; ** INSTALL MY CODE ** ld hl,install_text call print ;; ** switch in multiface RAM/ROM ** di ld bc,&FEE8 out (c),c ;initialise multiface RAM ;; ** INITIALISE MULTIFACE PARAMETERS NEEDED FOR MY CODE TO BE EXECUTED ** ld hl,(start_address) ;address of my code within the multiface ram. ld (&2000),hl ld a,%10001101 ;rom configuration and mode I would like when code ld (&2002),a ;is executed. ld a,&11000000 ;ram configuration I would like when my code is ld (&2003),a ;executed ld a,"R" ;the magic "RUN". Without this the code is NOT ld (&2005),a ;executed ld a,"U" ld (&2006),a ld a,"N" ld (&2007),a ;; ** COPY MY CODE INTO THE MULTIFACE RAM ** ld hl,buffer ld de,(start_address) ld bc,(length) ldir ;copy our code into the multiface ram ;; ** switch out multiface ROM/RAM ** ld bc,&FEEA ;disable RAM out (c),c rst 0 ;and reset .multiface_not_visible ld hl,not_visible_text call print call km_wait_char rst 0 ;reset .print ld a,(hl) or a ret z inc hl call txt_output jr print .install_text defb "Multiface present, installing code..",0 .not_visible_text defb "Multiface not found. If it is connected, please make sure it is visible",0 .buffer defs 8192 ;buffer to store my code to be put into multiface ;ram .start_address ;start address is also the address within the defw 0 ;multiface ram to load my_code. .length defw 0 .filename defb "MYCODE.BIN" ;filename for my code! .end_filename .two_k_buffer defs 2048 ;; The example code that is loaded is: ;; "MYCODE.BIN" ;; ;; A simple piece of code to be installed into the Multiface RAM. ;;org &3B12 ;;write "mycode.bin" ;;nolist ;;di ;;ld bc,&7f10 ;;select border ;;out (c),c ;;.loop ;;and 31 ;;colour ;;or %01000000 ;;out (c),a ;;output colour ;;inc a ;;jp loop