;; 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