diff --git a/edlin.asm b/edlin.asm index 4ac48db..d1162b9 100644 --- a/edlin.asm +++ b/edlin.asm @@ -248,38 +248,54 @@ editor_mainloop: ; 0273 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 -db 0x75, 0x01 ; 02A9 jnz 0x2ac -db 0x46 ; 02AB inc si -db 0x4E ; 02AC dec si -db 0xE8, 0x49, 0x00 ; 02AD call 0x2f9 -db 0x89, 0x16, 0x82, 0x0A ; 02B0 mov [0xa82],dx -db 0xE8, 0x33, 0x00 ; 02B4 call 0x2ea -db 0x3C, 0x3F ; 02B7 cmp al,0x3f -db 0x75, 0x06 ; 02B9 jnz 0x2c1 -db 0xA2, 0x7D, 0x0A ; 02BB mov [0xa7d],al -db 0xE8, 0x28, 0x00 ; 02BE call 0x2e9 -db 0x3C, 0x5F ; 02C1 cmp al,0x5f -db 0x76, 0x02 ; 02C3 jna 0x2c7 -db 0x24, 0x5F ; 02C5 and al,0x5f -db 0xBF, 0x40, 0x03 ; 02C7 mov di,0x340 -db 0xB9, 0x0A, 0x00 ; 02CA mov cx,0xa -db 0xF2, 0xAE ; 02CD repne scasb -db 0x75, 0x1E ; 02CF jnz 0x2ef -db 0x8B, 0xD9 ; 02D1 mov bx,cx -db 0xA1, 0x82, 0x0A ; 02D3 mov ax,[0xa82] -db 0x0B, 0xC0 ; 02D6 or ax,ax -db 0x74, 0x06 ; 02D8 jz 0x2e0 -db 0x3B, 0x06, 0x80, 0x0A ; 02DA cmp ax,[0xa80] -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 + mov [__0a80], dx + call skip_spaces.no_load + + cmp al, ',' + jne .no_skip_comma + inc si + +.no_skip_comma: + dec si + call parse_line_specifier + mov [__0a82], dx + + call skip_spaces.no_load + + cmp al, '?' + jne .not_question_mark + + mov [__0a7d], al + call skip_spaces + +.not_question_mark: + cmp al, 0x5f + jna .match_command + and al, 0x5f + +.match_command: + mov di, commands + mov cx, 10 + repne scasb + jne print_entry_error ; Not found + + movw r_bx, r_cx + mov ax, [__0a82] + orw r_ax, r_ax + jz __02e0 + + cmp ax, [__0a80] + jb print_entry_error + +__02e0: + shl bx, 1 + call [bx + command_addresses] + + jmp near editor_mainloop skip_spaces: ; 02e9 lodsb + .no_load: ; 02ea cmp al, ' ' je skip_spaces .ret: ret @@ -350,26 +366,18 @@ parse_line_specifier: ; 02f9 lodsb ret -db 0x51 ; 0340 push cx -db 0x57 ; 0341 push di -db 0x41 ; 0342 inc cx -db 0x53 ; 0343 push bx -db 0x52 ; 0344 push dx -db 0x44 ; 0345 inc sp -db 0x4C ; 0346 dec sp -db 0x49 ; 0347 dec cx -db 0x45 ; 0348 inc bp -db 0x0D, 0x85, 0x07 ; 0349 or ax,0x785 -db 0xCD, 0x08 ; 034C int 0x8 -db 0x16 ; 034E push ss -db 0x08, 0x0E, 0x05, 0x4E ; 034F or [0x4e05],cl -db 0x07 ; 0353 pop es -db 0x96 ; 0354 xchg ax,si -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 ; 035D db 0x08 +commands db 'QWASRDLIE', 13 ; 0340 +command_addresses: ; 034a + dw command_q ; Q + dw command_w ; W + dw command_a ; A + dw command_s ; S + dw command_r ; R + dw command_d ; D + dw command_l ; L + dw __0370 ; I + dw command_e ; E + dw command_cr ; CR find_file_end_char: ; 035e push di @@ -480,6 +488,7 @@ __0406: _trampoline_oom_1: ; 0414 jmp oom +command_e: ; 0417 db 0x8B, 0x1E, 0x80, 0x0A ; 0417 mov bx,[0xa80] db 0x0B, 0xDB ; 041B or bx,bx db 0x75, 0x1C ; 041D jnz 0x43b @@ -592,6 +601,8 @@ db 0xB3, 0x00 ; 0505 mov bl,0x0 db 0x04, 0x30 ; 0507 add al,0x30 db 0x2A, 0xC3 ; 0509 sub al,bl db 0xE9, 0x16, 0x04 ; 050B jmp 0x924 + +command_s: ; 050e db 0x8B, 0x1E, 0x80, 0x0A ; 050E mov bx,[0xa80] db 0x0B, 0xDB ; 0512 or bx,bx db 0x75, 0x0C ; 0514 jnz 0x522 @@ -657,6 +668,8 @@ db 0x4F ; 0590 dec di db 0xAA ; 0591 stosb db 0xC3 ; 0592 ret db 0xE9, 0xC9, 0x00 ; 0593 jmp 0x65f + +command_d: ; 0596 db 0xE8, 0xFD, 0x00 ; 0596 call 0x696 db 0x75, 0xF8 ; 0599 jnz 0x593 db 0x8B, 0x36, 0x8C, 0x0A ; 059B mov si,[0xa8c] @@ -712,6 +725,8 @@ db 0xE2, 0xF9 ; 061F loop 0x61a db 0xC3 ; 0621 ret db 0xBA, 0x21, 0x0A ; 0622 mov dx,0xa21 db 0xEB, 0x3B ; 0625 jmp short 0x662 + +command_l: ; 0627 db 0xE8, 0x6C, 0x00 ; 0627 call 0x696 db 0x75, 0x33 ; 062A jnz 0x65f db 0x8B, 0x1E, 0x8A, 0x0A ; 062C mov bx,[0xa8a] @@ -826,6 +841,8 @@ db 0x74, 0xF4 ; 0748 jz 0x73e db 0xAA ; 074A stosb db 0x41 ; 074B inc cx db 0xEB, 0xF3 ; 074C jmp short 0x741 + +command_r: ; 074e db 0x8B, 0x1E, 0x80, 0x0A ; 074E mov bx,[0xa80] db 0x0B, 0xDB ; 0752 or bx,bx db 0x75, 0x04 ; 0754 jnz 0x75a @@ -849,6 +866,8 @@ db 0x89, 0x3E, 0x92, 0x0A ; 077A mov [0xa92],di db 0x33, 0xC9 ; 077E xor cx,cx db 0xEB, 0x55 ; 0780 jmp short 0x7d7 db 0xE9, 0x6A, 0xFB ; 0782 jmp 0x2ef + +command_q: ; 0785 db 0x8B, 0x1E, 0x80, 0x0A ; 0785 mov bx,[0xa80] db 0x0B, 0xDB ; 0789 or bx,bx db 0x75, 0x05 ; 078B jnz 0x792 @@ -913,6 +932,7 @@ oom: ; 080c int 0x21 jmp editor_mainloop +command_a: ; 08cd db 0xB8, 0x23, 0x25 ; 0816 mov ax,0x2523 db 0xBA, 0x7D, 0x08 ; 0819 mov dx,0x87d db 0xCD, 0x21 ; 081C int 0x21 @@ -974,6 +994,8 @@ db 0xF3, 0xA4 ; 089C rep movsb db 0x4F ; 089E dec di db 0x89, 0x3E, 0x9A, 0x0A ; 089F mov [0xa9a],di db 0xE9, 0xCD, 0xF9 ; 08A3 jmp 0x273 + +command_cr: ; 08a6 db 0xBA, 0x45, 0x0A ; 08A6 mov dx,0xa45 db 0xB4, 0x09 ; 08A9 mov ah,0x9 db 0xCD, 0x21 ; 08AB int 0x21 @@ -990,6 +1012,8 @@ db 0xCD, 0x21 ; 08C0 int 0x21 db 0xCD, 0x20 ; 08C2 int 0x20 db 0xC7, 0x06, 0x80, 0x0A, 0xFF, 0xFF ; 08C4 mov word [0xa80],0xffff db 0xE8, 0xA3, 0xFA ; 08CA call 0x370 + +command_w: ; 08cd db 0xC6, 0x06, 0x7F, 0x0A, 0x01 ; 08CD mov byte [0xa7f],0x1 db 0xBB, 0xFF, 0xFF ; 08D2 mov bx,0xffff db 0xE8, 0x63, 0xFB ; 08D5 call 0x43b