mirror of https://github.com/nmlgc/ReC98.git
151 lines
2.7 KiB
NASM
151 lines
2.7 KiB
NASM
.8086
|
|
.model tiny
|
|
.code
|
|
org 100h
|
|
start:
|
|
jmp short entry
|
|
|
|
var102 dw 0
|
|
aNoComSoft db 'No COM-Soft !!!',13,10,10,'$'
|
|
|
|
entry:
|
|
cld
|
|
mov cx, word ptr proc_count
|
|
or cx, cx
|
|
jz short error
|
|
mov si, 80h
|
|
lodsb
|
|
or al, al
|
|
jz short print_procs
|
|
|
|
@scanargs:
|
|
lodsb
|
|
cmp al, 13
|
|
jz short print_procs
|
|
cmp al, 32
|
|
jz short @scanargs
|
|
jmp short findentry
|
|
|
|
; Outputs names of all embedded COM files and then exits
|
|
print_procs:
|
|
mov cx, word ptr proc_count
|
|
mov si, offset proc_names
|
|
mov dl, 13
|
|
mov ah, 2 ; INT=21/AH=02h - WRITE CHARACTER TO STANDARD OUTPUT
|
|
int 21h
|
|
mov dl, 10
|
|
int 21h
|
|
@outerloop:
|
|
push cx
|
|
mov dl, 32
|
|
int 21h
|
|
mov cx, 8
|
|
@innerloop:
|
|
lodsb
|
|
mov dl, al
|
|
int 21h
|
|
loop @innerloop
|
|
mov dl, 32
|
|
int 21h
|
|
pop cx
|
|
loop @outerloop
|
|
mov dl, 13
|
|
int 21h
|
|
mov dl, 10
|
|
int 21h
|
|
mov ah, 4Ch ; INT=21/AH=4Ch - TERMINATE WITH RETURN CODE
|
|
int 21h
|
|
; ---------------------------------------------------------------------------
|
|
|
|
findentry:
|
|
mov bx, offset proc_entries
|
|
mov cx, word ptr proc_count
|
|
mov si, offset proc_names
|
|
@loop:
|
|
mov word ptr var102, si
|
|
mov di, 5Dh ; Standard FCB 1 filename
|
|
push cx
|
|
mov cx, 8
|
|
repe cmpsb
|
|
jz short fixup
|
|
add bx, 2
|
|
mov si, word ptr var102
|
|
add si, 8
|
|
pop cx
|
|
loop @loop
|
|
|
|
error:
|
|
mov dx, offset aNoComSoft
|
|
mov ah, 9 ; INT=21/AH=09h - WRITE STRING TO STANDARD OUTPUT
|
|
int 21h
|
|
mov ah, 4Ch ; INT=21/AH=4Ch - TERMINATE WITH RETURN CODE
|
|
int 21h
|
|
; ---------------------------------------------------------------------------
|
|
|
|
; Fixup FCB and args before continuing
|
|
; BX points to the entry in proc_entries
|
|
fixup:
|
|
; Copy FCB 2 into FCB 1
|
|
mov di, 5Ch
|
|
mov si, 6Ch
|
|
mov cx, 10h
|
|
rep movsb
|
|
; Move arguments
|
|
mov si, 80h
|
|
lodsb
|
|
mov dl, al
|
|
@skipspace:
|
|
lodsb
|
|
dec dl
|
|
cmp al, 32
|
|
jz short @skipspace
|
|
@skipnonspace:
|
|
lodsb
|
|
dec dl
|
|
cmp al, 13
|
|
jz short @moveargs
|
|
cmp al, 32
|
|
jnz short @skipnonspace
|
|
@moveargs:
|
|
inc dl
|
|
mov di, 80h
|
|
mov al, dl
|
|
stosb
|
|
or dl,dl
|
|
jz short @emptyargs
|
|
dec si
|
|
mov cl, dl
|
|
xor ch, ch
|
|
rep movsb
|
|
@emptyargs:
|
|
mov byte ptr [di], 13
|
|
; setup registers for moventry
|
|
mov ax, [bx]
|
|
mov cx, [bx+2]
|
|
mov si, ax
|
|
sub cx, ax
|
|
mov di, 100h
|
|
jmp moveup_indirect
|
|
|
|
; ---------------------------------------------------------------------------
|
|
proc_count:
|
|
org $+2
|
|
proc_names:
|
|
org $+8*32
|
|
proc_entries:
|
|
org $+2*33
|
|
moveup_indirect:
|
|
;jmp moveup
|
|
org $+3
|
|
; ---------------------------------------------------------------------------
|
|
; subprograms go here
|
|
; ---------------------------------------------------------------------------
|
|
moveup: ; the following code is generated by zungen
|
|
;rep movsb
|
|
;pop ax
|
|
;mov ax, 100h
|
|
;push ax
|
|
;retn
|
|
; ---------------------------------------------------------------------------
|
|
END start
|