Work on S command

This commit is contained in:
Juhani Krekelä 2021-07-31 00:50:18 +03:00
parent 95d5901852
commit bed4ceaa1f
1 changed files with 263 additions and 175 deletions

438
edlin.asm
View File

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