143 lines
1.4 KiB
NASM
143 lines
1.4 KiB
NASM
ORG (RAM-0x600)
|
|
CPU 8086
|
|
|
|
DISKCX: EQU 0x40
|
|
DISKDL: EQU 0x42
|
|
DISKDH: EQU 0x43
|
|
DISKBX: EQU 0x44
|
|
|
|
JMP NEAR BOOT
|
|
JMP NEAR WBOOT
|
|
JMP NEAR CONST
|
|
JMP NEAR CONIN
|
|
JMP NEAR CONOUT
|
|
JMP NEAR LIST
|
|
JMP NEAR PUNCH
|
|
JMP NEAR READER
|
|
JMP NEAR HOME
|
|
JMP NEAR SELDSK
|
|
JMP NEAR SETTRK
|
|
JMP NEAR SETSEC
|
|
JMP NEAR SETDMA
|
|
JMP NEAR READ
|
|
JMP NEAR WRITE
|
|
JMP NEAR LISTST
|
|
JMP NEAR SECTRAN
|
|
|
|
BOOT:
|
|
STC
|
|
RET
|
|
|
|
WBOOT:
|
|
STC
|
|
RET
|
|
|
|
; CHAR I/O
|
|
CONST:
|
|
MOV AH, 1
|
|
INT 0x16
|
|
JZ .END
|
|
MOV AL, 0xFF
|
|
RET
|
|
.END:
|
|
XOR AL, AL
|
|
RET
|
|
|
|
CONIN:
|
|
XOR AX, AX
|
|
INT 0x16
|
|
TEST AL, AL
|
|
JZ CONIN
|
|
RET
|
|
|
|
CONOUT:
|
|
PUSH AX
|
|
PUSH BX
|
|
MOV AH, 0x0E
|
|
MOV AL, DL
|
|
XOR BX, BX
|
|
INT 0x10
|
|
POP BX
|
|
POP AX
|
|
RET
|
|
|
|
LIST:
|
|
PUSH DX
|
|
XOR AH, AH
|
|
MOV AL, DL
|
|
INT 0x17
|
|
POP DX
|
|
RET
|
|
|
|
LISTST:
|
|
STC
|
|
RET
|
|
|
|
PUNCH:
|
|
STC
|
|
RET
|
|
|
|
READER:
|
|
STC
|
|
RET
|
|
|
|
; DISK I/O
|
|
HOME:
|
|
RET
|
|
|
|
SELDSK:
|
|
MOV BYTE [DISKDL], CL
|
|
XOR BX, BX
|
|
RET
|
|
|
|
SETTRK:
|
|
PUSH CX
|
|
PUSH DX
|
|
|
|
MOV DX, CX
|
|
; CH for headnum, CL for SAL
|
|
MOV CX, 0x0006
|
|
|
|
; Take off LSB as head number
|
|
XOR CH, CH
|
|
RCR DX, 1
|
|
RCL CH, 1
|
|
MOV BYTE [DISKDH], CH
|
|
|
|
; DX is sector number now
|
|
; Shift into format for int13
|
|
; DX ------9876543210
|
|
SAL DX, CL
|
|
; DX 9876543210------
|
|
ROL DX, 1
|
|
ROL DX, 1
|
|
; DX 76543210------98
|
|
SAL DL, CL
|
|
; DX 7654321098------
|
|
AND WORD [DISKCX], 0x003F
|
|
OR WORD [DISKCX], DX
|
|
|
|
POP DX
|
|
POP CX
|
|
RET
|
|
|
|
SETSEC:
|
|
STC
|
|
RET
|
|
|
|
SETDMA:
|
|
MOV WORD [DISKBX], CX
|
|
RET
|
|
|
|
READ:
|
|
STC
|
|
RET
|
|
|
|
WRITE:
|
|
STC
|
|
RET
|
|
|
|
SECTRAN:
|
|
STC
|
|
RET
|