	.z80

;--------------------------------------------------
; COLD BOOT LOADER FOR DMA MICRO MAGNUM DISK DRIVE
;--------------------------------------------------

;---------------------
; MEMORY PORT ADDRESS
;---------------------

memry	equ	016h			; memory control port

;-------------------------
; HDC-1001 PORT ADDRESSES
;-------------------------

hbase	equ	0e0h			; base port address of hdc-1001
hdata	equ	hbase+0			; data register
herror	equ	hbase+1			; error register
hwrtpre	equ	hbase+1			; write pre-compensation register
hseccnt	equ	hbase+2			; sector count register
hsec	equ	hbase+3			; sector number register
hcyllow	equ	hbase+4			; cylinder low register
hcylhi	equ	hbase+5			; cylinder high register
hsdh	equ	hbase+6			; size - drive - head register
hstatus	equ	hbase+7			; status register 
hcmd	equ	hbase+7			; command register 

;-------------------
; HDC-1001 COMMANDS
;-------------------

cmdrst	equ	01fh			; restore command
cmdrd	equ	020h			; read sector command
cmdwrt	equ	030h			; write sector command		

;-----------------------------
; STATUS REGISTER BIT TESTERS
;-----------------------------

bsybit	equ	080h			; busy bit
rdybit	equ	040h			; data request bit
errbit	equ	001h			; error bit	

;---------------------------
; START OF COLD BOOT LOADER 
;---------------------------

start:	
	ld	a,06fh			; get command to memory port
	out	(memry),a		; turn off prom

	ld	bc,hdata		; get port number and transfer length
	ld	hl,080h			; starting address
	ld	de,020d			; number of 256 b sectors to transfer
loop:	
	ld	a,d			; send sector to controller
	out	(hsec),a
	ld	a,cmdrd			; send read command
	out	(hcmd),a
swait:	
	in	a,(hstatus)		; wait till done
	or	a
	jp	m,swait
	rra				; any errors
	jr	c,error

	inir				; get data

	inc	d			; increment sector to read
	dec	e			; decrement sector count
	jr	nz,loop			; if more go do it
	jp	0100h			; else go execute loader
error:	
	ld	a,04fh			; turn prom back on
	out	(memry),a
	jp	0f030h			; ret to monitor hard disk err return

	end
