Files
Digital-Research-Source-Code/CONTRIBUTIONS/z80em86/bios/cpmboot.mac
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

114 lines
3.0 KiB
Plaintext

;**************************************************************************
;* CP/M 3 BIOS for Z80em86 Z80 CPU emulator *
;* *
;* CP/M 3 Cold Boot Loader *
;* *
;* Copyright (C) 1992-2009 Stewart Kay *
;**************************************************************************
;
; works for banked and non banked systems
;
; ChangeLog (most recent entries are at top)
; ------------------------------------------
; v1.0.0 - 16 February 2009, S.J.Kay
; - Prepare for public release.
;
; v1.00 - 26 April 1995, S.J.Kay
; - Undocumented changes.
;
; v0.00 - 1992, S.J.Kay
; - Initial creation date.
.z80
;
maclib TPORTS.LIB
;
public rdrv
;
extrn dph, dpb, xlt
;
ver equ 1 ;loader version number
;
; Z80 Emulator starts executing here after loading 1st sector
boot: jp start ;1st byte must be C3 hex
;
; information extracted by PUTLDR.COM utility (do not rearrange order)
dw 0aa55h ;checked by install utility
db ver ;loader version number
dw boot ;execute address used to calculate offsets
dw dph ;disk parameter header
dw dpb ;disk parameter block
dw xlt ;sector translate table
;
; information placed here by PUTLDR.COM utility (do not rearrange order)
seclen: dw 0 ;sector length
sectrk: db 0 ;sectors per track
rdrv: db 0 ;sides, type, density, drive select
tracks: db 0 ;reserved tracks to load
banked: db 0 ;0 = non banked, >0 = banked system
;
; load the remainder of the CPMLDR.SYS code
start: out (gtboot),a ;what drive did boot come from
ld e,a
cp 2 ;floppy A: or B: drive ?
ld a,rdhard
jp nc,settyp
ld a,rdflop
settyp: ld (flphdd+1),a ;set floppy or HDD read port
ld bc,0002h ;track #0, sector #2 (1st sector loaded)
ld d,0 ;side #0
ld hl,boot
load: push bc
ld bc,(seclen) ;sector length
add hl,bc ;next DMA address
pop bc
ld a,2 ;sector size code for floppy driver (2=512)
flphdd: out (0ffh),a ;read 1 sector
or a
jp z,nxtsec
out (failed),a ;boot strap failure
nxtsec: inc c ;next sector
ld a,(sectrk)
cp c
jp nc,load
ld a,(tracks)
dec a
ld (tracks),a
jp z,setsys
ld c,1 ;sector #1
inc d ;change side select
ld a,d
and 00000001b ;keep the odd/even bit
ld d,a
jp nz,load
inc b ;next track #
jp load
setsys: ld hl,0 ;access user byte #0
ld c,0 ;get user byte function
out (usrbyt),a ;get user byte
ld hl,stdnme
cp 1 ;non banked CP/M 3 system ?
jp z,setnme
cp 2 ;banked CP/M 3 system ?
jp z,bnksys
ld a,(banked) ;default banked or non banked flag
or a ;banked CP/M 3 system ?
jp z,setnme
bnksys: ld bc,0f000h ;size of bank #0, bank #1
out (bnkuse),a ;initialize for a banked system
ld hl,bnknme
setnme: ld bc,11 ;bytes to be moved
ld de,loader+172 ;replace CPM3.SYS with new name
ldir
jp loader
bnknme: db 'BNKCPM SYS'
stdnme: db 'STDCPM SYS'
;
ds 128 ;CPMLDR.SYS uses this area
;
loader equ $
;
end