2020-04-10 17:00:26 +02:00
|
|
|
cpu 8086
|
2020-04-18 22:59:46 +02:00
|
|
|
org 0x500
|
2020-04-19 15:14:10 +02:00
|
|
|
jmp 0:(init+0x7C00-$$)
|
2020-04-15 00:17:58 +02:00
|
|
|
|
|
|
|
%include "inc/bpb.asm"
|
2020-05-02 23:57:23 +02:00
|
|
|
%include "inc/mbr.asm"
|
2020-04-15 00:17:58 +02:00
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
; Far call via interrupt vector
|
|
|
|
%macro intcall 1
|
|
|
|
call far [cs:%1*4]
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
; Far jump via interrupt vector
|
2020-04-27 15:56:41 +02:00
|
|
|
%macro intjmp 1
|
|
|
|
jmp far [cs:%1*4]
|
2020-04-26 23:14:34 +02:00
|
|
|
%endmacro
|
|
|
|
|
|
|
|
; stack size
|
|
|
|
%define stacks 512
|
|
|
|
|
2020-04-19 00:35:31 +02:00
|
|
|
banner: db "rdos", 0xA, 0xD, '$'
|
2020-04-15 00:17:58 +02:00
|
|
|
|
2020-04-20 19:13:06 +02:00
|
|
|
; Alias for Int 21h,AH=0h
|
2020-04-19 00:35:31 +02:00
|
|
|
int20h: xor ah, ah
|
2020-04-20 19:13:06 +02:00
|
|
|
; allow extenders to get away with only hooking 21h
|
2020-04-27 15:56:41 +02:00
|
|
|
intjmp 0x21
|
2020-04-20 19:13:06 +02:00
|
|
|
|
2020-04-19 00:35:31 +02:00
|
|
|
int21h: ; inside of kernel, direction always goes up
|
|
|
|
; the iret will restore it to the user value later
|
|
|
|
cld
|
|
|
|
; set sfptr from ah
|
2020-04-15 00:17:58 +02:00
|
|
|
push bx
|
2020-04-19 00:35:31 +02:00
|
|
|
xor bx, bx
|
|
|
|
mov bl, ah
|
|
|
|
add bl, bl
|
|
|
|
add bx, sftab
|
|
|
|
mov bx, [cs:bx]
|
|
|
|
mov [cs:sfptr], bx
|
2020-04-15 00:17:58 +02:00
|
|
|
pop bx
|
2020-04-19 00:35:31 +02:00
|
|
|
; do the actual subfunction call
|
|
|
|
call [cs:sfptr]
|
|
|
|
; inherit the lower 8 flag bits to userspace
|
2020-04-26 23:14:34 +02:00
|
|
|
iretfl: push ax
|
2020-04-19 00:35:31 +02:00
|
|
|
push bp
|
|
|
|
mov bp, sp
|
|
|
|
lahf
|
|
|
|
mov [bp+8], ah
|
2020-04-10 17:00:26 +02:00
|
|
|
pop bp
|
2020-04-19 00:35:31 +02:00
|
|
|
pop ax
|
|
|
|
; iret frame: IP CS FLAGS
|
2020-04-20 19:13:06 +02:00
|
|
|
iret: iret
|
2020-04-27 15:56:41 +02:00
|
|
|
retf: retf
|
2020-04-10 17:00:26 +02:00
|
|
|
|
2020-04-19 00:35:31 +02:00
|
|
|
; Subfunction ptr
|
|
|
|
; this is used as extra register in int21h
|
|
|
|
sfptr: dw 0
|
2020-04-13 15:53:21 +02:00
|
|
|
|
|
|
|
; Subfunction table
|
2020-04-23 21:35:28 +02:00
|
|
|
sftab: dw sferr, getc, putc, sferr
|
|
|
|
dw sferr, sferr, conout, conin
|
2020-04-19 00:35:31 +02:00
|
|
|
dw sferr, puts, sferr, sferr
|
2020-04-13 15:53:21 +02:00
|
|
|
dw sferr, sferr, sferr, sferr
|
2020-04-13 18:03:54 +02:00
|
|
|
; 10
|
2020-04-13 15:53:21 +02:00
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
dw sferr, sferr, sferr, sferr
|
2020-04-13 18:03:54 +02:00
|
|
|
; 20
|
2020-04-13 15:53:21 +02:00
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
dw sferr, setint, sferr, sferr
|
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
dw sferr, sferr, sferr, sferr
|
2020-04-13 18:03:54 +02:00
|
|
|
; 30
|
2020-04-13 15:53:21 +02:00
|
|
|
dw sferr, sferr, sferr, sferr
|
2020-04-13 18:03:54 +02:00
|
|
|
dw sferr, getint, sferr, sferr
|
2020-04-13 15:53:21 +02:00
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
dw sferr, sferr, sferr, sferr
|
|
|
|
|
2020-04-23 21:35:28 +02:00
|
|
|
; OUT al character read
|
|
|
|
getc: xor ax, ax
|
|
|
|
int 0x16
|
|
|
|
push ax
|
|
|
|
jmp putc.2
|
|
|
|
|
2020-04-19 00:35:31 +02:00
|
|
|
; IN dl character to write
|
|
|
|
putc: push ax
|
|
|
|
mov al, dl
|
2020-04-23 21:35:28 +02:00
|
|
|
.2: int 0x29
|
2020-04-19 00:35:31 +02:00
|
|
|
pop ax
|
2020-04-13 18:03:54 +02:00
|
|
|
ret
|
|
|
|
|
2020-04-23 21:35:28 +02:00
|
|
|
; console output
|
|
|
|
; IN dl character
|
|
|
|
conout: cmp dl, 0xFF
|
|
|
|
je conine
|
|
|
|
push ax
|
|
|
|
mov al, dl
|
|
|
|
int 0x29
|
|
|
|
pop ax
|
|
|
|
ret
|
|
|
|
|
|
|
|
; console input with echo
|
|
|
|
; OUT al character
|
|
|
|
; zf clear when character available
|
|
|
|
conine: mov ah, 1
|
|
|
|
int 0x16
|
|
|
|
jnz .has
|
|
|
|
xor al, al
|
|
|
|
ret
|
|
|
|
.has: xor ax, ax
|
|
|
|
int 0x16
|
2020-04-25 21:54:15 +02:00
|
|
|
test al, al
|
|
|
|
jz conine
|
2020-04-23 21:35:28 +02:00
|
|
|
int 0x29
|
|
|
|
test ax, ax
|
|
|
|
ret
|
|
|
|
|
|
|
|
; console input without echo
|
|
|
|
; OUT al character
|
|
|
|
; zf clear when character available
|
|
|
|
conin: mov ah, 1
|
|
|
|
int 0x16
|
|
|
|
jnz .has
|
|
|
|
xor al, al
|
|
|
|
ret
|
|
|
|
.has: xor ax, ax
|
|
|
|
int 0x16
|
2020-04-25 21:54:15 +02:00
|
|
|
test al, al
|
|
|
|
jz conin
|
2020-04-23 21:35:28 +02:00
|
|
|
test ax, ax
|
|
|
|
ret
|
|
|
|
|
2020-04-19 00:35:31 +02:00
|
|
|
; DOS 1+ 9h - WRITE STRING TO STANDARD OUTPUT
|
|
|
|
; IN ds:dx '$'-terminated string
|
|
|
|
puts: push si
|
|
|
|
.loop: lodsb
|
|
|
|
cmp al, '$'
|
|
|
|
je .end
|
2020-04-20 19:13:06 +02:00
|
|
|
int 0x29
|
2020-04-19 00:35:31 +02:00
|
|
|
jmp .loop
|
|
|
|
.end: pop si
|
|
|
|
ret
|
|
|
|
|
|
|
|
; DOS 1+ 25h - SET INTERRUPT VECTOR
|
2020-04-13 18:03:54 +02:00
|
|
|
; IN al interrupt number
|
|
|
|
; ds:dx entry point
|
2020-04-18 23:44:16 +02:00
|
|
|
setint: push bx
|
2020-04-13 18:03:54 +02:00
|
|
|
xor bx, bx
|
|
|
|
; BX=AL*4
|
2020-04-18 23:44:16 +02:00
|
|
|
mov bl, al
|
|
|
|
add bl, bl
|
|
|
|
add bl, bl
|
|
|
|
; save DS:DX into vector
|
|
|
|
mov [cs:bx], dx
|
|
|
|
mov [cs:bx+2], ds
|
2020-04-13 15:53:21 +02:00
|
|
|
pop bx
|
2020-04-10 17:00:26 +02:00
|
|
|
ret
|
|
|
|
|
2020-04-19 00:35:31 +02:00
|
|
|
; DOS 2+ 35h - GET INTERRUPT VECTOR
|
|
|
|
; IN al interrupt number
|
|
|
|
; OUT es:bx current interrupt handler
|
|
|
|
getint: xor bx, bx
|
|
|
|
; BX=AL*4
|
|
|
|
mov bl, al
|
|
|
|
add bl, bl
|
|
|
|
add bl, bl
|
|
|
|
; load vector into ES:BX
|
|
|
|
les bx, [cs:bx]
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Fallback for non-existant subfunctions
|
|
|
|
; The carry flag is inherited to user
|
|
|
|
sferr: stc
|
|
|
|
ret
|
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
; DOS IDLE INTERRUPT
|
2020-04-20 19:19:14 +02:00
|
|
|
; Usually hooked by TSRs
|
|
|
|
idle: sti
|
|
|
|
; sti takes one instruction to take effect
|
|
|
|
nop
|
|
|
|
; Wait until next interrupt
|
|
|
|
hlt
|
|
|
|
iret
|
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
; FAST CONSOLE OUTPUT
|
2020-04-20 19:13:06 +02:00
|
|
|
; IN al character to print
|
|
|
|
fputc: push ax
|
|
|
|
push bx
|
|
|
|
mov ah, 0x0E
|
|
|
|
xor bx, bx
|
|
|
|
int 0x10
|
|
|
|
pop bx
|
|
|
|
pop ax
|
|
|
|
iret
|
|
|
|
|
2020-04-27 15:56:41 +02:00
|
|
|
%include "kernel/diskio.asm"
|
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
vects: dw int20h, int21h, retf, retf
|
2020-05-02 23:57:23 +02:00
|
|
|
dw retf, retf, retf, int20h
|
2020-04-26 23:14:34 +02:00
|
|
|
dw idle, fputc
|
2020-04-23 21:49:10 +02:00
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
main: ; zero out first 64kb except our code
|
|
|
|
; bss and boot sector area gets cleared by this
|
|
|
|
mov di, init
|
|
|
|
mov cx, di
|
|
|
|
neg cx
|
|
|
|
xor ax, ax
|
|
|
|
rep movsb
|
2020-04-23 21:49:10 +02:00
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
; install interrupt vectors
|
|
|
|
mov si, vects
|
2020-04-23 21:49:10 +02:00
|
|
|
mov di, (0x20*4)
|
2020-04-26 23:14:34 +02:00
|
|
|
mov cx, 0x0A
|
|
|
|
intlp: movsw
|
|
|
|
mov ax, cs
|
|
|
|
stosw
|
|
|
|
loop intlp
|
2020-04-23 21:49:10 +02:00
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
; print banner to indicate we are booted
|
2020-04-23 21:49:10 +02:00
|
|
|
mov si, banner
|
|
|
|
mov ah, 9
|
|
|
|
int 0x21
|
|
|
|
|
2020-04-26 23:14:34 +02:00
|
|
|
call dnconv
|
|
|
|
mov al, dl
|
2020-05-02 23:57:23 +02:00
|
|
|
call select
|
2020-04-26 23:14:34 +02:00
|
|
|
|
2020-04-23 21:49:10 +02:00
|
|
|
loop: int 0x28
|
|
|
|
jmp loop
|
2020-03-25 21:56:00 +01:00
|
|
|
|
2020-04-18 22:59:46 +02:00
|
|
|
init: cli
|
|
|
|
xor ax, ax
|
|
|
|
mov ds, ax
|
|
|
|
mov es, ax
|
|
|
|
mov ss, ax
|
2020-04-26 23:14:34 +02:00
|
|
|
mov sp, ( stack+stacks )
|
2020-04-18 22:59:46 +02:00
|
|
|
|
2020-04-23 21:49:10 +02:00
|
|
|
; relocate
|
2020-04-18 22:59:46 +02:00
|
|
|
mov si, 0x7C00
|
|
|
|
mov di, $$
|
|
|
|
mov cx, (init-$$)
|
|
|
|
rep movsb
|
|
|
|
|
|
|
|
jmp 0:main
|
2020-04-20 19:13:06 +02:00
|
|
|
|
2020-04-23 21:36:20 +02:00
|
|
|
section .bss
|
2020-04-26 23:14:34 +02:00
|
|
|
; stack to be used during init and disk i/o
|
|
|
|
stack: resw stacks
|