Files
ZSNES/zsnes/src/gui/gui.asm
2004-01-09 10:10:13 +00:00

5625 lines
124 KiB
NASM

;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;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., 675 Mass Ave, Cambridge, MA 02139, USA.
; Sorry. The GUI code is a total mess. One problem I encountered is that
; there seems to be a bug in nasm with using math calculations combined
; with macros within macros, so in some macro definitions, I had to
; add/subtract extra values in certain macros to get the GUI to align
; correctly.
; The GUI is drawn is mostly manually. What I mean is such as
; coding 5 boxes to represent a shaded box for each box. Although that
; can be simplified using macros to draw 5 boxes, that unknown bug in nasm
; showed up which prevented me from using macros extensively. I was
; thinking of changing it to an object-based GUI for easier coding,
; but that was decided far into the development of the GUI itself
; and that I also never expected this code to become open-source, so I
; decided not to proceed with it.
; Routine StartGUI is the function called to start the GUI and also
; contains the execution main loop of the GUI. If you want to completely
; replace the GUI, just add a function call from that function, then
; jump to endprog to exit ZSNES or continueprog to continue with the
; gameplay. Do not replace StartGUI with a function since it is not
; a function, but rather a label that is being jumped to.
; **************************************
; GUI.ASM
; **************************************
;
; Associated files :
; GUIWinDp.inc - Window Display Routines
; GUITools.inc - Misc routines for the GUI
; Quick Searches :
; DisplayMenu - routines to display top menu bar
; Incomp - Search for start of modem processing
; ProcessModem
; GUIgetcurrentinput
; GUITryMenuItem - Processes the menu item when user clicks item
; Mouseimplementation
; DGUIDisplayer
; LGUILoadData
; SetInputDevice
; CalibrateDev1
; ButtonProcess - routines that processes boxed buttons
; CheatCodeSearchInit
; guiwincontrol
%include "macros.mac"
EXTSYM curblank, vidpastecopyscr, frameskip, newengen, vsyncon
EXTSYM cvidmode, antienab, smallscreenon, smallscreence,NetQuit
EXTSYM soundon, StereoSound, SoundQuality, MusicRelVol
EXTSYM endprog, continueprog, spcBuffera, spcRamcmp, cbitmode, makepal
EXTSYM t1cc, LoadDir, SRAMDir, LoadDrive,SRAMDrive, initsnes, romloadskip
EXTSYM fname, makeextension, sram, loadfileGUI, GUIloadfailed
EXTSYM SetupROM,CheckROMType, romdata, ForcePal, ramsize, ramsizeand, curromsize
EXTSYM romispal, totlines, cfgloadsdir, init65816, procexecloop
EXTSYM spcRam, spcPCRam, spcS, spcRamDP, spcA, spcX, spcY, spcP, spcNZ
EXTSYM Voice0Status, Voice1Status, Voice2Status, Voice3Status, Voice4Status
EXTSYM Voice5Status, Voice6Status, Voice7Status, romtype, SetIRQVectors
EXTSYM ClearScreen, statesaver, loadstate2, vidbuffer, ASCII2Font, hirestiledat
EXTSYM showallext, ROMTypeNOTFound, scanlines,statefileloc,pl1selk,pl2selk
EXTSYM fnamest,sprlefttot,spritetablea,fnames,SFXSRAM,sfxramdata,setaramdata,SETAEnable,cgram,srama
EXTSYM tempco0,prevbright,maxbr,prevpal,coladdr,coladdg,coladdb
EXTSYM scaddtype,ScreenScale,vesa2red10,initvideo2,initvideo,pressed,UpdateDevices
EXTSYM memtabler8,memtablew8,writeon,pl1contrl,pl2contrl,JoyRead,SetInputDevice
EXTSYM SetInputDevice209,FPSOn,RevStereo,WDSPReg0C,WDSPReg1C,WDSPReg2C
EXTSYM WDSPReg3C,pl12s34,resolutn,delay,chaton,chatstrL,chatLpos,chatstrR,chatRTL
EXTSYM InitDrive,InitDir,createnewcfg,Makemode7Table,SnowOn,MovieBuffSize
EXTSYM MovieBuffFrame,vidbufferofsb,ZipSupport,wramdata,bgfixer,cfgnewgfx
EXTSYM cfgdontsave,videotroub,Open_File,Read_File,Close_File,Write_File,Create_File
EXTSYM File_Seek,File_Seek_End,Open_File_Write,Get_Date,Check_Key,Get_Key
EXTSYM Change_Drive,Change_Single_Dir,Change_Dir,Get_Dir,Get_First_Entry
EXTSYM Get_Next_Entry,Set_DTA_Address,timer2upd,curexecstate,TripBufAvail
EXTSYM nmiprevaddrl,nmiprevaddrh,nmirept,nmiprevline,nmistatus,spcnumread,spchalted
EXTSYM NextLineCache,VidStartDraw,ResetTripleBuf,GUINGVID
EXTSYM ScanCodeListing,AdjustFrequency,GUISaveVars,Init_Mouse
EXTSYM Get_MouseData,Set_MouseXMax,Set_MouseYMax,Set_MousePosition,Get_MousePositionDisplacement
EXTSYM GUIInit,GUIDeInit,SpecialLine
EXTSYM DrawWater,DrawBurn,RemoteDisconnect,loadstate3
EXTSYM SA1Enable,SA1RAMArea
EXTSYM GUIFName,GUICName
EXTSYM printnum
EXTSYM MMXCheck
EXTSYM SaveCombFile
EXTSYM NetSent,valuea
EXTSYM welcome
EXTSYM showinfogui
EXTSYM BackupCVFrame
EXTSYM Wait1SecWin,ClearUDPStuff
EXTSYM DisableSUDPPacket,EnableSUDPPacket
EXTSYM BackStateSize
EXTSYM ResetExecStuff
EXTSYM RestoreCVFrame
EXTSYM CurRecv,BackState,CBackupPos,PBackupPos,PPValue,DPValue,NetQuitter
EXTSYM LatencyV
EXTSYM LatencyRecvPtr,LatencySendPtr
EXTSYM NumofBanks
EXTSYM WinErrorA,WinErrorB,WinErrorC
EXTSYM ErrorPointer
EXTSYM MessageOn,Msgptr,MsgCount
EXTSYM PJoyAOrig,PJoyBOrig,PJoyCOrig,PJoyDOrig,PJoyEOrig
EXTSYM GetHostName
EXTSYM vramaddr,curypos,ClearRegs,vram,sndrot,regsbackup
EXTSYM GetScreen,GUITBWVID
EXTSYM Clear2xSaIBuffer
EXTSYM MouseWindow
EXTSYM GotoHomepage
EXTSYM cfgcvidmode, ExitFromGUI
EXTSYM GUIWFVID
EXTSYM cfgvsync,newgfx16b
EXTSYM cfgscanline,cfginterp
EXTSYM NumVideoModes
EXTSYM cfgvolume, MusicVol, DSPMem
EXTSYM NumInputDevices,GUIInputNames
EXTSYM GUIVideoModeNames
EXTSYM GUISLVID,GUIINVID,GUIEAVID,GUIIEVID,GUIFSVID,GUIWSVID
EXTSYM GUISSVID,GUITBVID,GUIHSVID,GUI2xVID,GUII2VID,GUIM7VID
EXTSYM cfgsoundon,cfgSoundQuality,cfgStereoSound,cfgforce8b
EXTSYM Force8b,convertnum,converthex
EXTSYM per2exec
EXTSYM hostname
EXTSYM UDPConfig
EXTSYM snesmouse
EXTSYM pl1upk,pl1downk,pl1leftk,pl1rightk,pl1Lk,pl1Rk,pl1Ak,pl1Bk
EXTSYM outofmemfix,yesoutofmemory
EXTSYM CReadHead,ReadHead,CFWriteHead,CFWriteStart
EXTSYM JoyX,JoyY,JoyMinX,JoyMinY,JoyMaxX,JoyMaxY,JoyMinX209,JoyMaxX209
EXTSYM JoyMinY209,JoyMaxY209,GetCoords,GetCoords3
EXTSYM MultiTap,SFXEnable
EXTSYM RestoreSystemVars
EXTSYM TCPIPStartServer
EXTSYM TCPIPInitConnectToServer
EXTSYM TCPIPWaitForConnection
EXTSYM tcperr
EXTSYM TCPIPConnectToServer
EXTSYM TCPIPConnectToServerW
EXTSYM selc0040
EXTSYM TCPIPPreparePacket
EXTSYM TCPIPSendPacket,TCPIPSendPacketUDP
EXTSYM TCPIPDisconnect,TCPIPStatus
EXTSYM TCPIPStoreByte
EXTSYM TCPIPGetByte,GUIBIFIL
EXTSYM GUIHQ2X
EXTSYM GUIHQ3X
EXTSYM GUIHQ4X
EXTSYM firstsaveinc
EXTSYM nssdip1,nssdip2,nssdip3,nssdip4,nssdip5,nssdip6
NEWSYM st010difficulty, db 0 ; place holder till we commit the other Seta 10 file
;EXTSYM st010difficulty
%ifdef __LINUX__
EXTSYM numlockptr
%endif
%ifdef __WIN32__
EXTSYM initDirectDraw
EXTSYM reInitSound
%endif
%ifdef __MSDOS__
EXTSYM dssel, cantinitmodem, ModemClearBuffer, ModemGetChar
EXTSYM InitModem, DeInitModem, ModemCheckRing, ModemCheckDCD
EXTSYM DeInitModemC, ModemSendChar, UartType
EXTSYM deinitipx, IPXSearchval, ipxlookforconnect, initipx
EXTSYM PreparePacketIPX,SendPacketIPX,ipxgetchar,ipxsendchar
%endif
NEWSYM GuiAsmStart
%include "gui/guitools.inc"
%include "gui/guimisc.inc"
%include "gui/guimouse.inc"
%include "gui/guiwindp.inc"
%include "gui/guinetpl.inc"
%include "gui/guikeys.inc"
%include "gui/guicheat.inc"
%include "gui/guicombo.inc"
%include "gui/guiload.inc"
SECTION .data
; ProcessRemoteCommand
; NetLoadStuff ; Send 14 to initiate, Send 15 to cancel (either way)
; call PreparePacket
; mov al,253
; call RemoteSendChar
; call SendPacket
; NetAddChar
NEWSYM WaterOn, db 1
; Things to do :
;
; .checkmenuboxclick
; gray scale = 32 .. 63
; shadow = 96 .. 127
; blue scale = 148 .. 167, 168 .. 187
; gray scale = 189 .. 220 (32+137)
; | Game Config Cheat MultiPlay Misc
;-------------------------------------------------------
; Load Input#1 Add Code Modem Game Keys
; Run Input#2 Browse IPX GUI Opns
; Reset Input#3 Search About
; ----- Input#4
; Save State -------
; Load State Options
; Chose State Video
; ----- Sound
; Quit
; Windows : 1 = Save/Load Confirmation
; 2 = Chose State
; 3 = Input Device Window
; 4 = Options
; 5 = Video
; 6 = Sound
; 7 = Cheat
; 8 = IPX/Modem
; 9 = GameOptions
; 10 = GUI Options
; 11 = About
;The first byte is the number of fields on the right not including the seperators
MenuDat1 db 12, 3,1,1,1,1,1,1,1,1,1,0,1,2,0
MenuDat2 db 8, 3,1,1,0,1,1,1,0,2,0,0
MenuDat3 db 12, 3,1,1,1,1,0,1,1,0,1,1,1,2,0
MenuDat4 db 2, 3,1,2,0
MenuDat5 db 1, 3,2,0
MenuDat6 db 6, 3,1,1,1,1,0,2,0
GUIPrevMenuData
db 1,'1. ',0
db 1,'2. ',0
db 1,'3. ',0
db 1,'4. ',0
db 1,'5. ',0
db 1,'6. ',0
db 1,'7. ',0
db 1,'8. ',0
db 1,'9. ',0
db 1,'0. ',0
db 0,'------------',0
.onoff db 1,'FREEZE DATA : OFF ',0
db 1,'CLEAR ALL DATA ',0
GUIGameMenuData
db 1,'LOAD ',0
db 1,'RUN [ESC] ',0
db 1,'RESET ',0
db 0,'------------',0
db 1,'SAVE STATE ',0
db 1,'OPEN STATE ',0
db 1,'PICK STATE ',0
db 0,'------------',0
db 1,'QUIT ',0
GUIConfigMenuData
db 1,'INPUT #1 ',0
db 1,'INPUT #2 ',0
db 1,'INPUT #3 ',0
db 1,'INPUT #4 ',0
db 1,'INPUT #5 ',0
db 0,'------------',0
db 1,'ADD-ONS ',0
db 1,'CHIP CFG ',0
db 0,'------------',0
db 1,'OPTIONS ',0
db 1,'VIDEO ',0
db 1,'SOUND ',0
db 1,'PATHS ',0
GUICheatMenuData
db 1,'ADD CODE ',0
db 1,'BROWSE ',0
db 1,'SEARCH ',0
GUINetPlayMenuData
db 1,'MODEM ',0
db 1,'IPX ',0
GUIMiscMenuData
db 1,'GAME KEYS ',0
db 1,'GUI OPNS ',0
db 1,'MOVIE OPN ',0
db 1,'KEY COMB. ',0
db 1,'SAVE CFG ',0
db 0,'------------',0
db 1,'ABOUT ',0
; Config, Options -> New Gfx Engine, Frame Rate, Fast Forward FrameRate, etc.
; Config, Video -> Video Mode, Interpolation, etc.
; Config, Options -> Set up Save and/or Load State Confirmation
; Select Different game key assignments
; If menu should go to Load or last position when ESC
; is pressed from game
GUIRAdd db 15
GUIGAdd db 10
GUIBAdd db 31
mousewrap db 0 ; 0 = mouse boundries, 1 = mouse wrap
mouseshad db 1 ; 0 = no mouse shadow, 1 = mouse shadow
lastcursres db 0 ; 0 = go to load, 1 = go to previous menu, 2 = no menu
resetposn db 1 ; 0 = no window reset, 1 = window reset
NEWSYM GUIClick, db 0 ; 1 = mouse click enters/exits gui
GUIwinposx2 dd 0,5 ,60 ,30 ,55 ,50 ,65 ,5 ,30 ,20 ,10 ,80 ,65 ,20 ,70 ,50 ,3 ,0
GUIwinposy2 dd 0,20 ,70 ,30 ,20 ,22 ,36 ,20 ,30 ,20 ,40 ,70 ,60 ,30 ,65 ,50 ,22,0
; Default keys
; Sound Channels 0 .. 7, Save/Select/Load States, Fast Forward
; Exit, Load, Reset, BG Disables, Reset, Windowing, New Gfx, OffsetMode
; State Selection 0 .. 9
NEWSYM KeyDisableSC0, dd 63
NEWSYM KeyDisableSC1, dd 64
NEWSYM KeyDisableSC2, dd 65
NEWSYM KeyDisableSC3, dd 66
NEWSYM KeyDisableSC4, dd 67
NEWSYM KeyDisableSC5, dd 68
NEWSYM KeyDisableSC6, dd 87
NEWSYM KeyDisableSC7, dd 88
NEWSYM KeySaveState, dd 60
NEWSYM KeyStateSelct, dd 61
NEWSYM KeyLoadState, dd 62
NEWSYM KeyFastFrwrd, dd 41
NEWSYM KeyQuickExit, dd 0
NEWSYM KeyQuickLoad, dd 0
NEWSYM KeyQuickRst, dd 0
NEWSYM KeyBGDisble0, dd 2
NEWSYM KeyBGDisble1, dd 3
NEWSYM KeyBGDisble2, dd 4
NEWSYM KeyBGDisble3, dd 5
NEWSYM KeySprDisble, dd 6
NEWSYM KeyResetAll, dd 7
NEWSYM KeyExtraEnab, dd 8
NEWSYM KeyNewGfxSwt, dd 9
NEWSYM KeyWinDisble, dd 10
NEWSYM KeyOffsetMSw, dd 11
NEWSYM KeyStateSlc0, dd 0
NEWSYM KeyStateSlc1, dd 0
NEWSYM KeyStateSlc2, dd 0
NEWSYM KeyStateSlc3, dd 0
NEWSYM KeyStateSlc4, dd 0
NEWSYM KeyStateSlc5, dd 0
NEWSYM KeyStateSlc6, dd 0
NEWSYM KeyStateSlc7, dd 0
NEWSYM KeyStateSlc8, dd 0
NEWSYM KeyStateSlc9, dd 0
GUIshowallext db 0
GUIloadfntype db 0
NEWSYM pl3selk, dd 0 ; 3SELECT = SHIFT
NEWSYM pl3startk, dd 0 ; 3START = ENTER
NEWSYM pl3upk, dd 0 ; 3UP = up
NEWSYM pl3downk, dd 0 ; 3DOWN = down
NEWSYM pl3leftk, dd 0 ; 3LEFT = left
NEWSYM pl3rightk, dd 0 ; 3RIGHT = right
NEWSYM pl3Xk, dd 0 ; 3X = INS
NEWSYM pl3Ak, dd 0 ; 3A = HOME
NEWSYM pl3Lk, dd 0 ; 3L = PAGE UP
NEWSYM pl3Yk, dd 0 ; 3Y = DELETE
NEWSYM pl3Bk, dd 0 ; 3B = END
NEWSYM pl3Rk, dd 0 ; 3R = PAGE DOWN
NEWSYM pl4selk, dd 0 ; 4SELECT = SHIFT
NEWSYM pl4startk, dd 0 ; 4START = ENTER
NEWSYM pl4upk, dd 0 ; 4UP = up
NEWSYM pl4downk, dd 0 ; 4DOWN = down
NEWSYM pl4leftk, dd 0 ; 4LEFT = left
NEWSYM pl4rightk, dd 0 ; 4RIGHT = right
NEWSYM pl4Xk, dd 0 ; 4X = INS
NEWSYM pl4Ak, dd 0 ; 4A = HOME
NEWSYM pl4Lk, dd 0 ; 4L = PAGE UP
NEWSYM pl4Yk, dd 0 ; 4Y = DELETE
NEWSYM pl4Bk, dd 0 ; 4B = END
NEWSYM pl4Rk, dd 0 ; 4R = PAGE DOWN
NEWSYM TimeChecker, db 0 ; Future Reserved
GUISoundBuffer db 1 ; Sound Buffer Disabled
prevloadnames times 16*10 db 32
prevloaddname times 128*10 db 0
prevloadfname times 16*10 db 32
prevlfreeze db 0
GUIsmallscreenon db 0
GUIScreenScale db 0
NEWSYM pl3contrl, db 0
NEWSYM pl4contrl, db 0
NEWSYM pl1p209b, db 0
NEWSYM pl2p209b, db 0
NEWSYM pl3p209b, db 0
NEWSYM pl4p209b, db 0
JoyPad1Move db 0
NEWSYM FirstTimeData, db 0
NEWSYM PrevSWFix, db 0
NEWSYM CalibXmin, dd 0
NEWSYM CalibYmin, dd 0
NEWSYM CalibXmax, dd 0
NEWSYM CalibYmax, dd 0
NEWSYM CalibXmin209, dd 0
NEWSYM CalibYmin209, dd 0
NEWSYM CalibXmax209, dd 0
NEWSYM CalibYmax209, dd 0
NEWSYM maxskip, db 9
NEWSYM FPSAtStart, db 0
NEWSYM SidewinderFix, db 0
GUIInitSt1 db 'ATZ'
.rest times 47 db 0
GUIInitSt2 db 'AT S0=0'
.rest times 43 db 0
GUIDialSt db 'ATDT ',0
NEWSYM ComNum, db 2
NEWSYM ComIRQ, db 3
NEWSYM BaudRate, dd 3
NEWSYM pl1Atk, dd 0 ; Turbo A
NEWSYM pl1Btk, dd 0 ; Turbo B
NEWSYM pl1Xtk, dd 0 ; Turbo X
NEWSYM pl1Ytk, dd 0 ; Turbo Y
NEWSYM pl2Atk, dd 0 ; Turbo A
NEWSYM pl2Btk, dd 0 ; Turbo B
NEWSYM pl2Xtk, dd 0 ; Turbo X
NEWSYM pl2Ytk, dd 0 ; Turbo Y
NEWSYM pl3Atk, dd 0 ; Turbo A
NEWSYM pl3Btk, dd 0 ; Turbo B
NEWSYM pl3Xtk, dd 0 ; Turbo X
NEWSYM pl3Ytk, dd 0 ; Turbo Y
NEWSYM pl4Atk, dd 0 ; Turbo A
NEWSYM pl4Btk, dd 0 ; Turbo B
NEWSYM pl4Xtk, dd 0 ; Turbo X
NEWSYM pl4Ytk, dd 0 ; Turbo Y
NEWSYM Turbo30hz, db 0 ; Turbo at 30hz instead of 60hz
NEWSYM KeyVolUp, dd 0
NEWSYM KeyVolDown, dd 0
NEWSYM KeyFRateUp, dd 0
NEWSYM KeyFRateDown, dd 0
NEWSYM KeyQuickChat, dd 20
NEWSYM FossilUse, db 0
NEWSYM TimerEnable, db 0
NEWSYM Surround, db 0
NEWSYM InterSound, db 1
NEWSYM FastFwdToggle, db 0
NEWSYM En2xSaI, db 0
NEWSYM AutoLoadCht, db 0
NEWSYM KeyQuickSnapShot, dd 0
CheatSrcByteSize db 0
CheatSrcByteBase db 0
CheatSrcSearchType db 0
CheatUpperByteOnly db 0
NEWSYM SRAMSave5Sec, db 0
NEWSYM ReInitSoundC, db 0
NEWSYM OldGfxMode2 , db 0
NEWSYM PitchModEn , db 0
NEWSYM LatestSave , db 0
NEWSYM AutoState , db 0
NEWSYM OldVolume , db 1
NEWSYM BlankVar , db 1
NEWSYM pl1ULk, dd 0
NEWSYM pl1URk, dd 0
NEWSYM pl1DLk, dd 0
NEWSYM pl1DRk, dd 0
NEWSYM pl2ULk, dd 0
NEWSYM pl2URk, dd 0
NEWSYM pl2DLk, dd 0
NEWSYM pl2DRk, dd 0
NEWSYM pl3ULk, dd 0
NEWSYM pl3URk, dd 0
NEWSYM pl3DLk, dd 0
NEWSYM pl3DRk, dd 0
NEWSYM pl4ULk, dd 0
NEWSYM pl4URk, dd 0
NEWSYM pl4DLk, dd 0
NEWSYM pl4DRk, dd 0
NEWSYM LowPassFilterType, db 0
NEWSYM DontSavePath, db 0
NEWSYM ReCalib, db 1
NEWSYM GUIComboGameSpec, db 0
NEWSYM SoundNoiseDis, db 0 ; Disable Noise
NEWSYM Triplebufen, db 0
NEWSYM SoundBufEn, db 0
NEWSYM SPCDisable, db 0
NEWSYM RaisePitch, db 0
prevloadl db 0
prevloaddnamel times 512*10 db 0
prevloadfnamel times 512*10 db 0
%ifdef __WIN32__
NEWSYM PrevWinMode, db 2
NEWSYM PrevFSMode, db 6
%elifdef __LINUX__
NEWSYM PrevWinMode, db 2
NEWSYM PrevFSMode, db 3
%else
NEWSYM PrevWinMode, db 0
NEWSYM PrevFSMode, db 0
%endif
OldWinPos db 0
GUIwinposx dd 0,5 ,60 ,30 ,55 ,50 ,65 ,5 ,30 ,20 ,10 ,80 ,65 ,20 ,70 ,50 ,3 ,50
GUIwinposxexp times 30 dd 0
GUIwinposy dd 0,20 ,70 ,30 ,20 ,22 ,36 ,20 ,30 ,20 ,30 ,70 ,60 ,30 ,65 ,50 ,22 ,60
GUIwinposyexp times 30 dd 0
NEWSYM GUIEffect, db 0
NEWSYM pl5selk, dd 0 ; 4SELECT = SHIFT
NEWSYM pl5startk, dd 0 ; 4START = ENTER
NEWSYM pl5upk, dd 0 ; 4UP = up
NEWSYM pl5downk, dd 0 ; 4DOWN = down
NEWSYM pl5leftk, dd 0 ; 4LEFT = left
NEWSYM pl5rightk, dd 0 ; 4RIGHT = right
NEWSYM pl5Xk, dd 0 ; 4X = INS
NEWSYM pl5Ak, dd 0 ; 4A = HOME
NEWSYM pl5Lk, dd 0 ; 4L = PAGE UP
NEWSYM pl5Yk, dd 0 ; 4Y = DELETE
NEWSYM pl5Bk, dd 0 ; 4B = END
NEWSYM pl5Rk, dd 0 ; 4R = PAGE DOWN
NEWSYM pl5ULk, dd 0
NEWSYM pl5URk, dd 0
NEWSYM pl5DLk, dd 0
NEWSYM pl5DRk, dd 0
NEWSYM pl5Atk, dd 0 ; Turbo A
NEWSYM pl5Btk, dd 0 ; Turbo B
NEWSYM pl5Xtk, dd 0 ; Turbo X
NEWSYM pl5Ytk, dd 0 ; Turbo Y
NEWSYM pl5contrl, db 0
NEWSYM pl1p209, db 0
NEWSYM pl2p209, db 0
NEWSYM pl3p209, db 0
NEWSYM pl4p209, db 0
NEWSYM pl5p209, db 0
NEWSYM GUIEnableTransp, db 0
NEWSYM Mode7HiRes16b, dd 0
NEWSYM NewEngEnForce, db 1
NEWSYM KeyRewind, dd 0
NEWSYM ChatNick, times 16 db 0
NEWSYM KeySlowDown, dd 0
NEWSYM UseCubicSpline, db 1
NEWSYM LargeSoundBuf, db 0
NEWSYM HighPriority, db 0
NEWSYM AlwaysOnTop, db 0
NEWSYM SaveMainWindowPos, db 1
NEWSYM MainWindowX, dw -1
NEWSYM MainWindowY, dw -1
NEWSYM ScreenShotFormat, db 0
NEWSYM pl1Ltk, dd 0 ; Turbo L
NEWSYM pl1Rtk, dd 0 ; Turbo R
NEWSYM pl2Ltk, dd 0 ; Turbo L
NEWSYM pl2Rtk, dd 0 ; Turbo R
NEWSYM pl3Ltk, dd 0 ; Turbo L
NEWSYM pl3Rtk, dd 0 ; Turbo R
NEWSYM pl4Ltk, dd 0 ; Turbo L
NEWSYM pl4Rtk, dd 0 ; Turbo R
NEWSYM pl5Ltk, dd 0 ; Turbo L
NEWSYM pl5Rtk, dd 0 ; Turbo R
NEWSYM GUITRAdd, db 0
NEWSYM GUITGAdd, db 10
NEWSYM GUITBAdd, db 31
NEWSYM GUIWRAdd, db 8
NEWSYM GUIWGAdd, db 8
NEWSYM GUIWBAdd, db 25
NEWSYM GrayscaleMode, db 0
NEWSYM MouseWheel, db 1
NEWSYM SmallMsgText, db 0
NEWSYM AllowMultipleInst, db 0
NEWSYM FilteredGUI, db 0
NEWSYM BilinearFilter, db 0
NEWSYM TripleBufferWin, db 0
NEWSYM ExclusiveSound, db 0
NEWSYM DisableScreenSaver, db 0
NEWSYM MMXSupport, db 1
NEWSYM TrapMouseCursor, db 1
NEWSYM KeyQuickClock, dd 0
NEWSYM KeyQuickSaveSPC, dd 0
NEWSYM AutoIncSaveSlot, db 0
NEWSYM TCPIPAddress, times 29 db 0
NEWSYM SoundInterpType, db 1
NEWSYM KeyDisplayFPS, dd 0
NEWSYM KeyIncStateSlot, dd 0
NEWSYM KeyDecStateSlot, dd 0
NEWSYM KeyUsePlayer1234, dd 0
NEWSYM hqFilter, db 0
NEWSYM reserved, db 0
NEWSYM scale2xFilter, db 0
GUIsave equ $-GUIRAdd
section .bss
NEWSYM ForceROMTiming, resb 1
NEWSYM ForceHiLoROM, resb 1
NEWSYM CombinDataGlob, resb 3300 ; 20-name, 42-combo, 2-key#, 1-P#, 1-ff
NEWSYM CombinDataLocl, resb 3300
section .data
NEWSYM CmdLineNetPlay, db 0
NEWSYM CmdLineTCPIPAddress, times 29 db 0
section .bss
GUIwinorder resb 18
GUIwinpos resb 18
GUIwinactiv resb 18
DialNumber resb 40
ViewBuffer resb 50*32
NEWSYM ModemInitStat, resb 1
ModemProcess resb 1 ; Shows current dial/answer process
ModemPTimer resd 1 ; Timer for modem process
ModemOKStat resb 1 ; OK is detected on modem status
SECTION .data
; LOAD STAT INPT OPT VID SND CHT NET GMKEY GUIOP ABT RSET SRC STCN MOVE CMBO ADDO CHIP PATH
GUIwinposxo dd 0,5 ,60 ,30 ,55 ,50 ,35 ,5 ,30 ,10 ,10 ,50 ,65 ,20 ,70 ,50 ,3 ,50 ,50 ,5
GUIwinposyo dd 0,20 ,70 ,30 ,20 ,20 ,20 ,20 ,30 ,20 ,20 ,20 ,60 ,30 ,65 ,50 ,22 ,60 ,60 ,20
GUIwinsizex dd 0,244 ,126 ,189 ,167 ,180 ,188 ,244 ,8*16,235 ,240 ,190 ,9*16,8*16,9*16,140 ,250 ,160 ,160 ,244
GUIwinsizey dd 0,190 ,3*16,166 ,190 ,192 ,188 ,191 ,40 ,189 ,150 ,190 ,42 ,40 ,42 ,70 ,190 ,100 ,100 ,190
GUIwinptr db 0
section .bss
GUItextcolor resb 5
GUIcmenupos resb 1
GUIescpress resb 1
GUIcwinpress resb 1
GUIpmenupos resb 1
GUIcrowpos resd 1
GUIpclicked resb 1
GUImouseposx resd 1
GUImouseposy resd 1
GUICYLocPtr resd 1
GUIMenuL resd 1
GUIMenuR resd 1
GUIMenuD resd 1
GUIOnMenuItm resb 1
NEWSYM GUIQuit, resb 1
GUIHold resb 1
GUIHoldx resd 1
GUIHoldy resd 1
GUIHoldxm resd 1
GUIHoldym resd 1
GUIcolscaleval resd 1
cwindrawn resb 1
GUIWincol resd 1
GUIWincoladd resd 1
GUITemp resd 1
GUIHoldXlimL resd 1
GUIHoldXlimR resd 1
GUIHoldYlim resd 1
GUIHoldYlimR resd 1
cloadnpos resd 1
cloadnposb resd 1
cloadmaxlen resd 1
cloadnleft resd 1
cplayernum resb 1
vbuflimtop resd 1
vbuflimbot resd 1
GUIScrolTim1 resd 1
GUIScrolTim2 resd 1
GUICHold resd 1
GUICBHold resd 1
GUICBHold2 resd 1
GUIDClickTL resd 1
GUIDClCWin resd 1
GUIDClCEntry resd 1
GUICResetPos resd 1
GUICStatePos resd 1
GUICCFlash resb 1
GUILDFlash resb 1
GUIPalConv resd 1
PrevResoln resw 1
SnowMover resd 1
keycontrolval resd 1
NEWSYM CheatBDoor, resb 1
NEWSYM ShowTimer, resb 1
NEWSYM MousePRClick, resb 1
NEWSYM MouseDis, resb 1
NEWSYM NetPlayNoMore, resb 1
RestoreValues resb 1
NEWSYM NetChatFirst, resb 1
NEWSYM NetServer, resb 1
NEWSYM NetQuitAfter, resb 1
NEWSYM NetNewNick, resb 16
NEWSYM NetFilename, resb 512
NEWSYM CheatOn, resd 1
NEWSYM NumCheats, resd 1
NEWSYM cheatdataprev, resb 28 ; leave contents blank
NEWSYM cheatdata, resb 28*255+56 ; toggle, value, address, pvalue, name(22)
NEWSYM GUIcurrentdir, resb 131
curgsval resb 1
SECTION .data
NEWSYM numdrives, dd 26
SubPalTable times 256 db 1 ; Corresponding Gray Scale Color
SECTION .bss
WhichRemote resd 1 ; Modem = 1, IPX = 2, TCP/IP = 4
Connected resd 1
IDCheckPos resd 1
NEWSYM pl1neten, resb 1
NEWSYM pl2neten, resb 1
NEWSYM pl3neten, resb 1
NEWSYM pl4neten, resb 1
NEWSYM pl5neten, resb 1
NEWSYM cnetplaybuf, resb 512
NEWSYM cnetptrhead, resd 1
NEWSYM cnetptrtail, resd 1
NEWSYM prevp1net, resd 1
NEWSYM prevp2net, resd 1
NEWSYM prevp3net, resd 1
NEWSYM prevp4net, resd 1
NEWSYM prevp5net, resd 1
NEWSYM netdelayed, resb 1
NEWSYM ChatProgress,resd 1
NEWSYM RecvProgress,resd 1
NEWSYM IPXInfoStr, resw 1
NEWSYM IPXInfoStrR, resw 1
NEWSYM GUICMessage, resd 1
NEWSYM GUICTimer, resd 1
NEWSYM GUIOn, resb 1
NEWSYM GUIOn2, resb 1
NEWSYM GUIReset, resb 1
;GOSPort db 0
NEWSYM CurPalSelect, resb 1
NEWSYM MotionBlur, resb 1
NEWSYM StartLL, resd 1
NEWSYM StartLR, resd 1
NEWSYM LatencyVal, resb 32
NEWSYM NetLoadState, resb 1
NEWSYM TRVal, resw 1
NEWSYM TGVal, resw 1
NEWSYM TBVal, resw 1
NEWSYM TRVali, resw 1
NEWSYM TGVali, resw 1
NEWSYM TBVali, resw 1
NEWSYM TRVal2, resw 1
NEWSYM TGVal2, resw 1
NEWSYM TBVal2, resw 1
SECTION .text
%macro stim 0
%ifdef __MSDOS__
sti
%endif
%endmacro
%macro clim 0
%ifdef __MSDOS__
cli
%endif
%endmacro
clearsram:
push eax
push ecx
mov eax,srama
mov ecx,65536
.loop
mov byte[eax],0FFh
inc eax
dec ecx
jnz .loop
cmp byte[SFXSRAM],0
je .nosfxsram
mov eax,[sfxramdata]
mov ecx,65536
.loop2
mov byte[eax],0FFh
inc eax
dec ecx
jnz .loop2
.nosfxsram
cmp byte[SETAEnable],0
je .nosetasram
mov eax,[setaramdata]
mov ecx,4096
.loop2seta
mov byte[eax],0FFh
inc eax
dec ecx
jnz .loop2seta
.nosetasram
cmp byte[SA1Enable],1
jne .nosa1
mov eax,[SA1RAMArea]
mov ecx,65536*2
.loop3
mov byte[eax],0FFh
inc eax
dec ecx
jnz .loop3
.nosa1
pop ecx
pop eax
ret
GUIQuickLoadUpdate:
cmp byte[prevlfreeze],0
je .off
mov byte[GUIPrevMenuData.onoff+15],'O'
mov byte[GUIPrevMenuData.onoff+16],'N'
mov byte[GUIPrevMenuData.onoff+17],' '
jmp .on
.off
mov byte[GUIPrevMenuData.onoff+15],'O'
mov byte[GUIPrevMenuData.onoff+16],'F'
mov byte[GUIPrevMenuData.onoff+17],'F'
.on
mov esi,prevloadfnamel
%ifdef __MSDOS__
mov esi,prevloadnames
%endif
mov edi,GUIPrevMenuData+3
mov edx,10
.mainloop
mov ecx,25
%ifdef __MSDOS__
mov ecx,16
%endif
push edi
push esi
cmp byte[esi],32
je near .fin2
.loop
mov al,[esi]
cmp al,0
je .zero
mov [edi],al
inc esi
inc edi
dec ecx
jnz .loop
cmp byte[esi],0
je .zero
mov byte[edi],'.'
mov byte[edi+1],'.'
mov byte[edi+2],'.'
jmp .fin
.zero
add ecx,3
.loop2
mov byte[edi],32
inc edi
dec ecx
jnz .loop2
jmp .fin
.fin2
mov ecx,18
.loop3
mov byte[edi],32
inc edi
dec ecx
jnz .loop3
.fin
pop esi
pop edi
add esi,512 ;16
%ifdef __MSDOS__
sub esi,512-16
%endif
add edi,32
dec edx
jnz near .mainloop
ret
CalcChecksum:
mov eax,GUIRAdd
mov ecx,100
xor edx,edx
xor ebx,ebx
.loop
mov bl,[eax]
add edx,ebx
inc eax
dec ecx
jnz .loop
mov ebx,edx
xor bx,1011001011101101b
xor eax,eax
test bh,08h
jz .nb
mov al,1
.nb
and bh,0F7h
test bl,10h
jz .nb2
or bh,08h
.nb2
and bl,0EFh
test al,1
jz .nb3
or bl,10h
.nb3
xor bl,bh
or bl,80h
ret
NEWSYM GUIRestoreVars
mov edx,GUIFName
call Open_File
jc .fail
mov bx,ax
mov edx,GUIRAdd
mov ecx,GUIsave
call Read_File
call Close_File
.fail
mov al,[GUIsmallscreenon]
mov [smallscreenon],al
mov al,[GUIScreenScale]
mov [ScreenScale],al
cmp byte[CmdLineNetPlay],0
je .nocmdlinenetplay
mov ecx,28/4
mov esi,CmdLineTCPIPAddress
mov edi,TCPIPAddress
.netplayloop
mov eax,[esi]
add esi,byte 4
mov [edi],eax
add edi,byte 4
dec ecx
jnz .netplayloop
xor eax,eax
.nocmdlinenetplay
call CalcChecksum
cmp byte[TimeChecker],bl
jne .nottimer
mov byte[ShowTimer],1
mov dword[NumSnow],200
mov dword[SnowTimer],0
.nottimer
cmp byte[ReCalib],0
je .nocal
mov byte[ReCalib],0
mov dword[CalibXmin],0
mov dword[CalibXmax],0
mov dword[CalibYmin],0
mov dword[CalibYmax],0
mov dword[CalibXmin209],0
mov dword[CalibXmax209],0
mov dword[CalibYmin209],0
mov dword[CalibYmax209],0
.nocal
mov dword[NumComboGlob],0
mov edx,GUICName
call Open_File
jc .failb
mov bx,ax
mov edx,ComboBlHeader
mov ecx,23
call Read_File
mov al,byte[ComboBlHeader+22]
or al,al
jz .done
mov [NumComboGlob],al
mov ecx,[NumComboGlob]
mov edx,ecx
shl ecx,6
add ecx,edx
add ecx,edx
mov edx,CombinDataGlob
call Read_File
.done
call Close_File
.failb
ret
SECTION .data
NEWSYM ComboHeader, db 'Key Combination File',26,1,0
NEWSYM ComboBlHeader, times 23 db 0
SECTION .text
NEWSYM ExecGUISaveVars
cmp byte[ShowTimer],1
jne .nottimer
call CalcChecksum
mov byte[TimeChecker],bl
.nottimer
cmp byte[cfgdontsave],1
je .failed
mov edx,GUIFName
call Create_File
jc .failed
mov bx,ax
mov edx,GUIRAdd
mov ecx,GUIsave
call Write_File
call Close_File
.failed
mov al,[NumComboGlob]
or al,al
jz .failb
mov [ComboHeader+22],al
mov edx,GUICName
call Create_File
jc .failb
mov bx,ax
mov edx,ComboHeader
mov ecx,23
call Write_File
mov ecx,[NumComboGlob]
mov edx,ecx
shl ecx,6
add ecx,edx
add ecx,edx
mov edx,CombinDataGlob
call Write_File
call Close_File
.failb
ret
%macro GUIInitIRQs 0
call GUIInit
mov esi,pressed
mov ecx,256
mov al,0
.loopa
mov [esi],al
inc esi
dec ecx
jnz .loopa
%endmacro
%macro GUIDeInitIRQs 0
call GUIDeInit
%endmacro
SECTION .bss
NEWSYM GUIoldhand9o, resd 1
NEWSYM GUIoldhand9s, resw 1
NEWSYM GUIoldhand8o, resd 1
NEWSYM GUIoldhand8s, resw 1
GUIt1cc resd 1
GUIt1ccSwap resb 1
GUIskipnextkey42 resb 1
SECTION .text
NEWSYM GUIinit18_2hz
mov al,00110110b
out 43H,al
mov ax,0
out 40H,al
mov al,ah
out 40H,al
ret
NEWSYM GUIinit36_4hz
mov al,00110110b
out 43H,al
mov ax,32768
out 40H,al
mov al,ah
out 40H,al
ret
NEWSYM GUI36hzcall
inc dword[GUIt1cc]
inc dword[SnowMover]
cmp dword[ModemPTimer],0
je .nodec5
dec dword[ModemPTimer]
.nodec5
cmp dword[GUIEditStringLTxt],0
je .nodec
dec dword[GUIEditStringLTxt]
.nodec
cmp dword[GUIScrolTim1],0
je .nodec4
dec dword[GUIScrolTim1]
.nodec4
cmp dword[GUIDClickTL],0
je .nodec2
dec dword[GUIDClickTL]
.nodec2
cmp dword[GUIkeydelay],0
je .nodec3
dec dword[GUIkeydelay]
.nodec3
cmp dword[GUIkeydelay2],0
je .nodec3b
dec dword[GUIkeydelay2]
.nodec3b
cmp dword[GUICTimer],0
je .nodec6
dec dword[GUICTimer]
.nodec6
inc byte[GUICCFlash]
and byte[GUICCFlash],0Fh
inc byte[GUILDFlash]
and byte[GUILDFlash],0Fh
inc byte[GUINetTextm2+2]
and byte[GUINetTextm2+2],0Fh
ret
%ifdef __MSDOS__
NEWSYM GUIhandler8h
cli
push ds
push eax
mov ax,[cs:dssel]
mov ds,ax
call GUI36hzcall
xor byte[GUIt1ccSwap],1
cmp byte[GUIt1ccSwap],0
je .nocall
pushf
call far [GUIoldhand8o]
.nocall
mov al,20h
out 20h,al
pop eax
pop ds
sti
iretd
NEWSYM GUIhandler9h
cli
push ds
push eax
push ebx
mov ax,[cs:dssel]
mov ds,ax
xor ebx,ebx
in al,60H ; get keyboard scan code
cmp al,42
jne .no42
cmp byte[GUIskipnextkey42],0
je .no42
mov byte[GUIskipnextkey42],0
jmp .skipkeyrel
.no42
cmp al,0E0h
jne .noE0
mov byte[GUIskipnextkey42],1
jmp .skipkeyrel
.noE0
mov byte[GUIskipnextkey42],0
mov bl,al
xor bh,bh
test bl,80h ; check if bit 7 is on (key released)
jnz .keyrel
cmp byte[pressed+ebx],0
jne .skipa
mov byte[pressed+ebx],1 ; if not, set key to pressed
.skipa
jmp .skipkeyrel
.keyrel
and bl,7Fh
mov byte[pressed+ebx],0 ; if not, set key to pressed
.skipkeyrel
mov byte[pressed],0
pushf
call far [GUIoldhand9o]
mov al,20h
out 20h,al
pop ebx
pop eax
pop ds
sti
iretd
%endif
%macro loadmenuopen 1
mov al,[GUIcmenupos]
mov [GUIpmenupos],al
mov byte[GUIcmenupos],0
cmp byte[GUIwinactiv+%1],1
je %%menuontop
xor eax,eax
mov al,[GUIwinptr]
inc byte[GUIwinptr]
mov byte[GUIwinorder+eax],%1
mov byte[GUIwinactiv+%1],1
cmp byte[resetposn],1
jne %%nomenuitem
mov eax,[GUIwinposxo+%1*4]
mov [GUIwinposx+%1*4],eax
mov eax,[GUIwinposyo+%1*4]
mov [GUIwinposy+%1*4],eax
jmp %%nomenuitem
%%menuontop
xor eax,eax
; look for match
%%notfoundyet
mov bl,byte[GUIwinorder+eax]
cmp bl,%1
je %%nextfind
inc eax
jmp %%notfoundyet
%%nextfind
inc eax
cmp al,[GUIwinptr]
je %%foundend
mov cl,[GUIwinorder+eax]
mov [GUIwinorder+eax-1],cl
jmp %%nextfind
%%foundend
mov byte[GUIpclicked],0
mov [GUIwinorder+eax-1],bl
%%nomenuitem
%endmacro
loadnetopen:
loadmenuopen 8
ret
SECTION .bss
MouseInitOkay resb 1
SECTION .text
LoadDetermine:
mov byte[GUIGameMenuData+14],1
mov byte[GUIGameMenuData+14*2],1
mov byte[GUIGameMenuData+14*4],1
mov byte[GUIGameMenuData+14*5],1
mov byte[GUIGameMenuData+14*6],1
mov byte[GUICheatMenuData],1
mov byte[GUICheatMenuData+14],1
mov byte[GUICheatMenuData+14*2],1
mov byte[GUIMiscMenuData+14*2],1
cmp byte[CheatBDoor],1
je .nomodem
cmp byte[CNetType],21
je .modem
cmp byte[CNetType],22
je .modem
cmp byte[CNetType],20
jne .nomodem
.modem
mov byte[GUICheatMenuData],2
mov byte[GUICheatMenuData+14],2
mov byte[GUICheatMenuData+14*2],2
.nomodem
cmp byte[romloadskip],0
je .noromloaded2
mov byte[GUIGameMenuData+14],2
mov byte[GUIGameMenuData+14*2],2
mov byte[GUIGameMenuData+14*4],2
mov byte[GUIGameMenuData+14*5],2
mov byte[GUIGameMenuData+14*6],2
mov byte[GUICheatMenuData],2
mov byte[GUICheatMenuData+14],2
mov byte[GUICheatMenuData+14*2],2
mov byte[GUIMiscMenuData+14*2],2
.noromloaded2
.noromloaded
ret
SECTION .data
SantaData:
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0
db 1,0,0,1,0,0,1,0,0,0,1,1,1,0,1,1
db 1,1,0,1,1,0,1,1,0,1,0,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1
db 1,1,0,1,1,0,1,1,0,0,1,1,1,1,1,1
SantaPos dd 272
SantaNextT dd 36*15
NumSnow dd 0
NEWSYM SnowTimer, dd 36*30
MsgGiftLeft dd 0
SECTION .text
DrawSnow:
cmp byte[OkaySC],0
je near .nosanta
cmp dword[MsgGiftLeft],0
je .nodec
mov edx,20
mov ebx,210
mov byte[GUItextcolor],228
GUIOuttextwin .giftmsg
.nodec
mov esi,[vidbuffer]
add esi,[SantaPos]
add esi,60*288
mov edx,SantaData
mov ebx,8
.sloop2
mov ecx,16
.sloop
cmp byte[edx],0
je .transp
mov byte[esi],0
.transp
inc esi
inc edx
dec ecx
jnz .sloop
add esi,272
dec ebx
jnz .sloop2
.nosanta
mov esi,[vidbuffer]
mov ecx,200
xor edx,edx
.loop
xor eax,eax
mov al,[SnowData+edx*4+3]
mov ebx,eax
shl eax,8
shl ebx,5
add eax,ebx
xor ebx,ebx
mov bl,[SnowData+edx*4+1]
add eax,ebx
add eax,16
mov bl,[SnowVelDist+edx*2]
and bl,03h
add bl,228
test byte[SnowVelDist+edx*2],8
jz .nosnow
mov byte[esi+eax],bl
.nosnow
inc edx
dec ecx
jnz .loop
; Change Snow Displacement Values
.next
cmp dword[SnowMover],0
je .nomore
call ProcessSnowVelocity
dec dword[SnowMover]
jmp .next
.nomore
ret
SECTION .data
.giftmsg db 'A GIFT TO YOU IN THE OPTIONS!',0
SECTION .text
ProcessSnowVelocity:
cmp dword[MsgGiftLeft],0
je .nodec
dec dword[MsgGiftLeft]
.nodec
cmp dword[NumSnow],200
jne .snowincr
cmp dword[SantaNextT],0
je .skip
dec dword[SantaNextT]
jmp .notsreset
.skip
dec dword[SantaPos]
cmp dword[SantaPos],0
jne .notsreset
mov dword[SantaPos],272
mov dword[SantaNextT],36*60
jmp .notsreset
.snowincr
dec dword[SnowTimer]
jnz .notsreset
inc dword[NumSnow]
mov dword[SnowTimer],18
.notsreset
mov ecx,[NumSnow]
cmp ecx,0
jne .okay
ret
.okay
xor edx,edx
.loop
xor eax,eax
mov al,[SnowVelDist+edx*2]
mov ebx,100
sub bl,[MusicRelVol]
add bx,bx
add ax,bx
add ax,bx
add word[SnowData+edx*4],ax
xor eax,eax
mov al,[SnowVelDist+edx*2+1]
add ax,256
add word[SnowData+edx*4+2],ax
cmp word[SnowData+edx*4+2],200h
ja .nosdata
or byte[SnowVelDist+edx*2],8
.nosdata
inc edx
dec ecx
jnz .loop
ret
SECTION .bss
OkaySC resb 1
SECTION .data
cstempfname db 'tmpchtsr.___',0
SECTION .text
NEWSYM SaveSramData
; save sram
cmp byte[sramsavedis],1
je .nosram
cmp dword[ramsize],0
je .nosram
clim
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
xor esi,esi
xor edi,edi
mov edx,fnames+1
call Create_File
jc .failed
mov bx,ax
mov ecx,[ramsize]
mov edx,[sram]
call Write_File
call Close_File
.failed
stim
.nosram
call SaveCombFile
ret
NEWSYM ProcRewind
mov eax,KeyRewind
add eax,4
mov ebx,8
.loop
cmp byte[eax],'a'
jb .b
cmp byte[eax],'z'
ja .b
sub byte[eax],'a'-'A'
.b
inc eax
dec ebx
jnz .loop
sub eax,8
; 90,83,75,78,73,71
mov dword[.temp],44*65536*256+24*65536+72*256+40
mov word[.temp+4],41*256+50
add dword[.temp],34*65536*256+51*65536+11*256+50
add word[.temp+4],30*256+23
call .c
; 95,68,69,77,79,95
mov dword[.temp],25*65536*256+29*65536+31*256+62
mov word[.temp+4],43*256+18
add dword[.temp],52*65536*256+40*65536+37*256+33
add word[.temp+4],52*256+61
call .c
; 80,72,65,82,79,83
mov dword[.temp],11*65536*256+33*65536+24*256+35
mov word[.temp+4],52*256+30
add dword[.temp],71*65536*256+32*65536+48*256+45
add word[.temp+4],31*256+49
call .c
ret
.c
mov ebx,[.temp]
cmp [eax],ebx
jne .noteq
mov bx,[.temp+4]
cmp [eax+4],bx
jne .noteq
mov dword[eax],0
mov dword[eax+4],0
mov dword[eax+8],0
.noteq
ret
section .bss
.temp resd 2
section .text
%macro ProcessOneDigit 1
cmp dl,9
jbe %%notover
add dl,65-48-10
%%notover
add dl,48
mov byte[.message+%1],dl
xor edx,edx
div ebx
%endmacro
NEWSYM TestSent
mov eax,[NetSent]
xor edx,edx
mov ebx,16
div ebx
ProcessOneDigit 3
ProcessOneDigit 2
ProcessOneDigit 1
ProcessOneDigit 0
mov eax,[valuea]
xor edx,edx
mov ebx,16
div ebx
ProcessOneDigit 8
ProcessOneDigit 7
ProcessOneDigit 6
ProcessOneDigit 5
mov dword[GUICMessage],.message
mov dword[GUICTimer],100000
ret
SECTION .data
.message db 0,0,0,0,' ',0,0,0,0,0,0,0
SECTION .text
NEWSYM StartGUI
cmp byte[TripBufAvail],0
jne .notexttb
mov byte[Triplebufen],0
.notexttb
cmp byte[MMXSupport],1
jne .2xSaIdis
cmp byte[newgfx16b],0
je .2xSaIdis
jmp .no2xSaIdis
.2xSaIdis
mov byte[En2xSaI],0
mov byte[hqFilter],0
.no2xSaIdis
cmp byte[En2xSaI],0
je .no2xsaidis
mov byte[Triplebufen],0
.no2xsaidis
cmp byte[En2xSaI],0
je .no2xsaien
mov byte[hqFilter],0
mov byte[scanlines],0
mov byte[antienab],0
.no2xsaien
cmp byte[hqFilter],0
je .nohq
mov byte[En2xSaI],0
mov byte[scanlines],0
mov byte[antienab],0
.nohq
mov ecx,64
mov eax,SpecialLine
.slloop
mov dword[eax],0
add eax,4
dec ecx
jnz .slloop
cmp byte[OldWinPos],0
jne .okayow
xor esi,esi
mov ecx,17
.nextow
mov eax,[GUIwinposx2+esi*4]
mov [GUIwinposx+esi*4],eax
mov eax,[GUIwinposy2+esi*4]
mov [GUIwinposy+esi*4],eax
inc esi
dec ecx
jnz .nextow
mov byte[OldWinPos],1
mov eax,[pl1p209b]
mov [pl1p209],eax
.okayow
%ifndef __MSDOS__
mov dword[GUINetPlayMenuData+1],'INTE'
mov dword[GUINetPlayMenuData+5],'RNET'
mov dword[GUINetPlayMenuData+1+14],'----'
mov dword[GUINetPlayMenuData+5+14],'----'
mov byte[MenuDat5],0
mov byte[MenuDat5+1],2
%endif
;.notwinport
; copy old quickfilename to new quickfilename
cmp byte[prevloadl],0
jne .noconvertlfqm
mov byte[prevloadl],1
mov ecx,10
xor edx,edx
.convlfnlp
mov eax,ecx
dec eax
mov edx,eax
shl eax,9
shl edx,4
mov bl,16
.convlfnlp2
mov bh,[prevloadfname+edx]
mov [prevloadfnamel+eax],bh
inc edx
inc eax
dec bl
jnz .convlfnlp2
mov eax,ecx
dec eax
mov edx,eax
shl eax,9
shl edx,7
mov bl,128
.convlfnlp2b
mov bh,[prevloaddname+edx]
mov [prevloaddnamel+eax],bh
inc edx
inc eax
dec bl
jnz .convlfnlp2b
dec ecx
jnz .convlfnlp
.noconvertlfqm
mov byte[GUIOn],1
mov byte[GUIOn2],1
mov eax,[NumComboLocl]
cmp byte[GUIComboGameSpec],0
jne .local
mov eax,[NumComboGlob]
.local
mov [NumCombo],eax
call ResetTripleBuf
cmp dword[GUIwinposx+16*4],0
jne .notzero
mov dword[GUIwinposx+16*4],3
mov dword[GUIwinposy+16*4],22
.notzero
xor ecx,ecx
.joysloop
cmp dword[pl1ULk+ecx*4],80h
jbe .nojoystick
mov dword[pl1ULk+ecx*4],0
.nojoystick
inc ecx
cmp ecx,16
jne .joysloop
mov dword[GUICTimer],0
cmp byte[OldVolume],1
jne .notold
mov byte[OldVolume],0
mov byte[MusicRelVol],100
mov byte[cfgvolume],100
; Initialize volume
xor eax,eax
xor edx,edx
mov al,[MusicRelVol]
shl eax,7
mov ebx,100
div ebx
cmp al,127
jb .noofb
mov al,127
.noofb
mov [MusicVol],al
.notold
mov byte[CheatSearchStatus],0
cmp byte[newgfx16b],0
je .nong
mov ecx,255*144
mov eax,[vidbufferofsb]
.loop
mov dword[eax],0
add eax,4
dec ecx
jnz .loop
.nong
mov byte[ShowTimer],1
call Get_Date
cmp dh,12
jne .noxmas
cmp dl,25
jne .noxmas
mov byte[OkaySC],1
.noxmas
mov byte[lastmouseholded],1
cmp dword[GUIwinposx+15*4],0
jne .nomoviemenufix
mov dword[GUIwinposx+15*4],50
mov dword[GUIwinposy+15*4],50
.nomoviemenufix
mov ax,[resolutn]
mov [PrevResoln],ax
mov word[resolutn],224
mov byte[GUIPalConv],0
mov byte[MousePRClick],1
pushad
cmp byte[MouseInitOkay],1
je near .mousedone
mov byte[MouseInitOkay],1
cmp byte[MouseDis],1
je .mousedone
call Init_Mouse
cmp ax,0
jne .mousedone
mov byte[MouseDis],1
.mousedone
popad
mov eax,[KeyQuickLoad]
test byte[pressed+eax],1
jz near .noquickload
mov byte[GUIcmenupos],0
loadmenuopen 1
.noquickload
mov esi,pressed
mov ecx,64+32+8
.pclear
mov dword[esi],0
add esi,4
dec ecx
jnz .pclear
mov byte[pressed+1],2
mov byte[GUIescpress],1
; set Video cursor location
xor eax,eax
mov al,[cvidmode]
mov [GUIcurrentvideocursloc],eax
mov ebx,[NumVideoModes]
sub ebx,5
cmp eax,ebx
jbe .noof
mov eax,ebx
.noof
mov [GUIcurrentvideoviewloc],eax
; change to sram dir
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
call SaveSramData
cmp byte[SFXSRAM],0
je .nosfxsram
clim
mov edx,fnames+1
call Create_File
jc .nosfxramwrite
mov bx,ax
mov ecx,65536
mov edx,[sfxramdata]
call Write_File
call Close_File
.nosfxramwrite
stim
.nosfxsram
cmp byte[SETAEnable],0
je .nosetasram
clim
mov edx,fnames+1
call Create_File
jc .nosetaramwrite
mov bx,ax
mov ecx,4096
mov edx,[setaramdata]
call Write_File
call Close_File
.nosetaramwrite
stim
.nosetasram
call GUIQuickLoadUpdate
call LoadDetermine
; change dir to LoadDrive/LoadDir
mov dl,[LoadDrive]
mov ebx,LoadDir
call Change_Dir
cmp byte[NetFilename],0
je near .nofilenamenet
cmp byte[NetChatFirst],0
je near .filenamenetb
mov ebx,NetFilename
xor ecx,ecx
.fnetloop
cmp byte[ebx],'\'
jne .fnetloopb
mov ecx,ebx
.fnetloopb
inc ebx
cmp byte[ebx],0
jne .fnetloop
or ecx,ecx
jz near .nofilenamenet
mov byte[ecx],0
push ecx
mov dl,[LoadDrive]
cmp byte[NetFilename+1],':'
jne .nodrivenetb
mov dl,[NetFilename]
sub dl,'A'
.nodrivenetb
mov ebx,NetFilename
call Change_Dir
pop ecx
mov ebx,NetFilename
inc ecx
.nextnetl
mov al,[ecx]
mov [ebx],al
inc ecx
inc ebx
or al,al
jnz .nextnetl
jmp .nofilenamenet
.filenamenetb
mov dl,[LoadDrive]
cmp byte[NetFilename+1],':'
jne .nodrivenet
mov dl,[NetFilename]
sub dl,'A'
.nodrivenet
mov ebx,NetFilename
call Change_Dir
mov byte[NetFilename],0
.nofilenamenet
cmp byte[NetServer],0
je .noserverclient
mov byte[CNetType],15
mov byte[ModemProcess],40
cmp byte[NetServer],2
jne .noclient
mov byte[ModemProcess],41
.noclient
mov byte[NetServer],0
mov byte[WhichRemote],4
mov byte[GUIcmenupos],0
mov byte[GUIcrowpos],0
call loadnetopen
.noserverclient
cmp byte[NetNewNick],0
je .nonewnick
mov ebx,NetNewNick
mov ecx,ChatNick
.nickloop
mov al,[ebx]
mov [ecx],al
inc ebx
inc ecx
or al,al
jnz .nickloop
mov byte[NetNewNick],0
.nonewnick
;NEWSYM NetChatFirst, db 0
;NEWSYM NetServer, db 0
;NEWSYM NetQuitAfter, db 0
;NEWSYM NetNewNick, times 16 db 0
;NEWSYM NetFilename, times 512 db 0
cmp byte[CNetType],20
je near .noautostate
cmp byte[AutoState],0
je .noautostate
cmp byte[romloadskip],0
jne .noautostate
call SaveSecondState
.noautostate
GUIInitIRQs
cmp byte[CNetType],20
jne near .nostat20
test byte[NetQuit],80h
jnz near .nostat20
mov byte[GUIcmenupos],0
mov byte[GUIcrowpos],0
call loadnetopen
%ifdef __MSDOS__
cmp byte[WhichRemote],1
jne .yesdcd
call ModemCheckDCD
cmp al,1
jne near .nostat20
.yesdcd
%endif
mov byte[RestoreValues],1
pushad
mov dword[CBackupPos],0
call BackupCVFrame
popad
call DisableSUDPPacket
call Wait1SecWin
; sync
call PreparePacket
mov al,254
call RemoteSendChar
call SendPacket
call PreparePacket
mov al,254
call RemoteSendChar
call SendPacket
call PreparePacket
mov al,254
call RemoteSendChar
call SendPacket
call PreparePacket
mov al,254
call RemoteSendChar
call SendPacket
mov dword[ModemPTimer],4*32
.nochar
pushad
call JoyRead
popad
call RemoteGetChar
cmp dword[ModemPTimer],0
je near .nostat20
cmp dh,0
je .nochar
cmp dl,254
jne .nochar
call PreparePacket
mov al,253
call RemoteSendChar
call SendPacket
.nocharc
pushad
call JoyRead
popad
call RemoteGetChar
cmp dword[ModemPTimer],0
je near .nostat20
cmp dh,0
je .nocharc
cmp dl,253
jne .nocharc
call PreparePacket
mov al,1
call RemoteSendChar
call SendPacket
call ClearUDPStuff
mov byte[RemoteCommand],1
mov byte[HoldCommand],1
cmp byte[NetLoadState],1
jne .notreceive
mov byte[CNetType],22
.noreceivestate
pushad
call JoyRead
popad
call RemoteGetChar
cmp dh,0
je .noreceivestate
cmp dl,14
jne .noreceivestate
call loadstaterecvinit
.notreceive
cmp byte[NetLoadState],2
jne .notsend
call NetLoadStuff
.notsend
.nostat20
cmp byte[GUIwinptr],0
jne .nomenuopen
cmp byte[lastcursres],1
je .nomenuchange
mov byte[GUIcmenupos],2
mov byte[GUIcrowpos],0
mov dword[GUICYLocPtr],MenuDat2
cmp byte[lastcursres],0
je .nomenuchange
.nomenuopen
mov byte[GUIcmenupos],0
.nomenuchange
cmp byte[GUIwinactiv+1],0
je .noloadrefresh
call GetLoadData
.noloadrefresh
mov byte[GUIHold],0
; clear 256 bytes from hirestiledat
mov esi,hirestiledat
mov ecx,256
.loophires
mov byte[esi],0
inc esi
dec ecx
jnz .loophires
mov byte[curblank],00h
call InitGUI
cmp byte[CheatWinMode],0
je near .csskip
; change to sram dir
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
; Load Cheat Search File
mov edx,cstempfname
call Open_File
jc .csskipb
mov bx,ax
mov edx,[vidbuffer]
add edx,129600
mov ecx,65536*2+32768
call Read_File
call Close_File
.csskipb
; change dir to LoadDrive/LoadDir
mov dl,[LoadDrive]
mov ebx,LoadDir
call Change_Dir
.csskip
mov byte[GUIQuit],0
.nokey
cmp byte[CNetType],21
je .noquit
cmp byte[CNetType],22
jne .yesquit
.noquit
mov byte[GUIQuit],0
.yesquit
cmp byte[GUIQuit],2
je near .exit
cmp byte[GUIQuit],1
je near .exitgui
mov byte[GUIQuit],0
cmp byte[MouseDis],1
je .mousedis2
call ProcessMouse
cmp byte[videotroub],1
jne .notrouble
ret
.notrouble
.mousedis2
call GUIUnBuffer
cmp byte[CNetType],20
je .nowater
cmp byte[CNetType],21
je .nowater
cmp byte[CNetType],22
je .nowater
cmp byte[GUIEffect],1
jne .nosnow
call DrawSnow
.nosnow
cmp byte[GUIEffect],2
jne .nowater
call DrawWater
.nowater
cmp byte[GUIEffect],3
jne .nowater2
call DrawWater
.nowater2
cmp byte[GUIEffect],4
jne .nosmoke
; call DrawSmoke
call DrawBurn
.nosmoke
; call TestSent
cmp byte[CNetType],20
jne .noreceive
cmp byte[NetChatFirst],0
je .noloadbeforechat
mov eax,NetFilename
call GUIloadfilename.nocnettype
mov byte[sramsavedis],1
call transfersram
mov byte[NetChatFirst],0
.noloadbeforechat
cmp byte[GUIcmenupos],0
jne .nomenuout2
cmp byte[GUIwinptr],0
jne .nomenuout2
cmp byte[netlastloaded],1
je .openmenu
mov byte[GUIcmenupos],2
mov byte[GUIcrowpos],0
jmp .nomenuout2
.openmenu
mov byte[netlastloaded],0
call loadnetopen
.nomenuout2
call RemoteGetChar
cmp dh,0
jne .received
mov dl,1
.received
call ProcessRemoteCommand
jmp .noreceive2
.noreceive
mov byte[HoldCommand],0
.noreceive2
cmp byte[CNetType],21
jne .noloadstatesend
call loadstatesend
.noloadstatesend
cmp byte[CNetType],22
jne .noloadstaterecv
call loadstaterecv
.noloadstaterecv
cmp byte[CNetType],15
je .modem
cmp byte[CNetType],12
je .modem
cmp byte[CNetType],11
je .modem
cmp byte[CNetType],10
jne near .nomodem
.modem
call ProcessModem
%ifdef __MSDOS__
cmp byte[Connected],1
je near .nomodem
call ModemGetChar
cmp dh,0
je .nomodem
cmp byte[ModemOKStat],0
jne .foundokay
mov byte[ModemOKStat],1
jmp .skipstat
.foundokay
cmp byte[ModemOKStat],1
jne .nostat0
cmp dl,13
jne .nostat0
inc byte[ModemOKStat]
jmp .skipstat
.nostat0
cmp byte[ModemOKStat],2
jne .nostat1
cmp dl,'O'
jne .nostat1
inc byte[ModemOKStat]
jmp .skipstat
.nostat1
cmp byte[ModemOKStat],3
jne .nostat2
cmp dl,'K'
jne .nostat2
inc byte[ModemOKStat]
jmp .skipstat
.nostat2
.skipstat
mov dh,0
call NetAddChar
%endif
.nomodem
cmp dword[GUIEditStringcWin],0
je .noblink
cmp dword[GUIEditStringcLen],0
je .noblink
mov eax,[GUIEditStringcLen]
cmp dword[GUIEditStringLTxt],8
jb .noblinka
mov byte[eax],'_'
mov byte[eax+1],0
mov dword[GUIEditStringLstb],1
.noblinka
cmp dword[GUIEditStringLTxt],0
jne .noblink
mov dword[GUIEditStringLTxt],16
.noblink
call DisplayBoxes
cmp dword[GUIEditStringLstb],1
jne .notblinked
mov dword[GUIEditStringLstb],0
mov eax,[GUIEditStringcLen]
mov byte[eax],0
.notblinked
call DisplayMenu
cmp byte[MouseDis],1
je .mousedis3
call DrawMouse
.mousedis3
cmp byte[FirstTimeData],0
jne .nofirsttime
call guifirsttimemsg
mov byte[FirstTimeData],1
.nofirsttime
cmp dword[GUICTimer],0
je .notimer
GUIOuttext 21,211,[GUICMessage],50
GUIOuttext 20,210,[GUICMessage],63
.notimer
call vidpastecopyscr
call GUIgetcurrentinput
jmp .nokey
.exitgui
cmp byte[CNetType],20
jne near .nostat20b2
call PreparePacket
mov al,255
call RemoteSendChar
call SendPacket
call PreparePacket
mov al,255
call RemoteSendChar
call SendPacket
call PreparePacket
mov al,255
call RemoteSendChar
call SendPacket
.nostat20b2
GUIDeInitIRQs
mov ax,[PrevResoln]
mov [resolutn],ax
jmp endprog
.exit
mov edi,[spcBuffera]
mov ecx,65536
xor eax,eax
rep stosd
mov edi,spcRamcmp
mov ecx,65536/4
xor eax,eax
rep stosd
GUIDeInitIRQs
call ClearScreen
cmp byte[cbitmode],0
jne .nomakepal
call makepal
.nomakepal
mov word[t1cc],1
mov byte[chaton],0
mov dword[chatstrL],0
mov dword[chatLpos],0
mov dword[chatstrR],0
mov dword[chatRTL],0
cmp byte[CNetType],20
jne near .nostat20b
mov al,10
sub al,[Latency]
cmp byte[Latency],4
jb .nolatency
mov al,7
.nolatency
mov [BackStateSize],al
call ResetExecStuff
mov byte[MultiTap],1
cmp byte[pl3neten],0
jne .mtap
cmp byte[pl4neten],0
jne .mtap
cmp byte[pl5neten],0
jne .mtap
.nomtap
mov byte[MultiTap],0
.mtap
cmp byte[RestoreValues],1
jne .norestoreval
pushad
mov dword[PBackupPos],0
call RestoreCVFrame
popad
.norestoreval
mov dword[nmiprevaddrl],0
mov dword[nmiprevaddrh],0
mov dword[nmirept],0
mov dword[nmiprevline],224
mov dword[nmistatus],0
mov dword[spcnumread],0
mov dword[spchalted],-1
mov byte[NextLineCache],0
mov byte[DSPMem+08h],0
mov byte[DSPMem+18h],0
mov byte[DSPMem+28h],0
mov byte[DSPMem+38h],0
mov byte[DSPMem+48h],0
mov byte[DSPMem+58h],0
mov byte[DSPMem+68h],0
mov byte[DSPMem+78h],0
mov byte[netdelayed],0
mov dword[cnetptrhead],0
mov dword[cnetptrtail],0
mov dword[prevp1net],0
mov dword[prevp2net],0
mov dword[prevp3net],0
mov dword[prevp4net],0
mov dword[prevp5net],0
mov byte[BackState],1
mov dword[CBackupPos],0
mov dword[PBackupPos],0
mov dword[PPValue],0
mov dword[DPValue],0
mov byte[CurRecv],0
mov dword[NetQuitter],0
mov dword[LatencyV],0
mov dword[LatencyV+4],0
mov dword[LatencyV+8],0
mov dword[LatencyV+12],0
mov dword[LatencyRecvPtr],0
mov dword[LatencySendPtr],0
mov eax,cnetplaybuf
mov ecx,512
.loop20
mov byte[eax],0
inc eax
dec ecx
jnz .loop20
mov al,[Latency]
mov [LatencyLeft],al
mov byte[NetSwap],0
mov dword[CBackupPos],0
mov dword[PBackupPos],0
mov ebx,[romdata]
mov ecx,[NumofBanks]
shl ecx,15
xor eax,eax
or ecx,ecx
jz .nocsumloop
.csumloop
add al,[ebx]
adc ah,0
inc ebx
dec ecx
jnz .csumloop
.nocsumloop
mov [CheckSumVal],eax
mov ebx,eax
; sync with modem
call PreparePacket
mov al,30
call RemoteSendChar
mov al,230
call RemoteSendChar
mov al,[CheckSumVal]
call RemoteSendChar
mov al,[CheckSumVal+1]
call RemoteSendChar
call SendPacket
.nocharb
pushad
call JoyRead
popad
; cmp byte[pressed+1],1
; je near .faileda
call RemoteGetChar
cmp dh,0
je .nocharb
cmp dl,230
jne .nocharb
.nocharb2
call RemoteGetChar
cmp dh,0
je .nocharb2
cmp dl,[CheckSumVal]
jne .wrongcs
.nocharb3
call RemoteGetChar
cmp dh,0
je .nocharb3
cmp dl,[CheckSumVal+1]
je .okaychat
.wrongcs
mov esi,WrongCheckSum
call WritetochatBuffer
jmp StartGUI
.okaychat
call PreparePacket
mov al,229
call RemoteSendChar
call SendPacket
.nocharb5
pushad
call JoyRead
popad
; cmp byte[pressed+1],1
; je near .failedb
call RemoteGetChar
cmp dh,0
je .nocharb5
cmp dl,229
jne .nocharb5
.nostat20b
call EnableSUDPPacket
mov byte[ChatProgress],0
mov dword[RecvProgress],0
; get LoadDrive/LoadDir
mov ebx,LoadDir
mov edx,LoadDrive
call Get_Dir
; change dir to InitDrive/InitDir
mov dl,[InitDrive]
mov ebx,InitDir
; save config
call Change_Dir
call createnewcfg
call GUISaveVars
; change dir to SRAMDrive/SRAMDir
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
mov byte[MousePRClick],1
mov byte[prevbright],0
mov ax,[PrevResoln]
mov [resolutn],ax
mov byte[CheatOn],0
cmp dword[NumCheats],0
je .nocheats
mov byte[CheatOn],1
.nocheats
cmp byte[CopyRamToggle],1
jne .nocopyram
mov byte[CopyRamToggle],0
mov eax,dword[vidbuffer]
add eax,129600
; copy 128k ram
mov ebx,[wramdata]
mov ecx,32768
.loopcr
mov edx,[ebx]
mov [eax],edx
add ebx,4
add eax,4
dec ecx
jnz .loopcr
.nocopyram
cmp byte[CheatWinMode],2
jne .notview
mov byte[CheatWinMode],1
.notview
cmp byte[CheatWinMode],0
je .csskip2
; Save Cheat Search File
mov edx,cstempfname
call Create_File
jc .csskip2
mov bx,ax
mov edx,[vidbuffer]
add edx,129600
mov ecx,65536*2+32768
call Write_File
call Close_File
.csskip2
mov edi,[vidbuffer]
mov ecx,288*120
xor eax,eax
rep stosd
mov ecx,256*144
mov eax,[vidbufferofsb]
.loopcl
mov dword[eax],0
add eax,4
dec ecx
jnz .loopcl
mov al,[cfgsoundon]
mov [soundon],al
mov al,[cfgStereoSound]
mov [StereoSound],al
mov al,[cfgSoundQuality]
mov [SoundQuality],al
call AdjustFrequency
mov byte[GUIOn],0
mov byte[GUIOn2],0
mov byte[GUIReset],0
mov dword[StartLL],0
mov dword[StartLR],0
mov byte[NetLoadState],0
jmp continueprog
.faileda
call WinErrorA
jmp continueprog
.failedb
call WinErrorB
jmp continueprog
SECTION .bss
CheckSumVal resd 1
SECTION .data
WrongCheckSum db 10,13,'ROM Data Mismatch',10,13,10,13,0
SECTION .text
SRAMDirc:
; get LoadDrive/LoadDir
mov ebx,LoadDir
mov edx,LoadDrive
call Get_Dir
; change to sram dir
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
ret
LOADDir:
mov dl,[LoadDrive]
mov ebx,LoadDir
call Change_Dir
ret
guifirsttimemsg:
xor ebx,ebx
mov ecx,256
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
mov byte[pressed+2Ch],0
.again
GUIBox 43,75,213,163,160
GUIBox 43,75,213,75,162
GUIBox 43,75,43,163,161
GUIBox 213,75,213,163,159
GUIBox 43,163,213,163,158
GUIOuttext 56,81,guiftimemsg1,220-15
GUIOuttext 55,80,guiftimemsg1,220
GUIOuttext 56,96,guiftimemsg2,220-15
GUIOuttext 55,95,guiftimemsg2,220
GUIOuttext 56,104,guiftimemsg3,220-15
GUIOuttext 55,103,guiftimemsg3,220
GUIOuttext 56,112,guiftimemsg4,220-15
GUIOuttext 55,111,guiftimemsg4,220
GUIOuttext 56,120,guiftimemsg5,220-15
GUIOuttext 55,119,guiftimemsg5,220
GUIOuttext 56,128,guiftimemsg6,220-15
GUIOuttext 55,127,guiftimemsg6,220
GUIOuttext 56,136,guiftimemsg7,220-15
GUIOuttext 55,135,guiftimemsg7,220
GUIOuttext 56,151,guiftimemsg8,220-15
GUIOuttext 55,150,guiftimemsg8,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
call JoyRead
cmp byte[pressed+2Ch],0
jne .pressedokay
jmp .again
.pressedokay
.again2
call Check_Key
or al,al
jz .nokey
call Get_Key
jmp .again2
.nokey
cmp byte[MouseDis],1
je .mousedis2
push ebx
; mov eax,0Bh
; int 33h
pop ebx
.mousedis2
ret
SECTION .data
guiftimemsg1 db 'ONE TIME USER REMINDER :',0
guiftimemsg2 db 'PLEASE BE SURE TO READ',0
guiftimemsg3 db 'GUINOTES.TXT FOR AN',0
guiftimemsg4 db 'IMPORTANT REMINDER.',0
guiftimemsg5 db 'ALSO, WHENEVER YOU HAVE',0
guiftimemsg6 db 'PROBLEMS, BE SURE TO READ',0
guiftimemsg7 db 'ZSNES.FAQ AND README.TXT',0
guiftimemsg8 db 'PRESS "Z" TO CONTINUE.',0
SECTION .text
guimustrestartmsg:
xor ebx,ebx
mov ecx,256
.a
cmp byte[pressed+ebx],1
jne .npr1
mov byte[pressed+ebx],2
.npr1
inc ebx
dec ecx
jnz .a
mov byte[pressed+2Ch],0
.again
GUIBox 43,87,213,151,160
GUIBox 43,87,213,87,162
GUIBox 43,87,43,151,161
GUIBox 213,87,213,151,159
GUIBox 43,151,213,151,158
GUIOuttext 56,92,guiqtimemsg1,220-15
GUIOuttext 55,91,guiqtimemsg1,220
GUIOuttext 56,100,guiqtimemsg2,220-15
GUIOuttext 55,99,guiqtimemsg2,220
GUIOuttext 56,108,guiqtimemsg3,220-15
GUIOuttext 55,107,guiqtimemsg3,220
GUIOuttext 56,116,guiqtimemsg4,220-15
GUIOuttext 55,115,guiqtimemsg4,220
GUIOuttext 56,139,guiqtimemsg8,220-15
GUIOuttext 55,138,guiqtimemsg8,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
call JoyRead
mov byte[pressed+2Ch],0
call JoyRead
xor ebx,ebx
mov ecx,256+128+64
.b
cmp byte[pressed+ebx],1
je .pressedokay
inc ebx
dec ecx
jnz .b
jmp .again
.pressedokay
.again2
call Check_Key
or al,al
jz .nokey
call Get_Key
jmp .again2
.nokey
cmp byte[MouseDis],1
je .mousedis2
push ebx
; mov eax,0Bh
; int 33h
pop ebx
.mousedis2
mov byte[GUIQuit],1
ret
SECTION .data
guiqtimemsg1 db 'ZSNES MUST BE RESTARTED',0
guiqtimemsg2 db 'TO USE THIS OPTION.',0
guiqtimemsg3 db 'THIS PROGRAM WILL NOW',0
guiqtimemsg4 db 'EXIT.',0
guiqtimemsg8 db 'PRESS ANY KEY.',0
SECTION .text
guiprevideo:
xor ebx,ebx
mov ecx,256
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
GUIBox 43,90,213,163,160
GUIBox 43,90,213,90,162
GUIBox 43,90,43,163,161
GUIBox 213,90,213,163,159
GUIBox 43,163,213,163,158
GUIOuttext 56,96,guiprevidmsg1,220-15
GUIOuttext 55,95,guiprevidmsg1,220
GUIOuttext 56,104,guiprevidmsg2,220-15
GUIOuttext 55,103,guiprevidmsg2,220
GUIOuttext 56,112,guiprevidmsg3,220-15
GUIOuttext 55,111,guiprevidmsg3,220
GUIOuttext 56,120,guiprevidmsg4,220-15
GUIOuttext 55,119,guiprevidmsg4,220
GUIOuttext 56,128,guiprevidmsg5,220-15
GUIOuttext 55,127,guiprevidmsg5,220
GUIOuttext 56,136,guiprevidmsg6,220-15
GUIOuttext 55,135,guiprevidmsg6,220
GUIOuttext 56,151,guiprevidmsg7,220-15
GUIOuttext 55,150,guiprevidmsg7,220
call vidpastecopyscr
mov byte[pressed+2Ch],0
.again
call JoyRead
xor ebx,ebx
mov ecx,256+128+64
.b
cmp byte[pressed+ebx],0
jne .pressedokay
inc ebx
dec ecx
jnz .b
cmp byte[MouseDis],1
je .mousedis
call Get_MouseData
test bx,01h
jnz .pressedokay
.mousedis
jmp .again
.pressedokay
.again2
call Check_Key
or al,al
jz .nokey
call Get_Key
jmp .again2
.nokey
cmp byte[MouseDis],1
je .mousedis2
push ebx
; mov eax,0Bh
; int 33h
pop ebx
.mousedis2
ret
SECTION .data
guiprevidmsg1 db 'ZSNES WILL NOW ATTEMPT',0
guiprevidmsg2 db 'TO CHANGE YOUR VIDEO',0
guiprevidmsg3 db 'MODE. IF THE CHANGE',0
guiprevidmsg4 db 'IS UNSUCCESSFUL, WAIT',0
guiprevidmsg5 db '10 SECONDS AND VIDEO',0
guiprevidmsg6 db 'MODE WILL BE RESET',0
guiprevidmsg7 db 'PRESS ANY KEY',0
SECTION .text
guipostvideo:
mov ecx,255*144
mov eax,[vidbufferofsb]
.loop
mov dword[eax],0FFFFFFFFh
add eax,4
dec ecx
jnz .loop
xor ebx,ebx
mov ecx,256
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
mov dword[GUIkeydelay],36*10
.pressedfail
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
GUIBox 43,90,213,163,160
GUIBox 43,90,213,90,162
GUIBox 43,90,43,163,161
GUIBox 213,90,213,163,159
GUIBox 43,163,213,163,158
GUIOuttext 56,96,guipostvidmsg1,220-15
GUIOuttext 55,95,guipostvidmsg1,220
GUIOuttext 56,151,guipostvidmsg2,220-15
GUIOuttext 55,150,guipostvidmsg2,220
call vidpastecopyscr
; Wait for all mouse and input data to be 0
call JoyRead
xor ebx,ebx
mov ecx,256+128+64
.b2
cmp byte[pressed+ebx],0
jne near .pressedfail
inc ebx
dec ecx
jnz .b2
cmp byte[MouseDis],1
je .mousedis3
call Get_MouseData
test bx,01h
jnz near .pressedfail
.mousedis3
.again
call JoyRead
xor ebx,ebx
mov ecx,256+128+64
.b
cmp byte[pressed+ebx],0
jne .pressedokay
inc ebx
dec ecx
jnz .b
cmp byte[MouseDis],1
je .mousedis
call Get_MouseData
test bx,01h
jnz .pressedokay
.mousedis
cmp dword[GUIkeydelay],0
je .pressedokay
jmp .again
.pressedokay
.again2
call Check_Key
or al,al
jz .nokey
call Get_Key
jmp .again2
.nokey
cmp byte[MouseDis],1
je .mousedis2
push ebx
; mov eax,0Bh
; int 33h
pop ebx
.mousedis2
mov byte[GUIpclicked],1
ret
SECTION .data
guipostvidmsg1 db 'VIDEO MODE CHANGED.',0
guipostvidmsg2 db 'PRESS ANY KEY',0
SECTION .text
guipostvideofail:
mov dword[guipostvidptr],guipostvidmsg3b
mov byte[guipostvidmsg3b],0
mov byte[guipostvidmsg4b],0
mov byte[guipostvidmsg5b],0
mov eax,[ErrorPointer]
mov ebx,eax
.loop
cmp byte[ebx],0
je .found
cmp byte[ebx],'$'
je .found
inc ebx
jmp .loop
.found
mov edx,ebx
sub edx,eax
.detnext
or edx,edx
jz .notext
cmp edx,25
jbe .copytext
.nospace
dec edx
cmp byte[eax+edx],32
jne .nospace
jmp .detnext
.copytext
push ebx
mov ecx,[guipostvidptr]
.copytextloop
mov bl,[eax]
cmp bl,'$'
jne .notdol
mov bl,0
.notdol
mov [ecx],bl
inc eax
inc ecx
dec edx
jnz .copytextloop
mov byte[ecx],0
pop ebx
add dword[guipostvidptr],26
cmp byte[eax],0
je .notext
cmp byte[eax],'$'
je .notext
inc eax
jmp .found
.notext
xor ebx,ebx
mov ecx,256
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
GUIBox 43,90,213,163,160
GUIBox 43,90,213,90,162
GUIBox 43,90,43,163,161
GUIBox 213,90,213,163,159
GUIBox 43,163,213,163,158
GUIOuttext 56,96,guipostvidmsg1b,220-15
GUIOuttext 55,95,guipostvidmsg1b,220
GUIOuttext 56,108,guipostvidmsg2b,220-15
GUIOuttext 55,107,guipostvidmsg2b,220
GUIOuttext 56,119,guipostvidmsg3b,220-15
GUIOuttext 55,118,guipostvidmsg3b,220
GUIOuttext 56,129,guipostvidmsg4b,220-15
GUIOuttext 55,128,guipostvidmsg4b,220
GUIOuttext 56,139,guipostvidmsg5b,220-15
GUIOuttext 55,138,guipostvidmsg5b,220
GUIOuttext 56,152,guipostvidmsg8b,220-15
GUIOuttext 55,151,guipostvidmsg8b,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
%ifndef __LINUX__
mov dword[GUIkeydelay],0FFFFFFFFh
%else
mov dword[GUIkeydelay],0x0
%endif
jmp guipostvideo.pressedfail
SECTION .data
guipostvidmsg1b db 'VIDEO MODE CHANGE FAILED.',0
guipostvidmsg2b db 'UNABLE TO INIT VESA2:',0
guipostvidmsg3b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0
guipostvidmsg4b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0
guipostvidmsg5b db 'AAAAAAAAAAAAAAAAAAAAAAAAA',0
guipostvidmsg8b db 'PRESS ANY KEY',0
SECTION .bss
guipostvidptr resd 1
SECTION .text
GUILoadManualDir
mov ebx,GUILoadTextA
mov [ManualCPtr],ebx
cmp byte[ebx],0
je near .nofindfile
xor eax,eax
.next
cmp byte[ebx],':'
jne .nocolon
mov eax,ebx
.nocolon
inc ebx
cmp byte[ebx],0
jne .next
or eax,eax
jz .nomorecolon
cmp eax,GUILoadTextA
je .invalidcolon
mov bl,[eax-1]
cmp bl,'a'
jb .nolower
cmp bl,'z'
ja .nolower
sub bl,'a'-'A'
.nolower
cmp bl,'A'
jb .invalidcolon
cmp bl,'Z'
ja .invalidcolon
sub bl,'A'
mov dl,bl
push eax
call Change_Drive
pop eax
mov byte[ManualStatus],1
.invalidcolon
inc eax
mov [ManualCPtr],eax
.nomorecolon
mov ebx,[ManualCPtr]
cmp byte[ebx],0
je near .finish
xor eax,eax
.next2
cmp byte[ebx],'\'
jne .nobackslash
mov eax,ebx
.nobackslash
inc ebx
cmp byte[ebx],0
jne .next2
or eax,eax
jz .finish
inc eax
mov cl,[eax]
mov byte[eax],0
push ecx
push eax
mov edx,[ManualCPtr]
call Change_Single_Dir
jc .nosuchdir
mov byte[ManualStatus],1
.nosuchdir
pop eax
pop ecx
mov [eax],cl
mov [ManualCPtr],eax
.finish
mov edx,[ManualCPtr]
call Change_Single_Dir
jc .notdir
mov byte[ManualStatus],1
jmp .nomoredir
.notdir
call .nomoredir
mov edx,[ManualCPtr]
cmp byte[edx],0
je .nofindfile
; otherwise set ManualStatus to 2
mov byte[ManualStatus],2
mov dword[GUIcurrentfilewin],0
.nofindfile
ret
.nomoredir
; refresh dir if necessary
cmp byte[ManualStatus],1
jne .norefresh
call GetLoadData.a
.norefresh
ret
SECTION .bss
ManualCPtr resd 1
ManualStatus resb 1
NEWSYM MovieCounter, resd 1
SECTION .data
UnableMovie2 db 'MUST PLAY WITH SOUND OFF',0
UnableMovie3 db 'MUST PLAY WITH SOUND ON',0
SECTION .text
MoviePlay:
cmp byte[CNetType],20
je near .dontplay
mov byte[GUICBHold],0
mov dword[MovieCounter],0
cmp byte[MovieProcessing],0
jne near .dontplay
mov byte[GUIQuit],2
mov ebx,[statefileloc]
mov eax,[fnamest+ebx-3]
push eax
mov dword[fnamest+ebx-3],'.zmv'
mov al,[CMovieExt]
mov byte[fnamest+ebx],al
call ChangetoSRAMdir
mov dword[Totalbyteloaded],0
call loadstate2
mov edx,fnamest+1
call Open_File
jc near .notexist
mov bx,ax
mov [MovieFileHand],bx
mov cx,[Totalbyteloaded+2]
mov dx,[Totalbyteloaded]
call File_Seek
mov edx,RecData
mov ecx,16
call Read_File
cmp byte[RecData+2],1
jne .noextra
mov eax,[RecData+3]
mov [timer2upd],eax
mov eax,[RecData+7]
mov [curexecstate],eax
mov dword[nmiprevaddrl],0
mov dword[nmiprevaddrh],0
mov dword[nmirept],0
mov dword[nmiprevline],224
mov dword[nmistatus],0
mov dword[spcnumread],0
mov dword[spchalted],-1
mov byte[NextLineCache],0
.noextra
mov al,[RecData]
cmp al,[soundon]
jne near .soundisoff
cmp dword[ramsize],0
je .noram
mov edx,[sram]
mov ecx,[ramsize]
call Read_File
.noram
mov byte[MovieProcessing],1
.skip
mov dword[PJoyAOrig],0
mov dword[PJoyBOrig],0
mov dword[PJoyCOrig],0
mov dword[PJoyDOrig],0
mov dword[PJoyEOrig],0
mov byte[sramsavedis],1
mov byte[UseRemoteSRAMData],0
mov byte[DSPMem+08h],0
mov byte[DSPMem+18h],0
mov byte[DSPMem+28h],0
mov byte[DSPMem+38h],0
mov byte[DSPMem+48h],0
mov byte[DSPMem+58h],0
mov byte[DSPMem+68h],0
mov byte[DSPMem+78h],0
.notexist
call ChangetoLOADdir
pop eax
mov ebx,[statefileloc]
mov [fnamest+ebx-3],eax
.dontplay
ret
.soundisoff
mov dword[Msgptr],UnableMovie2
cmp byte[soundon],0
jne .soundon
mov dword[Msgptr],UnableMovie3
.soundon
mov eax,[MsgCount]
mov [MessageOn],eax
call Close_File
pop eax
ret
SECTION .bss
NEWSYM Totalbyteloaded, resd 1
NEWSYM sramsavedis, resb 1
SECTION .data
DevicePtr dd pl1selk,pl2selk,pl3selk,pl4selk,pl5selk
SECTION .text
CheckMenuItemHelp:
mov al,[GUIcmenupos]
mov [GUIpmenupos],al
mov byte[GUIcmenupos],0
cmp byte[GUIwinactiv+edx],1
je .menuontop
xor eax,eax
mov al,[GUIwinptr]
inc byte[GUIwinptr]
mov byte[GUIwinorder+eax],dl
mov byte[GUIwinactiv+edx],1
cmp byte[resetposn],1
jne .nomenuitem
mov eax,[GUIwinposxo+edx*4]
mov [GUIwinposx+edx*4],eax
mov eax,[GUIwinposyo+edx*4]
mov [GUIwinposy+edx*4],eax
jmp .nomenuitem
.menuontop
xor eax,eax
; look for match
.notfoundyet
mov bl,byte[GUIwinorder+eax]
cmp bl,dl
je .nextfind
inc eax
jmp .notfoundyet
.nextfind
inc eax
cmp al,[GUIwinptr]
je .foundend
mov cl,[GUIwinorder+eax]
mov [GUIwinorder+eax-1],cl
jmp .nextfind
.foundend
mov byte[GUIpclicked],0
mov [GUIwinorder+eax-1],bl
.nomenuitem
ret
%macro GUICheckMenuItem 2
mov edx,%1
cmp byte[GUIcrowpos],%2
jne near %%nomenuitem
call CheckMenuItemHelp
%%nomenuitem
%endmacro
%macro checkqloadvalue 1
cmp byte[GUIcrowpos],%1
jne %%skip
mov esi,prevloaddnamel+%1*512
cmp byte[esi+1],0
je %%notvalid
mov edi,prevloadfnamel+%1*512
mov ebx,prevloadnames+%1*16
mov ecx,%1
call loadquickfname
%%notvalid
ret
%%skip
%endmacro
GUITryMenuItem:
cmp byte[GUIcmenupos],1
jne near .noquickload
checkqloadvalue 0
checkqloadvalue 1
checkqloadvalue 2
checkqloadvalue 3
checkqloadvalue 4
checkqloadvalue 5
checkqloadvalue 6
checkqloadvalue 7
checkqloadvalue 8
checkqloadvalue 9
cmp byte[GUIcrowpos],11
jne .skipswitch
xor byte[prevlfreeze],1
cmp byte[prevlfreeze],0
je .off
mov byte[GUIPrevMenuData.onoff+15],'O'
mov byte[GUIPrevMenuData.onoff+16],'N'
mov byte[GUIPrevMenuData.onoff+17],' '
jmp .on
.off
mov byte[GUIPrevMenuData.onoff+15],'O'
mov byte[GUIPrevMenuData.onoff+16],'F'
mov byte[GUIPrevMenuData.onoff+17],'F'
.on
.skipswitch
cmp byte[GUIcrowpos],12
jne .skipclear
cmp byte[prevlfreeze],0
jne .skipclear
mov edi,prevloadnames
mov eax,20202020h
mov ecx,4*10
rep stosd
mov edi,prevloaddnamel
xor eax,eax
mov ecx,128*10
rep stosd
mov edi,prevloadfnamel
mov eax,0 ;20202020h
mov ecx,128*10
rep stosd
call GUIQuickLoadUpdate
ret
.skipclear
.noquickload
cmp byte[GUIcmenupos],2
jne near .nomain
GUICheckMenuItem 1, 0 ; Load
cmp byte[GUIcrowpos],0
jne .noloadrefresh
jmp GetLoadData
.noloadrefresh
cmp byte[romloadskip],0
jne near .noromloaded
cmp byte[GUIcrowpos],1 ; Run
jne .norun
cmp byte[romloadskip],0
jne .dontquit
mov byte[GUIQuit],2
.dontquit
ret
.norun
cmp byte[CNetType],21
je near .noreset
cmp byte[CNetType],22
je near .noreset
GUICheckMenuItem 12, 2 ; Reset
cmp byte[GUIcrowpos],2
jne .noreset
mov byte[GUICResetPos],1
.noreset
; cmp byte[OSPort],3
; je .win32state
; cmp byte[CNetType],20
; je near .noromloaded
;.win32state
cmp byte[CNetType],21
je near .noromloaded
cmp byte[CNetType],22
je near .noromloaded
cmp byte[GUIcrowpos],4
jne .nosavestate
mov byte[GUIStatesText5],0
mov byte[GUICStatePos],1
.nosavestate
cmp byte[GUIcrowpos],5
jne .noloadstate
mov byte[GUIStatesText5],1
mov byte[GUICStatePos],1
.noloadstate
GUICheckMenuItem 14, 4 ; Save State
GUICheckMenuItem 14, 5 ; Load State
GUICheckMenuItem 2, 6 ; Select State
.noromloaded
cmp byte[GUIcrowpos],8
jne .noquit
mov byte[GUIQuit],1
.noquit
.nomain
cmp byte[GUIcmenupos],3
jne near .noconfig
GUICheckMenuItem 3, 0
GUICheckMenuItem 3, 1
GUICheckMenuItem 3, 2
GUICheckMenuItem 3, 3
GUICheckMenuItem 3, 4
cmp byte[GUIcrowpos],0
jne .noplay1
mov byte[cplayernum],0
.noplay1
cmp byte[GUIcrowpos],1
jne .noplay2
mov byte[cplayernum],1
.noplay2
cmp byte[GUIcrowpos],2
jne .noplay3
mov byte[cplayernum],2
.noplay3
cmp byte[GUIcrowpos],3
jne .noplay4
mov byte[cplayernum],3
.noplay4
cmp byte[GUIcrowpos],4
jne .noplay5
mov byte[cplayernum],4
.noplay5
;The number on the left is the window to open
;the number on the right is where in the drop down box we are
GUICheckMenuItem 17, 6
GUICheckMenuItem 18, 7
GUICheckMenuItem 4, 9
GUICheckMenuItem 5, 10
GUICheckMenuItem 6, 11
GUICheckMenuItem 19, 12
.noconfig
cmp byte[romloadskip],0
jne near .nocheat
cmp byte[CheatBDoor],1
je .yescheat
cmp byte[CNetType],20
je near .nocheat
cmp byte[CNetType],21
je near .nocheat
cmp byte[CNetType],22
je near .nocheat
.yescheat
cmp byte[GUIcmenupos],4
jne near .nocheat
GUICheckMenuItem 7, 0
GUICheckMenuItem 7, 1
GUICheckMenuItem 13, 2
cmp byte[GUIcrowpos],0
jne .noaddc
mov dword[GUIcurrentcheatwin],1
.noaddc
cmp byte[GUIcrowpos],1
jne .nobrowsec
mov dword[GUIcurrentcheatwin],0
.nobrowsec
.nocheat
cmp byte[GUIcmenupos],5
jne near .nonet
; cmp byte[GOSPort],3
; je near .win32
%ifdef __MSDOS__
cmp byte[CNetType],10
jae .nomod
mov byte[CNetType],0
.nomod
GUICheckMenuItem 8, 0
GUICheckMenuItem 8, 1
cmp byte[CNetType],10
jae near .nonet
cmp byte[GUIcrowpos],1
jne .noipx
mov byte[CNetType],7
.noipx
cmp byte[GUIcrowpos],0
jne near .nonet
mov byte[CNetType],1
jmp .nonet
%endif
;.win32
GUICheckMenuItem 8, 0
cmp byte[CNetType],10
jae near .nonet
cmp byte[GUIcrowpos],0
jne near .nonet
mov byte[CNetType],4
call GetHostName
.nonet
cmp byte[GUIcmenupos],6
jne near .nomisc
GUICheckMenuItem 9, 0
GUICheckMenuItem 10, 1
cmp byte[romloadskip],0
jne near .nomovie
GUICheckMenuItem 15, 2
cmp byte[GUIcrowpos],2
jne .nomovie
mov byte[MovieRecordWinVal],0
.nomovie
GUICheckMenuItem 16, 3
cmp byte[GUIcrowpos],4
jne .nosavestuff
; change dir to InitDrive/InitDir
mov dl,[InitDrive]
mov ebx,InitDir
call Change_Dir
call createnewcfg
call GUISaveVars
call Makemode7Table
mov dword[GUICMessage],.message1
mov dword[GUICTimer],50
; change dir to LoadDrive/LoadDir
mov dl,[LoadDrive]
mov ebx,LoadDir
call Change_Dir
.nosavestuff
GUICheckMenuItem 11, 6
.nomisc
ret
SECTION .data
.message1 db 'CONFIGURATION FILES SAVED.',0
SECTION .text
DisplayBoxes:
xor esi,esi
mov byte[cwindrawn],0
.next2
mov al,[GUIwinorder+esi]
cmp al,0
je .done
inc byte[cwindrawn]
inc esi
jmp .next2
.done
dec byte[cwindrawn]
xor eax,eax
xor esi,esi
.next
mov al,[GUIwinorder+esi]
cmp al,0
je near .nomore
push esi
cmp al,1
jne .noguiconfirm
cmp byte[GUIReset],1
je near .finstuff
call DisplayGUILoad
jmp .finstuff
.noguiconfirm
cmp al,2
jne .noguichosesave
call DisplayGUIChoseSave
jmp .finstuff
.noguichosesave
cmp al,3
jne .noguiinput
call DisplayGUIInput
jmp .finstuff
.noguiinput
cmp al,4
jne .noguioption
call DisplayGUIOption
jmp .finstuff
.noguioption
cmp al,5
jne .noguivideo
call DisplayGUIVideo
jmp .finstuff
.noguivideo
cmp al,6
jne .noguisound
call DisplayGUISound
jmp .finstuff
.noguisound
cmp al,7
jne .noguicheat
call DisplayGUICheat
jmp .finstuff
.noguicheat
cmp al,8
jne .noguinet
call DisplayNetOptns
jmp .finstuff
.noguinet
cmp al,9
jne .noguigameop
call DisplayGameOptns
jmp .finstuff
.noguigameop
cmp al,10
jne .noguiconf
call DisplayGUIOptns
%ifdef __WIN32__
pushad
call CheckAlwaysOnTop
popad
%endif
jmp .finstuff
.noguiconf
cmp al,11
jne .noguiconf2
call DisplayGUIAbout
jmp .finstuff
.noguiconf2
cmp al,12
jne .noguireset
call DisplayGUIReset
jmp .finstuff
.noguireset
cmp al,13
jne .noguisearch
call DisplayGUISearch
jmp .finstuff
.noguisearch
cmp al,14
jne .noguistates
call DisplayGUIStates
jmp .finstuff
.noguistates
cmp al,15
jne .noguimovies
call DisplayGUIMovies
jmp .finstuff
.noguimovies
cmp al,16
jne .noguicombo
call DisplayGUICombo
jmp .finstuff
.noguicombo
cmp al,17
jne .noaddon
call DisplayGUIAddOns
jmp .finstuff
.noaddon
cmp al,18
jne .nochipconfig
call DisplayGUIChipConfig
jmp .finstuff
.nochipconfig
cmp al,19
jne .nopaths
call DisplayGUIPaths
jmp .finstuff
.nopaths
.finstuff
pop esi
inc esi
dec byte[cwindrawn]
jmp .next
.nomore
ret
ChangetoSRAMdir:
mov dl,[SRAMDrive]
mov ebx,SRAMDir
call Change_Dir
ret
ChangetoLOADdir:
mov dl,[LoadDrive]
mov ebx,LoadDir
call Change_Dir
ret
GUIProcStates:
xor eax,eax
mov al,[GUIwinptr]
dec eax
mov byte[GUIwinactiv+14],0
mov byte[GUIwinorder+eax],0
dec byte[GUIwinptr]
cmp byte[GUICBHold],10
je .yesstate
mov byte[GUICBHold],0
ret
.yesstate
mov byte[GUICBHold],0
; change dir to SRAMDrive/SRAMDir
call ChangetoSRAMdir
cmp byte[GUIStatesText5],1
je .loadstate
call statesaver
jmp .changedir
.loadstate
cmp byte[CNetType],20
jne .notnet
call NetLoadStuff
jmp .changedir
.notnet
call loadstate2
.changedir
; change dir to LoadDrive/LoadDir
call ChangetoLOADdir
ret
SaveSecondState:
; change dir to SRAMDrive/SRAMDir
call ChangetoSRAMdir
mov ebx,[statefileloc]
mov al,[fnamest+ebx]
mov byte[fnamest+ebx],'s'
push eax
call statesaver
pop eax
mov ebx,[statefileloc]
mov [fnamest+ebx],al
call ChangetoLOADdir
ret
LoadSecondState:
call ChangetoSRAMdir
mov ebx,[statefileloc]
mov al,[fnamest+ebx]
mov byte[fnamest+ebx],'s'
push eax
call loadstate2
pop eax
mov ebx,[statefileloc]
mov [fnamest+ebx],al
call ChangetoLOADdir
ret
GUIProcReset:
cmp byte[GUICBHold],2
jne .noreset
mov byte[GUIReset],1
call GUIDoReset
cmp byte[CNetType],20
jne .noreset
call PreparePacket
mov al,40
call RemoteSendChar
call SendPacket
mov byte[GUIQuit],0
.noreset
mov byte[GUICBHold],0
xor eax,eax
mov al,[GUIwinptr]
dec eax
mov byte[GUIwinactiv+12],0
mov byte[GUIwinorder+eax],0
dec byte[GUIwinptr]
ret
SECTION .bss
LoadDuplicFound resb 1
SECTION .text
%macro GUIDMHelp 4
mov byte[GUItextcolor],46
mov byte[GUItextcolor+1],42
mov byte[GUItextcolor+2],38
mov byte[GUItextcolor+3],44
mov byte[GUItextcolor+4],40
cmp byte[GUIcmenupos],%4
jne %%nohighlight
mov byte[GUItextcolor],38
mov byte[GUItextcolor+1],40
mov byte[GUItextcolor+2],46
mov byte[GUItextcolor+3],40
mov byte[GUItextcolor+4],44
%%nohighlight
GUIBox %1,3,%2,3,[GUItextcolor]
GUIBox %1,4,%2,12,[GUItextcolor+1]
GUIBox %1,13,%2,13,[GUItextcolor+2]
GUIBox %1,3,%1,12,[GUItextcolor+3]
GUIBox %2,4,%2,13,[GUItextcolor+4]
GUIOuttext %1+5,7,%3,44
GUIOuttext %1+4,6,%3,62
%endmacro
%macro GUIDMHelpB 4
mov byte[GUItextcolor],46
mov byte[GUItextcolor+1],42
mov byte[GUItextcolor+2],38
mov byte[GUItextcolor+3],44
mov byte[GUItextcolor+4],40
cmp byte[GUIcwinpress],%4
jne %%nohighlight
mov byte[GUItextcolor],38
mov byte[GUItextcolor+1],40
mov byte[GUItextcolor+2],46
mov byte[GUItextcolor+3],40
mov byte[GUItextcolor+4],44
%%nohighlight
GUIBox %1,3,%2,3,[GUItextcolor]
GUIBox %1,4,%2,13,[GUItextcolor+1]
GUIBox %1,14,%2,14,[GUItextcolor+2]
GUIBox %1,3,%1,13,[GUItextcolor+3]
GUIBox %2,4,%2,14,[GUItextcolor+4]
GUIOuttext %1+3,7,%3,44
GUIOuttext %1+2,6,%3,62
%endmacro
%macro GUIDMHelpB2 4
mov byte[GUItextcolor],46
mov byte[GUItextcolor+1],42
mov byte[GUItextcolor+2],38
mov byte[GUItextcolor+3],44
mov byte[GUItextcolor+4],40
cmp byte[GUIcwinpress],%4
jne %%nohighlight
mov byte[GUItextcolor],38
mov byte[GUItextcolor+1],40
mov byte[GUItextcolor+2],46
mov byte[GUItextcolor+3],40
mov byte[GUItextcolor+4],44
%%nohighlight
GUIBox %1,3,%2,3,[GUItextcolor]
GUIBox %1,4,%2,6,[GUItextcolor+1]
GUIBox %1,7,%2,7,[GUItextcolor+2]
GUIBox %1,3,%1,6,[GUItextcolor+3]
GUIBox %2,4,%2,7,[GUItextcolor+4]
GUIOuttext %1+3,5,%3,44
GUIOuttext %1+2,4,%3,62
%endmacro
%macro GUIDMHelpB3 4
mov byte[GUItextcolor],46
mov byte[GUItextcolor+1],42
mov byte[GUItextcolor+2],38
mov byte[GUItextcolor+3],44
mov byte[GUItextcolor+4],40
cmp byte[GUIcwinpress],%4
jne %%nohighlight
mov byte[GUItextcolor],38
mov byte[GUItextcolor+1],40
mov byte[GUItextcolor+2],46
mov byte[GUItextcolor+3],40
mov byte[GUItextcolor+4],44
%%nohighlight
GUIBox %1,9,%2,9,[GUItextcolor]
GUIBox %1,10,%2,12,[GUItextcolor+1]
GUIBox %1,13,%2,13,[GUItextcolor+2]
GUIBox %1,9,%1,12,[GUItextcolor+3]
GUIBox %2,10,%2,13,[GUItextcolor+4]
GUIOuttext %1+3,11,%3,44
GUIOuttext %1+2,10,%3,62
%endmacro
%macro GUIDrawMenuM 10
GUIShadow %7,%8,%7+4+%3*6,%8+3+%4*10
GUIBox %1,%2,%1+4+%3*6,%2+3+%4*10,43
mov edi,[GUIcrowpos]
mov ecx,edi
shl edi,8
shl ecx,5
add edi,ecx
lea edi,[edi*5]
shl edi,1
add edi,[vidbuffer]
add edi,%1+17+18*288
mov ecx,6*%3+3
mov edx,1
mov al,73
push edi
call GUIDrawBox
pop edi
add edi,288
mov ecx,6*%3+3
mov edx,7
mov al,72
push edi
call GUIDrawBox
pop edi
add edi,288*7
mov ecx,6*%3+3
mov edx,1
mov al,73
call GUIDrawBox
GUIBox %1+%10,%2,%1+4+%3*6,%2,47
GUIBox %1,%2,%1,%9,45
GUIBox %1,%9,%1+4+%3*6,%9,39
GUIBox %1+4+%3*6,1+%2,%1+4+%3*6,%9,41
mov edi,%5
mov esi,[vidbuffer]
add esi,16+%6+20*288
mov ecx,%4
mov edx,6*%3
call GUIMenuDisplay
mov dword[GUIMenuL],%1+1
mov dword[GUIMenuR],%1+6*%3+3
mov dword[GUIMenuD],18+%4*10
%endmacro
DisplayMenu:
; Draw Shadow
GUIShadow 5,7,235,21
; Display Top Border
GUIBox 0,1,229,1,71
GUIBox 0,2,229,2,70
GUIBox 0,3,229,3,69
GUIBox 0,4,229,4,68
GUIBox 0,5,229,5,67
GUIBox 0,6,229,6,66
GUIBox 0,7,229,7,65
GUIBox 0,8,229,8,64
GUIBox 0,9,229,9,65
GUIBox 0,10,229,10,66
GUIBox 0,11,229,11,67
GUIBox 0,12,229,12,68
GUIBox 0,13,229,13,69
GUIBox 0,14,229,14,70
GUIBox 0,15,229,15,71
; cmp byte[OSPort],3
; jne near .notwinpressa
%ifdef __LINUX__
GUIShadow 238,9,247,20
GUIShadow 249,9,257,20
%endif
%ifdef __WIN32__
GUIShadow 238,9,247,14
GUIShadow 238,16,247,20
GUIShadow 249,9,257,20
%endif
.notwinpressa
; cmp byte[OSPort],3
; jne near .notwinpressb
%ifdef __LINUX__
mov byte[GUIMenuItem+36],247
GUIDMHelpB 233,242,GUIMenuItem+36,1
mov byte[GUIMenuItem+36],'x'
GUIDMHelpB 244,253,GUIMenuItem+36,2
%endif
%ifdef __WIN32__
mov byte[GUIMenuItem+36],249
GUIDMHelpB2 233,242,GUIMenuItem+36,1
mov byte[GUIMenuItem+36],248
GUIDMHelpB3 233,242,GUIMenuItem+36,3
mov byte[GUIMenuItem+36],'x'
GUIDMHelpB 244,253,GUIMenuItem+36,2
%endif
.notwinpressb
; Display upper-left box
mov byte[GUIMenuItem+36],25
GUIDMHelp 4,12,GUIMenuItem+6,1
GUIOuttext 4+3,7,GUIMenuItem+36,44
GUIOuttext 4+2,6,GUIMenuItem+36,62
; Display boxes
GUIDMHelp 17,47,GUIMenuItem,2
GUIDMHelp 52,94,GUIMenuItem+7,3
GUIDMHelp 99,135,GUIMenuItem+14,4
GUIDMHelp 140,188,GUIMenuItem+21,5
GUIDMHelp 193,223,GUIMenuItem+29,6
mov dword[GUIMenuL],0
mov dword[GUIMenuR],0
mov dword[GUIMenuD],0
; format : x pos, y pos, #charx, #chary, name, xpos+2, xpos+5,22,
; 19+#chary*10, length of top menu box
cmp byte[GUIcmenupos],1
jne near .nomenu1
GUIDrawMenuM 4,16,30,13,GUIPrevMenuData,6,9,22,149,8 ;19+13*10
mov dword[GUICYLocPtr],MenuDat1
.nomenu1
cmp byte[GUIcmenupos],2
jne near .nomenu2
GUIDrawMenuM 17,16,10,9,GUIGameMenuData,19,22,22,109,30 ;19+9*10
mov dword[GUICYLocPtr],MenuDat2
.nomenu2
cmp byte[GUIcmenupos],3
jne near .nomenu3
GUIDrawMenuM 52,16,9,13,GUIConfigMenuData,54,57,22,149,42 ;19+13*10
mov dword[GUICYLocPtr],MenuDat3
.nomenu3
cmp byte[GUIcmenupos],4
jne near .nomenu4
GUIDrawMenuM 99,16,11,3,GUICheatMenuData,101,104,22,49,36 ;19+3*10
mov dword[GUICYLocPtr],MenuDat4
.nomenu4
cmp byte[GUIcmenupos],5
jne near .nomenu5
; cmp byte[GOSPort],3
; je near .menu5b
%ifdef __MSDOS__
GUIDrawMenuM 140,16,10,2,GUINetPlayMenuData,142,145,22,39,48 ;19+2*10
mov dword[GUICYLocPtr],MenuDat5
jmp .nomenu5
%endif
.menu5b
GUIDrawMenuM 140,16,10,1,GUINetPlayMenuData,142,145,22,29,48 ;19+2*10
mov dword[GUICYLocPtr],MenuDat5
.nomenu5
cmp byte[GUIcmenupos],6
jne near .nomenu6
GUIDrawMenuM 193,16,9,7,GUIMiscMenuData,195,198,22,89,30 ;19+5*10
mov dword[GUICYLocPtr],MenuDat6
.nomenu6
ret
GUIMenuDisplay:
xor ebx,ebx
.next
mov al,[edi]
push ebx
push ecx
push esi
cmp al,0
je near .notext
cmp al,2
je .darktext
inc edi
mov byte[GUItextcolor],44
cmp byte[GUIcrowpos],bl
je .nodrawshadow
push edi
push esi
add esi,289
call GUIOutputString
pop esi
pop edi
.nodrawshadow
mov byte[GUItextcolor],63
call GUIOutputString
inc edi
jmp .text
.darktext
inc edi
mov byte[GUItextcolor],42
cmp byte[GUIcrowpos],bl
je .nodrawshadow2
push edi
push esi
add esi,289
call GUIOutputString
pop esi
pop edi
.nodrawshadow2
mov byte[GUItextcolor],57
call GUIOutputString
inc edi
jmp .text
.notext
add esi,4*288
mov ecx,edx
.loop
mov byte[esi],45
mov byte[esi-289],40
mov byte[esi+289],42
inc esi
dec ecx
jnz .loop
add edi,14
.text
pop esi
pop ecx
pop ebx
add esi,10*288
inc ebx
dec ecx
jnz near .next
ret
InitGUI:
cmp byte[newengen],0
je .nong16b
cmp byte[cbitmode],0
je .nong16b
call GetScreen
.nong16b
call ClearScreen
call Clear2xSaIBuffer
call GUISetPal
call GUIBufferData
ret
GUISetPal:
cmp byte[cbitmode],1
je near GUISetPal16
; set palette
; Fixed Color Scale = 0 .. 31
mov dx,03C8h
mov al,0
out dx,al
inc dx
out dx,al
out dx,al
out dx,al
inc al
mov dx,03C8h
mov bl,1
out dx,al
inc dx
.loopd
mov al,bl
add al,[GUIRAdd]
out dx,al
mov al,bl
add al,[GUIGAdd]
out dx,al
mov al,bl
add al,[GUIBAdd]
out dx,al
inc bl
cmp bl,32
jne .loopd
; gray scale = 32 .. 63
mov dx,03C8h
mov bl,32
mov al,32
out dx,al
inc dx
.loopc
mov al,bl
add al,al
out dx,al
out dx,al
out dx,al
inc bl
cmp bl,64
jne .loopc
; shadow = 96 .. 127
inc al
mov al,96
mov dx,03C8h
mov bl,0
out dx,al
inc dx
.loope
mov al,bl
add al,[GUIRAdd]
mov ah,al
add al,al
add al,ah
shr al,2
out dx,al
mov al,bl
add al,[GUIGAdd]
mov ah,al
add al,al
add al,ah
shr al,2
out dx,al
mov al,bl
add al,[GUIBAdd]
mov ah,al
add al,al
add al,ah
shr al,2
out dx,al
inc bl
cmp bl,32
jne .loope
; 0,10,31
mov al,[GUITRAdd]
mov [TRVal],al
mov al,[GUITGAdd]
mov [TGVal],al
mov al,[GUITBAdd]
mov [TBVal],al
mov ax,[TRVal]
inc ax
shr ax,3
mov [TRVali],ax
shl ax,3
add [TRVal],ax
mov ax,[TGVal]
inc ax
shr ax,3
mov [TGVali],ax
shl ax,3
add [TGVal],ax
mov ax,[TBVal]
inc ax
shr ax,3
mov [TBVali],ax
shl ax,3
add [TBVal],ax
GUIPal 64,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 65,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 66,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 67,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 68,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 69,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 70,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 71,[TRVal],[TGVal],[TBVal]
GUIPal 72,40,0,20
GUIPal 73,34,0,21
GUIPal 80,0,10,28
GUIPal 81,0,10,27
GUIPal 82,0,10,25
GUIPal 83,0,09,24
GUIPal 84,0,08,22
GUIPal 85,0,07,20
GUIPal 86,0,06,18
GUIPal 87,0,05,15
GUIPal 88,20,0,10
GUIPal 89,17,0,10
; Orange Scale
mov dx,03C8h
mov al,128
mov cl,20
out dx,al
mov bh,0
mov ah,0
inc dx
.loopf
add bh,2
add ah,1
mov al,63
out dx,al
mov al,bh
out dx,al
mov al,ah
out dx,al
dec cl
jnz .loopf
; Blue scale = 148 .. 167
mov al,[GUIWRAdd]
add al,al
mov [TRVal],al
mov al,[GUIWGAdd]
add al,al
mov [TGVal],al
mov al,[GUIWBAdd]
add al,al
mov [TBVal],al
mov byte[TRVali],4
mov byte[TGVali],4
mov byte[TBVali],4
GUIPal 152,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 151,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 150,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 149,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 148,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
add al,al
mov [TRVal],al
mov al,[GUIWGAdd]
add al,al
mov [TGVal],al
mov al,[GUIWBAdd]
add al,al
mov [TBVal],al
mov byte[TRVali],4
mov byte[TGVali],4
mov byte[TBVali],4
call DecPalVal
call DecPalVal
GUIPal 157,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 156,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 155,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 154,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 153,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
add al,al
mov [TRVal],al
mov al,[GUIWGAdd]
add al,al
mov [TGVal],al
mov al,[GUIWBAdd]
add al,al
mov [TBVal],al
mov byte[TRVali],4
mov byte[TGVali],4
mov byte[TBVali],4
call DecPalVal
call DecPalVal
call DecPalVal
call DecPalVal
GUIPal 162,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 161,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 160,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 159,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 158,[TRVal],[TGVal],[TBVal]
GUIPal 163,40,40,00
GUIPal 164,30,30,00
GUIPal 165,50,00,00
GUIPal 166,35,00,00
GUIPal 167,00,00,00
; Blue scale shadow
mov al,[GUIWRAdd]
mov [TRVal],al
mov al,[GUIWGAdd]
mov [TGVal],al
mov al,[GUIWBAdd]
mov [TBVal],al
mov byte[TRVali],2
mov byte[TGVali],2
mov byte[TBVali],2
GUIPal 172,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 171,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 170,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 169,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 168,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
mov [TRVal],al
mov al,[GUIWGAdd]
mov [TGVal],al
mov al,[GUIWBAdd]
mov [TBVal],al
mov byte[TRVali],2
mov byte[TGVali],2
mov byte[TBVali],2
call DecPalVal
call DecPalVal
GUIPal 177,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 176,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 175,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 174,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 173,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
mov [TRVal],al
mov al,[GUIWGAdd]
mov [TGVal],al
mov al,[GUIWBAdd]
mov [TBVal],al
mov byte[TRVali],2
mov byte[TGVali],2
mov byte[TBVali],2
call DecPalVal
call DecPalVal
call DecPalVal
call DecPalVal
GUIPal 182,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 181,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 180,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 179,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal 178,[TRVal],[TGVal],[TBVal]
GUIPal 183,20,20,00
GUIPal 184,15,15,00
GUIPal 185,25,00,00
GUIPal 186,17,00,00
GUIPal 187,00,00,00
; gray scale2 = 189 .. 220
mov dx,03C8h
mov al,189
mov bl,0
out dx,al
inc dx
.loopi
mov al,bl
add al,al
mov ah,bl
shr ah,1
sub al,ah
out dx,al
out dx,al
add al,ah
out dx,al
inc bl
cmp bl,64
jne .loopi
GUIPal 221,00,55,00
GUIPal 222,00,45,00
GUIPal 223,00,25,00
GUIPal 224,40,0,20
GUIPal 225,32,0,15
GUIPal 226,20,0,10
GUIPal 227,16,0,07
GUIPal 228,45,45,50
GUIPal 229,40,40,45
GUIPal 230,35,35,40
GUIPal 231,30,30,35
GUIPal 232,35,15,15
GUIPal 233,50,12,60
GUIPal 234,30,14,60
cmp byte[GUIPalConv],0
je .convert
ret
.convert
mov byte[GUIPalConv],1
; Convert Image data to Gray Scale
; Create Palette Table
call GUIconvpal
; Convert Current Image in Buffer
mov esi,[vidbuffer]
mov ecx,288*240
xor eax,eax
.next
mov al,[esi]
mov bl,[SubPalTable+eax]
mov [esi],bl
inc esi
dec ecx
jnz .next
ret
SECTION .bss ;ALIGN=32
NEWSYM GUICPC, resw 256
SECTION .text
%macro GUIPal16b 4
mov ax,%2
shr ax,1
shl ax,11
mov bx,%3
shl bx,5
or ax,bx
mov bx,%4
shr bx,1
or ax,bx
mov word[GUICPC+%1*2],ax
%endmacro
DecPalVal:
mov ax,[TRVali]
sub word[TRVal],ax
mov ax,[TGVali]
sub word[TGVal],ax
mov ax,[TBVali]
sub word[TBVal],ax
test word[TRVal],8000h
jz .notnegr
mov word[TRVal],0
.notnegr
test word[TGVal],8000h
jz .notnegg
mov word[TGVal],0
.notnegg
test word[TBVal],8000h
jz .notnegb
mov word[TBVal],0
.notnegb
ret
GUISetPal16:
; set palette
; Fixed Color Scale = 0 .. 31
mov word[GUICPC],0
inc al
xor ebx,ebx
mov bl,1
.loopd
xor ecx,ecx
mov cl,bl
add cl,[GUIRAdd]
shr cl,1
shl ecx,11
xor eax,eax
mov al,bl
add al,[GUIGAdd]
shl eax,5
or ecx,eax
xor eax,eax
mov al,bl
add al,[GUIBAdd]
shr eax,1
or ecx,eax
mov [GUICPC+ebx*2],cx
inc bl
cmp bl,32
jne .loopd
; gray scale = 32 .. 63
mov bl,32
mov al,32
.loopc
mov al,bl
add al,al
xor ecx,ecx
mov cl,al
shr ecx,1
shl ecx,11
xor edx,edx
mov dl,al
shl edx,5
or ecx,edx
xor edx,edx
mov dl,al
shr edx,1
or ecx,edx
mov [GUICPC+ebx*2],cx
inc bl
cmp bl,64
jne .loopc
; shadow = 96 .. 127
xor ebx,ebx
.loope
xor ecx,ecx
mov al,bl
add al,[GUIRAdd]
mov ah,al
add al,al
add al,ah
shr al,2
shr al,1
or cl,al
shl ecx,6
mov al,bl
add al,[GUIGAdd]
mov ah,al
add al,al
add al,ah
shr al,2
or cl,al
shl ecx,5
mov al,bl
add al,[GUIBAdd]
mov ah,al
add al,al
add al,ah
shr al,2
shr al,1
or cl,al
mov [GUICPC+ebx*2+96*2],cx
inc bl
cmp bl,32
jne .loope
; 0,10,31
mov al,[GUITRAdd]
mov [TRVal],al
mov al,[GUITGAdd]
mov [TGVal],al
mov al,[GUITBAdd]
mov [TBVal],al
mov ax,[TRVal]
inc ax
shr ax,3
mov [TRVali],ax
shl ax,3
add [TRVal],ax
mov ax,[TGVal]
inc ax
shr ax,3
mov [TGVali],ax
shl ax,3
add [TGVal],ax
mov ax,[TBVal]
inc ax
shr ax,3
mov [TBVali],ax
shl ax,3
add [TBVal],ax
GUIPal16b 64,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 65,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 66,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 67,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 68,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 69,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 70,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 71,[TRVal],[TGVal],[TBVal]
GUIPal16b 72,40,0,20
GUIPal16b 73,34,0,21
GUIPal16b 80,0,10,28
GUIPal16b 81,0,10,27
GUIPal16b 82,0,10,25
GUIPal16b 83,0,09,24
GUIPal16b 84,0,08,22
GUIPal16b 85,0,07,20
GUIPal16b 86,0,06,18
GUIPal16b 87,0,05,15
GUIPal16b 88,20,0,10
GUIPal16b 89,17,0,10
; Orange Scale
mov cl,20
mov bh,0
mov ah,0
inc dx
mov esi,128
.loopf
add bh,2
add ah,1
mov edx,1Fh << 6
or dl,bh
shl edx,5
mov al,ah
shr al,1
or dl,al
mov [GUICPC+esi*2],dx
inc esi
dec cl
jnz .loopf
; Blue scale = 148 .. 167
mov al,[GUIWRAdd]
add al,al
mov [TRVal],al
mov al,[GUIWGAdd]
add al,al
mov [TGVal],al
mov al,[GUIWBAdd]
add al,al
mov [TBVal],al
mov byte[TRVali],4
mov byte[TGVali],4
mov byte[TBVali],4
GUIPal16b 152,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 151,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 150,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 149,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 148,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
add al,al
mov [TRVal],al
mov al,[GUIWGAdd]
add al,al
mov [TGVal],al
mov al,[GUIWBAdd]
add al,al
mov [TBVal],al
mov byte[TRVali],4
mov byte[TGVali],4
mov byte[TBVali],4
mov al,[TRVal]
shr al,2
sub [TRVal],al
mov al,[TGVal]
shr al,2
sub [TGVal],al
mov al,[TBVal]
shr al,2
sub [TBVal],al
GUIPal16b 157,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 156,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 155,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 154,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 153,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
add al,al
mov [TRVal],al
mov al,[GUIWGAdd]
add al,al
mov [TGVal],al
mov al,[GUIWBAdd]
add al,al
mov [TBVal],al
mov byte[TRVali],4
mov byte[TGVali],4
mov byte[TBVali],4
mov al,[TRVal]
shr al,1
sub [TRVal],al
mov al,[TGVal]
shr al,1
sub [TGVal],al
mov al,[TBVal]
shr al,1
sub [TBVal],al
GUIPal16b 162,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 161,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 160,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 159,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 158,[TRVal],[TGVal],[TBVal]
GUIPal16b 163,40,40,00
GUIPal16b 164,30,30,00
GUIPal16b 165,50,00,00
GUIPal16b 166,35,00,00
GUIPal16b 167,00,00,00
; Blue scale shadow
mov al,[GUIWRAdd]
mov [TRVal],al
mov al,[GUIWGAdd]
mov [TGVal],al
mov al,[GUIWBAdd]
mov [TBVal],al
mov byte[TRVali],2
mov byte[TGVali],2
mov byte[TBVali],2
GUIPal16b 172,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 171,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 170,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 169,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 168,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
mov [TRVal],al
mov al,[GUIWGAdd]
mov [TGVal],al
mov al,[GUIWBAdd]
mov [TBVal],al
mov byte[TRVali],2
mov byte[TGVali],2
mov byte[TBVali],2
call DecPalVal
call DecPalVal
GUIPal16b 177,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 176,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 175,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 174,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 173,[TRVal],[TGVal],[TBVal]
mov al,[GUIWRAdd]
mov [TRVal],al
mov al,[GUIWGAdd]
mov [TGVal],al
mov al,[GUIWBAdd]
mov [TBVal],al
mov byte[TRVali],2
mov byte[TGVali],2
mov byte[TBVali],2
call DecPalVal
call DecPalVal
call DecPalVal
call DecPalVal
GUIPal16b 182,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 181,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 180,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 179,[TRVal],[TGVal],[TBVal]
call DecPalVal
GUIPal16b 178,[TRVal],[TGVal],[TBVal]
GUIPal16b 183,20,20,00
GUIPal16b 184,15,15,00
GUIPal16b 185,25,00,00
GUIPal16b 186,17,00,00
GUIPal16b 187,00,00,00
; gray scale2 = 189 .. 220
mov bl,0
mov esi,189
.loopi
xor edx,edx
mov al,bl
add al,al
mov ah,bl
shr ah,1
sub al,ah
mov dl,al
shr dl,1
shl edx,6
or dl,al
shl edx,5
add al,ah
shr al,1
or dl,al
mov [GUICPC+esi*2],dx
inc esi
inc bl
cmp bl,64
jne .loopi
GUIPal16b 221,00,55,00
GUIPal16b 222,00,45,00
GUIPal16b 223,00,25,00
GUIPal16b 224,40,0,20
GUIPal16b 225,32,0,15
GUIPal16b 226,20,0,10
GUIPal16b 227,16,0,07
GUIPal16b 228,45,45,50
GUIPal16b 229,40,40,45
GUIPal16b 230,35,35,40
GUIPal16b 231,30,30,35
GUIPal16b 232,35,15,15
GUIPal16b 233,50,12,60
GUIPal16b 234,30,14,60
GUIPal16b 235,12,60,25
GUIPal16b 236,14,42,25
GUIPal16b 237,60,20,25
GUIPal16b 238,42,20,25
cmp byte[vesa2red10],1
jne .nored10
jmp .nored10
mov esi,GUICPC
mov ecx,256
.next2
mov ax,[esi]
mov bx,ax
and bx,0000000000011111b
and ax,1111111111000000b
shr ax,1
or ax,bx
mov [esi],ax
add esi,2
dec ecx
jnz .next2
.nored10
cmp byte[GUIPalConv],0
je .convert
ret
.convert
mov byte[GUIPalConv],1
mov esi,[vidbuffer]
mov edi,288*240
xor ebx,ebx
.next
mov ax,[esi+ebx*2]
mov ecx,eax
shr ecx,11
and ecx,1Fh
mov edx,eax
shr edx,6
and edx,1Fh
add ecx,edx
mov edx,eax
and edx,1Fh
add ecx,edx
shr ecx,1
mov al,[.multab+ecx]
mov [esi+ebx],al
inc ebx
dec edi
jnz .next
ret
SECTION .data
.multab db 1,1,1,2,2,3,4,4,5,6,6,7,8,8,9,10,10,11,12,12,13,14,14,15,16,16,
db 17,18,18,19,20,20,21,22,22,23,24,24,25,26,26,27,28,28,29,30,30,
db 31
SECTION .text
GUIBufferData:
mov ecx,16384
cmp byte[cbitmode],1
jne near .16b
add ecx,16384
cmp word[PrevResoln],224
je .nobufb
add esi,288*8
.nobufb
.16b
; copy to spritetable
mov esi,[vidbuffer]
cmp word[PrevResoln],224
je .nobufa
add esi,288*8
.nobufa
mov edi,[spritetablea]
add edi,8*288
.loop
mov eax,[esi]
mov [edi],eax
add esi,4
add edi,4
dec ecx
jnz .loop
mov edi,sprlefttot
mov ecx,64*5
.a
mov dword[edi],0
add edi,4
dec ecx
jnz .a
ret
GUIUnBuffer:
mov ecx,16384
; copy from spritetable
mov edi,[vidbuffer]
mov esi,[spritetablea]
add esi,8*288
rep movsd
mov eax,01010101h
mov ecx,2*288
rep stosd
ret
GUIconvpal:
mov ax,[cgram]
mov [tempco0],ax
test byte[scaddtype],00100000b
jz near .noaddition
test byte[scaddtype],10000000b
jnz near .noaddition
mov cx,[cgram]
mov ax,cx
and ax,001Fh
add al,[coladdr]
cmp al,01Fh
jb .noadd
mov al,01Fh
.noadd
mov bx,ax
mov ax,cx
shr ax,5
and ax,001Fh
add al,[coladdg]
cmp al,01Fh
jb .noaddb
mov al,01Fh
.noaddb
shl ax,5
add bx,ax
mov ax,cx
shr ax,10
and ax,001Fh
add al,[coladdb]
cmp al,01Fh
jb .noaddc
mov al,01Fh
.noaddc
shl ax,10
add bx,ax
mov [cgram],bx
.noaddition
mov edi,cgram
mov ebx,prevpal
xor ah,ah
.loopa
mov cx,[edi]
push eax
push ebx
mov [ebx],cx
mov al,ah
mov ax,cx
and al,01Fh
mov bh,[maxbr]
mov bl,bh
mul bl
mov bl,15
div bl
mov [curgsval],al
mov ax,cx
shr ax,5
and al,01Fh
mov bl,bh
mul bl
mov bl,15
div bl
add [curgsval],al
mov ax,cx
shr ax,10
and al,01Fh
mov bl,bh
mul bl
mov bl,15
div bl
add [curgsval],al
pop ebx
pop eax
add edi,2
add ebx,2
push eax
push ebx
mov al,ah
and eax,0FFh
mov bl,[curgsval]
push eax
push ebx
mov al,bl
mov bl,3
xor ah,ah
div bl
pop ebx
mov bl,al
pop eax
cmp byte[MessageOn],0
je .nochange128
cmp al,128
jne .nochange128
mov bl,31
.nochange128
or bl,bl
jnz .noadder
inc bl
.noadder
mov [SubPalTable+eax],bl
pop ebx
pop eax
inc ah
jnz near .loopa
mov al,[maxbr]
mov [prevbright],al
mov ax,[tempco0]
mov [cgram],ax
ret
SECTION .data
GUIMousePtr db 50+88,47+88,45+88,43+88,42+88,00,00,00
db 53+88,52+88,46+88,42+88,00,00,00,00
db 55+88,54+88,54+88,44+88,00,00,00,00
db 57+88,57+88,56+88,52+88,45+88,00,00,00
db 59+88,00,00,55+88,50+88,45+88,00,00
db 00,00,00,00,55+88,50+88,45+88,00
db 00,00,00,00,00,55+88,50+88,47+88
db 00,00,00,00,00,00,52+88,00
db 50,47,45,43,40,00,00,00
db 53,52,46,42,00,00,00,00
db 55,54,54,44,00,00,00,00
db 57,57,56,52,45,00,00,00
db 59,00,00,55,50,45,00,00
db 00,00,00,00,55,50,45,00
db 00,00,00,00,00,55,50,47
db 00,00,00,00,00,00,52,00
NEWSYM GUIFontData
db 0,0,0,0,0
db 01110000b
db 10011000b
db 10101000b
db 11001000b
db 01110000b; 0
db 00100000b
db 01100000b
db 00100000b
db 00100000b
db 01110000b; 1
db 01110000b
db 10001000b
db 00110000b
db 01000000b
db 11111000b; 2
db 01110000b
db 10001000b
db 00110000b
db 10001000b
db 01110000b; 3
db 01010000b
db 10010000b
db 11111000b
db 00010000b
db 00010000b; 4
db 11111000b
db 10000000b
db 11110000b
db 00001000b
db 11110000b; 5
db 01110000b
db 10000000b
db 11110000b
db 10001000b
db 01110000b; 6
db 11111000b
db 00001000b
db 00010000b
db 00010000b
db 00010000b; 7
db 01110000b
db 10001000b
db 01110000b
db 10001000b
db 01110000b; 8
db 01110000b
db 10001000b
db 01111000b
db 00001000b
db 01110000b; 9
db 01110000b
db 10001000b
db 11111000b
db 10001000b
db 10001000b; A
db 11110000b
db 10001000b
db 11110000b
db 10001000b
db 11110000b; B
db 01110000b
db 10001000b
db 10000000b
db 10001000b
db 01110000b; C
db 11110000b
db 10001000b
db 10001000b
db 10001000b
db 11110000b; D
db 11111000b
db 10000000b
db 11110000b
db 10000000b
db 11111000b; E
db 11111000b
db 10000000b
db 11110000b
db 10000000b
db 10000000b; F
db 01111000b
db 10000000b
db 10011000b
db 10001000b
db 01110000b; G
db 10001000b
db 10001000b
db 11111000b
db 10001000b
db 10001000b; H
db 11111000b
db 00100000b
db 00100000b
db 00100000b
db 11111000b; I
db 01111000b
db 00010000b
db 00010000b
db 10010000b
db 01100000b; J
db 10010000b
db 10100000b
db 11100000b
db 10010000b
db 10001000b; K
db 10000000b
db 10000000b
db 10000000b
db 10000000b
db 11111000b; L
db 11011000b
db 10101000b
db 10101000b
db 10101000b
db 10001000b; M
db 11001000b
db 10101000b
db 10101000b
db 10101000b
db 10011000b; N
db 01110000b
db 10001000b
db 10001000b
db 10001000b
db 01110000b; O
db 11110000b
db 10001000b
db 11110000b
db 10000000b
db 10000000b; P
db 01110000b
db 10001000b
db 10101000b
db 10010000b
db 01101000b; Q
db 11110000b
db 10001000b
db 11110000b
db 10010000b
db 10001000b; R
db 01111000b
db 10000000b
db 01110000b
db 00001000b
db 11110000b; S
db 11111000b
db 00100000b
db 00100000b
db 00100000b
db 00100000b; T
db 10001000b
db 10001000b
db 10001000b
db 10001000b
db 01110000b; U
db 10001000b
db 10001000b
db 01010000b
db 01010000b
db 00100000b; V
db 10001000b
db 10101000b
db 10101000b
db 10101000b
db 01010000b; W
db 10001000b
db 01010000b
db 00100000b
db 01010000b
db 10001000b; X
db 10001000b
db 01010000b
db 00100000b
db 00100000b
db 00100000b; Y
db 11111000b
db 00010000b
db 00100000b
db 01000000b
db 11111000b; Z
db 00000000b
db 00000000b
db 11111000b
db 00000000b
db 00000000b; -
db 00000000b
db 00000000b
db 00000000b
db 00000000b
db 11111000b; _
db 01101000b
db 10010000b
db 00000000b
db 00000000b
db 00000000b; ~
db 00000000b
db 00000000b
db 00000000b
db 00000000b
db 00100000b; .
db 00001000b
db 00010000b
db 00100000b
db 01000000b
db 10000000b; /
db 00010000b
db 00100000b
db 01000000b
db 00100000b
db 00010000b; <
db 01000000b
db 00100000b
db 00010000b
db 00100000b
db 01000000b; >
db 01110000b
db 01000000b
db 01000000b
db 01000000b
db 01110000b; [
db 01110000b
db 00010000b
db 00010000b
db 00010000b
db 01110000b; ]
db 00000000b
db 00100000b
db 00000000b
db 00100000b
db 00000000b; :
db 01100000b
db 10011000b
db 01110000b
db 10011000b
db 01101000b; &
db 00100000b
db 00100000b
db 10101000b
db 01110000b
db 00100000b; arrow
db 01010000b
db 11111000b
db 01010000b
db 11111000b
db 01010000b; #
db 00000000b
db 11111000b
db 00000000b
db 11111000b
db 00000000b; =
db 01001000b
db 10010000b
db 00000000b
db 00000000b
db 00000000b; "
db 10000000b
db 01000000b
db 00100000b
db 00010000b
db 00001000b; \ (Screw you nassm)
db 10101000b
db 01110000b
db 11111000b
db 01110000b
db 10101000b; *
db 01110000b
db 10001000b
db 00110000b
db 00000000b
db 00100000b; ?
db 10001000b
db 00010000b
db 00100000b
db 01000000b
db 10001000b; %
db 00100000b
db 00100000b
db 11111000b
db 00100000b
db 00100000b; +
db 00000000b
db 00000000b
db 00000000b
db 00100000b
db 01000000b; ,
db 00110000b
db 01000000b
db 01000000b
db 01000000b
db 00110000b; (
db 01100000b
db 00010000b
db 00010000b
db 00010000b
db 01100000b; )
db 01110000b
db 10011000b
db 10111000b
db 10000000b
db 01110000b; @
db 00100000b
db 01000000b
db 00000000b
db 00000000b
db 00000000b; '
db 00100000b
db 00100000b
db 00100000b
db 00000000b
db 00100000b; !
db 01111000b
db 10100000b
db 01110000b
db 00101000b
db 11110000b; $
db 00000000b
db 00100000b
db 00000000b
db 00100000b
db 01000000b; ;
db 01000000b
db 00100000b
db 00000000b
db 00000000b
db 00000000b; `
db 00100000b
db 01010000b
db 00000000b
db 00000000b
db 00000000b; ^
db 00110000b
db 01000000b
db 11000000b
db 01000000b
db 00110000b; {
db 01100000b
db 00010000b
db 00011000b
db 00010000b
db 01100000b; }
db 00100000b
db 00100000b
db 01110000b
db 01110000b
db 11111000b; Up
db 11111000b
db 01110000b
db 01110000b
db 00100000b
db 00100000b; Down
db 00001000b
db 00111000b
db 11111000b
db 00111000b
db 00001000b; Left
db 10000000b
db 11100000b
db 11111000b
db 11100000b
db 10000000b; Right
db 00100000b
db 01100000b
db 11111000b
db 01100000b
db 00100000b; Arrow Left
db 00111000b
db 00100000b
db 00110000b
db 00001000b
db 10110000b; .5
db 11111100b
db 10000100b
db 11111100b
db 00000000b
db 00000000b; Maximize
db 00000000b
db 11111100b
db 00000000b
db 00000000b
db 00000000b; Minimize
db 11111000b
db 10001000b
db 10001000b
db 10001000b
db 11111000b; Maximize (Linux)
; 189 .. 220
GUIIconDataClose:
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,216,216,216,216,216,216,216,0 ,0
db 214,212,202,212,212,212,202,212,210,0
db 214,212,212,200,212,200,212,212,210,202
db 214,212,212,212,198,212,212,212,210,202
db 214,212,212,196,212,196,212,212,210,200
db 214,212,194,212,212,212,194,212,210,200
db 0 ,208,208,208,208,208,208,208,198,198
db 0 ,0 ,198,198,198,198,198,198,198,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
GUIIconDataButtonHole:
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,207,205,207,0 ,0 ,0 ,0
db 0 ,0 ,207,203,202,203,207,0 ,0 ,0
db 0 ,207,203,200,198,200,203,207,0 ,0
db 0 ,207,202,198,197,198,202,207,0 ,0
db 0 ,207,203,200,198,200,203,207,0 ,0
db 0 ,0 ,207,203,202,203,207,0 ,0 ,0
db 0 ,0 ,0 ,207,205,207,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
GUIIconDataButtonFill:
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,207,209,207,0 ,0 ,0 ,0
db 0 ,0 ,207,211,212,211,207,0 ,0 ,0
db 0 ,207,211,214,216,214,211,207,0 ,0
db 0 ,207,212,216,217,216,212,207,0 ,0
db 0 ,207,211,214,216,214,211,207,0 ,0
db 0 ,0 ,207,211,212,211,207,0 ,0 ,0
db 0 ,0 ,0 ,207,209,207,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
GUIIconDataSlideBar:
db 0 ,0 ,0 ,0 ,216,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,212,216,220,0 ,0 ,0 ,0
db 0 ,0 ,0 ,212,216,220,202,0 ,0 ,0
db 0 ,0 ,212,212,216,218,220,0 ,0 ,0
db 0 ,0 ,212,214,216,218,220,202,0 ,0
db 0 ,0 ,212,214,216,218,220,202,0 ,0
db 0 ,0 ,0 ,212,216,220,202,202,0 ,0
db 0 ,0 ,0 ,212,216,220,202,0 ,0 ,0
db 0 ,0 ,0 ,0 ,216,202,202,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,202,0 ,0 ,0 ,0
GUIIconDataCheckBoxUC:
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,220,219,218,217,216,215,0 ,0 ,0
db 0 ,219,218,217,216,215,214,202,0 ,0
db 0 ,218,217,216,215,214,213,202,0 ,0
db 0 ,217,216,215,214,213,212,202,0 ,0
db 0 ,216,215,214,213,212,211,202,0 ,0
db 0 ,215,214,213,212,211,210,202,0 ,0
db 0 ,0 ,202,202,202,202,202,202,0 ,0
GUIIconDataCheckBoxC:
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,165,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,165,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,165,0 ,0 ,0
db 0 ,220,219,218,217,165,215,0 ,0 ,0
db 0 ,165,165,217,165,165,214,202,0 ,0
db 0 ,218,165,216,165,214,213,202,0 ,0
db 0 ,217,165,165,165,213,212,202,0 ,0
db 0 ,216,215,165,213,212,211,202,0 ,0
db 0 ,215,214,165,212,211,210,202,0 ,0
db 0 ,0 ,202,202,202,202,202,202,0 ,0
GUIIconDataCheckBoxX:
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,165,0 ,0 ,0 ,0 ,0 ,165,0 ,0
db 0 ,220,165,218,217,216,165,0 ,0 ,0
db 0 ,219,218,165,216,165,214,202,0 ,0
db 0 ,218,217,216,165,214,213,202,0 ,0
db 0 ,217,216,165,214,165,212,202,0 ,0
db 0 ,216,165,214,213,212,165,202,0 ,0
db 0 ,165,214,213,212,211,210,165,0 ,0
db 0 ,0 ,202,202,202,202,202,202,0 ,0
GUIIconDataUpArrow:
db 201,209,209,209,209,209,209,200,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 207,205,201,202,203,202,205,203,0 ,0
db 207,200,205,202,203,205,201,203,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 199,201,201,201,201,201,201,198,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
GUIIconDataDownArrow:
db 201,209,209,209,209,209,209,200,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 207,200,205,202,203,205,201,203,0 ,0
db 207,205,201,202,203,202,205,203,0 ,0
db 207,205,205,202,203,205,205,203,0 ,0
db 199,201,201,201,201,201,201,198,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
db 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
NEWSYM SnowData
dw 161,251,115,211,249,87,128,101,232,176,51,180,108,193,224,112,254,159,102,238
dw 223,123,218,42,173,160,143,170,64,1,174,29,34,187,194,199,40,89,232,32
dw 7,195,141,67,216,48,234,1,243,116,164,182,146,136,66,70,36,43,98,208
dw 63,240,216,253,147,36,33,253,98,80,228,156,73,82,85,1,97,72,187,239
dw 18,196,127,182,22,22,101,25,124,145,240,213,186,22,7,161,30,98,90,197
dw 22,205,32,150,59,133,49,140,10,128,142,185,176,142,220,195,100,102,105,194
dw 43,139,184,153,1,95,176,169,192,201,233,243,73,65,188,14,194,39,251,140
dw 239,181,142,160,242,248,82,49,9,157,233,162,254,121,112,6,118,24,56,121
dw 74,209,1,223,145,6,75,73,18,168,194,168,58,39,222,170,214,75,45,218
dw 39,197,242,98,22,90,255,5,144,244,252,55,98,18,135,101,27,85,215,207
dw 183,28,201,142,45,122,145,159,41,243,109,29,117,203,7,234,231,214,131,133
dw 217,8,74,207,130,77,21,229,167,78,218,109,142,58,134,238,29,182,178,14
dw 144,129,196,219,60,128,30,105,57,53,76,122,242,208,101,241,246,99,248,67
dw 137,244,70,51,202,94,164,125,115,72,61,72,129,169,155,122,91,154,160,83
dw 41,102,223,218,140,40,132,16,223,92,50,230,168,47,126,117,242,136,1,245
dw 171,0,36,98,73,69,14,229,66,177,108,92,39,250,243,161,111,85,211,99
dw 52,98,121,188,128,201,90,205,223,92,177,19,87,18,75,54,6,81,235,137
dw 247,66,211,129,247,39,119,206,116,250,113,231,190,196,53,51,34,114,39,22
dw 192,33,249,151,26,22,139,97,171,238,182,88,22,176,157,255,178,199,138,98
dw 140,36,112,90,25,245,134,64,48,190,165,113,24,195,84,70,175,9,179,69
dw 13,26,167,237,163,159,185,128,109,114,86,74,188,103,141,48,188,203,205,191
dw 215,193,224,4,153,36,108,3,172,235,56,251,211,115,173,216,240,33,78,150
dw 133,64,51,103,56,26,165,222,70,148,115,119,246,229,181,63,109,49,228,108
dw 126,10,170,48,87,42,193,24,28,255,176,176,209,181,97,93,61,241,201,137
dw 129,97,24,159,168,215,61,113,104,143,168,7,196,216,149,239,110,65,75,143
dw 238,0,37,19,8,56,65,234,228,72,42,5,226,95,243,51,55,231,114,90
dw 160,141,171,108,218,252,154,64,175,142,214,211,180,129,217,118,33,130,213,2
dw 73,145,93,21,162,141,97,225,112,253,49,43,113,208,131,104,31,51,192,37
dw 117,186,16,45,61,114,220,6,89,163,197,203,142,80,89,115,190,190,228,15
dw 166,145,59,139,120,79,104,252,246,73,113,144,224,65,204,155,221,85,31,99
dw 48,253,94,159,215,31,123,204,248,153,31,210,174,178,54,146,152,88,56,92
dw 197,35,124,104,211,118,1,207,108,68,123,161,107,69,143,13,79,170,130,193
dw 214,153,219,247,227,2,170,208,248,139,118,241,247,183,18,135,246,126,201,46
dw 70,234,171,72,18,135,236,216,32,178,148,231,161,15,6,254,34,181,5,71
dw 2,219,71,87,252,16,202,190,180,83,99,209,75,134,78,84,114,32,171,246
dw 125,11,57,200,102,29,176,26,205,151,152,108,100,146,117,95,71,77,158,207
dw 60,192,50,135,223,237,231,53,27,195,170,146,155,160,92,224,247,187,14,50
dw 203,5,153,42,17,75,109,14,78,160,236,114,131,105,189,209,233,135,221,207
dw 226,119,104,10,178,107,77,160,233,179,120,227,133,241,32,223,63,247,66,157
dw 140,81,118,81,63,193,173,228,214,78,124,123,222,149,9,242,0,128,194,110
NEWSYM SnowVelDist
db 57,92,100,19,100,184,238,225,55,240,255,221,215,105,226,153,164,41,22,93
db 176,203,155,199,244,52,233,219,110,227,229,227,152,240,83,248,226,31,163,22
db 28,156,18,10,248,67,123,167,25,138,90,10,79,107,208,229,248,233,185,10
db 167,21,19,178,132,154,81,70,20,71,95,147,72,27,91,189,13,189,102,84
db 195,123,251,93,68,36,178,59,107,99,104,191,76,110,44,206,123,46,98,112
db 26,50,1,35,150,17,242,208,69,23,202,197,59,80,136,124,40,89,11,40
db 1,136,90,72,198,83,2,174,174,4,28,205,135,35,194,54,22,40,4,132
db 191,88,163,66,204,230,35,111,9,177,254,174,163,68,5,88,111,235,58,236
db 4,248,172,154,101,164,43,223,10,13,210,125,146,73,192,57,117,152,128,36
db 106,21,253,113,110,133,244,4,150,32,76,71,22,106,210,244,46,128,27,215
db 231,112,177,196,198,120,196,57,234,74,235,108,64,181,209,188,177,63,197,200
db 126,164,136,163,48,62,225,223,212,201,195,121,90,7,10,196,88,53,39,249
db 147,98,65,253,246,3,152,125,242,105,44,129,94,232,13,4,86,220,194,67
db 186,210,171,197,64,138,89,78,58,150,52,79,138,201,244,111,106,181,192,69
db 234,253,239,113,98,37,209,151,60,47,241,235,185,52,173,94,172,182,47,150
db 80,118,10,58,161,237,10,64,238,198,14,74,132,250,234,63,169,86,158,170
db 76,168,124,133,28,203,246,140,228,77,50,53,115,113,157,218,90,192,28,209
db 72,117,156,101,226,99,11,245,69,59,17,175,164,59,8,166,163,185,10,60
db 100,19,26,38,114,232,180,115,238,184,88,103,178,67,212,21,87,64,85,1
db 62,87,155,62,21,96,205,195,131,97,191,252,218,209,179,201,12,2,234,110
db 162,14,145,170,156,105,85,132,132,60,239,14,80,129,225,144,149,244,188,8
db 13,168,181,168,30,142,24,110,26,172,231,182,50,214,66,193,100,45,132,144
db 205,190,16,133,45,250,83,183,140,229,117,226,68,59,163,96,235,227,25,155
db 209,105,41,214,30,107,2,85,180,23,241,39,113,63,75,44,107,142,93,29
db 62,240,235,152,147,52,54,146,109,112,139,162,238,198,201,8,141,115,112,106
db 4,99,25,155,111,161,114,253,75,100,28,59,101,150,2,122,228,6,12,59
db 249,181,67,136,227,227,199,46,75,203,50,25,50,61,62,22,238,124,218,134
db 243,21,243,222,94,138,161,234,133,23,138,45,4,226,154,227,8,84,105,126
db 200,127,240,144,124,197,102,144,53,29,94,231,108,175,136,37,44,183,178,95
db 41,196,214,12,42,221,106,225,151,32,53,130,24,211,88,14,135,18,90,219
db 177,129,90,217,162,181,199,133,116,56,36,100,230,91,220,83,41,65,20,64
db 177,197,249,24,242,62,26,234,92,44,167,153,243,94,179,163,103,29,220,199
db 128,94,236,152,53,32,77,78,228,89,124,85,87,50,197,116,179,105,236,139
db 102,17,159,66,176,27,205,36,113,80,60,6,61,174,254,174,246,72,154,31
db 97,40,10,8,114,203,238,26,89,51,134,110,118,176,87,32,192,210,146,207
db 88,45,156,179,61,224,87,107,107,1,252,187,203,100,169,211,205,105,12,231
db 137,176,166,37,192,241,169,84,32,85,112,168,154,7,247,146,183,225,246,173
db 57,103,110,236,113,118,203,200,22,87,251,7,138,37,12,84,221,171,51,209
db 242,37,89,73,151,162,139,189,131,209,221,96,107,144,175,79,199,123,98,138
db 226,86,221,254,72,14,126,180,200,171,85,94,120,124,196,225,150,57,219,158
SECTION .text
NEWSYM GuiAsmEnd