PoC
This commit is contained in:
commit
86b5b2a7aa
140
kprintf.asm
Normal file
140
kprintf.asm
Normal file
@ -0,0 +1,140 @@
|
||||
; important functions in this file: kprintf
|
||||
|
||||
; write a character to kernel output
|
||||
; in: al
|
||||
kputc:
|
||||
push ax ; dont destroy ah
|
||||
push dx
|
||||
mov ah,0x02 ; DOS putc
|
||||
mov dl,al
|
||||
int 0x21
|
||||
pop dx
|
||||
pop ax
|
||||
ret
|
||||
|
||||
; write a string to kernel output
|
||||
; in: ds:di
|
||||
kputs:
|
||||
push ax
|
||||
.loop:
|
||||
lodsb
|
||||
cmp al,0x00
|
||||
je .end
|
||||
call kputc
|
||||
jmp .loop
|
||||
.end:
|
||||
pop ax
|
||||
ret
|
||||
|
||||
; prints a nibble in hex
|
||||
; in: al
|
||||
kprint4:
|
||||
and al, 0x0F
|
||||
add al, 0x30
|
||||
cmp al, 0x3a
|
||||
jl kputc
|
||||
add al, 0x07
|
||||
jmp kputc
|
||||
|
||||
; print a byte
|
||||
; in: al
|
||||
kprint8:
|
||||
push ax ; avoid destroying ah
|
||||
aam 16 ; high nibble moved into ah
|
||||
xchg ah,al ; high nibble first
|
||||
call kprint4
|
||||
xchg ah,al
|
||||
call kprint4
|
||||
pop ax
|
||||
ret
|
||||
|
||||
; print a word
|
||||
; in: ax
|
||||
kprint16:
|
||||
xchg ah,al
|
||||
call kprint8
|
||||
xchg ah,al
|
||||
call kprint8
|
||||
ret
|
||||
|
||||
; read a word from the stack, using bp as stack pointer
|
||||
; in: bp
|
||||
; out: ax, bp
|
||||
kprintf_lodsw:
|
||||
push ds ; work segment for lodsw
|
||||
push si ; work pointer for lodsw
|
||||
push ss ; data transfer to ds
|
||||
pop ds
|
||||
mov si,bp
|
||||
lodsw
|
||||
mov bp,si ; write back incremented value
|
||||
pop si
|
||||
pop ds
|
||||
ret
|
||||
|
||||
; print data from stack
|
||||
; in: ds:si, ss:sp
|
||||
kprintf:
|
||||
push ax
|
||||
push bp ; state variable for stack lodsw
|
||||
push si ; return original pointer to caller
|
||||
mov ax, sp
|
||||
add ax, 0x08
|
||||
mov bp, ax
|
||||
.loop:
|
||||
lodsb
|
||||
cmp al,0x00
|
||||
je .end
|
||||
cmp al,0x25 ; '%'
|
||||
je .fseq
|
||||
call kputc
|
||||
jmp .loop
|
||||
.end:
|
||||
pop si
|
||||
pop bp
|
||||
mov al,0x0A
|
||||
call kputc
|
||||
mov al,0x0D
|
||||
call kputc
|
||||
pop ax
|
||||
ret
|
||||
.fseq:
|
||||
lodsb
|
||||
cmp al,0x00
|
||||
je .end
|
||||
cmp al,0x25 ; '%'
|
||||
je .fmt_pc
|
||||
cmp al,0x63 ; 'c'
|
||||
je .fmt_c
|
||||
cmp al,0x73 ; 's'
|
||||
je .fmt_s
|
||||
cmp al,0x78 ; 'x'
|
||||
je .fmt_x
|
||||
cmp al,0x58 ; 'X'
|
||||
je .fmt_X
|
||||
mov al,0x3F ; '?'
|
||||
call kputc
|
||||
jmp .loop
|
||||
.fmt_pc:
|
||||
mov al,0x25
|
||||
call kputc
|
||||
jmp .loop
|
||||
.fmt_c:
|
||||
call kprintf_lodsw
|
||||
call kputc
|
||||
jmp .loop
|
||||
.fmt_s:
|
||||
push si
|
||||
call kprintf_lodsw
|
||||
mov si,ax
|
||||
call kputs
|
||||
pop si
|
||||
jmp .loop
|
||||
.fmt_x:
|
||||
call kprintf_lodsw
|
||||
call kprint8
|
||||
jmp .loop
|
||||
.fmt_X:
|
||||
call kprintf_lodsw
|
||||
call kprint16
|
||||
jmp .loop
|
13
main.asm
Normal file
13
main.asm
Normal file
@ -0,0 +1,13 @@
|
||||
cpu 8086
|
||||
|
||||
org 0x0100
|
||||
jmp main
|
||||
|
||||
main:
|
||||
call mm_print
|
||||
ret
|
||||
|
||||
%include "kprintf.asm"
|
||||
|
||||
; mem MUST be last because it will write after it
|
||||
%include "mem.asm"
|
105
mem.asm
Normal file
105
mem.asm
Normal file
@ -0,0 +1,105 @@
|
||||
; converts a memory block type code into char representation
|
||||
; in: al
|
||||
; out: al
|
||||
; destroys ah
|
||||
mm_type:
|
||||
push bp
|
||||
push si
|
||||
mov bp,.typechar
|
||||
and ax,0x00FF
|
||||
mov si,ax
|
||||
mov al,[bp+si]
|
||||
pop si
|
||||
pop bp
|
||||
ret
|
||||
.typechar:
|
||||
db "F?ARU", 0
|
||||
|
||||
mm_print:
|
||||
push cs
|
||||
pop ds
|
||||
mov cx,0x0000
|
||||
mov bp,memtab
|
||||
mov si,0x0000
|
||||
|
||||
.loop:
|
||||
push si
|
||||
|
||||
mov ax, bp
|
||||
add ax, si
|
||||
add ax, 0x06
|
||||
push ax
|
||||
|
||||
mov al,[bp+si+0x05]
|
||||
push ax ; task id
|
||||
|
||||
mov al,[bp+si+0x04]
|
||||
call mm_type
|
||||
push ax ; memory type
|
||||
|
||||
mov bx,cx
|
||||
add cx,[bp+si+0x00]
|
||||
mov ax,cx
|
||||
dec ax
|
||||
push ax ; end addr
|
||||
push bx ; start addr
|
||||
|
||||
mov si,.linefmt
|
||||
call kprintf
|
||||
|
||||
pop ax
|
||||
pop ax
|
||||
pop ax
|
||||
pop ax
|
||||
pop ax
|
||||
pop si
|
||||
|
||||
; look for next line
|
||||
mov ax,[bp+si+0x02]
|
||||
test ax,0xFFFF
|
||||
mov si,ax
|
||||
jnz .loop
|
||||
ret
|
||||
.linefmt:
|
||||
db "%X0 %XF %c %x %s", 0
|
||||
|
||||
; pre-filled table for memory management
|
||||
align 16
|
||||
memtab:
|
||||
; interrupt vector table
|
||||
dw 0x0040
|
||||
dw 0x0010
|
||||
db 3
|
||||
db 0
|
||||
db "IVT", 0
|
||||
align 16
|
||||
; bios data area (writes here during runtime)
|
||||
dw 0x0010
|
||||
dw 0x0020
|
||||
db 3
|
||||
db 0
|
||||
db "BIOS DATA", 0
|
||||
align 16
|
||||
dw 0x9FB0
|
||||
dw 0x0030
|
||||
db 1
|
||||
db 0
|
||||
db 0
|
||||
align 16
|
||||
dw 0x2000
|
||||
dw 0x0040
|
||||
db 4
|
||||
db 0
|
||||
db "I/O BUS", 0
|
||||
align 16
|
||||
dw 0x3000
|
||||
dw 0x0050
|
||||
db 4
|
||||
db 0
|
||||
db "BIOS EXT", 0
|
||||
align 16
|
||||
dw 0x1000
|
||||
dw 0x0000
|
||||
db 4
|
||||
db 0
|
||||
db "BIOS", 0
|
Loading…
Reference in New Issue
Block a user