/* * Low level disk I/O functions for MDCFS: * * disk_error(code) - Called if unrecoverable disk error * code - Disk failure code (system depandant) * * read_sector(d, s, b) - Read a sector from the disk * d - Drive to read (0=A, 1=B ...) * s - Sector number to read (1-n) * b - Pointer to buffer to receive data * * write_sector(d, s, b) - Write a sector to the disk * d - Drive to write (0=A, 1=B ...) * s - Sector number to write (1-n) * b - Pointer to buffer containing the data * * These functions make use of the IBM PC BIOS, and are compatible * with Dunfield Development Systems ASM86 assembler. Use these if * you are compiling MDCFS for stand-along (NON-DOS) applications * with our DDS MICRO-C 8086 Developers Kit. */ /* * Report a disk error */ disk_error(code) int code; { printf("Disk error - Code: %04x\n", code); exit(-1); } /* * Read a sector from the disk drive */ read_sector(drive, sector, buffer) asm { PUSH DS Save DS POP ES Set ES MOV BX,4[BP] Get buffer MOV AX,6[BP] Get sector XOR DX,DX Zero high DIV >sectrk Calculate track MOV CL,DL CL = sector INC CL 1- XOR DX,DX Zero high DIV >numhead Compute head MOV CH,AL CH = cylinder MOV DH,DL DH = head MOV DL,8[BP] DL = drive MOV DI,3 Try three times read1 MOV AX,$0201 Read 1 sector INT $13 Call BIOS JNC read2 Success DEC DI Reduce count JNZ read1 Keep trying PUSH AX Pass parameter CALL disk_error Report an error POP AX Clean stack read2 XOR AX,AX Zero return } /* * Write a sector to the disk drive */ write_sector(drive, sector, buffer) asm { PUSH DS Save DS POP ES Set ES MOV BX,4[BP] Get buffer MOV AX,6[BP] Get sector XOR DX,DX Zero high DIV >sectrk Calculate track MOV CL,DL CL = sector INC CL 1- XOR DX,DX Zero high DIV >numhead Compute head MOV CH,AL CH = cylinder MOV DH,DL DH = head MOV DL,8[BP] DL = drive MOV DI,3 Try three times write1 MOV AX,$0301 Write 1 sector INT $13 Call BIOS JNC write2 Success DEC DI Reduce count JNZ write1 Keep trying PUSH AX Pass parameter CALL disk_error Report an error POP AX Clean stack write2 XOR AX,AX Zero return }