diff --git a/com/@rdos.asm b/com/@rdos.asm deleted file mode 100644 index 2ce5368..0000000 --- a/com/@rdos.asm +++ /dev/null @@ -1,32 +0,0 @@ - org 0x100 - - jmp init - -%defstr V VERSION -banner: db "RDOS KERNEL ", V, 0x0A, 0x0D, '$', 0x1A - -%include "kernel/far.asm" -%include "kernel/char.asm" -%include "kernel/drive.asm" -%include "kernel/fat.asm" - -section .text - -init: call rstseg - call dinit - - mov dx, banner - call puts - - mov dl, 0 - call select - - mov dx, 3 - call setclus - call rdfat - mov dx, bx - inc dx - call wdfat - -hlt: hlt - jmp hlt diff --git a/com/a86.asm b/com/a86.asm deleted file mode 100644 index 2c50896..0000000 --- a/com/a86.asm +++ /dev/null @@ -1,144 +0,0 @@ - org 0x100 - - jmp init - -fcb1 equ 0x5C -eof equ 0x1A -stack equ 0x10 ; stack size - -dumpax push ax - push cx - push dx - mov dx, ax - call dmpdx0 - mov al, 0x0A - call dmpdx3 - mov al, 0x0D - call dmpdx3 - pop dx - pop cx - pop ax - ret -dmpdx0 mov ah, 0xe - mov cl, 4 - ; this double-call is essentially a 4 times repeating loop - call dmpdx1 -dmpdx1: call dmpdx2 -dmpdx2: ; grab highest nibble from dx - mov al, dh - ; remove highest nibble from dx - shl dx, cl - ; shift away second-highest nibble that we accidentally copied - shr al, cl - ; map 0-9 to ascii codes for '0' to '9' - add al, 0x30 - ; if result is larger than '9', ... - cmp al, 0x3a - jl dmpdx3 - ; ... add 7 so we continue at 'A' - add al, 7 -dmpdx3: int 0x10 - ret - -free dw 0 ; free ram size -lncnt dw 0 ; line count -rdptr dw 0xFFFF ; infile blk ptr - -getc mov bx, [rdptr] - cmp bx, 0x80 - jc l01 - mov ah, 0x14 - mov dx, fcb1 - int 0x21 - cmp al, 1 - je l02 - mov bx, 0 -l01 mov al, [0x80+bx] - cmp al, eof - je l02 - cmp al, 0 - je l02 - cmp al, 0x0A - jne l01b - inc word [lncnt] -l01b inc bx - mov [rdptr], bx - jmp l03 -l02 mov al, 0x1A -l03 cmp al, eof - ret - -newlin mov dl, 0x0A - mov ah, 2 - int 0x21 - mov dl, 0x0D - int 0x21 - ret - -error mov dl, [bx] - mov ah, 2 - int 0x21 - inc bx - cmp dl, 0x20 - jne error - mov ax, [lncnt] - call dumpax - call newlin - int 0x20 - -e_eof db "EOF " -e_dup db "DUPSYM " - -tok1: -s_ws db " " ; also used for tabs -s_com db "," -s_obr db "[" -s_cbr db "]" -s_plu db "+" -s_min db "-" - - align 2 -tok2: -reg8 db "AL","CL","DL","BL","AH","CH","DH","BH" -reg16 db "AX","CX","DX","BX","SP","BP","SI","DI" -sreg db "ES","CS","SS","DS" -s_db db "DB" -s_dw db "DW" - -tok3: -s_org db "ORG" -s_equ db "EQU" - - ; TODO: parse a line into wordlist of tokens and ptrs to strings -rline: ret - - ; clear symbol table -main mov byte [init], 0 - call rline - int 0x20 - - align 16 - - ; stuff behind here gets overwritten - ; by symbol table and program data - -init mov ax, [6] - mov dx, sp - sub dx, stack - cmp ax, dx - jc il01 - mov ax, dx -il01 sub ax, init - shr ax, 1 - and ax, 0xFFF0 - mov [free], ax - ; open input file - mov ah, 0x0F - mov dx, fcb1 - int 0x21 - mov bx, e_op - test al, al - jnz error - jmp main - -e_op db "NOFILE " diff --git a/inc/booterr.asm b/inc/booterr.asm deleted file mode 100644 index fc83e3a..0000000 --- a/inc/booterr.asm +++ /dev/null @@ -1,28 +0,0 @@ -errcll: ; put return address into dx - pop dx -errjmp: call dmpdx - xor ax, ax - int 0x16 - int 0x19 -dmpdx: ; setup bx and ah for int 10h call - xor bx, bx - mov ah, 0x0e - mov cl, 4 - ; this double-call is essentially a 4 times repeating loop - call dmpdx1 -dmpdx1: call dmpdx2 -dmpdx2: ; grab highest nibble from dx - mov al, dh - ; remove highest nibble from dx - shl dx, cl - ; shift away second-highest nibble that we accidentally copied - shr al, cl - ; map 0-9 to ascii codes for '0' to '9' - add al, 0x30 - ; if result is larger than '9', ... - cmp al, 0x3a - jl dmpdx3 - ; ... add 7 so we continue at 'A' - add al, 7 -dmpdx3: int 0x10 - ret diff --git a/inc/bpb.asm b/inc/bpb.asm deleted file mode 100644 index ba80e22..0000000 --- a/inc/bpb.asm +++ /dev/null @@ -1,26 +0,0 @@ -BPBOFF equ 0xB - -; DOS 2.0 BPB -BPBSS equ 0 ; word -BPBSC equ 2 ; byte -BPBRSC equ 3 ; word -BPBFN equ 5 ; byte -BPBRDE equ 6 ; word -BPBTS equ 8 ; word -BPBMD equ 10 ; byte -BPBFS equ 11 ; word -BPBSIZ2 equ 13 ; size constant - -; DOS 3.31 BPB -BPBSPT equ 0x0D ; word -BPBNOS equ 0x0F ; word -BPBHS equ 0x11 ; dword -BPBLTS equ 0x15 ; dword -BPBSIZ3 equ 25 ; size constant - -; DOS 3.4 EBPB -BPBDN equ 0x19 ; byte -BPBFALG equ 0x1A ; byte -BPBSIG equ 0x1B ; byte -BPBSER equ 0x1C ; dword serial number -BPBSIZ4 equ 32 ; size constant diff --git a/inc/mbr.asm b/inc/mbr.asm deleted file mode 100644 index b423d24..0000000 --- a/inc/mbr.asm +++ /dev/null @@ -1,11 +0,0 @@ -mbrtab: equ 0x1BE ; start of partition table -mbrsig: equ 0x1FE ; start of signature -mbrmn: equ 0x55AA ; signature value - -pardn: equ 0x00 ; byte: partition active flag -parchs: equ 0x01 ; 3 bytes: CHS for first sector -partyp: equ 0x04 ; byte: partition type -parend: equ 0x05 ; 3 bytes: CHS for last sector -paroff: equ 0x08 ; dword: partition offset in sectors -parlen: equ 0x0C ; dword: partition length in sectors -parsiz: equ 0x10 diff --git a/lib/dump.asm b/lib/dump.asm deleted file mode 100644 index 5ad8cec..0000000 --- a/lib/dump.asm +++ /dev/null @@ -1,53 +0,0 @@ -dump: - push ax - push cx - push dx - push bx - mov al, 0x0A - call putc - mov al, 0x0D - call putc - mov cx, 4 -.loop_line: - push cx - push bx - mov ax, bx - call print16 - mov al, ':' - call putc - mov al, ' ' - call putc - mov cx, 0x8 -.loop_bin: - mov ax, [bx] - xchg al, ah - inc bx - inc bx - call print16 - mov dl, ' ' - call CONOUT - loop .loop_bin - pop bx - mov cx, 0x10 -.loop_ascii: - mov dl, '.' - cmp byte [bx], 0x20 - jc .print - cmp byte [bx], 0x80 - jnc .print - mov dl, [bx] -.print: - inc bx - call CONOUT - loop .loop_ascii - pop cx - mov dl, 0x0A - call CONOUT - mov dl, 0x0D - call CONOUT - loop .loop_line - pop bx - pop dx - pop cx - pop ax - ret diff --git a/lib/earlymcb.asm b/lib/earlymcb.asm deleted file mode 100644 index 6a12438..0000000 --- a/lib/earlymcb.asm +++ /dev/null @@ -1,65 +0,0 @@ -%define mcb_first 0x5F - -; This alloc uses an MCB-like list always starting at a fixed offset. -; Boot components may use it to allocate space during early boot. -; The list ends with the most recently allocated arena at its end, -; contrary to how the MCBs work on DOS. - -; Memory Layout: -; 0000 Interrupt table -; 0400 BIOS data area -; 05F0 16 bytes Arena header 1 -; 0600 BX paragraphs Arena 1 -; .... 16 bytes Arena header 2 -; .... BX paragraphs Arena 2 -; ... -; .... 16 bytes Arena header n -; .... BX paragraphs Arena n -; Unmanaged memory - -; Take note that this mechanism works differently than under DOS - -; but this one is optimized for fast and small alloc. - -; Typical usecases: -; - Diskette Parameter Table (See interrupt 1Eh) -; - Partition table -; - Boot sector relocations -; - Boot sector data (FAT table, rootdir) - -; Allocate paragraphs in unmanaged memory -; IN BX requested memory in paragraphs -; OUT AX output segment -early_alloc: - push ds - push bx - push si - ; si is used as zero register - ; this allows the opcodes to use a byte as disp instead of word - xor si, si - mov ax, mcb_first -.next: - mov ds, ax - inc ax - ; DS is seg of arena header - ; AX is seg of arena - cmp BYTE [si], 0x4D - jne .here - add ax, WORD [si+3] - jmp .next -.here: - ; mark as item - mov BYTE [si], 0x4D - ; write segment length in paragraphs - mov WORD [si+3], bx - ; if allocation is higher than CS, then we are in managed memory - ; set ourself as owner then, otherwise use dummy value 8 - mov bx, cs - cmp ax, bx ; CF = CS in unmanaged memory - jnc .setup_owner - mov bx, 8 -.setup_owner: - mov WORD [si+1], bx - pop si - pop bx - pop ds - ret diff --git a/lib/fcbparse.asm b/lib/fcbparse.asm deleted file mode 100644 index eee48d7..0000000 --- a/lib/fcbparse.asm +++ /dev/null @@ -1,46 +0,0 @@ -; Parse ASCIIZ string into FCB -; IN SI ptr to filename -; BX ptr to FCB -fcb_parse: - push di - push ax - mov di, bx - xor ax, ax - stosb -.cleanout: - push di - mov cx, 0x0A - mov al, 0x20 - rep stosb - pop di -.base_loop: - call .read - cmp al, 0x2E - je .ext_start - cmp al, 0x20 - je .ret - stosb - jmp .base_loop -.ext_start: - mov di, bx - add di, 9 -.ext_loop: - call .read - cmp al, 0x20 - je .ret - stosb - jmp .ext_loop -.read: - lodsb - test al, al - jz .eret - cmp al, 0x0D - je .eret - ret -.eret: - dec si - pop ax -.ret: - pop ax - pop di - ret diff --git a/lib/fdc.asm b/lib/fdc.asm deleted file mode 100644 index dbb21e6..0000000 --- a/lib/fdc.asm +++ /dev/null @@ -1,14 +0,0 @@ -; FDC Descriptor / BIOS parameter block -fdc_ss: equ 0x0B ; WORD sector size -fdc_sc: equ 0x0D ; BYTE sectors per cluster -fdc_rsc: equ 0x0E ; WORD reserved sectors -fdc_fn: equ 0x10 ; BYTE FAT tables -fdc_rde: equ 0x11 ; WORD root directory entries -fdc_ts: equ 0x13 ; WORD total sector count - ; 0 if >65535, use lrgts then -fdc_mi: equ 0x15 ; BYTE media descriptor byte -fdc_sf: equ 0x16 ; WORD sectors per FAT -fdc_spt: equ 0x18 ; WORD sectors per track -fdc_nos: equ 0x1A ; WORD sides/heads -fdc_po: equ 0x1C ; DWORD partition offset -fdc_lrgts: equ 0x20 ; DWORD large sector count diff --git a/lib/log2.asm b/lib/log2.asm deleted file mode 100644 index b61dbd9..0000000 --- a/lib/log2.asm +++ /dev/null @@ -1,15 +0,0 @@ -; Calculate dual logarithm (int) -; IN AX number -; OUT AX dual logarithm -log2: - push cx - mov cx, 15 -.loop: - rcl ax, 1 - jc .ret - loop .loop -.ret: - cmc - mov ax, cx - pop cx - ret diff --git a/lib/nasmcomp.asm b/lib/nasmcomp.asm deleted file mode 100644 index 4fbebf8..0000000 --- a/lib/nasmcomp.asm +++ /dev/null @@ -1,124 +0,0 @@ -; Pseudo-Instruction: fill bytes until offset -%macro pad 1.nolist -times (%1 - ($-$$)) nop -%endmacro - -; REGISTERS -%define a al -%define b ch -%define c cl -%define d dh -%define e dl -%define h bh -%define l bl -%define m byte [bx] - -; REGISTER PAIRS -%define bc cx -%define de dx -%define hl bx - -; INSTRUCTIONS -; data movement -; 'mov' can stay literal -%define mvi mov -%define lxi mov -%macro lda 1 - mov al, byte [%1] -%endmacro -%macro sta 1 - mov byte [%1], al -%endmacro -%macro lhld 1 - mov bx, word [%1] -%endmacro -%macro shld 1 - mov word [%1], bx -%endmacro -%macro ldax 1 - mov al, byte [%1] -%endmacro -%macro stax 1 - mov byte [%1], al -%endmacro -%macro xchg 1 - xchg dx, bx -%endmacro -; addition -%macro add 1 - add al, %1 -%endmacro -%macro adi 1 - add al, %1 -%endmacro -%macro adc 1 - adc al, %1 -%endmacro -%macro aci 1 - adc al, %1 -%endmacro -; subtraction -%macro sub 1 - sub al, %1 -%endmacro -%macro sui 1 - sub al, %1 -%endmacro -%macro sbb 1 - sub al, %1 -%endmacro -%macro sbi 1 - sub al, %1 -%endmacro -; increment / decrement -%define inr inc -%define dcr dec -%define inx inc -%define dcx dec -; pointer arithmetic -%macro dad 1 - add bx, %1 -%endmacro -; 'daa' stays literal - -;ANA S 10100SSS ZSCPA AND register with A -;ANI # 11100110 db ZSPCA AND immediate with A -;ORA S 10110SSS ZSPCA OR register with A -;ORI # 11110110 ZSPCA OR immediate with A -;XRA S 10101SSS ZSPCA ExclusiveOR register with A -;XRI # 11101110 db ZSPCA ExclusiveOR immediate with A - -;CMP S 10111SSS ZSPCA Compare register with A -;CPI # 11111110 ZSPCA Compare immediate with A - -;RLC 00000111 C Rotate A left -;RRC 00001111 C Rotate A right -;RAL 00010111 C Rotate A left through carry -;RAR 00011111 C Rotate A right through carry -;CMA 00101111 - Compliment A -;CMC 00111111 C Compliment Carry flag -;STC 00110111 C Set Carry flag -;JMP a 11000011 lb hb - Unconditional jump -;Jccc a 11CCC010 lb hb - Conditional jump -;CALL a 11001101 lb hb - Unconditional subroutine call -;Cccc a 11CCC100 lb hb - Conditional subroutine call -;RET 11001001 - Unconditional return from subroutine -;Rccc 11CCC000 - Conditional return from subroutine -;RST n 11NNN111 - Restart (Call n*8) -;PCHL 11101001 - Jump to address in H:L -;PUSH RP 11RP0101 *2 - Push register pair on the stack -;POP RP 11RP0001 *2 *2 Pop register pair from the stack -;XTHL 11100011 - Swap H:L with top word on stack -;SPHL 11111001 - Set SP to content of H:L -;IN p 11011011 pa - Read input port into A -;OUT p 11010011 pa - Write A to output port -;EI 11111011 - Enable interrupts -;DI 11110011 - Disable interrupts -;HLT 01110110 - Halt processor -;NOP 00000000 - No operation - -%macro cnz 1 - jz %%skip - call near %1 -%%skip: -%endmacro diff --git a/lib/opcode80.asm b/lib/opcode80.asm deleted file mode 100644 index 1334f61..0000000 --- a/lib/opcode80.asm +++ /dev/null @@ -1,142 +0,0 @@ -; BYTE name length -; n BYTES name -; BYTE opcode template (variable parts zero) -; -; BYTE operand 1 -; BYTE operand 2 - -; operand types: -; 0x00 none -; 0x1n reg8, opcode |= (reg8 << n) -; 0x2n reg16, opcode |= (reg8 << n) -; 0x3n reg16b, opcode |= (reg8 << n) -; 0x7n 3-bit number, opcode |= (num << n) -; 0x80 imm8, encoded as extra byte -; 0x81 imm16, encoded as extra word - -registers: -.reg8: - db "B", 0 - db "C", 0 - db "D", 0 - db "E", 0 - db "H", 0 - db "L", 0 - db "M", 0 - db 0 -.reg16: - db "BC", 0 - db "DE", 0 - db "HL", 0 - db "SP", 0 - db 0 -.reg16b: - db "BC", 0 - db "DE", 0 - db "HL", 0 - db "AF", 0 - db 0 -.end: - db 0 - -opcodes: - ; Data movement - db 3, "MOV", 0b01000000, 0x13, 0x10 - db 3, "MVI", 0b00000110, 0x13, 0x80 - db 3, "LXI", 0b00000001, 0x24, 0x81 - db 3, "LDA", 0b00111010, 0x81, 0x00 - db 3, "STA", 0b00110010, 0x81, 0x00 - db 4, "LHLD", 0b00101010, 0x81, 0x00 - db 4, "SHLD", 0b00100010, 0x81, 0x00 - db 4, "LDAX", 0b00001010, 0x24, 0x00 - db 4, "STAX", 0b00000010, 0x24, 0x00 - db 4, "XCHG", 0b11101011, 0x00, 0x00 - - ; Addition / Subtraction - db 3, "ADD", 0b10000000, 0x10, 0x00 - db 3, "ADI", 0b11000110, 0x80, 0x00 - db 3, "ADC", 0b10001000, 0x10, 0x00 - db 3, "ACI", 0b11001110, 0x80, 0x00 - db 3, "SUB", 0b10010000, 0x10, 0x00 - db 3, "SUI", 0b11010110, 0x80, 0x00 - db 3, "SBB", 0b10011000, 0x10, 0x00 - db 3, "SBI", 0b11011110, 0x80, 0x00 - db 3, "INR", 0b00000100, 0x13, 0x00 - db 3, "DCR", 0b00000101, 0x13, 0x00 - db 3, "INX", 0b00000011, 0x24, 0x00 - db 3, "DCX", 0b00001011, 0x24, 0x00 - db 3, "DAD", 0b00001001, 0x24, 0x00 - - ; BCD - db 3, "DAA", 0b00100111, 0x00, 0x00 - - ; Bitwise operations - db 3, "ANA", 0b10100000, 0x10, 0x00 - db 3, "ANI", 0b11100110, 0x80, 0x00 - db 3, "ORA", 0b10110000, 0x10, 0x00 - db 3, "ORI", 0b11110110, 0x80, 0x00 - db 3, "XRA", 0b10101000, 0x10, 0x00 - db 3, "XRI", 0b11101110, 0x80, 0x00 - db 3, "CMP", 0b10111000, 0x10, 0x00 - db 3, "CPI", 0b11111110, 0x80, 0x00 - - ; Rotate - db 3, "RLC", 0b00000111, 0x00, 0x00 - db 3, "RRC", 0b00001111, 0x00, 0x00 - db 3, "RAL", 0b00010111, 0x00, 0x00 - db 3, "RAR", 0b00011111, 0x00, 0x00 - - ; Complement - db 3, "CMA", 0b00101111, 0x00, 0x00 - db 3, "CMC", 0b00111111, 0x00, 0x00 - db 3, "STC", 0b00110111, 0x00, 0x00 - - ; Jump - db 3, "JMP", 0b11000011, 0x81, 0x00 - db 3, "JNZ", 0b11000010, 0x81, 0x00 - db 2, "JZ", 0b11001010, 0x81, 0x00 - db 3, "JNC", 0b11010010, 0x81, 0x00 - db 2, "JC", 0b11011010, 0x81, 0x00 - db 3, "JPO", 0b11100010, 0x81, 0x00 - db 3, "JPE", 0b11101010, 0x81, 0x00 - db 2, "JP", 0b11110010, 0x81, 0x00 - db 2, "JM", 0b11111010, 0x81, 0x00 - - ; Call - db 4, "CALL", 0b11001101, 0x81, 0x00 - db 3, "CNZ", 0b11000100, 0x81, 0x00 - db 2, "CZ", 0b11001100, 0x81, 0x00 - db 3, "CNC", 0b11010100, 0x81, 0x00 - db 2, "CC", 0b11011100, 0x81, 0x00 - db 3, "CPO", 0b11100100, 0x81, 0x00 - db 3, "CPE", 0b11101100, 0x81, 0x00 - db 2, "CP", 0b11110100, 0x81, 0x00 - db 2, "CM", 0b11111100, 0x81, 0x00 - - ; Return - db 3, "RET", 0b11001001, 0x00, 0x00 - db 3, "RNZ", 0b11000000, 0x00, 0x00 - db 2, "RZ", 0b11001000, 0x00, 0x00 - db 3, "RNC", 0b11010000, 0x00, 0x00 - db 2, "RC", 0b11011000, 0x00, 0x00 - db 3, "RPO", 0b11100000, 0x00, 0x00 - db 3, "RPE", 0b11101000, 0x00, 0x00 - db 2, "RP", 0b11110000, 0x00, 0x00 - db 2, "RM", 0b11111000, 0x00, 0x00 - - db 3, "RST", 0b11000111, 0x73, 0x00 - db 4, "PCHL", 0b11101001, 0x00, 0x00 - db 4, "PUSH", 0b11000101, 0x34, 0x00 - db 3, "POP", 0b11000001, 0x34, 0x00 - db 4, "XTHL", 0b11100011, 0x00, 0x00 - db 4, "SPHL", 0b11111001, 0x00, 0x00 - - db 2, "IN", 0b11011011, 0x80, 0x00 - db 3, "OUT", 0b11010011, 0x80, 0x00 - - db 2, "EI", 0b11111011, 0x00, 0x00 - db 2, "DI", 0b11110011, 0x00, 0x00 - db 3, "HLT", 0b01110110, 0x00, 0x00 - db 3, "NOP", 0b00000000, 0x00, 0x00 - - db 0 diff --git a/lib/popcnt.asm b/lib/popcnt.asm deleted file mode 100644 index d03694a..0000000 --- a/lib/popcnt.asm +++ /dev/null @@ -1,30 +0,0 @@ -popcnt: - push bx - push cx - - mov bx, ax - and ax, 0x5555 ; 8x 01 - and bx, 0xaaaa ; 8x 10 - shr bx, 1 - add ax, bx - - mov bx, ax - and ax, 0x3333 ; 4x 0011 - and bx, 0xcccc ; 4x 1100 - mov cl, 2 - shr bx, cl - add ax, bx - - mov bx, ax - and ax, 0x0f0f ; 2x 00001111 - and bx, 0xf0f0 ; 2x 11110000 - mov cl, 4 - shr bx, cl - add ax, bx - - add al, ah - xor ah, ah - - pop cx - pop bx - ret diff --git a/lib/print.asm b/lib/print.asm deleted file mode 100644 index 582e48d..0000000 --- a/lib/print.asm +++ /dev/null @@ -1,32 +0,0 @@ -; important functions in this file: kprintf - -; print a word -; in: ax -print16: - xchg ah,al - call print8 - xchg ah,al - -; print a byte -; in: al -print8: - push ax ; avoid destroying ah - push bx - xor bx, bx - aam 16 ; high nibble moved into ah, low nibble into al - add ax, 0x3030 - push ax - xchg al, ah - call .nib - pop ax - call .nib - pop bx - pop ax - ret -.nib: - cmp al, 0x3a - jl .out - add al, 0x07 -.out: - call putc - ret diff --git a/lib/printf.asm b/lib/printf.asm deleted file mode 100644 index 9584c70..0000000 --- a/lib/printf.asm +++ /dev/null @@ -1,105 +0,0 @@ -printf: - cld - pop si - push bp - mov bp, sp -.loop: - mov al, [cs:si] - inc si - cmp al, 0x00 - je .end - cmp al, 0x25 - je .handle_25h -.literal: - call putc - jmp .loop -.end: - pop bp - push si - ret -.handle_25h: - mov al, [cs:si] - inc si - cmp al, 0x25 - je .literal - cmp al, 0x58 ; 'X' - je .printhex - cmp al, 0x55 ; 'U' - je .printdec - cmp al, 0x53 ; 'S' - je .printstr - mov al, 0x3F - jmp .literal -.printhex: - add bp, 2 - mov ax, [bp] - mov bx, 0x0010 - call print_number - jmp .loop -.printdec: - add bp, 2 - mov ax, [bp] - mov bx, 0x000A - call print_number - jmp .loop -.printstr: - add bp, 2 - mov ax, [bp] - call print_string - jmp .loop - -; converts a integer to ascii -; in ax input integer -; bx base -; cx minimum number of digits -; out bx garbled -; dx garbled -print_number_padded: - xor dx, dx - div bx - push dx - dec cx - jz .nopad - call print_number_padded - jmp print_number.end -.nopad: - call print_number - jmp print_number.end - -; converts a integer to ascii -; in ax input integer -; bx base -; out bx garbled -; dx garbled -print_number: - xor dx, dx - div bx ; ax = dx:ax / 10, dx = dx:ax % 10 - push dx - and ax, ax - jz .end - call print_number -.end: - pop bx - xor bh, bh - add bx, print_chars - mov al, [cs:bx] - call putc - ret - -; putc's a string -; in DS:AX null-terminated string -print_string: - push si - mov si, ax -.loop: - lodsb - cmp al, 0x00 - je .end - call putc - jmp .loop -.end: - pop si - ret - -print_chars: - db "0123456789ABCDEF" \ No newline at end of file