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