mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
192 lines
4.0 KiB
Plaintext
192 lines
4.0 KiB
Plaintext
;**************************************************************************
|
|
;* CP/M 3 BIOS for Z80em86 Z80 CPU emulator *
|
|
;* *
|
|
;* CP/M 3 Loader BIOS *
|
|
;* *
|
|
;* Copyright (C) 1992-2009 Stewart Kay *
|
|
;**************************************************************************
|
|
;
|
|
; ChangeLog (most recent entries are at top)
|
|
; ------------------------------------------
|
|
; v1.0.0 - 16 February 2009, S.J.Kay
|
|
; - Prepare for public release.
|
|
;
|
|
; v1.00 - 17 April 1995, S.J.Kay
|
|
; - Undocumented changes.
|
|
;
|
|
; v0.00 - 1992, S.J.Kay
|
|
; - Initial creation date.
|
|
|
|
.z80
|
|
;
|
|
maclib TPORTS.LIB
|
|
;
|
|
public dph, dpb, xlt
|
|
;
|
|
extrn rdrv
|
|
;
|
|
jp boot ;initial entry on cold start
|
|
jp null ;not required
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp crtop ;send console output character
|
|
jp null ;not required
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp home ;set disks to logical home
|
|
jp seldsk ;select drive, return disk parameter info
|
|
jp settrk ;set disk track
|
|
jp setsec ;set disk sector
|
|
jp setdma ;set disk I/O memory address
|
|
jp read ;read physical block(s)
|
|
jp null ;not required
|
|
jp null ; " "
|
|
jp sectrn ;translate logical to physical sector
|
|
jp crtost ;return console output status
|
|
jp null ;not required
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp move ;block move memory to memory
|
|
jp null ;not required
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
jp null ; " "
|
|
;
|
|
; null code
|
|
null: ld a,1ah ;end of file character
|
|
ret
|
|
;
|
|
; boot code
|
|
boot: out (crt1in),a ;initialize CRT driver
|
|
out (gtboot),a ;what drive did boot come from
|
|
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
|
|
ret
|
|
;
|
|
; block move
|
|
move: ex de,hl
|
|
ldir
|
|
ex de,hl
|
|
ret
|
|
;
|
|
; home disk
|
|
home: ld c,0 ;fall through to set track
|
|
;
|
|
; set track
|
|
settrk: ld a,c
|
|
ld (track),a
|
|
ret
|
|
;
|
|
; set sector
|
|
setsec: ld a,c
|
|
ld (sector),a
|
|
ret
|
|
;
|
|
; set DMA address
|
|
setdma: ld (dma),bc
|
|
ret
|
|
;
|
|
; select disk
|
|
seldsk: ld hl,dph ;DPH address
|
|
ret
|
|
;
|
|
; sector translate
|
|
sectrn: ld hl,xlt ;translate table address
|
|
add hl,bc ;add logical sector
|
|
ld l,(hl) ;get physical sector
|
|
ld h,0
|
|
ret
|
|
;
|
|
; read sector from boot disk
|
|
read: ld a,(rdrv)
|
|
ld h,a
|
|
ld d,0 ;side #0
|
|
ld a,(track)
|
|
sla h
|
|
jp c,side0 ;single sided disk if carry
|
|
sla h
|
|
jp c,dsdisk ;double sided disk if carry
|
|
cp 40
|
|
jp c,side0 ;side 0 of up-down if carry
|
|
ld b,a ;side 1 of up-down
|
|
ld a,79
|
|
sub b
|
|
jp side1
|
|
dsdisk: srl a
|
|
jp nc,side0
|
|
side1: ld d,1 ;side #1
|
|
side0: ld b,a ;track number
|
|
ld a,(sector)
|
|
ld c,a ;sector number
|
|
ld hl,(dma)
|
|
out (gtboot),a ;what drive did boot come from
|
|
ld e,a ;drive information
|
|
ld a,2 ;sector size code for floppy driver (2=512)
|
|
flphdd: out (0ffh),a ;read 1 sector
|
|
or a
|
|
ret z
|
|
ld a,1
|
|
ret
|
|
;
|
|
crtost: out (crt1st),a ;CRT output status
|
|
ret
|
|
;
|
|
crtop: out (crt1op),a ;CRT output
|
|
ret
|
|
;
|
|
track: db 0
|
|
sector: db 0
|
|
dma: dw 0
|
|
;
|
|
; Disk Parameter Header
|
|
db 0 ;UNIT
|
|
db 0 ;TYPE
|
|
dph: dw xlt ;XLT
|
|
db 0,0,0 ;-0- (BDOS scratch use)
|
|
db 0,0,0 ;-0-
|
|
db 0,0,0 ;-0-
|
|
db 0 ;Media flag
|
|
dw dpb ;DPB
|
|
dw csv ;CSV
|
|
dw alv ;ALV
|
|
dw dirbcb ;DIRBCB
|
|
dw dtabcb ;DTABCB
|
|
dw 0ffffh ;HASH (n/a)
|
|
db 0 ;HBANK (n/a)
|
|
;
|
|
; Disk Parametr Block table
|
|
dpb: ds 17 ;filled in by PUTLDR.COM utility
|
|
;
|
|
; disk skew table
|
|
xlt: ds 128 ;filled in by PUTLDR.COM utility
|
|
;
|
|
; checksum table
|
|
csv: ds 512 ;2048 directory entries maximum
|
|
;
|
|
; allocation table
|
|
alv: ds 512 ;512 * 8 blocks, space = 512 * 8 * BLS
|
|
;
|
|
; directory buffer control block
|
|
dirbcb: db 0ffh,0,0,0,0,0,0,0,0,0
|
|
dw buff0
|
|
;
|
|
; data buffer control block
|
|
dtabcb: db 0ffh,0,0,0,0,0,0,0,0,0
|
|
dw buff1
|
|
;
|
|
; directory and data buffers
|
|
buff0 equ $ ;1k directory buffer
|
|
buff1 equ buff0+1024 ;1k data buffer
|
|
;
|
|
end
|