From 1383c6b59d52a757b90e7ddec9be25c526e20e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Fri, 30 Jul 2021 14:16:19 +0300 Subject: [PATCH] Initial file setup --- edlin.asm | 217 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 144 insertions(+), 73 deletions(-) diff --git a/edlin.asm b/edlin.asm index 5fad037..e847e33 100644 --- a/edlin.asm +++ b/edlin.asm @@ -4,8 +4,12 @@ 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 @@ -13,10 +17,33 @@ 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 (longer encoding) + 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 @@ -43,7 +70,7 @@ _trampoline_error_1: entrypoint: ; 0181 mov byte [__0a7f], 0 - mov sp, stack_end + mov sp, stack.end ensure_file_argument: cmp_byteaddr_bytext psp_fcb_1 + fcb_filename, ' ' @@ -58,72 +85,100 @@ ensure_file_argument: mov di, psp_fcb_1 + fcb_filename + 8 mov cx, 3 repe cmpsb - je __01e6 -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 + je print_bak_error -__01e6: -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 +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 @@ -243,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 @@ -890,13 +949,25 @@ __0a45 db "Abort edit (Y/N)? $" ; 0a58 section .bss -__0a58: +__0a58_fcb: resb 37 ; 0a58 … 0a7c -resb 38 +; 0a7d +resb 1 -__0a7e: resb 1 +new_file_flag: resb 1 ; 0a7e __0a7f: resb 1 -resb 712 +resb 20 -stack_end: ; 0d48 +__0a94: resw 1 +__0a96: resw 1 +__0a98: resw 1 + +resb 430 + +stack: resb 256 ; 0c48 +.end: ; 0d48 + +resb 1 + +disk_transfer_area: ; 0d49