Files
hovertank_3d/IDLIBC.ASM
T
2026-07-14 19:31:07 +02:00

8172 lines
124 KiB
NASM

; Hovertank 3-D Source Code
; Copyright (C) 1993-2014 Flat Rock Software
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License along
; with this program; if not, write to the Free Software Foundation, Inc.,
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ifndef ??version
?debug macro
endm
publicdll macro name
public name
endm
$comm macro name,dist,size,count
comm dist name:BYTE:count*size
endm
else
$comm macro name,dist,size,count
comm dist name[size]:BYTE:count
endm
endif
?debug S "idlibc.c"
?debug C E92C869D160869646C6962632E63
?debug C E9D03A9E160749444C49422E48
?debug C E9AE10A3160A4752415048484F562E48
?debug C E92592951609534E4453484F562E48
?debug C E900104D1616433A5C42435C494E434C5544455C7374646172672E+
?debug C 68
?debug C E900104D1613433A5C42435C494E434C5544455C646F732E68
?debug C E900104D1613433A5C42435C494E434C5544455C6D656D2E68
?debug C E900104D1618433A5C42435C494E434C5544455C7379735C737461+
?debug C 742E68
?debug C E900104D1615433A5C42435C494E434C5544455C66636E746C2E68
?debug C E900104D1616433A5C42435C494E434C5544455C7374646C69622E+
?debug C 68
?debug C E900104D1615433A5C42435C494E434C5544455C616C6C6F632E68
?debug C E900104D1612433A5C42435C494E434C5544455C696F2E68
_TEXT segment byte public 'CODE'
_TEXT ends
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP
_DATA segment word public 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public 'BSS'
b@ label byte
b@w label word
_BSS ends
_TEXT segment byte public 'CODE'
;
; void CalibrateJoy (int joynum)
;
assume cs:_TEXT
_CalibrateJoy proc near
push bp
mov bp,sp
sub sp,42
push si
push di
mov si,word ptr [bp+4]
;
; {
; int stage,dx,dy,xl,yl,xh,yh;
; ControlStruct ctr;
;
; ExpWin (34,11);
;
mov ax,11
push ax
mov ax,34
push ax
call near ptr _ExpWin
pop cx
pop cx
;
;
;
; fontcolor=13;
;
mov word ptr DGROUP:_fontcolor,13
;
; CPPrint("Joystick Configuration\n");
;
mov ax,offset DGROUP:s@
push ax
call near ptr _CPPrint
pop cx
;
; py+=6;
;
add word ptr DGROUP:_py,6
;
; fontcolor=15;
;
mov word ptr DGROUP:_fontcolor,15
;
; PPrint("Hold the joystick in the UPPER LEFT\n");
;
mov ax,offset DGROUP:s@+24
push ax
call near ptr _PPrint
pop cx
;
; PPrint("corner and press a button:");
;
mov ax,offset DGROUP:s@+61
push ax
call near ptr _PPrint
pop cx
;
; stage=15;
;
mov di,15
;
; sx=(px+7)/8;
;
mov ax,word ptr DGROUP:_px
add ax,7
shr ax,1
shr ax,1
shr ax,1
mov word ptr DGROUP:_sx,ax
@1@50:
;
; do // wait for a button press
; {
; DrawChar (sx,py,stage);
;
push di
push word ptr DGROUP:_py
push word ptr DGROUP:_sx
call near ptr _DrawChar
add sp,6
;
; WaitVBL (3);
;
mov ax,3
push ax
call near ptr _WaitVBL
pop cx
;
; if (++stage==23)
;
inc di
mov ax,di
cmp ax,23
jne short @1@98
;
; stage=15;
;
mov di,15
@1@98:
;
; ReadJoystick (joynum,&xl,&yl);
;
lea ax,word ptr [bp-8]
push ax
lea ax,word ptr [bp-6]
push ax
push si
call near ptr _ReadJoystick
add sp,6
;
; ctr = ControlJoystick(joynum);
;
lea ax,word ptr [bp-18]
push ss
push ax
push si
push ss
lea ax,word ptr [bp-24]
push ax
call near ptr _ControlJoystick
add sp,6
lea ax,word ptr [bp-24]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
;
; if (keydown[1])
;
cmp byte ptr DGROUP:_keydown+1,0
je short @1@146
;
; return;
;
jmp @1@674
@1@146:
;
; } while (ctr.button1!= 1 && ctr.button2!=1);
;
cmp word ptr [bp-16],1
je short @1@194
cmp word ptr [bp-14],1
jne short @1@50
@1@194:
;
; DrawChar(sx,py,BLANKCHAR);
;
mov ax,9
push ax
push word ptr DGROUP:_py
push word ptr DGROUP:_sx
call near ptr _DrawChar
add sp,6
@1@218:
;
; do // wait for the button release
; {
; ctr = ControlJoystick(joynum);
;
lea ax,word ptr [bp-18]
push ss
push ax
push si
push ss
lea ax,word ptr [bp-30]
push ax
call near ptr _ControlJoystick
add sp,6
lea ax,word ptr [bp-30]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
;
; } while (ctr.button1);
;
cmp word ptr [bp-16],0
jne short @1@218
;
; WaitVBL (4); // so the button can't bounce
;
mov ax,4
push ax
call near ptr _WaitVBL
pop cx
;
;
; py+=6;
;
add word ptr DGROUP:_py,6
;
; PPrint("\nHold the joystick in the LOWER RIGHT\n");
;
mov ax,offset DGROUP:s@+88
push ax
call near ptr _PPrint
pop cx
;
; PPrint("corner and press a button:");
;
mov ax,offset DGROUP:s@+127
push ax
call near ptr _PPrint
pop cx
@1@290:
;
; do // wait for a button press
; {
; DrawChar (sx,py,stage);
;
push di
push word ptr DGROUP:_py
push word ptr DGROUP:_sx
call near ptr _DrawChar
add sp,6
;
; WaitVBL (3);
;
mov ax,3
push ax
call near ptr _WaitVBL
pop cx
;
; if (++stage==23)
;
inc di
mov ax,di
cmp ax,23
jne short @1@338
;
; stage=15;
;
mov di,15
@1@338:
;
; ReadJoystick (joynum,&xh,&yh);
;
lea ax,word ptr [bp-12]
push ax
lea ax,word ptr [bp-10]
push ax
push si
call near ptr _ReadJoystick
add sp,6
;
; ctr = ControlJoystick(joynum);
;
lea ax,word ptr [bp-18]
push ss
push ax
push si
push ss
lea ax,word ptr [bp-36]
push ax
call near ptr _ControlJoystick
add sp,6
lea ax,word ptr [bp-36]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
;
; if (keydown[1])
;
cmp byte ptr DGROUP:_keydown+1,0
je short @1@386
;
; return;
;
jmp @1@674
@1@386:
;
; } while (ctr.button1!= 1 && ctr.button2!=1);
;
cmp word ptr [bp-16],1
je short @1@434
cmp word ptr [bp-14],1
jne short @1@290
@1@434:
;
; DrawChar (sx,py,BLANKCHAR);
;
mov ax,9
push ax
push word ptr DGROUP:_py
push word ptr DGROUP:_sx
call near ptr _DrawChar
add sp,6
@1@458:
;
; do // wait for the button release
; {
; ctr = ControlJoystick(joynum);
;
lea ax,word ptr [bp-18]
push ss
push ax
push si
push ss
lea ax,word ptr [bp-42]
push ax
call near ptr _ControlJoystick
add sp,6
lea ax,word ptr [bp-42]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
;
; } while (ctr.button1);
;
cmp word ptr [bp-16],0
jne short @1@458
;
;
; //
; // figure out good boundaries
; //
;
; dx=(xh-xl) / 6;
;
mov ax,word ptr [bp-10]
sub ax,word ptr [bp-6]
mov bx,6
cwd
idiv bx
mov word ptr [bp-2],ax
;
; dy=(yh-yl) / 6;
;
mov ax,word ptr [bp-12]
sub ax,word ptr [bp-8]
mov bx,6
cwd
idiv bx
mov word ptr [bp-4],ax
;
; JoyXlow[joynum]=xl+dx;
;
mov bx,si
shl bx,1
mov ax,word ptr [bp-6]
add ax,word ptr [bp-2]
mov word ptr DGROUP:_JoyXlow[bx],ax
;
; JoyXhigh[joynum]=xh-dx;
;
mov bx,si
shl bx,1
mov ax,word ptr [bp-10]
sub ax,word ptr [bp-2]
mov word ptr DGROUP:_JoyXhigh[bx],ax
;
; JoyYlow[joynum]=yl+dy;
;
mov bx,si
shl bx,1
mov ax,word ptr [bp-8]
add ax,word ptr [bp-4]
mov word ptr DGROUP:_JoyYlow[bx],ax
;
; JoyYhigh[joynum]=yh-dy;
;
mov bx,si
shl bx,1
mov ax,word ptr [bp-12]
sub ax,word ptr [bp-4]
mov word ptr DGROUP:_JoyYhigh[bx],ax
;
; if (joynum==1)
;
cmp si,1
jne short @1@554
;
; playermode[1]=joystick1;
;
mov word ptr DGROUP:_playermode+2,2
jmp short @1@578
@1@554:
;
; else
; playermode[1]=joystick2;
;
mov word ptr DGROUP:_playermode+2,3
@1@578:
;
;
; py+=6;
;
add word ptr DGROUP:_py,6
;
; PPrint ("\n(F)ire or (A)fterburn with B1 ?");
;
mov ax,offset DGROUP:s@+154
push ax
call near ptr _PPrint
pop cx
;
; ch = PGet();
;
call near ptr _PGet
mov byte ptr DGROUP:_ch,al
;
; if ( ch == 'A' || ch == 'a')
;
cmp byte ptr DGROUP:_ch,65
je short @1@626
cmp byte ptr DGROUP:_ch,97
jne short @1@650
@1@626:
;
; buttonflip = 1;
;
mov word ptr DGROUP:_buttonflip,1
jmp short @1@674
@1@650:
;
; else
; buttonflip = 0;
;
mov word ptr DGROUP:_buttonflip,0
@1@674:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_CalibrateJoy endp
_TEXT ends
_DATA segment word public 'DATA'
db 63
db 63
db 49
db 50
db 51
db 52
db 53
db 54
db 55
db 56
db 57
db 48
db 45
db 43
db 63
db 63
db 81
db 87
db 69
db 82
db 84
db 89
db 85
db 73
db 79
db 80
db 91
db 93
db 124
db 63
db 65
db 83
db 68
db 70
db 71
db 72
db 74
db 75
db 76
db 59
db 34
db 63
db 63
db 63
db 90
db 88
db 67
db 86
db 66
db 78
db 77
db 44
db 46
db 47
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 15
db 63
db 45
db 21
db 53
db 17
db 43
db 63
db 19
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
db 63
_DATA ends
_TEXT segment byte public 'CODE'
;
; void printscan (int sc)
;
assume cs:_TEXT
_printscan proc near
push bp
mov bp,sp
sub sp,4
push si
mov si,word ptr [bp+4]
;
; {
; char static chartable[128] =
; {'?','?','1','2','3','4','5','6','7','8','9','0','-','+','?','?',
; 'Q','W','E','R','T','Y','U','I','O','P','[',']','|','?','A','S',
; 'D','F','G','H','J','K','L',';','"','?','?','?','Z','X','C','V',
; 'B','N','M',',','.','/','?','?','?','?','?','?','?','?','?','?',
; '?','?','?','?','?','?','?','?', 15,'?','-', 21,'5', 17,'+','?',
; 19,'?','?','?','?','?','?','?','?','?','?','?','?','?','?','?',
; '?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?',
; '?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?'};
;
; sc = sc & 0x7f;
;
mov ax,si
and ax,127
mov si,ax
;
;
; if (sc==1)
;
cmp si,1
jne short @2@74
;
; PPrint ("ESC");
;
mov ax,offset DGROUP:s@+187
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@74:
;
; else if (sc==0xe)
;
cmp si,14
jne short @2@122
;
; PPrint ("BKSP");
;
mov ax,offset DGROUP:s@+191
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@122:
;
; else if (sc==0xf)
;
cmp si,15
jne short @2@170
;
; PPrint ("TAB");
;
mov ax,offset DGROUP:s@+196
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@170:
;
; else if (sc==0x1d)
;
cmp si,29
jne short @2@218
;
; PPrint ("CTRL");
;
mov ax,offset DGROUP:s@+200
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@218:
;
; else if (sc==0x2A)
;
cmp si,42
jne short @2@266
;
; PPrint ("LSHIFT");
;
mov ax,offset DGROUP:s@+205
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@266:
;
; else if (sc==0x39)
;
cmp si,57
jne short @2@314
;
; PPrint ("SPACE");
;
mov ax,offset DGROUP:s@+212
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@314:
;
; else if (sc==0x3A)
;
cmp si,58
jne short @2@362
;
; PPrint ("CAPSLK");
;
mov ax,offset DGROUP:s@+218
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@362:
;
; else if (sc>=0x3b && sc<=0x44)
;
cmp si,59
jl short @2@458
cmp si,68
jg short @2@458
;
; {
; char str[3];
; PPrint ("F");
;
mov ax,offset DGROUP:s@+225
push ax
call near ptr _PPrint
pop cx
;
; itoa (sc-0x3a,str,10);
;
mov ax,10
push ax
lea ax,word ptr [bp-4]
push ax
mov ax,si
add ax,65478
push ax
call near ptr _itoa
add sp,6
;
; PPrint (str);
;
lea ax,word ptr [bp-4]
push ax
call near ptr _PPrint
pop cx
;
; }
;
jmp @2@1346
@2@458:
;
; else if (sc==0x57)
;
cmp si,87
jne short @2@506
;
; PPrint ("F11");
;
mov ax,offset DGROUP:s@+227
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@506:
;
; else if (sc==0x59)
;
cmp si,89
jne short @2@554
;
; PPrint ("F12");
;
mov ax,offset DGROUP:s@+231
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@554:
;
; else if (sc==0x46)
;
cmp si,70
jne short @2@602
;
; PPrint ("SCRLLK");
;
mov ax,offset DGROUP:s@+235
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@602:
;
; else if (sc==0x1c)
;
cmp si,28
jne short @2@650
;
; PPrint ("ENTER");
;
mov ax,offset DGROUP:s@+242
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@650:
;
; else if (sc==0x36)
;
cmp si,54
jne short @2@698
;
; PPrint ("RSHIFT");
;
mov ax,offset DGROUP:s@+248
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@698:
;
; else if (sc==0x37)
;
cmp si,55
jne short @2@746
;
; PPrint ("PRTSC");
;
mov ax,offset DGROUP:s@+255
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@746:
;
; else if (sc==0x38)
;
cmp si,56
jne short @2@794
;
; PPrint ("ALT");
;
mov ax,offset DGROUP:s@+261
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@794:
;
; else if (sc==0x47)
;
cmp si,71
jne short @2@842
;
; PPrint ("HOME");
;
mov ax,offset DGROUP:s@+265
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@842:
;
; else if (sc==0x49)
;
cmp si,73
jne short @2@890
;
; PPrint ("PGUP");
;
mov ax,offset DGROUP:s@+270
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@890:
;
; else if (sc==0x4f)
;
cmp si,79
jne short @2@938
;
; PPrint ("END");
;
mov ax,offset DGROUP:s@+275
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@938:
;
; else if (sc==0x51)
;
cmp si,81
jne short @2@986
;
; PPrint ("PGDN");
;
mov ax,offset DGROUP:s@+279
push ax
call near ptr _PPrint
pop cx
jmp @2@1346
@2@986:
;
; else if (sc==0x52)
;
cmp si,82
jne short @2@1034
;
; PPrint ("INS");
;
mov ax,offset DGROUP:s@+284
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1034:
;
; else if (sc==0x53)
;
cmp si,83
jne short @2@1082
;
; PPrint ("DEL");
;
mov ax,offset DGROUP:s@+288
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1082:
;
; else if (sc==0x45)
;
cmp si,69
jne short @2@1130
;
; PPrint ("NUMLK");
;
mov ax,offset DGROUP:s@+292
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1130:
;
; else if (sc==0x48)
;
cmp si,72
jne short @2@1178
;
; PPrint ("UP");
;
mov ax,offset DGROUP:s@+298
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1178:
;
; else if (sc==0x50)
;
cmp si,80
jne short @2@1226
;
; PPrint ("DOWN");
;
mov ax,offset DGROUP:s@+301
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1226:
;
; else if (sc==0x4b)
;
cmp si,75
jne short @2@1274
;
; PPrint ("LEFT");
;
mov ax,offset DGROUP:s@+306
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1274:
;
; else if (sc==0x4d)
;
cmp si,77
jne short @2@1322
;
; PPrint ("RIGHT");
;
mov ax,offset DGROUP:s@+311
push ax
call near ptr _PPrint
pop cx
jmp short @2@1346
@2@1322:
;
; else
; {
; str[0]=chartable[sc];
;
mov al,byte ptr DGROUP:d@+0[si]
mov byte ptr DGROUP:_str,al
;
; str[1]=0;
;
mov byte ptr DGROUP:_str+1,0
;
; PPrint (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _PPrint
pop cx
@2@1346:
;
; }
; }
;
pop si
mov sp,bp
pop bp
ret
_printscan endp
;
; void calibratekeys (void)
;
assume cs:_TEXT
_calibratekeys proc near
push bp
mov bp,sp
sub sp,8
push si
push di
;
; {
; char ch;
; int hx,hy,i,select,new;
;
; ExpWin (22,12);
;
mov ax,12
push ax
mov ax,22
push ax
call near ptr _ExpWin
pop cx
pop cx
;
; fontcolor=13;
;
mov word ptr DGROUP:_fontcolor,13
;
; CPPrint ("Keyboard Configuration");
;
mov ax,offset DGROUP:s@+317
push ax
call near ptr _CPPrint
pop cx
;
; fontcolor=15;
;
mov word ptr DGROUP:_fontcolor,15
;
; PPrint ("\n1 north");
;
mov ax,offset DGROUP:s@+340
push ax
call near ptr _PPrint
pop cx
;
; PPrint ("\n2 east");
;
mov ax,offset DGROUP:s@+349
push ax
call near ptr _PPrint
pop cx
;
; PPrint ("\n3 south");
;
mov ax,offset DGROUP:s@+357
push ax
call near ptr _PPrint
pop cx
;
; PPrint ("\n4 west");
;
mov ax,offset DGROUP:s@+366
push ax
call near ptr _PPrint
pop cx
;
; PPrint ("\n5 button1");
;
mov ax,offset DGROUP:s@+374
push ax
call near ptr _PPrint
pop cx
;
; PPrint ("\n6 button2");
;
mov ax,offset DGROUP:s@+385
push ax
call near ptr _PPrint
pop cx
;
; PPrint ("\nModify which action:");
;
mov ax,offset DGROUP:s@+396
push ax
call near ptr _PPrint
pop cx
;
; hx=(px+7)/8;
;
mov ax,word ptr DGROUP:_px
add ax,7
shr ax,1
shr ax,1
shr ax,1
mov word ptr [bp-4],ax
;
; hy=py;
;
mov ax,word ptr DGROUP:_py
mov word ptr [bp-6],ax
;
; for (i=0;i<4;i++)
;
xor si,si
jmp short @3@98
@3@50:
;
; {
; px=pxl+8*12;
;
mov ax,word ptr DGROUP:_pxl
add ax,96
mov word ptr DGROUP:_px,ax
;
; py=pyl+10*(1+i);
;
mov ax,si
inc ax
mov dx,10
imul dx
mov dx,word ptr DGROUP:_pyl
add dx,ax
mov word ptr DGROUP:_py,dx
;
; PPrint(":");
;
mov ax,offset DGROUP:s@+418
push ax
call near ptr _PPrint
pop cx
;
; printscan (key[i*2]);
;
mov bx,si
shl bx,1
mov al,byte ptr DGROUP:_key[bx]
cbw
push ax
call near ptr _printscan
pop cx
inc si
@3@98:
cmp si,4
jl short @3@50
;
; }
; px=pxl+8*12;
;
mov ax,word ptr DGROUP:_pxl
add ax,96
mov word ptr DGROUP:_px,ax
;
; py=pyl+10*5;
;
mov ax,word ptr DGROUP:_pyl
add ax,50
mov word ptr DGROUP:_py,ax
;
; PPrint(":");
;
mov ax,offset DGROUP:s@+420
push ax
call near ptr _PPrint
pop cx
;
; printscan (keyB1);
;
mov al,byte ptr DGROUP:_keyB1
cbw
push ax
call near ptr _printscan
pop cx
;
; px=pxl+8*12;
;
mov ax,word ptr DGROUP:_pxl
add ax,96
mov word ptr DGROUP:_px,ax
;
; py=pyl+10*6;
;
mov ax,word ptr DGROUP:_pyl
add ax,60
mov word ptr DGROUP:_py,ax
;
; PPrint(":");
;
mov ax,offset DGROUP:s@+422
push ax
call near ptr _PPrint
pop cx
;
; printscan (keyB2);
;
mov al,byte ptr DGROUP:_keyB2
cbw
push ax
call near ptr _printscan
pop cx
@3@146:
;
;
; do
; {
; px=hx*8;
;
mov ax,word ptr [bp-4]
shl ax,1
shl ax,1
shl ax,1
mov word ptr DGROUP:_px,ax
;
; py=hy;
;
mov ax,word ptr [bp-6]
mov word ptr DGROUP:_py,ax
;
; DrawChar (hx,hy,BLANKCHAR);
;
mov ax,9
push ax
push word ptr [bp-6]
push word ptr [bp-4]
call near ptr _DrawChar
add sp,6
;
; ch=PGet() % 256;
;
call near ptr _PGet
mov bx,256
cwd
idiv bx
mov byte ptr [bp-1],dl
;
; if (ch<'1' || ch>'6')
;
cmp byte ptr [bp-1],49
jl short @3@194
cmp byte ptr [bp-1],54
jle short @3@218
@3@194:
;
; continue;
;
jmp @3@530
@3@218:
;
; select = ch - '1';
;
mov al,byte ptr [bp-1]
cbw
add ax,65487
mov di,ax
;
; DrawPchar (ch);
;
mov al,byte ptr [bp-1]
cbw
push ax
call near ptr _DrawPchar
pop cx
;
; PPrint ("\nPress the new key:");
;
mov ax,offset DGROUP:s@+424
push ax
call near ptr _PPrint
pop cx
;
; ClearKeys ();
;
call near ptr _ClearKeys
;
; new=-1;
;
mov word ptr [bp-8],65535
jmp short @3@338
@3@242:
;
; while (!keydown[++new])
; if (new==0x79)
;
cmp word ptr [bp-8],121
jne short @3@290
;
; new=-1;
;
mov word ptr [bp-8],65535
jmp short @3@338
@3@290:
;
; else if (new==0x29)
;
cmp word ptr [bp-8],41
jne short @3@338
;
; new++; // skip STUPID left shifts!
;
inc word ptr [bp-8]
@3@338:
inc word ptr [bp-8]
mov bx,word ptr [bp-8]
mov al,byte ptr DGROUP:_keydown[bx]
cbw
or ax,ax
je short @3@242
;
; Bar(leftedge,py,22,10,0xff);
;
mov ax,255
push ax
mov ax,10
push ax
mov ax,22
push ax
push word ptr DGROUP:_py
push word ptr DGROUP:_leftedge
call near ptr _Bar
add sp,10
;
; if (select<4)
;
cmp di,4
jge short @3@410
;
; key[select*2]=new;
;
mov bx,di
shl bx,1
mov al,byte ptr [bp-8]
mov byte ptr DGROUP:_key[bx],al
@3@410:
;
; if (select==4)
;
cmp di,4
jne short @3@458
;
; keyB1=new;
;
mov al,byte ptr [bp-8]
mov byte ptr DGROUP:_keyB1,al
@3@458:
;
; if (select==5)
;
cmp di,5
jne short @3@506
;
; keyB2=new;
;
mov al,byte ptr [bp-8]
mov byte ptr DGROUP:_keyB2,al
@3@506:
;
; px=pxl+8*12;
;
mov ax,word ptr DGROUP:_pxl
add ax,96
mov word ptr DGROUP:_px,ax
;
; py=pyl+(select+2)*10;
;
mov ax,di
inc ax
inc ax
mov dx,10
imul dx
mov dx,word ptr DGROUP:_pyl
add dx,ax
mov word ptr DGROUP:_py,dx
;
; Bar(px/8,py,9,10,0xff);
;
mov ax,255
push ax
mov ax,10
push ax
mov ax,9
push ax
push word ptr DGROUP:_py
mov ax,word ptr DGROUP:_px
shr ax,1
shr ax,1
shr ax,1
push ax
call near ptr _Bar
add sp,10
;
; PPrint (":");
;
mov ax,offset DGROUP:s@+444
push ax
call near ptr _PPrint
pop cx
;
; printscan (new);
;
push word ptr [bp-8]
call near ptr _printscan
pop cx
;
; ClearKeys ();
;
call near ptr _ClearKeys
;
; ch='0'; // so the loop continues
;
mov byte ptr [bp-1],48
@3@530:
;
; } while (ch>='0' && ch<='9');
;
cmp byte ptr [bp-1],48
jl short @3@578
cmp byte ptr [bp-1],57
jg @@82
jmp @3@146
@@82:
@3@578:
;
; playermode[1]=keyboard;
;
mov word ptr DGROUP:_playermode+2,0
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_calibratekeys endp
;
; ControlStruct ControlKBD ()
;
assume cs:_TEXT
_ControlKBD proc near
push bp
mov bp,sp
sub sp,6
push si
push di
;
; {
; int xmove=0,
;
xor si,si
;
; ymove=0;
;
xor di,di
;
; ControlStruct action;
;
; if (keydown [key[north]])
;
mov al,byte ptr DGROUP:_key
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@74
;
; ymove=-1;
;
mov di,65535
@4@74:
;
; if (keydown [key[east]])
;
mov al,byte ptr DGROUP:_key+2
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@122
;
; xmove=1;
;
mov si,1
@4@122:
;
; if (keydown [key[south]])
;
mov al,byte ptr DGROUP:_key+4
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@170
;
; ymove=1;
;
mov di,1
@4@170:
;
; if (keydown [key[west]])
;
mov al,byte ptr DGROUP:_key+6
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@218
;
; xmove=-1;
;
mov si,65535
@4@218:
;
;
; if (keydown [key[northeast]])
;
mov al,byte ptr DGROUP:_key+1
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@266
;
; {
; ymove=-1;
;
mov di,65535
;
; xmove=1;
;
mov si,1
@4@266:
;
; }
; if (keydown [key[northwest]])
;
mov al,byte ptr DGROUP:_key+7
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@314
;
; {
; ymove=-1;
;
mov di,65535
;
; xmove=-1;
;
mov si,65535
@4@314:
;
; }
; if (keydown [key[southeast]])
;
mov al,byte ptr DGROUP:_key+3
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@362
;
; {
; ymove=1;
;
mov di,1
;
; xmove=1;
;
mov si,1
@4@362:
;
; }
; if (keydown [key[southwest]])
;
mov al,byte ptr DGROUP:_key+5
cbw
mov bx,ax
cmp byte ptr DGROUP:_keydown[bx],0
je short @4@410
;
; {
; ymove=1;
;
mov di,1
;
; xmove=-1;
;
mov si,65535
@4@410:
;
; }
;
; switch (ymove*3+xmove)
;
mov ax,di
mov dx,3
imul dx
add ax,si
sub ax,65532
mov bx,ax
cmp bx,8
ja short @4@698
shl bx,1
jmp word ptr cs:@4@C2394[bx]
@4@482:
;
; {
; case -4: action.dir = northwest; break;
;
mov word ptr [bp-6],7
jmp short @4@698
@4@506:
;
; case -3: action.dir = north; break;
;
mov word ptr [bp-6],0
jmp short @4@698
@4@530:
;
; case -2: action.dir = northeast; break;
;
mov word ptr [bp-6],1
jmp short @4@698
@4@554:
;
; case -1: action.dir = west; break;
;
mov word ptr [bp-6],6
jmp short @4@698
@4@578:
;
; case 0: action.dir = nodir; break;
;
mov word ptr [bp-6],8
jmp short @4@698
@4@602:
;
; case 1: action.dir = east; break;
;
mov word ptr [bp-6],2
jmp short @4@698
@4@626:
;
; case 2: action.dir = southwest; break;
;
mov word ptr [bp-6],5
jmp short @4@698
@4@650:
;
; case 3: action.dir = south; break;
;
mov word ptr [bp-6],4
jmp short @4@698
@4@674:
;
; case 4: action.dir = southeast; break;
;
mov word ptr [bp-6],3
jmp short @4@698
@4@698:
;
; }
;
; action.button1 = keydown [keyB1];
;
mov al,byte ptr DGROUP:_keyB1
cbw
mov bx,ax
mov al,byte ptr DGROUP:_keydown[bx]
cbw
mov word ptr [bp-4],ax
;
; action.button2 = keydown [keyB2];
;
mov al,byte ptr DGROUP:_keyB2
cbw
mov bx,ax
mov al,byte ptr DGROUP:_keydown[bx]
cbw
mov word ptr [bp-2],ax
;
;
; return (action);
;
push word ptr [bp+6]
push word ptr [bp+4]
lea ax,word ptr [bp-6]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
mov ax,word ptr [bp+4]
jmp short @4@722
@4@722:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_ControlKBD endp
@4@C2394 label word
dw @4@482
dw @4@506
dw @4@530
dw @4@554
dw @4@578
dw @4@602
dw @4@626
dw @4@650
dw @4@674
;
; void ReadJoystick (int joynum,int *xcount,int *ycount)
;
assume cs:_TEXT
_ReadJoystick proc near
push bp
mov bp,sp
sub sp,6
push si
push di
mov si,word ptr [bp+6]
mov di,word ptr [bp+8]
;
; {
; int portval,a1,a2,xbit,ybit;
;
; if (joynum==1)
;
cmp word ptr [bp+4],1
jne short @5@74
;
; {
; xbit=1;
;
mov word ptr [bp-4],1
;
; ybit=2;
;
mov word ptr [bp-6],2
;
; }
;
jmp short @5@98
@5@74:
;
; else
; {
; xbit=4;
;
mov word ptr [bp-4],4
;
; ybit=8;
;
mov word ptr [bp-6],8
@5@98:
;
; }
;
; *xcount = 0;
;
mov word ptr [si],0
;
; *ycount = 0;
;
mov word ptr [di],0
;
;
; outportb (0x201,inportb (0x201)); /* start the signal pulse */
;
mov dx,513
in al,dx
mov dx,513
out dx,al
;
;
; asm cli;
;
cli
@5@146:
;
;
; do
; {
; portval = inportb (0x201);
;
mov dx,513
in al,dx
mov ah,0
mov bx,ax
;
; a1 = (portval & xbit) != 0;
;
mov ax,word ptr [bp-4]
test bx,ax
je short @5@194
mov ax,1
jmp short @5@218
@5@194:
xor ax,ax
@5@218:
mov cx,ax
;
; a2 = (portval & ybit) != 0;
;
mov ax,word ptr [bp-6]
test bx,ax
je short @5@266
mov ax,1
jmp short @5@290
@5@266:
xor ax,ax
@5@290:
mov word ptr [bp-2],ax
;
; *xcount+=a1;
;
mov ax,cx
add word ptr [si],ax
;
; *ycount+=a2;
;
mov ax,word ptr [bp-2]
add word ptr [di],ax
;
; } while ((a1+a2!=0) && (*xcount<500) && (*ycount<500));
;
mov ax,cx
add ax,word ptr [bp-2]
je short @5@386
cmp word ptr [si],500
jge short @5@386
cmp word ptr [di],500
jl short @5@146
@5@386:
;
;
; asm sti;
;
sti
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_ReadJoystick endp
;
; int JoyButton (void)
;
assume cs:_TEXT
_JoyButton proc near
push bp
mov bp,sp
push si
;
; {
; int buttons = inportb (0x201); /* Get all four button status */
;
mov dx,513
in al,dx
mov ah,0
mov si,ax
;
; if ((buttons & 0x10) == 0)
;
test si,16
jne short @6@74
;
; return 1;
;
mov ax,1
jmp short @6@146
@6@74:
;
; if ((buttons & 0x20) == 0)
;
test si,32
jne short @6@122
;
; return 2;
;
mov ax,2
jmp short @6@146
@6@122:
;
;
; return 0;
;
xor ax,ax
jmp short @6@146
@6@146:
;
; }
;
pop si
pop bp
ret
_JoyButton endp
;
; ControlStruct ControlJoystick (int joynum)
;
assume cs:_TEXT
_ControlJoystick proc near
push bp
mov bp,sp
sub sp,14
push si
push di
mov si,word ptr [bp+8]
;
; {
; int joyx = 0,joyy = 0, /* resistance in joystick */
;
mov word ptr [bp-2],0
mov word ptr [bp-4],0
;
; xmove = 0,
;
mov word ptr [bp-6],0
;
; ymove = 0,
;
mov word ptr [bp-8],0
;
; buttons;
; ControlStruct action;
;
; ReadJoystick (joynum,&joyx,&joyy);
;
lea ax,word ptr [bp-4]
push ax
lea ax,word ptr [bp-2]
push ax
push si
call near ptr _ReadJoystick
add sp,6
;
; if ( (joyx>500) | (joyy>500) )
;
cmp word ptr [bp-2],500
jle short @7@74
mov ax,1
jmp short @7@98
@7@74:
xor ax,ax
@7@98:
push ax
cmp word ptr [bp-4],500
jle short @7@146
mov ax,1
jmp short @7@170
@7@146:
xor ax,ax
@7@170:
pop dx
or dx,ax
je short @7@218
;
; {
; joyx=JoyXlow [joynum] + 1; /* no joystick connected, do nothing */
;
mov bx,si
shl bx,1
mov ax,word ptr DGROUP:_JoyXlow[bx]
inc ax
mov word ptr [bp-2],ax
;
; joyy=JoyYlow [joynum] + 1;
;
mov bx,si
shl bx,1
mov ax,word ptr DGROUP:_JoyYlow[bx]
inc ax
mov word ptr [bp-4],ax
@7@218:
;
; }
;
; if (joyx > JoyXhigh [joynum])
;
mov bx,si
shl bx,1
mov ax,word ptr DGROUP:_JoyXhigh[bx]
cmp ax,word ptr [bp-2]
jge short @7@266
;
; xmove = 1;
;
mov word ptr [bp-6],1
jmp short @7@314
@7@266:
;
; else if (joyx < JoyXlow [joynum])
;
mov bx,si
shl bx,1
mov ax,word ptr DGROUP:_JoyXlow[bx]
cmp ax,word ptr [bp-2]
jle short @7@314
;
; xmove = -1;
;
mov word ptr [bp-6],65535
@7@314:
;
; if (joyy > JoyYhigh [joynum])
;
mov bx,si
shl bx,1
mov ax,word ptr DGROUP:_JoyYhigh[bx]
cmp ax,word ptr [bp-4]
jge short @7@362
;
; ymove = 1;
;
mov word ptr [bp-8],1
jmp short @7@410
@7@362:
;
; else if (joyy < JoyYlow [joynum])
;
mov bx,si
shl bx,1
mov ax,word ptr DGROUP:_JoyYlow[bx]
cmp ax,word ptr [bp-4]
jle short @7@410
;
; ymove = -1;
;
mov word ptr [bp-8],65535
@7@410:
;
;
; switch (ymove*3+xmove)
;
mov ax,word ptr [bp-8]
mov dx,3
imul dx
add ax,word ptr [bp-6]
sub ax,65532
mov bx,ax
cmp bx,8
ja short @7@698
shl bx,1
jmp word ptr cs:@7@C3820[bx]
@7@482:
;
; {
; case -4: action.dir = northwest; break;
;
mov word ptr [bp-14],7
jmp short @7@698
@7@506:
;
; case -3: action.dir = north; break;
;
mov word ptr [bp-14],0
jmp short @7@698
@7@530:
;
; case -2: action.dir = northeast; break;
;
mov word ptr [bp-14],1
jmp short @7@698
@7@554:
;
; case -1: action.dir = west; break;
;
mov word ptr [bp-14],6
jmp short @7@698
@7@578:
;
; case 0: action.dir = nodir; break;
;
mov word ptr [bp-14],8
jmp short @7@698
@7@602:
;
; case 1: action.dir = east; break;
;
mov word ptr [bp-14],2
jmp short @7@698
@7@626:
;
; case 2: action.dir = southwest; break;
;
mov word ptr [bp-14],5
jmp short @7@698
@7@650:
;
; case 3: action.dir = south; break;
;
mov word ptr [bp-14],4
jmp short @7@698
@7@674:
;
; case 4: action.dir = southeast; break;
;
mov word ptr [bp-14],3
jmp short @7@698
@7@698:
;
; }
;
; buttons = inportb (0x201); /* Get all four button status */
;
mov dx,513
in al,dx
mov ah,0
mov di,ax
;
; if (joynum == 1)
;
cmp si,1
jne short @7@890
;
; {
; action.button1 = ((buttons & 0x10) == 0);
;
test di,16
jne short @7@770
mov ax,1
jmp short @7@794
@7@770:
xor ax,ax
@7@794:
mov word ptr [bp-12],ax
;
; action.button2 = ((buttons & 0x20) == 0);
;
test di,32
jne short @7@842
mov ax,1
jmp short @7@866
@7@842:
xor ax,ax
@7@866:
mov word ptr [bp-10],ax
;
; }
;
jmp short @7@1058
@7@890:
;
; else
; {
; action.button1 = ((buttons & 0x40) == 0);
;
test di,64
jne short @7@938
mov ax,1
jmp short @7@962
@7@938:
xor ax,ax
@7@962:
mov word ptr [bp-12],ax
;
; action.button2 = ((buttons & 0x80) == 0);
;
test di,128
jne short @7@1010
mov ax,1
jmp short @7@1034
@7@1010:
xor ax,ax
@7@1034:
mov word ptr [bp-10],ax
@7@1058:
;
; }
; if (buttonflip)
;
cmp word ptr DGROUP:_buttonflip,0
je short @7@1106
;
; {
; buttons = action.button1;
;
mov di,word ptr [bp-12]
;
; action.button1 = action.button2;
;
mov ax,word ptr [bp-10]
mov word ptr [bp-12],ax
;
; action.button2 = buttons;
;
mov word ptr [bp-10],di
@7@1106:
;
; }
; return (action);
;
push word ptr [bp+6]
push word ptr [bp+4]
lea ax,word ptr [bp-14]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
mov ax,word ptr [bp+4]
jmp short @7@1130
@7@1130:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_ControlJoystick endp
@7@C3820 label word
dw @7@482
dw @7@506
dw @7@530
dw @7@554
dw @7@578
dw @7@602
dw @7@626
dw @7@650
dw @7@674
;
; ControlStruct ControlPlayer (int player)
;
assume cs:_TEXT
_ControlPlayer proc near
push bp
mov bp,sp
sub sp,24
;
; {
; ControlStruct ret;
;
; switch (playermode[player])
;
mov bx,word ptr [bp+8]
shl bx,1
mov ax,word ptr DGROUP:_playermode[bx]
or ax,ax
je short @8@146
cmp ax,2
je short @8@170
cmp ax,3
je short @8@194
jmp short @8@218
@8@146:
;
; {
; case keyboard : return ControlKBD ();
;
push word ptr [bp+6]
push word ptr [bp+4]
push ss
lea ax,word ptr [bp-6]
push ax
call near ptr _ControlKBD
pop cx
pop cx
lea ax,word ptr [bp-6]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
mov ax,word ptr [bp+4]
jmp short @8@242
@8@170:
;
; case joystick1: return ControlJoystick(1);
;
push word ptr [bp+6]
push word ptr [bp+4]
mov ax,1
push ax
push ss
lea ax,word ptr [bp-12]
push ax
call near ptr _ControlJoystick
add sp,6
lea ax,word ptr [bp-12]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
mov ax,word ptr [bp+4]
jmp short @8@242
@8@194:
;
; case joystick2: return ControlJoystick(2);
;
push word ptr [bp+6]
push word ptr [bp+4]
mov ax,2
push ax
push ss
lea ax,word ptr [bp-18]
push ax
call near ptr _ControlJoystick
add sp,6
lea ax,word ptr [bp-18]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
mov ax,word ptr [bp+4]
jmp short @8@242
@8@218:
;
; }
;
; return ControlKBD();
;
push word ptr [bp+6]
push word ptr [bp+4]
push ss
lea ax,word ptr [bp-24]
push ax
call near ptr _ControlKBD
pop cx
pop cx
lea ax,word ptr [bp-24]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
mov ax,word ptr [bp+4]
jmp short @8@242
@8@242:
;
; }
;
mov sp,bp
pop bp
ret
_ControlPlayer endp
;
; void ClearKeys (void)
;
assume cs:_TEXT
_ClearKeys proc near
push bp
mov bp,sp
;
; {
; int i;
; NBKscan=NBKascii=0;
;
xor ax,ax
mov word ptr DGROUP:_NBKascii,ax
mov word ptr DGROUP:_NBKscan,ax
;
; memset (keydown,0,sizeof(keydown));
;
mov ax,128
push ax
xor ax,ax
push ax
mov ax,offset DGROUP:_keydown
push ax
call near ptr _memset
add sp,6
;
; }
;
pop bp
ret
_ClearKeys endp
;
; void Ack(void)
;
assume cs:_TEXT
_Ack proc near
push bp
mov bp,sp
sub sp,12
;
; {
; ControlStruct c;
;
; ClearKeys();
;
call near ptr _ClearKeys
@10@50:
;
; while (1)
; {
; if (NBKscan>127)
;
cmp word ptr DGROUP:_NBKscan,127
jle short @10@98
;
; {
; NBKscan&=0x7f;
;
and word ptr DGROUP:_NBKscan,127
;
; return;
;
jmp short @10@194
@10@98:
;
; }
; c = ControlPlayer(1);
;
lea ax,word ptr [bp-6]
push ss
push ax
mov ax,1
push ax
push ss
lea ax,word ptr [bp-12]
push ax
call near ptr _ControlPlayer
add sp,6
lea ax,word ptr [bp-12]
push ss
push ax
mov cx,6
call near ptr N_SCOPY@
;
; if (c.button1 || c.button2)
;
cmp word ptr [bp-4],0
jne short @10@146
cmp word ptr [bp-2],0
je short @10@170
@10@146:
;
; return;
;
jmp short @10@194
@10@170:
jmp short @10@50
@10@194:
;
; }
; }
;
mov sp,bp
pop bp
ret
_Ack endp
;
; unsigned long LoadFile(char *filename,char huge *buffer)
;
assume cs:_TEXT
_LoadFile proc near
push bp
mov bp,sp
sub sp,18
;
; {
; unsigned handle,flength1=0,flength2=0,buf1,buf2,foff1,foff2,
;
mov word ptr [bp-4],0
mov word ptr [bp-6],0
;
; len1,len2;
;
; buf1=FP_OFF(buffer);
;
mov ax,word ptr [bp+6]
mov word ptr [bp-8],ax
;
; buf2=FP_SEG(buffer);
;
mov ax,word ptr [bp+8]
mov word ptr [bp-10],ax
;
;
; asm mov WORD PTR foff1,0 // file offset = 0 (start)
;
mov WORD PTR [bp-12],0
;
; asm mov WORD PTR foff2,0
;
mov WORD PTR [bp-14],0
;
;
; asm mov dx,filename
;
mov dx,[bp+4]
;
; asm mov ax,3d00h // OPEN w/handle (read only)
;
mov ax,3d00h
;
; asm int 21h
;
int 21h
;
; asm jc out
;
jc short @11@1274
;
;
; asm mov handle,ax
;
mov [bp-2],ax
;
; asm mov bx,ax
;
mov bx,ax
;
; asm xor cx,cx
;
xor cx,cx
;
; asm xor dx,dx
;
xor dx,dx
;
; asm mov ax,4202h
;
mov ax,4202h
;
; asm int 21h // SEEK (find file length)
;
int 21h
;
; asm jc out
;
jc short @11@1274
;
;
; asm mov flength1,ax
;
mov [bp-4],ax
;
; asm mov len1,ax
;
mov [bp-16],ax
;
; asm mov flength2,dx
;
mov [bp-6],dx
;
; asm mov len2,dx
;
mov [bp-18],dx
;
;
; asm mov bx,handle
;
mov bx,[bp-2]
;
; asm xor cx,cx
;
xor cx,cx
;
; asm xor dx,dx
;
xor dx,dx
;
; asm mov ax,4200h
;
mov ax,4200h
;
; asm int 21h // SEEK (to file start)
;
int 21h
;
; asm jc out
;
jc short @11@1274
;
;
; asm cmp WORD PTR len2,0 // MULTI-SEGMENTAL?
;
cmp WORD PTR [bp-18],0
;
; asm je L_2
;
je short @11@1058
@11@650:
;
;
; L_1:
;
; asm push ds
;
push ds
;
; asm mov bx,handle
;
mov bx,[bp-2]
;
; asm mov cx,8000h // read 32K chunks
;
mov cx,8000h
;
; asm mov dx,buf1
;
mov dx,[bp-8]
;
; asm mov ax,buf2
;
mov ax,[bp-10]
;
; asm mov ds,ax
;
mov ds,ax
;
; asm mov ah,3fh // READ w/handle
;
mov ah,3fh
;
; asm int 21h
;
int 21h
;
; asm pop ds
;
pop ds
;
; asm jc out
;
jc short @11@1274
;
;
; asm add buf2,800h
;
add [bp-10],800h
;
; asm sub len1,8000h
;
sub [bp-16],8000h
;
; asm sbb WORD PTR len2,0
;
sbb WORD PTR [bp-18],0
;
; asm cmp WORD PTR len2,0
;
cmp WORD PTR [bp-18],0
;
; asm ja L_1
;
ja short @11@650
;
; asm cmp len1,8000h
;
cmp [bp-16],8000h
;
; asm jae L_1
;
jae short @11@650
@11@1058:
;
;
; L_2:
;
; asm push ds
;
push ds
;
; asm mov bx,handle
;
mov bx,[bp-2]
;
; asm mov cx,len1
;
mov cx,[bp-16]
;
; asm mov dx,buf1
;
mov dx,[bp-8]
;
; asm mov ax,buf2
;
mov ax,[bp-10]
;
; asm mov ds,ax
;
mov ds,ax
;
; asm mov ah,3fh // READ w/handle
;
mov ah,3fh
;
; asm int 21h
;
int 21h
;
; asm pop ds
;
pop ds
@11@1274:
;
;
; out:
;
; asm mov bx,handle // CLOSE w/handle
;
mov bx,[bp-2]
;
; asm mov ah,3eh
;
mov ah,3eh
;
; asm int 21h
;
int 21h
;
;
;
; return (flength2*0x10000+flength1);
;
mov dx,word ptr [bp-6]
xor ax,ax
add ax,word ptr [bp-4]
adc dx,0
jmp short @11@1370
@11@1370:
;
;
; }
;
mov sp,bp
pop bp
ret
_LoadFile endp
;
; void SaveFile(char *filename,char huge *buffer, long size)
;
assume cs:_TEXT
_SaveFile proc near
push bp
mov bp,sp
sub sp,10
;
; {
; unsigned int handle,buf1,buf2,foff1,foff2;
;
; buf1=FP_OFF(buffer);
;
mov ax,word ptr [bp+6]
mov word ptr [bp-4],ax
;
; buf2=FP_SEG(buffer);
;
mov ax,word ptr [bp+8]
mov word ptr [bp-6],ax
;
;
; asm mov WORD PTR foff1,0 // file offset = 0 (start)
;
mov WORD PTR [bp-8],0
;
; asm mov WORD PTR foff2,0
;
mov WORD PTR [bp-10],0
;
;
; asm mov dx,filename
;
mov dx,[bp+4]
;
; asm mov ax,3c00h // CREATE w/handle (read only)
;
mov ax,3c00h
;
; asm xor cx,cx
;
xor cx,cx
;
; asm int 21h
;
int 21h
;
; asm jc out
;
jc short @12@914
;
;
; asm mov handle,ax
;
mov [bp-2],ax
;
; asm cmp word ptr size+2,0 // larger than 1 segment?
;
cmp word ptr [bp+10]+2,0
;
; asm je L2
;
je short @12@674
@12@290:
;
;
; L1:
;
; asm push ds
;
push ds
;
; asm mov bx,handle
;
mov bx,[bp-2]
;
; asm mov cx,8000h
;
mov cx,8000h
;
; asm mov dx,buf1
;
mov dx,[bp-4]
;
; asm mov ax,buf2
;
mov ax,[bp-6]
;
; asm mov ds,ax
;
mov ds,ax
;
; asm mov ah,40h // WRITE w/handle
;
mov ah,40h
;
; asm int 21h
;
int 21h
;
; asm pop ds
;
pop ds
;
;
; asm add buf2,800h // bump ptr up 1/2 segment
;
add [bp-6],800h
;
; asm sub WORD PTR size,8000h // done yet?
;
sub WORD PTR [bp+10],8000h
;
; asm sbb WORD PTR size+2,0
;
sbb WORD PTR [bp+10]+2,0
;
; asm cmp WORD PTR size+2,0
;
cmp WORD PTR [bp+10]+2,0
;
; asm ja L1
;
ja short @12@290
;
; asm cmp WORD PTR size,8000h
;
cmp WORD PTR [bp+10],8000h
;
; asm jae L1
;
jae short @12@290
@12@674:
;
;
; L2:
;
; asm push ds
;
push ds
;
; asm mov bx,handle
;
mov bx,[bp-2]
;
; asm mov cx,WORD PTR size
;
mov cx,WORD PTR [bp+10]
;
; asm mov dx,buf1
;
mov dx,[bp-4]
;
; asm mov ax,buf2
;
mov ax,[bp-6]
;
; asm mov ds,ax
;
mov ds,ax
;
; asm mov ah,40h // WRITE w/handle
;
mov ah,40h
;
; asm int 21h
;
int 21h
;
; asm pop ds
;
pop ds
;
; asm jmp out
;
jmp short @12@914
@12@914:
;
;
; out:
;
; asm mov bx,handle // CLOSE w/handle
;
mov bx,[bp-2]
;
; asm mov ah,3eh
;
mov ah,3eh
;
; asm int 21h
;
int 21h
;
;
; }
;
mov sp,bp
pop bp
ret
_SaveFile endp
;
; void BloadinMM (char *filename,memptr *spot)
;
assume cs:_TEXT
_BloadinMM proc near
push bp
mov bp,sp
sub sp,86
push si
push di
mov si,word ptr [bp+4]
mov di,word ptr [bp+6]
;
; {
; int handle;
; long length;
; char huge *location;
; char error[80];
;
; if ( (handle = open (filename,O_BINARY)) != -1 )
;
mov ax,32768
push ax
push si
call near ptr _open
pop cx
pop cx
mov word ptr [bp-2],ax
cmp ax,65535
je short @13@74
;
; {
; length = filelength (handle);
;
push word ptr [bp-2]
call near ptr _filelength
pop cx
mov word ptr [bp-4],dx
mov word ptr [bp-6],ax
;
; MMGetPtr (spot,length);
;
push word ptr [bp-4]
push word ptr [bp-6]
push di
call near ptr _MMGetPtr
add sp,6
;
; close (handle);
;
push word ptr [bp-2]
call near ptr _close
pop cx
;
; LoadFile (filename,*spot);
;
push word ptr [di]
xor ax,ax
push ax
push si
call near ptr _LoadFile
add sp,6
;
; }
;
jmp short @13@98
@13@74:
;
; else
; {
; strcpy (error,"BloadinMM: Can't find file ");
;
mov ax,offset DGROUP:s@+446
push ax
lea ax,word ptr [bp-86]
push ax
call near ptr _strcpy
pop cx
pop cx
;
; strcat (error,filename);
;
push si
lea ax,word ptr [bp-86]
push ax
call near ptr _strcat
pop cx
pop cx
;
; Quit (error);
;
lea ax,word ptr [bp-86]
push ax
call near ptr _Quit
pop cx
@13@98:
;
; }
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_BloadinMM endp
;
; void BloadinRLEMM (char *filename,memptr *spot)
;
assume cs:_TEXT
_BloadinRLEMM proc near
push bp
mov bp,sp
sub sp,6
push si
mov si,word ptr [bp+6]
;
; {
; long length;
; memptr org;
;
; BloadinMM (filename,&org);
;
lea ax,word ptr [bp-6]
push ax
push word ptr [bp+4]
call near ptr _BloadinMM
pop cx
pop cx
;
; length = *(long _seg *)org; // rleb compressed length
;
mov es,word ptr [bp-6]
mov ax,word ptr es:[2]
mov dx,word ptr es:[0]
mov word ptr [bp-2],ax
mov word ptr [bp-4],dx
;
; MMGetPtr (spot,length);
;
push word ptr [bp-2]
push word ptr [bp-4]
push si
call near ptr _MMGetPtr
add sp,6
;
; RLEBExpand ((unsigned char far *)org,(unsigned char far *)*spot);
;
push word ptr [si]
xor ax,ax
push ax
push word ptr [bp-6]
xor ax,ax
push ax
call near ptr _RLEBExpand
add sp,8
;
; MMFreePtr (&org);
;
lea ax,word ptr [bp-6]
push ax
call near ptr _MMFreePtr
pop cx
;
; }
;
pop si
mov sp,bp
pop bp
ret
_BloadinRLEMM endp
;
; void BloadinHUFFMM (char *filename,memptr *spot)
;
assume cs:_TEXT
_BloadinHUFFMM proc near
push bp
mov bp,sp
sub sp,6
push si
push di
mov di,word ptr [bp+4]
mov si,word ptr [bp+6]
;
; {
; long length;
; memptr org;
;
; if (useegamem)
;
cmp word ptr DGROUP:_useegamem,0
je short @15@74
;
; {
; org = (memptr)(0xa000+(linewidth*200)/16);
;
mov ax,word ptr DGROUP:_linewidth
mov dx,200
imul dx
mov cl,4
shr ax,cl
add ax,40960
mov word ptr [bp-6],ax
;
; LoadFile (filename,MK_FP(org,0));
;
xor ax,ax
push word ptr [bp-6]
push ax
push di
call near ptr _LoadFile
add sp,6
;
; }
;
jmp short @15@98
@15@74:
;
; else
; BloadinMM (filename,&org);
;
lea ax,word ptr [bp-6]
push ax
push di
call near ptr _BloadinMM
pop cx
pop cx
@15@98:
;
;
; length = *(((long _seg *)org)+1); // huff compressed length
;
mov es,word ptr [bp-6]
mov ax,word ptr es:[6]
mov dx,word ptr es:[4]
mov word ptr [bp-2],ax
mov word ptr [bp-4],dx
;
; MMGetPtr (spot,length);
;
push word ptr [bp-2]
push word ptr [bp-4]
push si
call near ptr _MMGetPtr
add sp,6
;
; HuffExpandFile ((unsigned char far *)org,(unsigned char far *)*spot);
;
xor ax,ax
push word ptr [si]
push ax
xor ax,ax
push word ptr [bp-6]
push ax
call near ptr _HuffExpandFile
add sp,8
;
;
; if (!useegamem)
;
cmp word ptr DGROUP:_useegamem,0
jne short @15@146
;
; MMFreePtr (&org);
;
lea ax,word ptr [bp-6]
push ax
call near ptr _MMFreePtr
pop cx
@15@146:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_BloadinHUFFMM endp
;
; long Verify(char *filename)
;
assume cs:_TEXT
_Verify proc near
push bp
mov bp,sp
sub sp,4
push si
;
; {
; int handle;
; long size;
;
; if ((handle=open(filename,O_BINARY))==-1) return 0;
;
mov ax,32768
push ax
push word ptr [bp+4]
call near ptr _open
pop cx
pop cx
mov si,ax
cmp ax,65535
jne short @16@74
xor dx,dx
xor ax,ax
jmp short @16@98
@16@74:
;
; size=filelength(handle);
;
push si
call near ptr _filelength
pop cx
mov word ptr [bp-2],dx
mov word ptr [bp-4],ax
;
; close(handle);
;
push si
call near ptr _close
pop cx
;
; return size;
;
mov dx,word ptr [bp-2]
mov ax,word ptr [bp-4]
jmp short @16@98
@16@98:
;
; }
;
pop si
mov sp,bp
pop bp
ret
_Verify endp
;
; void StopDrive (void)
;
assume cs:_TEXT
_StopDrive proc near
push bp
mov bp,sp
push si
;
; {
; int i;
;
; for (i=0;i<100;i++)
;
xor si,si
jmp short @17@98
@17@50:
;
; CallTimer();
;
call near ptr _CallTimer
inc si
@17@98:
cmp si,100
jl short @17@50
;
; }
;
pop si
pop bp
ret
_StopDrive endp
;
; void HuffExpandFile (unsigned char huge *infile,
;
assume cs:_TEXT
_HuffExpandFile proc near
push bp
mov bp,sp
sub sp,8
;
; unsigned char huge *outfile)
; {
; char header[4];
; unsigned tag;
; long length;
;
; header[0] = *infile;
;
les bx,dword ptr [bp+4]
mov al,byte ptr es:[bx]
mov byte ptr [bp-4],al
;
; header[1] = *(infile+1);
;
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,1
call near ptr N_PADD@
mov bx,ax
mov es,dx
mov al,byte ptr es:[bx]
mov byte ptr [bp-3],al
;
; header[2] = *(infile+2);
;
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,2
call near ptr N_PADD@
mov bx,ax
mov es,dx
mov al,byte ptr es:[bx]
mov byte ptr [bp-2],al
;
; header[3] = *(infile+3);
;
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,3
call near ptr N_PADD@
mov bx,ax
mov es,dx
mov al,byte ptr es:[bx]
mov byte ptr [bp-1],al
;
; if (strncmp (header,"HUFF",4))
;
mov ax,4
push ax
mov ax,offset DGROUP:s@+474
push ax
lea ax,word ptr [bp-4]
push ax
call near ptr _strncmp
add sp,6
or ax,ax
je short @18@74
;
; Quit ("Tried to expand a file that isn't HUFF!");
;
mov ax,offset DGROUP:s@+479
push ax
call near ptr _Quit
pop cx
@18@74:
;
;
; length = *(long huge *)(infile+4);
;
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,4
call near ptr N_PADD@
mov bx,ax
mov es,dx
mov ax,word ptr es:[bx+2]
mov dx,word ptr es:[bx]
mov word ptr [bp-6],ax
mov word ptr [bp-8],dx
;
;
; movedata(FP_SEG(infile+8),FP_OFF(infile+8),_DS,(unsigned)&nodearray,1020);
;
mov ax,1020
push ax
mov ax,offset DGROUP:_nodearray
push ax
push ds
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,8
call near ptr N_PADD@
push ax
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,8
call near ptr N_PADD@
push dx
call near ptr _movedata
add sp,10
;
; OptimizeNodes (nodearray);
;
mov ax,offset DGROUP:_nodearray
push ax
call near ptr _OptimizeNodes
pop cx
;
; HuffExpand (infile+1028,outfile,length,nodearray);
;
mov ax,offset DGROUP:_nodearray
push ax
push word ptr [bp-6]
push word ptr [bp-8]
push word ptr [bp+10]
push word ptr [bp+8]
mov dx,word ptr [bp+6]
mov ax,word ptr [bp+4]
xor cx,cx
mov bx,1028
call near ptr N_PADD@
push dx
push ax
call near ptr _HuffExpand
add sp,14
;
; }
;
mov sp,bp
pop bp
ret
_HuffExpandFile endp
;
; void OptimizeNodes (huffnode *table)
;
assume cs:_TEXT
_OptimizeNodes proc near
push bp
mov bp,sp
push si
push di
mov di,word ptr [bp+4]
;
; {
; huffnode *node;
; int i;
;
; node = table;
;
mov si,di
;
;
; for (i=0;i<255;i++)
;
xor bx,bx
jmp short @19@194
@19@50:
;
; {
; if (node->bit0 >= 256)
;
cmp word ptr [si],256
jb short @19@98
;
; node->bit0 = (unsigned)(table+(node->bit0-256));
;
mov ax,word ptr [si]
sub ax,256
shl ax,1
shl ax,1
mov dx,di
add dx,ax
mov word ptr [si],dx
@19@98:
;
; if (node->bit1 >= 256)
;
cmp word ptr [si+2],256
jb short @19@146
;
; node->bit1 = (unsigned)(table+(node->bit1-256));
;
mov ax,word ptr [si+2]
sub ax,256
shl ax,1
shl ax,1
mov dx,di
add dx,ax
mov word ptr [si+2],dx
@19@146:
;
; node++;
;
add si,4
inc bx
@19@194:
cmp bx,255
jl short @19@50
;
; }
; }
;
pop di
pop si
pop bp
ret
_OptimizeNodes endp
;
; void HuffExpand (unsigned char huge *source, unsigned char huge *dest,
;
assume cs:_TEXT
_HuffExpand proc near
push bp
mov bp,sp
sub sp,10
push si
push di
;
; long length,huffnode *hufftable)
; {
; unsigned bit,byte,node,code;
; unsigned sourceseg,sourceoff,destseg,destoff,endseg,endoff;
; huffnode *nodeon,*headptr;
;
; headptr = hufftable+254; // head node is allways node 254
;
mov ax,word ptr [bp+16]
add ax,1016
mov word ptr [bp-10],ax
;
;
; #if0
; bit = 1;
; byte = *source++;
;
; while (length)
; {
; if (byte&bit)
; code = nodeon->bit1;
; else
; code = nodeon->bit0;
;
; bit<<=1;
; if (bit==256)
; {
; bit=1;
; byte = *source++;
; }
;
; if (code<256)
; {
; *dest++=code;
; nodeon=headptr;
; length--;
; }
; else
; nodeon = (huffnode *)code;
; }
;
; #endif
;
; source++; // normalize
;
xor cx,cx
mov bx,1
mov dx,ss
lea ax,word ptr [bp+4]
call near ptr N_PADA@
;
; source--;
;
xor cx,cx
mov bx,1
mov dx,ss
lea ax,word ptr [bp+4]
call near ptr N_PSBA@
;
; dest++;
;
xor cx,cx
mov bx,1
mov dx,ss
lea ax,word ptr [bp+8]
call near ptr N_PADA@
;
; dest--;
;
xor cx,cx
mov bx,1
mov dx,ss
lea ax,word ptr [bp+8]
call near ptr N_PSBA@
;
;
; sourceseg = FP_SEG(source);
;
mov ax,word ptr [bp+6]
mov word ptr [bp-2],ax
;
; sourceoff = FP_OFF(source);
;
mov ax,word ptr [bp+4]
mov word ptr [bp-4],ax
;
; destseg = FP_SEG(dest);
;
mov ax,word ptr [bp+10]
mov word ptr [bp-6],ax
;
; destoff = FP_OFF(dest);
;
mov ax,word ptr [bp+8]
mov word ptr [bp-8],ax
;
;
; length--;
;
sub word ptr [bp+12],1
sbb word ptr [bp+14],0
;
; //
; // al = source byte
; // cl = bit in source (1,2,4,8,...)
; // dx = code
; //
; // ds:si source
; // es:di dest
; // ss:bx node pointer
; //
;
; asm mov bx,[headptr]
;
mov bx,[[bp-10]]
;
; asm mov cl,1
;
mov cl,1
;
;
; asm mov si,[sourceoff]
;
mov si,[[bp-4]]
;
; asm mov di,[destoff]
;
mov di,[[bp-8]]
;
; asm mov es,[destseg]
;
mov es,[[bp-6]]
;
; asm mov ds,[sourceseg]
;
mov ds,[[bp-2]]
;
;
; asm lodsb // load first byte
;
lodsb
@20@218:
;
;
; expand:
; asm test al,cl // bit set?
;
test al,cl
;
; asm jnz bit1
;
jne short @20@314
;
; asm mov dx,[ss:bx] // take bit0 path from node
;
mov dx,[ss:bx]
;
; asm jmp gotcode
;
jmp short @20@338
@20@314:
;
; bit1:
; asm mov dx,[ss:bx+2] // take bit1 path
;
mov dx,[ss:bx+2]
@20@338:
;
;
; gotcode:
; asm shl cl,1 // advance to next bit position
;
shl cl,1
;
; asm jnc sourceup
;
jnc short @20@578
;
; asm lodsb
;
lodsb
;
; asm cmp si,0x10 // normalize ds:si
;
cmp si,010H
;
; asm jb sinorm
;
jb short @20@554
;
; asm mov cx,ds
;
mov cx,ds
;
; asm inc cx
;
inc cx
;
; asm mov ds,cx
;
mov ds,cx
;
; asm xor si,si
;
xor si,si
@20@554:
;
; sinorm:
; asm mov cl,1 // back to first bit
;
mov cl,1
@20@578:
;
;
; sourceup:
; asm or dh,dh // if dx<256 its a byte, else move node
;
or dh,dh
;
; asm jz storebyte
;
je short @20@674
;
; asm mov bx,dx // next node = (huffnode *)code
;
mov bx,dx
;
; asm jmp expand
;
jmp short @20@218
@20@674:
;
;
; storebyte:
; asm mov [es:di],dl
;
mov [es:di],dl
;
; asm inc di // write a decopmpressed byte out
;
inc di
;
; asm mov bx,[headptr] // back to the head node for next bit
;
mov bx,[[bp-10]]
;
;
; asm cmp di,0x10 // normalize es:di
;
cmp di,010H
;
; asm jb dinorm
;
jb short @20@890
;
; asm mov dx,es
;
mov dx,es
;
; asm inc dx
;
inc dx
;
; asm mov es,dx
;
mov es,dx
;
; asm xor di,di
;
xor di,di
@20@890:
;
; dinorm:
;
; asm sub [WORD PTR ss:length],1
;
sub [WORD PTR ss:[bp+12]],1
;
; asm jnc expand
;
jnc short @20@218
;
; asm dec [WORD PTR ss:length+2]
;
dec [WORD PTR ss:[bp+12]+2]
;
; asm jns expand // when length = ffff ffff, done
;
jns short @20@218
;
;
; asm mov ax,ss
;
mov ax,ss
;
; asm mov ds,ax
;
mov ds,ax
;
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_HuffExpand endp
;
; void RLEWExpand (unsigned far *source, unsigned far *dest)
;
assume cs:_TEXT
_RLEWExpand proc near
push bp
mov bp,sp
sub sp,10
push si
push di
;
; {
; long length;
; unsigned value,count,i;
; unsigned far *start,far *end;
;
; length = *(long far *)source;
;
les bx,dword ptr [bp+4]
mov ax,word ptr es:[bx+2]
mov dx,word ptr es:[bx]
mov word ptr [bp-2],ax
mov word ptr [bp-4],dx
;
; end = dest + (length)/2;
;
xor ax,ax
mov dx,2
push ax
push dx
push word ptr [bp-2]
push word ptr [bp-4]
call near ptr N_LDIV@
shl ax,1
mov dx,word ptr [bp+10]
mov bx,word ptr [bp+8]
add bx,ax
mov word ptr [bp-8],dx
mov word ptr [bp-10],bx
;
;
; source+=2; // skip length words
;
add word ptr [bp+4],4
@21@50:
;
; //
; // expand it
; //
; do
; {
; value = *source++;
;
les bx,dword ptr [bp+4]
mov si,word ptr es:[bx]
add word ptr [bp+4],2
;
; if (value != RLETAG)
;
cmp si,65278
je short @21@98
;
; //
; // uncompressed
; //
; *dest++=value;
;
les bx,dword ptr [bp+8]
mov word ptr es:[bx],si
add word ptr [bp+8],2
jmp short @21@242
@21@98:
;
; else
; {
; //
; // compressed string
; //
; count = *source++;
;
les bx,dword ptr [bp+4]
mov ax,word ptr es:[bx]
mov word ptr [bp-6],ax
add word ptr [bp+4],2
;
; value = *source++;
;
les bx,dword ptr [bp+4]
mov si,word ptr es:[bx]
add word ptr [bp+4],2
;
; if (dest+count>end)
;
mov ax,word ptr [bp-6]
shl ax,1
mov dx,word ptr [bp+8]
add dx,ax
cmp dx,word ptr [bp-10]
jbe short @21@146
;
; Quit("RLEWExpand error!");
;
mov ax,offset DGROUP:s@+519
push ax
call near ptr _Quit
pop cx
@21@146:
;
;
; for (i=1;i<=count;i++)
;
mov di,1
jmp short @21@218
@21@170:
;
; *dest++ = value;
;
les bx,dword ptr [bp+8]
mov word ptr es:[bx],si
add word ptr [bp+8],2
inc di
@21@218:
cmp di,word ptr [bp-6]
jbe short @21@170
@21@242:
;
; }
; } while (dest<end);
;
mov ax,word ptr [bp+8]
cmp ax,word ptr [bp-10]
jb short @21@50
;
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_RLEWExpand endp
;
; void RLEBExpand (unsigned char far *source, unsigned char far *dest)
;
assume cs:_TEXT
_RLEBExpand proc near
push bp
mov bp,sp
sub sp,10
push si
;
; {
; long length;
; unsigned char value,count;
; unsigned i;
; unsigned char far *start,far *end;
;
; length = *(long far *)source;
;
les bx,dword ptr [bp+4]
mov ax,word ptr es:[bx+2]
mov dx,word ptr es:[bx]
mov word ptr [bp-2],ax
mov word ptr [bp-4],dx
;
; end = dest + (length);
;
mov ax,word ptr [bp+10]
mov dx,word ptr [bp+8]
add dx,word ptr [bp-4]
mov word ptr [bp-8],ax
mov word ptr [bp-10],dx
;
;
; source+=4; // skip length words
;
add word ptr [bp+4],4
@22@50:
;
; //
; // expand it
; //
; do
; {
; value = *source++;
;
les bx,dword ptr [bp+4]
mov al,byte ptr es:[bx]
mov cl,al
inc word ptr [bp+4]
;
; if (value != RLEBTAG)
;
cmp cl,254
je short @22@98
;
; //
; // uncompressed
; //
; *dest++=value;
;
les bx,dword ptr [bp+8]
mov al,cl
mov byte ptr es:[bx],al
inc word ptr [bp+8]
jmp short @22@194
@22@98:
;
; else
; {
; //
; // compressed string
; //
; count = *source++;
;
les bx,dword ptr [bp+4]
mov al,byte ptr es:[bx]
mov byte ptr [bp-5],al
inc word ptr [bp+4]
;
; value = *source++;
;
les bx,dword ptr [bp+4]
mov al,byte ptr es:[bx]
mov cl,al
inc word ptr [bp+4]
;
; for (i=1;i<=count;i++)
;
mov si,1
jmp short @22@170
@22@122:
;
; *dest++ = value;
;
les bx,dword ptr [bp+8]
mov al,cl
mov byte ptr es:[bx],al
inc word ptr [bp+8]
inc si
@22@170:
mov al,byte ptr [bp-5]
mov ah,0
cmp ax,si
jae short @22@122
@22@194:
;
; }
; } while (dest<end);
;
mov ax,word ptr [bp+8]
cmp ax,word ptr [bp-10]
jb short @22@50
;
;
; }
;
pop si
mov sp,bp
pop bp
ret
_RLEBExpand endp
;
; void LoadPage(char *filename,unsigned dest)
;
assume cs:_TEXT
_LoadPage proc near
push bp
mov bp,sp
sub sp,8
push si
push di
;
; {
; memptr src;
; unsigned from,source;
; long length;
; int i,j,width,height,xx,x,y,plane;
;
; //
; // load the pic in
; //
;
; BloadinHUFFMM (filename,&src);
;
lea ax,word ptr [bp-2]
push ax
push word ptr [bp+4]
call near ptr _BloadinHUFFMM
pop cx
pop cx
;
; StopDrive();
;
call near ptr _StopDrive
;
;
; from = 8;
;
mov word ptr [bp-4],8
;
; width = *((int far *)src+2);
;
mov es,word ptr [bp-2]
mov ax,word ptr es:[4]
mov word ptr [bp-6],ax
;
; height = *((int far *)src+3);
;
mov es,word ptr [bp-2]
mov ax,word ptr es:[6]
mov word ptr [bp-8],ax
;
; for (i=0;i<4;i++)
;
xor di,di
jmp short @23@194
@23@50:
;
; {
; EGAplane(i);
;
push di
call near ptr _EGAplane
pop cx
;
; for (j=0;j<height;j++)
;
xor si,si
jmp short @23@122
@23@74:
;
; movedata((unsigned)src,from+width*j,0xa000,dest+linewidth*j,width);
;
push word ptr [bp-6]
mov ax,word ptr DGROUP:_linewidth
imul si
mov dx,word ptr [bp+6]
add dx,ax
push dx
mov ax,40960
push ax
mov ax,word ptr [bp-6]
imul si
mov dx,word ptr [bp-4]
add dx,ax
push dx
push word ptr [bp-2]
call near ptr _movedata
add sp,10
inc si
@23@122:
cmp si,word ptr [bp-8]
jl short @23@74
;
; from += width*height;
;
mov ax,word ptr [bp-6]
imul word ptr [bp-8]
add word ptr [bp-4],ax
inc di
@23@194:
cmp di,4
jl short @23@50
;
; }
; MMFreePtr (&src);
;
lea ax,word ptr [bp-2]
push ax
call near ptr _MMFreePtr
pop cx
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_LoadPage endp
;
; void GenYlookup (void)
;
assume cs:_TEXT
_GenYlookup proc near
push bp
mov bp,sp
push si
;
; {
; int i;
;
; for (i=0;i<256;i++)
;
xor si,si
jmp short @24@98
@24@50:
;
; ylookup[i]=i*linewidth;
;
mov ax,si
imul word ptr DGROUP:_linewidth
mov bx,si
shl bx,1
mov word ptr DGROUP:_ylookup[bx],ax
inc si
@24@98:
cmp si,256
jl short @24@50
;
; }
;
pop si
pop bp
ret
_GenYlookup endp
;
; void SetScreenMode (grtype mode)
;
assume cs:_TEXT
_SetScreenMode proc near
push bp
mov bp,sp
;
; {
; switch (mode)
;
mov ax,word ptr [bp+4]
or ax,ax
je short @25@146
cmp ax,1
je short @25@170
cmp ax,2
je short @25@194
jmp short @25@218
@25@146:
;
; {
; case text: _AX = 3;
;
mov ax,3
;
; geninterrupt (0x10);
;
int 16
;
; screenseg=0xb000;
;
mov word ptr DGROUP:_screenseg,45056
;
; break;
;
jmp short @25@218
@25@170:
;
; case CGAgr: _AX = 4;
;
mov ax,4
;
; geninterrupt (0x10);
;
int 16
;
; screenseg=0xb800;
;
mov word ptr DGROUP:_screenseg,47104
;
; break;
;
jmp short @25@218
@25@194:
;
; case EGAgr: _AX = 0xd;
;
mov ax,13
;
; geninterrupt (0x10);
;
int 16
;
; screenseg=0xa000;
;
mov word ptr DGROUP:_screenseg,40960
;
; break;
;
jmp short @25@218
@25@218:
;
; #ifdef VGAGAME
; case VGAgr:{
; char extern VGAPAL; // deluxepaint vga pallet .OBJ file
; void far *vgapal = &VGAPAL;
; SetCool256 (); // custom 256 color mode
; screenseg=0xa000;
; _ES = FP_SEG(vgapal);
; _DX = FP_OFF(vgapal);
; _BX = 0;
; _CX = 0x100;
; _AX = 0x1012;
; geninterrupt(0x10); // set the deluxepaint pallet
;
; break;
; #endif
; }
; }
;
pop bp
ret
_SetScreenMode endp
;
; void EGASplitScreen (int linenum)
;
assume cs:_TEXT
_EGASplitScreen proc near
push bp
mov bp,sp
push si
mov si,word ptr [bp+4]
;
; {
; WaitVBL (1);
;
mov ax,1
push ax
call near ptr _WaitVBL
pop cx
;
; if (videocard==VGAcard)
;
cmp word ptr DGROUP:_videocard,5
jne short @26@74
;
; linenum=linenum*2-1;
;
mov ax,si
shl ax,1
dec ax
mov si,ax
@26@74:
;
; outportb (CRTC_INDEX,CRTC_LINECOMPARE);
;
mov dx,980
mov al,24
out dx,al
;
; outportb (CRTC_INDEX+1,linenum % 256);
;
mov ax,si
mov bx,256
cwd
idiv bx
push dx
mov dx,981
pop ax
out dx,al
;
; outportb (CRTC_INDEX,CRTC_OVERFLOW);
;
mov dx,980
mov al,7
out dx,al
;
; outportb (CRTC_INDEX+1, 1+16*(linenum/256));
;
mov ax,si
mov bx,256
cwd
idiv bx
mov cl,4
shl al,cl
inc al
mov dx,981
out dx,al
;
; if (videocard==VGAcard)
;
cmp word ptr DGROUP:_videocard,5
jne short @26@122
;
; {
; outportb (CRTC_INDEX,CRTC_MAXSCANLINE);
;
mov dx,980
mov al,9
out dx,al
;
; outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1) & (255-64));
;
mov dx,981
in al,dx
and al,191
mov dx,981
out dx,al
@26@122:
;
; }
; }
;
pop si
pop bp
ret
_EGASplitScreen endp
;
; void EGAVirtualScreen (int width) // sets screen width
;
assume cs:_TEXT
_EGAVirtualScreen proc near
push bp
mov bp,sp
;
; {
; WaitVBL (1);
;
mov ax,1
push ax
call near ptr _WaitVBL
pop cx
;
; outportb(CRTC_INDEX,CRTC_OFFSET);
;
mov dx,980
mov al,19
out dx,al
;
; outportb(CRTC_INDEX+1,width/2); // wide virtual screen
;
mov ax,word ptr [bp+4]
mov bx,2
cwd
idiv bx
mov dx,981
out dx,al
;
; }
;
pop bp
ret
_EGAVirtualScreen endp
;
; void ColorBorder (int color)
;
assume cs:_TEXT
_ColorBorder proc near
push bp
mov bp,sp
;
; {
; _AH=0x10;
;
mov ah,16
;
; _AL=1;
;
mov al,1
;
; _BH=color;
;
mov bh,byte ptr [bp+4]
;
; geninterrupt (0x10); // color the border
;
int 16
;
; }
;
pop bp
ret
_ColorBorder endp
;
; void CRTCstart (unsigned start)
;
assume cs:_TEXT
_CRTCstart proc near
push bp
mov bp,sp
;
; {
; WaitVBL (1);
;
mov ax,1
push ax
call near ptr _WaitVBL
pop cx
;
; outportb (CRTC_INDEX,CRTC_STARTLOW);
;
mov dx,980
mov al,13
out dx,al
;
; outportb (CRTC_INDEX+1,start % 256);
;
mov al,byte ptr [bp+4]
and al,255
mov dx,981
out dx,al
;
; outportb (CRTC_INDEX,CRTC_STARTHIGH);
;
mov dx,980
mov al,12
out dx,al
;
; outportb (CRTC_INDEX+1,start / 256);
;
mov ax,word ptr [bp+4]
mov cl,8
shr ax,cl
mov dx,981
out dx,al
;
; }
;
pop bp
ret
_CRTCstart endp
_TEXT ends
_DATA segment word public 'DATA'
_colors label byte
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 1
db 2
db 3
db 4
db 5
db 6
db 7
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 24
db 25
db 26
db 27
db 28
db 29
db 30
db 31
db 0
db 0
db 1
db 2
db 3
db 4
db 5
db 6
db 7
db 24
db 25
db 26
db 27
db 28
db 29
db 30
db 31
db 0
db 0
db 1
db 2
db 3
db 4
db 5
db 6
db 7
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 0
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 31
db 17 dup (0)
_DATA ends
_TEXT segment byte public 'CODE'
;
; void SetDefaultColors(void)
;
assume cs:_TEXT
_SetDefaultColors proc near
push bp
mov bp,sp
;
; {
; colors[3][16] = bordercolor;
;
mov al,byte ptr DGROUP:_bordercolor
mov byte ptr DGROUP:_colors+67,al
;
; _ES=FP_SEG(&colors[3]);
;
mov ax,ds
mov es,ax
;
; _DX=FP_OFF(&colors[3]);
;
mov dx,offset DGROUP:_colors+51
;
; _AX=0x1002;
;
mov ax,4098
;
; geninterrupt(0x10);
;
int 16
;
; }
;
pop bp
ret
_SetDefaultColors endp
;
; void FadeIn(void)
;
assume cs:_TEXT
_FadeIn proc near
push bp
mov bp,sp
push si
;
; {
; int i;
;
; for (i=0;i<4;i++)
;
xor si,si
jmp short @31@98
@31@50:
;
; {
; colors[i][16] = bordercolor;
;
mov ax,si
mov dx,17
imul dx
mov dl,byte ptr DGROUP:_bordercolor
mov bx,ax
mov byte ptr DGROUP:_colors[bx+16],dl
;
; _ES=FP_SEG(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov ax,ds
mov es,ax
;
; _DX=FP_OFF(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov dx,ax
;
; _AX=0x1002;
;
mov ax,4098
;
; geninterrupt(0x10);
;
int 16
;
; WaitVBL(6);
;
mov ax,6
push ax
call near ptr _WaitVBL
pop cx
inc si
@31@98:
cmp si,4
jl short @31@50
;
; }
; }
;
pop si
pop bp
ret
_FadeIn endp
;
; void FadeUp(void)
;
assume cs:_TEXT
_FadeUp proc near
push bp
mov bp,sp
push si
;
; {
; int i;
;
; for (i=3;i<7;i++)
;
mov si,3
jmp short @32@98
@32@50:
;
; {
; colors[i][16] = bordercolor;
;
mov ax,si
mov dx,17
imul dx
mov dl,byte ptr DGROUP:_bordercolor
mov bx,ax
mov byte ptr DGROUP:_colors[bx+16],dl
;
; _ES=FP_SEG(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov ax,ds
mov es,ax
;
; _DX=FP_OFF(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov dx,ax
;
; _AX=0x1002;
;
mov ax,4098
;
; geninterrupt(0x10);
;
int 16
;
; WaitVBL(6);
;
mov ax,6
push ax
call near ptr _WaitVBL
pop cx
inc si
@32@98:
cmp si,7
jl short @32@50
;
; }
; }
;
pop si
pop bp
ret
_FadeUp endp
;
; void FadeDown(void)
;
assume cs:_TEXT
_FadeDown proc near
push bp
mov bp,sp
push si
;
; {
; int i;
;
; for (i=6;i>2;i--)
;
mov si,6
jmp short @33@98
@33@50:
;
; {
; colors[i][16] = bordercolor;
;
mov ax,si
mov dx,17
imul dx
mov dl,byte ptr DGROUP:_bordercolor
mov bx,ax
mov byte ptr DGROUP:_colors[bx+16],dl
;
; _ES=FP_SEG(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov ax,ds
mov es,ax
;
; _DX=FP_OFF(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov dx,ax
;
; _AX=0x1002;
;
mov ax,4098
;
; geninterrupt(0x10);
;
int 16
;
; WaitVBL(6);
;
mov ax,6
push ax
call near ptr _WaitVBL
pop cx
dec si
@33@98:
cmp si,2
jg short @33@50
;
; }
; }
;
pop si
pop bp
ret
_FadeDown endp
;
; void SetNormalPalette(void)
;
assume cs:_TEXT
_SetNormalPalette proc near
push bp
mov bp,sp
;
; {
; int i;
;
; colors[3][16] = bordercolor;
;
mov al,byte ptr DGROUP:_bordercolor
mov byte ptr DGROUP:_colors+67,al
;
; _ES=FP_SEG(&colors[3]);
;
mov ax,ds
mov es,ax
;
; _DX=FP_OFF(&colors[3]);
;
mov dx,offset DGROUP:_colors+51
;
; _AX=0x1002;
;
mov ax,4098
;
; geninterrupt(0x10);
;
int 16
;
; }
;
pop bp
ret
_SetNormalPalette endp
;
; void FadeOut(void)
;
assume cs:_TEXT
_FadeOut proc near
push bp
mov bp,sp
push si
;
; {
;
; int i;
;
; for (i=3;i>=0;i--)
;
mov si,3
jmp short @35@98
@35@50:
;
; {
; colors[i][16] = bordercolor;
;
mov ax,si
mov dx,17
imul dx
mov dl,byte ptr DGROUP:_bordercolor
mov bx,ax
mov byte ptr DGROUP:_colors[bx+16],dl
;
; _ES=FP_SEG(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov ax,ds
mov es,ax
;
; _DX=FP_OFF(&colors[i]);
;
mov ax,si
mov dx,17
imul dx
add ax,offset DGROUP:_colors
mov dx,ax
;
; _AX=0x1002;
;
mov ax,4098
;
; geninterrupt(0x10);
;
int 16
;
; WaitVBL(6);
;
mov ax,6
push ax
call near ptr _WaitVBL
pop cx
dec si
@35@98:
or si,si
jge short @35@50
;
; }
; }
;
pop si
pop bp
ret
_FadeOut endp
;
; void SetLineWidth (int width)
;
assume cs:_TEXT
_SetLineWidth proc near
push bp
mov bp,sp
push si
mov si,word ptr [bp+4]
;
; {
; EGAVirtualScreen(width);
;
push si
call near ptr _EGAVirtualScreen
pop cx
;
; linewidth = width;
;
mov word ptr DGROUP:_linewidth,si
;
; GenYlookup();
;
call near ptr _GenYlookup
;
; }
;
pop si
pop bp
ret
_SetLineWidth endp
_TEXT ends
_DATA segment word public 'DATA'
_screencenterx label word
db 20
db 0
_screencentery label word
db 11
db 0
_DATA ends
_TEXT segment byte public 'CODE'
;
; void DrawWindow (int xl, int yl, int xh, int yh)
;
assume cs:_TEXT
_DrawWindow proc near
push bp
mov bp,sp
dec sp
dec sp
push si
push di
mov di,word ptr [bp+4]
;
; {
; int x,y;
; win_xl=xl;
;
mov word ptr DGROUP:_win_xl,di
;
; pxl = xl*8+8;
;
mov ax,di
shl ax,1
shl ax,1
shl ax,1
add ax,8
mov word ptr DGROUP:_pxl,ax
;
; win_yl=yl;
;
mov ax,word ptr [bp+6]
mov word ptr DGROUP:_win_yl,ax
;
; win_xh=xh;
;
mov ax,word ptr [bp+8]
mov word ptr DGROUP:_win_xh,ax
;
; pxh = xh*8;
;
mov ax,word ptr [bp+8]
shl ax,1
shl ax,1
shl ax,1
mov word ptr DGROUP:_pxh,ax
;
; win_yh=yh; // so the window can be erased
;
mov ax,word ptr [bp+10]
mov word ptr DGROUP:_win_yh,ax
;
;
; DRAWCHAR (xl,yl,1);
;
mov ax,1
push ax
mov ax,word ptr [bp+6]
shl ax,1
shl ax,1
shl ax,1
push ax
push di
call near ptr _DrawChar
add sp,6
;
; for (x=xl+1;x<xh;x++)
;
mov ax,di
inc ax
mov si,ax
jmp short @37@98
@37@50:
;
; DRAWCHAR (x,yl,2);
;
mov ax,2
push ax
mov ax,word ptr [bp+6]
shl ax,1
shl ax,1
shl ax,1
push ax
push si
call near ptr _DrawChar
add sp,6
inc si
@37@98:
cmp si,word ptr [bp+8]
jl short @37@50
;
; DRAWCHAR (xh,yl,3);
;
mov ax,3
push ax
mov ax,word ptr [bp+6]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+8]
call near ptr _DrawChar
add sp,6
;
; for (y=yl+1;y<yh;y++)
;
mov ax,word ptr [bp+6]
inc ax
mov word ptr [bp-2],ax
jmp short @37@290
@37@146:
;
; {
; DRAWCHAR (xl,y,4);
;
mov ax,4
push ax
mov ax,word ptr [bp-2]
shl ax,1
shl ax,1
shl ax,1
push ax
push di
call near ptr _DrawChar
add sp,6
;
; for (x=xl+1;x<xh;x++)
;
mov ax,di
inc ax
mov si,ax
jmp short @37@218
@37@170:
;
; DRAWCHAR (x,y,9);
;
mov ax,9
push ax
mov ax,word ptr [bp-2]
shl ax,1
shl ax,1
shl ax,1
push ax
push si
call near ptr _DrawChar
add sp,6
inc si
@37@218:
cmp si,word ptr [bp+8]
jl short @37@170
;
; DRAWCHAR (xh,y,5);
;
mov ax,5
push ax
mov ax,word ptr [bp-2]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+8]
call near ptr _DrawChar
add sp,6
inc word ptr [bp-2]
@37@290:
mov ax,word ptr [bp-2]
cmp ax,word ptr [bp+10]
jl short @37@146
;
; }
; DRAWCHAR (xl,yh,6);
;
mov ax,6
push ax
mov ax,word ptr [bp+10]
shl ax,1
shl ax,1
shl ax,1
push ax
push di
call near ptr _DrawChar
add sp,6
;
; for (x=xl+1;x<xh;x++)
;
mov ax,di
inc ax
mov si,ax
jmp short @37@386
@37@338:
;
; DRAWCHAR (x,yh,7);
;
mov ax,7
push ax
mov ax,word ptr [bp+10]
shl ax,1
shl ax,1
shl ax,1
push ax
push si
call near ptr _DrawChar
add sp,6
inc si
@37@386:
cmp si,word ptr [bp+8]
jl short @37@338
;
; DRAWCHAR (xh,yh,8);
;
mov ax,8
push ax
mov ax,word ptr [bp+10]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+8]
call near ptr _DrawChar
add sp,6
;
;
; sx = leftedge = xl+1;
;
mov ax,di
inc ax
mov word ptr DGROUP:_leftedge,ax
mov word ptr DGROUP:_sx,ax
;
; sy = yl+1;
;
mov ax,word ptr [bp+6]
inc ax
mov word ptr DGROUP:_sy,ax
;
; px=sx*8;
;
mov ax,word ptr DGROUP:_sx
shl ax,1
shl ax,1
shl ax,1
mov word ptr DGROUP:_px,ax
;
; py=pyl=sy*8;
;
mov ax,word ptr DGROUP:_sy
shl ax,1
shl ax,1
shl ax,1
mov word ptr DGROUP:_pyl,ax
mov word ptr DGROUP:_py,ax
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_DrawWindow endp
;
; void CenterWindow (int width, int height)
;
assume cs:_TEXT
_CenterWindow proc near
push bp
mov bp,sp
sub sp,4
push si
push di
mov si,word ptr [bp+4]
mov di,word ptr [bp+6]
;
; {
; int xl = screencenterx-width/2;
;
mov ax,si
mov bx,2
cwd
idiv bx
mov dx,word ptr DGROUP:_screencenterx
sub dx,ax
mov word ptr [bp-2],dx
;
; int yl = screencentery-height/2;
;
mov ax,di
mov bx,2
cwd
idiv bx
mov dx,word ptr DGROUP:_screencentery
sub dx,ax
mov word ptr [bp-4],dx
;
;
; DrawWindow (xl,yl,xl+width+1,yl+height+1);
;
mov ax,word ptr [bp-4]
add ax,di
inc ax
push ax
mov ax,word ptr [bp-2]
add ax,si
inc ax
push ax
push word ptr [bp-4]
push word ptr [bp-2]
call near ptr _DrawWindow
add sp,8
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_CenterWindow endp
;
; void CharBar (int xl, int yl, int xh, int yh, int ch)
;
assume cs:_TEXT
_CharBar proc near
push bp
mov bp,sp
push si
push di
;
; {
; int x,y;
;
; for (y=yl;y<=yh;y++)
;
mov di,word ptr [bp+6]
jmp short @39@170
@39@50:
;
; for (x=xl;x<=xh;x++)
;
mov si,word ptr [bp+4]
jmp short @39@122
@39@74:
;
; DRAWCHAR (x,y,ch);
;
push word ptr [bp+12]
mov ax,di
shl ax,1
shl ax,1
shl ax,1
push ax
push si
call near ptr _DrawChar
add sp,6
inc si
@39@122:
cmp si,word ptr [bp+8]
jle short @39@74
inc di
@39@170:
cmp di,word ptr [bp+10]
jle short @39@50
;
; }
;
pop di
pop si
pop bp
ret
_CharBar endp
;
; void ExpWin (int width, int height)
;
assume cs:_TEXT
_ExpWin proc near
push bp
mov bp,sp
push si
push di
mov di,word ptr [bp+4]
mov si,word ptr [bp+6]
;
; {
; if (width > 2)
;
cmp di,2
jle short @40@146
;
; {
; if (height >2)
;
cmp si,2
jle short @40@98
;
; ExpWin (width-2,height-2);
;
mov ax,si
add ax,65534
push ax
mov ax,di
add ax,65534
push ax
call near ptr _ExpWin
pop cx
pop cx
jmp short @40@122
@40@98:
;
; else
; ExpWinH (width-2,height);
;
push si
mov ax,di
add ax,65534
push ax
call near ptr _ExpWinH
pop cx
pop cx
@40@122:
;
; }
;
jmp short @40@194
@40@146:
;
; else
; if (height >2)
;
cmp si,2
jle short @40@194
;
; ExpWinV (width,height-2);
;
mov ax,si
add ax,65534
push ax
push di
call near ptr _ExpWinV
pop cx
pop cx
@40@194:
;
;
; WaitVBL (1);
;
mov ax,1
push ax
call near ptr _WaitVBL
pop cx
;
; CenterWindow (width,height);
;
push si
push di
call near ptr _CenterWindow
pop cx
pop cx
;
; }
;
pop di
pop si
pop bp
ret
_ExpWin endp
;
; void ExpWinH (int width, int height)
;
assume cs:_TEXT
_ExpWinH proc near
push bp
mov bp,sp
push si
push di
mov si,word ptr [bp+4]
mov di,word ptr [bp+6]
;
; {
; if (width > 2)
;
cmp si,2
jle short @41@74
;
; ExpWinH (width-2,height);
;
push di
mov ax,si
add ax,65534
push ax
call near ptr _ExpWinH
pop cx
pop cx
@41@74:
;
;
; WaitVBL (1);
;
mov ax,1
push ax
call near ptr _WaitVBL
pop cx
;
; CenterWindow (width,height);
;
push di
push si
call near ptr _CenterWindow
pop cx
pop cx
;
; }
;
pop di
pop si
pop bp
ret
_ExpWinH endp
;
; void ExpWinV (int width, int height)
;
assume cs:_TEXT
_ExpWinV proc near
push bp
mov bp,sp
push si
push di
mov di,word ptr [bp+4]
mov si,word ptr [bp+6]
;
; {
; if (height >2)
;
cmp si,2
jle short @42@74
;
; ExpWinV (width,height-2);
;
mov ax,si
add ax,65534
push ax
push di
call near ptr _ExpWinV
pop cx
pop cx
@42@74:
;
;
; WaitVBL (1);
;
mov ax,1
push ax
call near ptr _WaitVBL
pop cx
;
; CenterWindow (width,height);
;
push si
push di
call near ptr _CenterWindow
pop cx
pop cx
;
; }
;
pop di
pop si
pop bp
ret
_ExpWinV endp
;
; void DrawFrame(int x1,int y1,int x2,int y2,int type)
;
assume cs:_TEXT
_DrawFrame proc near
push bp
mov bp,sp
push si
push di
mov di,word ptr [bp+12]
;
; {
; int loop;
;
; type=type*22+1;
;
mov ax,di
mov dx,22
imul dx
inc ax
mov di,ax
;
;
; for (loop=x1+1;loop<x2;loop++)
;
mov ax,word ptr [bp+4]
inc ax
mov si,ax
jmp short @43@98
@43@50:
;
; {
; DRAWCHAR(loop,y1,type+1);
;
mov ax,di
inc ax
push ax
mov ax,word ptr [bp+6]
shl ax,1
shl ax,1
shl ax,1
push ax
push si
call near ptr _DrawChar
add sp,6
;
; DRAWCHAR(loop,y2,type+6);
;
mov ax,di
add ax,6
push ax
mov ax,word ptr [bp+10]
shl ax,1
shl ax,1
shl ax,1
push ax
push si
call near ptr _DrawChar
add sp,6
inc si
@43@98:
cmp si,word ptr [bp+8]
jl short @43@50
;
; }
; for (loop=y1+1;loop<y2;loop++)
;
mov ax,word ptr [bp+6]
inc ax
mov si,ax
jmp short @43@194
@43@146:
;
; {
; DRAWCHAR(x1,loop,type+3);
;
mov ax,di
add ax,3
push ax
mov ax,si
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+4]
call near ptr _DrawChar
add sp,6
;
; DRAWCHAR(x2,loop,type+4);
;
mov ax,di
add ax,4
push ax
mov ax,si
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+8]
call near ptr _DrawChar
add sp,6
inc si
@43@194:
cmp si,word ptr [bp+10]
jl short @43@146
;
; }
;
; DRAWCHAR(x1,y1,type);
;
push di
mov ax,word ptr [bp+6]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+4]
call near ptr _DrawChar
add sp,6
;
; DRAWCHAR(x2,y1,type+2);
;
mov ax,di
inc ax
inc ax
push ax
mov ax,word ptr [bp+6]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+8]
call near ptr _DrawChar
add sp,6
;
; DRAWCHAR(x2,y2,type+7);
;
mov ax,di
add ax,7
push ax
mov ax,word ptr [bp+10]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+8]
call near ptr _DrawChar
add sp,6
;
; DRAWCHAR(x1,y2,type+5);
;
mov ax,di
add ax,5
push ax
mov ax,word ptr [bp+10]
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr [bp+4]
call near ptr _DrawChar
add sp,6
;
; }
;
pop di
pop si
pop bp
ret
_DrawFrame endp
;
; int Get (void)
;
assume cs:_TEXT
_Get proc near
push bp
mov bp,sp
dec sp
dec sp
push si
;
; {
; int cycle,key;
;
; ClearKeys();
;
call near ptr _ClearKeys
@44@50:
;
; do
; {
; cycle = 9;
;
mov si,9
jmp short @44@98
@44@74:
;
; while (!(key = NoBiosKey(1)) && cycle<13)
; {
; DRAWCHAR (sx,sy,cycle++);
;
mov ax,si
inc si
push ax
mov ax,word ptr DGROUP:_sy
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr DGROUP:_sx
call near ptr _DrawChar
add sp,6
;
; WaitVBL (5);
;
mov ax,5
push ax
call near ptr _WaitVBL
pop cx
@44@98:
mov ax,1
push ax
call near ptr _NoBiosKey
pop cx
mov word ptr [bp-2],ax
or ax,ax
jne short @44@146
cmp si,13
jl short @44@74
@44@146:
;
; }
; } while (key == 0);
;
cmp word ptr [bp-2],0
je short @44@50
;
; DRAWCHAR (sx,sy,' ');
;
mov ax,32
push ax
mov ax,word ptr DGROUP:_sy
shl ax,1
shl ax,1
shl ax,1
push ax
push word ptr DGROUP:_sx
call near ptr _DrawChar
add sp,6
;
; return NoBiosKey(0); // take it out of the buffer
;
xor ax,ax
push ax
call near ptr _NoBiosKey
pop cx
jmp short @44@194
@44@194:
;
; }
;
pop si
mov sp,bp
pop bp
ret
_Get endp
;
; void Print (const char *str)
;
assume cs:_TEXT
_Print proc near
push bp
mov bp,sp
dec sp
dec sp
push si
mov si,word ptr [bp+4]
jmp short @45@170
@45@50:
;
; {
; unsigned char ch;
;
; while ((ch=*str++) != 0)
; if (ch == '\n')
;
cmp byte ptr [bp-1],10
jne short @45@98
;
; {
; sy++;
;
inc word ptr DGROUP:_sy
;
; sx=leftedge;
;
mov ax,word ptr DGROUP:_leftedge
mov word ptr DGROUP:_sx,ax
;
; }
;
jmp short @45@170
@45@98:
;
; else if (ch == '\r')
;
cmp byte ptr [bp-1],13
jne short @45@146
;
; sx=leftedge;
;
mov ax,word ptr DGROUP:_leftedge
mov word ptr DGROUP:_sx,ax
jmp short @45@170
@45@146:
;
; else
; DRAWCHAR (sx++,sy,ch);
;
mov al,byte ptr [bp-1]
mov ah,0
push ax
mov ax,word ptr DGROUP:_sy
shl ax,1
shl ax,1
shl ax,1
push ax
mov ax,word ptr DGROUP:_sx
inc word ptr DGROUP:_sx
push ax
call near ptr _DrawChar
add sp,6
@45@170:
mov bx,si
inc si
mov al,byte ptr [bx]
mov byte ptr [bp-1],al
or al,al
jne short @45@50
;
; }
;
pop si
mov sp,bp
pop bp
ret
_Print endp
;
; void Printxy(int x,int y,char *string)
;
assume cs:_TEXT
_Printxy proc near
push bp
mov bp,sp
sub sp,4
;
; {
; int osx,osy;
;
; osx=sx;
;
mov ax,word ptr DGROUP:_sx
mov word ptr [bp-2],ax
;
; osy=sy;
;
mov ax,word ptr DGROUP:_sy
mov word ptr [bp-4],ax
;
; sx=x;
;
mov ax,word ptr [bp+4]
mov word ptr DGROUP:_sx,ax
;
; sy=y;
;
mov ax,word ptr [bp+6]
mov word ptr DGROUP:_sy,ax
;
; Print(string);
;
push word ptr [bp+8]
call near ptr _Print
pop cx
;
; sx=osx;
;
mov ax,word ptr [bp-2]
mov word ptr DGROUP:_sx,ax
;
; sy=osy;
;
mov ax,word ptr [bp-4]
mov word ptr DGROUP:_sy,ax
;
; }
;
mov sp,bp
pop bp
ret
_Printxy endp
;
; void PrintInt (int val)
;
assume cs:_TEXT
_PrintInt proc near
push bp
mov bp,sp
;
; {
; itoa(val,str,10);
;
mov ax,10
push ax
mov ax,offset DGROUP:_str
push ax
push word ptr [bp+4]
call near ptr _itoa
add sp,6
;
; Print (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _Print
pop cx
;
; }
;
pop bp
ret
_PrintInt endp
;
; void PrintLong (long val)
;
assume cs:_TEXT
_PrintLong proc near
push bp
mov bp,sp
;
; {
; ltoa(val,str,10);
;
mov ax,10
push ax
mov ax,offset DGROUP:_str
push ax
push word ptr [bp+6]
push word ptr [bp+4]
call near ptr _ltoa
add sp,8
;
; Print (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _Print
pop cx
;
; }
;
pop bp
ret
_PrintLong endp
_TEXT ends
_DATA segment word public 'DATA'
db 48
db 49
db 50
db 51
db 52
db 53
db 54
db 55
db 56
db 57
db 65
db 66
db 67
db 68
db 69
db 70
db 2 dup (0)
_DATA ends
_TEXT segment byte public 'CODE'
;
; void PrintHexB(unsigned char value)
;
assume cs:_TEXT
_PrintHexB proc near
push bp
mov bp,sp
sub sp,20
push ss
lea ax,word ptr [bp-20]
push ax
push ds
mov ax,offset DGROUP:d@+251
push ax
mov cx,16
call near ptr N_SCOPY@
push ss
lea ax,word ptr [bp-4]
push ax
push ds
mov ax,offset DGROUP:d@+267
push ax
mov cx,2
call near ptr N_SCOPY@
;
; {
; int loop;
; char hexstr[16]="0123456789ABCDEF",str[2]="";
;
; for (loop=0;loop<2;loop++)
;
mov word ptr [bp-2],0
jmp short @49@98
@49@50:
;
; {
; str[0]=hexstr[(value>>(1-loop)*4)&15];
;
mov al,byte ptr [bp+4]
mov ah,0
mov dl,1
sub dl,byte ptr [bp-2]
shl dl,1
shl dl,1
mov cl,dl
sar ax,cl
and ax,15
lea dx,word ptr [bp-20]
add ax,dx
mov bx,ax
mov al,byte ptr [bx]
mov byte ptr [bp-4],al
;
; Print(str);
;
lea ax,word ptr [bp-4]
push ax
call near ptr _Print
pop cx
inc word ptr [bp-2]
@49@98:
cmp word ptr [bp-2],2
jl short @49@50
;
; }
; }
;
mov sp,bp
pop bp
ret
_PrintHexB endp
;
; void PrintHex(unsigned value)
;
assume cs:_TEXT
_PrintHex proc near
push bp
mov bp,sp
;
; {
; Print("$");
;
mov ax,offset DGROUP:s@+537
push ax
call near ptr _Print
pop cx
;
; PrintHexB(value>>8);
;
mov ax,word ptr [bp+4]
mov cl,8
shr ax,cl
push ax
call near ptr _PrintHexB
pop cx
;
; PrintHexB(value&0xff);
;
mov al,byte ptr [bp+4]
and al,255
push ax
call near ptr _PrintHexB
pop cx
;
; }
;
pop bp
ret
_PrintHex endp
;
; void PrintBin(unsigned value)
;
assume cs:_TEXT
_PrintBin proc near
push bp
mov bp,sp
dec sp
dec sp
;
; {
; int loop;
;
; Print("%");
;
mov ax,offset DGROUP:s@+539
push ax
call near ptr _Print
pop cx
;
; for (loop=0;loop<16;loop++)
;
mov word ptr [bp-2],0
jmp short @51@146
@51@50:
;
; if ((value>>15-loop)&1) Print("1"); else Print("0");
;
mov cl,15
sub cl,byte ptr [bp-2]
mov ax,word ptr [bp+4]
shr ax,cl
test ax,1
je short @51@98
mov ax,offset DGROUP:s@+541
push ax
call near ptr _Print
pop cx
jmp short @51@122
@51@98:
mov ax,offset DGROUP:s@+543
push ax
call near ptr _Print
pop cx
@51@122:
inc word ptr [bp-2]
@51@146:
cmp word ptr [bp-2],16
jl short @51@50
;
; }
;
mov sp,bp
pop bp
ret
_PrintBin endp
;
; void PrintC(char *string)
;
assume cs:_TEXT
_PrintC proc near
push bp
mov bp,sp
push si
mov si,word ptr [bp+4]
;
; {
; sx=1+screencenterx-(strlen(string)/2);
;
push si
call near ptr _strlen
pop cx
mov bx,2
cwd
idiv bx
mov dx,word ptr DGROUP:_screencenterx
inc dx
sub dx,ax
mov word ptr DGROUP:_sx,dx
;
; Print(string);
;
push si
call near ptr _Print
pop cx
;
; }
;
pop si
pop bp
ret
_PrintC endp
_TEXT ends
_DATA segment word public 'DATA'
db 18 dup (0)
db 48
db 49
db 50
db 51
db 52
db 53
db 54
db 55
db 56
db 57
db 65
db 66
db 67
db 68
db 69
db 70
_DATA ends
_TEXT segment byte public 'CODE'
;
; unsigned InputInt(void)
;
assume cs:_TEXT
_InputInt proc near
push bp
mov bp,sp
sub sp,40
push si
push di
push ss
lea ax,word ptr [bp-24]
push ax
push ds
mov ax,offset DGROUP:d@+269
push ax
mov cx,18
call near ptr N_SCOPY@
push ss
lea ax,word ptr [bp-40]
push ax
push ds
mov ax,offset DGROUP:d@+287
push ax
mov cx,16
call near ptr N_SCOPY@
;
; {
; char string[18]="",digit,hexstr[16]="0123456789ABCDEF";
; unsigned value,loop,loop1;
;
; Input(string,17);
;
mov ax,17
push ax
lea ax,word ptr [bp-24]
push ax
call near ptr _Input
pop cx
pop cx
;
; if (string[0]=='$')
;
cmp byte ptr [bp-24],36
jne short @53@314
;
; {
; int digits;
;
; digits=strlen(string)-2;
;
lea ax,word ptr [bp-24]
push ax
call near ptr _strlen
pop cx
add ax,65534
mov word ptr [bp-6],ax
;
; if (digits<0) return 0;
;
cmp word ptr [bp-6],0
jge short @53@98
xor ax,ax
jmp @53@626
@53@98:
;
;
; for (value=0,loop1=0;loop1<=digits;loop1++)
;
xor si,si
mov word ptr [bp-4],0
jmp short @53@266
@53@122:
;
; {
; digit=toupper(string[loop1+1]);
;
mov bx,word ptr [bp-4]
inc bx
lea ax,word ptr [bp-24]
add bx,ax
mov al,byte ptr [bx]
cbw
push ax
call near ptr _toupper
pop cx
mov byte ptr [bp-1],al
;
; for (loop=0;loop<16;loop++)
;
xor di,di
jmp short @53@218
@53@146:
;
; if (digit==hexstr[loop])
;
mov al,byte ptr [bp+di-40]
cmp al,byte ptr [bp-1]
jne short @53@194
;
; {
; value|=(loop<<(digits-loop1)*4);
;
mov al,byte ptr [bp-6]
sub al,byte ptr [bp-4]
shl al,1
shl al,1
mov dx,di
mov cl,al
shl dx,cl
or si,dx
;
; break;
;
jmp short @53@242
@53@194:
inc di
@53@218:
cmp di,16
jb short @53@146
@53@242:
inc word ptr [bp-4]
@53@266:
mov ax,word ptr [bp-4]
cmp ax,word ptr [bp-6]
jbe short @53@122
;
; }
; }
; }
;
jmp short @53@602
@53@314:
;
; else if (string[0]=='%')
;
cmp byte ptr [bp-24],37
jne short @53@578
;
; {
; int digits;
;
; digits=strlen(string)-2;
;
lea ax,word ptr [bp-24]
push ax
call near ptr _strlen
pop cx
add ax,65534
mov word ptr [bp-6],ax
;
; if (digits<0) return 0;
;
cmp word ptr [bp-6],0
jge short @53@386
xor ax,ax
jmp short @53@626
@53@386:
;
;
; for (value=0,loop1=0;loop1<=digits;loop1++)
;
xor si,si
mov word ptr [bp-4],0
jmp short @53@530
@53@410:
;
; {
; if (string[loop1+1]<'0' || string[loop1+1]>'1') return 0;
;
mov bx,word ptr [bp-4]
inc bx
lea ax,word ptr [bp-24]
add bx,ax
cmp byte ptr [bx],48
jl short @53@458
mov bx,word ptr [bp-4]
inc bx
lea ax,word ptr [bp-24]
add bx,ax
cmp byte ptr [bx],49
jle short @53@482
@53@458:
xor ax,ax
jmp short @53@626
@53@482:
;
; value|=(string[loop1+1]-'0')<<(digits-loop1);
;
mov bx,word ptr [bp-4]
inc bx
lea ax,word ptr [bp-24]
add bx,ax
mov al,byte ptr [bx]
cbw
add ax,65488
mov cl,byte ptr [bp-6]
sub cl,byte ptr [bp-4]
shl ax,cl
or si,ax
inc word ptr [bp-4]
@53@530:
mov ax,word ptr [bp-4]
cmp ax,word ptr [bp-6]
jbe short @53@410
;
; }
; }
;
jmp short @53@602
@53@578:
;
; else value=atoi(string);
;
lea ax,word ptr [bp-24]
push ax
call near ptr _atol
pop cx
mov si,ax
@53@602:
;
; return value;
;
mov ax,si
jmp short @53@626
@53@626:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_InputInt endp
;
; int Input(char *string,int max)
;
assume cs:_TEXT
_Input proc near
push bp
mov bp,sp
sub sp,182
push si
push di
;
; {
; char key;
; int count=0,loop;
;
xor si,si
;
; int pxt[90];
;
; pxt[0]=px;
;
mov ax,word ptr DGROUP:_px
mov word ptr [bp-182],ax
@54@50:
;
;
; do {
; key=toupper(PGet()&0xff);
;
call near ptr _PGet
and ax,255
push ax
call near ptr _toupper
pop cx
mov byte ptr [bp-1],al
;
; if ((key==127 || key==8)&&count>0)
;
cmp byte ptr [bp-1],127
je short @54@98
cmp byte ptr [bp-1],8
jne short @54@146
@54@98:
or si,si
jle short @54@146
;
; {
; count--;
;
dec si
;
; px=pxt[count];
;
mov bx,si
shl bx,1
lea ax,word ptr [bp-182]
add bx,ax
mov ax,word ptr [bx]
mov word ptr DGROUP:_px,ax
;
; DrawPchar(string[count]);
;
mov bx,word ptr [bp+4]
mov al,byte ptr [bx+si]
cbw
push ax
call near ptr _DrawPchar
pop cx
;
; px=pxt[count];
;
mov bx,si
shl bx,1
lea ax,word ptr [bp-182]
add bx,ax
mov ax,word ptr [bx]
mov word ptr DGROUP:_px,ax
@54@146:
;
; }
;
; if (key>=' ' && key<='z' && count<max)
;
cmp byte ptr [bp-1],32
jl short @54@242
cmp byte ptr [bp-1],122
jg short @54@242
cmp si,word ptr [bp+6]
jge short @54@242
;
; {
; *(string+count++)=key;
;
mov bx,word ptr [bp+4]
mov al,byte ptr [bp-1]
mov byte ptr [bx+si],al
inc si
;
; DrawPchar(key);
;
mov al,byte ptr [bp-1]
cbw
push ax
call near ptr _DrawPchar
pop cx
;
; pxt[count]=px;
;
mov bx,si
shl bx,1
lea ax,word ptr [bp-182]
add bx,ax
mov ax,word ptr DGROUP:_px
mov word ptr [bx],ax
@54@242:
;
; }
;
; } while (key!=27 && key!=13);
;
cmp byte ptr [bp-1],27
je short @54@290
cmp byte ptr [bp-1],13
je @@83
jmp @54@50
@@83:
@54@290:
;
;
; for (loop=count;loop<max;loop++) *(string+loop)=0;
;
mov di,si
jmp short @54@362
@54@314:
mov bx,word ptr [bp+4]
mov byte ptr [bx+di],0
inc di
@54@362:
cmp di,word ptr [bp+6]
jl short @54@314
;
;
; if (key==13) return 1;
;
cmp byte ptr [bp-1],13
jne short @54@434
mov ax,1
jmp short @54@458
@54@434:
;
; return 0;
;
xor ax,ax
jmp short @54@458
@54@458:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_Input endp
;
; void PPrint (const char *str)
;
assume cs:_TEXT
_PPrint proc near
push bp
mov bp,sp
dec sp
dec sp
push si
mov si,word ptr [bp+4]
jmp short @55@170
@55@50:
;
; {
; unsigned char ch;
;
; while ((ch=*str++) != 0)
; if (ch == '\n')
;
cmp byte ptr [bp-1],10
jne short @55@98
;
; {
; py+=10;
;
add word ptr DGROUP:_py,10
;
; px=pxl;
;
mov ax,word ptr DGROUP:_pxl
mov word ptr DGROUP:_px,ax
;
; }
;
jmp short @55@170
@55@98:
;
; else if (ch == '')
;
cmp byte ptr [bp-1],127
jne short @55@146
;
; fontcolor=(*str++)-'A'; // set color A-P
;
mov al,byte ptr [si]
cbw
add ax,65471
mov word ptr DGROUP:_fontcolor,ax
inc si
jmp short @55@170
@55@146:
;
; else
; DrawPchar (ch);
;
mov al,byte ptr [bp-1]
mov ah,0
push ax
call near ptr _DrawPchar
pop cx
@55@170:
mov bx,si
inc si
mov al,byte ptr [bx]
mov byte ptr [bp-1],al
or al,al
jne short @55@50
;
; }
;
pop si
mov sp,bp
pop bp
ret
_PPrint endp
;
; int PGet (void)
;
assume cs:_TEXT
_PGet proc near
push bp
mov bp,sp
push si
;
; {
; int oldx;
;
; oldx=px;
;
mov si,word ptr DGROUP:_px
;
;
; ClearKeys();
;
call near ptr _ClearKeys
jmp short @56@122
@56@50:
;
; while (!(NoBiosKey(1)&0xff))
; {
; DrawPchar ('_');
;
mov ax,95
push ax
call near ptr _DrawPchar
pop cx
;
; WaitVBL (5);
;
mov ax,5
push ax
call near ptr _WaitVBL
pop cx
;
; px=oldx;
;
mov word ptr DGROUP:_px,si
;
; DrawPchar ('_');
;
mov ax,95
push ax
call near ptr _DrawPchar
pop cx
;
; px=oldx;
;
mov word ptr DGROUP:_px,si
;
; if (NoBiosKey(1)&0xff) // slight response improver
;
mov ax,1
push ax
call near ptr _NoBiosKey
pop cx
test ax,255
je short @56@98
;
; break;
;
jmp short @56@146
@56@98:
;
; WaitVBL (5);
;
mov ax,5
push ax
call near ptr _WaitVBL
pop cx
@56@122:
mov ax,1
push ax
call near ptr _NoBiosKey
pop cx
test ax,255
je short @56@50
@56@146:
;
; }
; px=oldx;
;
mov word ptr DGROUP:_px,si
;
; return NoBiosKey(0); // take it out of the buffer
;
xor ax,ax
push ax
call near ptr _NoBiosKey
pop cx
jmp short @56@170
@56@170:
;
; }
;
pop si
pop bp
ret
_PGet endp
;
; int PSize (const char *str)
;
assume cs:_TEXT
_PSize proc near
push bp
mov bp,sp
push si
push di
mov si,word ptr [bp+4]
;
; {
; int length=0;
;
xor di,di
jmp short @57@122
@57@50:
;
; unsigned char ch;
;
; while ((ch=*str++) != 0)
; {
; if (ch=='') // skip color changes
;
cmp dl,127
jne short @57@98
;
; {
; str++;
;
inc si
;
; continue;
;
jmp short @57@122
@57@98:
;
; }
; length += ((fontstruct _seg *)fontseg)->width[ch];
;
mov es,word ptr DGROUP:_fontseg
mov al,dl
mov ah,0
mov bx,ax
mov al,byte ptr es:[bx+514]
cbw
add di,ax
@57@122:
mov bx,si
inc si
mov al,byte ptr [bx]
mov dl,al
or al,al
jne short @57@50
;
; }
;
; return length;
;
mov ax,di
jmp short @57@170
@57@170:
;
; }
;
pop di
pop si
pop bp
ret
_PSize endp
;
; void CPPrint (const char *str)
;
assume cs:_TEXT
_CPPrint proc near
push bp
mov bp,sp
dec sp
dec sp
push si
mov si,word ptr [bp+4]
;
; {
; int width;
;
; width = PSize(str);
;
push si
call near ptr _PSize
pop cx
mov word ptr [bp-2],ax
;
; px=pxl+(int)(pxh-pxl-width)/2;
;
mov ax,word ptr DGROUP:_pxh
sub ax,word ptr DGROUP:_pxl
sub ax,word ptr [bp-2]
mov bx,2
cwd
idiv bx
mov dx,word ptr DGROUP:_pxl
add dx,ax
mov word ptr DGROUP:_px,dx
;
; PPrint (str);
;
push si
call near ptr _PPrint
pop cx
;
; }
;
pop si
mov sp,bp
pop bp
ret
_CPPrint endp
;
; void PWrap (const char *str)
;
assume cs:_TEXT
_PWrap proc near
push bp
mov bp,sp
dec sp
dec sp
push si
mov si,word ptr [bp+4]
jmp short @59@170
@59@50:
;
; {
; unsigned char ch;
;
; while ((ch=*str++) != 0)
; if (ch == '\n')
;
cmp byte ptr [bp-1],10
jne short @59@98
;
; {
; py+=10;
;
add word ptr DGROUP:_py,10
;
; px=leftedge;
;
mov ax,word ptr DGROUP:_leftedge
mov word ptr DGROUP:_px,ax
;
; }
;
jmp short @59@170
@59@98:
;
; else if (ch == '\r')
;
cmp byte ptr [bp-1],13
jne short @59@146
;
; px=leftedge;
;
mov ax,word ptr DGROUP:_leftedge
mov word ptr DGROUP:_px,ax
jmp short @59@170
@59@146:
;
; else
; DrawPchar (ch);
;
mov al,byte ptr [bp-1]
mov ah,0
push ax
call near ptr _DrawPchar
pop cx
@59@170:
mov bx,si
inc si
mov al,byte ptr [bx]
mov byte ptr [bp-1],al
or al,al
jne short @59@50
;
; }
;
pop si
mov sp,bp
pop bp
ret
_PWrap endp
;
; void PPrintInt (int val)
;
assume cs:_TEXT
_PPrintInt proc near
push bp
mov bp,sp
;
; {
; itoa(val,str,10);
;
mov ax,10
push ax
mov ax,offset DGROUP:_str
push ax
push word ptr [bp+4]
call near ptr _itoa
add sp,6
;
; PPrint (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _PPrint
pop cx
;
; }
;
pop bp
ret
_PPrintInt endp
;
; void PPrintUnsigned (unsigned val)
;
assume cs:_TEXT
_PPrintUnsigned proc near
push bp
mov bp,sp
;
; {
; ltoa((long)val,str,10);
;
mov ax,10
push ax
mov ax,offset DGROUP:_str
push ax
xor ax,ax
push ax
push word ptr [bp+4]
call near ptr _ltoa
add sp,8
;
; PPrint (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _PPrint
pop cx
;
; }
;
pop bp
ret
_PPrintUnsigned endp
;
; void PPrintLong (long val)
;
assume cs:_TEXT
_PPrintLong proc near
push bp
mov bp,sp
;
; {
; ltoa((long)val,str,10);
;
mov ax,10
push ax
mov ax,offset DGROUP:_str
push ax
push word ptr [bp+6]
push word ptr [bp+4]
call near ptr _ltoa
add sp,8
;
; PPrint (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _PPrint
pop cx
;
; }
;
pop bp
ret
_PPrintLong endp
;
; int PInput(char *string,int max)
;
assume cs:_TEXT
_PInput proc near
push bp
mov bp,sp
sub sp,6
push si
push di
mov di,word ptr [bp+4]
;
; {
; char key;
; int count,loop,oldx;
;
; count = strlen(string);
;
push di
call near ptr _strlen
pop cx
mov si,ax
;
; PPrint (str);
;
mov ax,offset DGROUP:_str
push ax
call near ptr _PPrint
pop cx
@63@50:
;
;
; do {
; key=toupper(PGet()&0xff);
;
call near ptr _PGet
and ax,255
push ax
call near ptr _toupper
pop cx
mov byte ptr [bp-1],al
;
; if ((key==127 || key==8)&&count>0)
;
cmp byte ptr [bp-1],127
je short @63@98
cmp byte ptr [bp-1],8
jne short @63@146
@63@98:
or si,si
jle short @63@146
;
; {
; px-= ((fontstruct _seg *)fontseg)->width[ch];
;
mov es,word ptr DGROUP:_fontseg
mov al,byte ptr DGROUP:_ch
cbw
mov bx,ax
mov al,byte ptr es:[bx+514]
cbw
sub word ptr DGROUP:_px,ax
;
; oldx=px;
;
mov ax,word ptr DGROUP:_px
mov word ptr [bp-6],ax
;
; count--;
;
dec si
;
; DrawPchar(string[count]);
;
mov bx,si
mov al,byte ptr [bx+di]
cbw
push ax
call near ptr _DrawPchar
pop cx
;
; px=oldx;
;
mov ax,word ptr [bp-6]
mov word ptr DGROUP:_px,ax
@63@146:
;
; }
;
; if (key>=' ' && key<='z' && count<max)
;
cmp byte ptr [bp-1],32
jl short @63@242
cmp byte ptr [bp-1],122
jg short @63@242
cmp si,word ptr [bp+6]
jge short @63@242
;
; {
; *(string+count++)=key;
;
mov bx,si
mov al,byte ptr [bp-1]
mov byte ptr [bx+di],al
inc si
;
; DrawPchar(key);
;
mov al,byte ptr [bp-1]
cbw
push ax
call near ptr _DrawPchar
pop cx
@63@242:
;
; }
;
; } while (key!=27 && key!=13);
;
cmp byte ptr [bp-1],27
je short @63@290
cmp byte ptr [bp-1],13
jne short @63@50
@63@290:
;
;
; for (loop=count;loop<max;loop++)
;
mov word ptr [bp-4],si
jmp short @63@362
@63@314:
;
; *(string+loop)=0;
;
mov bx,word ptr [bp-4]
mov byte ptr [bx+di],0
inc word ptr [bp-4]
@63@362:
mov ax,word ptr [bp-4]
cmp ax,word ptr [bp+6]
jl short @63@314
;
;
; if (key==13)
;
cmp byte ptr [bp-1],13
jne short @63@434
;
; return 1;
;
mov ax,1
jmp short @63@458
@63@434:
;
; return 0;
;
xor ax,ax
jmp short @63@458
@63@458:
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
_PInput endp
_TEXT ends
_DATA segment word public 'DATA'
db 48
db 49
db 50
db 51
db 52
db 53
db 54
db 55
db 56
db 57
db 65
db 66
db 67
db 68
db 69
db 70
db 2 dup (0)
_DATA ends
_TEXT segment byte public 'CODE'
;
; void PPrintHexB(unsigned char value)
;
assume cs:_TEXT
_PPrintHexB proc near
push bp
mov bp,sp
sub sp,20
push ss
lea ax,word ptr [bp-20]
push ax
push ds
mov ax,offset DGROUP:d@+303
push ax
mov cx,16
call near ptr N_SCOPY@
push ss
lea ax,word ptr [bp-4]
push ax
push ds
mov ax,offset DGROUP:d@+319
push ax
mov cx,2
call near ptr N_SCOPY@
;
; {
; int loop;
; char hexstr[16]="0123456789ABCDEF",str[2]="";
;
; for (loop=0;loop<2;loop++)
;
mov word ptr [bp-2],0
jmp short @64@98
@64@50:
;
; {
; str[0]=hexstr[(value>>(1-loop)*4)&15];
;
mov al,byte ptr [bp+4]
mov ah,0
mov dl,1
sub dl,byte ptr [bp-2]
shl dl,1
shl dl,1
mov cl,dl
sar ax,cl
and ax,15
lea dx,word ptr [bp-20]
add ax,dx
mov bx,ax
mov al,byte ptr [bx]
mov byte ptr [bp-4],al
;
; PPrint(str);
;
lea ax,word ptr [bp-4]
push ax
call near ptr _PPrint
pop cx
inc word ptr [bp-2]
@64@98:
cmp word ptr [bp-2],2
jl short @64@50
;
; }
; }
;
mov sp,bp
pop bp
ret
_PPrintHexB endp
;
; void PPrintHex(unsigned value)
;
assume cs:_TEXT
_PPrintHex proc near
push bp
mov bp,sp
;
; {
; PPrint("$");
;
mov ax,offset DGROUP:s@+545
push ax
call near ptr _PPrint
pop cx
;
; PPrintHexB(value>>8);
;
mov ax,word ptr [bp+4]
mov cl,8
shr ax,cl
push ax
call near ptr _PPrintHexB
pop cx
;
; PPrintHexB(value&0xff);
;
mov al,byte ptr [bp+4]
and al,255
push ax
call near ptr _PPrintHexB
pop cx
;
; }
;
pop bp
ret
_PPrintHex endp
;
; void LoadCtrls (void)
;
assume cs:_TEXT
_LoadCtrls proc near
push bp
mov bp,sp
push si
;
; {
; int handle;
;
; if ((handle = open("CTLPANEL."EXTENSION, O_RDONLY | O_BINARY, S_IWRITE | S_IREAD)) == -1)
;
mov ax,384
push ax
mov ax,32769
push ax
mov ax,offset DGROUP:s@+547
push ax
call near ptr _open
add sp,6
mov si,ax
cmp ax,65535
jne short @66@74
;
; //
; // set up default control panel settings
; //
; {
; key[0] = 0x48;
;
mov byte ptr DGROUP:_key,72
;
; key[1] = 0x49;
;
mov byte ptr DGROUP:_key+1,73
;
; key[2] = 0x4d;
;
mov byte ptr DGROUP:_key+2,77
;
; key[3] = 0x51;
;
mov byte ptr DGROUP:_key+3,81
;
; key[4] = 0x50;
;
mov byte ptr DGROUP:_key+4,80
;
; key[5] = 0x4f;
;
mov byte ptr DGROUP:_key+5,79
;
; key[6] = 0x4b;
;
mov byte ptr DGROUP:_key+6,75
;
; key[7] = 0x47;
;
mov byte ptr DGROUP:_key+7,71
;
; keyB1 = 0x1d;
;
mov byte ptr DGROUP:_keyB1,29
;
; keyB2 = 0x38;
;
mov byte ptr DGROUP:_keyB2,56
;
; }
;
jmp short @66@98
@66@74:
;
; else
; {
; read(handle, &key, sizeof(key));
;
mov ax,8
push ax
mov ax,offset DGROUP:_key
push ax
push si
call near ptr _read
add sp,6
;
; read(handle, &keyB1, sizeof(keyB1));
;
mov ax,1
push ax
mov ax,offset DGROUP:_keyB1
push ax
push si
call near ptr _read
add sp,6
;
; read(handle, &keyB2, sizeof(keyB2));
;
mov ax,1
push ax
mov ax,offset DGROUP:_keyB2
push ax
push si
call near ptr _read
add sp,6
;
; read(handle, &highscore, sizeof(highscore));
;
mov ax,4
push ax
mov ax,offset DGROUP:_highscore
push ax
push si
call near ptr _read
add sp,6
;
; close(handle);
;
push si
call near ptr _close
pop cx
@66@98:
;
; }
; }
;
pop si
pop bp
ret
_LoadCtrls endp
;
; void SaveCtrls (void)
;
assume cs:_TEXT
_SaveCtrls proc near
push bp
mov bp,sp
push si
;
; {
; int handle;
;
; if ((handle = open("CTLPANEL."EXTENSION, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE)) == -1)
;
mov ax,384
push ax
mov ax,33538
push ax
mov ax,offset DGROUP:s@+560
push ax
call near ptr _open
add sp,6
mov si,ax
cmp ax,65535
jne short @67@74
;
; return;
;
jmp short @67@98
@67@74:
;
;
; write(handle, &key, sizeof(key));
;
mov ax,8
push ax
mov ax,offset DGROUP:_key
push ax
push si
call near ptr _write
add sp,6
;
; write(handle, &keyB1, sizeof(keyB1));
;
mov ax,1
push ax
mov ax,offset DGROUP:_keyB1
push ax
push si
call near ptr _write
add sp,6
;
; write(handle, &keyB2, sizeof(keyB2));
;
mov ax,1
push ax
mov ax,offset DGROUP:_keyB2
push ax
push si
call near ptr _write
add sp,6
;
; write(handle, &highscore, sizeof(highscore));
;
mov ax,4
push ax
mov ax,offset DGROUP:_highscore
push ax
push si
call near ptr _write
add sp,6
;
;
; close(handle);
;
push si
call near ptr _close
pop cx
@67@98:
;
; }
;
pop si
pop bp
ret
_SaveCtrls endp
_TEXT ends
_BSS segment word public 'BSS'
_ch label byte
db 1 dup (?)
db 1 dup (?)
_mapwidthextra label word
db 2 dup (?)
_score label word
db 4 dup (?)
_JoyXlow label word
db 6 dup (?)
_JoyXhigh label word
db 6 dup (?)
_JoyYlow label word
db 6 dup (?)
_JoyYhigh label word
db 6 dup (?)
_sx label word
db 2 dup (?)
_nodearray label word
db 1024 dup (?)
_keyB1 label byte
db 1 dup (?)
_keyB2 label byte
db 1 dup (?)
_str label byte
db 80 dup (?)
_useegamem label word
db 2 dup (?)
_pxl label word
db 2 dup (?)
_pxh label word
db 2 dup (?)
_key label byte
db 8 dup (?)
_sy label word
db 2 dup (?)
_bordercolor label word
db 2 dup (?)
_charptr label dword
db 4 dup (?)
_level label word
db 2 dup (?)
_pyl label word
db 2 dup (?)
_pyh label word
db 2 dup (?)
_playermode label word
db 6 dup (?)
_needgr label byte
db 77 dup (?)
db 1 dup (?)
_maprle label dword
db 4 dup (?)
_spriteptr label dword
db 4 dup (?)
_mapbwide label word
db 2 dup (?)
_mapwwide label word
db 2 dup (?)
_picptr label dword
db 4 dup (?)
_leftedge label word
db 2 dup (?)
_win_xl label word
db 2 dup (?)
_win_xh label word
db 2 dup (?)
_win_yl label word
db 2 dup (?)
_win_yh label word
db 2 dup (?)
_pictable label word
db 296 dup (?)
_tileptr label dword
db 4 dup (?)
_mapplane label dword
db 16 dup (?)
_mapheight label word
db 2 dup (?)
_grmode label word
db 2 dup (?)
_grsegs label word
db 154 dup (?)
_buttonflip label word
db 2 dup (?)
_highscore label word
db 4 dup (?)
_videocard label word
db 2 dup (?)
_levelheader label dword
db 4 dup (?)
?debug C E9
_BSS ends
_DATA segment word public 'DATA'
s@ label byte
db 'Joystick Configuration'
db 10
db 0
db 'Hold the joystick in the UPPER LEFT'
db 10
db 0
db 'corner and press a button:'
db 0
db 10
db 'Hold the joystick in the LOWER RIGHT'
db 10
db 0
db 'corner and press a button:'
db 0
db 10
db '(F)ire or (A)fterburn with B1 ?'
db 0
db 'ESC'
db 0
db 'BKSP'
db 0
db 'TAB'
db 0
db 'CTRL'
db 0
db 'LSHIFT'
db 0
db 'SPACE'
db 0
db 'CAPSLK'
db 0
db 'F'
db 0
db 'F11'
db 0
db 'F12'
db 0
db 'SCRLLK'
db 0
db 'ENTER'
db 0
db 'RSHIFT'
db 0
db 'PRTSC'
db 0
db 'ALT'
db 0
db 'HOME'
db 0
db 'PGUP'
db 0
db 'END'
db 0
db 'PGDN'
db 0
db 'INS'
db 0
db 'DEL'
db 0
db 'NUMLK'
db 0
db 'UP'
db 0
db 'DOWN'
db 0
db 'LEFT'
db 0
db 'RIGHT'
db 0
db 'Keyboard Configuration'
db 0
db 10
db '1 north'
db 0
db 10
db '2 east'
db 0
db 10
db '3 south'
db 0
db 10
db '4 west'
db 0
db 10
db '5 button1'
db 0
db 10
db '6 button2'
db 0
db 10
db 'Modify which action:'
db 0
db ':'
db 0
db ':'
db 0
db ':'
db 0
db 10
db 'Press the new key:'
db 0
db ':'
db 0
db 'BloadinMM: Can'
db 39
db 't find file '
db 0
db 'HUFF'
db 0
db 'Tried to expand a file that isn'
db 39
db 't HUFF!'
db 0
db 'RLEWExpand error!'
db 0
db '$'
db 0
db '%'
db 0
db '1'
db 0
db '0'
db 0
db '$'
db 0
db 'CTLPANEL.HOV'
db 0
db 'CTLPANEL.HOV'
db 0
_DATA ends
_TEXT segment byte public 'CODE'
_TEXT ends
public _CenterWindow
public _CalibrateJoy
public _InputInt
public _printscan
public _SetScreenMode
public _PWrap
public _PrintBin
extrn _NBKascii:word
extrn _DrawPchar:near
extrn _filelength:near
public _PGet
public _PrintHex
public _PrintC
public _GenYlookup
public _ReadJoystick
extrn _write:near
public _levelheader
extrn _DrawChar:near
extrn _linewidth:word
public _videocard
public _highscore
public _HuffExpand
public _Input
extrn _MMFreePtr:near
public _buttonflip
public _grsegs
public _Ack
extrn _NBKscan:word
public _grmode
public _Print
public _FadeDown
public _PPrintUnsigned
public _SaveCtrls
public _mapheight
extrn _MMGetPtr:near
extrn _keydown:byte
public _mapplane
public _tileptr
public _pictable
public _win_yh
public _win_yl
public _win_xh
public _win_xl
public _OptimizeNodes
public _SaveFile
public _FadeOut
extrn _CallTimer:near
public _leftedge
public _PPrintHexB
public _picptr
public _mapwwide
public _mapbwide
public _PInput
public _EGAVirtualScreen
public _spriteptr
public _maprle
public _ClearKeys
public _screencentery
public _screencenterx
public _StopDrive
public _RLEWExpand
public _RLEBExpand
public _PPrintLong
public _needgr
public _ControlJoystick
extrn _memset:near
public _playermode
public _Verify
public _PPrintInt
public _pyh
public _pyl
public _EGASplitScreen
public _BloadinHUFFMM
extrn _ylookup:word
public _level
public _charptr
public _PPrintHex
public _ControlPlayer
public _BloadinRLEMM
extrn _strncmp:near
public _bordercolor
extrn _Quit:near
public _sy
extrn _read:near
public _ExpWinV
public _ExpWinH
extrn _strcpy:near
public _CPPrint
extrn _py:word
public _FadeUp
public _key
public _PPrint
extrn _close:near
public _Get
public _ColorBorder
extrn _WaitVBL:near
extrn _fontcolor:word
extrn _strlen:near
extrn N_SCOPY@:far
public _FadeIn
public _ExpWin
extrn _movedata:near
public _CharBar
extrn _Bar:near
public _JoyButton
extrn _strcat:near
public _SetNormalPalette
public _pxh
public _pxl
public _LoadCtrls
public _BloadinMM
extrn _ltoa:near
public _SetDefaultColors
extrn _itoa:near
public _useegamem
extrn _screenseg:word
extrn _atol:near
public _str
extrn N_LDIV@:far
public _keyB2
public _keyB1
public _nodearray
extrn _NoBiosKey:near
extrn _EGAplane:near
public _LoadFile
extrn _open:near
public _sx
public _LoadPage
public _JoyYhigh
public _JoyYlow
public _JoyXhigh
public _JoyXlow
public _colors
extrn _px:word
public _calibratekeys
public _PSize
extrn _toupper:near
public _PrintHexB
extrn _fontseg:word
public _score
public _mapwidthextra
public _DrawWindow
extrn N_PADD@:far
public _HuffExpandFile
extrn N_PSBA@:far
extrn N_PADA@:far
public _CRTCstart
public _PrintLong
public _ch
public _SetLineWidth
public _DrawFrame
public _ControlKBD
public _Printxy
public _PrintInt
end