From ad8a347d7df08b9eb30ae97605e80eb2acbcc076 Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Fri, 25 Oct 2019 13:09:53 +0000 Subject: [PATCH] bios8086: implement CHS disk i/o using int13h --- Makefile | 5 +++ bios/8086.asm | 98 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 91 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index be96c77..115d588 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ FLOPPY = 360 +BIOS = 0xFA00 PROGRAMS = $(patsubst %.asm,%.com,$(wildcard com/*.asm)) DISTFILES = rdos.bin $(PROGRAMS) @@ -10,6 +11,7 @@ QEMU_ARGS = $(addprefix --option-rom ,$(ROMS)) NASM = nasm NASM_ARGS = -s -Ilib -Plib/nasmcomp.asm -w-macro-params +NASM_ARGS += -DBIOS=$(BIOS) EMUL = utils/emul @@ -46,6 +48,9 @@ rom/%.rom: rom/%.asm com/%.com: com/%.asm $(NASM) $(NASM_ARGS) -o $@ $< +bios%.bin: bios/%.asm + $(NASM) $(NASM_ARGS) -o $@ $< + fdimage.img: boot/fat.bs $(DISTFILES) mformat -C -i $@ -f $(FLOPPY) -B boot/fat.bs :: mcopy -i $@ $(DISTFILES) :: diff --git a/bios/8086.asm b/bios/8086.asm index c939e49..8921404 100644 --- a/bios/8086.asm +++ b/bios/8086.asm @@ -1,9 +1,8 @@ -ORG (RAM-0x600) +ORG BIOS CPU 8086 DISKCX: EQU 0x40 -DISKDL: EQU 0x42 -DISKDH: EQU 0x43 +DISKDX: EQU 0x42 DISKBX: EQU 0x44 JMP NEAR BOOT @@ -22,10 +21,11 @@ JMP NEAR SETDMA JMP NEAR READ JMP NEAR WRITE JMP NEAR LISTST -JMP NEAR SECTRAN BOOT: - STC + MOV AL, 0x19 + CALL MSG + DB "BIOS 8086", 0 RET WBOOT: @@ -50,6 +50,44 @@ CONIN: JZ CONIN RET +MSG: + POP SI +.LOOP: + MOV DL, BYTE [SI] + INC SI + TEST DL, DL + JZ .END + CALL CONOUT + JMP .LOOP +.END: + MOV DL, 0x20 + CALL CONOUT + CALL PRINTAL + MOV DL, 0x0A + CALL CONOUT + MOV DL, 0x0D + CALL CONOUT + PUSH SI + RET + +PRINTAL: + PUSH AX + PUSH DX + AAM 16 + MOV DL, AH + CALL PRINTNIB + MOV DL, AL + CALL PRINTNIB + POP DX + POP AX + RET + +PRINTNIB: + ADD DL, 0x30 + CMP DL, 0x3a + JL CONOUT + ADD DL, 0x07 + CONOUT: PUSH AX PUSH BX @@ -86,7 +124,7 @@ HOME: RET SELDSK: - MOV BYTE [DISKDL], CL + MOV BYTE [DISKDX], CL XOR BX, BX RET @@ -102,7 +140,7 @@ SETTRK: XOR CH, CH RCR DX, 1 RCL CH, 1 - MOV BYTE [DISKDH], CH + MOV BYTE [DISKDX+1], CH ; DX is sector number now ; Shift into format for int13 @@ -122,7 +160,8 @@ SETTRK: RET SETSEC: - STC + AND WORD [DISKCX], 0xFFA0 + OR BYTE [DISKCX], CL RET SETDMA: @@ -130,13 +169,48 @@ SETDMA: RET READ: - STC + PUSH CX + PUSH DX + PUSH BX + + MOV AX, 0x0201 + MOV CX, [DISKCX] + MOV DX, [DISKDX] + MOV BX, [DISKBX] + INT 0x13 + XCHG AH, AL + + POP BX + POP DX + POP CX + + JC DISKERR RET WRITE: - STC + PUSH CX + PUSH DX + PUSH BX + + MOV AX, 0x0301 + MOV CX, [DISKCX] + MOV DX, [DISKDX] + MOV BX, [DISKBX] + INT 0x13 + XCHG AH, AL + + POP BX + POP DX + POP CX + + JC DISKERR RET -SECTRAN: - STC +DISKERR: + PUSHF + PUSH SI + CALL MSG + DB "DISKERR", 0 + POP SI + POPF RET