Revert "Remove unused stuff"
debug rom still uses printf
This reverts commit a9fa3d355e
.
This commit is contained in:
parent
a9fa3d355e
commit
dc5e437c2d
0
.gitmodules
vendored
Normal file
0
.gitmodules
vendored
Normal file
53
lib/dump.asm
Normal file
53
lib/dump.asm
Normal file
@ -0,0 +1,53 @@
|
||||
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
|
65
lib/earlymcb.asm
Normal file
65
lib/earlymcb.asm
Normal file
@ -0,0 +1,65 @@
|
||||
%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
|
46
lib/fcbparse.asm
Normal file
46
lib/fcbparse.asm
Normal file
@ -0,0 +1,46 @@
|
||||
; 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
|
14
lib/fdc.asm
Normal file
14
lib/fdc.asm
Normal file
@ -0,0 +1,14 @@
|
||||
; 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
|
15
lib/log2.asm
Normal file
15
lib/log2.asm
Normal file
@ -0,0 +1,15 @@
|
||||
; 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
|
124
lib/nasmcomp.asm
Normal file
124
lib/nasmcomp.asm
Normal file
@ -0,0 +1,124 @@
|
||||
; 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
|
142
lib/opcode80.asm
Normal file
142
lib/opcode80.asm
Normal file
@ -0,0 +1,142 @@
|
||||
; 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
|
30
lib/popcnt.asm
Normal file
30
lib/popcnt.asm
Normal file
@ -0,0 +1,30 @@
|
||||
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
|
32
lib/print.asm
Normal file
32
lib/print.asm
Normal file
@ -0,0 +1,32 @@
|
||||
; 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
|
105
lib/printf.asm
Normal file
105
lib/printf.asm
Normal file
@ -0,0 +1,105 @@
|
||||
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"
|
Loading…
Reference in New Issue
Block a user