2009-04-22 20:04:28 +02:00

3769 lines
89 KiB
NASM

;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;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.
%include "macros.mac"
EXTSYM curblank,vidpastecopyscr,frameskip,newengen,cvidmode,antienab
EXTSYM soundon,StereoSound,SoundQuality,MusicRelVol,endprog
EXTSYM continueprog,spcBuffera,cbitmode,t1cc
EXTSYM romloadskip,romdata,init65816,current_zst
EXTSYM procexecloop,SPCRAM,spcPCRam,spcS,spcRamDP,spcA,spcX,spcY,spcP,spcNZ
EXTSYM Voice0Status,Voice1Status,Voice2Status,Voice3Status,Voice4Status
EXTSYM Voice5Status,Voice6Status,Voice7Status,statesaver,loadstate2
EXTSYM vidbuffer,ASCII2Font,hirestiledat,showallext,scanlines
EXTSYM sprlefttot,spritetablea,KeyRTRCycle
EXTSYM cgram,tempco0,prevbright,maxbr,prevpal,coladdr,coladdg
EXTSYM coladdb,scaddtype,initvideo,pressed,UpdateDevices,memtabler8
EXTSYM memtablew8,writeon,JoyRead,SetInputDevice,delay,FPSOn,RevStereo,WDSPReg0C
EXTSYM WDSPReg1C,pl12s34,resolutn,Makemode7Table,vidbufferofsb,wramdata,bgfixer
EXTSYM videotroub,CheatCodeSave,CheatCodeLoad,LoadCheatSearchFile
EXTSYM SaveCheatSearchFile,Get_Date,Check_Key,Get_Key,sram
EXTSYM TripBufAvail,ResetTripleBuf,ScanCodeListing
EXTSYM AdjustFrequency,GUISaveVars,Init_Mouse,Get_MouseData,Set_MouseXMax
EXTSYM Set_MouseYMax,Set_MousePosition,Get_MousePositionDisplacement,GUIInit
EXTSYM GUIDeInit,SpecialLine,DrawWater,DrawBurn,DrawSmoke
EXTSYM GetDate,horizon_get,ErrorPointer,MessageOn,GetTime
EXTSYM GetScreen,Clear2xSaIBuffer,MouseWindow,ExitFromGUI
EXTSYM newgfx16b,NumVideoModes,MusicVol,DSPMem,NumInputDevices
EXTSYM GUIInputNames,GUIVideoModeNames,GameSpecificInput,device1,device2,TwelveHourClock
EXTSYM GUIM7VID,GUINTVID,GUIHQ2X,RawDumpInProgress
EXTSYM MultiTap,SFXEnable,RestoreSystemVars
EXTSYM nssdip1,nssdip2,nssdip3,nssdip4,nssdip5,nssdip6
EXTSYM SkipMovie,MovieStop,MoviePlay,MovieRecord
EXTSYM MovieInsertChapter,MovieSeekAhead,MovieSeekBehind,ResetDuringMovie
EXTSYM MovieDumpRaw,MovieAppend,AutoLoadCht,GUIQuickLoadUpdate,GUILoadData
EXTSYM GUIwinposx,GUIwinposy,maxskip,GUIEffect,hqFilter,En2xSaI,NTSCFilter
EXTSYM NTSCBlend,NTSCHue,NTSCSat,NTSCCont,NTSCBright,NTSCSharp,NTSCRef
EXTSYM NTSCGamma,NTSCRes,NTSCArt,NTSCFringe,NTSCBleed,NTSCWarp
EXTSYM LowPassFilterType,MovieStartMethod,MovieDisplayFrame,savewinpos
EXTSYM SnapPath,SPCPath,BSXPath,SGPath,STPath,GNextPath,FEOEZPath,SJNSPath
EXTSYM MDHPath,SPL4Path,SRAMPath,CheatSrcByteSize,prevloadfnamel
EXTSYM prevloadiname,prevloaddnamel,prevlfreeze,FirstTimeData,MMXSupport
EXTSYM GUIRAdd,GUIGAdd,GUIBAdd,GUITRAdd,GUITGAdd,GUITBAdd,GUIWRAdd
EXTSYM GUIWGAdd,GUIWBAdd,GUIloadfntype,SoundInterpType
EXTSYM CheatSrcByteBase,CheatSrcSearchType,CheatUpperByteOnly,GUIComboGameSpec
EXTSYM KeyStateSlc0,KeyStateSlc1,KeyStateSlc2,KeyStateSlc3,KeyStateSlc4
EXTSYM KeyStateSlc5,KeyStateSlc6,KeyStateSlc7,KeyStateSlc8,KeyStateSlc9
EXTSYM RewindStates,RewindFrames,PauseRewind,PauseLoad,SRAMState,AutoState
EXTSYM LatestSave,SRAMSave5Sec,AutoIncSaveSlot,KeyUsePlayer1234
EXTSYM pl1contrl,pl1selk,pl1startk,pl1upk,pl1downk,pl1leftk,pl1rightk,pl1Xk
EXTSYM pl1Ak,pl1Lk,pl1Yk,pl1Bk,pl1Rk,pl1Xtk,pl1Ytk,pl1Atk,pl1Btk,pl1Ltk,pl1Rtk
EXTSYM pl1ULk,pl1URk,pl1DLk,pl1DRk,pl2contrl,pl2selk,pl2startk,pl2upk,pl2downk
EXTSYM pl2leftk,pl2rightk,pl2Xk,pl2Ak,pl2Lk,pl2Yk,pl2Bk,pl2Rk,pl2Xtk,pl2Ytk
EXTSYM pl2Atk,pl2Btk,pl2Ltk,pl2Rtk,pl2ULk,pl2URk,pl2DLk,pl2DRk,pl3contrl,pl3selk
EXTSYM pl3startk,pl3upk,pl3downk,pl3leftk,pl3rightk,pl3Xk,pl3Ak,pl3Lk,pl3Yk
EXTSYM pl3Bk,pl3Rk,pl3Xtk,pl3Ytk,pl3Atk,pl3Btk,pl3Ltk,pl3Rtk,pl3ULk,pl3URk
EXTSYM pl3DLk,pl3DRk,pl4contrl,pl4selk,pl4startk,pl4upk,pl4downk,pl4leftk
EXTSYM pl4rightk,pl4Xk,pl4Ak,pl4Lk,pl4Yk,pl4Bk,pl4Rk,pl4Xtk,pl4Ytk,pl4Atk,pl4Btk
EXTSYM pl4Ltk,pl4Rtk,pl4ULk,pl4URk,pl4DLk,pl4DRk,pl5contrl,pl5selk,pl5startk
EXTSYM pl5upk,pl5downk,pl5leftk,pl5rightk,pl5Xk,pl5Ak,pl5Lk,pl5Yk,pl5Bk,pl5Rk
EXTSYM pl5Xtk,pl5Ytk,pl5Atk,pl5Btk,pl5Ltk,pl5Rtk,pl5ULk,pl5URk,pl5DLk,pl5DRk
EXTSYM KeyResetAll,KeyExtraEnab1,KeyExtraEnab2,KeyVolDown,KeyVolUp
EXTSYM KeyBGDisble0,KeyBGDisble1,KeyBGDisble2,KeyBGDisble3,KeySprDisble
EXTSYM KeyDisableSC0,KeyDisableSC1,KeyDisableSC2,KeyDisableSC3,KeyQuickSnapShot
EXTSYM KeyDisableSC4,KeyDisableSC5,KeyDisableSC6,KeyDisableSC7,KeyQuickSaveSPC
EXTSYM KeyQuickLoad,KeyQuickRst,KeyQuickExit,KeyQuickClock,KeyQuickChat
EXTSYM KeyInsrtChap,KeyPrevChap,KeyNextChap,KeyDisplayFPS,KeyNewGfxSwt
EXTSYM KeyIncStateSlot,KeyDecStateSlot,KeySaveState,KeyLoadState,KeyStateSelct
EXTSYM KeyRewind,KeyEmuSpeedUp,KeyEmuSpeedDown,KeyFRateUp,KeyFRateDown
EXTSYM KeyFastFrwrd,KeySlowDown,KeyResetSpeed,EMUPauseKey,INCRFrameKey
EXTSYM KeyWinDisble,KeyOffsetMSw,JoyPad1Move,init_save_paths,loadquickfname
EXTSYM mousewrap,GUIRClick,SaveSramData,SwapMouseButtons
EXTSYM FPSAtStart,Turbo30hz,TimerEnable,SmallMsgText,mouse1lh,mouse2lh
EXTSYM AutoPatch,RomInfo,AllowUDLR,GrayscaleMode,GUIMovieForcedText
EXTSYM Mode7HiRes16b,FFRatio,SDRatio,EmuSpeed,mouseshad,MovieForcedLengthEnabled
EXTSYM esctomenu,GUILoadKeysJumpTo,lhguimouse,MZTForceRTR,GetMovieForcedLength
EXTSYM GUIEnableTransp,FilteredGUI,Surround,SPCDisable,nosaveSRAM
EXTSYM FastFwdToggle,gui_key,gui_key_extended,GUILoadKeysNavigate
EXTSYM KeyDisplayBatt,KeyIncreaseGamma,KeyDecreaseGamma
EXTSYM MovieVideoMode,MovieAudio,MovieVideoAudio,MovieAudioCompress,newfont
EXTSYM d_names,selected_names,GUIfileentries,GUIdirentries,GUIcurrentdirviewloc
EXTSYM GUIcurrentfilewin,GUIcurrentcursloc,GUIcurrentviewloc,SetMovieForcedLength
EXTSYM GUIcurrentdircursloc,GetLoadData,ZRomPath,SaveSecondState,ClockBox,DisplayInfo
EXTSYM GUIJT_currentviewloc,GUIJT_currentcursloc,GUIJT_entries,ScreenShotFormat
EXTSYM GUIJT_offset,GUIJT_viewable,GUIGenericJumpTo,SSAutoFire,SSPause
%ifdef __UNIXSDL__
EXTSYM numlockptr
%elifdef __WIN32__
EXTSYM initDirectDraw,reInitSound,CheckAlwaysOnTop,CheckPriority,AlwaysOnTop
EXTSYM CheckScreenSaver,MouseWheel,TrapMouseCursor,AllowMultipleInst,TripleBufferWin
EXTSYM HighPriority,DisableScreenSaver,SaveMainWindowPos,PrimaryBuffer
EXTSYM CBBuffer,CBLength,PasteClipBoard,ctrlptr,PauseFocusChange
%elifdef __MSDOS__
EXTSYM dssel,SetInputDevice209,initvideo2,Force8b,SBHDMA,vibracard,smallscreenon
EXTSYM pl1p209,pl2p209,pl3p209,pl4p209,pl5p209,SidewinderFix,Triplebufen,ScreenScale
EXTSYM GUIEAVID,GUIFSVID,GUIWSVID,GUISSVID,GUITBVID,GUISLVID,GUIHSVID,GUI2xVID
EXTSYM JoyMinX209,JoyMaxX209,JoyMinY209,JoyMaxY209,DOSClearScreen,dosmakepal
%endif
%ifndef __MSDOS__
EXTSYM ZsnesPage,DocsPage,GUICustomX,GUICustomY,GetCustomXY,SetCustomXY,initwinvideo
EXTSYM Keep4_3Ratio,PrevFSMode,PrevWinMode,NTSCFilterInit,hqFilterlevel
EXTSYM GUIWFVID,GUIDSIZE,GUIHQ3X,GUIHQ4X,GUIKEEP43,Keep43Check,changeRes
%endif
%ifndef __WIN32__
EXTSYM GUII2VID
%endif
%ifndef __UNIXSDL__
EXTSYM vsyncon
%endif
%ifdef __OPENGL__
EXTSYM BilinearFilter,GUIBIFIL,drawscreenwin,blinit
%endif
%include "gui/guitools.inc"
%include "gui/guimisc.inc"
%include "gui/guimouse.inc"
%include "gui/guiwindp.inc"
%include "gui/guikeys.inc"
%include "gui/guicheat.inc"
%include "gui/guicombo.inc"
; 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 Add Code Modem Misc Keys
; Run ----- Browse IPX GUI Opts
; Reset Devices Search Movie Opt
; ----- Chip Cfg Key Comb.
; Save State ----- Save Cfg
; Load State Options -----
; Pick State Video About
; ----- Sound
; Quit Paths
; Saves
; Speed
; NetPlay only has "Internet" for Windows/Linux
; Windows : 1 = Load
; 2 = Chose State
; 3 = Input Device Window
; 4 = Options
; 5 = Video
; 6 = Sound
; 7 = Cheat
; 8 = Net Options
; 9 = Game Options
; 10 = GUI Options
; 11 = About
; 12 = Reset Confirmation
; 13 = Cheat Search
; 14 = SaveState Confirmation
; 15 = Movies
; 16 = Key Combo
; 17 = Devices
; 18 = Chip Config
; 19 = Paths
; 20 = Saves
; 21 = Speed
SECTION .data
;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
MenuDat3 db 10, 3,0,1,1,0,1,1,1,1,1,2,0
MenuDat4 db 2, 3,1,2,0
%ifndef __MSDOS__
MenuDat5 db 0, 2,0,0
%else
MenuDat5 db 1, 3,2,0
%endif
MenuDat6 db 6, 3,1,1,1,1,0,2,0
NEWSYM 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
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 ',0
db 0,'------------',0
db 1,'DEVICES ',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
db 1,'SAVES ',0
db 1,'SPEED ',0
GUICheatMenuData:
db 1,'ADD CODE ',0
db 1,'BROWSE ',0
db 1,'SEARCH ',0
GUINetPlayMenuData:
%ifndef __MSDOS__
db 1,'INTERNET ',0
db 0,'------------',0
%else
db 1,'MODEM ',0
db 1,'IPX ',0
%endif
GUIMiscMenuData:
db 1,'MISC KEYS ',0
db 1,'GUI OPTS ',0
db 1,'MOVIE OPT ',0
db 1,'KEY COMB. ',0
db 1,'SAVE CFG ',0
db 0,'------------',0
db 1,'ABOUT ',0
; Window sizes and positions
; LOAD STAT INPT OPT VID SND CHT NET GMKEY GUIOP ABT RSET SRC STCN MOVE CMBO ADDO CHIP PATH SAVE SPED
GUIwinposxo dd 0,6 ,65 ,33 ,42 ,5 ,34 ,6 ,64 ,8 ,5 ,33 ,56 ,64 ,56 ,5 ,3 ,28 ,48 ,6 ,28 ,53
GUIwinposyo dd 0,20 ,70 ,20 ,20 ,20 ,20 ,20 ,30 ,30 ,20 ,20 ,60 ,30 ,60 ,20 ,20 ,60 ,60 ,20 ,30 ,20
GUIwinsizex dd 0,244 ,126 ,205 ,180 ,245 ,188 ,244 ,128 ,240 ,245 ,190 ,144 ,128 ,144 ,246 ,250 ,200 ,160 ,244 ,200 ,150
GUIwinsizey dd 0,190 ,68 ,192 ,190 ,190 ,188 ,191 ,40 ,170 ,150 ,190 ,42 ,40 ,42 ,190 ,190 ,120 ,100 ,190 ,168 ,180
NEWSYM GUIwinptr, db 0
NEWSYM WaterOn, db 1
NEWSYM ForceROMTiming, db 0
NEWSYM ForceHiLoROM, db 0
NEWSYM CalibXmin, dd 0
NEWSYM CalibXmax, dd 0
NEWSYM CalibYmin, dd 0
NEWSYM CalibYmax, dd 0
NEWSYM CalibXmin209, dd 0
NEWSYM CalibXmax209, dd 0
NEWSYM CalibYmin209, dd 0
NEWSYM CalibYmax209, dd 0
EEgg db 0
RestoreValues db 0
NEWSYM numdrives, dd 26
SubPalTable times 256 db 1 ; Corresponding Gray Scale Color
SECTION .bss
NEWSYM CombinDataGlob, resb 3300 ; 20-name, 42-combo, 2-key#, 1-P#, 1-ff
NEWSYM CombinDataLocl, resb 3300
NEWSYM GUIwinorder, resb 22
GUIwinpos resb 22
NEWSYM GUIwinactiv, resb 22
ViewBuffer resb 50*32
GUItextcolor resb 5
NEWSYM GUIcmenupos, resb 1
GUIescpress resb 1
GUIcwinpress resb 1
NEWSYM 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
BlankVar resb 1
GUICHold resd 1
NEWSYM 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 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)
curgsval resb 1
NEWSYM GUICMessage, resd 1
NEWSYM GUICTimer, resd 1
NEWSYM GUIOn, resb 1
NEWSYM GUIOn2, resb 1
NEWSYM GUIReset, resb 1
NEWSYM CurPalSelect, resb 1
NEWSYM MotionBlur, resb 1
NEWSYM StartLL, resd 1
NEWSYM StartLR, resd 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 .data
NEWSYM ComboHeader, db 'Key Combination File',26,1,0
NEWSYM ComboBlHeader, times 23 db 0
SECTION .text
%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 .data
NEWSYM GUIoldhand9o, dd 0
NEWSYM GUIoldhand9s, dw 0
NEWSYM GUIoldhand8o, dd 0
NEWSYM GUIoldhand8s, dw 0
GUIt1cc dd 0
GUIt1ccSwap db 0
GUIskipnextkey42 db 0
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[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
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[savewinpos],0
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,[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
mov byte[GUINetPlayMenuData],2 ; Gray out Netplay options
%ifdef __MSDOS__
mov byte[GUINetPlayMenuData+14],2
%endif
cmp byte[romloadskip],0
je .noromloaded
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
.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
NEWSYM 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 [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
%macro ProcessOneDigit 1
cmp dl,9
jbe %%notover
add dl,65-48-10
%%notover
add dl,48
mov [.message+%1],dl
xor edx,edx
div ebx
%endmacro
SECTION .data
.message db 0,0,0,0,' ',0,0,0,0,0,0,0
SECTION .text
NEWSYM StartGUI
%ifdef __OPENGL__
cmp byte[BilinearFilter],1
jne near .skipbl
mov byte[blinit],1
.skipbl
%endif
mov byte[GUILoadPos],0
cmp byte[TripBufAvail],0
jne .notexttb
%ifdef __MSDOS__
mov byte[Triplebufen],0
%endif
.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 .no2xsaien
%ifdef __MSDOS__
mov byte[Triplebufen],0
%endif
mov byte[hqFilter],0
mov byte[scanlines],0
mov byte[antienab],0
.no2xsaien
cmp byte[hqFilter],0
je .nohqen
mov byte[En2xSaI],0
mov byte[scanlines],0
mov byte[antienab],0
.nohqen
mov ecx,64
mov eax,SpecialLine
.slloop
mov dword[eax],0
add eax,4
dec ecx
jnz .slloop
.okayow
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
mov dword[GUICTimer],0
; 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
mov byte[CheatSearchStatus],0
cmp byte[newgfx16b],0
je .nong
mov ecx,256*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]
cmp ebx,20
ja .viewloc
mov dword[GUIcurrentvideoviewloc],0
jmp .skip
.viewloc
sub ebx,20
cmp eax,ebx
jbe .noof
mov eax,ebx
.noof
mov [GUIcurrentvideoviewloc],eax
.skip
pushad
call SaveSramData
call GUIQuickLoadUpdate
popad
call LoadDetermine
cmp byte[AutoState],0
je .noautostate
cmp byte[romloadskip],0
jne .noautostate
pushad
call SaveSecondState
popad
.noautostate
GUIInitIRQs
cmp byte[GUIwinptr],0
jne .nomenuopen
cmp byte[esctomenu],0
je .nomenuchange
mov byte[GUIcmenupos],2
mov byte[GUIcrowpos],0
mov dword[GUICYLocPtr],MenuDat2
cmp byte[esctomenu],1
je .nomenuchange
.nomenuopen
mov byte[GUIcmenupos],0
.nomenuchange
cmp byte[GUIwinactiv+1],0
je .noloadrefresh
mov dword[GUIcurrentfilewin],0
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
; Load Cheat Search File
pushad
call LoadCheatSearchFile
popad
.csskip
mov byte[GUIQuit],0
.nokey
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[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 .noburn
call DrawBurn
.noburn
cmp byte[GUIEffect],5
jne .nosmoke
call DrawSmoke
.nosmoke
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 byte[guimsgptr],0
jne .nohorizon
pushad
call GetDate
cmp ax,1025
popad
jne .nohorizon
pushad
call GetTime
push eax
call horizon_get
mov [guimsgptr],eax
popad
call horizonfixmsg
.nohorizon
cmp dword[GUICTimer],0
je .notimer
GUIOuttext 21,211,[GUICMessage],50
GUIOuttext 20,210,[GUICMessage],63
.notimer
call vidpastecopyscr
call GUIgetcurrentinput
jmp .nokey
.exitgui
GUIDeInitIRQs
mov ax,[PrevResoln]
mov [resolutn],ax
jmp endprog
.exit
mov edi,[spcBuffera]
mov ecx,65536
xor eax,eax
rep stosd
GUIDeInitIRQs
%ifdef __MSDOS__
call DOSClearScreen
cmp byte[cbitmode],0
jne .nomakepal
call dosmakepal
.nomakepal
%endif
mov word[t1cc],1
pushad
call GUISaveVars
popad
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,[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
pushad
call SaveCheatSearchFile
popad
.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
call AdjustFrequency
mov byte[GUIOn],0
mov byte[GUIOn2],0
mov byte[GUIReset],0
mov dword[StartLL],0
mov dword[StartLR],0
jmp continueprog
guimencodermsg:
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 52,96,guimencodert1,220-15
GUIOuttext 51,95,guimencodert1,220
GUIOuttext 52,134,guimencodert2,220-15
GUIOuttext 51,133,guimencodert2,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
call JoyRead
cmp byte[pressed+39h],0
jne .pressedokay
jmp .again
.pressedokay
ret
guilamemsg:
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 52,96,guilamet1,220-15
GUIOuttext 51,95,guilamet1,220
GUIOuttext 52,134,guilamet2,220-15
GUIOuttext 51,133,guilamet2,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
call JoyRead
cmp byte[pressed+39h],0
jne .pressedokay
jmp .again
.pressedokay
ret
SECTION .data
guimencodert1 db ' MENCODER IS MISSING: ',0
guimencodert2 db 'PRESS SPACE TO PROCEED',0
guilamet1 db ' LAME IS MISSING: ',0
guilamet2 db 'PRESS SPACE TO PROCEED',0
SECTION .text
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 52,81,guiftimemsg1,220-15
GUIOuttext 51,80,guiftimemsg1,220
GUIOuttext 52,96,guiftimemsg2,220-15
GUIOuttext 51,95,guiftimemsg2,220
GUIOuttext 52,104,guiftimemsg3,220-15
GUIOuttext 51,103,guiftimemsg3,220
GUIOuttext 52,112,guiftimemsg4,220-15
GUIOuttext 51,111,guiftimemsg4,220
GUIOuttext 52,120,guiftimemsg5,220-15
GUIOuttext 51,119,guiftimemsg5,220
GUIOuttext 52,128,guiftimemsg6,220-15
GUIOuttext 51,127,guiftimemsg6,220
GUIOuttext 52,136,guiftimemsg7,220-15
GUIOuttext 51,135,guiftimemsg7,220
GUIOuttext 52,151,guiftimemsg8,220-15
GUIOuttext 51,150,guiftimemsg8,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
call JoyRead
cmp byte[pressed+39h],0
jne .pressedokay
jmp .again
.pressedokay
ret
SECTION .data
guiftimemsg1 db ' ONE-TIME USER REMINDER : ',0
guiftimemsg2 db ' PLEASE BE SURE TO READ ',0
guiftimemsg3 db 'THE DOCUMENTATION INCLUDED',0
guiftimemsg4 db ' WITH ZSNES FOR IMPORTANT',0
guiftimemsg5 db ' INFORMATION AND ANSWERS',0
guiftimemsg6 db ' TO COMMON PROBLEMS',0
guiftimemsg7 db ' AND QUESTIONS.',0
guiftimemsg8 db 'PRESS SPACEBAR TO PROCEED.',0
SECTION .text
horizonfixmsg:
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 52,81,guimsgmsg,220-15
GUIOuttext 51,80,guimsgmsg,220
GUIOuttext 52,96,[guimsgptr],220-15
GUIOuttext 51,95,[guimsgptr],220
add dword[guimsgptr],32
GUIOuttext 52,104,[guimsgptr],220-15
GUIOuttext 51,103,[guimsgptr],220
add dword[guimsgptr],32
GUIOuttext 52,112,[guimsgptr],220-15
GUIOuttext 51,111,[guimsgptr],220
add dword[guimsgptr],32
GUIOuttext 52,120,[guimsgptr],220-15
GUIOuttext 51,119,[guimsgptr],220
sub dword[guimsgptr],96
GUIOuttext 52,151,guiftimemsg8,220-15
GUIOuttext 51,150,guiftimemsg8,220
call vidpastecopyscr
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
call JoyRead
cmp byte[pressed+39h],0
jne .pressedokay
jmp .again
.pressedokay
ret
SECTION .data
guimsgptr dd 0
guimsgmsg db ' WELCOME TO ZSNES',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 .pressedkey
inc ebx
dec ecx
jnz .b
cmp byte[MouseDis],1
je .again
call Get_MouseData
cmp byte[lhguimouse],1
jne .notlefthanded
call SwapMouseButtons
.notlefthanded
test bx,01h
jnz .pressedokay
jmp .again
.pressedkey
mov byte[pressed+ebx],0
.pressedokay
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 RESTORED.',0
guiprevidmsg7 db ' PRESS ANY KEY.',0
SECTION .text
guipostvideo:
mov ecx,256*144
mov eax,[vidbufferofsb]
.loop
mov dword[eax],0FFFFFFFFh
add eax,4
dec ecx
jnz .loop
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
cmp dword[GUIkeydelay],0
je .pressedokay
;This is to make all ports not register space bar from being pressed earlier
mov byte[pressed+2Ch],0
call JoyRead
cmp byte[pressed+39h],0
jne .pressedokay
jmp .pressedfail
.pressedokay
mov byte[GUIpclicked],1
ret
SECTION .data
guipostvidmsg1 db 'VIDEO MODE CHANGED.',0
guipostvidmsg2 db ' PRESS SPACEBAR.',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 __UNIXSDL__
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
NEWSYM guicheaterror
xor ebx,ebx
mov ecx,256+128+64
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
.again
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
GUIBox 75,95,192,143,160
GUIBox 75,95,192,95,162
GUIBox 75,95,75,143,161
GUIBox 192,95,192,143,159
GUIBox 75,143,192,143,158
GUIOuttext 81,101,guicheaterror1,220-15
GUIOuttext 80,100,guicheaterror1,220
GUIOuttext 81,109,guicheaterror2,220-15
GUIOuttext 80,108,guicheaterror2,220
GUIOuttext 81,117,guicheaterror3,220-15
GUIOuttext 80,116,guicheaterror3,220
GUIOuttext 81,125,guicheaterror4,220-15
GUIOuttext 80,124,guicheaterror4,220
GUIOuttext 81,135,guicheaterror5,220-15
GUIOuttext 80,134,guicheaterror5,220
call vidpastecopyscr
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
cmp byte[lhguimouse],1
jne .notlefthanded
call SwapMouseButtons
.notlefthanded
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
mov dword[GUIcurrentcheatwin],1
mov byte[GUIpclicked],1
ret
SECTION .data
guicheaterror1 db 'INVALID CODE! YOU',0
guicheaterror2 db 'MUST ENTER A VALID',0
guicheaterror3 db 'GAME GENIE,PAR, OR',0
guicheaterror4 db 'GOLD FINGER CODE.',0
guicheaterror5 db 'PRESS ANY KEY.',0
SECTION .text
SECTION .bss
ManualCPtr resd 1
ManualStatus resb 1
NEWSYM Totalbyteloaded, resd 1
NEWSYM sramsavedis, resb 1
SECTION .data
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 [GUIwinorder+eax],dl
mov byte[GUIwinactiv+edx],1
cmp byte[savewinpos],0
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,[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
pushad
push %1
call loadquickfname
pop eax
popad
ret
%%skip
%endmacro
GUITryMenuItem: ; Defines which menu item calls what window number
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 dword[GUIPrevMenuData+347],' ON '
jmp .on
.off
mov dword[GUIPrevMenuData+347],' OFF'
.on
.skipswitch
cmp byte[GUIcrowpos],12
jne .skipclear
cmp byte[prevlfreeze],0
jne .skipclear
mov edi,prevloadiname
mov eax,20202020h
mov ecx,70
rep stosd
mov edi,prevloaddnamel
xor eax,eax
mov ecx,1280
rep stosd
mov edi,prevloadfnamel
mov ecx,1280
rep stosd
pushad
call GUIQuickLoadUpdate
popad
ret
.skipclear
.noquickload
cmp byte[GUIcmenupos],2
jne near .nomain
GUICheckMenuItem 1, 0 ; Load
cmp byte[GUIcrowpos],0
jne .noloadrefresh
mov dword[GUIcurrentfilewin],0
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
GUICheckMenuItem 12, 2 ; Reset
cmp byte[GUIcrowpos],2
jne .noreset
mov byte[GUICResetPos],1
.noreset
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
;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 3,0 ; Input #1-5
GUICheckMenuItem 17,2 ; Devices
GUICheckMenuItem 18,3 ; Chip Config
GUICheckMenuItem 4,5 ; Options
cmp byte[GUIcrowpos],6 ; Video
jne near .novideo
; set Video cursor location
xor eax,eax
mov al,[cvidmode]
mov [GUIcurrentvideocursloc],eax
mov edx,[NumVideoModes]
cmp edx,20
ja .viewloc
mov dword[GUIcurrentvideoviewloc],0
jmp .skip
.viewloc
sub edx,20
cmp eax,edx
jbe .noof
mov eax,edx
.noof
mov [GUIcurrentvideoviewloc],eax
.skip
mov edx,5
call CheckMenuItemHelp
.novideo
GUICheckMenuItem 6,7 ; Sound
GUICheckMenuItem 19,8 ; Paths
GUICheckMenuItem 20,9 ; Saves
GUICheckMenuItem 21,10 ; Speed
.noconfig
cmp byte[romloadskip],0
jne near .nocheat
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
%ifdef __MSDOS__
; GUICheckMenuItem 8, 0 ; Disable DOS Netplay Options
; GUICheckMenuItem 8, 1
%endif
; GUICheckMenuItem 8, 0 ; Disable WIN/SDL Internet Option
cmp byte[GUIcrowpos],0
jne near .nonet
.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 ; Save Config
cmp byte[GUIcrowpos],4
jne .nosavestuff
mov byte[savecfgforce],1
pushad
call GUISaveVars
popad
mov byte[savecfgforce],0
call Makemode7Table
mov dword[GUICMessage],.message1
mov dword[GUICTimer],50
.nosavestuff
GUICheckMenuItem 11, 6
.nomisc
ret
SECTION .data
.message1 db 'CONFIGURATION FILES SAVED.',0
NEWSYM savecfgforce, db 0
SECTION .text
DisplayBoxes: ; Displays window when item is clicked
xor esi,esi
.next2
mov al,[GUIwinorder+esi]
cmp al,0
je .done
inc esi
jmp .next2
.done
mov eax,esi
dec eax
mov [cwindrawn],al
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
cmp al,20
jne .nosave
call DisplayGUISave
jmp .finstuff
.nosave
cmp al,21
jne .nospeed
call DisplayGUISpeed
jmp .finstuff
.nospeed
.finstuff
pop esi
inc esi
dec byte[cwindrawn]
jmp .next
.nomore
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
cmp byte[GUIStatesText5],1
je .loadstate
pushad
call statesaver
popad
jmp .changedir
.loadstate
pushad
call loadstate2
popad
.changedir
ret
GUIProcReset:
cmp byte[GUICBHold],2
jne .noreset
pushad
mov byte[GUIReset],1
cmp byte[MovieProcessing],2 ;Recording
jne .nomovierecording
call ResetDuringMovie
jmp .movieendif
.nomovierecording
call GUIDoReset
.movieendif
popad
.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
%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
%ifdef __UNIXSDL__
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
%ifdef __UNIXSDL__
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,8,11,GUIConfigMenuData,54,57,22,129,42 ;19+11*10
mov dword[GUICYLocPtr],MenuDat3
.nomenu3
cmp byte[GUIcmenupos],4
jne near .nomenu4
GUIDrawMenuM 99,16,8,3,GUICheatMenuData,101,104,22,49,36 ;19+3*10
mov dword[GUICYLocPtr],MenuDat4
.nomenu4
cmp byte[GUIcmenupos],5
jne near .nomenu5
%ifdef __MSDOS__
GUIDrawMenuM 140,16,10,2,GUINetPlayMenuData,142,145,22,39,48 ;19+2*10
%else
GUIDrawMenuM 140,16,10,1,GUINetPlayMenuData,142,145,22,29,48 ;19+1*10
%endif
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
%ifdef __MSDOS__
call DOSClearScreen
%endif
pushad
call Clear2xSaIBuffer
popad
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
inc ah
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
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 [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
inc ah
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[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,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
convertnum:
; process through each digit
push edx
push eax
push ebx
push cx
xor edx,edx ; clear high byte
xor cx,cx ; clear counter variable
mov ebx,10
.loopa
div ebx ; get quotent and remainder
push edx ; store number to stack
inc cl
xor edx,edx
test eax,0FFFFFFFFh
jnz .loopa
.loopb
pop edx ; get number back from stack
add dl,30h ; adjust to ASCII value
mov [esi],dl
inc esi
dec cl
jnz .loopb
pop cx
pop ebx
pop eax
pop edx
mov byte[esi],0
ret
; eax = value, ecx = # of bytes
converthex:
mov ebx,ecx
mov ecx,4
sub ecx,ebx
shl ecx,3
shl eax,cl
mov ecx,ebx
xor ebx,ebx
add ecx,ecx
.loopb
mov ebx,eax
and ebx,0F0000000h
shr ebx,28
mov dl,[.hexdat+ebx]
mov [esi],dl
inc esi
shl eax,4
dec ecx
jnz .loopb
mov byte[esi],0
ret
SECTION .data
.hexdat db '0123456789ABCDEF'
GUIMousePtr:
db 50,47,45,43,40,0 ,0 ,0
db 53,52,46,42,0 ,0 ,0 ,0
db 55,54,54,44,0 ,0 ,0 ,0
db 57,57,56,52,45,0 ,0 ,0
db 59,0 ,0 ,55,50,45,0 ,0
db 0 ,0 ,0 ,0 ,55,50,45,0
db 0 ,0 ,0 ,0 ,0 ,55,50,47
db 0 ,0 ,0 ,0 ,0 ,0 ,52,0
NEWSYM GUIFontData
; bitmap 5x5 font; char - offset for ASCII2Font
db 0,0,0,0,0; empty space 0x0
db 01110000b,10011000b,10101000b,11001000b,01110000b; 0 0x01
db 00100000b,01100000b,00100000b,00100000b,01110000b; 1 0x02
db 01110000b,10001000b,00110000b,01000000b,11111000b; 2 0x03
db 01110000b,10001000b,00110000b,10001000b,01110000b; 3 0x04
db 01010000b,10010000b,11111000b,00010000b,00010000b; 4 0x05
db 11111000b,10000000b,11110000b,00001000b,11110000b; 5 0x06
db 01110000b,10000000b,11110000b,10001000b,01110000b; 6 0x07
db 11111000b,00001000b,00010000b,00010000b,00010000b; 7 0x08
db 01110000b,10001000b,01110000b,10001000b,01110000b; 8 0x09
db 01110000b,10001000b,01111000b,00001000b,01110000b; 9 0x0A
db 01110000b,10001000b,11111000b,10001000b,10001000b; A 0x0B
db 11110000b,10001000b,11110000b,10001000b,11110000b; B 0x0C
db 01110000b,10001000b,10000000b,10001000b,01110000b; C 0x0D
db 11110000b,10001000b,10001000b,10001000b,11110000b; D 0x0E
db 11111000b,10000000b,11110000b,10000000b,11111000b; E 0x0F
db 11111000b,10000000b,11110000b,10000000b,10000000b; F 0x10
db 01111000b,10000000b,10011000b,10001000b,01110000b; G 0x11
db 10001000b,10001000b,11111000b,10001000b,10001000b; H 0x12
db 11111000b,00100000b,00100000b,00100000b,11111000b; I 0x13
db 01111000b,00010000b,00010000b,10010000b,01100000b; J 0x14
db 10010000b,10100000b,11100000b,10010000b,10001000b; K 0x15
db 10000000b,10000000b,10000000b,10000000b,11111000b; L 0x16
db 11011000b,10101000b,10101000b,10101000b,10001000b; M 0x17
db 11001000b,10101000b,10101000b,10101000b,10011000b; N 0x18
db 01110000b,10001000b,10001000b,10001000b,01110000b; O 0x19
db 11110000b,10001000b,11110000b,10000000b,10000000b; P 0x1A
db 01110000b,10001000b,10101000b,10010000b,01101000b; Q 0x1B
db 11110000b,10001000b,11110000b,10010000b,10001000b; R 0x1C
db 01111000b,10000000b,01110000b,00001000b,11110000b; S 0x1D
db 11111000b,00100000b,00100000b,00100000b,00100000b; T 0x1E
db 10001000b,10001000b,10001000b,10001000b,01110000b; U 0x1F
db 10001000b,10001000b,01010000b,01010000b,00100000b; V 0x20
db 10001000b,10101000b,10101000b,10101000b,01010000b; W 0x21
db 10001000b,01010000b,00100000b,01010000b,10001000b; X 0x22
db 10001000b,01010000b,00100000b,00100000b,00100000b; Y 0x23
db 11111000b,00010000b,00100000b,01000000b,11111000b; Z 0x24
db 00000000b,00000000b,11111000b,00000000b,00000000b; - 0x25
db 00000000b,00000000b,00000000b,00000000b,11111000b; _ 0x26
db 01101000b,10010000b,00000000b,00000000b,00000000b; ~ 0x27
db 00000000b,00000000b,00000000b,00000000b,00100000b; . 0x28
db 00001000b,00010000b,00100000b,01000000b,10000000b; / 0x29
db 00010000b,00100000b,01000000b,00100000b,00010000b; < 0x2A
db 01000000b,00100000b,00010000b,00100000b,01000000b; > 0x2B
db 01110000b,01000000b,01000000b,01000000b,01110000b; [ 0x2C
db 01110000b,00010000b,00010000b,00010000b,01110000b; ] 0x2D
db 00000000b,00100000b,00000000b,00100000b,00000000b; : 0x2E
db 01100000b,10011000b,01110000b,10011000b,01101000b; & 0x2F
db 00100000b,00100000b,10101000b,01110000b,00100000b; arrow down 0x30
db 01010000b,11111000b,01010000b,11111000b,01010000b; # 0x31
db 00000000b,11111000b,00000000b,11111000b,00000000b; = 0x32
db 01001000b,10010000b,00000000b,00000000b,00000000b; " 0x33
db 10000000b,01000000b,00100000b,00010000b,00001000b; \ 0x34
db 10101000b,01110000b,11111000b,01110000b,10101000b; * 0x35
db 01110000b,10001000b,00110000b,00000000b,00100000b; ? 0x36
db 10001000b,00010000b,00100000b,01000000b,10001000b; % 0x37
db 00100000b,00100000b,11111000b,00100000b,00100000b; + 0x38
db 00000000b,00000000b,00000000b,00100000b,01000000b; , 0x39
db 00110000b,01000000b,01000000b,01000000b,00110000b; ( 0x3A
db 01100000b,00010000b,00010000b,00010000b,01100000b; ) 0x3B
db 01110000b,10011000b,10111000b,10000000b,01110000b; @ 0x3C
db 00100000b,01000000b,00000000b,00000000b,00000000b; ' 0x3D
db 00100000b,00100000b,00100000b,00000000b,00100000b; ! 0x3E
db 01111000b,10100000b,01110000b,00101000b,11110000b; $ 0x3F
db 00000000b,00100000b,00000000b,00100000b,01000000b; ; 0x40
db 01000000b,00100000b,00000000b,00000000b,00000000b; ` 0x41
db 00100000b,01010000b,00000000b,00000000b,00000000b; ^ 0x42
db 00110000b,01000000b,11000000b,01000000b,00110000b; { 0x43
db 01100000b,00010000b,00011000b,00010000b,01100000b; } 0x44
db 00100000b,00100000b,01110000b,01110000b,11111000b; up 0x45
db 11111000b,01110000b,01110000b,00100000b,00100000b; down 0x46
db 00001000b,00111000b,11111000b,00111000b,00001000b; left 0x47
db 10000000b,11100000b,11111000b,11100000b,10000000b; right 0x48
db 00100000b,01100000b,11111000b,01100000b,00100000b; arrow left 0x49
db 00111000b,00100000b,00110000b,00001000b,10110000b; .5 0x4A
db 11111100b,10000100b,11111100b,00000000b,00000000b; maximize (Win) 0x4B
db 00000000b,11111100b,00000000b,00000000b,00000000b; minimize (Win) 0x4C
db 11111000b,10001000b,10001000b,10001000b,11111000b; maximize (SDL) 0x4D
db 00000000b,00000000b,00100000b,01010000b,00100000b; shw fullstop 0x4E
db 01110000b,01000000b,01000000b,01000000b,00000000b; shw left bracket 0x4F
db 00000000b,00010000b,00010000b,00010000b,01110000b; shw right bracket 0x50
db 00000000b,00000000b,00000000b,01000000b,00100000b; shw comma 0x51
db 00000000b,00100000b,01110000b,00100000b,00000000b; shw mid-dot 0x52
db 11111000b,00001000b,11110000b,00100000b,11000000b; shw wo 0x53
db 00000000b,11111000b,01010000b,01100000b,01000000b; shw mini a 0x54
db 00000000b,00010000b,00100000b,11100000b,00100000b; shw mini i 0x55
db 00000000b,00100000b,11111000b,10001000b,00110000b; shw mini u 0x56
db 00000000b,00000000b,11111000b,00100000b,11111000b; shw mini e 0x57
db 00000000b,00010000b,11111000b,00110000b,11010000b; shw mini o 0x58
db 00000000b,01000000b,11111000b,01010000b,01000000b; shw mini ya 0x59
db 00000000b,00000000b,11110000b,00010000b,11111000b; shw mini yu 0x5A
db 00000000b,11111000b,00001000b,01111000b,11111000b; shw mini yo 0x5B
db 00000000b,10101000b,10101000b,00010000b,01100000b; shw mini tsu 0x5C
db 00000000b,10000000b,01111000b,00000000b,00000000b; shw prolong 0x5D
db 11111000b,00101000b,00110000b,00100000b,11000000b; shw a 0x5E
db 00001000b,00110000b,11100000b,00100000b,00100000b; shw i 0x5F
db 00100000b,11111000b,10001000b,00010000b,01100000b; shw u 0x60
db 11111000b,00100000b,00100000b,00100000b,11111000b; shw e 0x61
db 00010000b,11111000b,00110000b,01010000b,10010000b; shw o 0x62
db 01000000b,11111000b,01001000b,01001000b,10011000b; shw ka 0x63
db 00100000b,11111000b,00100000b,11111000b,00100000b; shw ki 0x64
db 01000000b,01111000b,10001000b,00010000b,01100000b; shw ku 0x65
db 01000000b,01111000b,10010000b,00010000b,01100000b; shw ke 0x66 ^^
db 11111000b,00001000b,00001000b,00001000b,11111000b; shw ko 0x67
db 01010000b,11111000b,01010000b,00010000b,01100000b; shw sa 0x68
db 01000000b,10101000b,01001000b,00010000b,11100000b; shw shi 0x69
db 11111000b,00001000b,00010000b,00110000b,11001000b; shw su 0x6A
db 01000000b,11111000b,01010000b,01000000b,00111000b; shw se 0x6B
db 10001000b,01001000b,00001000b,00010000b,01100000b; shw so 0x6C
db 01000000b,01111000b,11001000b,00110000b,01100000b; shw ta 0x6D
db 11111000b,00100000b,11111000b,00100000b,01000000b; shw chi 0x6E
db 10101000b,10101000b,00001000b,00010000b,01100000b; shw tsu 0x6F
db 11111000b,00000000b,11111000b,00100000b,11000000b; shw te 0x70
db 01000000b,01000000b,01100000b,01010000b,01000000b; shw to 0x71
db 00100000b,11111000b,00100000b,00100000b,01000000b; shw na 0x72
db 11110000b,00000000b,00000000b,00000000b,11111000b; shw ni 0x73
db 11111000b,00001000b,00101000b,00010000b,01101000b; shw nu 0x74
db 00100000b,11111000b,00001000b,01110000b,10101000b; shw ne 0x75
db 00001000b,00001000b,00001000b,00010000b,01100000b; shw no 0x76
db 01010000b,01010000b,01010000b,10001000b,10001000b; shw ha 0x77
db 10000000b,10011000b,11100000b,10000000b,01111000b; shw hi 0x78
db 11111000b,00001000b,00001000b,00010000b,01100000b; shw hu 0x79
db 01000000b,10100000b,10010000b,00001000b,00000000b; shw he 0x7A
db 00100000b,11111000b,01110000b,10101000b,00100000b; shw ho 0x7B
db 11111000b,00001000b,10010000b,01100000b,00100000b; shw ma 0x7C
db 11111000b,00000000b,11111000b,00000000b,11111000b; shw mi 0x7D
db 00100000b,01000000b,01000000b,10010000b,11111000b; shw mu 0x7E
db 00001000b,01001000b,00110000b,00110000b,11001000b; shw me 0x7F
db 11111000b,00100000b,11111000b,00100000b,00111000b; shw mo 0x80
db 01000000b,11111100b,01001000b,00100000b,00100000b; shw ya 0x81
db 11110000b,00010000b,00010000b,00010000b,11111000b; shw yu 0x82
db 11111000b,00001000b,11111000b,00001000b,11111000b; shw yo 0x83
db 11111000b,00000000b,11111000b,00010000b,01100000b; shw ra 0x84
db 10001000b,10001000b,10001000b,00010000b,01100000b; shw ri 0x85
db 01100000b,01100000b,01101000b,01101000b,10110000b; shw ru 0x86
db 10000000b,10000000b,10001000b,10001000b,11110000b; shw re 0x87
db 11111000b,10001000b,10001000b,10001000b,11111000b; shw ro 0x88
db 11111000b,10001000b,00001000b,00010000b,01100000b; shw wa 0x89
db 10000000b,01001000b,00001000b,00010000b,11100000b; shw n 0x8A
db 10100000b,10100000b,00000000b,00000000b,00000000b; shw voiced 0x8B
db 01000000b,10100000b,01000000b,00000000b,00000000b; shw halfvoiced 0x8C
NEWSYM GUIFontData1, times 705 db 0
; 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
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