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
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.

829
edlin.asm
View File

@ -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