Finish up basic disassembly

This commit is contained in:
Juhani Krekelä 2021-08-01 14:40:26 +03:00
parent bed4ceaa1f
commit f5e568a6e3
2 changed files with 488 additions and 346 deletions

5
README
View File

@ -1,3 +1,8 @@
This is a (work in progress) disassembly of the MS-DOS 1.25 EDLIN.COM 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 binary. Sources deriving from MS-DOS are under MIT license, see
LICENSE.microsoft, while other sources are under CC0, see LICENSE.tools. 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.

829
edlin.asm
View File

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