2019-03-10 23:38:32 +01:00
|
|
|
; memory type is enum
|
|
|
|
; 00 - free
|
|
|
|
; 01 - unknown
|
|
|
|
; 02 - allocated by us
|
|
|
|
; 03 - reserved, like BIOS code or tables for the cpu
|
|
|
|
; 04 - unusable
|
|
|
|
|
2019-03-11 01:21:19 +01:00
|
|
|
; return the addr of the mtab
|
|
|
|
; out: es:bx
|
|
|
|
mtab_ref:
|
2019-03-10 23:38:32 +01:00
|
|
|
push cs
|
2019-03-11 01:21:19 +01:00
|
|
|
pop es
|
|
|
|
mov bx,mtab
|
2019-03-10 23:38:32 +01:00
|
|
|
ret
|
|
|
|
|
|
|
|
; finds a place for a new item in the mm table
|
2019-03-11 01:21:19 +01:00
|
|
|
; out: bx
|
|
|
|
mtab_alloc:
|
2019-03-10 23:38:32 +01:00
|
|
|
push ax
|
2019-03-11 01:21:19 +01:00
|
|
|
call mtab_ref
|
2019-03-10 23:38:32 +01:00
|
|
|
.loop:
|
2019-03-11 01:21:19 +01:00
|
|
|
cmp WORD [es:bx],0x0000
|
2019-03-10 23:38:32 +01:00
|
|
|
je .end
|
2019-03-11 01:21:19 +01:00
|
|
|
add bx,0x0010
|
2019-03-10 23:38:32 +01:00
|
|
|
jmp .loop
|
|
|
|
.end:
|
|
|
|
pop ax
|
|
|
|
ret
|
|
|
|
|
|
|
|
; in: ax: segment
|
2019-03-11 01:21:19 +01:00
|
|
|
; bh: task id (0 for non-task memory)
|
|
|
|
; bl: memory type (see enum at top of file)
|
|
|
|
; cx: number of 16-byte blocks
|
|
|
|
mtab_set:
|
2019-03-10 23:38:32 +01:00
|
|
|
push ds
|
2019-03-11 01:21:19 +01:00
|
|
|
push cx ; length of current item
|
|
|
|
push dx ; cumulative position
|
|
|
|
push bx ; pointer to mtab item
|
|
|
|
|
|
|
|
call mtab_ref
|
|
|
|
mov dx,0x0000
|
|
|
|
push bx ; use as iterator, restoring base value afterwards
|
|
|
|
.findbase: ; we pick the mtab item where our segment lies in
|
|
|
|
mov cx,[es:bx]
|
|
|
|
add dx,cx
|
|
|
|
cmp dx,ax
|
|
|
|
jnbe .dupbase
|
|
|
|
add bx,0x0010
|
|
|
|
jmp .findbase
|
|
|
|
.dupbase: ; we duplicate it, so we potentially have one after and one before our new item
|
|
|
|
mov si,bx
|
|
|
|
call mtab_alloc
|
|
|
|
mov di,bx
|
|
|
|
pop bx
|
|
|
|
|
|
|
|
push si ; backup because movsw increments them
|
|
|
|
push di ; ^
|
|
|
|
push cx ; counter for movsb
|
|
|
|
mov cx,0x08 ; a mtab item is 8 words = 16 bytes
|
|
|
|
push es
|
|
|
|
pop ds
|
|
|
|
rep movsw
|
2019-03-10 23:38:32 +01:00
|
|
|
pop cx
|
2019-03-11 01:21:19 +01:00
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
.resizebase1:
|
|
|
|
push ax ; size = [Segment ax] - ([End addr dx] - [Length cx])
|
|
|
|
sub ax,dx
|
|
|
|
add ax,cx
|
|
|
|
mov [si],ax
|
|
|
|
pop ax
|
|
|
|
.resizebase2:
|
|
|
|
push dx
|
|
|
|
sub dx,ax
|
|
|
|
mov [di],dx
|
|
|
|
pop dx
|
|
|
|
.insert:
|
|
|
|
push bx
|
|
|
|
call mtab_alloc
|
|
|
|
mov dx,bx
|
|
|
|
pop bx
|
|
|
|
.base1_link:
|
|
|
|
push ax
|
|
|
|
mov ax,dx
|
|
|
|
sub ax,bx ; addr are relative to mtab start
|
|
|
|
mov [si+02],ax
|
|
|
|
pop ax
|
|
|
|
.new_link:
|
|
|
|
push ax
|
|
|
|
mov ax,di
|
|
|
|
sub ax,bx ; addr are relative to mtab start
|
|
|
|
mov di,dx
|
|
|
|
mov [di+02],ax
|
|
|
|
pop ax
|
|
|
|
|
|
|
|
pop bx
|
|
|
|
mov [di+04],bx
|
2019-03-10 23:38:32 +01:00
|
|
|
|
|
|
|
pop dx
|
2019-03-11 01:21:19 +01:00
|
|
|
pop cx
|
|
|
|
|
|
|
|
pop ds
|
2019-03-10 20:23:09 +01:00
|
|
|
ret
|
|
|
|
|
2019-03-11 01:21:19 +01:00
|
|
|
mtab_dump:
|
2019-03-10 20:23:09 +01:00
|
|
|
push cs
|
|
|
|
pop ds
|
|
|
|
mov cx,0x0000
|
2019-03-11 01:21:19 +01:00
|
|
|
mov bp,mtab
|
2019-03-10 20:23:09 +01:00
|
|
|
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]
|
2019-03-10 23:38:32 +01:00
|
|
|
push bp
|
|
|
|
push si
|
|
|
|
mov bp,.typechar
|
|
|
|
and ax,0x00FF
|
|
|
|
mov si,ax
|
|
|
|
mov al,[bp+si]
|
|
|
|
pop si
|
|
|
|
pop bp
|
2019-03-10 20:23:09 +01:00
|
|
|
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
|
2019-03-10 23:38:32 +01:00
|
|
|
.typechar:
|
|
|
|
db "F?ARU", 0
|
2019-03-10 20:23:09 +01:00
|
|
|
|
|
|
|
; pre-filled table for memory management
|
|
|
|
align 16
|
2019-03-11 01:21:19 +01:00
|
|
|
mtab:
|
2019-03-10 20:23:09 +01:00
|
|
|
; 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
|
2019-03-10 23:38:32 +01:00
|
|
|
db "BDA", 0
|
2019-03-10 20:23:09 +01:00
|
|
|
align 16
|
|
|
|
dw 0x9FB0
|
|
|
|
dw 0x0030
|
2019-03-10 23:38:32 +01:00
|
|
|
db 0
|
2019-03-10 20:23:09 +01:00
|
|
|
db 0
|
|
|
|
db 0
|
|
|
|
align 16
|
2019-03-10 23:38:32 +01:00
|
|
|
dw 0x5000
|
2019-03-10 20:23:09 +01:00
|
|
|
dw 0x0040
|
|
|
|
db 4
|
|
|
|
db 0
|
|
|
|
db 0
|
|
|
|
align 16
|
|
|
|
dw 0x1000
|
|
|
|
dw 0x0000
|
|
|
|
db 4
|
|
|
|
db 0
|
2019-03-10 23:38:32 +01:00
|
|
|
db "BIOS ROM", 0
|
|
|
|
align 16
|
|
|
|
dw 0x0000
|
|
|
|
align 16
|
|
|
|
dw 0x0000
|
|
|
|
align 16
|
|
|
|
dw 0x0000
|
|
|
|
align 16
|
|
|
|
dw 0x0000
|