;TITLE PACMAN2K.LST ;COMMENT $ ; PACMAN2K COMMENT BEGIN ; ; PACMAN2K.NFO ; ============ ; PACMAN2K V1 A FULLY PLAYABLE PACMAN LEVEL IN 2983 BYTES IN PURE DOS ; TESTED MS-DOSX. WIN9X WINME WINXP WIN2K WIN2K3 WINXP VISTA WINDOWS7 ; COPYRIGHT (C) 2009 OLIVIER.POUDADE@FREE.FR OLIVIER.POUDADE.FREE.FR/ ; ; TERMS OF USE ; ============ ; 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 3 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, SEE . ; ; EXECUTE HOWTO ; ============= ; NB : TO RUN PACMAN2K ONLY JUST APPLY STEP#2. BELOW AND CLICK DOSBOX ICON ; ; HISTORY LOG ; =========== ;VERSION REVISION SIZE HISTORY L=LOCAL T=TOTAL LBYTE TBYTE GOAL ;-------- -------- ---- ------------------------------------------- ----- ----- ----- ;PACMAN4K 03/08/00 4089 FIRST RELEASED VERSION OF PACMAN4K.COM -0000 -0000 +1017 ;PACMAN3K 09/09/09 3875 OPCODE OPT.+NO CREDITS DATA/CODE+NEW GDTR -0214 -0214 +0803 #GOAL CHANGED FROM 4096 TO 3072 ;PACMAN3K 10/09/09 3821 OPCODE OPT.+CONVERTED TO .COM +NO MORE EYES -0054 -0268 +0749 ;PACMAN3K 11/09/09 3151 NO MORE MARQUEE DATA/CODE -0670 -0938 +0079 ;PACMAN3K 12/09/09 3110 TASM %1 TO TASMX /UT300 /M3 /W0 /ZN /TES %1 -0041 -0979 +0038 ;PACMAN3K 13/09/09 3080 OPCODE OPT.+REDO UNCTILXXX+SETSTATE+REORDER -0030 -1009 +0008 ;PACMAN3K 13/09/09 3134 ADDED KBD FLUSH+SCORE MARQUEE+HIGHSCORE MGR +0054 -0955 +0062 * BUG WHEN LIFE LOSS ;PACMAN3K 14/09/09 3106 CODE OPT. REDO SOUNDSPK+NO PUTSPRITE2+MERGE -0028 -0983 +0034 * BUG WHEN LIFE LOSS ;PACMAN3K 14/09/09 3099 STACK DEFAULT+APACK EXPAND CODE OPT. -0007 -0990 +0027 * BUG WHEN LIFE LOSS ;PACMAN3K 15/09/09 3074 CODE OPT. -0025 -1015 +0002 * BUG WHEN LIFE LOSS ;PACMAN3K 15/09/09 3043 CODE OPT.+INT8 HANDLER -0031 -1046 -0029 * BUG WHEN LIFE LOSS *BUG WHEN ESC KEY PRESSED ;PACMAN3K 16/09/09 3034 CODE OPT. -0009 -1055 -0038 * BUG WHEN LIFE LOSS *BUG WHEN ESC KEY PRESSED ;PACMAN3K 17/09/09 2983 CODE OPT.+APACK DEPACK CS:0108 CLD FIX -0051 -1104 -0089 * BUGS RESOLVED ;PACMAN2K 18/09/09 2680 CODE OPT.+NO SCORE+FUNCTIONS VS.STATIC DATA -0303 -1407 +0632 #GOAL CHANGED FROM 3072 TO 2048 * BUG GHOSTS EAT DOTS ;PACMAN2K 19/09/09 2611 REDUCED LABELS TO TILES BASE+PACKED BITS -0069 -1476 +0563 * BUG GHOSTS EAT DOTS ;PACMAN2K 19/09/09 2660 RLE PACKED->PACKED BITS->RAW TILES +0049 -1427 +0612 * BUG GHOSTS EAT DOTS * SIZE INCREASE(+49) FOR NOW... ;PACMAN2K 20/09/09 2611 REVERT TO NO RLE -0069 -1476 +0563 * BUG GHOSTS EAT DOTS ;PACMAN2K 21/09/09 2536 STRIPPED GDT INIT CODE -0075 -1551 +0488 * BUG GHOSTS EAT DOTS ;PACMAN2K 22/09/09 2510 IVT 1FH VS. INT10H/AX=1130H IN SND ISR -0026 -1577 +0462 * BUG GHOSTS EAT DOTS ;PACMAN2K 23/09/09 2521 CONVERTED CODE FROM TASM TO NASM +0011 -1566 +0473 * BUG GHOSTS EAT DOTS RESOLVED * BUG STALLS @CHERRY WIPE ;PACMAN2K 24/09/09 xxxx +0000 -0000 +0000 * BUGS RESOLVED ; MAKEFILE ; ======== ; ---8<---STEP#1.SAVE-AS-"C:\PACMAN2K\PACMAN2K.BAT"---BEGIN--- ; ECHO NASM VERSION 0.98.39 COMPILED ON JAN 16 2005 - SIMPLIFIED (2-CLAUSE) BSD LICENSE ; NASMW -FBIN PACMAN2K.ASM -O P2N.COM ; ECHO APACK V1.00 COPYRIGHT (C) 1997-2009 IBSENSOFTWARE ALL RIGHTS RESERVED ; APACK -S PACMAN2K.COM OUT.COM ; COPY /Y OUT.COM PACMAN2K.COM ; ECHO DOSBOX V0.73 HTTP://WWW.DOSBOX.COM COPYRIGHT 2002-2009 DOSBOX TEAM, PUBLISHED UNDER GNU GPL. ; C:\PROGRA~1\DOSBOX-0.73\DOSBOX.EXE >NUL REM : LAUNCH PACMAN2K THROUGH DOSBOC [AUTOXEC] SECTION ; ---8<---STEP#2.SAVE-AS-"%LOCALAPPDATA%\DOSBOX\DOSBOX-0.73.CONF"---BEGIN--- ; [SDL] ; FULLSCREEN=TRUE ; FULLDOUBLE=FALSE ; FULLRESOLUTION=ORIGINAL ; WINDOWRESOLUTION=ORIGINAL ; OUTPUT=SURFACE ; AUTOLOCK=TRUE ; SENSITIVITY=100 ; WAITONERROR=TRUE ; PRIORITY=HIGHER,NORMAL ; MAPPERFILE=MAPPER.TXT ; USESCANCODES=TRUE ; [DOSBOX] ; LANGUAGE= ; MACHINE=SVGA_S3 ; CAPTURES=CAPTURE ; MEMSIZE=16 ; [RENDER] ; FRAMESKIP=0 ; ASPECT=FALSE ; SCALER=NORMAL2X ; [CPU] ; CORE=AUTO # MODIFIED FOR PACMAN2K ; CPUTYPE=AUTO # MODIFIED FOR PACMAN2K ; CYCLES=11250 # MODIFIED FOR PACMAN2K ; CYCLEUP=500 # MODIFIED FOR PACMAN2K ; CYCLEDOWN=20 # MODIFIED FOR PACMAN2K ; [MIXER] ; NOSOUND=FALSE ; RATE=22050 ; BLOCKSIZE=2048 ; PREBUFFER=10 ; [MIDI] ; MPU401=INTELLIGENT ; MIDIDEVICE=DEFAULT ; MIDICONFIG= ; [SBLASTER] ; SBTYPE=SB16 ; SBBASE=220 ; IRQ=7 ; DMA=1 ; HDMA=5 ; SBMIXER=TRUE ; OPLMODE=AUTO ; OPLEMU=DEFAULT ; OPLRATE=22050 ; [GUS] ; GUS=FALSE ; GUSRATE=22050 ; GUSBASE=240 ; GUSIRQ=5 ; GUSDMA=3 ; ULTRADIR=C:\ULTRASND ; [SPEAKER] ; PCSPEAKER=TRUE ; PCRATE=22050 ; TANDY=AUTO ; TANDYRATE=22050 ; DISNEY=TRUE ; [JOYSTICK] ; JOYSTICKTYPE=AUTO ; TIMED=TRUE ; AUTOFIRE=FALSE ; SWAP34=FALSE ; BUTTONWRAP=TRUE ; [SERIAL] ; SERIAL1=DUMMY ; SERIAL2=DUMMY ; SERIAL3=DISABLED ; SERIAL4=DISABLED ; [DOS] ; XMS=TRUE ; EMS=TRUE ; UMB=TRUE ; KEYBOARDLAYOUT=AUTO ; [IPX] ; IPX=FALSE ; [AUTOEXEC] ; MOUNT C C:\PACMAN2K\ # MODIFIED FOR PACMAN2K ; C: # MODIFIED FOR PACMAN2K ; PACMAN2K.COM # MODIFIED FOR PACMAN2K ; ; THANKS ; ====== ; MARIJA MAJKIC FOR MORAL SUPPORT ON INITIAL PACMAN4K ; HOST : RED-SECTOR-INCORPORATED.ORG ; HOST : SCENE.ORG/FILE.PHP?FILE=/PARTIES/2000/ASSEMBLY00/IN4K/PACMAN4K.ZIP&FILEINFO ; HOST : PROGRAMMERSHEAVEN.COM/DOWNLOAD/16837/DOWNLOAD.ASPX ; HOST : MEMBRES.LYCOS.FR/PACMAN4K/ ; HOST : HUGI.SCENE.ORG/MAIN.PHP?PAGE=HUGI20 ; ; GREETINGS ; ========= ; #THESCENE & #CODERS CHANNELS ON IRCNET ; X86 ASM COMMUNITY IN GENERAL ; PACMAN4K 2000 KOZMIK/NEXTEMPIRE ; PACMAN2K 2009 KOZMIK/RSI ; ;$ PACMAN2K COMMENT END ; ;----------------------------------------------------------------------------- ; ASSEMBLER DIRECTIVES ;----------------------------------------------------------------------------- ORG 100H START: JMP NEAR BEGIN ;-.DAT------------------------------------------------------------------------- ;GDTPTR DW 15;($-GDT386) - 1 ; GDTSIZE ;GDT386 DD GDT386 ;GDT386SEGMAX DW 16 ;SEGMENT LIMIT ;GDT386A15A00 DW 0 ;A00..A15 OF BASE ADDRESS ;GDT386A23A16 DD 0 ;A16..A23 OF BASE ADDRESS ;GDTCSSEGMAX DW -1 ;SEGMENT LIMIT ;GDTCSA15A00 DF 0 ;A00..A15 OF BASE ADDRESS ;----------------------------------------------------------------------------- ; EQUATES & MACROS ;----------------------------------------------------------------------------- CHARMAX EQU 05 NEWRATE EQU 164 TILES001_RAW_SIZ EQU 9552 CHARSTRUCTSIZ EQU 52 ADPCMTTL DB 10000000B,01000000B,00100000B,00010000B,00001000B,00000100B,00000010B,00000001B,00000000B GHOSTNUM DD 0 ; BLUE GHOST NUMBER EATEN GHOSTTIME DD 0 ; BLUE GHOST COUNTDOWN TIMER GHOSTSTATE DD 0 ; BLUE GHOST FLAG CHERRYTIME DD 0 ; CHERRYCOUNTDOWN TIMER CHERRYSTATE DD 0 ; CHERRY STATE DEMOCOUNT DW 0 BYTECNT DW 0 BITCNT DW 0 ONEEVERYFOUR DD 0 ; COUNTDOWN DW 0; NEWRATE ; COUNTDOWN TIMER INT08H DD 0 ;DUMMY DD 0 PHYSCR DD 0 LOGSCR DD 0 SAMPNUM DD 0 SOUND1 DW 0355-16 ;0 BACK DW 0355-13-16 ;2 DOT DW 0655-16 ;4 PRIZE DONE PACPAL DB 14,11,4,13,9,12 ;PACMAN=INDEX14/GHOST1=INDEX11/GHOST2=INDEX4/GHOST3=INDEX13/GHOST4=INDEX9/CHERRY=INDEX12 PAL_STATE1 DB 8,255,255,255,11,191,0,0,4,0,250,255,9,255,79,191,13,63,47,15,7,255,255,255;[8]POWERPILL=WHITE/[11]GHOST1=RED/[4]GHOST2=TURQUOISE/[9]GHOST3=PINK/[13]GHOST4=ORANGE/[7]DOTS=WHITE PAL_STATE2 DB 8,255,255,255,11,0,0,255,4,0,0,255,13,0,0,255,9,0,0,255,7,255,255,255 PAL_STATE3 DB 8,255,255,255,11,255,255,255,4,255,255,255,13,255,255,255,9,255,255,255,7,255,255,255 CHARNUM DD 0 DOTNUMS DB 0 RP DD 1314,1442,1474,1442,-3200,0,-28,1314,1538,1570,1538,3200,0,28,1314,1346,1378,1346,-4,-1,0,1314,1250,1282,1250,4,1,0 MAZE DB 001H,002H,002H,002H,002H,002H,002H,002H,002H,002H,002H,002H,002H,003H,01DH,002H,002H,002H,002H,002H,002H,002H,002H,002H,002H,002H,002H,01EH TTL_PRIZE DB 004H,0C5H,085H,085H,085H,085H,0C5H,085H,085H,085H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,085H,085H,085H,0C5H,085H,085H,085H,085H,0C5H,018H DB 004H,085H,007H,008H,008H,009H,085H,007H,008H,008H,008H,009H,085H,006H,00BH,085H,007H,008H,008H,008H,009H,085H,007H,008H,008H,009H,085H,018H DB 004H,08AH,006H,000H,000H,00BH,085H,006H,000H,000H,000H,00BH,085H,006H,00BH,085H,006H,000H,000H,000H,00BH,085H,006H,000H,000H,00BH,08AH,018H DB 004H,085H,00CH,00DH,00DH,00EH,085H,00CH,00DH,00DH,00DH,00EH,085H,00CH,00EH,085H,00CH,00DH,00DH,00DH,00EH,085H,00CH,00DH,00DH,00EH,085H,018H DB 004H,0C5H,085H,085H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,085H,085H,0C5H,018H DB 004H,085H,007H,008H,008H,009H,085H,007H,009H,085H,007H,008H,008H,008H,008H,008H,008H,009H,085H,007H,009H,085H,007H,008H,008H,009H,085H,018H DB 004H,085H,00CH,00DH,00DH,00EH,085H,006H,00BH,085H,00CH,00DH,00DH,00FH,014H,00DH,00DH,00EH,085H,006H,00BH,085H,00CH,00DH,00DH,00EH,085H,018H DB 004H,0C5H,085H,085H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,085H,085H,0C5H,018H DB 010H,011H,011H,011H,011H,009H,085H,006H,013H,008H,008H,009H,000H,006H,00BH,000H,007H,008H,008H,01CH,00BH,085H,007H,011H,011H,011H,011H,020H DB 000H,000H,000H,000H,000H,004H,085H,006H,014H,00DH,00DH,00EH,000H,00CH,00EH,000H,00CH,00DH,00DH,00FH,00BH,085H,018H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,004H,085H,006H,00BH,040H,000H,000H,040H,000H,000H,040H,000H,000H,040H,006H,00BH,085H,018H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,004H,085H,006H,00BH,000H,015H,011H,016H,097H,097H,021H,011H,022H,000H,006H,00BH,085H,018H,000H,000H,000H,000H,000H DB 002H,002H,002H,002H,002H,00EH,085H,00CH,00EH,000H,018H,038H,038H,000H,000H,038H,038H,004H,000H,00CH,00EH,085H,00CH,002H,002H,002H,002H,002H DB 000H,000H,000H,000H,000H,000H,0C5H,000H,000H,040H,018H,038H,000H,040H,040H,000H,038H,004H,040H,000H,000H,0C5H,000H,000H,000H,000H,000H,000H DB 011H,011H,011H,011H,011H,009H,085H,007H,009H,000H,018H,038H,038H,038H,038H,038H,038H,004H,000H,007H,009H,085H,007H,011H,011H,011H,011H,011H DB 000H,000H,000H,000H,000H,004H,085H,006H,00BH,000H,019H,002H,002H,002H,002H,002H,002H,023H,000H,006H,00BH,085H,018H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,004H,085H,006H,00BH,040H,000H,000H,000H,000H,000H,000H,000H,000H,040H,006H,00BH,085H,018H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,004H,085H,006H,00BH,000H,007H,008H,008H,008H,008H,008H,008H,009H,000H,006H,00BH,085H,018H,000H,000H,000H,000H,000H DB 001H,002H,002H,002H,002H,00EH,085H,00CH,00EH,000H,00CH,00DH,00DH,00FH,014H,00DH,00DH,00EH,000H,00CH,00EH,085H,00CH,002H,002H,002H,002H,01EH DB 004H,0C5H,085H,085H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,085H,085H,0C5H,018H DB 004H,085H,007H,008H,008H,009H,085H,007H,008H,008H,008H,009H,085H,006H,00BH,085H,007H,008H,008H,008H,009H,085H,007H,008H,008H,009H,085H,018H DB 004H,085H,00CH,00DH,00FH,00BH,085H,00CH,00DH,00DH,00DH,00EH,085H,00CH,00EH,085H,00CH,00DH,00DH,00DH,00EH,085H,006H,014H,00DH,00EH,085H,018H DB 004H,0CAH,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,085H,085H,0C5H,000H,000H,0C5H,085H,085H,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,0CAH,018H DB 01AH,008H,009H,085H,006H,00BH,085H,007H,009H,085H,007H,008H,008H,008H,008H,008H,008H,009H,085H,007H,009H,085H,006H,00BH,085H,007H,008H,024H DB 01BH,00DH,00EH,085H,00CH,00EH,085H,006H,00BH,085H,00CH,00DH,00DH,00FH,014H,00DH,00DH,00EH,085H,006H,00BH,085H,00CH,00EH,085H,00CH,00DH,025H DB 004H,0C5H,085H,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,006H,00BH,0C5H,085H,085H,0C5H,085H,0C5H,018H DB 004H,085H,007H,008H,008H,008H,008H,01CH,013H,008H,008H,009H,085H,006H,00BH,085H,007H,008H,008H,01CH,013H,008H,008H,008H,008H,009H,085H,018H DB 004H,085H,00CH,00DH,00DH,00DH,00DH,00DH,00DH,00DH,00DH,00EH,085H,00CH,00EH,085H,00CH,00DH,00DH,00DH,00DH,00DH,00DH,00DH,00DH,00EH,085H,018H DB 004H,0C5H,085H,085H,085H,085H,085H,085H,085H,085H,085H,085H,0C5H,085H,085H,0C5H,085H,085H,085H,085H,085H,085H,085H,085H,085H,085H,0C5H,018H DB 010H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,011H,020H ;TILES001_RAW DB 002H,000H,001H,0FFH,001H,000H,004H,0FFH,001H,000H,001H,0C3H,002H,000H,001H,0C0H,007H,000H,001H,0F0H,001H,00FH,011H,000H,001H,003H,00DH,000H ; DB 001H,0C3H,001H,000H,001H,0C0H,063H,000H,001H,00FH,005H,000H,001H,0C3H,002H,000H,001H,0C0H,007H,000H,001H,0FCH,001H,03FH,011H,000H,001H,003H ; DB 00DH,000H,001H,0C3H,001H,000H,001H,0C0H,063H,000H,001H,030H,005H,000H,001H,0C3H,002H,000H,001H,0C0H,007H,000H,002H,0FFH,011H,000H,001H,003H ; DB 00DH,000H,001H,0C3H,001H,000H,001H,0C0H,062H,000H,001H,03FH,001H,030H,002H,0FFH,001H,000H,001H,0FCH,001H,000H,001H,0C3H,001H,0C0H,001H,003H ; DB 001H,0C0H,007H,000H,002H,0FFH,009H,000H,001H,0FCH,006H,000H,001H,0C0H,00DH,000H,002H,0C0H,001H,03FH,001H,0C0H,062H,000H,002H,0C0H,003H,000H ; DB 001H,003H,001H,000H,001H,0C3H,001H,0C0H,001H,003H,001H,0C0H,001H,000H,001H,00FH,001H,000H,002H,0FFH,002H,000H,002H,0FFH,009H,000H,001H,003H ; DB 002H,000H,002H,0FFH,002H,000H,001H,03FH,003H,000H,001H,0FFH,001H,000H,002H,0FFH,006H,000H,001H,03FH,003H,0C0H,063H,000H,001H,0C3H,002H,000H ; DB 001H,0C0H,002H,000H,001H,0C3H,002H,000H,001H,0C0H,001H,000H,001H,030H,005H,000H,002H,0FFH,008H,000H,001H,0C0H,00BH,000H,001H,0C0H,001H,000H ; DB 001H,003H,001H,000H,002H,0FFH,005H,000H,001H,0C0H,001H,000H,001H,0C3H,063H,000H,001H,0C3H,002H,000H,001H,0C0H,002H,000H,001H,0C3H,002H,000H ; DB 001H,0C0H,001H,000H,001H,0C0H,005H,000H,001H,0FCH,001H,03FH,008H,000H,001H,0C0H,00BH,000H,001H,0C0H,001H,000H,001H,003H,001H,000H,002H,0FFH ; DB 005H,000H,001H,0C0H,001H,000H,001H,0C3H,063H,000H,001H,0C3H,002H,000H,001H,0C0H,002H,000H,001H,0C3H,002H,000H,001H,0C0H,001H,000H,001H,0C0H ; DB 005H,000H,001H,0F0H,001H,00FH,008H,000H,001H,0C0H,003H,000H,002H,0FFH,006H,000H,001H,0C3H,001H,000H,002H,0FFH,007H,000H,001H,0C0H,001H,000H ; DB 001H,0C3H,060H,000H,001H,0FFH,001H,03FH,001H,0FFH,001H,03FH,00CH,000H,001H,0FCH,001H,00FH,001H,000H,001H,0FFH,046H,000H,001H,0FEH,001H,01FH ; DB 002H,000H,001H,0F8H,001H,01FH,062H,000H,001H,00FH,001H,000H,001H,0FFH,001H,03FH,001H,0FFH,001H,03FH,00CH,000H,001H,0F3H,001H,00FH,001H,0C0H ; DB 001H,0FFH,03AH,000H,001H,01FH,001H,000H,001H,01FH,002H,000H,001H,0F8H,001H,01FH,002H,000H,001H,0F8H,002H,000H,001H,0FFH,001H,01FH,002H,000H ; DB 001H,0FEH,001H,01FH,062H,000H,001H,0FFH,001H,000H,001H,0FFH,001H,03FH,001H,0FFH,001H,03FH,00AH,000H,001H,0F0H,001H,000H,001H,0F3H,001H,00FH ; DB 001H,0C0H,001H,0FFH,03AH,000H,001H,0FFH,001H,001H,001H,0FFH,001H,001H,001H,080H,002H,0FFH,001H,001H,001H,000H,001H,0F8H,001H,0E0H,001H,001H ; DB 001H,0FFH,001H,007H,002H,000H,001H,0FFH,001H,007H,062H,000H,001H,0FFH,001H,003H,001H,0FFH,001H,03FH,001H,0FFH,001H,03FH,00AH,000H,001H,0F0H ; DB 001H,00FH,001H,0F3H,001H,003H,001H,0C0H,001H,0FFH,03AH,000H,001H,0FFH,001H,007H,001H,0FFH,001H,007H,001H,0E0H,002H,0FFH,001H,007H,001H,000H ; DB 002H,0E0H,001H,007H,001H,0FFH,001H,007H,002H,000H,001H,0FFH,001H,007H,062H,000H,001H,0FFH,001H,00FH,001H,0FFH,001H,03FH,001H,0FFH,001H,03FH ; DB 00BH,000H,001H,0F3H,001H,003H,001H,000H,001H,0C0H,001H,0FFH,03AH,000H,001H,0FFH,001H,007H,001H,0FFH,001H,007H,001H,0E0H,002H,0FFH,001H,007H ; DB 001H,000H,001H,080H,001H,0F8H,001H,007H,001H,0FFH,001H,001H,002H,000H,001H,0FFH,001H,001H,062H,000H,001H,0FFH,001H,00FH,001H,0FCH,001H,03CH ; DB 001H,0CFH,001H,03FH,008H,000H,001H,003H,002H,000H,001H,003H,003H,000H,001H,0FFH,03AH,000H,001H,0FFH,001H,01FH,001H,0FFH,001H,01FH,001H,000H ; DB 002H,0FEH,001H,01FH,002H,000H,001H,0F8H,002H,01FH,002H,000H,001H,01EH,001H,01FH,007H,000H,001H,01FH,05BH,000H,001H,0FFH,001H,00FH,001H,03CH ; DB 001H,030H,001H,003H,001H,00FH,008H,000H,001H,0FCH,001H,003H,001H,000H,001H,00CH,03EH,000H,001H,0FFH,001H,01FH,001H,0FFH,001H,01FH,001H,000H ; DB 001H,080H,001H,0F8H,001H,01FH,002H,000H,001H,0F8H,001H,01FH,002H,000H,001H,080H,001H,01FH,008H,000H,001H,07FH,05BH,000H,001H,0FFH,001H,03FH ; DB 00CH,000H,001H,0FFH,001H,00FH,001H,000H,001H,030H,03EH,000H,001H,0FFH,001H,01FH,001H,0E0H,001H,01FH,002H,000H,001H,0E0H,001H,01FH,002H,000H ; DB 001H,0FEH,001H,01FH,002H,000H,001H,0E0H,001H,01FH,008H,000H,001H,0FFH,001H,001H,046H,000H ; DB 21322 DUP (0) ; 21322=22096-774 => 1ST PASS TILES001_RAW=TILES001_RLE/2ND PASS TILES001_RAW=TILES001_RAW ;TILES001_PAK DW 1381 DUP (0) TILES001_PAK DW 0000000000000000B DW 0000000011111111B DW 1111111111111111B DW 1111111111111111B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111110000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000001100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 1100000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111100000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0011111111111100B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000001100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 1100000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0011000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000001100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 1100000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0011000000111111B DW 1111111111111111B DW 1111110000000000B DW 1100001100000000B DW 0000001111000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1111110000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100000011000000B DW 1100000000111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100000011000000B DW 0000000000000000B DW 0000001100000000B DW 1100001100000000B DW 0000001111000000B DW 0000000011000000B DW 0000000000001111B DW 1111111111111111B DW 0000000000000000B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000001100000000B DW 0000000000000000B DW 1111111111111111B DW 0000000000000000B DW 0000000000111111B DW 0000000000000000B DW 0000000011111111B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100000000111111B DW 1100000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000110000B DW 0000000000000000B DW 0000000000000000B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000011B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 1100000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0011111111111100B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000011B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 1100000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 1100001100000000B DW 0000000000000000B DW 0000000011000000B DW 0000000011000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111110000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000000B DW 0000000000000000B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011000011B DW 1111111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1100000000000000B DW 1100001100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0011111111111111B DW 0011111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111111100B DW 1111111100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0001111111111110B DW 0000000000000000B DW 0001111111111000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000001111B DW 0011111111111111B DW 0011111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111110011B DW 1111111111000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000011111B DW 0000000000011111B DW 1111100000000000B DW 0000000000011111B DW 1111100000000000B DW 0000000000000000B DW 0001111111111111B DW 0000000000000000B DW 0001111111111110B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011111111B DW 0011111111111111B DW 0011111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000011110000B DW 0000111111110011B DW 1111111111000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000111111111B DW 0000000111111111B DW 1111111110000000B DW 0000000111111111B DW 1111100000000000B DW 0000000111100000B DW 0000011111111111B DW 0000000000000000B DW 0000011111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000001111111111B DW 0011111111111111B DW 0011111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111110000B DW 0000001111110011B DW 1111111111000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000011111111111B DW 0000011111111111B DW 1111111111100000B DW 0000011111111111B DW 1110000000000000B DW 0000011111100000B DW 0000011111111111B DW 0000000000000000B DW 0000011111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111111111B DW 0011111111111111B DW 0011111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 1111001100000000B DW 0000000000000011B DW 1111111111000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000011111111111B DW 0000011111111111B DW 1111111111100000B DW 0000011111111111B DW 1000000000000000B DW 0000011111111000B DW 0000000111111111B DW 0000000000000000B DW 0000000111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111111111B DW 0011110011111100B DW 0011111111001111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000011B DW 0000001100000000B DW 0000000000000000B DW 1111111100000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0001111111111111B DW 0001111111111111B DW 1111111000000000B DW 0001111111111110B DW 0000000000000000B DW 0001111111111000B DW 0000000000011111B DW 0001111000000000B DW 0000000000011111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000011111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111111111B DW 0011000000111100B DW 0000111100000011B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000001111111100B DW 0000110000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0001111111111111B DW 0001111111111111B DW 1000000000000000B DW 0001111111111000B DW 0000000000000000B DW 0001111111111000B DW 0000000000000000B DW 0001111110000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000001111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0011111111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000111111111111B DW 0011000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0001111111111111B DW 0001111111100000B DW 0000000000000000B DW 0001111111100000B DW 0000000000000000B DW 0001111111111110B DW 0000000000000000B DW 0001111111100000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000111111111B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B DW 0000000000000000B TILES001_RAW TIMES 22096 DB 0 PACCORDX TIMES 65 DD 0 KEYTAB TIMES 30 DD 0 S1 TIMES 140 DD 0 SPRT DB 001H,015H,002H,003H,004H,005H,001H,015H,01CH,01DH,02FH,030H,001H,015H,006H,020H,008H,022H,001H,015H,024H,025H,028H,029H DB 016H,017H,018H,019H,01AH,01BH,016H,017H,01EH,01FH,031H,023H,016H,017H,007H,021H,009H,023H,016H,017H,026H,027H,02AH,02BH TIMES 6 DD 2C0A2C0AH TIMES 6 DD 2E0C2D0BH TIMES 6 DD 2C0A2C0AH TIMES 6 DD 2E0C2D0BH TIMES 6 DD 2C0A2C0AH TIMES 6 DD 2E0C2D0BH TIMES 6 DD 2C0A2C0AH TIMES 6 DD 2E0C2D0BH DB 00DH,00EH,011H,012H TIMES 20 DB 0 DB 00FH,010H,013H,014H TIMES 6 DB 0 TILE TIMES 9 DB 0 DB 007H,000H,006H,047H,048H,049H,000H,041H,000H,000H,000H,00FH,000H,000H,000H,004H,055H,000H,000H,013H,003H,001H,000H,010H,016H,015H,019H,01AH,01BH SPRI TIMES 21 DB 0 DB 001H,041H,016H,042H,043H,044H,045H,003H,002H,019H,018H,006H,007H,008H,009H,047H,024H,046H,026H,049H,028H,048H,02AH,00AH,00BH,00CH,005H,004H,01BH ;-DATA------------------------------------------;----------------------------- BEGIN: MOV EDI,PACCORDX ;BASE OF 1ST PACCORDX* STRUC MOV ESI,KEYTAB ;BASE OF 1ST PACKEYTAB* STRUC MOV EDX,S1+56 ;BASE OF 1ST PACINDEX* STRUC (S1+56=S3=UP) MOV ECX,5 ;1 PACMAN + GHOST1 GHOST2 GHOST3 GHOST4 INITTAB1: MOV EAX,135418 ;PACCORDX + PACCORDX1 PACCORDX2 PACCORDX3 PACCORDX4 => PHYSICAL/PIXEL ABSOLUTE COORDINATE STOSD ;EDI=STRUC+04 MOV EAX,14 ;PACMAZEX + PACMAZEX1 PACMAZEX2 PACMAZEX3 PACMAZEX4 => LOGICAL/MAZE ABSCISSE COORDINATE STOSD ;EDI=STRUC+08 MOV EAX,308 ;PACMAZEY + PACMAZEY1 PACMAZEY2 PACMAZEY3 PACMAZEY4 => LOGICAL/MAZE ORDINATE COORDINATE STOSD ;EDI=STRUC+12 MOV EAX,EDX ;PACINDEX + PACINDEX1 PACINDEX2 PACINDEX3 PACINDEX4 => STATE OF (THIS) OBJECT ADD EDX,112 ;EDX+=SIZEOF(PACINDEX STRUC) STOSD ;EDI=STRUC+16 ADD EDI,16 ;EDI=STRUC+32 => SKIP NUL DWORDS PACSTARTPREV* PACCOUNT* PACOLDKEY* PACFLAG* STRUC MEMBERS MOV EAX,ESI ;PACKEYTAB + PACKEYTAB1 PACKEYTAB2 PACKEYTAB3 PACKEYTAB4 => POINTS TO ARROW KEYS SCANCODES ADD ESI,24 ;ESI+=SIZEOF(KEYTAB STRUC) STOSD ;EDI=STRUC+36 ADD EDI,16 ;EDI=STRUC+48 LOOP INITTAB1 ;INITIALIZE ALL FIVE CHARACTERS MOV EDI,PACCORDX ;*SPECIAL CASE DIFFERENCIATION FOR PACMAN MOV EAX,289018 ;PACCORDX!=PACCORDX1!=PACCORDX2!=PACCORDX3!=PACCORDX4 STOSD ;EDI=STRUC+04 MOV EDI,PACCORDX+8 ;*SPECIAL CASE DIFFERENCIATION FOR PACMAN MOV EAX,644 ;*PACMAZEY!=PACMAZEY1!=PACMAZEY2!=PACMAZEY3!=PACMAZEY4 STOSD ;*EDI=STRUC+16 MOV EDI,PACCORDX+28 ;*SPECIAL CASE DIFFERENCIATION FOR PACMAN MOV EAX,1 ;*PACFLAG!=PACFLAG1!=PACFLAG2!=PACFLAG3!=PACFLAG4 => 0=CPU 1=USR STOSD ;*EDI=STRUC+32 MOV EDI,KEYTAB ;BASE OF 1ST PACKEYTAB* STRUC MOV ESI, S1 ;BASE OF 1ST PACINDEX* STRUC MOV EDX,0 ;EDX=SIZEOF(PACINDEX STRUC) MULTIPLIER MOV ECX,5 ;1 PACMAN + GHOST1 GHOST2 GHOST3 GHOST4 INITTAB2: XCHG AH,AL ;TASM WAS => ;BSWAP AX ;DIRECTION UP AUTOMATED AX=0001H->AX=0100H STOSW ;EDI=STRUC+02 MOV EAX,ESI ;EAX=BASE ADD EAX,EDX ;EAX=BASE+DISPLACEMENT ADD EDX,28 ;PACMAZEX + PACMAZEX1 PACMAZEX2 PACMAZEX3 PACMAZEX4 => LOGICAL/MAZE ABSCISSE COORDINATE STOSD ;EDI=STRUC+06 MOV AX,1 ;DIRECTION DOWN AUTOMATED STOSW ;EDI=STRUC+08 MOV EAX,ESI ;EAX=BASE ADD EAX,EDX ;EAX=BASE+DISPLACEMENT ADD EDX,28 ;PACMAZEX + PACMAZEX1 PACMAZEX2 PACMAZEX3 PACMAZEX4 => LOGICAL/MAZE ABSCISSE COORDINATE STOSD ;EDI=STRUC+12 MOV AX,302H ;DIRECTION LEFT AUTOMATED STOSW ;EDI=STRUC+14 MOV EAX,ESI ;EAX=BASE ADD EAX,EDX ;EAX=BASE+DISPLACEMENT ADD EDX,28 ;PACMAZEX + PACMAZEX1 PACMAZEX2 PACMAZEX3 PACMAZEX4 => LOGICAL/MAZE ABSCISSE COORDINATE STOSD ;EDI=STRUC+18 MOV AX,203H ;DIRECTION RIGHT AUTOMATED STOSW ;EDI=STRUC+20 MOV EAX,ESI ;EAX=BASE ADD EAX,EDX ;EAX=BASE+DISPLACEMENT ADD EDX,28 ;PACMAZEX + PACMAZEX1 PACMAZEX2 PACMAZEX3 PACMAZEX4 => LOGICAL/MAZE ABSCISSE COORDINATE STOSD ;EDI=STRUC+24 LOOP INITTAB2 ;INITIALIZE ALL FIVE CHARACTERS MOV EDI,KEYTAB ;*SPECIAL CASE DIFFERENCIATION FOR PACMAN MOV AX,48H ;*DIRECTION UP KEYBOARD ARROW UP STOSW ;*EDI=STRUC+02 ADD EDI,4 ;*EDI=STRUC+06 MOV AX,50H ;*DIRECTION UP KEYBOARD ARROW DOWN STOSW ;*EDI=STRUC+08 ADD EDI,4 ;*EDI=STRUC+12 MOV AX,4BH ;*DIRECTION UP KEYBOARD ARROW LEFT STOSW ;*EDI=STRUC+10 ADD EDI,4 ;*EDI=STRUC+14 MOV AX,4DH ;*DIRECTION UP KEYBOARD ARROW RIGHT STOSW ;*EDI=STRUC+16 MOV EDI, S1 ;BASE OF 1ST PACINDEX* STRUC MOV EDX,0 ;EDX=25600 MULTIPLIER MOV ECX,5 ;1 PACMAN + GHOST1 GHOST2 GHOST3 GHOST4 INITTAB3A:MOV ESI, RP ;S* REPEAT PATTERN MOV EBX,4 ;4 DIRECTION => S1*=UP S2*=DOWN S3*=LEFT S4*=RIGHT INITTAB3B:LODSD ;EAX=ESI=RP+4 ADD EAX,EDX ;EAX+=EDX*25600 STOSD ;EDI=STRUC+4 LODSD ;EAX=ESI=RP+8 ADD EAX,EDX ;EAX+=EDX*25600 STOSD ;EDI=STRUC+8 LODSD ;EAX=ESI=RP+12 ADD EAX,EDX ;EAX+=EDX*25600 STOSD ;EDI=STRUC+12 LODSD ;EAX=ESI=RP+16 ADD EAX,EDX ;EAX+=EDX*25600 STOSD ;EDI=STRUC+16 MOVSD ;RP->PACINDEX STRUC ESI=RP+20 EDI=STRUC+20 MOVSD ;RP->PACINDEX STRUC ESI=RP+24 EDI=STRUC+24 MOVSD ;RP->PACINDEX STRUC ESI=RP+28 EDI=STRUC+28 DEC EBX ;ALL 4 DIRECTIONS DONE ? JNZ INITTAB3B ;IF NOT THEN REPEAT ADD EDX,25600 ;EDX+=25600 LOOP INITTAB3A ;ALL 5 CHARACTERS DONE ? ; MOV SI, TILES001_RAW ;SI=SOURCE RLE EXPAND BUFFER => 1ST PASS TILES001_RAW=TILES001_RLE ; MOV DI, TILES001_PAK ;ES:DI=DESTINATION RLE EXPAND BUFFER ; CLD ;ALL MOVES ARE FORWARD ;INITTAB4A:LODSB ;AL=[SI] ; CMP AL,0 ;ZERO LENGTH IS CLOSING TAG ; JE INITTAB4B ;ALL DONE ; MOV CL,AL ;CL=LENGTH ; LODSB ;AL=REPEAT CHAR ; REP STOSB ;ES:[DI]=AL TIMES CX ; JMP INITTAB4A ;CONTINUE NEXT ;INITTAB4B: MOV ESI,TILES001_PAK ;BASE OF 1ST PACINDEX* STRUC MOV EDI,TILES001_RAW ;BASE OF 1ST PACINDEX* STRUC => 2ND PASS TILES001_RAW=TILES001_RAW= MOV EDX,1381 ;EDX=25600 MULTIPLIER INITTAB5A:LODSW ;S* REPEAT PATTERN MOV BX,AX ;SAVE AX IN BX MOV ECX,16 ;1 PACMAN + GHOST1 GHOST2 GHOST3 GHOST4 INITTAB5B:RCL BX,1 ;4 DIRECTION => S1*=UP S2*=DOWN S3*=LEFT S4*=RIGHT DB 0D6H ;UNDOCUMENTED SALC AND AL,1 ;IF CF=1=>AL=FFH IF CF=0=>AL=00H STOSB ;STORE BYTE IN RAW FORMAT LOOP INITTAB5B ;ALL BITS OF DW DONE ? DEC EDX ;ALL 4 DIRECTIONS DONE ? JNZ INITTAB5A ;IF NOT THEN REPEAT ;-END-OF-DATA-COMPLEMENTARY-GENERATION----------;-------------------------------------- MOV ESI,592 ;REPOSITION LINE OR COLUMN SOURCE => 592=(38-1)*16 MOV EDI, TILES001_RAW+15 ;GET PTR TO RAW PIXEL DATA => 15=16-1 MOV EDX,-1 ;PIXEL DESTINATION POSITION DELTA / MOVE EDX,-1 MOV EBP,624 ;LINE DESTINATION POSITION DELTA => 624=(38+1)*16 MOV EAX, TILES001_RAW ;DATA SOURCE MOV ECX,0F000026H ;ECX = 00 15 00 38 D =# 8X8 TILES MOV EBX, TILES001_RAW+8512 ;8512=38*16*14; MOV DWORD [CHARNUM],EBX ; TILES001_RAW+38*16*14 OR SPRITES_RAW+49*16*15 MOV EBX, TILE ;GET PTR TO DECOMPRESSING TABLE CALL UNCTIL000 ; ADD ESI,176 ; ADD EDI,TILES001_RAW_SIZ ;GET PTR TO RAW PIXEL DATA ; MOV EDI, SPRITES_RAW+(16-1) ADD EBP,176 ; ADD EAX,TILES001_RAW_SIZ ;DATA SOURCE ; MOV EAX, SPRITES_RAW;DATA SOURCE ADD ECX,100000BH ; 16777227 MOV ECX,10000031H ;ECX = 00 16 00 49 D =# 8X8 TILES MOV EBX, TILES001_RAW+21312 ;TILES001_RAW+21312 => TILES001_RAW+9552=(TILES001_RAW+9552)+49*16*15 MOV DWORD [CHARNUM],EBX ; TILES001_RAW+38*16*14 OR SPRITES_RAW+49*16*15 MOV EBX, SPRI ;GET PTR TO DECOMPRESSING TABLE CALL UNCTIL000 ; ;-INITIALIZE-HIRES-VIDEO-MODE-------------------;-------------------------------------- MOV AX,4F01H ;GET VESA VBE 2.0 MODE INFORMATION MOV CX,100H ;SIZE OF VBE INFORMATION IS 256 BYTES MOV DI, TILES001_RAW+21840 ;ES:DI POINTS TO BUFFER => TILES001_RAW+21840= MODEINFOBLOCKPTR INT 10H ;BIOS VIDEO SYSTEM CALL ; INC AX ; MOV AX,4F02H ;SET VESA VBE 2.0 MODE MOV BX,0C103H ;MODE 800X600X08 (256 COLORS) INT 10H ;BIOS VIDEO SYSTEM CALL ;-DRAW-MAZEBOARD--------------------------------;-------------------------------------- MOV EDI,DWORD [ES:DI+28H] ;MODEINFOBLOCK[28H] = 'PHYSBASEPTR' BSWAP EAX ;AX=0 ASSUMED GS=0 MOV ES,EAX ;ES:EDI=1ST ADD.OF 256KB VIDEO BUFFER MOV DWORD [PHYSCR],EDI ;SAVE START OF PHYSICAL SCREEN MOV ECX,240000 ;240000=800*600/2=3A980H NLOOP7: MOV WORD [FS:EDI],0 ;TASM WAS => REP STOSD [ES:EDI] ;CLEAR 256KB VIDEO BUFFER ADD EDI,2 ;TASM WAS => REP STOSD [ES:EDI] ;CLEAR 256KB VIDEO BUFFER DEC ECX ;TASM WAS => REP STOSD [ES:EDI] ;CLEAR 256KB VIDEO BUFFER JNZ NLOOP7 ;TASM WAS => REP STOSD [ES:EDI] ;CLEAR 256KB VIDEO BUFFER MOV DWORD [LOGSCR],EDI ;SAVE START OF LOGICAL SCREEN ADD EDI,416 ;EDI= OF SPRITES IN LOGICAL SCR. 416=448-32 MOV ESI, SPRT ;ESI= OF MAP MOV EBX, TILES001_RAW+9552 ;EBX= OF TILES => SPRITES_RAW=TILES001_RAW+9552 MOV ECX,12 ;ECX=MAP HEIGHT 12=SPRIHEIGHT MOV EDX,24 ;EDX=MAP WIDTH ;12416=800*16 => 24=SPRIWIDTH MOV EAX,12416 ;EAX=COLUMN ALIGNMENT => 12416=800*16-SPRIWIDTH*16 MOV EBP,768 ;EBP=TILEMAP ALIGNMENT => 768=((49-1)*16) CALL NEAR SETMAZ000 ;DRAW MAZE IN LOGICAL SCREEN ;-INITIALIZE-RTC--------------------------------;-------------------------------------- MOV EBX, DWORD [FS:32] ;SAVE RTC IVT VECTOR INT 08 HANDLER MOV [INT08H+00],EBX ;SAVE INT 08 HANDLER ADDRESS PUSH CS ;GET NEW HANDLER ADDRESS SEGMENT PUSH SNDDRV000 ;GET NEW HANDLER ADDRESS POP DWORD [FS:32] ;SET NEW HANDLER ADDRESS ; MOV BX,65532/NEWRATE ;NEW FREQUENCY BX=18FH ;-INSTALL SOUND DRIVER -------------------------;-18.2*50=910HZ------------------------- MOV AL,36H ;COMMAND FOR 16-BIT TO 8253 MODE CONTROL REGISTER OUT 43H,AL ;MODE 3, BINARY OPERATION MOV AX,8FH ;COUNTER VALUE=65532/NEWRATE=18FH OUT 40H,AL ;LOAD TIMER 0 COUNT LSB AND AL,1 ;GET MOST SIGNIFICANT BYTE OUT 40H,AL ;LOAD TIMER 0 COUNT MSB ;-INITILAISATION--------------------------------;REDRAWS THE WHOLE MAZE-------------- MOV EDI,[LOGSCR] ;EDI= OF SCREEN MOV ESI, MAZE ;ESI= OF MAP MOV EBX, TILES001_RAW ;EBX= OF TILES MOV ECX,31 ;ECX=MAP HEIGHT => 31=MAZEHEIGHT MOV EDX,28 ;EDX=MAP WIDTH => 28=MAZEWIDTH MOV EAX,12352 ;EAX=COLUMN ALIGNMENT => 12352=800*16-MAZEWIDTH*16 MOV EBP,592 ;EBP=TILEMAP ALIGNMENT 592=>((38-1)*16) CALL NEAR SETMAZ000 ;DRAW MAZE IN LOGICAL SCREEN CALL NEAR SETPAL000 ;COLOR TILES MOV CX,2 ;WE COPY A DOT AND A POWER SINCE ONLY TILES NEED PLAY RESTORING MOV ESI,[LOGSCR] ;ESI= OF SCREEN ADD ESI,288810 ;ESI= OF SRC POWERPILL-DOT => 288810=(23*16-7)*800+10 MOV EDI,[LOGSCR] ;EDI= OF SCREEN ADD EDI,127712 ;ESI= OF DST POWERPILL-DOT => 127712=(159*800+448+32)+32 DOBOTH: CALL NEAR PUTSPRITE ;PUT PRIZE ON SCREEN ADD ESI,32 ;ADD SIZE OF TILE !THIS IS NEEDED SO GHOSTS DO NOT CLEAR DOTS! ADD EDI,32 ;ADD SIZE OF TILE !THIS IS NEEDED SO GHOSTS DO NOT CLEAR DOTS! LOOP DOBOTH ;REPEAT FOR ALL TILES ;-----------------------------------------------;----------------------------- GAMELOOP: TEST DWORD [GHOSTSTATE],1 ;ARE GHOSTS FLASHING JZ GHOSTSTD1 ;ELSE SKIP GHOSTS FLASH BELOW TEST DWORD [GHOSTTIME],0FFFFFFF0H ;GHOSTS FLASH TIME RUNNING ? JNZ NOFLASH ;ELSE SKIP GHOSTS FLASH BELOW MOV ESI, PAL_STATE3 ;ELSE LOAD PALETTE GHOSTS FLASH WHITE TEST DWORD [GHOSTTIME],2 ;GHOST BLUEFLASH TIME LAPSED ? JZ WHITE ;IF NOT GOTO GHOST FLASH WHITE MOV ESI, PAL_STATE2 ;ELSE LOAD PALETTE GHOSTS FLASH BLUE WHITE: CALL NEAR SETSTATE ;..AND SET THAT PALETTE NOFLASH: DEC DWORD [GHOSTTIME] ;FLASH TIME DECREMENT JNZ GHOSTSTD2 ;IF NOT YET ZERO CARRY ON GHOSTSTD1:MOV ESI, PAL_STATE1 ;ELSE LOAD TO DEFAULT GHOST PALETTE CALL NEAR SETSTATE ;..AND SET THAT PALETTE MOV DWORD [GHOSTSTATE],0 ;MARK STATE AS NO GHOSTS FLASH GHOSTSTD2:CALL NEAR SWPSCR000 ;COPY LOGICAL TO PHYSICAL SCREEN MOV EBP, PACCORDX ;PROCESS PACMAN CALL NEAR GETKBD000 ;READ KEYBOARD FOR PACMAN CALL NEAR GETKBD000 ;READ KEYBOARD GHOST 1 CALL NEAR GETKBD000 ;READ KEYBOARD GHOST 2 CALL NEAR GETKBD000 ;READ KEYBOARD GHOST 3 CALL NEAR GETKBD000 ;READ KEYBOARD GHOST 4 CMP BYTE [DOTNUMS],244 ;IF BOARD CLEARED ; MOV CX, [DOTNUMS] ;CONTENDER WILL ADD COLOR FOR DOTS ! ; MOV AX,1010H ;CONTENDER WILL ADD COLOR FOR DOTS ! ; MOV BX,1 ;CONTENDER WILL ADD COLOR FOR DOTS ! ; INT 10H ;CONTENDER WILL ADD COLOR FOR DOTS ! JC GAMELOOP ;CONTINUE GAMELOOP INT 19H ;SORRY...DOSBOX LIKES IT ;-SET COLORS------------------------------------;----------------------------------------------- SETPAL000:MOV ESI,[LOGSCR] ;EDI= OF SCREEN ADD ESI,448 ;=>448=MAZEWIDTH*16 MOV BX, PACPAL ; MOV CX,6 ; DOBANDS: PUSH CX ; MOV CX,32 ; MOV AH,[BX] ; SETPAL001:PUSH CX ; MOV CX,352 ;EBP=TILEMAP ALIGNMENT ;800-592;((38-1)*16) => 352=176*2 SETPAL002:MOV AL, BYTE [ES:ESI] ; TEST AL,AL ; JZ SETPAL003 ;P6 CMOVNZ ES:[ESI],AH CANDIDATE? MOV BYTE [ES:ESI],AH ;P6 CMOVNZ ES:[ESI],AH CANDIDATE? SETPAL003:INC ESI ; LOOP SETPAL002 ; ADD ESI,448 ;=>448=(800-176*2) POP CX ; LOOP SETPAL001 ; INC BX ; POP CX ; LOOP DOBANDS ; RETN ;RETURN TO CALLER ;-DO MAZE COLLISION TEST (PART #1)--------------;OUT: [EBP+36]=DISPLACEMENT/IF A!=EDX=YDELTA ECX=XDELTA AL=TILE VALUE TSTCOLXXX:MOV EDI,[EBP+12] ;START OF PAC INDEX MOV EAX,[EBP+04] ;REFRESH PACMAN MAZE X POSITION MOV EBX,[EBP+08] ;REFRESH PACMAN MAZE Y POSITION MOV EDX,[EDI+24] ;PACMAN MAZE POSITION Y DELTA MOV ECX,[EDI+20] ;PACMAN MAZE POSITION X DELTA ADD EBX,EDX ;ABSOLUTE MAZE INDEX ADD EAX,ECX ;ABSOLUTE MAZE INDEX ADD EBX,EAX ;ABSOLUTE MAZE INDEX MOV AL, [MAZE+EBX] ;DL=READ TILE VALUE RETN ;RETURN TO CALLER TSTCOL000:CALL NEAR TSTCOLXXX ;GET CURRENT MAZE TILE VALUE MOV EDI,[EDI+16] ;POTENTIAL SCREEN DIPLACEMENT TEST AL,AL ;TEST IF EMPTY PREVIOUSLY DOT TILE JZ TSTCOL555 ;IF SO VALIDATE MOVE TEST AL,0C0H ;TEST IF DOT/ENERGIZER OR INTERSECTION JNZ TSTCOL555 ;IF SO VALIDATE MOVE MOV EDI,0 ;ELSE DISPLACEMENT IS ZERO TSTCOL555:PUSH EDI ;SAVE CMP DWORD [EBP+04],27 ;TEST IF TUNNEL RIGHT JNZ TSTCOL666 ;ELSE TEST IF TUNNEL LEFT CMP BYTE [EBP+24],77 ;AND TEST IF KEY RIGHT JNZ TSTCOL666 ;ELSE TEST IF TUNNEL LEFT CALL NEAR CLRBLK000 ;CLEAR BLOCK AT THIS POSTION MOV DWORD [EBP+04],0 ;REFRESH PACMAN MAZE X POSITION SUB DWORD [EBP+00],432 ;REFRESH PACMAN MAZE X POSITION => 432=2*(176+32+8) JMP SHORT TSTCOL999 ;EXIT TSTCOL666:CMP DWORD [EBP+04],0 ;TEST IF TUNNEL LEFT JNZ TSTCOL999 ;ELSE EXIT CMP DWORD [EBP+24],75 ;AND TEST IF KEY LEFT JNZ TSTCOL999 ;ELSE TEST IF TUNNEL LEFT CALL NEAR CLRBLK000 ;CLEAR BLOCK AT THIS POSTION MOV DWORD[EBP+04],27 ;REFRESH PACMAN MAZE X POSITION ADD DWORD [EBP+00],432 ;REFRESH PACMAN MAZE X POSITION => 432=2*(176+32+8) TSTCOL999:POP EDI ;RESTORE MOV DWORD [EBP+36],EDI ;SAVE *THIS* POTENTIAL SCREEN ;-----------------------------------------------;CLEAR BLOCK------------------------------------- CLRBLK000:PUSH DWORD [EBP+00] ; POP DWORD [EBP+44] ; MOV ESI,127776 ;ELSE IS PILL => 127776=(175*800+448+32-800*16)+96 RESTX: ADD ESI,[LOGSCR] ;EDI= OF SCREEN MOV EDI,[LOGSCR] ;EDI= OF SCREEN ADD EDI, DWORD[EBP+0044] ; ;-----------------------------------------------;GENERIC 32X32 PUTSPRITE------------------------- PUTSPRITE:PUSHAD ; MOV BX,28 ; SWPSCR00Y:MOV CX,7 ;112=448/4 SWPSCR00Z:MOV EAX,DWORD [ES:ESI] ;TASM WAS => LODSD [ES:ESI] ;READ 4 BYTES FROM SOURCE MOV DWORD [ES:EDI],EAX ;TASM WAS => STOSD [ES:EDI] ;WRITE 4 PIXELS TO DESTINATION ADD ESI,4 ;TASM WAS => STOSD [ES:EDI] ;WRITE 4 PIXELS TO DESTINATION ADD EDI,4 ;TASM WAS => STOSD [ES:EDI] ;WRITE 4 PIXELS TO DESTINATION LOOP SWPSCR00Z ;REPEAT N TIMES ADD ESI,304H ;800-28 ADD EDI,304H ;800-28 DEC BX ;DECREMENT COUNTER JNZ SWPSCR00Y ;REPEAT N TIMES POPAD ; RETN ; ;-SWAP SCREEN-----------------------------------;-------------------------------------- SWPSCR000:MOV EBP, PACCORDX ;BASE OF ALL CSTS PUSHAD ;[BEGIN]FOR EACH CHARACTER/SAVE ALL REGISTERS MOV DWORD [CHARNUM],CHARMAX ;START WITH CHARACTER 0 ONECHARX: CALL NEAR TSTCOL000 ;TEST COLLISION TEST DWORD [EBP+36],0FFFFH ;TEST IF DISPLACEMENT GRANTED JZ NEAR BADMOVE ;IF NOT THEN DO NOT TEST FOR EVENTS TEST DWORD [EBP+28],1 ;1=USER/PACMAN/KEY 0=COMPUTER/GHOSTS/AUTO JZ NEAR AUTOCHAR ;IF USER THEN QUERRY KEYBOARD PUSHAD ; MOV EAX,DWORD [EBP+0004] ;EAX= PACMAN MAZE X POSITION MOV EBX,DWORD [EBP+0008] ;EBX= PACMAN MAZE Y POSITION ;--------- BEGIN CHERRY TEST--------------------;-------------------------------------- CMP DWORD [CHERRYSTATE],1 ; JZ SHOWIT ; CMP DWORD [CHERRYSTATE],0 ; JZ NOCHERRY ; TIMEIT: DEC DWORD [CHERRYTIME] ;ELSE CHERRYSTATE= 2 JNZ SHOWIT ; MOV DWORD [CHERRYSTATE],0 ; MOV ESI,127776 ;WE CLEAR IT => 127776=(175*800+448+32-800*16)+96 JMP SHORT WIPEIT ; SHOWIT: MOV ESI,127648 ;WE SHOW IT => 127648=(175*800+448+32-800*16-32) WIPEIT: ADD ESI,[LOGSCR] ;EDI= OF SCREEN MOV EDI,[LOGSCR] ;EDI= OF SCREEN ADD EDI,210614 ;=> 210614=(800*(35+24*16)+160+14*16-170-800*(60+64+32)) CALL NEAR PUTSPRITE ;PUT PRIZE ON SCREEN TESTIT: CMP EAX,14 ;=>14=MAZEWIDTH/02 JNZ NOCHERRY ; CMP EBX,476 ;476=MAZEWIDTH*17 JNZ NOCHERRY ; MOV DWORD [CHERRYSTATE],0 ; ;--------- BEGIN GHOSTS TEST--------------------;-------------------------------------- NOCHERRY: MOV ECX,4 ; NOGHOSTS: ADD EBP,CHARSTRUCTSIZ ; CMP EAX,[EBP+0004] ;REFRESH PACMAN MAZE X POSITION JNZ NOGHOST ; CMP EBX,[EBP+0008] ;REFRESH PACMAN MAZE Y POSITION JNZ NOGHOST ; TEST DWORD [GHOSTSTATE],1 ;GHOST COLLISION JNZ BLUESTATE ;GHOSTS TURN BLUE/PAC DIES LINE BELOW NOPSEC000:POPAD INT 19H BLUESTATE:MOV DWORD [EBP+0000],161018 ;REFRESH PACMAN MAZE PHY => 161018=(800*(35+14*16)+160+14*16+8-800*60-176)+800*2+6-4 MOV DWORD [EBP+0004],14 ;REFRESH PACMAN MAZE X POSITION => 14=MAZEWIDTH/2 MOV DWORD [EBP+0008],364 ;REFRESH PACMAN MAZE Y POSITION => 364=MAZEWIDTH*13 NOGHOST: LOOP NOGHOSTS ; GHOSTSEND:POPAD ; ;--------- BEGIN DOTS TEST----------------------;-------------------------------------- MOV DWORD [SAMPNUM],0 ;DEFAULT BACK SOUND SOUND1OK: TEST AL,080H ;TEST IF DOT/POWERPILL PRESENT JZ NEAR AUTOCHAR ;IF NOT THEN DO NOT TEST FOR EVENTS MOV DWORD [SAMPNUM],1 ;2;DOT CHOMP SOUND TEST DWORD [GHOSTSTATE],1 ; JZ SOUND2OK ; MOV DWORD [SAMPNUM],2 ;4;DEFAULT BACK SOUND SOUND2OK: INC BYTE [DOTNUMS] ; MOV AL,BYTE [DOTNUMS] ;TEST IF MOD 120 DOTS PASSED DB 0D4H,78H ;UNDOCUMENTED AAM,IMM8 JNZ CHERRY0 ; CHERRY3: MOV DWORD [CHERRYSTATE],2 ; MOV DWORD [CHERRYTIME],50 ; CHERRY0: CMP BYTE [MAZE+EBX],08AH ;TEST IF POWERPILL JNZ YOF ; JMP SHORT YAF ; YOF: CMP BYTE [MAZE+EBX],0CAH ;TEST IF POWERPILL JNZ NOPOWER ; YAF: MOV ESI, PAL_STATE2 ; PUSHAD ; CALL NEAR SETSTATE ; POPAD ; MOV DWORD [GHOSTNUM],0 ;RESET NUMBER OF EATEN GHOSTS MOV DWORD [GHOSTTIME],50 ;SET TIME OF COUNTER-ATTACK MOV DWORD [GHOSTSTATE],1 ;SET STATE OF GHOST TO BLUE NOPOWER: AND BYTE [MAZE+EBX],40H ;DL=CLEAR TILE VALUE ;-UPDATE-MAZE-POS-------------------------------;-------------------------------------- AUTOCHAR: ADD DWORD [EBP+0004],ECX ;WE END UP HERE IF NOT PACMAN ADD DWORD [EBP+0008],EDX ;REFRESH PACMAN MAZE X & Y POSITIONS PUSH DWORD [EBP+0040] ; POP DWORD [EBP+0048] ; MOV DWORD [EBP+0040],EAX ;SAVE- THE TILE TO RESTORE PUSH DWORD [EBP+0000] ;GET BASE OF TILE POP DWORD [EBP+0044] ;SAVE- THE WHERE TO RESTORE TILE BADMOVE: ADD EBP,CHARSTRUCTSIZ ;WE END UP HERE IF DISPLACEMENT WAS REFUSED DEC DWORD [CHARNUM] ;NEXT CHARACTER DATA OFF IS+=STRUCTSIZ JNZ ONECHARX ;REPEAT FOR ALL CHARACTERS POPAD ;RESTORE ALL REGISTERS ;-FOR-EACH-ANIM-FRAME---------------------------;-------------------------------------- MOV EBP, PACCORDX ;BASE OF ALL CSTS MOV DWORD [ONEEVERYFOUR],4 ;REPEAT FOR ALL 4 COMP PAC ANIM FRAMES ONEMOVE: PUSHAD ;SAVE ALL REGISTERS ;-FOR-EACH-CHARACTER----------------------------;-BEGIN-------------------------------- MOV DWORD [CHARNUM],CHARMAX ;START WITH CHARACTER 0 ;-CLEAR-PREVIOUS-POS-BLOCK----------------------;-------------------------------------- ONECHAR: CMP DWORD [CHARNUM],CHARMAX ;START WITH CHARACTER 0 JZ NORESTORE ; ;-RESTORE-BACKGROUND-OF-OLD-SPRITE--------------;-------------------------------------- MOV EAX, [EBP+0048] ;GET OLD TILE NUMBER REST1: CMP AL,85H ;IS IT DOT JNZ REST2 ; JMP SHORT REST3 ; REST2: CMP AL,0C5H ;IS IT DOT JNZ REST4 ; REST3: MOV ESI,127744 ;=> 127744=(175*800+448+32-800*16)+64 JMP SHORT REST9 ; REST4: CMP AL,8AH ;IS IT DOT JNZ REST5 ; JMP SHORT REST6 ; REST5: CMP AL,0CAH ;IS IT DOT JNZ REST7 ; REST6: MOV ESI,127712 ;ELSE IS PILL => 127712=(175*800+448+32-800*16)+32 JMP SHORT REST9 ; REST7: MOV ESI,127680 ;=> 127680=(175*800+448+32-800*16) REST9: CALL NEAR RESTX ; JMP SHORT RESTORED ; NORESTORE:MOV ESI,127776 ;ELSE IS PILL 127776=>(175*800+448+32-800*16)+96 CALL NEAR RESTX ; ;-LOAD-THIS-INSTANCE'S-VALS-AND-ALIGN-----------;-------------------------------------- RESTORED: MOV EDI,[EBP+12] ;START OF PAC INDEX MOV EAX,[EBP+36] ;PACMAN SCREEN POSITION PIXEL DELTA ADD EDI,[EBP+20] ;GET ANIMATED PAC SPRITE NUMBER VALUE MOV ESI,[LOGSCR] ;EDI= OF SCREEN ADD ESI,[EDI] ;GET ANIMATED PAC SPRITE VALUE MOV EDI,[LOGSCR] ;EDI= OF SCREEN ;-UPDATE-SPRITE-POS-AND-DOUBLE-BUFFER-----------;-------------------------------------- ADD [EBP+00],EAX ;UPDATE SPRITE POSITION ADD EDI,[EBP+00] ;ALSO SET NEW POSITION THIS FRAME CALL NEAR PUTSPRITE ;PUT CHARACTER ON SCREEN ;-TEST-ANIM-OVERLAP-----------------------------;-------------------------------------- ADD WORD [EBP+20],4 ;GET NEXT OF FOUR CHOMP POSITIONS TEST WORD [EBP+20],0FFF0H ;TEST IF LESS THAN 4 POSITION JZ GETNEXTA ;IF SO KEEP GOING MOV WORD [EBP+20],0 ;ELSE RESET COUNT TO POSITION 0 ;-FOR-EACH-CHARACTER----------------------------;-END---------------------------------- GETNEXTA: ADD EBP,CHARSTRUCTSIZ ;NEXT CHARACTER DATA OFF IS+=STRUCTSIZ DEC DWORD [CHARNUM] ;START WITH CHARACTER 0 JNZ ONECHAR ;REPEAT FOR ALL CHARACTERS ;-BLIT-SCREEN-----------------------------------;-------------------------------------- MOV EDI,[PHYSCR] ;SET PHYSICAL SCREEN AS DESTINATION MOV ESI,[LOGSCR] ;SET LOGICAL SCREEN AS SOURCE ADD EDI,48176 ;=>48176=176+800*60 MOV BX,495 ; SWPSCR00X:MOV CX,112 ;112=448/4 NLOOP3: MOV EAX,DWORD [ES:ESI] ;READ 4 BYTES FROM SOURCE /WRITE 4 PIXELS TO DESTINATION : TASM => REP MOVS DPTR ES:[EDI],ES:[EDI] MOV DWORD [ES:EDI],EAX ; ADD ESI,4 ADD EDI,4 LOOP NLOOP3 ADD ESI,352 ;=>352=800-448 ADD EDI,352 ;=>352=800-448 DEC BX ;DECREMENT COUNTER JNZ SWPSCR00X ;REPEAT N TIMES ;-FOR-EACH-ANIM-FRAME---------------------------;-END---------------------------------- POPAD ;RESTORE AL REGISTERS DEC DWORD [ONEEVERYFOUR] ;DECREMENT ANIM COUNT JNZ ONEMOVE ;REPEAT FOR ALL 4 POSITIONS RETN ;RETNURN TO CALLER ;-TILE DECOMPRESSION----------------------------;-------------------------------------- UNCTIL000:CALL NEAR UNCTIL002 ;UNCOMPRESS TILES HORIZONTALLY CALL NEAR UNCTIL001 ; CALL NEAR UNCTIL002 ;UNCOMPRESS TILES HORIZONTALLY UNCTIL001:PUSHAD ;FALLTHROUGH FOR LAST CALL NEARUNCTIL001 MOV EDI, DWORD [CHARNUM] ; NEG EDX ;PIXEL DESTINATION POSITION DELTA NEG EBP ;COLUMN DESTINATION POSITION DELTA CALL NEAR UNCTIL002 ; POPAD ; RETN ; UNCTIL002:PUSHAD ;SAVE NUMBER OF 8X8 TILES TO DECOMPRESS UNCTIL003:PUSHAD ;SAVE EBX ECX REGISTERS MOV BL,[EBX] ;READ TILE TEST BL,BL ;IS THIS STILL UNCOMPRESSED ALREADY JZ UNCTIL008 ;IF SO THEN SKIP UNCOMPRESSING TEST BL,40H ;TEST FOR HORIZONTAL CODE JZ UNCTIL004 ;IF SO THE PROCESS HORIZONTALLY TEST EBP,80000000H ;TEST FOR VERTICAL DECOMPRESSION PASS JNZ UNCTIL005 ;IF SO PROCESS THIS TILE JMP SHORT UNCTIL008 ;ELSE SKIP THIS TILE UNCTIL004:TEST EBP,80000000H ;TEST FOR VERTICAL DECOMPRESSION PASS JNZ UNCTIL008 ;IF NOT THEN SKIP THIS TILE UNCTIL005:AND EBX,0000003FH ;GET SOURCE TILE NUMBER SHL BX,4 ;GET SOURCE ADD EBX,EAX ;TASM WARNING VS. SAVES ONE BYTE BSWAP ECX ; UNCTIL006:PUSH CX ;SAVE NUMBER OF COLUMS OR LINES MOV CX,16 ;NUMBER OF PIXELS PER COLUMS OR LINES UNCTIL007:MOV AL,[EBX] ;GET SOURCE PIXEL VALUE MOV [EDI],AL ;SET DESTINATION PIXEL VALUE INC EBX ;INC SOURCE ADD EDI,EDX ;REPOSITION PIXEL DESTINATION LOOP UNCTIL007 ;PROCESS NEXT PIXEL ADD EBX,ESI ;REPOSITION LINE OR COLUMN SOURCE ADD EDI,EBP ;REPOSITION LINE OR COLUMN DESTINATION POP CX ;RESTORE NUMBER OF COLUMS OR LINES LOOP UNCTIL006 ;PROCESS NEXT LINE OR COLUMN UNCTIL008:POPAD ;RESTORE BX CX EDI INC EBX ;POINT TO NEXT TILE IN UNCOMPRESS TABLE ADD EDI,16 ;KEEP EDI=EBX*16 LOOP UNCTIL003 ;PROCESS NEXT TILE POPAD ;RESTORE EBX ECX REGISTERS RETN ;RETNURN TO CALLER ;**************************************;*********************************************** ;GENERIC TILEMAPPING (TILES ARE 8X8) ; ;1.DRAWS THE MAZE TILEMAP ; ;2.DRAWS THE SPRITES TILEMAP ; ;INPUT: ESI= OF MAP ; ; EDI= OF SCREEN ; ; EBX= OF TILES ; ; ECX=MAP HEIGHT(IE:MAZEHEIGHT); ; EDX=MAP WIDTH (IE:MAZEWIDTH) ; ; EAX=EDI ADD (12352) ; EBP=INNERLOOP ADD ESI,592 (TILEMAP WIDTH) ; 16 IS CONSTANT 784=800-16 IS CONSTANT 48176 ;**************************************;*********************************************** SETMAZ000:PUSH CX ;DOROWS:SAVE NUMBER OR ROWS MOV ECX,EDX ;GET MAPWIDTH DO1ROW: PUSHAD ;PUSH ESI/PUSH EDI/PUSH ECX READTILE: XOR EAX,EAX ;CLEAR AH PUSHAD ;PUSH ESI/PUSH EDI/PUSH ECX LODSB ;AL=[ESI] MOV DX,AX ;MOV DL,AL AND AL,3FH ;REMOVE 3RD COLOR MASK MOV ESI,EBX ;ESI= OF TILES SHL EAX,4 ;GET INDEXED TILE DISPLACEMENT ADD ESI,EAX ;GET RAW TILE MOV CX,16 ;TILEHEIGHT ROWS COPYBITMAP:PUSH CX ;SAVE NUMBER OF ROWS MOV CX,16 ;MOV CL,16 TILEWIDTH COLUMNS COPYPIX: LODSB ;LOAD VALUE TEST AL,AL ;TEST IF VISIBLE JZ NOCOLORTST ;IF NOT SKIP TEST DL,80H;DL ;TEST IF NOT 3RD COLOR CASE JZ NOCOLORTST ;IF SO SKIP MOV AL,7 ;ELSE 3RD COLOR=7 (PALE WHITE) TEST DL,0AH ;TEST IF POWER PILL JZ NOCOLORTST ;IF NOT KEEP PALETTE INDEX 7 INC AL ;IF SO ASIGN PALETTE INDEX 8 NOCOLORTST:MOV BYTE [ES:EDI],AL ; TASM WAS ;NOCOLORTST:STOS ES:[EDI] ;WRITE COLOR BYTE TO SCREEN INC EDI LOOP COPYPIX ;REPEAT FOR ALL THE TILEWIDTH COLUMNS ADD ESI,EBP ;REALIGN SRC WITH NEXT DATA COLUMN ADD EDI,784 ;REALIGN DST WITH NEXT SCREEN COLUMN 784=800-16 POP CX ;RESTORE NUMBER OF ROWS LOOP COPYBITMAP ;REPEAT FOR MAPHEIGHT ROWS POPAD ;POP ECX/POP EDI/POP ESI LOOP READTILE ;REPEAT FOR NUMBER OF TILES POPAD ;POP ECX/POP EDI/POP ESI INC ESI ;ESI++ ADD EDI,16 ;EDI=EDI+16 LOOP DO1ROW ;AND DO ONE MAPCOLUMNS ADD EDI,EAX ;EDI=EDI+MAPROW SOURCEWIDTH IN PIXEL POP CX ;RESTORE NUMBER OF MAPROWS LOOP SETMAZ000 ;REPEAT FOR MAPHEIGHT ROWS RETN ;RETNURN TO CALLER ;-PLAY SOUND THROUGH SOUNDSPEAKER---------------;- 1BIT TTL LOGIC ADPCM COMPRESSION------------- SNDDRV000:PUSHAD ; LGS DI, [FS:124] ;1FH IVT POINTER TO THE VGCT=DATA FOR TABLE 0 ASCII CHARACTERS 80H TO FFH MOV BX, WORD [SAMPNUM] ;GET SAMPLE NUMBER SHL BX,1 ;GET SAMPLE ABSOLUTE ADD BX, SOUND1 ;GET SAMPLE RELATIVE ADD DI,[BX] ;ADD SAMPLE RELATIVE TO OF BANK SNDSPK000:MOV BX,WORD [BITCNT] ; INC WORD [BITCNT] ; MOV CL, [ADPCMTTL+BX] ; TEST CL,CL ; JNZ BITOK ; MOV WORD [BITCNT],0 ; OR CL,80H ;MOV CL,128 INC WORD [BYTECNT] ; TEST WORD [BYTECNT],64 ;SIZ. OF SAMPLE=64 BYTES JZ BITOK ;SAMPLE END ? MOV WORD [BYTECNT],0 ; BITOK: MOV BX,WORD [BYTECNT] ; IN AL,61H ;READ SPEAKER STATE TEST BYTE [GS:DI+BX],CL ;EDI=SOUND JZ SPKOFF ; OR AL,3 ;SET SPEAKER ON BRUIT JMP SHORT SPKOK ; SPKOFF: AND AL,0FCH ;SET SPEAKER OFF SPKOK: OUT 61H,AL ;SET SPEAKER STATE INC WORD [DEMOCOUNT] ; TEST WORD [DEMOCOUNT],1000H ;1 SECOND ELAPSED ? NB:ALMOST=182*(NEWRATE/10) JZ DEMO3 MOV WORD [DEMOCOUNT],0 ;RESET DEMOCOUNT DEMO3: POPAD DEC WORD [COUNTDOWN] ; JNZ INT8_EXIT ; MOV WORD [COUNTDOWN],NEWRATE ;RELOAD COUNTER push word [INT08H+2] ;PROCESS OLD INTERRUPT 8 push word [INT08H+0] ;PROCESS OLD INTERRUPT 8 retf INT8_EXIT:PUSH AX ; MOV AL,20H ;END-OF-INTERRUPT COMMAND OUT 20H,AL ;ISSUE COMMAND TO CONTROLLER POP AX ; IRET ; ; ;-READ KEYBOARD GAME CONTROL ADAPTER------------;- GCAI HOLDS COMMANDS-------------------------- GETKBD000:PUSH DWORD [EBP+12] ;PUSH PACSTART POP DWORD [EBP+16] ;RESTORE PACSTART AS PACSTARTPREV GETKBDXXX:TEST DWORD [EBP+28],1 ;1=USER (KEY) 0=COMPUTER (AUTO) JNZ GETKBDYYY ;IF USER THEN QUERRY KEYBOARD CALL NEAR TSTCOLXXX ;[BEGIN] ONLY EXECUTED FOR GHOSTS TEST AL,40H ; JNZ AGA2 ; MOV EBX,DWORD [EBP+32] ;GET KEY TABLE VALUES AS BASE (KEYTABS) DB 0FH,31H ;REQD TIME STAMP COUNTER OPCODE BSWAP EDX ; XOR EAX,EDX ; MOV AL,BYTE 1 ; CMP DWORD [PACCORDX+8],644 ;CMP [PACMAZEY],((MAZEWIDTH*23)*1) JC AGAN ; NEG AL ; TEST DWORD [GHOSTSTATE],0FFH ; JZ AGAN ; NEG AL ; AGAN: SUB AH,AL ; AND AH,BYTE 3 ;NORMALIZE TO [0...3] FOR INDEX MOV BYTE [EBX+01],AH ;[END] ONLY EXECUTED FOR GHOSTS JMP SHORT AGA ;AND SKIP KEYBOARD QUERRY GETKBDYYY:MOV AH,BYTE 1 ;NON BLOCKING READ KEYBOARD FUNCTION INT 16H ;BIOS KBD CALL JNZ QHOQ ;IF NEW KEY IN BUFFER THEN RETNRIEVE IT AGA2: MOV BYTE AH, [EBP+24] ;ELSE KEY <= OLD KEY JMP SHORT AGA ;AND SKIP KBD NEW KEY RETNRIEVAL QHOQ: XOR AX,AX ;BLOCKING READ KEYBOARD FUNCTION INT 16H ;BIOS KBD CALL TEST AL,AL ;ESC=ONLY KEY SCANCODE WHERE AL!=0 JZ AGA ;NEITHER UP4800 DOWN5000 LEFT4B00 OR RIGHT4D00 INT 19H ;GAMEEXIT AGA: MOV [EBP+24],AH ;SAVE OLDKEY <= THIS KEY MOV ECX,4 ;4 DIRECTIONS/KEYS TO TEST IN ALL MOV EBX,[EBP+32] ;GET KEY TABLE VALUES AS BASE (KEYTABS) GETKBDBBB:PUSHAD ;SAVE ALL REGISTERS GETKBDAAA:CMP AH,[EBX+00] ;TEST ALL KEYS/TEST IF THIS DIRECTION KEY PRESSED JNZ GETKBDQQQ ;CYCLE COMPARAISON WITH ALL CASES MOV EDX,[EBX+02] ;ELSE GET ANIM IN TAB MOV [EBP+12],EDX ;GET THAT SEQUENCE AS BASE GETKBDOOO:CALL NEAR TSTCOLXXX ;DO COLLISION DETECTION TEST AL,AL ;TEST IF EMPTY PREVIOUS DOTTED ELEMENT JZ GETKBDQQQ ;IF SO THEN KEEP PACTSTART VALUE TEST AL,0C0H ;TEST IF DOTTED OR INTERSECTION ELEMENT JNZ GETKBDQQQ ;IF SO THEN KEEP PACTSTART VALUE PUSH DWORD [EBP+16] ;PUSH PACSTART PREV POP DWORD [EBP+12] ;RESTORE AS PACSTART GETKBDQQQ:POPAD ;RESTORE ALL REGISTERS MOV EDX,DWORD [EBP+16] ; CMP EDX,DWORD [EBP+12] ; JNZ GETKBD999 ; ADD EBX,6 ;ENTRIES ARE 6 BYTES PER CALL IN TAB LOOP GETKBDBBB ;REPEAT FOR ALL FOUR KEY/DIRECTIONS ADD EBP,52 ;PROCESS PACMAN 0 + GHOST NUMBER 1->4 GETKBD999:RETN ;RETNURN TO CALLER ;-SET PALETTE TO PALETTE------------------------;- SI = PALETTE-------------------- SETSTATE: MOV CX,6 ; PALLOOP0: MOV DX,3C8H ; LODSW ;MOV AX, [SI+0] OUT DX,AX ; INC DX ; LODSB ;MOV AL, [SI+2] OUT DX,AL ; LODSB ;MOV AL, [SI+3] OUT DX,AL ; LOOP PALLOOP0 ; RETN ; ;-STACK-LOCATION-^------------------------------;-----------------------------