Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,340 @@
title 'CCP/M disk entry'
include exerror.equ
include diskhdr.equ
include system.lib
;*****************************************************
;*
;* DISK I/O EQUATES
;*
;*****************************************************
;
max_retries equ 02 ;retries on disk i/o
;before perm error
eject ! include dskcomn.equ
FIRST_CALL_FLAG EQU 01H
eject
cgroup group code, data
cseg
public io_seldsk, io_read, io_write, io_flushbuf
public io_select
extrn sysdat:word
extrn supif:near, intdisp:near
extrn f_dsk_sel:near
extrn h_dsk_sel:near
extrn read:near, h_read:near, read_m_dsk:near
extrn write:near, h_write:near, write_M_dsk:near
dseg
public disk_modes, log_phy, phy_log
public idrive, itrack, isector, idmaoff, idmaseg
eject ! include sysdat.lib
cseg
;*****************************************************
;*
;* DISK IO CODE AREA
;*
;*****************************************************
;=========
io_seldsk: ; Function 9: Select Disk
;=========
; input: CL = disk to be selected
; DL = 00h if disk has not been previously selected
; = 01h if disk has been previously selected
; output: AX = 0 if illegal disk
; = offset of DPH relative from
; XIOS Data Segment
cseg
cmp cl,16
jb sel_ok ;check for valid drive
mov ax,0 ;return error if not
ret
sel_ok:
xor bx,bx
mov bl,cl
mov cl,con_tab[bx] ; allows easy modification of logical to
; physical representation of drives
io_select: ; RESKEW entry point
mov idrive,cl
xor bx, bx
mov bl,cl
shl bx, 1
call select_tbl[bx]
io_sd_exit:
ret
eject
;=======
io_read: ; Function 10: Read sector
;=======
; Reads the sector on the current disk, track and
; sector into the current dma buffer.
; input: parameters on stack
; output: AL = 000h if no error occured
; AL = 001h if an error occured
; = 0ffh if media density has changed
mov bp,sp
mov al,drive
cmp al,16! jb rdsk_ok ;check for valid drive
mov al,1 ;return error if not
mov ah,ATTA_FAILED
ret
rdsk_ok:
xor bx,bx
mov bl,drive
mov al,con_tab[bx]
mov drive,al
mov idrive,al ;save DPH index in local variable
;*** xor bx,bx ; stores drive mode (0=CCP/M other=PC_MODE)
;*** mov bl,al
;*** mov bl,disk_modes[bx]
;*** mov c_mode,bl
xor ah,ah ;Index into the physical driver
mov si,ax
shl si,1
jmp read_tbl[si] ;jump to physical driver read routine
eject
;========
io_write: ; Function 11: Write disk
;========
; Write the sector in the current Dma buffer
; to the current disk on the current
; track in the current sector.
; input: CL = 0 - Defered Writes
; 1 - non-defered writes
; 2 - def-wrt 1st sect unalloc blk
; output: AL = 000h if no error occured
; = 001h if error occured
; = 002h if read only disk
; = 0ffh if media density has changed
mov bp,sp ;set BP for indexing into IOPB
mov al,drive
cmp al,16! jb wdsk_ok ;check if valid drive
mov al,1 ;return error if not
mov ah,ATTA_FAILED
ret
wdsk_ok:
xor bx,bx
mov bl,drive
mov al,con_tab[bx]
mov drive,al
mov idrive,al ;save DPH index in local variable
;*** xor bx,bx ; stores drive mode (0=CCP/M other=PC_MODE)
;*** mov bl,al
;*** mov bl,disk_modes[bx]
;*** mov c_mode,bl
xor ah,ah ;Index into the physical driver
mov si,ax
shl si,1
jmp write_tbl[si] ;jump to physical driver write routine
;===========
io_flushbuf: ; Function 12: Flush Buffer
;===========
; input: None
; output: AL = 00h if no error occurs
; = 01h if error occurs
; = 02h if read/only disk
xor al,al ;no need to flush buffer with
ret ; no blocking/deblocking in XIOS
ret_error:
;--------
mov al, 01
mov ah,ATTA_FAILED
ret
eject
dseg
read_error_type db 0
write_error_type db 0
;*****************************************************
;*
;* IOPB for disk I/O
;*
;*****************************************************
; iopb dd loczero ;pointer for 8089
opcode db 0 ;operation code
idrive db 0 ;disk drive id
itrack dw 0 ;track for I/O
head db 0 ;head for I/O
isector db 0 ;sector for I/O
count db 0 ;number of sectors for I/O
retcode db 0 ;return code from operation
retmask db 0 ;return code mask
retries db 0 ;number of error retries
idmaoff dw 0 ;DMA offset address
idmaseg dw 0 ;DMA segment address
seclen dw 0 ;sector length
dw 0,0,0 ;work area
eject
;
; Disk Parameter block header table
; Currently set up for
; A hard disk
; B hard disk
; C hard disk
; D floppy
; E floppy
; M Memory disk
select_tbl:
dw offset h_dsk_sel ; first hard disk
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset f_dsk_sel ; first floppy
dw offset f_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
dw offset h_dsk_sel
read_tbl dw offset h_read
dw offset h_read
dw offset h_read
dw offset read
dw offset read
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset read_m_dsk
dw offset ret_error
dw offset ret_error
dw offset ret_error
write_tbl dw offset h_write
dw offset h_write
dw offset h_write
dw offset write
dw offset write
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset ret_error
dw offset write_m_dsk
dw offset ret_error
dw offset ret_error
dw offset ret_error
; used to allow easy modification of logical to physical drives
con_tab db 0
db 1
db 2
db 3
db 4
db 5
db 6
db 7
db 8
db 9
db 10
db 11
db 12
db 13
db 14
db 15
; used to store operating modes for disk drivers
; if 0 then CP/M else DOS
disk_modes db 0,0,0,0
db 0,0,0,0
db 0,0,0,0
db 0,0,0,0
; Floppy code uses to get correct physical floppy
log_phy db 255 ; A
db 255 ; B
db 255 ; C
db 0 ; D physical floppy 0
db 1 ; E physical floppy 1
db 255
db 255
db 255
db 255
db 255
db 255
db 255
db 255 ; M
db 255
db 255
db 255
; For Floppy routines to determine what logical drive is currently
; using the physical drive.
phy_log db 0
db 0
end