;; This example shows how to dump the upper ROM ;; of an Amstrad CPC, CPC+ or KC Compact. ;; ;; When active, the selected "upper"/expansion ROM is readable in the ;; range &c000-&ffff. ;; ;; An expansion ROM is: ;; - The upper 16K of the internal 32K ROM containing Locomotive BASIC ;; - The internal AMSDOS ROM in a CPC664 or CPC6128 ;; - A ROM in a interface or rom-board which is connected to the computer. ;; (e.g. DDI-1 disc interface) ;; firmware function to activate the upper rom .kl_rom_select equ &b90f ;; firmware function to restore the rom state .kl_rom_restore equ &b90c ;;---------------------------------------------------------- ;; When activated, the upper rom will be readable from &c000-&ffff. ;; The program will not function if it is in this range. org &4000 ;;----------------------------------------- ;; select the upper rom and enable it ld c,0 ;; index of ROM call kl_rom_select ;; store the previous state ld a,b ld (rom_previous_state),a ;; store the index of the previously selected ROM ld a,c ld (urom_index),a ;;----------------------------------------- ;; copy rom data to store ld hl,&c000 ;; source ld de,rom_data ;; dest ld bc,&4000 ;; length ldir ;;----------------------------------------- ;; restore the previously selected ROM ;; (this will also enable it) ld a,(urom_index) ld c,a call kl_rom_select ;;----------------------------------------- ;; restore the previous rom state ld a,(rom_previous_state) call kl_rom_restore ret ;;----------------------------------------- ;; stores the previous state of the rom configuration .rom_previous_state defb 0 ;; stores the index of the previously selected upper rom .urom_index defb 0 ;; a buffer to store the 16k of rom data .rom_data equ $+1