diff --git a/edlin.asm b/edlin.asm index 324c5bb..4162c4e 100644 --- a/edlin.asm +++ b/edlin.asm @@ -49,6 +49,18 @@ int_ctrl_break equ 0x23 %macro addw 2 db 0x03, 0xc0 + 8 * %1 + %2 %endmacro +%macro adcb 2 + db 0x12, 0xc0 + 8 * %1 + %2 +%endmacro +%macro cmpw 2 + db 0x3b, 0xc0 + 8 * %1 + %2 +%endmacro +%macro movw 2 + db 0x8b, 0xc0 + 8 * %1 + %2 +%endmacro +%macro movb 2 + db 0x8a, 0xc0 + 8 * %1 + %2 +%endmacro %macro orw 2 db 0x0b, 0xc0 + 8 * %1 + %2 %endmacro @@ -58,15 +70,12 @@ int_ctrl_break equ 0x23 %macro subw 2 db 0x2b, 0xc0 + 8 * %1 + %2 %endmacro +%macro subb 2 + db 0x2a, 0xc0 + 8 * %1 + %2 +%endmacro %macro xorw 2 db 0x33, 0xc0 + 8 * %1 + %2 %endmacro -%macro cmpw 2 - db 0x3b, 0xc0 + 8 * %1 + %2 -%endmacro -%macro movw 2 - db 0x8b, 0xc0 + 8 * %1 + %2 -%endmacro ; Sign extended byte to byte %macro cmpb_addr_ext 2 @@ -561,49 +570,79 @@ db 0x42 ; 04AC inc dx db 0x3B, 0xDA ; 04AD cmp bx,dx db 0x75, 0xF7 ; 04AF jnz 0x4a8 db 0xC3 ; 04B1 ret -db 0x53 ; 04B2 push bx -db 0xB0, 0x20 ; 04B3 mov al,0x20 -db 0xE8, 0x6C, 0x04 ; 04B5 call 0x924 -db 0xE8, 0x13, 0x00 ; 04B8 call 0x4ce -db 0xB0, 0x3A ; 04BB mov al,0x3a -db 0xE8, 0x64, 0x04 ; 04BD call 0x924 -db 0xB0, 0x2A ; 04C0 mov al,0x2a -db 0x5B ; 04C2 pop bx -db 0x3B, 0x1E, 0x90, 0x0A ; 04C3 cmp bx,[0xa90] -db 0x74, 0x02 ; 04C7 jz 0x4cb -db 0xB0, 0x20 ; 04C9 mov al,0x20 -db 0xE9, 0x56, 0x04 ; 04CB jmp 0x924 -db 0x33, 0xC0 ; 04CE xor ax,ax -db 0x8A, 0xD0 ; 04D0 mov dl,al -db 0xB9, 0x10, 0x00 ; 04D2 mov cx,0x10 -db 0xD1, 0xE3 ; 04D5 shl bx,1 -db 0x12, 0xC0 ; 04D7 adc al,al -db 0x27 ; 04D9 daa -db 0x86, 0xC4 ; 04DA xchg al,ah -db 0x12, 0xC0 ; 04DC adc al,al -db 0x27 ; 04DE daa -db 0x86, 0xC4 ; 04DF xchg al,ah -db 0x12, 0xD2 ; 04E1 adc dl,dl -db 0xE2, 0xF0 ; 04E3 loop 0x4d5 -db 0xB3, 0x10 ; 04E5 mov bl,0x10 -db 0x92 ; 04E7 xchg ax,dx -db 0xE8, 0x16, 0x00 ; 04E8 call 0x501 -db 0x8A, 0xC6 ; 04EB mov al,dh -db 0xE8, 0x02, 0x00 ; 04ED call 0x4f2 -db 0x8A, 0xC2 ; 04F0 mov al,dl -db 0x8A, 0xF0 ; 04F2 mov dh,al -db 0xD0, 0xE8 ; 04F4 shr al,1 -db 0xD0, 0xE8 ; 04F6 shr al,1 -db 0xD0, 0xE8 ; 04F8 shr al,1 -db 0xD0, 0xE8 ; 04FA shr al,1 -db 0xE8, 0x02, 0x00 ; 04FC call 0x501 -db 0x8A, 0xC6 ; 04FF mov al,dh -db 0x24, 0x0F ; 0501 and al,0xf -db 0x74, 0x02 ; 0503 jz 0x507 -db 0xB3, 0x00 ; 0505 mov bl,0x0 -db 0x04, 0x30 ; 0507 add al,0x30 -db 0x2A, 0xC3 ; 0509 sub al,bl -db 0xE9, 0x16, 0x04 ; 050B jmp 0x924 + +print_line_prefix: ; 04b2 + push bx + + mov al, ' ' + call print_char + call print_number + mov al, ':' + call print_char + mov al, '*' + + pop bx + + cmp bx, [current_line] + je .end + mov al, ' ' + + .end: jmp print_char + +print_number: ; 04ce + ; Input in bx + + ; Zero out the 5-digit BCD number + xorw r_ax, r_ax + movb r_dl, r_al + + mov cx, 16 + .loop: ; 04d5 + shl bx, 1 + + ; Double al (bcd), and add in carry out from the shift + adcb r_al, r_al + daa + ; Double ah (bcd) and propagate carry + xchg al, ah + adcb r_al, r_al + daa + xchg al, ah + ; Double dl (bcd) and propagate carry + adcb r_dl, r_dl + + loop .loop + +print_bcd: + ; Prints a 5-digit BCD number stored in DX:AX as such (x is ignored) + ; dh dl ah al + ; xx x1 23 45 + mov bl, '0' - ' ' ; If value is zero, replace with space + + xchg ax, dx + ; First digit, low nybble of dl + call print_bcd_digit + ; Next two digits, ah + movb r_al, r_dh + call print_bcd_byte + ; Final two digits, al + movb r_al, r_dl + +print_bcd_byte: ; 04f2 + movb r_dh, r_al + times 4 shr al, 1 + call print_bcd_digit + movb r_al, r_dh + +print_bcd_digit: ; 0501 + and al, 0xf + jz .to_ascii + mov bl, 0 ; Only apply replacement to zero values + + .to_ascii: + add al, '0' + subb r_al, r_bl + jmp print_char command_l: ; 050e db 0x8B, 0x1E, 0x80, 0x0A ; 050E mov bx,[0xa80]