From bed4ceaa1f85aa12413650e315d2a9d710fc7f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sat, 31 Jul 2021 00:50:18 +0300 Subject: [PATCH] Work on S command --- edlin.asm | 438 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 263 insertions(+), 175 deletions(-) diff --git a/edlin.asm b/edlin.asm index 4162c4e..3c0d01e 100644 --- a/edlin.asm +++ b/edlin.asm @@ -13,6 +13,7 @@ psp_segment_size equ 0x0006 psp_fcb_1 equ 0x005c ; Syscall defines +sys_read_char equ 1 sys_print_char equ 2 sys_print_string equ 9 sys_read_line equ 0xa @@ -55,6 +56,9 @@ int_ctrl_break equ 0x23 %macro cmpw 2 db 0x3b, 0xc0 + 8 * %1 + %2 %endmacro +%macro cmpb 2 + db 0x3a, 0xc0 + 8 * %1 + %2 +%endmacro %macro movw 2 db 0x8b, 0xc0 + 8 * %1 + %2 %endmacro @@ -76,6 +80,9 @@ int_ctrl_break equ 0x23 %macro xorw 2 db 0x33, 0xc0 + 8 * %1 + %2 %endmacro +%macro xorb 2 + db 0x32, 0xc0 + 8 * %1 + %2 +%endmacro ; Sign extended byte to byte %macro cmpb_addr_ext 2 @@ -537,6 +544,7 @@ db 0xF3, 0xA4 ; 0467 rep movsb db 0x4F ; 0469 dec di db 0x89, 0x3E, 0x9A, 0x0A ; 046A mov [0xa9a],di db 0xC7, 0x06, 0x90, 0x0A, 0x01, 0x00 ; 046E mov word [0xa90],0x1 +__0474: db 0xC3 ; 0474 ret db 0xB4, 0x10 ; 0475 mov ah,0x10 db 0xCD, 0x21 ; 0477 int 0x21 @@ -547,6 +555,7 @@ error: ; 047c int 0x21 int 0x20 +__0482: db 0x8B, 0x16, 0x90, 0x0A ; 0482 mov dx,[0xa90] db 0x8B, 0x3E, 0x92, 0x0A ; 0486 mov di,[0xa92] db 0x3B, 0xDA ; 048A cmp bx,dx @@ -562,16 +571,18 @@ db 0x8B, 0x0E, 0x9A, 0x0A ; 049E mov cx,[0xa9a] db 0x2B, 0xCF ; 04A2 sub cx,di __04a4: -db 0xB0, 0x0A ; 04A4 mov al,0xa -db 0x0A, 0xC0 ; 04A6 or al,al -db 0xE3, 0xCA ; 04A8 jcxz 0x474 -db 0xF2, 0xAE ; 04AA repne scasb -db 0x42 ; 04AC inc dx -db 0x3B, 0xDA ; 04AD cmp bx,dx -db 0x75, 0xF7 ; 04AF jnz 0x4a8 -db 0xC3 ; 04B1 ret + mov al, 10 ; magic + orb r_al, r_al +__04a8: + jcxz __0474 + repne scasb + inc dx + cmpw r_bx, r_dx + jnz __04a8 + ret print_line_prefix: ; 04b2 + ; Line number in bx push bx mov al, ' ' @@ -661,37 +672,56 @@ db 0x2B, 0xFB ; 052E sub di,bx db 0x77, 0x08 ; 0530 ja 0x53a db 0xBF, 0x17, 0x00 ; 0532 mov di,0x17 db 0xEB, 0x03 ; 0535 jmp short 0x53a -db 0xBF, 0x01, 0x00 ; 0537 mov di,0x1 -db 0x8B, 0x0E, 0x9A, 0x0A ; 053A mov cx,[0xa9a] -db 0x2B, 0xCE ; 053E sub cx,si -db 0x74, 0x31 ; 0540 jz 0x573 -db 0x8B, 0x2E, 0x90, 0x0A ; 0542 mov bp,[0xa90] -db 0x51 ; 0546 push cx -db 0xE8, 0x68, 0xFF ; 0547 call 0x4b2 -db 0x59 ; 054A pop cx -db 0xAC ; 054B lodsb -db 0x3C, 0x20 ; 054C cmp al,0x20 -db 0x73, 0x15 ; 054E jnc 0x565 -db 0x3C, 0x0A ; 0550 cmp al,0xa -db 0x74, 0x11 ; 0552 jz 0x565 -db 0x3C, 0x0D ; 0554 cmp al,0xd -db 0x74, 0x0D ; 0556 jz 0x565 -db 0x3C, 0x09 ; 0558 cmp al,0x9 -db 0x74, 0x09 ; 055A jz 0x565 -db 0x50 ; 055C push ax -db 0xB0, 0x5E ; 055D mov al,0x5e -db 0xE8, 0xC2, 0x03 ; 055F call 0x924 -db 0x58 ; 0562 pop ax -db 0x0C, 0x40 ; 0563 or al,0x40 -db 0xE8, 0xBC, 0x03 ; 0565 call 0x924 -db 0x3C, 0x0A ; 0568 cmp al,0xa -db 0xE0, 0xDF ; 056A loopne 0x54b -db 0xE3, 0x05 ; 056C jcxz 0x573 -db 0x43 ; 056E inc bx -db 0x4F ; 056F dec di -db 0x75, 0xD4 ; 0570 jnz 0x546 -db 0x4B ; 0572 dec bx -db 0xC3 ; 0573 ret + +__0537: + mov di, 1 ; magic + mov cx, [__0a9a] + subw r_cx, r_si + jz print_line.ret + + mov bp, [current_line] + +print_line: ; 0546 + ; Line number in bx, line data in si + push cx + call print_line_prefix + pop cx + + .loop: + lodsb + + ; Print characters starting from space normally + cmp al, ' ' + jnb .print_char + ; Print CR, LF, TAB normally + cmp al, 10 ; LF + je .print_char + cmp al, 13 ; CR + je .print_char + cmp al, 9 ; TAB + je .print_char + + ; Print ^A for 0x01 and such + push ax + mov al, '^' + call print_char + pop ax + or al, 0x40 ; Transform control character to ^ equivalent + + .print_char: + call print_char + cmp al, 10 + loopne .loop + + ; TODO: Figure out what exactly is up with these + jcxz .ret + inc bx + dec di + jnz print_line + dec bx + + .ret: ret + db 0xBF, 0x20, 0x0C ; 0574 mov di,0xc20 db 0xB9, 0xFF, 0x00 ; 0577 mov cx,0xff db 0xBA, 0xFF, 0xFF ; 057A mov dx,0xffff @@ -769,120 +799,172 @@ db 0xBA, 0x21, 0x0A ; 0622 mov dx,0xa21 db 0xEB, 0x3B ; 0625 jmp short 0x662 command_s: ; 0627 -db 0xE8, 0x6C, 0x00 ; 0627 call 0x696 -db 0x75, 0x33 ; 062A jnz 0x65f -db 0x8B, 0x1E, 0x8A, 0x0A ; 062C mov bx,[0xa8a] -db 0x8B, 0x36, 0x8C, 0x0A ; 0630 mov si,[0xa8c] -db 0xE8, 0x00, 0xFF ; 0634 call 0x537 -db 0xE8, 0x3A, 0x00 ; 0637 call 0x674 -db 0x74, 0x2B ; 063A jz 0x667 -db 0x8B, 0x3E, 0x88, 0x0A ; 063C mov di,[0xa88] -db 0x8B, 0x0E, 0x8E, 0x0A ; 0640 mov cx,[0xa8e] -db 0xB0, 0x0A ; 0644 mov al,0xa -db 0xF2, 0xAE ; 0646 repne scasb -db 0x75, 0x15 ; 0648 jnz 0x65f -db 0x89, 0x3E, 0x88, 0x0A ; 064A mov [0xa88],di -db 0x89, 0x3E, 0x8C, 0x0A ; 064E mov [0xa8c],di -db 0x89, 0x0E, 0x8E, 0x0A ; 0652 mov [0xa8e],cx -db 0xFF, 0x06, 0x8A, 0x0A ; 0656 inc word [0xa8a] -db 0xE8, 0x92, 0x00 ; 065A call 0x6ef -db 0x74, 0xCD ; 065D jz 0x62c -db 0xBA, 0x0E, 0x0A ; 065F mov dx,0xa0e -db 0xB4, 0x09 ; 0662 mov ah,0x9 -db 0xCD, 0x21 ; 0664 int 0x21 -db 0xC3 ; 0666 ret -db 0xA1, 0x8C, 0x0A ; 0667 mov ax,[0xa8c] -db 0xA3, 0x92, 0x0A ; 066A mov [0xa92],ax -db 0xA1, 0x8A, 0x0A ; 066D mov ax,[0xa8a] -db 0xA3, 0x90, 0x0A ; 0670 mov [0xa90],ax -db 0xC3 ; 0673 ret -db 0xF6, 0x06, 0x7D, 0x0A, 0xFF ; 0674 test byte [0xa7d],0xff -db 0x74, 0xF8 ; 0679 jz 0x673 -db 0xBA, 0x1A, 0x0A ; 067B mov dx,0xa1a -db 0xB4, 0x09 ; 067E mov ah,0x9 -db 0xCD, 0x21 ; 0680 int 0x21 -db 0xB4, 0x01 ; 0682 mov ah,0x1 -db 0xCD, 0x21 ; 0684 int 0x21 -db 0x50 ; 0686 push ax -db 0xE8, 0x93, 0x02 ; 0687 call 0x91d -db 0x58 ; 068A pop ax -db 0x3C, 0x0D ; 068B cmp al,0xd -db 0x74, 0xE4 ; 068D jz 0x673 -db 0x3C, 0x59 ; 068F cmp al,0x59 -db 0x74, 0xE0 ; 0691 jz 0x673 -db 0x3C, 0x79 ; 0693 cmp al,0x79 -db 0xC3 ; 0695 ret -db 0xBF, 0x1E, 0x0B ; 0696 mov di,0xb1e -db 0xE8, 0xA3, 0x00 ; 0699 call 0x73f -db 0x0A, 0xC0 ; 069C or al,al -db 0xE3, 0xF5 ; 069E jcxz 0x695 -db 0x89, 0x0E, 0x84, 0x0A ; 06A0 mov [0xa84],cx -db 0x33, 0xC9 ; 06A4 xor cx,cx -db 0x3C, 0x0D ; 06A6 cmp al,0xd -db 0x74, 0x06 ; 06A8 jz 0x6b0 -db 0xBF, 0x9E, 0x0B ; 06AA mov di,0xb9e -db 0xE8, 0x8F, 0x00 ; 06AD call 0x73f -db 0x89, 0x0E, 0x86, 0x0A ; 06B0 mov [0xa86],cx -db 0x8B, 0x1E, 0x80, 0x0A ; 06B4 mov bx,[0xa80] -db 0x83, 0xFB, 0x01 ; 06B8 cmp bx,byte +0x1 -db 0x83, 0xD3, 0x00 ; 06BB adc bx,byte +0x0 -db 0xE8, 0xC1, 0xFD ; 06BE call 0x482 -db 0x89, 0x3E, 0x88, 0x0A ; 06C1 mov [0xa88],di -db 0x89, 0x3E, 0x8C, 0x0A ; 06C5 mov [0xa8c],di -db 0x89, 0x16, 0x8A, 0x0A ; 06C9 mov [0xa8a],dx -db 0x8B, 0x1E, 0x82, 0x0A ; 06CD mov bx,[0xa82] -db 0x83, 0xFB, 0x01 ; 06D1 cmp bx,byte +0x1 -db 0x83, 0xDB, 0xFF ; 06D4 sbb bx,byte -0x1 -db 0xE8, 0xA8, 0xFD ; 06D7 call 0x482 -db 0x8B, 0xCF ; 06DA mov cx,di -db 0x2B, 0x0E, 0x88, 0x0A ; 06DC sub cx,[0xa88] -db 0x0C, 0xFF ; 06E0 or al,0xff -db 0xE3, 0xB1 ; 06E2 jcxz 0x695 -db 0x2B, 0x0E, 0x84, 0x0A ; 06E4 sub cx,[0xa84] -db 0x72, 0xAB ; 06E8 jc 0x695 -db 0x41 ; 06EA inc cx -db 0x89, 0x0E, 0x8E, 0x0A ; 06EB mov [0xa8e],cx -db 0xA0, 0x1E, 0x0B ; 06EF mov al,[0xb1e] -db 0x8B, 0x0E, 0x8E, 0x0A ; 06F2 mov cx,[0xa8e] -db 0x8B, 0x3E, 0x88, 0x0A ; 06F6 mov di,[0xa88] -db 0x0B, 0xFF ; 06FA or di,di -db 0xF2, 0xAE ; 06FC repne scasb -db 0x75, 0x95 ; 06FE jnz 0x695 -db 0x8B, 0xD1 ; 0700 mov dx,cx -db 0x8B, 0xDF ; 0702 mov bx,di -db 0x8B, 0x0E, 0x84, 0x0A ; 0704 mov cx,[0xa84] -db 0x49 ; 0708 dec cx -db 0xBE, 0x1F, 0x0B ; 0709 mov si,0xb1f -db 0x3A, 0xC0 ; 070C cmp al,al -db 0xF3, 0xA6 ; 070E repe cmpsb -db 0x8B, 0xCA ; 0710 mov cx,dx -db 0x8B, 0xFB ; 0712 mov di,bx -db 0x75, 0xE4 ; 0714 jnz 0x6fa -db 0x89, 0x0E, 0x8E, 0x0A ; 0716 mov [0xa8e],cx -db 0x8B, 0xCF ; 071A mov cx,di -db 0x89, 0x3E, 0x88, 0x0A ; 071C mov [0xa88],di -db 0x8B, 0x3E, 0x8C, 0x0A ; 0720 mov di,[0xa8c] -db 0x2B, 0xCF ; 0724 sub cx,di -db 0xB0, 0x0A ; 0726 mov al,0xa -db 0x8B, 0x16, 0x8A, 0x0A ; 0728 mov dx,[0xa8a] -db 0x42 ; 072C inc dx -db 0x8B, 0xDF ; 072D mov bx,di -db 0xF2, 0xAE ; 072F repne scasb -db 0x74, 0xF9 ; 0731 jz 0x72c -db 0x4A ; 0733 dec dx -db 0x89, 0x16, 0x8A, 0x0A ; 0734 mov [0xa8a],dx -db 0x89, 0x1E, 0x8C, 0x0A ; 0738 mov [0xa8c],bx -db 0x32, 0xC0 ; 073C xor al,al -db 0xC3 ; 073E ret -db 0x33, 0xC9 ; 073F xor cx,cx -db 0xAC ; 0741 lodsb -db 0x3C, 0x1A ; 0742 cmp al,0x1a -db 0x74, 0xF8 ; 0744 jz 0x73e -db 0x3C, 0x0D ; 0746 cmp al,0xd -db 0x74, 0xF4 ; 0748 jz 0x73e -db 0xAA ; 074A stosb -db 0x41 ; 074B inc cx -db 0xEB, 0xF3 ; 074C jmp short 0x741 + call __0696 + jnz print_not_found_str ; disambiguate + +__062c: + mov bx, [__0a8a] + mov si, [__0a8c] + call __0537 + + call prompt_okay + je __0667 ; User okayed + + mov di, [__0a88] + mov cx, [__0a8e] + mov al, 10 ; magic + repne scasb + jne print_not_found_str + + mov [__0a88], di + mov [__0a8c], di + mov [__0a8e], cx + inc word [__0a8a] + call __06ef + jz __062c ; disambiguate + +print_not_found_str: ; 065f + mov dx, not_found_str + mov ah, sys_print_string + int 0x21 + ret + +__0667: + mov ax, [__0a8c] + mov [__0a92], ax + mov ax, [__0a8a] + mov [current_line], ax + .ret: ret + +prompt_okay: ; 0674 + test byte [__0a7d], 0xff + jz __0667.ret + + mov dx, ok_prompt + mov ah, sys_print_string + int 0x21 + + mov ah, sys_read_char + int 0x21 + + push ax + call newline + pop ax + + cmp al, 13 ; CR + je __0667.ret + cmp al, 'Y' + je __0667.ret + cmp al, 'y' + .ret: ret + +__0696: + mov di, __0b1e + call copy_line + orb r_al, r_al ; TODO: Why does this exist? + jcxz prompt_okay.ret + + mov [__0a84], cx + xorw r_cx, r_cx + + cmp al, 13 ; CR + je __06b0 + + mov di, __0b9e + call copy_line + +__06b0: + mov [__0a86], cx + mov bx, [__0a80] + + ; If bx = 0, add 1 to bx + cmp bx, 1 + adc bx, 0 + + call __0482 + + mov [__0a88], di + mov [__0a8c], di + mov [__0a8a], dx + + mov bx, [__0a82] + ; If bx ≠ 0, add 1 to bx + cmp bx, 1 + sbb bx, -1 + + call __0482 + + movw r_cx, r_di + sub cx, [__0a88] + or al, 0xff ; TODO: Why does this exits? + jcxz prompt_okay.ret + + sub cx, [__0a84] + jc prompt_okay.ret + + inc cx + mov [__0a8e], cx + +__06ef: + mov al, [__0b1e] + mov cx, [__0a8e] + mov di, [__0a88] +__06fa: + orw r_di, r_di + repne scasb + jne prompt_okay.ret + + movw r_dx, r_cx + movw r_bx, r_di + mov cx, [__0a84] + + dec cx + mov si, __0b1e + 1 + cmpb r_al, r_al + repe cmpsb + movw r_cx, r_dx + movw r_di, r_bx + jne __06fa + + mov [__0a8e], cx + movw r_cx, r_di + mov [__0a88], di + mov di, [__0a8c] + subw r_cx, r_di + + mov al, 10 ; LF + mov dx, [__0a8a] +__072c: + inc dx + movw r_bx, r_di + repne scasb + je __072c + + dec dx + mov [__0a8a], dx + mov [__0a8c], bx + xorb r_al, r_al + +__073e: + ret + +; in: +; si = source +; di = destination +; out: +; al = first non-copied character +; cx = amount copied +copy_line: ; 073f + xorw r_cx, r_cx + .loop: + lodsb + cmp al, 0x1a ; ^Z + jz __073e + cmp al, 13 + jz __073e + stosb + inc cx + jmp .loop command_d: ; 074e db 0x8B, 0x1E, 0x80, 0x0A ; 074E mov bx,[0xa80] @@ -1123,48 +1205,54 @@ __09b9 db "Disk full--file write not completed$" oom_str db 13, 10, "Insufficient memory", 13, 10, '$' ; 09dd entry_error db "Entry error", 13, 10, '$' ; 09f5 new_file_str db "New file", 13, 10, '$' ; 0a03 -__0a0e db "Not found", 13, 10, '$' -__0a1a db "O.K.? $" +not_found_str db "Not found", 13, 10, '$' ; 0a0e +ok_prompt db "O.K.? $" ; 0a1a __0a21 db "Line too long", 13, 10, '$' eof_str db "End of input file", 13, 10, '$' ; 0a31 __0a45 db "Abort edit (Y/N)? $" ; 0a58 section .bss -__0a58_fcb: resb 37 ; 0a58 … 0a7c +__0a58_fcb resb 37 ; 0a58 … 0a7c -__0a7d: resb 1 +__0a7d resb 1 -new_file_flag: resb 1 ; 0a7e -__0a7f: resb 1 +new_file_flag resb 1 ; 0a7e +__0a7f resb 1 -__0a80: resw 1 -__0a82: resw 1 -resb 12 -current_line: resw 1 ; 0a90 -__0a92: resw 1 +__0a80 resw 1 +__0a82 resw 1 +__0a84 resw 1 +__0a86 resw 1 +__0a88 resw 1 +__0a8a resw 1 +__0a8c resw 1 +__0a8e resw 1 +current_line resw 1 ; 0a90 +__0a92 resw 1 -__0a94: resw 1 -__0a96: resw 1 -__0a98: resw 1 +__0a94 resw 1 +__0a96 resw 1 +__0a98 resw 1 -__0a9a: resw 1 +__0a9a resw 1 input_buffer: - .size: resb 1 ; 0a9c - .fill: resb 1; 0a9d - .bufstart: resb 128 ; 0a9e + .size resb 1 ; 0a9c + .fill resb 1; 0a9d + .bufstart resb 128 ; 0a9e .bufend: ; 0b1e -resb 256 +__0b1e resb 128 +__0b9e resb 128 -__0c1e: resb 1 +__0c1e resb 1 resb 41 stack: resb 256 ; 0c48 -.end: ; 0d48 + .end: ; 0d48 -__0d48: resb 1 +__0d48 resb 1 file_buffer: ; 0d49