Programming:Reading and writing the boot sector of a SYSTEM/VENDOR disc

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
;; This example will install a RSX command which can be used
;; to get and put a boot sector to a SYSTEM/VENDOR disc.
;;
;; The boot sector can be executed with a |CPM command.
;;

.kl_find_command	equ	&bcd4
.kl_log_ext			equ	&bcd1	

;; call &8000 to install RSX commands:
;;
;; |BOOTGET,<drive>,<addr>
;; get track 0, sector &41 on drive <drive> and write it to <addr>
;;
;; |BOOTPUT,<drive>,<addr>
;; put track 0, sector &41 on drive <drive> and read from <addr>

;;------------------------------------------------------------
;; install rsx commands

org &8000

.start	
		ld hl,work_space
		ld bc,rsx_table
		jp	kl_log_ext

;;------------------------------------------------------------

.work_space
		defs 4

;;------------------------------------------------------------

.rsx_table
		defw	name_table
		jp		get_boot_sector			;; get boot sector
		jp		put_boot_sector			;; put boot sector

;;------------------------------------------------------------

.name_table
		defb	"BOOTGE","T"+&80		// get boot sector
		defb	"BOOTPU","T"+&80		// put boot sector
		defb	0

;;------------------------------------------------------------
		
.get_boot_sector
		cp 2
		ret nz
.ok
		call	initialise
		ret nc
	
		ld l,(ix+0)						;; address to put boot sector data to
		ld h,(ix+1)

		ld e,(ix+2)						;; drive 
		
		ld d,0							;; track
		ld c,&41						;; sector
		rst 3
		defw read_sector_jmp
		ret

.put_boot_sector
		cp 2
		ret nz
		
		call initialise
		ret nc

		ld l,(ix+0)						;; address to get boot sector data from
		ld h,(ix+1)
		
		ld e,(ix+2)						;; drive

		ld d,0
		ld c,&41
		rst 3
		defw write_sector_jmp

		ret

;;--------------------------------------------------------------
;; find commands
		
.initialise
		ld hl,read_sector_cmd
		call kl_find_command		
		ret nc
		ld (read_sector_jmp),hl
		ld a,b
		ld (read_sector_jmp+2),a

		ld hl,write_sector_cmd
		call kl_find_command
		ret nc
		ld (write_sector_jmp),hl
		ld a,b
		ld (write_sector_jmp+2),a
		ret
						
;;--------------------------------------------------------------
		
.read_sector_cmd
		defb 4+&80				;; BIOS: READ SECTOR
.write_sector_cmd
		defb 5+&80				;; BIOS: WRITE SECTOR

.read_sector_jmp
		defw	0				;; address
		defb 	0				;; rom select

.write_sector_jmp
		defw	0				;; address
		defb	0				;; rom select