; All these functions assume DS=0 malloc_reserve: push bx call malloc_mark_allocated pop bx add bx, 0x10 loop malloc_reserve ret malloc_reset: xor ax, ax mov es, ax call malloc_get_table mov cx, 0x100 ; 256 words rep stosw ; reserve IVT and BDA xor bx, bx mov cx, 0x50 call malloc_reserve ; reserve malloc table itself mov bx, 0x0600 mov cx, 0x20 call malloc_reserve ; reserve location for chainloaded boot sector mov bx, 0x7C00 mov cx, 0x20 call malloc_reserve ret ; Input: ; 0:BX - ptr to mem paragraph ; Output: ; AL - bitmask for byte in table ; BX - offset in table malloc_calc_offsets: ; ch is bit offset ; cl is operand for bit shifts push cx ; strip last 4 bits (offset within paragraph) mov cl, 4 shr bx, cl ; backup the next 3 bits of bx (wll be bit offset) mov ch, bl and ch, 0x07 ; calculate byte offset by shifting off 3 bits mov cl, 3 shr bx, cl ; setup bit mask in al, shifted by bit offset mov al, 0x01 mov cl, ch shl al, cl pop cx ; fallthrough to setup DI malloc_get_table: mov di, 0x0600 ret ; IN: 0:BX ptr to paragraph to be marked as allocated malloc_mark_allocated: call malloc_calc_offsets or byte [bx+di], al ret ; IN: 0:BX ptr to paragraph to be marked as free malloc_mark_free: call malloc_calc_offsets not al and byte [bx+di], al ret malloc_dump: call malloc_get_table mov si, di mov cx, 0x200 xor dx, dx .loop: lodsb call print8 xor ah, ah call popcnt add dx, ax loop .loop mov cl, 6 shr dx, cl push dx call printf db " data %UkB", 0x0A, 0x0D, 0x00 pop dx ret