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