Category : Assembly Language Source Code
Archive   : DSKPATCH.ZIP
Filename : DISK_IO.ASM
Output of file : DISK_IO.ASM contained in archive : DSKPATCH.ZIP
; DISK_IO.ASM Disk input and output procedures. ;
; 04-30-89*CV ;
;---------------------------------------------------------------------;
CGROUP GROUP CODE_SEG, DATA_SEG
ASSUME CS:CGROUP, DS:CGROUP
CODE_SEG SEGMENT PUBLIC
PUBLIC READ_SECTOR
DATA_SEG SEGMENT PUBLIC
EXTRN SECTOR:BYTE
EXTRN DISK_DRIVE_NO:BYTE
EXTRN CURRENT_SECTOR_NO:WORD
DATA_SEG ENDS
EXTRN INIT_SEC_DISP:NEAR, CLEAR_SCREEN:NEAR
;---------------------------------------------------------------------;
; This procedure reads one sector (512 bytes) into SECTOR. ;
; ;
; Reads: CURRENT_SECTOR_NO, DISK_DRIVE_NO ;
; Writes: SECTOR ;
;---------------------------------------------------------------------;
READ_SECTOR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AL,DISK_DRIVE_NO ;Drive number
MOV CX,1 ;Read only 1 sector
MOV DX,CURRENT_SECTOR_NO ;Logical sector number
LEA BX,SECTOR ;Where to store this sector
INT 25h ;Read the sector
POPF ;Discard flags put on stack
XOR DX,DX ;Set offset to 0 within SECTOR
CALL INIT_SEC_DISP ;Dump the first half
POP DX
POP CX
POP BX
POP AX
RET
READ_SECTOR ENDP
PUBLIC WRITE_SECTOR
;---------------------------------------------------------------------;
; This procedure writes the sector back to the disk. ;
; ;
; Reads: DISK_DRIVE_NO, CURRENT_SECTOR_NO, SECTOR ;
;---------------------------------------------------------------------;
WRITE_SECTOR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AL,DISK_DRIVE_NO ;Drive number
MOV CX,1 ;Write one sector
MOV DX,CURRENT_SECTOR_NO ;Logical sector
LEA BX,SECTOR
INT 26h ;Write the sector to disk
POPF ;Discard the flag info
POP DX
POP CX
POP BX
POP AX
RET
WRITE_SECTOR ENDP
PUBLIC PREVIOUS_SECTOR
EXTRN INIT_SEC_DISP:NEAR, WRITE_HEADER:NEAR
EXTRN WRITE_PROMPT_LINE:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN CURRENT_SECTOR_NO:WORD, EDITOR_PROMPT:BYTE
DATA_SEG ENDS
;---------------------------------------------------------------------;
; This procedure reads the previous sector, if possible. ;
; ;
; Uses: WRITE_HEADER, READ_SECTOR, INIT_SEC_DISP ;
; WRITE_PROMPT_LINE ;
; Reads: CURRENT_SECTOR_NO, EDITOR_PROMPT ;
; Writes: CURRENT_SECTOR_NO ;
;---------------------------------------------------------------------;
PREVIOUS_SECTOR PROC NEAR
PUSH AX
PUSH DX
MOV AX,CURRENT_SECTOR_NO ;Get current sec no
OR AX,AX ;Dont decrement if already 0
JZ DONT_DECREMENT_SECTOR
DEC AX
MOV CURRENT_SECTOR_NO,AX ;Save new sector no
CALL WRITE_HEADER
CALL READ_SECTOR
CALL INIT_SEC_DISP ;Display new sector
LEA DX,EDITOR_PROMPT
CALL WRITE_PROMPT_LINE
DONT_DECREMENT_SECTOR:
POP DX
POP AX
RET
PREVIOUS_SECTOR ENDP
PUBLIC NEXT_SECTOR
EXTRN INIT_SEC_DISP:NEAR, WRITE_HEADER:NEAR
EXTRN WRITE_PROMPT_LINE:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN CURRENT_SECTOR_NO:WORD, EDITOR_PROMPT:BYTE
DATA_SEG ENDS
;---------------------------------------------------------------------;
; Reads the next sector. ;
; ;
; Uses: WRITE_HEADER, READ_SECTOR, INIT_SEC_DISP ;
; WRITE_PROMPT_LINE ;
; Reads: CURRENT_SECTOR_NO, EDITOR_PROMPT ;
; Writes: CURRENT_SECTOR_NO ;
;---------------------------------------------------------------------;
NEXT_SECTOR PROC NEAR
PUSH AX
PUSH DX
MOV AX,CURRENT_SECTOR_NO
INC AX ;Move to next sector
MOV CURRENT_SECTOR_NO,AX
CALL WRITE_HEADER
CALL READ_SECTOR
CALL INIT_SEC_DISP ;Display new sector
LEA DX,EDITOR_PROMPT
CALL WRITE_PROMPT_LINE
POP DX
POP AX
RET
NEXT_SECTOR ENDP
PUBLIC UP_SECTOR_NO
EXTRN WRITE_HEADER:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN CURRENT_SECTOR_NO:WORD
DATA_SEG ENDS
;---------------------------------------------------------------------;
; This procedure increases the current sector number with each push ;
; of the F3 key. ;
; ;
; Uses: WRITE_HEADER ;
; Reads: CURRENT_SECTOR_NO ;
; Writes: CURRENT_SECTOR_NO ;
;---------------------------------------------------------------------;
UP_SECTOR_NO PROC NEAR
PUSH AX
MOV AX,CURRENT_SECTOR_NO
INC AX
MOV CURRENT_SECTOR_NO,AX
CALL WRITE_HEADER
POP AX
RET
UP_SECTOR_NO ENDP
PUBLIC DOWN_SECTOR_NO
EXTRN WRITE_HEADER:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN CURRENT_SECTOR_NO:WORD
DATA_SEG ENDS
;---------------------------------------------------------------------;
; This procedure decreases the current sector number with each push ;
; of the F4 key. ;
; ;
; Uses: WRITE_HEADER ;
; Reads: CURRENT_SECTOR_NO ;
; Writes: CURRENT_SECTOR_NO ;
;---------------------------------------------------------------------;
DOWN_SECTOR_NO PROC NEAR
PUSH AX
MOV AX,CURRENT_SECTOR_NO
DEC AX
MOV CURRENT_SECTOR_NO,AX
CALL WRITE_HEADER
POP AX
RET
DOWN_SECTOR_NO ENDP
PUBLIC A_DRIVE
EXTRN WRITE_HEADER:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN DISK_DRIVE_NO:BYTE
DATA_SEG ENDS
;---------------------------------------------------------------------;
; This procedure changes the current drive to A: using the F6 key. ;
; ;
; Uses: WRITE_HEADER ;
; Reads: CURRENT_DRIVE_NO ;
; Writes: CURRENT_DRIVE_NO ;
;---------------------------------------------------------------------;
A_DRIVE PROC NEAR
PUSH AX
MOV AL,0
MOV DISK_DRIVE_NO,AL
CALL WRITE_HEADER
POP AX
RET
A_DRIVE ENDP
PUBLIC B_DRIVE
EXTRN WRITE_HEADER:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN DISK_DRIVE_NO:BYTE
DATA_SEG ENDS
;---------------------------------------------------------------------;
; This procedure changes the current drive to B: using the F7 key. ;
; ;
; Uses: WRITE_HEADER ;
; Reads: CURRENT_DRIVE_NO ;
; Writes: CURRENT_DRIVE_NO ;
;---------------------------------------------------------------------;
B_DRIVE PROC NEAR
PUSH AX
MOV AL,1
MOV DISK_DRIVE_NO,AL
CALL WRITE_HEADER
POP AX
RET
B_DRIVE ENDP
PUBLIC D_DRIVE
EXTRN WRITE_HEADER:NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN DISK_DRIVE_NO:BYTE
DATA_SEG ENDS
;---------------------------------------------------------------------;
; This procedure changes the current drive to D: using the F8 key. ;
; ;
; Uses: WRITE_HEADER ;
; Reads: CURRENT_DRIVE_NO ;
; Writes: CURRENT_DRIVE_NO ;
;---------------------------------------------------------------------;
D_DRIVE PROC NEAR
PUSH AX
MOV AL,3
MOV DISK_DRIVE_NO,AL
CALL WRITE_HEADER
POP AX
RET
D_DRIVE ENDP
CODE_SEG ENDS
DATA_SEG SEGMENT PUBLIC
EXTRN SECTOR:BYTE
DATA_SEG ENDS
END
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/