diff --git a/edlin.asm b/edlin.asm index 943f9e6..11454aa 100644 --- a/edlin.asm +++ b/edlin.asm @@ -13,12 +13,17 @@ psp_segment_size equ 0x0006 psp_fcb_1 equ 0x005c ; Syscall defines +sys_print_char equ 2 sys_print_string equ 9 sys_open_file equ 0xf sys_delete_file equ 0x13 sys_create_file equ 0x16 sys_set_dta equ 0x1a -sys_block_read equ 0x27 +sys_set_interrupt equ 0x25 +sys_random_block_read equ 0x27 + +; Interrupt defines +int_ctrl_break equ 0x23 ; Special instruction encodings %define r_ax 0 @@ -43,6 +48,9 @@ sys_block_read equ 0x27 %macro addw 2 db 0x03, 0xc0 + 8 * %1 + %2 %endmacro +%macro orw 2 + db 0x0b, 0xc0 + 8 * %1 + %2 +%endmacro %macro orb 2 db 0x0a, 0xc0 + 8 * %1 + %2 %endmacro @@ -52,6 +60,9 @@ sys_block_read equ 0x27 %macro xorw 2 db 0x33, 0xc0 + 8 * %1 + %2 %endmacro +%macro cmpw 2 + db 0x3b, 0xc0 + 8 * %1 + %2 +%endmacro %macro movw 2 db 0x8b, 0xc0 + 8 * %1 + %2 %endmacro @@ -183,24 +194,28 @@ setup_file_parameters: ; 01ec read_file: mov dx, psp_fcb_1 - mov ah, sys_block_read + mov ah, sys_random_block_read int 0x21 call find_file_end_char addw r_di, r_cx __0240: -db 0xFC ; 0240 cld -db 0xC6, 0x05, 0x1A ; 0241 mov byte [di],0x1a -db 0x89, 0x3E, 0x9A, 0x0A ; 0244 mov [0xa9a],di -db 0xC6, 0x06, 0x9C, 0x0A, 0x80 ; 0248 mov byte [0xa9c],0x80 -db 0xC6, 0x06, 0x1E, 0x0C, 0xFF ; 024D mov byte [0xc1e],0xff -db 0xC6, 0x06, 0x48, 0x0D, 0x0A ; 0252 mov byte [0xd48],0xa -db 0xC7, 0x06, 0x92, 0x0A, 0x49, 0x0D ; 0257 mov word [0xa92],0xd49 -db 0xC7, 0x06, 0x90, 0x0A, 0x01, 0x00 ; 025D mov word [0xa90],0x1 -db 0xC7, 0x06, 0x80, 0x0A, 0x01, 0x00 ; 0263 mov word [0xa80],0x1 -db 0xF6, 0x06, 0x7E, 0x0A, 0xFF ; 0269 test byte [0xa7e],0xff -db 0x75, 0x03 ; 026E jnz 0x273 -db 0xE8, 0xFD, 0x00 ; 0270 call 0x370 + cld + + mov byte [di], 0x1a ; ^Z + mov [__0a9a], di + mov byte [__0a9c], 0x80 ; magic + mov byte [__0c1e], 0xff ; magic + mov byte [__0d48], 0x0a ; magic + mov word [__0a92], disk_transfer_area + mov word [__0a90], 1 ; magic + mov word [__0a80], 1 ; magic + + test byte [new_file_flag], 0xff + jnz __0273 + call __0370 + +__0273: db 0xBC, 0x48, 0x0D ; 0273 mov sp,0xd48 db 0xB8, 0x23, 0x25 ; 0276 mov ax,0x2523 db 0xBA, 0x2D, 0x09 ; 0279 mov dx,0x92d @@ -324,73 +339,101 @@ find_file_end_char: ; 035e sahf pop di + .ret: ret + +__036d: + jmp print_eof_str + +__0370: + test byte [new_file_flag], 0xff + jnz __036d + + mov dx, [__0a9a] + cmp word [__0a80], 0 + jnz __0388 + + cmp dx, [__0a96] + jnc find_file_end_char.ret + +__0388: + movw r_di, r_dx + mov ah, sys_set_dta + int 0x21 + + mov cx, [__0a98] + subw r_cx, r_dx + jz _trampoline_oom_1 + + mov dx, psp_fcb_1 + mov ah, sys_random_block_read + int 0x21 + + mov [new_file_flag], al + push cx + call find_file_end_char + jne __03ab ; If the ^Z was not found + mov byte [new_file_flag], 1 ; magic + +__03ab: + xorw r_dx, r_dx + mov bx, [__0a80] + orw r_bx, r_bx + jnz __03ca + + movw r_ax, r_di + addw r_ax, r_cx + cmp ax, [__0a96] + jna __03ca ; disambiguate + + mov di, [__0a96] + movw r_cx, r_ax + subw r_cx, r_di + mov bx, 1 + +__03ca: + call __04a4 + cmp [di - 1], al + je __03de + + std + dec di + mov cx, [__0a98] + repne scasb + inc di + inc di + dec dx + cld + +__03de: + pop cx + mov word [di], 0x1a ; ^Z + subw r_cx, r_di + xchg di, [__0a9a] + addw r_di, r_cx + sub [psp_fcb_1 + fcb_record_low], di + sbb word [psp_fcb_1 + fcb_record_high], 0 + + cmpw r_bx, r_dx + jne __0406 + + mov byte [new_file_flag], 0 ; magic ret -db 0xE9, 0x8E, 0x00 ; 036D jmp 0x3fe -db 0xF6, 0x06, 0x7E, 0x0A, 0xFF ; 0370 test byte [0xa7e],0xff -db 0x75, 0xF6 ; 0375 jnz 0x36d -db 0x8B, 0x16, 0x9A, 0x0A ; 0377 mov dx,[0xa9a] -db 0x83, 0x3E, 0x80, 0x0A, 0x00 ; 037B cmp word [0xa80],byte +0x0 -db 0x75, 0x06 ; 0380 jnz 0x388 -db 0x3B, 0x16, 0x96, 0x0A ; 0382 cmp dx,[0xa96] -db 0x73, 0xE4 ; 0386 jnc 0x36c -db 0x8B, 0xFA ; 0388 mov di,dx -db 0xB4, 0x1A ; 038A mov ah,0x1a -db 0xCD, 0x21 ; 038C int 0x21 -db 0x8B, 0x0E, 0x98, 0x0A ; 038E mov cx,[0xa98] -db 0x2B, 0xCA ; 0392 sub cx,dx -db 0x74, 0x7E ; 0394 jz 0x414 -db 0xBA, 0x5C, 0x00 ; 0396 mov dx,0x5c -db 0xB4, 0x27 ; 0399 mov ah,0x27 -db 0xCD, 0x21 ; 039B int 0x21 -db 0xA2, 0x7E, 0x0A ; 039D mov [0xa7e],al -db 0x51 ; 03A0 push cx -db 0xE8, 0xBA, 0xFF ; 03A1 call 0x35e -db 0x75, 0x05 ; 03A4 jnz 0x3ab -db 0xC6, 0x06, 0x7E, 0x0A, 0x01 ; 03A6 mov byte [0xa7e],0x1 -db 0x33, 0xD2 ; 03AB xor dx,dx -db 0x8B, 0x1E, 0x80, 0x0A ; 03AD mov bx,[0xa80] -db 0x0B, 0xDB ; 03B1 or bx,bx -db 0x75, 0x15 ; 03B3 jnz 0x3ca -db 0x8B, 0xC7 ; 03B5 mov ax,di -db 0x03, 0xC1 ; 03B7 add ax,cx -db 0x3B, 0x06, 0x96, 0x0A ; 03B9 cmp ax,[0xa96] -db 0x76, 0x0B ; 03BD jna 0x3ca -db 0x8B, 0x3E, 0x96, 0x0A ; 03BF mov di,[0xa96] -db 0x8B, 0xC8 ; 03C3 mov cx,ax -db 0x2B, 0xCF ; 03C5 sub cx,di -db 0xBB, 0x01, 0x00 ; 03C7 mov bx,0x1 -db 0xE8, 0xD7, 0x00 ; 03CA call 0x4a4 -db 0x38, 0x45, 0xFF ; 03CD cmp [di-0x1],al -db 0x74, 0x0C ; 03D0 jz 0x3de -db 0xFD ; 03D2 std -db 0x4F ; 03D3 dec di -db 0x8B, 0x0E, 0x98, 0x0A ; 03D4 mov cx,[0xa98] -db 0xF2, 0xAE ; 03D8 repne scasb -db 0x47 ; 03DA inc di -db 0x47 ; 03DB inc di -db 0x4A ; 03DC dec dx -db 0xFC ; 03DD cld -db 0x59 ; 03DE pop cx -db 0xC7, 0x05, 0x1A, 0x00 ; 03DF mov word [di],0x1a -db 0x2B, 0xCF ; 03E3 sub cx,di -db 0x87, 0x3E, 0x9A, 0x0A ; 03E5 xchg di,[0xa9a] -db 0x03, 0xF9 ; 03E9 add di,cx -db 0x29, 0x3E, 0x7D, 0x00 ; 03EB sub [0x7d],di -db 0x83, 0x1E, 0x7F, 0x00, 0x00 ; 03EF sbb word [0x7f],byte +0x0 -db 0x3B, 0xDA ; 03F4 cmp bx,dx -db 0x75, 0x0E ; 03F6 jnz 0x406 -db 0xC6, 0x06, 0x7E, 0x0A, 0x00 ; 03F8 mov byte [0xa7e],0x0 -db 0xC3 ; 03FD ret -db 0xBA, 0x31, 0x0A ; 03FE mov dx,0xa31 -db 0xB4, 0x09 ; 0401 mov ah,0x9 -db 0xCD, 0x21 ; 0403 int 0x21 -db 0xC3 ; 0405 ret -db 0xF6, 0x06, 0x7E, 0x0A, 0xFF ; 0406 test byte [0xa7e],0xff -db 0x75, 0xF1 ; 040B jnz 0x3fe -db 0xF6, 0x06, 0x7F, 0x0A, 0xFF ; 040D test byte [0xa7f],0xff -db 0x75, 0xF1 ; 0412 jnz 0x405 -db 0xE9, 0xF5, 0x03 ; 0414 jmp 0x80c +print_eof_str: ; 03fe + mov dx, eof_str + mov ah, sys_print_string + int 0x21 + .ret: ret + +__0406: + test byte [new_file_flag], 0xff + jnz print_eof_str + test byte [__0a7f], 0xff + jnz print_eof_str.ret + +_trampoline_oom_1: ; 0414 + jmp oom + db 0x8B, 0x1E, 0x80, 0x0A ; 0417 mov bx,[0xa80] db 0x0B, 0xDB ; 041B or bx,bx db 0x75, 0x1C ; 041D jnz 0x43b @@ -450,6 +493,8 @@ 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 + +__04a4: db 0xB0, 0x0A ; 04A4 mov al,0xa db 0x0A, 0xC0 ; 04A6 or al,al db 0xE3, 0xCA ; 04A8 jcxz 0x474 @@ -815,10 +860,13 @@ db 0x5F ; 0807 pop di db 0x5E ; 0808 pop si db 0xF3, 0xA4 ; 0809 rep movsb db 0xC3 ; 080B ret -db 0xBA, 0xDD, 0x09 ; 080C mov dx,0x9dd -db 0xB4, 0x09 ; 080F mov ah,0x9 -db 0xCD, 0x21 ; 0811 int 0x21 -db 0xE9, 0x5D, 0xFA ; 0813 jmp 0x273 + +oom: ; 080c + mov dx, oom_str + mov ah, sys_print_string + int 0x21 + jmp __0273 + db 0xB8, 0x23, 0x25 ; 0816 mov ax,0x2523 db 0xBA, 0x7D, 0x08 ; 0819 mov dx,0x87d db 0xCD, 0x21 ; 081C int 0x21 @@ -927,23 +975,31 @@ 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 -db 0xB0, 0x0D ; 091D mov al,0xd -db 0xE8, 0x02, 0x00 ; 091F call 0x924 -db 0xB0, 0x0A ; 0922 mov al,0xa -db 0x52 ; 0924 push dx -db 0x92 ; 0925 xchg ax,dx -db 0xB4, 0x02 ; 0926 mov ah,0x2 -db 0xCD, 0x21 ; 0928 int 0x21 -db 0x92 ; 092A xchg ax,dx -db 0x5A ; 092B pop dx -db 0xC3 ; 092C ret -db 0x8C, 0xC8 ; 092D mov ax,cs -db 0x8E, 0xD8 ; 092F mov ds,ax -db 0x8E, 0xC0 ; 0931 mov es,ax -db 0x8E, 0xD0 ; 0933 mov ss,ax -db 0xBC, 0x48, 0x0D ; 0935 mov sp,0xd48 -db 0xE8, 0xE2, 0xFF ; 0938 call 0x91d -db 0xE9, 0x35, 0xF9 ; 093B jmp 0x273 + +newline: ; 091d + mov al, 13 ; CR + call print_char + mov al, 10 ; LF + +print_char: ; 0924 + push dx + xchg ax, dx + mov ah, sys_print_char + int 0x21 + xchg ax, dx + pop dx + ret + +ctrl_break_handler: ; 092d + mov ax, cs + mov ds, ax + mov es, ax + mov ss, ax + mov sp, stack.end + + call newline + + jmp __0273 bak_extension db "BAK" ; 093e @@ -952,13 +1008,13 @@ 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$" -__09dd db 13, 10, "Insufficient memory", 13, 10, '$' +oom_str db 13, 10, "Insufficient memory", 13, 10, '$' ; 09dd __09f5 db "Entry error", 13, 10, '$' new_file_str db "New file", 13, 10, '$' ; 0a03 __0a0e db "Not found", 13, 10, '$' __0a1a db "O.K.? $" __0a21 db "Line too long", 13, 10, '$' -__0a31 db "End of input file", 13, 10, '$' +eof_str db "End of input file", 13, 10, '$' ; 0a31 __0a45 db "Abort edit (Y/N)? $" ; 0a58 @@ -971,17 +1027,28 @@ resb 1 new_file_flag: resb 1 ; 0a7e __0a7f: resb 1 -resb 20 +__0a80: resw 1 +resb 14 +__0a90: resw 1 +__0a92: resw 1 __0a94: resw 1 __0a96: resw 1 __0a98: resw 1 -resb 430 +__0a9a: resw 1 + +__0a9c: resb 1 + +resb 385 + +__0c1e: resb 1 + +resb 41 stack: resb 256 ; 0c48 .end: ; 0d48 -resb 1 +__0d48: resb 1 disk_transfer_area: ; 0d49