Load and execute command.com

This commit is contained in:
Juhani Krekelä 2021-09-26 11:46:50 +03:00
parent 1967c06b85
commit 68030372b7
1 changed files with 97 additions and 15 deletions

112
io.asm
View File

@ -64,14 +64,26 @@ init:
shl ax, cl shl ax, cl
; Memory size is passed in dx ; Memory size is passed in dx
mov dx, ax mov dx, ax
call hexprint16
call newline
; Disk table is passed in si ; Disk table is passed in si
mov si, offset iogroup:disks_table mov si, offset iogroup:disks_table
call dosinit call dosinit
; Memory for command.com is at ds, save for later and revert ds ; Memory for command.com is at ds, with PSP already set up
push ds
; Retrieve amount of memory in the program segment
mov cx, word ptr ds:6
; Set up DTA
mov dx, 100h
mov ah, 1ah
int 21h
; Save command.com's segment for later and revert ds for opening the FCB
mov bx, ds
mov ax, cs mov ax, cs
mov ds, ax mov ds, ax
@ -79,15 +91,67 @@ init:
mov dx, offset iogroup:command_fcb mov dx, offset iogroup:command_fcb
mov ah, 0fh mov ah, 0fh
int 21h int 21h
test al, al test al, al
jnz open_error jnz open_error
mov al, '+' mov al, '+'
jmp unfinished mov ah, 0eh
int 10h
; Set random record field 0
mov word ptr command_fcb+33, 0
mov word ptr command_fcb+35, 0
; Set record size to 1 byte
mov word ptr command_fcb+14, 1
; Read command.com into memory
mov ah, 27h
int 21h
jcxz read_error
cmp al, 1
jne read_error
mov ax, cx
call hexprint16
mov al, '.'
mov ah, 0eh
int 10h
; Set up segments for command.com
mov ds, bx
mov es, bx
mov ss, bx
mov sp, 5ch ; Microsoft's documentation says to use this
; Put a zero at top of the stack
xor ax, ax
push ax
; Set default DTA
mov dx, 80h
mov ah, 1ah
int 21h
; Jump to command.com
push bx
mov ax, 100h
push ax
trampoline proc far
ret
trampoline endp
; TODO: Better error reporting
open_error: open_error:
mov al, '-' mov al, '-'
jmp unfinished
read_error:
mov al, '!'
unfinished: unfinished:
mov ah, 0eh mov ah, 0eh
@ -146,7 +210,24 @@ diskread proc far
int 10h int 10h
pop ax pop ax
call far_caller call far_caller
push ax
call hexprint8
call space
mov ax, ds
call hexprint16
call space
mov ax, bx
call hexprint16
call space
mov ax, cx
call hexprint16
call space
mov ax, dx
call hexprint16
call newline
pop ax
; TODO: Everything except sregs can be trashed
push es push es
push ax push ax
push bx push bx
@ -190,6 +271,11 @@ diskread proc far
jmp try_sector_read jmp try_sector_read
sector_read_fail: sector_read_fail:
mov al, ah
call hexprint8;debg
mov al, '?'
mov ah, 0eh
int 10h
pop cx pop cx
pop ax pop ax
@ -201,6 +287,7 @@ diskread proc far
pop es pop es
mov al, 12 ; TODO: Don't hardcode mov al, 12 ; TODO: Don't hardcode
stc
ret ret
sector_read_success: sector_read_success:
@ -219,6 +306,7 @@ diskread proc far
pop ax pop ax
pop es pop es
clc
ret ret
diskread endp diskread endp
@ -256,10 +344,10 @@ chs proc
; cylinder (track) ; cylinder (track)
mov ch, al mov ch, al
;shr ax, 1 shr ax, 1
;shr ax, 1 shr ax, 1
;and al, 0c0h and al, 0c0h
;or cl, al or cl, al
mov ax, dx mov ax, dx
pop dx pop dx
@ -280,13 +368,8 @@ diskwrite:
; cf = 0 -> al = driver num ; cf = 0 -> al = driver num
; cf = 1 -> al = disk error code ; cf = 1 -> al = disk error code
diskchange proc far diskchange proc far
push ax
mov ax, 0e00h + 'd'
int 10h
pop ax
call far_caller
; TODO: Implement ; TODO: Implement
mov ax, 0100h mov ax, 0000h
clc clc
ret ret
diskchange endp diskchange endp
@ -320,7 +403,6 @@ flush endp
mapdev proc far mapdev proc far
; TODO: Implement ; TODO: Implement
xor al, al
ret ret
mapdev endp mapdev endp