Compare commits
3 Commits
21c3c59489
...
0d9c29618f
Author | SHA1 | Date |
---|---|---|
Juhani Krekelä | 0d9c29618f | |
Juhani Krekelä | 137effd1c1 | |
Juhani Krekelä | 2b301c62ec |
469
edlin.asm
469
edlin.asm
|
@ -13,12 +13,18 @@ psp_segment_size equ 0x0006
|
|||
psp_fcb_1 equ 0x005c
|
||||
|
||||
; Syscall defines
|
||||
sys_print_char equ 2
|
||||
sys_print_string equ 9
|
||||
sys_read_line equ 0xa
|
||||
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 +49,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,15 +61,23 @@ 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
|
||||
|
||||
%macro cmp_byteaddr_bytext 2
|
||||
; Sign extended byte to byte
|
||||
%macro cmpb_addr_ext 2
|
||||
db 0x82, 0x3e ; cmp byte […], byte +… (extended)
|
||||
dw %1
|
||||
db %2
|
||||
%endmacro
|
||||
%macro cmpb_ext 2
|
||||
db 0x82, 0xf8 + %1
|
||||
db %2
|
||||
%endmacro
|
||||
|
||||
jmp entrypoint
|
||||
|
||||
|
@ -83,7 +100,7 @@ entrypoint: ; 0181
|
|||
mov sp, stack.end
|
||||
|
||||
ensure_file_argument:
|
||||
cmp_byteaddr_bytext psp_fcb_1 + fcb_filename, ' '
|
||||
cmpb_addr_ext psp_fcb_1 + fcb_filename, ' '
|
||||
je print_filename_missing_error
|
||||
|
||||
; AL at program start a flag of whether drive specifier in first parameter valid
|
||||
|
@ -154,7 +171,7 @@ setup_file_parameters: ; 01ec
|
|||
mov [psp_fcb_1 + fcb_record_size], ax
|
||||
mov [__0a58_fcb + fcb_record_size], ax
|
||||
|
||||
mov dx, disk_transfer_area
|
||||
mov dx, file_buffer
|
||||
movw r_di, r_dx
|
||||
mov ah, sys_set_dta
|
||||
int 0x21
|
||||
|
@ -164,10 +181,10 @@ setup_file_parameters: ; 01ec
|
|||
mov [__0a98], cx
|
||||
|
||||
test byte [new_file_flag], 0xff
|
||||
jnz __0240
|
||||
jnz initialize_editor
|
||||
|
||||
sub cx, disk_transfer_area
|
||||
; cx is now the amount of memory available starting at disk_transfer_area
|
||||
sub cx, file_buffer
|
||||
; cx is now the amount of memory available starting at file_buffer
|
||||
|
||||
; __0a94 = ¼ available memory
|
||||
shr cx, 1
|
||||
|
@ -178,44 +195,59 @@ setup_file_parameters: ; 01ec
|
|||
addw r_cx, r_ax
|
||||
|
||||
movw r_dx, r_cx
|
||||
add dx, disk_transfer_area
|
||||
add dx, file_buffer
|
||||
mov [__0a96], dx
|
||||
|
||||
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
|
||||
db 0xBC, 0x48, 0x0D ; 0273 mov sp,0xd48
|
||||
db 0xB8, 0x23, 0x25 ; 0276 mov ax,0x2523
|
||||
db 0xBA, 0x2D, 0x09 ; 0279 mov dx,0x92d
|
||||
db 0xCD, 0x21 ; 027C int 0x21
|
||||
db 0xB0, 0x2A ; 027E mov al,0x2a
|
||||
db 0xE8, 0xA1, 0x06 ; 0280 call 0x924
|
||||
db 0xBA, 0x9C, 0x0A ; 0283 mov dx,0xa9c
|
||||
db 0xB4, 0x0A ; 0286 mov ah,0xa
|
||||
db 0xCD, 0x21 ; 0288 int 0x21
|
||||
db 0xB0, 0x0A ; 028A mov al,0xa
|
||||
db 0xE8, 0x95, 0x06 ; 028C call 0x924
|
||||
db 0xC7, 0x06, 0x82, 0x0A, 0x00, 0x00 ; 028F mov word [0xa82],0x0
|
||||
db 0xC6, 0x06, 0x7D, 0x0A, 0x00 ; 0295 mov byte [0xa7d],0x0
|
||||
db 0xBE, 0x9E, 0x0A ; 029A mov si,0xa9e
|
||||
db 0xE8, 0x59, 0x00 ; 029D call 0x2f9
|
||||
initialize_editor: ; 0240
|
||||
cld
|
||||
|
||||
; Put ^Z at the end of the file in memory
|
||||
mov byte [di], 0x1a ; ^Z
|
||||
|
||||
mov [__0a9a], di
|
||||
mov byte [input_buffer.size], input_buffer.bufend - input_buffer.bufstart
|
||||
mov byte [__0c1e], 0xff ; magic
|
||||
mov byte [__0d48], 0x0a ; magic
|
||||
mov word [__0a92], file_buffer
|
||||
mov word [current_line], 1
|
||||
mov word [__0a80], 1 ; magic
|
||||
|
||||
test byte [new_file_flag], 0xff
|
||||
jnz editor_mainloop
|
||||
|
||||
call __0370
|
||||
|
||||
editor_mainloop: ; 0273
|
||||
mov sp, stack.end
|
||||
mov ax, sys_set_interrupt * 0x100 + int_ctrl_break
|
||||
mov dx, ctrl_break_handler
|
||||
int 0x21
|
||||
|
||||
print_prompt:
|
||||
mov al, '*'
|
||||
call print_char
|
||||
|
||||
mov dx, input_buffer
|
||||
mov ah, sys_read_line
|
||||
int 0x21
|
||||
|
||||
mov al, 10 ; LF
|
||||
call print_char
|
||||
|
||||
mov word [__0a82], 0
|
||||
mov byte [__0a7d], 0
|
||||
|
||||
mov si, input_buffer.bufstart
|
||||
call parse_line_specifier
|
||||
|
||||
db 0x89, 0x16, 0x80, 0x0A ; 02A0 mov [0xa80],dx
|
||||
db 0xE8, 0x43, 0x00 ; 02A4 call 0x2ea
|
||||
db 0x3C, 0x2C ; 02A7 cmp al,0x2c
|
||||
|
@ -245,50 +277,79 @@ db 0x72, 0x0F ; 02DE jc 0x2ef
|
|||
db 0xD1, 0xE3 ; 02E0 shl bx,1
|
||||
db 0xFF, 0x97, 0x4A, 0x03 ; 02E2 call [bx+0x34a]
|
||||
db 0xE9, 0x8A, 0xFF ; 02E6 jmp 0x273
|
||||
db 0xAC ; 02E9 lodsb
|
||||
db 0x3C, 0x20 ; 02EA cmp al,0x20
|
||||
db 0x74, 0xFB ; 02EC jz 0x2e9
|
||||
db 0xC3 ; 02EE ret
|
||||
db 0xBA, 0xF5, 0x09 ; 02EF mov dx,0x9f5
|
||||
db 0xB4, 0x09 ; 02F2 mov ah,0x9
|
||||
db 0xCD, 0x21 ; 02F4 int 0x21
|
||||
db 0xE9, 0x7A, 0xFF ; 02F6 jmp 0x273
|
||||
db 0xE8, 0xED, 0xFF ; 02F9 call 0x2e9
|
||||
db 0x3C, 0x2E ; 02FC cmp al,0x2e
|
||||
db 0x74, 0x35 ; 02FE jz 0x335
|
||||
db 0x3C, 0x23 ; 0300 cmp al,0x23
|
||||
db 0x74, 0x37 ; 0302 jz 0x33b
|
||||
db 0xBA, 0x00, 0x00 ; 0304 mov dx,0x0
|
||||
db 0xB1, 0x00 ; 0307 mov cl,0x0
|
||||
db 0x3C, 0x30 ; 0309 cmp al,0x30
|
||||
db 0x72, 0x1E ; 030B jc 0x32b
|
||||
db 0x3C, 0x39 ; 030D cmp al,0x39
|
||||
db 0x77, 0x1A ; 030F ja 0x32b
|
||||
db 0x81, 0xFA, 0x99, 0x19 ; 0311 cmp dx,0x1999
|
||||
db 0x73, 0xD8 ; 0315 jnc 0x2ef
|
||||
db 0xB1, 0x01 ; 0317 mov cl,0x1
|
||||
db 0x2C, 0x30 ; 0319 sub al,0x30
|
||||
db 0x8B, 0xDA ; 031B mov bx,dx
|
||||
db 0xD1, 0xE2 ; 031D shl dx,1
|
||||
db 0xD1, 0xE2 ; 031F shl dx,1
|
||||
db 0x03, 0xD3 ; 0321 add dx,bx
|
||||
db 0xD1, 0xE2 ; 0323 shl dx,1
|
||||
db 0x98 ; 0325 cbw
|
||||
db 0x03, 0xD0 ; 0326 add dx,ax
|
||||
db 0xAC ; 0328 lodsb
|
||||
db 0xEB, 0xDE ; 0329 jmp short 0x309
|
||||
db 0x82 ; 032B db 0x82
|
||||
db 0xF9 ; 032C stc
|
||||
db 0x00, 0x74, 0xBE ; 032D add [si-0x42],dh
|
||||
db 0x0B, 0xD2 ; 0330 or dx,dx
|
||||
db 0x74, 0xBB ; 0332 jz 0x2ef
|
||||
db 0xC3 ; 0334 ret
|
||||
db 0x8B, 0x16, 0x90, 0x0A ; 0335 mov dx,[0xa90]
|
||||
db 0xAC ; 0339 lodsb
|
||||
db 0xC3 ; 033A ret
|
||||
db 0xBA, 0xFE, 0xFF ; 033B mov dx,0xfffe
|
||||
db 0xAC ; 033E lodsb
|
||||
db 0xC3 ; 033F ret
|
||||
|
||||
skip_spaces: ; 02e9
|
||||
lodsb
|
||||
cmp al, ' '
|
||||
je skip_spaces
|
||||
.ret: ret
|
||||
|
||||
print_entry_error: ; 02ef
|
||||
mov dx, entry_error
|
||||
mov ah, sys_print_string
|
||||
int 0x21
|
||||
jmp editor_mainloop
|
||||
|
||||
parse_line_specifier: ; 02f9
|
||||
call skip_spaces
|
||||
cmp al, '.'
|
||||
je .current_line
|
||||
cmp al, '#'
|
||||
je .last_line
|
||||
|
||||
mov dx, 0
|
||||
mov cl, 0 ; No digits read yet
|
||||
|
||||
.loop: ; 0309
|
||||
cmp al, '0'
|
||||
jb .not_digit
|
||||
cmp al, '9'
|
||||
ja .not_digit
|
||||
|
||||
; Would we overflow?
|
||||
cmp dx, 65536 / 10
|
||||
jnb print_entry_error ; Yes
|
||||
|
||||
mov cl, 1 ; We have now read a digit
|
||||
|
||||
sub al, '0'
|
||||
|
||||
; dx = dx*10
|
||||
movw r_bx, r_dx
|
||||
shl dx, 1
|
||||
shl dx, 1
|
||||
addw r_dx, r_bx
|
||||
shl dx, 1
|
||||
|
||||
cbw
|
||||
addw r_dx, r_ax
|
||||
|
||||
lodsb
|
||||
|
||||
jmp .loop
|
||||
|
||||
.not_digit: ; 032b
|
||||
; Have we started reading a number?
|
||||
cmpb_ext r_cl, 0
|
||||
je skip_spaces.ret ; No
|
||||
|
||||
; Yes, and it's zero
|
||||
orw r_dx, r_dx
|
||||
jz print_entry_error
|
||||
|
||||
; Yes, it's nonzero
|
||||
ret
|
||||
|
||||
.current_line: ; 0335
|
||||
mov dx, [current_line]
|
||||
lodsb
|
||||
ret
|
||||
|
||||
.last_line: ; 033b
|
||||
mov dx, 0xfffe ; TODO: Why 0xfffe and not 0xffff?
|
||||
lodsb
|
||||
ret
|
||||
|
||||
db 0x51 ; 0340 push cx
|
||||
db 0x57 ; 0341 push di
|
||||
db 0x41 ; 0342 inc cx
|
||||
|
@ -324,73 +385,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]
|
||||
jnb 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
|
||||
|
||||
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 +539,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 +906,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 editor_mainloop
|
||||
|
||||
db 0xB8, 0x23, 0x25 ; 0816 mov ax,0x2523
|
||||
db 0xBA, 0x7D, 0x08 ; 0819 mov dx,0x87d
|
||||
db 0xCD, 0x21 ; 081C int 0x21
|
||||
|
@ -927,23 +1021,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 editor_mainloop
|
||||
|
||||
bak_extension db "BAK" ; 093e
|
||||
|
||||
|
@ -952,36 +1054,51 @@ 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, '$'
|
||||
__09f5 db "Entry error", 13, 10, '$'
|
||||
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.? $"
|
||||
__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
|
||||
section .bss
|
||||
__0a58_fcb: resb 37 ; 0a58 … 0a7c
|
||||
|
||||
; 0a7d
|
||||
resb 1
|
||||
__0a7d: resb 1
|
||||
|
||||
new_file_flag: resb 1 ; 0a7e
|
||||
__0a7f: resb 1
|
||||
|
||||
resb 20
|
||||
__0a80: resw 1
|
||||
__0a82: resw 1
|
||||
resb 12
|
||||
current_line: resw 1 ; 0a90
|
||||
__0a92: resw 1
|
||||
|
||||
__0a94: resw 1
|
||||
__0a96: resw 1
|
||||
__0a98: resw 1
|
||||
|
||||
resb 430
|
||||
__0a9a: resw 1
|
||||
|
||||
input_buffer:
|
||||
.size: resb 1 ; 0a9c
|
||||
.fill: resb 1; 0a9d
|
||||
.bufstart: resb 128 ; 0a9e
|
||||
.bufend: ; 0b1e
|
||||
|
||||
resb 256
|
||||
|
||||
__0c1e: resb 1
|
||||
|
||||
resb 41
|
||||
|
||||
stack: resb 256 ; 0c48
|
||||
.end: ; 0d48
|
||||
|
||||
resb 1
|
||||
__0d48: resb 1
|
||||
|
||||
disk_transfer_area: ; 0d49
|
||||
file_buffer: ; 0d49
|
||||
|
|
Loading…
Reference in New Issue