M4reconf

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search

m4reconf.zip

Here is a native CPC program to use other people's (or sd cards) M4 rom configuration:

Unpack the m4reconf.bin to the /M4 directory of the microSD. Copy whatever romslots.bin and romconfig.bin you want to use to the /M4 directory aswell. Run"m4reconf.bin" Power cycle CPC and done.

Source code

        ; M4 rom re-config
        ; To assemble use RASM assembler
        ; Duke - 2018
        
        org    0x4000
        nolist

km_wait_key        equ 0xBB18
txt_output        equ 0xBB5A
txt_set_column    equ 0xBB6F
scr_reset        equ    0xBC0E
scr_set_ink        equ    0xBC32
scr_set_border    equ    0xBC38
cas_in_open        equ 0xBC77
cas_in_close    equ 0xBC7A
cas_in_char        equ 0xBC80
cas_out_open    equ 0xBC8C
cas_out_close    equ 0xBC8F
cas_out_char    equ 0xBC95
kl_init_back    equ 0xBCCE

        ; re-init M4rom
    
        ld de,0x40 
        ld hl,0xB0FF
        call 0xBCCB
        
        ; setup screen
        
        ld a,2            
        call scr_reset        ; set mode 2
        xor a
        ld b,a
        call scr_set_border
        xor a
        ld b,a
        ld c,b
        call scr_set_ink
        ld a,1
        ld b,26
        ld c,b
        call scr_set_ink

        ld    a,20
        call txt_set_column
        ld    hl,txt_title
        call wrt
        
        ; read romconfig.bin
        
        ld    hl,filename
        ld    de,buf
        ld    b,13        ; "romconfig.bin"
        call cas_in_open
        jp    nc,file_err
        ld    hl, buf2
        ld    bc,1088        ; file len
fread_loop:
        call cas_in_char
        ld    (hl),a
        inc    hl
        dec    bc
        xor    a
        cp    c
        jr    nz, fread_loop
        cp    b
        jr    nz, fread_loop
        
        call cas_in_close
        
        ; display 'active' roms and set the flag so they are re-flashed on power cycle
        
        ld    ix,buf2
        ld    b,(ix)        ; number of roms (either 16 or 32)
        ld    de,32
        add    ix,de        ; skip header
        inc    de
rom_loop:
        ld    a,(ix)
        cp    1
        jr    nz, rom_not_used
        push de
        push ix
        pop    hl
        push bc
        inc hl            ; point to rom name
        ld de,text_buf
        ld bc,32
        ldir
        pop bc
        pop de
        ld hl,text_buf
        call wrt
        ld hl,txt_reen
        call wrt
        ld (ix),2        ; set rom to NEW
rom_not_used:
        add    ix,de        ; +33
        djnz rom_loop
        
        ; save the modified romconfig.bin
        
        ld hl,filename
        ld de,buf
        ld b,13        ; "romconfig.bin"
        call cas_out_open
        ld hl,buf2
        ld bc,1088        ; file len
fwrite_loop:
        ld    a,(hl)
        call cas_out_char
        inc hl
        dec bc
        xor a
        cp c
        jr nz, fwrite_loop
        cp b
        jr nz, fwrite_loop
        
        call cas_out_close
done:
        ; display done
        
        ld hl,txt_done
        call wrt
        jp    km_wait_key
file_err:
        ld    hl,txt_file_err
        call wrt
        jp    km_wait_key
wrt:
        ld    a,(hl)
        or    a
        ret    z
        call txt_output
        inc    hl
        jr    wrt
        
filename:
        db "romconfig.bin"
txt_title:
        db "M4 rom reconfig - Duke 2018",10,13,10,13,0
txt_file_err:
        db "Error M4 romconfig.bin not found!",10,13,0
txt_reen:
        db " re-enabled.",10,13,0
txt_done:
        db 10,13,10,13,"Done! Power-cycle CPC",0

text_buf:
        ds 33,0
        
buf:    ds 2048,0
buf2:    ds 1088,0