diff --git a/README b/README index 1a661c0..606cf41 100644 --- a/README +++ b/README @@ -1,3 +1,8 @@ This is a (work in progress) disassembly of the MS-DOS 1.25 EDLIN.COM binary. Sources deriving from MS-DOS are under MIT license, see LICENSE.microsoft, while other sources are under CC0, see LICENSE.tools. + +Currently the code has been fully converted to assembly with symbolic +memory references, meaning that the code can be edited and the resulting +binary will run without problems. However, majority of the code is not yet +understood, labeled, or commented. diff --git a/edlin.asm b/edlin.asm index 3c0d01e..37940bf 100644 --- a/edlin.asm +++ b/edlin.asm @@ -5,6 +5,7 @@ org 0x100 fcb_filename equ 1 fcb_extension equ fcb_filename + 8 fcb_record_size equ 14 +fcb_rename_target equ 17 fcb_record_low equ 33 fcb_record_high equ 35 @@ -18,11 +19,14 @@ sys_print_char equ 2 sys_print_string equ 9 sys_read_line equ 0xa sys_open_file equ 0xf +sys_close_file equ 0x10 sys_delete_file equ 0x13 sys_create_file equ 0x16 +sys_rename_file equ 0x17 sys_set_dta equ 0x1a sys_set_interrupt equ 0x25 sys_random_block_read equ 0x27 +sys_random_block_write equ 0x28 ; Interrupt defines int_ctrl_break equ 0x23 @@ -46,6 +50,15 @@ int_ctrl_break equ 0x23 %define r_dh 6 %define r_bh 7 +%define b_bx_si 0 +%define b_bx_di 1 +%define b_bp_si 2 +%define b_bp_di 3 +%define b_si 4 +%define b_di 5 +%define b_bp 6 +%define b_bx 7 + ; Direction swapped reg, reg %macro addw 2 db 0x03, 0xc0 + 8 * %1 + %2 @@ -90,6 +103,10 @@ int_ctrl_break equ 0x23 dw %1 db %2 %endmacro +%macro cmpb_regind_ext 2 + db 0x82, 0x38 + %1 + db %2 +%endmacro %macro cmpb_ext 2 db 0x82, 0xf8 + %1 db %2 @@ -97,13 +114,10 @@ int_ctrl_break equ 0x23 jmp entrypoint -__0102: - db 13, 10, "The IBM Personal Computer EDITOR", 13, 10 - db "Version 1.00 (C)Copyright IBM Corp 1981", 13, 10 - db '$' - -__0150 db "Licensed Material - Program Property of IBM" - +; This is never used by the program +db 13, 10, "The IBM Personal Computer EDITOR", 13, 10 +db "Version 1.00 (C)Copyright IBM Corp 1981", 13, 10, '$' +db "Licensed Material - Program Property of IBM" print_filename_missing_error: ; 017b mov dx, filename_missing_error @@ -230,7 +244,7 @@ initialize_editor: ; 0240 mov [__0a9a], di mov byte [input_buffer.size], input_buffer.bufend - input_buffer.bufstart - mov byte [__0c1e], 0xff ; magic + mov byte [__0c1e.size], 0xff mov byte [__0d48], 0x0a ; magic mov word [__0a92], file_buffer mov word [current_line], 1 @@ -417,7 +431,7 @@ find_file_end_char: ; 035e __036d: jmp print_eof_str -command_a: +command_a: ; 0370 test byte [new_file_flag], 0xff jnz __036d @@ -508,47 +522,60 @@ _trampoline_oom_1: ; 0414 jmp oom command_w: ; 0417 -db 0x8B, 0x1E, 0x80, 0x0A ; 0417 mov bx,[0xa80] -db 0x0B, 0xDB ; 041B or bx,bx -db 0x75, 0x1C ; 041D jnz 0x43b -db 0x8B, 0x0E, 0x94, 0x0A ; 041F mov cx,[0xa94] -db 0x8B, 0x3E, 0x9A, 0x0A ; 0423 mov di,[0xa9a] -db 0x2B, 0xF9 ; 0427 sub di,cx -db 0x76, 0xDA ; 0429 jna 0x405 -db 0x81, 0xFF, 0x49, 0x0D ; 042B cmp di,0xd49 -db 0x76, 0xD4 ; 042F jna 0x405 -db 0x33, 0xD2 ; 0431 xor dx,dx -db 0xBB, 0x01, 0x00 ; 0433 mov bx,0x1 -db 0xE8, 0x6B, 0x00 ; 0436 call 0x4a4 -db 0xEB, 0x04 ; 0439 jmp short 0x43f -db 0x43 ; 043B inc bx -db 0xE8, 0x43, 0x00 ; 043C call 0x482 -db 0x8B, 0xCF ; 043F mov cx,di -db 0xBA, 0x49, 0x0D ; 0441 mov dx,0xd49 -db 0x2B, 0xCA ; 0444 sub cx,dx -db 0x74, 0xBD ; 0446 jz 0x405 -db 0xB4, 0x1A ; 0448 mov ah,0x1a -db 0xCD, 0x21 ; 044A int 0x21 -db 0xBA, 0x58, 0x0A ; 044C mov dx,0xa58 -db 0xB4, 0x28 ; 044F mov ah,0x28 -db 0xCD, 0x21 ; 0451 int 0x21 -db 0x0A, 0xC0 ; 0453 or al,al -db 0x75, 0x1E ; 0455 jnz 0x475 -db 0x8B, 0xF7 ; 0457 mov si,di -db 0xBF, 0x49, 0x0D ; 0459 mov di,0xd49 -db 0x89, 0x3E, 0x92, 0x0A ; 045C mov [0xa92],di -db 0x8B, 0x0E, 0x9A, 0x0A ; 0460 mov cx,[0xa9a] -db 0x2B, 0xCE ; 0464 sub cx,si -db 0x41 ; 0466 inc cx -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 + mov bx, [__0a80] + orw r_bx, r_bx + jnz __043b + + mov cx, [__0a94] + mov di, [__0a9a] + subw r_di, r_cx + jna print_eof_str.ret + + cmp di, file_buffer + jna print_eof_str.ret + + xorw r_dx, r_dx + mov bx, 1 ; magic + call __04a4 + + jmp __043f + +__043b: + inc bx + call __0482 + +__043f: + movw r_cx, r_di + mov dx, file_buffer + subw r_cx, r_dx + je print_eof_str.ret + mov ah, sys_set_dta + int 0x21 + + mov dx, __0a58_fcb + mov ah, sys_random_block_write + int 0x21 + orb r_al, r_al + jnz disk_full + + movw r_si, r_di + mov di, file_buffer + mov [__0a92], di + mov cx, [__0a9a] + subw r_cx, r_si + inc cx + rep movsb + dec di + mov [__0a9a], di + mov word [current_line], 1 + __0474: -db 0xC3 ; 0474 ret -db 0xB4, 0x10 ; 0475 mov ah,0x10 -db 0xCD, 0x21 ; 0477 int 0x21 -db 0xBA, 0xB9, 0x09 ; 0479 mov dx,0x9b9 + ret + +disk_full: ; 0475 + mov ah, sys_close_file + int 0x21 + mov dx, disk_full_error error: ; 047c mov ah, sys_print_string @@ -556,19 +583,21 @@ error: ; 047c 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 -db 0x74, 0xE6 ; 048C jz 0x474 -db 0x77, 0x0E ; 048E ja 0x49e -db 0x0B, 0xDB ; 0490 or bx,bx -db 0x74, 0x0A ; 0492 jz 0x49e -db 0xBA, 0x01, 0x00 ; 0494 mov dx,0x1 -db 0xBF, 0x49, 0x0D ; 0497 mov di,0xd49 -db 0x3B, 0xDA ; 049A cmp bx,dx -db 0x74, 0xD6 ; 049C jz 0x474 -db 0x8B, 0x0E, 0x9A, 0x0A ; 049E mov cx,[0xa9a] -db 0x2B, 0xCF ; 04A2 sub cx,di + mov dx, [current_line] + mov di, [__0a92] + cmpw r_bx, r_dx + je __0474 + ja __049e + + orw r_bx, r_bx + jz __049e + mov dx, 1 ; magic + mov di, file_buffer + cmpw r_bx, r_dx + je __0474 +__049e: + mov cx, [__0a9a] + subw r_cx, r_di __04a4: mov al, 10 ; magic @@ -579,6 +608,7 @@ __04a8: inc dx cmpw r_bx, r_dx jnz __04a8 +__04b1: ret print_line_prefix: ; 04b2 @@ -656,25 +686,28 @@ print_bcd_digit: ; 0501 jmp print_char command_l: ; 050e -db 0x8B, 0x1E, 0x80, 0x0A ; 050E mov bx,[0xa80] -db 0x0B, 0xDB ; 0512 or bx,bx -db 0x75, 0x0C ; 0514 jnz 0x522 -db 0x8B, 0x1E, 0x90, 0x0A ; 0516 mov bx,[0xa90] -db 0x83, 0xEB, 0x0B ; 051A sub bx,byte +0xb -db 0x77, 0x03 ; 051D ja 0x522 -db 0xBB, 0x01, 0x00 ; 051F mov bx,0x1 -db 0xE8, 0x5D, 0xFF ; 0522 call 0x482 -db 0x75, 0x8A ; 0525 jnz 0x4b1 -db 0x8B, 0xF7 ; 0527 mov si,di -db 0x8B, 0x3E, 0x82, 0x0A ; 0529 mov di,[0xa82] -db 0x47 ; 052D inc di -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 + mov bx, [__0a80] + orw r_bx, r_bx + jnz __0522 + + mov bx, [current_line] + sub bx, 11 ; magic + ja __0522 + mov bx, 1 +__0522: + call __0482 + jnz __04b1 ; disambiguate + movw r_si, r_di + mov di, [__0a82] + inc di + subw r_di, r_bx + ja __053a + mov di, 0x17 ; magic + jmp __053a __0537: mov di, 1 ; magic +__053a: mov cx, [__0a9a] subw r_cx, r_si jz print_line.ret @@ -722,81 +755,116 @@ print_line: ; 0546 .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 -db 0xAC ; 057D lodsb -db 0xAA ; 057E stosb -db 0x42 ; 057F inc dx -db 0x3C, 0x0D ; 0580 cmp al,0xd -db 0xE0, 0xF9 ; 0582 loopne 0x57d -db 0x88, 0x16, 0x1F, 0x0C ; 0584 mov [0xc1f],dl -db 0x74, 0xE9 ; 0588 jz 0x573 -db 0xAC ; 058A lodsb -db 0x42 ; 058B inc dx -db 0x3C, 0x0D ; 058C cmp al,0xd -db 0x75, 0xFA ; 058E jnz 0x58a -db 0x4F ; 0590 dec di -db 0xAA ; 0591 stosb -db 0xC3 ; 0592 ret -db 0xE9, 0xC9, 0x00 ; 0593 jmp 0x65f +; in: +; si = line +; out: +; dx = length of line (untruncated) +; NOTE: Always ends a line with CR +__0574: + mov di, __0c1e.bufstart + mov cx, 255 ; Maximum line length + mov dx, -1 ; Start off at -1 since the loop increases dx before testing + + .copyloop: ; 057d + lodsb + stosb + inc dx + cmp al, 13 ; CR + loopne .copyloop + + mov [__0c1e.fill], dl + je print_line.ret + + .find_cr: ; 058a + lodsb + inc dx + cmp al, 13 ; CR + jnz .find_cr + + ; Overwrite last character with CR + dec di + stosb + ret + +__0593: + jmp print_not_found_str command_r: ; 0596 -db 0xE8, 0xFD, 0x00 ; 0596 call 0x696 -db 0x75, 0xF8 ; 0599 jnz 0x593 -db 0x8B, 0x36, 0x8C, 0x0A ; 059B mov si,[0xa8c] -db 0xE8, 0xD2, 0xFF ; 059F call 0x574 -db 0x2B, 0x16, 0x84, 0x0A ; 05A2 sub dx,[0xa84] -db 0x8B, 0x0E, 0x86, 0x0A ; 05A6 mov cx,[0xa86] -db 0x03, 0xD1 ; 05AA add dx,cx -db 0x81, 0xFA, 0xFE, 0x00 ; 05AC cmp dx,0xfe -db 0x77, 0x70 ; 05B0 ja 0x622 -db 0x8B, 0x1E, 0x8A, 0x0A ; 05B2 mov bx,[0xa8a] -db 0x52 ; 05B6 push dx -db 0xE8, 0xF8, 0xFE ; 05B7 call 0x4b2 -db 0x5A ; 05BA pop dx -db 0x8B, 0x0E, 0x88, 0x0A ; 05BB mov cx,[0xa88] -db 0x8B, 0x36, 0x8C, 0x0A ; 05BF mov si,[0xa8c] -db 0x2B, 0xCE ; 05C3 sub cx,si -db 0x49 ; 05C5 dec cx -db 0xE8, 0x4F, 0x00 ; 05C6 call 0x618 -db 0x56 ; 05C9 push si -db 0xBE, 0x9E, 0x0B ; 05CA mov si,0xb9e -db 0x8B, 0x0E, 0x86, 0x0A ; 05CD mov cx,[0xa86] -db 0xE8, 0x44, 0x00 ; 05D1 call 0x618 -db 0x5E ; 05D4 pop si -db 0x03, 0x36, 0x84, 0x0A ; 05D5 add si,[0xa84] -db 0x8B, 0xCA ; 05D9 mov cx,dx -db 0x83, 0xC1, 0x02 ; 05DB add cx,byte +0x2 -db 0xE8, 0x37, 0x00 ; 05DE call 0x618 -db 0xE8, 0x90, 0x00 ; 05E1 call 0x674 -db 0x75, 0x2A ; 05E4 jnz 0x610 -db 0xE8, 0x7E, 0x00 ; 05E6 call 0x667 -db 0x8B, 0x3E, 0x88, 0x0A ; 05E9 mov di,[0xa88] -db 0x4F ; 05ED dec di -db 0xBE, 0x9E, 0x0B ; 05EE mov si,0xb9e -db 0x8B, 0x16, 0x84, 0x0A ; 05F1 mov dx,[0xa84] -db 0x8B, 0x0E, 0x86, 0x0A ; 05F5 mov cx,[0xa86] -db 0x49 ; 05F9 dec cx -db 0x01, 0x0E, 0x88, 0x0A ; 05FA add [0xa88],cx -db 0x41 ; 05FE inc cx -db 0x4A ; 05FF dec dx -db 0x29, 0x16, 0x8E, 0x0A ; 0600 sub [0xa8e],dx -db 0x73, 0x06 ; 0604 jnc 0x60c -db 0xC7, 0x06, 0x8E, 0x0A, 0x00, 0x00 ; 0606 mov word [0xa8e],0x0 -db 0x42 ; 060C inc dx -db 0xE8, 0xC7, 0x01 ; 060D call 0x7d7 -db 0xE8, 0xDC, 0x00 ; 0610 call 0x6ef -db 0x75, 0x0C ; 0613 jnz 0x621 -db 0xE9, 0x83, 0xFF ; 0615 jmp 0x59b -db 0xE3, 0x07 ; 0618 jcxz 0x621 -db 0xAC ; 061A lodsb -db 0xE8, 0x06, 0x03 ; 061B call 0x924 -db 0x4A ; 061E dec dx -db 0xE2, 0xF9 ; 061F loop 0x61a -db 0xC3 ; 0621 ret -db 0xBA, 0x21, 0x0A ; 0622 mov dx,0xa21 -db 0xEB, 0x3B ; 0625 jmp short 0x662 + call __0696 + jnz __0593 ; disambiguate + +__059b: + mov si, [__0a8c] + call __0574 + sub dx, [__0a84] + mov cx, [__0a86] + addw r_dx, r_cx + + cmp dx, 0xfe ; magic + ja __0622 + + mov bx, [__0a8a] + push dx + call print_line_prefix + pop dx + + mov cx, [__0a88] + mov si, [__0a8c] + subw r_cx, r_si + dec cx + call __0618 + + push si + mov si, __0b9e + mov cx, [__0a86] + call __0618 + pop si + + add si, [__0a84] + movw r_cx, r_dx + add cx, 2 ; magic + call __0618 + + call prompt_okay + jne __0610 ; User didn't okay + + call __0667 + mov di, [__0a88] + dec di + mov si, __0b9e + mov dx, [__0a84] + mov cx, [__0a86] + dec cx + add [__0a88], cx + inc cx + dec dx + sub [__0a8e], dx + jnb __060c + mov word [__0a8e], 0 + +__060c: + inc dx + call __07d7 + +__0610: + call __06ef + jnz __0621 ; disambiguate + jmp near __059b + +__0618: + jcxz __0621 +__061a: + lodsb + call print_char + dec dx + loop __061a + +__0621: + ret + +__0622: + mov dx, line_too_long_error + jmp print_string command_s: ; 0627 call __0696 @@ -825,6 +893,7 @@ __062c: print_not_found_str: ; 065f mov dx, not_found_str +print_string: ; 0662 mov ah, sys_print_string int 0x21 ret @@ -967,88 +1036,120 @@ copy_line: ; 073f jmp .loop command_d: ; 074e -db 0x8B, 0x1E, 0x80, 0x0A ; 074E mov bx,[0xa80] -db 0x0B, 0xDB ; 0752 or bx,bx -db 0x75, 0x04 ; 0754 jnz 0x75a -db 0x8B, 0x1E, 0x90, 0x0A ; 0756 mov bx,[0xa90] -db 0xE8, 0x25, 0xFD ; 075A call 0x482 -db 0x75, 0xDF ; 075D jnz 0x73e -db 0x53 ; 075F push bx -db 0x57 ; 0760 push di -db 0x8B, 0x1E, 0x82, 0x0A ; 0761 mov bx,[0xa82] -db 0x0B, 0xDB ; 0765 or bx,bx -db 0x75, 0x02 ; 0767 jnz 0x76b -db 0x8B, 0xDA ; 0769 mov bx,dx -db 0x43 ; 076B inc bx -db 0xE8, 0x13, 0xFD ; 076C call 0x482 -db 0x8B, 0xD7 ; 076F mov dx,di -db 0x5F ; 0771 pop di -db 0x2B, 0xD7 ; 0772 sub dx,di -db 0x76, 0x0C ; 0774 jna 0x782 -db 0x8F, 0x06, 0x90, 0x0A ; 0776 pop word [0xa90] -db 0x89, 0x3E, 0x92, 0x0A ; 077A mov [0xa92],di -db 0x33, 0xC9 ; 077E xor cx,cx -db 0xEB, 0x55 ; 0780 jmp short 0x7d7 -db 0xE9, 0x6A, 0xFB ; 0782 jmp 0x2ef + mov bx, [__0a80] + orw r_bx, r_bx + jnz __075a + + mov bx, [current_line] +__075a: + call __0482 + jnz __073e ; disambiguate + + push bx + push di + mov bx, [__0a82] + orw r_bx, r_bx + jnz __076b + movw r_bx, r_dx + +__076b: + inc bx + call __0482 + movw r_dx, r_di + pop di + subw r_dx, r_di + jna __0782 + + pop word [current_line] + mov [__0a92], di + xorw r_cx, r_cx + jmp __07d7 + +__0782: + jmp print_entry_error command_cr: ; 0785 -db 0x8B, 0x1E, 0x80, 0x0A ; 0785 mov bx,[0xa80] -db 0x0B, 0xDB ; 0789 or bx,bx -db 0x75, 0x05 ; 078B jnz 0x792 -db 0x8B, 0x1E, 0x90, 0x0A ; 078D mov bx,[0xa90] -db 0x43 ; 0791 inc bx -db 0xE8, 0xED, 0xFC ; 0792 call 0x482 -db 0x8B, 0xF7 ; 0795 mov si,di -db 0x89, 0x16, 0x90, 0x0A ; 0797 mov [0xa90],dx -db 0x89, 0x36, 0x92, 0x0A ; 079B mov [0xa92],si -db 0x75, 0x9D ; 079F jnz 0x73e -db 0x3B, 0x36, 0x9A, 0x0A ; 07A1 cmp si,[0xa9a] -db 0x74, 0x97 ; 07A5 jz 0x73e -db 0xE8, 0xCA, 0xFD ; 07A7 call 0x574 -db 0x89, 0x16, 0x84, 0x0A ; 07AA mov [0xa84],dx -db 0x8B, 0x36, 0x92, 0x0A ; 07AE mov si,[0xa92] -db 0xE8, 0x82, 0xFD ; 07B2 call 0x537 -db 0xE8, 0xFA, 0xFC ; 07B5 call 0x4b2 -db 0xB4, 0x0A ; 07B8 mov ah,0xa -db 0xBA, 0x1E, 0x0C ; 07BA mov dx,0xc1e -db 0xCD, 0x21 ; 07BD int 0x21 -db 0xB0, 0x0A ; 07BF mov al,0xa -db 0xE8, 0x60, 0x01 ; 07C1 call 0x924 -db 0x8A, 0x0E, 0x1F, 0x0C ; 07C4 mov cl,[0xc1f] -db 0xB5, 0x00 ; 07C8 mov ch,0x0 -db 0xE3, 0x3F ; 07CA jcxz 0x80b -db 0x8B, 0x16, 0x84, 0x0A ; 07CC mov dx,[0xa84] -db 0xBE, 0x20, 0x0C ; 07D0 mov si,0xc20 -db 0x8B, 0x3E, 0x92, 0x0A ; 07D3 mov di,[0xa92] -db 0x3B, 0xCA ; 07D7 cmp cx,dx -db 0x74, 0x2E ; 07D9 jz 0x809 -db 0x56 ; 07DB push si -db 0x57 ; 07DC push di -db 0x51 ; 07DD push cx -db 0x8B, 0xF7 ; 07DE mov si,di -db 0x03, 0xF2 ; 07E0 add si,dx -db 0x03, 0xF9 ; 07E2 add di,cx -db 0xA1, 0x9A, 0x0A ; 07E4 mov ax,[0xa9a] -db 0x2B, 0xC2 ; 07E7 sub ax,dx -db 0x03, 0xC1 ; 07E9 add ax,cx -db 0x3B, 0x06, 0x98, 0x0A ; 07EB cmp ax,[0xa98] -db 0x73, 0x1B ; 07EF jnc 0x80c -db 0x87, 0x06, 0x9A, 0x0A ; 07F1 xchg ax,[0xa9a] -db 0x8B, 0xC8 ; 07F5 mov cx,ax -db 0x2B, 0xCE ; 07F7 sub cx,si -db 0x3B, 0xF7 ; 07F9 cmp si,di -db 0x77, 0x05 ; 07FB ja 0x802 -db 0x03, 0xF1 ; 07FD add si,cx -db 0x03, 0xF9 ; 07FF add di,cx -db 0xFD ; 0801 std -db 0x41 ; 0802 inc cx -db 0xF3, 0xA4 ; 0803 rep movsb -db 0xFC ; 0805 cld -db 0x59 ; 0806 pop cx -db 0x5F ; 0807 pop di -db 0x5E ; 0808 pop si -db 0xF3, 0xA4 ; 0809 rep movsb -db 0xC3 ; 080B ret + mov bx, [__0a80] + orw r_bx, r_bx + jnz __0792 + + mov bx, [current_line] + inc bx + +__0792: + call __0482 + movw r_si, r_di + mov [current_line], dx + mov [__0a92], si + jnz __073e ; disambiguate + + cmp si, [__0a9a] + je __073e + + call __0574 + + mov [__0a84], dx + mov si, [__0a92] + call __0537 + call print_line_prefix + + mov ah, sys_read_line + mov dx, __0c1e + int 0x21 + + mov al, 10 ; LF + call print_char + + mov cl, [__0c1e.fill] + mov ch, 0 + jcxz __080b + + mov dx, [__0a84] + mov si, __0c1e.bufstart + mov di, [__0a92] + +__07d7: + cmpw r_cx, r_dx + je __0809 + + push si + push di + push cx + + movw r_si, r_di + addw r_si, r_dx + addw r_di, r_cx + mov ax, [__0a9a] + subw r_ax, r_dx + addw r_ax, r_cx + cmp ax, [__0a98] + jnb oom + + xchg ax, [__0a9a] + movw r_cx, r_ax + subw r_cx, r_si + ; NOTE: Memmove? + cmpw r_si, r_di + ja __0802 + + addw r_si, r_cx + addw r_di, r_cx + std + +__0802: + inc cx + rep movsb + cld + + pop cx + pop di + pop si + +__0809: + rep movsb + +__080b: + ret oom: ; 080c mov dx, oom_str @@ -1057,122 +1158,155 @@ oom: ; 080c jmp editor_mainloop command_i: ; 0816 -db 0xB8, 0x23, 0x25 ; 0816 mov ax,0x2523 -db 0xBA, 0x7D, 0x08 ; 0819 mov dx,0x87d -db 0xCD, 0x21 ; 081C int 0x21 -db 0x8B, 0x1E, 0x80, 0x0A ; 081E mov bx,[0xa80] -db 0x0B, 0xDB ; 0822 or bx,bx -db 0x75, 0x04 ; 0824 jnz 0x82a -db 0x8B, 0x1E, 0x90, 0x0A ; 0826 mov bx,[0xa90] -db 0xE8, 0x55, 0xFC ; 082A call 0x482 -db 0x8B, 0x0E, 0x9A, 0x0A ; 082D mov cx,[0xa9a] -db 0x8B, 0xF1 ; 0831 mov si,cx -db 0x2B, 0xCF ; 0833 sub cx,di -db 0x41 ; 0835 inc cx -db 0x8B, 0x3E, 0x98, 0x0A ; 0836 mov di,[0xa98] -db 0xFD ; 083A std -db 0xF3, 0xA4 ; 083B rep movsb -db 0x87, 0xFE ; 083D xchg di,si -db 0xFC ; 083F cld -db 0x47 ; 0840 inc di -db 0x8B, 0xEE ; 0841 mov bp,si -db 0x8B, 0xDA ; 0843 mov bx,dx -db 0x89, 0x3E, 0x92, 0x0A ; 0845 mov [0xa92],di -db 0x89, 0x1E, 0x90, 0x0A ; 0849 mov [0xa90],bx -db 0x89, 0x2E, 0x9A, 0x0A ; 084D mov [0xa9a],bp -db 0xE8, 0x5E, 0xFC ; 0851 call 0x4b2 -db 0xBA, 0x1E, 0x0C ; 0854 mov dx,0xc1e -db 0xB4, 0x0A ; 0857 mov ah,0xa -db 0xCD, 0x21 ; 0859 int 0x21 -db 0xE8, 0xC4, 0x00 ; 085B call 0x922 -db 0xBE, 0x20, 0x0C ; 085E mov si,0xc20 -db 0x82 ; 0861 db 0x82 -db 0x3C, 0x1A ; 0862 cmp al,0x1a -db 0x74, 0x25 ; 0864 jz 0x88b -db 0x8A, 0x4C, 0xFF ; 0866 mov cl,[si-0x1] -db 0xB5, 0x00 ; 0869 mov ch,0x0 -db 0x8B, 0xD6 ; 086B mov dx,si -db 0x03, 0xD1 ; 086D add dx,cx -db 0x42 ; 086F inc dx -db 0x3B, 0xD5 ; 0870 cmp dx,bp -db 0x73, 0x98 ; 0872 jnc 0x80c -db 0xF3, 0xA4 ; 0874 rep movsb -db 0xA4 ; 0876 movsb -db 0xB0, 0x0A ; 0877 mov al,0xa -db 0xAA ; 0879 stosb -db 0x43 ; 087A inc bx -db 0xEB, 0xC8 ; 087B jmp short 0x845 -db 0x8C, 0xC8 ; 087D mov ax,cs -db 0x8E, 0xD8 ; 087F mov ds,ax -db 0x8E, 0xC0 ; 0881 mov es,ax -db 0x8E, 0xD0 ; 0883 mov ss,ax -db 0xBC, 0x48, 0x0D ; 0885 mov sp,0xd48 -db 0xE8, 0x92, 0x00 ; 0888 call 0x91d -db 0x8B, 0x2E, 0x9A, 0x0A ; 088B mov bp,[0xa9a] -db 0x8B, 0x3E, 0x92, 0x0A ; 088F mov di,[0xa92] -db 0x8B, 0xF5 ; 0893 mov si,bp -db 0x46 ; 0895 inc si -db 0x8B, 0x0E, 0x98, 0x0A ; 0896 mov cx,[0xa98] -db 0x2B, 0xCD ; 089A sub cx,bp -db 0xF3, 0xA4 ; 089C rep movsb -db 0x4F ; 089E dec di -db 0x89, 0x3E, 0x9A, 0x0A ; 089F mov [0xa9a],di -db 0xE9, 0xCD, 0xF9 ; 08A3 jmp 0x273 + mov ax, sys_set_interrupt * 0x100 + int_ctrl_break + mov dx, __087d + int 0x21 + + mov bx, [__0a80], + orw r_bx, r_bx + jnz __082a + mov bx, [current_line] + +__082a: + call __0482 + mov cx, [__0a9a] + movw r_si, r_cx + subw r_cx, r_di + inc cx + mov di, [__0a98] + + std + rep movsb + xchg di, si + cld + + inc di + movw r_bp, r_si + movw r_bx, r_dx +__0845: + mov [__0a92], di + mov [current_line], bx + mov [__0a9a], bp + call print_line_prefix + + mov dx, __0c1e + mov ah, sys_read_line + int 0x21 + + call __0922 + + mov si, __0c1e.bufstart + + cmpb_regind_ext b_si, 0x1a ; ^Z + je __088b + + mov cl, [si - 1] ; magic + mov ch, 0 + + movw r_dx, r_si + addw r_dx, r_cx + inc dx + cmpw r_dx, r_bp + jnb oom + + rep movsb + movsb + mov al, 10 ; magic, LF? + stosb + + inc bx + jmp __0845 + +__087d: + mov ax, cs + mov ds, ax + mov es, ax + mov ss, ax + mov sp, stack.end + call newline + +__088b: + mov bp, [__0a9a] + mov di, [__0a92] + movw r_si, r_bp + inc si + mov cx, [__0a98] + subw r_cx, r_bp + rep movsb + dec di + mov [__0a9a], di + jmp editor_mainloop command_q: ; 08a6 -db 0xBA, 0x45, 0x0A ; 08A6 mov dx,0xa45 -db 0xB4, 0x09 ; 08A9 mov ah,0x9 -db 0xCD, 0x21 ; 08AB int 0x21 -db 0xB4, 0x01 ; 08AD mov ah,0x1 -db 0xCD, 0x21 ; 08AF int 0x21 -db 0x24, 0x5F ; 08B1 and al,0x5f -db 0x3C, 0x59 ; 08B3 cmp al,0x59 -db 0x75, 0x66 ; 08B5 jnz 0x91d -db 0xBA, 0x58, 0x0A ; 08B7 mov dx,0xa58 -db 0xB4, 0x10 ; 08BA mov ah,0x10 -db 0xCD, 0x21 ; 08BC int 0x21 -db 0xB4, 0x13 ; 08BE mov ah,0x13 -db 0xCD, 0x21 ; 08C0 int 0x21 -db 0xCD, 0x20 ; 08C2 int 0x20 -db 0xC7, 0x06, 0x80, 0x0A, 0xFF, 0xFF ; 08C4 mov word [0xa80],0xffff -db 0xE8, 0xA3, 0xFA ; 08CA call 0x370 + mov dx, quit_prompt + mov ah, sys_print_string + int 0x21 + + mov ah, sys_read_char + int 0x21 + and al, 0x5f ; Lowercase + cmp al, 'Y' + jne newline + + mov dx, __0a58_fcb + mov ah, sys_close_file + int 0x21 + + mov ah, sys_delete_file + int 0x21 + + int 0x20 + +__08c4: + mov word [__0a80], 0xffff ; magic + call command_a command_e: ; 08cd -db 0xC6, 0x06, 0x7F, 0x0A, 0x01 ; 08CD mov byte [0xa7f],0x1 -db 0xBB, 0xFF, 0xFF ; 08D2 mov bx,0xffff -db 0xE8, 0x63, 0xFB ; 08D5 call 0x43b -db 0xF6, 0x06, 0x7E, 0x0A, 0xFF ; 08D8 test byte [0xa7e],0xff -db 0x74, 0xE5 ; 08DD jz 0x8c4 -db 0x8B, 0x16, 0x9A, 0x0A ; 08DF mov dx,[0xa9a] -db 0xB4, 0x1A ; 08E3 mov ah,0x1a -db 0xCD, 0x21 ; 08E5 int 0x21 -db 0xB9, 0x01, 0x00 ; 08E7 mov cx,0x1 -db 0xBA, 0x58, 0x0A ; 08EA mov dx,0xa58 -db 0xB4, 0x28 ; 08ED mov ah,0x28 -db 0xCD, 0x21 ; 08EF int 0x21 -db 0xB4, 0x10 ; 08F1 mov ah,0x10 -db 0xCD, 0x21 ; 08F3 int 0x21 -db 0xBE, 0x5C, 0x00 ; 08F5 mov si,0x5c -db 0x8D, 0x7C, 0x10 ; 08F8 lea di,[si+0x10] -db 0x8B, 0xD6 ; 08FB mov dx,si -db 0xB9, 0x09, 0x00 ; 08FD mov cx,0x9 -db 0xF3, 0xA4 ; 0900 rep movsb -db 0xBE, 0x3E, 0x09 ; 0902 mov si,0x93e -db 0xA5 ; 0905 movsw -db 0xA4 ; 0906 movsb -db 0xB4, 0x17 ; 0907 mov ah,0x17 -db 0xCD, 0x21 ; 0909 int 0x21 -db 0xBE, 0x5C, 0x00 ; 090B mov si,0x5c -db 0xBF, 0x68, 0x0A ; 090E mov di,0xa68 -db 0xB9, 0x06, 0x00 ; 0911 mov cx,0x6 -db 0xF3, 0xA5 ; 0914 rep movsw -db 0xBA, 0x58, 0x0A ; 0916 mov dx,0xa58 -db 0xCD, 0x21 ; 0919 int 0x21 -db 0xCD, 0x20 ; 091B int 0x20 + mov byte [__0a7f], 1 ; magic + mov bx, 0xffff ; magic + call __043b + test byte [new_file_flag], 0xff + jz __08c4 + + mov dx, [__0a9a] + mov ah, sys_set_dta + int 0x21 + + mov cx, 1 + mov dx, __0a58_fcb + mov ah, sys_random_block_write + int 0x21 + + mov ah, sys_close_file + int 0x21 + + mov si, psp_fcb_1 + ; NOTE: - 1 since this copies the drive specifier (which is ignored?) too + lea di, [si + fcb_rename_target - 1] + movw r_dx, r_si + mov cx, 9 + rep movsb + mov si, bak_extension + movsw + movsb + + mov ah, sys_rename_file + int 0x21 + + mov si, psp_fcb_1 + mov di, __0a58_fcb + fcb_rename_target - 1 + mov cx, 6 ; 6*2 = 12 bytes (as we copy words). 1 (drive specifier) + 8 (name) + 3 (extension) + rep movsw + + mov dx, __0a58_fcb + int 0x21 + + int 0x20 newline: ; 091d mov al, 13 ; CR call print_char +__0922: mov al, 10 ; LF print_char: ; 0924 @@ -1201,15 +1335,15 @@ invalid_name_error db "Invalid drive or file name$" ; 0941 filename_missing_error db "File name must be specified$" ; 095c bak_error db "Cannot edit .BAK file--rename file$" ; 0978 directory_full_error db "No room in directory for file$" ; 099b -__09b9 db "Disk full--file write not completed$" +disk_full_error 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 not_found_str db "Not found", 13, 10, '$' ; 0a0e ok_prompt db "O.K.? $" ; 0a1a -__0a21 db "Line too long", 13, 10, '$' +line_too_long_error db "Line too long", 13, 10, '$' ; 0a21 eof_str db "End of input file", 13, 10, '$' ; 0a31 -__0a45 db "Abort edit (Y/N)? $" +quit_prompt db "Abort edit (Y/N)? $" ; 0a45 ; 0a58 section .bss @@ -1246,11 +1380,14 @@ input_buffer: __0b1e resb 128 __0b9e resb 128 -__0c1e resb 1 +__0c1e: + .size resb 1 ; 0c1e + .fill resb 1 ; 0c1f + ; TODO: Figure if this is 256 or 255 bytes + .bufstart resb 256 ; 0c20 + .bufend: ; 0d20 -resb 41 - -stack: resb 256 ; 0c48 +stack: resb 40 ; 0d20 .end: ; 0d48 __0d48 resb 1