NAME PDISKIO PAGE 60,132 ;****************************************************************; ; ; ; PHYSICAL DISK I/O ; ; ; ;****************************************************************; _TEXT SEGMENT BYTE PUBLIC 'CODE' _TEXT ENDS CONST SEGMENT WORD PUBLIC 'CONST' CONST ENDS _BSS SEGMENT WORD PUBLIC 'BSS' _BSS ENDS _DATA SEGMENT WORD PUBLIC 'DATA' _DATA ENDS DGROUP GROUP CONST, _BSS, _DATA ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP _TEXT SEGMENT ;****************************************************************; ; ; ; char ; ; disk_io(cmd, drive, buf, count, sector, head, cylinder) ; ; 4 6 8 10 12 14 16 ; ;****************************************************************; PUBLIC _DISK_IO _DISK_IO PROC NEAR PUSH BP ; SAVE FRAME MOV BP, SP ; MAKE NEW FRAME PUSH ES ; PUSH SI ; PUSH DI ; MOV AH, [BP+4] ; PICK UP COMMAND MOV DL, [BP+6] ; PICK UP DRIVE MOV BX, [BP+8] ; PICK UP BUFFER PUSH DS ; POP ES ; MOV AL, [BP+10] ; PICK UP COUNT MOV DH, [BP+14] ; PICK UP HEAD MOV CH, [BP+17] ; HIGH CYL BITS SHR CX, 1 ; SHF 2 MSB TO CL SHR CX, 1 ; AND CL, 0C0H ; MASK THEM ADD CL, [BP+12] ; ADD IN SECTOR INC CL ; PLUS ONE MOV CH, [BP+16] ; REST CYL IN CH INT 13H ; CALL BIOS JC SAVERR ; JUMP IF ERROR MOV AH, 0 ; CLEAR RESULT CMP BYTE PTR [BP+4], 8 ; DRIVE PARAM CMD JNE SAVERR ; JUMP IF NOT MOV BX, [BP+8] ; RESULTS IN BUF MOV [BX], CL ; SECTORS AND BYTE PTR [BX], 03FH ; MOV BYTE PTR [BX+1], 0 ; INC DH ; MOV [BX+2], DH ; HEADS MOV BYTE PTR [BX+3], 0 ; MOV [BX+4], CH ; CYLINDERS SHL CX, 1 ; FIX HIGH BYTE SHL CX, 1 ; AND CH, 003H ; MOV [BX+5], CH ; MOV [BX+6], DL ; DRIVES MOV BYTE PTR [BX+7], 0 ; SAVERR: MOV AL, AH ; RESULT IN AX MOV AH, 0 ; POP DI ; RESTORE REGS POP SI ; POP ES ; POP BP ; RESTORE FRAME RET ; RETURN _DISK_IO ENDP ;****************************************************************; ; ; ; Get the current BIOS clock tick count ; ; ; ; long ticks(); ; ; ; ;****************************************************************; PUBLIC _TICK _TICK PROC NEAR PUSH BP ; SAVE FRAME MOV BP, SP ; MAKE NEW FRAME PUSH ES ; MOV AX, 0 ; CLEAR ES TO MOV ES, AX ; GET BIOS DATA CLI ; DISABLE INTS MOV AX, ES:WORD PTR [046CH] ; LOW TICK COUNT MOV DX, ES:WORD PTR [046EH] ; HIGH TICK COUNT STI ; ENABLE INTS POP ES ; RESTORE REGS POP BP ; RESTORE FRAME RET ; RETURN _TICK ENDP ;****************************************************************; _TEXT ENDS END