Compare commits
3 commits
b802689b66
...
1383c6b59d
Author | SHA1 | Date | |
---|---|---|---|
|
1383c6b59d | ||
|
6fa68e1fc1 | ||
|
aef2ee578c |
1 changed files with 183 additions and 80 deletions
263
edlin.asm
263
edlin.asm
|
@ -3,10 +3,55 @@ org 0x100
|
|||
|
||||
; FCB defines
|
||||
fcb_filename equ 1
|
||||
fcb_extension equ fcb_filename + 8
|
||||
fcb_record_size equ 14
|
||||
fcb_record_low equ 33
|
||||
fcb_record_high equ 35
|
||||
|
||||
; PSP defines
|
||||
psp_segment_size equ 0x0006
|
||||
psp_fcb_1 equ 0x005c
|
||||
|
||||
; Syscall defined
|
||||
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
|
||||
|
||||
; Special instruction encodings
|
||||
%macro add_cx_ax 0
|
||||
db 0x03, 0xC8 ; add cx, ax (direction swapped)
|
||||
%endmacro
|
||||
%macro add_di_cx 0
|
||||
db 0x03, 0xF9 ; 023E add di, cx (direction swapped)
|
||||
%endmacro
|
||||
|
||||
%macro or_al_al 0
|
||||
db 0x0a, 0xc0 ; or al, al (direction swapped)
|
||||
%endmacro
|
||||
|
||||
%macro xor_ax_ax 0
|
||||
db 0x33, 0xc0 ; xor ax, ax (direction swapped)
|
||||
%endmacro
|
||||
|
||||
%macro mov_ax_cx 0
|
||||
db 0x8b, 0xc1 ; mov ax, cx (direction swapped)
|
||||
%endmacro
|
||||
%macro mov_dx_cx 0
|
||||
db 0x8b, 0xD1 ; mov dx, cx (direction swapped)
|
||||
%endmacro
|
||||
%macro mov_di_dx 0
|
||||
db 0x8B, 0xfa ; mov di, dx (direction swapped)
|
||||
%endmacro
|
||||
|
||||
%macro cmp_byteaddr_bytext 2
|
||||
db 0x82, 0x3e ; cmp byte […], byte +… (extended)
|
||||
dw %1
|
||||
db %2
|
||||
%endmacro
|
||||
|
||||
jmp entrypoint
|
||||
|
||||
__0102:
|
||||
|
@ -24,87 +69,116 @@ _trampoline_error_1:
|
|||
jmp error
|
||||
|
||||
entrypoint: ; 0181
|
||||
mov byte [0x0a7f], 0
|
||||
mov sp, 0x0d48
|
||||
mov byte [__0a7f], 0
|
||||
mov sp, stack.end
|
||||
|
||||
ensure_file_argument:
|
||||
db 0x82, 0x3e ; cmp byte […], byte +… (extended)
|
||||
dw psp_fcb_1 + fcb_filename
|
||||
db ' '
|
||||
cmp_byteaddr_bytext psp_fcb_1 + fcb_filename, ' '
|
||||
je print_filename_missing_error
|
||||
|
||||
db 0x0a, 0xc0 ; or al, al (longer encoding)
|
||||
; AL at program start a flag of whether drive specifier in first parameter valid
|
||||
or_al_al
|
||||
mov dx, invalid_name_error
|
||||
jnz _trampoline_error_1
|
||||
|
||||
db 0xBE, 0x3E, 0x09 ; 0197 mov si,0x93e
|
||||
db 0xBF, 0x65, 0x00 ; 019A mov di,0x65
|
||||
db 0xB9, 0x03, 0x00 ; 019D mov cx,0x3
|
||||
db 0xF3, 0xA6 ; 01A0 repe cmpsb
|
||||
db 0x74, 0x42 ; 01A2 jz 0x1e6
|
||||
db 0xB4, 0x0F ; 01A4 mov ah,0xf
|
||||
db 0xBA, 0x5C, 0x00 ; 01A6 mov dx,0x5c
|
||||
db 0xCD, 0x21 ; 01A9 int 0x21
|
||||
db 0xA2, 0x7E, 0x0A ; 01AB mov [0xa7e],al
|
||||
db 0x0A, 0xC0 ; 01AE or al,al
|
||||
db 0x74, 0x07 ; 01B0 jz 0x1b9
|
||||
db 0xBA, 0x03, 0x0A ; 01B2 mov dx,0xa03
|
||||
db 0xB4, 0x09 ; 01B5 mov ah,0x9
|
||||
db 0xCD, 0x21 ; 01B7 int 0x21
|
||||
db 0xBE, 0x5C, 0x00 ; 01B9 mov si,0x5c
|
||||
db 0xBF, 0x58, 0x0A ; 01BC mov di,0xa58
|
||||
db 0xB9, 0x09, 0x00 ; 01BF mov cx,0x9
|
||||
db 0xF3, 0xA4 ; 01C2 rep movsb
|
||||
db 0xBE, 0x3E, 0x09 ; 01C4 mov si,0x93e
|
||||
db 0xA5 ; 01C7 movsw
|
||||
db 0xA4 ; 01C8 movsb
|
||||
db 0xB4, 0x13 ; 01C9 mov ah,0x13
|
||||
db 0xBA, 0x58, 0x0A ; 01CB mov dx,0xa58
|
||||
db 0xCD, 0x21 ; 01CE int 0x21
|
||||
db 0xB0, 0x24 ; 01D0 mov al,0x24
|
||||
db 0xBF, 0x61, 0x0A ; 01D2 mov di,0xa61
|
||||
db 0xAA ; 01D5 stosb
|
||||
db 0xAA ; 01D6 stosb
|
||||
db 0xAA ; 01D7 stosb
|
||||
db 0xB4, 0x16 ; 01D8 mov ah,0x16
|
||||
db 0xCD, 0x21 ; 01DA int 0x21
|
||||
db 0x0A, 0xC0 ; 01DC or al,al
|
||||
db 0x74, 0x0C ; 01DE jz 0x1ec
|
||||
db 0xBA, 0x9B, 0x09 ; 01E0 mov dx,0x99b
|
||||
db 0xE9, 0x96, 0x02 ; 01E3 jmp 0x47c
|
||||
db 0xBA, 0x78, 0x09 ; 01E6 mov dx,0x978
|
||||
db 0xE9, 0x90, 0x02 ; 01E9 jmp 0x47c
|
||||
db 0x33, 0xC0 ; 01EC xor ax,ax
|
||||
db 0xA3, 0x7D, 0x00 ; 01EE mov [0x7d],ax
|
||||
db 0xA3, 0x7F, 0x00 ; 01F1 mov [0x7f],ax
|
||||
db 0xA3, 0x79, 0x0A ; 01F4 mov [0xa79],ax
|
||||
db 0xA3, 0x7B, 0x0A ; 01F7 mov [0xa7b],ax
|
||||
db 0x40 ; 01FA inc ax
|
||||
db 0xA3, 0x6A, 0x00 ; 01FB mov [0x6a],ax
|
||||
db 0xA3, 0x66, 0x0A ; 01FE mov [0xa66],ax
|
||||
db 0xBA, 0x49, 0x0D ; 0201 mov dx,0xd49
|
||||
db 0x8B, 0xFA ; 0204 mov di,dx
|
||||
db 0xB4, 0x1A ; 0206 mov ah,0x1a
|
||||
db 0xCD, 0x21 ; 0208 int 0x21
|
||||
db 0x8B, 0x0E, 0x06, 0x00 ; 020A mov cx,[0x6]
|
||||
db 0x49 ; 020E dec cx
|
||||
db 0x89, 0x0E, 0x98, 0x0A ; 020F mov [0xa98],cx
|
||||
db 0xF6, 0x06, 0x7E, 0x0A, 0xFF ; 0213 test byte [0xa7e],0xff
|
||||
db 0x75, 0x26 ; 0218 jnz 0x240
|
||||
db 0x81, 0xE9, 0x49, 0x0D ; 021A sub cx,0xd49
|
||||
db 0xD1, 0xE9 ; 021E shr cx,1
|
||||
db 0x8B, 0xC1 ; 0220 mov ax,cx
|
||||
db 0xD1, 0xE9 ; 0222 shr cx,1
|
||||
db 0x89, 0x0E, 0x94, 0x0A ; 0224 mov [0xa94],cx
|
||||
db 0x03, 0xC8 ; 0228 add cx,ax
|
||||
db 0x8B, 0xD1 ; 022A mov dx,cx
|
||||
db 0x81, 0xC2, 0x49, 0x0D ; 022C add dx,0xd49
|
||||
db 0x89, 0x16, 0x96, 0x0A ; 0230 mov [0xa96],dx
|
||||
db 0xBA, 0x5C, 0x00 ; 0234 mov dx,0x5c
|
||||
db 0xB4, 0x27 ; 0237 mov ah,0x27
|
||||
db 0xCD, 0x21 ; 0239 int 0x21
|
||||
db 0xE8, 0x20, 0x01 ; 023B call 0x35e
|
||||
db 0x03, 0xF9 ; 023E add di,cx
|
||||
mov si, bak_extension
|
||||
mov di, psp_fcb_1 + fcb_filename + 8
|
||||
mov cx, 3
|
||||
repe cmpsb
|
||||
je print_bak_error
|
||||
|
||||
open_file:
|
||||
mov ah, sys_open_file
|
||||
mov dx, psp_fcb_1
|
||||
int 0x21
|
||||
|
||||
mov [new_file_flag], al
|
||||
or_al_al
|
||||
jz delete_old_bak
|
||||
|
||||
mov dx, new_file_str
|
||||
mov ah, sys_print_string
|
||||
int 0x21
|
||||
|
||||
delete_old_bak: ; 01b9
|
||||
mov si, psp_fcb_1
|
||||
mov di, __0a58_fcb
|
||||
mov cx, 9
|
||||
rep movsb
|
||||
|
||||
mov si, bak_extension
|
||||
movsw
|
||||
movsb
|
||||
|
||||
mov ah, sys_delete_file
|
||||
mov dx, __0a58_fcb
|
||||
int 0x21
|
||||
|
||||
; TODO: Why .$$$? What is this used for?
|
||||
mov al, '$'
|
||||
mov di, __0a58_fcb + fcb_extension
|
||||
stosb
|
||||
stosb
|
||||
stosb
|
||||
|
||||
mov ah, sys_create_file
|
||||
int 0x21
|
||||
or_al_al
|
||||
jz setup_file_parameters
|
||||
|
||||
mov dx, directory_full_error
|
||||
jmp error
|
||||
|
||||
print_bak_error: ; 01e6
|
||||
mov dx, bak_error
|
||||
jmp error
|
||||
|
||||
setup_file_parameters: ; 01ec
|
||||
xor_ax_ax
|
||||
mov [psp_fcb_1 + fcb_record_low], ax
|
||||
mov [psp_fcb_1 + fcb_record_high], ax
|
||||
mov [__0a58_fcb + fcb_record_low], ax
|
||||
mov [__0a58_fcb + fcb_record_high], ax
|
||||
|
||||
inc ax
|
||||
mov [psp_fcb_1 + fcb_record_size], ax
|
||||
mov [__0a58_fcb + fcb_record_size], ax
|
||||
|
||||
mov dx, disk_transfer_area
|
||||
mov_di_dx
|
||||
mov ah, sys_set_dta
|
||||
int 0x21
|
||||
|
||||
mov cx, [psp_segment_size]
|
||||
dec cx
|
||||
mov [__0a98], cx
|
||||
|
||||
test byte [new_file_flag], 0xff
|
||||
jnz __0240
|
||||
|
||||
sub cx, disk_transfer_area
|
||||
; cx is now the amount of memory available starting at disk_transfer_area
|
||||
|
||||
; __0a94 = ¼ available memory
|
||||
shr cx, 1
|
||||
mov_ax_cx
|
||||
shr cx, 1
|
||||
mov [__0a94], cx
|
||||
; __0a94 = ¾ available memory
|
||||
add_cx_ax
|
||||
|
||||
mov_dx_cx
|
||||
add dx, disk_transfer_area
|
||||
mov [__0a96], dx
|
||||
|
||||
read_file:
|
||||
mov dx, psp_fcb_1
|
||||
mov ah, sys_block_read
|
||||
int 0x21
|
||||
call __035e
|
||||
add_di_cx
|
||||
|
||||
__0240:
|
||||
db 0xFC ; 0240 cld
|
||||
db 0xC6, 0x05, 0x1A ; 0241 mov byte [di],0x1a
|
||||
db 0x89, 0x3E, 0x9A, 0x0A ; 0244 mov [0xa9a],di
|
||||
|
@ -224,7 +298,11 @@ db 0x05, 0x27, 0x06 ; 0355 add ax,0x627
|
|||
db 0x70, 0x03 ; 0358 jo 0x35d
|
||||
db 0x17 ; 035A pop ss
|
||||
db 0x04, 0xA6 ; 035B add al,0xa6
|
||||
db 0x08, 0x57, 0x51 ; 035D or [bx+0x51],dl
|
||||
db 0x08 ; 035D db 0x08
|
||||
|
||||
__035e:
|
||||
db 0x57 ; 035E push di
|
||||
db 0x51 ; 035F push cx
|
||||
db 0xB0, 0x1A ; 0360 mov al,0x1a
|
||||
db 0xF2, 0xAE ; 0362 repne scasb
|
||||
db 0x8B, 0xF9 ; 0364 mov di,cx
|
||||
|
@ -341,7 +419,7 @@ db 0xCD, 0x21 ; 0477 int 0x21
|
|||
db 0xBA, 0xB9, 0x09 ; 0479 mov dx,0x9b9
|
||||
|
||||
error: ; 047c
|
||||
mov ah, 9
|
||||
mov ah, sys_print_string
|
||||
int 0x21
|
||||
int 0x20
|
||||
|
||||
|
@ -853,18 +931,43 @@ db 0xBC, 0x48, 0x0D ; 0935 mov sp,0xd48
|
|||
db 0xE8, 0xE2, 0xFF ; 0938 call 0x91d
|
||||
db 0xE9, 0x35, 0xF9 ; 093B jmp 0x273
|
||||
|
||||
__093e db "BAK"
|
||||
bak_extension db "BAK" ; 093e
|
||||
|
||||
invalid_name_error db "Invalid drive or file name$" ; 0941
|
||||
filename_missing_error db "File name must be specified$" ; 095c
|
||||
__0978 db "Cannot edit .BAK file--rename file$"
|
||||
__099b db "No room in directory for file$"
|
||||
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, '$'
|
||||
__0a03 db "New file", 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, '$'
|
||||
__0a45 db "Abort edit (Y/N)? $"
|
||||
|
||||
; 0a58
|
||||
section .bss
|
||||
__0a58_fcb: resb 37 ; 0a58 … 0a7c
|
||||
|
||||
; 0a7d
|
||||
resb 1
|
||||
|
||||
new_file_flag: resb 1 ; 0a7e
|
||||
__0a7f: resb 1
|
||||
|
||||
resb 20
|
||||
|
||||
__0a94: resw 1
|
||||
__0a96: resw 1
|
||||
__0a98: resw 1
|
||||
|
||||
resb 430
|
||||
|
||||
stack: resb 256 ; 0c48
|
||||
.end: ; 0d48
|
||||
|
||||
resb 1
|
||||
|
||||
disk_transfer_area: ; 0d49
|
||||
|
|
Loading…
Reference in a new issue