Added 'StarTrek' game source code. The game was written in FASM for Win32. Theoretically could be ported for KolibriOS :-)

git-svn-id: svn://kolibrios.org@1812 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Yogev Ezra 2011-01-30 13:11:14 +00:00
parent 0555bd8c9a
commit ea96aec626
39 changed files with 25191 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1,257 @@
* ----------------------------------------------- *
* THIS DOCUMENT IS LOOKING BEST WITH COURIER FONT *
* ----------------------------------------------- *
CONTENTS OF THIS FOLDER:
- README.TXT - THIS FILE
- STARTREK32.EXE - GAME EXECUTABLE FILE
- STARTREK.DOC - ORIGINAL GAME INSTRUCTIONS
- MSGTABLE.TXT - GAME MESSAGES (ENCRYPTED)
- DO NOT EDIT MSG TABLE - REMINDER NOT TO OPEN IT IN EDITOR
1. MODIFICATIONS TO ORIGINAL VERSION OF THIS GAME
===================================================
WHEN I STARTED TESTING THE GAME, I NOTICED THAT NO MATTER HOW HARD
I AM TRYING TO BEAT THE 'EMERITUS' LEVEL - THERE IS SIMPLY NOT MUCH
LUCK ON MY SIDE. WELL, I DECIDED TO ADD SOME POWER-UPS TO REMEDY
THIS SITUATION.
1.1 WHEN 'DOCK' COMMAND IS EXECUTED SOMETIMES MORE PHOTON
LAUNCHERS ARE ADDED, SO SHIP CAN FIRE MORE PHOTON TORPEDOES IN ONE
BURST. THIS EVENT HAPPENS ONLY ONCE PER GAME (FOR NOW).
THE NUMBER OF TORPEDOES PER BURST IS INDICATED ON 'TORPEDOES' LINE
IN SHORT RANGE SCAN REPORT. MAXIMUM NUMBER OF ADDED LAUNCHERS IS
THREE, SO IN ALL SHIP CAN HAVE UP TO SIX TORPEDOES FIRED PER BURST!
1.2 WHEN 'DOCK' COMMAND IS EXECUTED IT IS POSSIBLE SOMETIMES TO
RECEIVE QUANTUM TORPEDOES INSTEAD OF NORMAL ONES. THESE ARE NEW
WARHEADS DESIGNED BY STARFLEET ENGINEER CORPS. THE QUANTUM CHARGES
DO NOT SUFFER THE LOSS OF TARGETING WHEN PASSING THROUGH SHIELDS AS
MUCH AS NORMAL TORPEDOES. AND OF COURSE, THEY PACK QUITE A PUNCH!
"ENTERPRISE" WILL RECEIVE SIXTEEN QUANTUM CHARGES AND "FAERIE
QUEENE" WILL GET EIGHT. THESE CHARGES MUST BE EXPENDED BEFORE THE
NEXT DOCKING PROCEDURE, OTHERWISE THE TORPEDOES WILL NOT BE
REFILLED BY THE BASE. SO, DO NOT SAVE YOUR QUANTUM TORPEDOERS! GET
INTO SOME QUADRANT AND MAKE A SHOOTING GALLERY OUT OF POOR SUCKERS!
ESPECIALLY IF YOU HAVE SIX PHOTON TUBES.
I WAS THINKING TO ADD SOME NEW WAYS TO GATHER ENERGY IN GALAXY, BUT
SO FAR NOTHING COMES TO MIND. IF YOU HAVE ANY IDEAS ON THAT I WILL
BE GLAD TO HEAR IT.
1.3 ANOTHER NICE TO HAVE MODIFICATION IS THAT OUTPUT HAS TRUE
COLOURS. THESE COLOURS ARE NOT STANDARD WIN32 CONSOLE COLOURS,
BUT IN FACT, MY CONSOLE WINDOW IS A REAL WIN32 WINDOW, SIMULATING A
CONSOLE I/O.
1.4 SOME DELAY ADDED WHEN OUTPUTTING LARGE AMOUNTS OF DATA - IT
IMPROVES READABILITY, SINCE I HAVE NOT IMPLEMENTED THE SCROLLING OF
MY CONSOLE WINDOW (FOR NOW).
1.5. NEW 'LOG' COMMAND ADDED INTO THE GAME. IT ALLOWS SAVING ALL
GAME I/O INTO THE FILE CALLED 'STARTREK.LOG'. THIS FILE IS RE-
CREATED EACH GAME, SO IF YOU NEED TO ANALYSE ANY PREVIOUS GAMES YOU
HAVE TO RENAME THAT FILE AFTER THE GAME.
1.6 SINCE I HAVE TRUE COLOURS IN THE GAME I DECIDED TO IMPROVE
THE GALAXY CHART. ALL QUADRANTS WHERE 'SRSCAN' COMMAND WAS GIVEN
WILL BE HIGHLIGHTED WITH DIFFERENT COLOUR. IT MAY BE USEFUL IN
LOCATING A PLANET. ALSO, THE SHIP'S QUADRANT IS HIGHLIGHTED TOO.
2. SOME STRATEGY HINTS
======================
"STAR TREK" IS A GAME OF STRATEGY. I GOT THAT WHILE PLAYING
IT DURING MY TESTING PHASE - I WAS PLAYING FOR HOURS EVERY DAY!
I GOT A LOT OF BUGS FIXED, AND AT THE SAME TIME I GOT SOME INSIGHTS
INTO THE GAME. MOST OF THESE CAME WITH A KNOWLEDGE OF READING THE
SOURCE CODE FROM PDP-11. HOWEVER, I CAN ADD SOME OF MY OWN. AND,
OF COURSE, SOME LUCK IS MUCH NEEDED, ESPECIALLY ON THE "EMERITUS"!
SO, LET'S BEGIN!..
2.1 IMAGINE THAT YOU HEAR ON SUBSPACE, THAT A BASE IS UNDER
ATTACK AND YOU REALISE THAT TO GET THERE AT WARP 5 OR EVEN AT WARP
6 IS NOT POSSIBLE. YOU HAVE THE ENERGY, BUT THE MOVE WITH WARPS
OVER 6 WILL DAMAGE THE ENGINES AND YOU'LL GET STRANDED OR YOU'LL
HAVE TO DRAG AT WARP 4. IN SUCH A CASE I USE WARP 8, BUT I MAKE
SHORT TRIPS - EACH TRIP IS NO LONGER THAN 5 SECTORS. THERE IS A
PROBABILITY OF DAMAGING THE ENGINES, BUT THAT PROBABILITY IS MUCH
LOWER FOR SHORT JUMPS. ALSO, GO WITH SHIELDS DOWN TO SAVE ENERGY.
IF YOU GET TRACTORED - YOU'LL HAVE A CHANCE TO RAISE SHIELDS FOR
BATTLE. IN FACT, ALWAYS LOWER SHIELDS, WHEN BATTLE IS OVER.
2.2 IF YOU REALISE THAT BASE WILL BE DESTROYED AND YOU STILL IN
A NEIGHBOURING QUADRANT AND NOT ENOUGH TIME TO GET TO BASE - 'HELP'
COMMAND CAN BE USED TO JUMP STRAIGHT INTO DOCK. HOWEVER, THIS MAY
END BADLY, BECAUSE 'HELP' COMMAND IS PRONE TO RE-MATERIALIZATION
FAILURE AND YOU'LL LOSE THE GAME. ON THE OTHER HAND, JAMES T. KIRK
LOVES TO RISK! AND YOU ARE BECOME HIM, REMEMBER?..
2.3 WHEN YOU ENTER THE QUADRANT WITH ENEMIES - THEY ATTACK
RIGHT AWAY. YOU CAN ATTACK WHEN THEIR ATTACK IS OVER, HOWEVER, YOU
HAVE ONE CHANCE TO MOVE BEFORE ATTACKING, SO USE IT WISELY. FOR
EXAMPLE, YOU CAN FLY INTO THE MIDDLE OF ENEMIES, SO YOUR WEAPONS
WOULD BE MORE EFFECTIVE ON THE SHORT DISTANCE. IT WORKS FOR BOTH
PHASERS (LESS ENERGY SPENT ON A BURST) AND TORPEDOES (PRECISION AND
HIT ENERGY WILL BE INTENSIFIED).
2.4 SIMPLE FACT: WHEN STAR IS HIT BY A TORPEDO - IT BECOMES A
NOVA. NOVA DESTROYS (OR HEAVILY DAMAGES) ALL OBJECTS IN 8 ADJACENT
SECTORS. YOU CAN USE IT IN BATTLE. IF YOU HAVE ONLY 2 TORPEDOES
LEFT, BUT THERE ARE 5 KLINGONS IN THE QUADRANT, HOWEVER, THESE
ENEMIES ARE ADJACENT TO TWO STARS. THEY ARE UNLUCKY ONES! FLY INTO
A POSITION, WHERE YOUR TORPEDOES WILL SURELY HIT THOSE STARS AND
FIRE! ENEMIES WILL BE DESTROYED (MOST LIKELY). THERE IS A SMALL
PROBABILITY THAT NOVA CAN BECOME A SUPERNOVA - THAT WOULD BE BAD. I
ONCE EXPERIENCED THAT IN MY TESTING.
2.5 BEWARE OF ROMULANS! - THEY HAVE MORE POWER THAN MOST
KLINGONS. ALSO, THEY USUALLY FIRE TORPEDOES - NOT A GOOD PROSPECT.
TRY TO KILL OFF ROMULANS (AND COMMANDERS) FIRST WHEN IN BATTLE.
2.6 ALWAYS TRY TO ENTER THE CORNER SECTOR OF A QUADRANT WITH
ENEMIES OR CLOSE TO CORNER SECTOR. IT MINIMIZES THE ENEMY POWER
AND THEY CANNOT INFLICT AS MUCH DAMAGE AS IF YOU ENTER THE SECTOR
5-5. ALSO, IF YOU AT CORNER SECTOR - IT KEEPS THE THOLIAN FROM
MOVING AND WEAVING ITS WEB.
2.7 SOMETIMES YOU NEED A QUICK SCAN OF THE GALAXY. IT CAN BE
DONE WITHOUT TOO MUCH ENERGY SPENT ON FLIGHT. SIMPLY FLY INTO ANY
CORNER OF THE QUADRANT AND THEN MOVE JUST ONE SECTOR TO GET TO THE
ADJACENT QUADRANT AND GIVE BOTH 'SRSCAN' AND 'LRSCAN' COMMANDS. BY
DOING IT ONLY THREE TIMES (3 SECTORS TRAVELLED) YOU CAN SCAN FOUR
QUADRANTS ON SHORT RANGE AND TWELVE ON LONG RANGE.
2.8 AFTER THE BATTLE ALWAYS KEEP YOUR SHIELDS ON FULL OR CLOSE
TO FULL. YOU CAN BE TRACTORED BY A COMMANDER AT ANY TIME AND YOU
WILL NOT BE ABLE TO TRANSFER THE ENERGY - ONLY TO RAISE SHIELDS.
2.9 HOW TO FIGHT A LOT OF KLINGONS? IMAGINE THAT YOU ENTER A
QUADRANT AND IT HAS SEVEN KLINGONS OR MORE. EXPERIENCE SHOWS THAT
TO KILL ALL ENEMIES WITH PHASER IS NOT FEASIBLE WITHOUT OVERHEATING
PHASERS. IN THIS CASE THE MANUAL PHASER FIRE WILL HELP. USING
THIS METHOD YOU CAN SEE HOW MUCH ENERGY IS NEEDED TO KILL EACH
ENEMY. SIMPLY ENTER FOR EACH ENEMY SOME AMOUNT OF FIRE KEEPING IN
MIND THAT PHASERS BEGIN OVERHEATING AT MORE THAN 1500 UNITS IN
TOTAL. THE OVERHEATING IS HIGHLY RANDOM - I ONCE FIRED 2500 AT
SUPER-COMMANDER IN A FAR DISTANCE (COULD NOT MOVE CLOSER) AND MY
PHASERS WERE NOT OVERHEATED! SO, WHEN YOU ENTER THE MANUAL AMOUNTS
FOR EACH ENEMY AND FIRE - IT WILL WEAKEN THE ENEMIES, SO THEY WILL
NOT BE ABLE TO FIRE AS MUCH IN THEIR NEXT WAVE OF ATTACK. USUALLY,
YOUR SECOND PHASER SHOT WILL KILL ALL SEVEN KLINGONS. YOUR RESULTS
MAY VARY, HOWEVER! THAT'S WHY THIS GAME IS SO ADDICTIVE! ANYTHING
CAN HAPPEN DURING BATTLE!
2.10 IF THE ENEMY IS CLOSE TO BLACK HOLE (PREFERABLY 1 SECTOR
DISTANCE) - IT IS POSSIBLE TO DISPLACE THAT ENEMY INTO A BLACK HOLE
WITH A TORPEDO FIRED ON THE SAME VECTOR. I ONCE WAS IN A SITUATION
DEPICTED BELOW AND WAS ABLE TO KILL SUPER-COMMANDER WITH JUST ONE
NORMAL TORPEDO!
. E . . S @ . . .
3. NEED FOR IMPROVEMENT
=======================
3.1 I WOULD BE HAPPY TO HEAR SOME NEW IDEAS ABOUT THE GAME. YOU
CAN E-MAIL ME (asmguru62@hotmail.com) TO GIVE AN INSIGHT OR ADVICE.
3.2 I WAS NOT HAPPY TO DISCOVER (READING THE SOURCE CODE) THAT
COMMANDER'S TRACTOR BEAM WORKS ON A GREAT DISTANCES. BASICALLY,
THE SHIP CAN BE PULLED FROM ONE CORNER OF THE GALAXY TO THE OTHER!!
THAT DOES NOT SEEM LOGICAL TO ME. I WANTED TO ADJUST THE GAME, SO
THE DISTANCE WILL BE A FACTOR, BUT I LEFT THAT AS IS - TO PRESERVE
THE ORIGINAL IDEA FOR NOW.
3.3 BUGS!! OF COURSE, I AM GLAD TO HEAR SOME BUG REPORTS. LET'S
MAKE IT A NICE GAMING EXPERIENCE - 70s STYLE!.. DURING TESTING I
HAVE SEEN SOME STRANGE ISSUES, HOWEVER, I WAS NOT ABLE TO REPRODUCE
THESE IN A CONSISTENT MANNER.
3.4 TAKE A LOOK AT POSITION BELOW:
1 2 3 4 5
1 E * . . .
2 . . . . .
TO MOVE TO SECTOR 2-2 THE SHIP NEEDS TO TRAVEL AT 45 DEGREE ANGLE
DOWN AND TO THE RIGHT AND IT SEEMS LIKE NOTHING IN THE WAY. BEWARE
OF SUCH CONDITION - IN MOST CASES THE SHIP WILL BE BLOCKED BY STAR
AT SECTOR 1-2. I ANALYSED THE CODE AND IT SEEMS, WHEN SHIP MOVES,
IT WILL APPROXIMATE ITS LOCATION TO THE NEAREST SECTOR WITH HALF
SECTOR PRECISION. FOR EXAMPLE: SECTOR 1-1.5 WILL BE ROUNDED TO
SECTOR 1-2 AND THIS WILL CAUSE COLLISION WITH OBJECT AT THAT SECTOR
IF ANY. THAT SEEMS ILLOGICAL, AS SPOCK WOULD SAY. HALF OF THE
SECTOR CANNOT BE COMPARED WITH THE SHIP'S LENGTH TO BE ABLE TO
COLLIDE WITH ANYTHING. I ALSO, LEFT THAT FACT INTACT FROM ORIGINAL
CODE. SIMPLY DO NOT PLOT YOUR COURSE TOO CLOSE TO OTHER OBJECTS.
THE SAME CONDITION EXISTS FOR TORPEDOES TOO, BECAUSE THE SAME CODE
IS USED TO MOVE A TORPEDO.
4. FASM SOURCE CODE
===================
I HAVE INSERTED THE ORIGINAL COPYRIGHT NOTE FROM PDP-11 FORTRAN
SOURCE. YOU CAN MODIFY THE CODE, BIT ONLY FOR FUN - NOT FOR PROFIT.
THE SOURCE CODE WAS NOT WRITTEN TO BE FAST. IT WAS WRITTEN TO MIMIC
EXACTLY THE LOGIC OF FORTRAN SOURCE. PLEASE DO NOT ASK ME TO MAKE
OPTIMIZATIONS IN THE CODE - IT WILL NEVER BE DONE. I USED MY OWN
IDE FOR FASM TO CREATE THAT CODE. YOU CAN LOOK AT THE DATES IN
FILES AND FIGURE OUT HOW MUCH TIME IT TOOK TO WRITE THAT CODE. THIS
WAS MY THIRD (!) ATTEMPT TO RE-CREATE ONE OF MY FAVOURITE GAMES.
IN THE FIRST ATTEMPT I TRIED TO RE-DESIGN THE ORIGINAL SOURCE TO BE
MORE STRUCTURED. NO NEED TO SAY - IT FAILED MISERABLY! THE LOGIC
IN SOME CASES WAS LOST.
IN THE SECOND ATTEMPT I WROTE THE FASM CODE TO MIMIC FORTRAN CODE
EXACTLY. HOWEVER, I FAILED TO SEE THAT THERE SHOULD BE TWO THREADS.
ONE THREAD SHOULD RUN THE CONSOLE WINDOW AND THE OTHER ONE SHOULD
DEAL WITH GAME LOGIC: QUESTIONS AND ANSWERS FROM CONSOLE.
WELL, THIRD TIME'S A CHARM!
AsmGuru62
August 23, 2009

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,182 @@
; --------------------------------------------------------------------------
; Global variables
; --------------------------------------------------------------------------
glb_GameThreadBusy BOOL 1
glb_Instance HINSTANCE 0
glb_Allocator HANDLE 0
glb_MainWnd HWND 0
glb_Font HFONT 0
glb_FPU_Int32 INT32 0
glb_Score INT32 0
glb_CharSize rb SIZE.size
glb_pConsole PTConsole 0
glb_pCmdBuf PTCmdBuf 0
glb_pRawMsgBuffer PCHAR 0
glb_pMsgItems PPCHAR 0
glb_NumMsgItems COUNT 0
glb_pGameData PTGameData 0
glb_pCommon PTCommon 0
glb_pMersenne PTRandom 0
glb_pLog PVOID 0
glb_MOVED BYTE 0
glb_LogEnabled BYTE 0
glb_bEmExit BYTE 0
glb_AttrCondition BYTE ATTR_COND_GREEN, ATTR_COND_RED, ATTR_COND_YELLOW, ATTR_COND_GREEN
glb_ObjectMap BYTE CHAR_ROMULAN, CHAR_KLINGON, CHAR_COMMANDER, \
CHAR_SCOM, CHAR_ASTERISK, CHAR_PLANET, CHAR_STARBASE, \
CHAR_BLACK_HOLE, CHAR_THOLIAN
glb_Plaque BYTE PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
64,' ',50,'E',PLAQUE_END_OF_LINE,\
38,' ',3,'E',22,' ',PLAQUE_STRING,6,'E : :',41,' ',1,':',2,' ',1,'E',PLAQUE_END_OF_LINE,\
36,' ',2,'E',3,' ',3,'E',19,' ',PLAQUE_STRING,6,'E : :',19,' ',\
PLAQUE_STRING,8,'NCC-1701',14,' ',PLAQUE_STRING,4,': E',PLAQUE_END_OF_LINE,\
20,' ',16,'E',8,' ',15,'E',4,' ',PLAQUE_STRING,6,'E : :',41,' ',PLAQUE_STRING,3,': E',\
PLAQUE_END_OF_LINE,\
21,' ',1,'E',37,' ',1,'E',4,' ',48,'E',PLAQUE_END_OF_LINE,\
22,' ',9,'E',15,' ',13,'E',17,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\
31,' ',7,'E',3,' ',5,'E',4,' ',1,'E',10,' ',1,'E',14,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\
38,' ',3,'E',11,' ',1,'E',10,' ',1,'E',12,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\
55,' ',1,'E',9,' ',1,'E',10,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\
57,' ',13,'E',6,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\
54,' ',3,'E',1,' ',1,':',11,' ',7,'E',2,' ',8,'E',PLAQUE_END_OF_LINE,\
52,' ',1,':',1,'E',4,' ',1,':',17,' ',4,'E',7,' ',1,'E',PLAQUE_END_OF_LINE,\
51,' ',PLAQUE_STRING,8,')-E -:',5,'-',23,' ',1,'E',PLAQUE_END_OF_LINE,\
52,' ',1,':',1,'E',4,' ',1,':',28,' ',1,'E',PLAQUE_END_OF_LINE,\
54,' ',2,'E',2,' ',1,':',20,' ',8,'E',PLAQUE_END_OF_LINE,\
56,' ',23,'E',PLAQUE_END_OF_LINE,\
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
55,' ',PLAQUE_STRING,19,'U. S. S. ENTERPRISE',PLAQUE_END_OF_LINE,\
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
34,' ',PLAQUE_STRING,43,'FOR DEMONSTRATING OUTSTANDING ABILITY AS A ',\
PLAQUE_STRING,16,'STARSHIP CAPTAIN',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
48,' ',PLAQUE_STRING,32,'STARFLEET COMMAND BESTOWS TO YOU',PLAQUE_END_OF_LINE,\
PLAQUE_END_OF_LINE,PLAQUE_INSERT_NAME,PLAQUE_END_OF_LINE,\
59,' ',PLAQUE_STRING,11,'THE RANK OF',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
55,' ',PLAQUE_STRING,20,'"COMMODORE EMERITUS"',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
58,' ',PLAQUE_INSERT_LEVEL,PLAQUE_STRING,6,' LEVEL',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
54,' ',PLAQUE_STRING,12,'THIS DAY OF ',PLAQUE_INSERT_DATE,PLAQUE_END_OF_LINE,\
PLAQUE_END_OF_LINE,56,' ',PLAQUE_STRING,13,'YOUR SCORE: ',PLAQUE_INSERT_SCORE,\
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\
52,' ',PLAQUE_STRING,24,'KLINGONS PER STARDATE: ',PLAQUE_INSERT_KLRATE,\
PLAQUE_END_OF_LINE,PLAQUE_END_OF_ALL
align 2
str_MainWndClass du 'SST32-FASM',0
str_MainWndTitle du 'STAR TREK',0
str_FontFace du 'Courier',0
str_CharSizeText du 'Mj',0
str_SetDirFailed du 'Unable to Set Current Directory. Please check permissions.',0
str_MsgFileName du 'MsgTable.txt',0
str_LogFileName du 'STARTREK.LOG',0
str_FileMask du '*.TRK',0
str_THOLIANX db 'THOLIANX',0
str_TRK db '.TRK',0
str_CmdListGames db '?.TRK',0
str_EmSaveGame db 'EMSAVE.TRK',0
str_PlaqueFile db 'PLAQUE.TXT',0
align 16
glb_dbl_2e31 DOUBLE 2147483648.0
glb_dbl_2e32 DOUBLE 4294967296.0
glb_dbl_Ten DOUBLE 10.0
glb_dbl_FpuPopper DOUBLE 0.0
glb_dbl_0dot0625 DOUBLE 0.0625
glb_dbl_0dot08 DOUBLE 0.08
glb_dbl_0dot095 DOUBLE 0.095
glb_dbl_0dot1 DOUBLE 0.1
glb_dbl_0dot01 DOUBLE 0.01
glb_dbl_0dot001 DOUBLE 0.001
glb_dbl_0dot2 DOUBLE 0.2
glb_dbl_0dot02 DOUBLE 0.02
glb_dbl_0dot00001 DOUBLE 0.00001
glb_dbl_0dot2777 DOUBLE 0.2777
glb_dbl_0dot1777777777 DOUBLE 0.1777777777
glb_dbl_0dot15 DOUBLE 0.15
glb_dbl_0dot015 DOUBLE 0.015
glb_dbl_0dot5 DOUBLE 0.5
glb_dbl_0dot5235998 DOUBLE 0.5235998
glb_dbl_0dot5235988 DOUBLE 0.5235988
glb_dbl_0dot3 DOUBLE 0.3
glb_dbl_0dot03 DOUBLE 0.03
glb_dbl_0dot333 DOUBLE 0.3333333333
glb_dbl_1dot5 DOUBLE 1.5
glb_dbl_10dot5 DOUBLE 10.5
glb_dbl_2dot5 DOUBLE 2.5
glb_dbl_1dot2 DOUBLE 1.2
glb_dbl_1dot23 DOUBLE 1.23
glb_dbl_1dot4142 DOUBLE 1.4142
glb_dbl_1dot57079633 DOUBLE 1.57079633
glb_dbl_1dot01 DOUBLE 1.01
glb_dbl_1dot90985932 DOUBLE 1.90985932
glb_dbl_0dot04 DOUBLE 0.04
glb_dbl_0dot4 DOUBLE 0.4
glb_dbl_0dot45 DOUBLE 0.45
glb_dbl_0dot49 DOUBLE 0.49
glb_dbl_0dot05 DOUBLE 0.05
glb_dbl_0dot005 DOUBLE 0.005
glb_dbl_0dot00038 DOUBLE 0.00038
glb_dbl_0dot006 DOUBLE 0.006
glb_dbl_0dot75 DOUBLE 0.75
glb_dbl_0dot77 DOUBLE 0.77
glb_dbl_0dot65 DOUBLE 0.65
glb_dbl_0dot6 DOUBLE 0.6
glb_dbl_0dot89 DOUBLE 0.89
glb_dbl_0dot8 DOUBLE 0.8
glb_dbl_0dot9 DOUBLE 0.9
glb_dbl_0dot99 DOUBLE 0.99
glb_dbl_9dot99 DOUBLE 9.99
glb_dbl_0dot98 DOUBLE 0.98
glb_dbl_0dot995 DOUBLE 0.995
glb_dbl_DOCKFAC DOUBLE 0.25
glb_dbl_100 DOUBLE 100.0
glb_dbl_200 DOUBLE 200.0
glb_dbl_270 DOUBLE 270.0
glb_dbl_66dot666 DOUBLE 66.666666666
glb_dbl_2 DOUBLE 2.0
glb_dbl_20 DOUBLE 20.0
glb_dbl_3 DOUBLE 3.0
glb_dbl_31 DOUBLE 31.0
glb_dbl_39dot95 DOUBLE 39.95
glb_dbl_4 DOUBLE 4.0
glb_dbl_4dot5 DOUBLE 4.5
glb_dbl_5 DOUBLE 5.0
glb_dbl_6 DOUBLE 6.0
glb_dbl_8 DOUBLE 8.0
glb_dbl_25 DOUBLE 25.0
glb_dbl_125 DOUBLE 125.0
glb_dbl_50 DOUBLE 50.0
glb_dbl_150 DOUBLE 150.0
glb_dbl_950 DOUBLE 950.0
glb_dbl_7 DOUBLE 7.0
glb_dbl_7dot5 DOUBLE 7.5
glb_dbl_9 DOUBLE 9.0
glb_dbl_7dot853981634 DOUBLE 7.853981634
glb_dbl_15 DOUBLE 15.0
glb_dbl_12 DOUBLE 12.0
glb_dbl_1175 DOUBLE 1175.0
glb_dbl_75 DOUBLE 75.0
glb_dbl_300 DOUBLE 300.0
glb_dbl_30 DOUBLE 30.0
glb_dbl_3000 DOUBLE 3000.0
glb_dbl_400 DOUBLE 400.0
glb_dbl_500 DOUBLE 500.0
glb_dbl_600 DOUBLE 600.0
glb_dbl_700 DOUBLE 700.0
glb_dbl_800 DOUBLE 800.0
glb_dbl_7200 DOUBLE 7200.0
glb_dbl_450 DOUBLE 450.0
glb_dbl_1000 DOUBLE 1000.0
glb_dbl_5000 DOUBLE 5000.0
glb_dbl_2500 DOUBLE 2500.0
glb_dbl_1400 DOUBLE 1400.0
glb_dbl_1500 DOUBLE 1500.0
glb_dbl_1250 DOUBLE 1250.0
glb_dbl_1E38 DOUBLE 1e38
glb_dbl_3E_neg_5 DOUBLE 3e-5
glb_dbl_KlingonsPerDate DOUBLE 0.0
; --- EOF ---

View File

@ -0,0 +1,680 @@
; Import Section
dd 0, 0, 0, RVA kernel32, RVA kernel32tbl
dd 0, 0, 0, RVA user32, RVA user32tbl
dd 0, 0, 0, RVA gdi32, RVA gdi32tbl
dd 0, 0, 0, 0, 0
kernel32tbl:
;{W32}
GetLocalTime dd RVA _GetLocalTime
;{W32}
SetFilePointer dd RVA _SetFilePointer
;{W32}
GetFileAttributes dd RVA _GetFileAttributes
;{W32}
SetCurrentDir dd RVA _SetCurrentDir
;{W32}
GetConsoleScrBufInfo dd RVA _GetConsoleScrBufInfo
;{W32}
GetConsoleMode dd RVA _GetConsoleMode
;{W32}
GetStdHandle dd RVA _GetStdHandle
;{W32}
FreeConsole dd RVA _FreeConsole
;{W32}
AllocConsole dd RVA _AllocConsole
;{W32}
CreateThread dd RVA _CreateThread
;{W32}
Sleep dd RVA _Sleep
;{W32}
MulDiv dd RVA _MulDiv
;{W32}
VirtualFree dd RVA _VirtualFree
;{W32}
VirtualAlloc dd RVA _VirtualAlloc
;{W32}
GetFileSize dd RVA _GetFileSize
;{W32}
WriteFile dd RVA _WriteFile
;{W32}
ReadFile dd RVA _ReadFile
;{W32}
CloseHandle dd RVA _CloseHandle
;{W32}
CreateFile dd RVA _CreateFile
;{W32}
CreateFileAnsi dd RVA _CreateFileAnsi
;{W32}
GetTickCount dd RVA _GetTickCount
;{W32}
FindClose dd RVA _FindClose
;{W32}
FindNextFile dd RVA _FindNextFile
;{W32}
FindFirstFile dd RVA _FindFirstFile
;{W32}
GetProcessHeap dd RVA _GetProcessHeap
;{W32}
GetModuleFileName dd RVA _GetModuleFileName
;{W32}
OutputDebugString dd RVA _OutputDebugString
;{W32}
HeapCreate dd RVA _HeapCreate
;{W32}
HeapAlloc dd RVA _HeapAlloc
;{W32}
HeapReAlloc dd RVA _HeapReAlloc
;{W32}
HeapFree dd RVA _HeapFree
;{W32}
HeapDestroy dd RVA _HeapDestroy
;{W32}
GetModuleHandle dd RVA _GetModuleHandle
;{W32}
ExitProcess dd RVA _ExitProcess
dd 0
user32tbl:
;{W32}
OffsetRect dd RVA _OffsetRect
;{W32}
AdjustWindowRect dd RVA _AdjustWindowRect
;{W32}
MessageBeep dd RVA _MessageBeep
;{W32}
GetCursorPos dd RVA _GetCursorPos
;{W32}
TrackPopupMenu dd RVA _TrackPopupMenu
;{W32}
AppendMenu dd RVA _AppendMenu
;{W32}
DestroyMenu dd RVA _DestroyMenu
;{W32}
CreatePopupMenu dd RVA _CreatePopupMenu
;{W32}
GetFocus dd RVA _GetFocus
;{W32}
GetWindowTextLen dd RVA _GetWindowTextLen
;{W32}
GetWindowText dd RVA _GetWindowText
;{W32}
GetDlgItem dd RVA _GetDlgItem
;{W32}
PostMessage dd RVA _PostMessage
;{W32}
SendMessage dd RVA _SendMessage
;{W32}
InflateRect dd RVA _InflateRect
;{W32}
EndDialog dd RVA _EndDialog
;{W32}
DlgBoxParam dd RVA _DlgBoxParam
;{W32}
GetSystemMetrics dd RVA _GetSystemMetrics
;{W32}
DrawIcon dd RVA _DrawIcon
;{W32}
DrawText dd RVA _DrawText
;{W32}
ReleaseCapture dd RVA _ReleaseCapture
;{W32}
SetCapture dd RVA _SetCapture
;{W32}
SetWindowText dd RVA _SetWindowText
;{W32}
SetCursor dd RVA _SetCursor
;{W32}
ReleaseDC dd RVA _ReleaseDC
;{W32}
GetDC dd RVA _GetDC
;{W32}
FrameRect dd RVA _FrameRect
;{W32}
FillRect dd RVA _FillRect
;{W32}
EndPaint dd RVA _EndPaint
;{W32}
BeginPaint dd RVA _BeginPaint
;{W32}
UpdateWindow dd RVA _UpdateWindow
;{W32}
PostQuitMessage dd RVA _PostQuitMessage
;{W32}
LoadBitmap dd RVA _LoadBitmap
;{W32}
LoadImage dd RVA _LoadImage
;{W32}
LoadIcon dd RVA _LoadIcon
;{W32}
LoadCursor dd RVA _LoadCursor
;{W32}
GetWindowRect dd RVA _GetWindowRect
;{W32}
GetClientRect dd RVA _GetClientRect
;{W32}
ShowWindow dd RVA _ShowWindow
;{W32}
CreateWindowEx dd RVA _CreateWindowEx
;{W32}
DefWindowProc dd RVA _DefWindowProc
;{W32}
RegisterClass dd RVA _RegisterClass
;{W32}
GetClassInfo dd RVA _GetClassInfo
;{W32}
SetWindowLong dd RVA _SetWindowLong
;{W32}
GetWindowLong dd RVA _GetWindowLong
;{W32}
GetMessage dd RVA _GetMessage
;{W32}
DispatchMessage dd RVA _DispatchMessage
;{W32}
TranslateMessage dd RVA _TranslateMessage
;{W32}
TranslateAccelerator dd RVA _TranslateAccelerator
;{W32}
CreateAcceleratorTable dd RVA _CreateAcceleratorTable
;{W32}
InvalidateRect dd RVA _InvalidateRect
;{W32}
MoveWindow dd RVA _MoveWindow
;{W32}
IsWindowVisible dd RVA _IsWindowVisible
;{W32}
MessageBox dd RVA _MessageBox
dd 0
gdi32tbl:
;{W32}
TextOut dd RVA _TextOut
;{W32}
MoveToEx dd RVA _MoveToEx
;{W32}
SetTextAlign dd RVA _SetTextAlign
;{W32}
BitBlt dd RVA _BitBlt
;{W32}
CreateCompatibleBitmap dd RVA _CreateCompatibleBitmap
;{W32}
DeleteDC dd RVA _DeleteDC
;{W32}
SetTextColor dd RVA _SetTextColor
;{W32}
CreatePatternBrush dd RVA _CreatePatternBrush
;{W32}
GetStockObject dd RVA _GetStockObject
;{W32}
CreatePen dd RVA _CreatePen
;{W32}
Polyline dd RVA _Polyline
;{W32}
CreateSolidBrush dd RVA _CreateSolidBrush
;{W32}
DeleteObject dd RVA _DeleteObject
;{W32}
CreateFontIndirect dd RVA _CreateFontIndirect
;{W32}
GetDeviceCaps dd RVA _GetDeviceCaps
;{W32}
GetTextExtentPoint32 dd RVA _GetTextExtentPoint32
;{W32}
SetBkMode dd RVA _SetBkMode
;{W32}
SelectObject dd RVA _SelectObject
;{W32}
CreateCompatibleDC dd RVA _CreateCompatibleDC
dd 0
; --- Modules
kernel32 db 'KERNEL32.DLL', 0
user32 db 'USER32.DLL', 0
gdi32 db 'GDI32.DLL', 0
; --- Table
align 2
_GetLocalTime dw 0
db 'GetLocalTime',0
align 2
_SetFilePointer dw 0
db 'SetFilePointer',0
align 2
_GetFileAttributes dw 0
db 'GetFileAttributesA',0
align 2
_SetCurrentDir dw 0
db 'SetCurrentDirectoryW',0
align 2
_OffsetRect dw 0
db 'OffsetRect',0
align 2
_GetConsoleScrBufInfo dw 0
db 'GetConsoleScreenBufferInfo',0
align 2
_GetConsoleMode dw 0
db 'GetConsoleMode',0
align 2
_FreeConsole dw 0
db 'FreeConsole',0
align 2
_GetStdHandle dw 0
db 'GetStdHandle',0
align 2
_AllocConsole dw 0
db 'AllocConsole',0
align 2
_CreateThread dw 0
db 'CreateThread',0
align 2
_Sleep dw 0
db 'Sleep',0
align 2
_AdjustWindowRect dw 0
db 'AdjustWindowRect',0
align 2
_MessageBeep dw 0
db 'MessageBeep',0
align 2
_TextOut dw 0
db 'TextOutW',0
align 2
_MoveToEx dw 0
db 'MoveToEx',0
align 2
_SetTextAlign dw 0
db 'SetTextAlign',0
align 2
_BitBlt dw 0
db 'BitBlt',0
align 2
_CreateCompatibleBitmap dw 0
db 'CreateCompatibleBitmap',0
align 2
_DeleteDC dw 0
db 'DeleteDC',0
align 2
_MulDiv dw 0
db 'MulDiv',0
align 2
_GetCursorPos dw 0
db 'GetCursorPos',0
align 2
_TrackPopupMenu dw 0
db 'TrackPopupMenu',0
align 2
_AppendMenu dw 0
db 'AppendMenuW',0
align 2
_DestroyMenu dw 0
db 'DestroyMenu',0
align 2
_CreatePopupMenu dw 0
db 'CreatePopupMenu',0
align 2
_GetFocus dw 0
db 'GetFocus',0
align 2
_SetTextColor dw 0
db 'SetTextColor',0
align 2
_GetWindowTextLen dw 0
db 'GetWindowTextLengthW',0
align 2
_GetWindowText dw 0
db 'GetWindowTextW',0
align 2
_CreatePatternBrush dw 0
db 'CreatePatternBrush',0
align 2
_GetDlgItem dw 0
db 'GetDlgItem',0
align 2
_VirtualFree dw 0
db 'VirtualFree',0
align 2
_VirtualAlloc dw 0
db 'VirtualAlloc',0
align 2
_ImageList_AddMasked dw 0
db 'ImageList_AddMasked',0
align 2
_ImageList_Create dw 0
db 'ImageList_Create',0
align 2
_PostMessage dw 0
db 'PostMessageW',0
align 2
_SendMessage dw 0
db 'SendMessageW',0
align 2
_GetFileSize dw 0
db 'GetFileSize',0
align 2
_WriteFile dw 0
db 'WriteFile',0
align 2
_ReadFile dw 0
db 'ReadFile',0
align 2
_CloseHandle dw 0
db 'CloseHandle',0
align 2
_CreateFile dw 0
db 'CreateFileW',0
align 2
_CreateFileAnsi dw 0
db 'CreateFileA',0
align 2
_InflateRect dw 0
db 'InflateRect',0
align 2
_EndDialog dw 0
db 'EndDialog',0
align 2
_DlgBoxParam dw 0
db 'DialogBoxIndirectParamW',0
align 2
_GetSystemMetrics dw 0
db 'GetSystemMetrics',0
align 2
_GetStockObject dw 0
db 'GetStockObject',0
align 2
_GetTickCount dw 0
db 'GetTickCount',0
align 2
_FindClose dw 0
db 'FindClose',0
align 2
_FindNextFile dw 0
db 'FindNextFileW',0
align 2
_FindFirstFile dw 0
db 'FindFirstFileW',0
align 2
_DrawText dw 0
db 'DrawTextW',0
align 2
_DrawIcon dw 0
db 'DrawIcon',0
align 2
_CreatePen dw 0
db 'CreatePen',0
align 2
_Polyline dw 0
db 'Polyline',0
align 2
_CreateSolidBrush dw 0
db 'CreateSolidBrush',0
align 2
_DeleteObject dw 0
db 'DeleteObject',0
align 2
_SetCapture dw 0
db 'SetCapture',0
align 2
_ReleaseCapture dw 0
db 'ReleaseCapture',0
align 2
_SetWindowText dw 0
db 'SetWindowTextW',0
align 2
_InitCommonControlsEx dw 0
db 'InitCommonControlsEx',0
align 2
_SetCursor dw 0
db 'SetCursor',0
align 2
_GetProcessHeap dw 0
db 'GetProcessHeap',0
align 2
_CreateFontIndirect dw 0
db 'CreateFontIndirectW',0
align 2
_GetDeviceCaps dw 0
db 'GetDeviceCaps',0
align 2
_ReleaseDC dw 0
db 'ReleaseDC',0
align 2
_GetDC dw 0
db 'GetDC',0
align 2
_GetTextExtentPoint32 dw 0
db 'GetTextExtentPoint32W',0
align 2
_GetModuleFileName dw 0
db 'GetModuleFileNameW',0
align 2
_FrameRect dw 0
db 'FrameRect',0
align 2
_FillRect dw 0
db 'FillRect',0
align 2
_SetBkMode dw 0
db 'SetBkMode',0
align 2
_EndPaint dw 0
db 'EndPaint',0
align 2
_BeginPaint dw 0
db 'BeginPaint',0
align 2
_SelectObject dw 0
db 'SelectObject',0
align 2
_OutputDebugString dw 0
db 'OutputDebugStringW',0
align 2
_HeapCreate dw 0
db 'HeapCreate',0
align 2
_HeapAlloc dw 0
db 'HeapAlloc',0
align 2
_HeapReAlloc dw 0
db 'HeapReAlloc',0
align 2
_HeapFree dw 0
db 'HeapFree',0
align 2
_HeapDestroy dw 0
db 'HeapDestroy',0
align 2
_IsWindowVisible dw 0
db 'IsWindowVisible',0
align 2
_MoveWindow dw 0
db 'MoveWindow',0
align 2
_InvalidateRect dw 0
db 'InvalidateRect',0
align 2
_UpdateWindow dw 0
db 'UpdateWindow',0
align 2
_CreateAcceleratorTable dw 0
db 'CreateAcceleratorTableW',0
align 2
_TranslateAccelerator dw 0
db 'TranslateAccelerator',0
align 2
_TranslateMessage dw 0
db 'TranslateMessage',0
align 2
_DispatchMessage dw 0
db 'DispatchMessageW',0
align 2
_GetMessage dw 0
db 'GetMessageW',0
align 2
_PostQuitMessage dw 0
db 'PostQuitMessage',0
align 2
_LoadBitmap dw 0
db 'LoadBitmapW',0
align 2
_LoadImage dw 0
db 'LoadImageW',0
align 2
_LoadIcon dw 0
db 'LoadIconW',0
align 2
_LoadCursor dw 0
db 'LoadCursorW',0
align 2
_GetWindowRect dw 0
db 'GetWindowRect',0
align 2
_GetClientRect dw 0
db 'GetClientRect',0
align 2
_ShowWindow dw 0
db 'ShowWindow',0
align 2
_CreateWindowEx dw 0
db 'CreateWindowExW',0
align 2
_DefWindowProc dw 0
db 'DefWindowProcW',0
align 2
_RegisterClass dw 0
db 'RegisterClassW',0
align 2
_GetClassInfo dw 0
db 'GetClassInfoW',0
align 2
_SetWindowLong dw 0
db 'SetWindowLongW',0
align 2
_GetWindowLong dw 0
db 'GetWindowLongW',0
align 2
_GetModuleHandle dw 0
db 'GetModuleHandleW',0
align 2
_CreateCompatibleDC dw 0
db 'CreateCompatibleDC',0
align 2
_ExitProcess dw 0
db 'ExitProcess',0
align 2
_MessageBox dw 0
db 'MessageBoxW',0
;<EOF>

View File

@ -0,0 +1,98 @@
; --------------------------------------------------------------------------
; Win32 PE File Template
; {BINEXT=EXE} (Do not edit or remove this line)
; --------------------------------------------------------------------------
; *********************************************************************
; * PERMISSION IS HEREBY GRANTED FOR THE COPYING, *
; * DISTRIBUTION, MODIFICATION AND USE OF THIS PROGRAM AND *
; * ASSOCIATED DOCUMENTATION FOR RECREATIONAL PURPOSES, *
; * PROVIDED THAT ALL REFERENCES TO THE AUTHOR ARE RETAINED. *
; * HOWEVER, PERMISSION IS NOT AND WILL NOT BE GRANTED FOR *
; * THE SALE OR PROMOTIONAL USE OF THIS PROGRAM OR PROGRAM *
; * DOCUMENTATION, OR FOR USE IN ANY SITUATION IN WHICH *
; * PROFIT MAY BE CONSIDERED AN OBJECTIVE, SINCE IT IS THE *
; * DESIRE OF THE AUTHOR TO RESPECT THE COPYRIGHTS OF THE *
; * ORIGINATORS OF STAR TREK. *
; *********************************************************************
format PE GUI 4.0
entry start
stack 10000h, 10000h
; --------------------------------------------------------------------------
; Definitions
; --------------------------------------------------------------------------
include 'Macros.Inc'
include 'Win32.Inc'
include 'TConsole.Inc'
include 'TCmdBuf.Inc'
include 'TCommon.Inc'
include 'TRandom.Inc'
include 'TLog.Inc'
;{INCLDEF} (Definitions will be inserted before this line)
PROC_ALIGN equ 8
; --------------------------------------------------------------------------
; Data Section
; --------------------------------------------------------------------------
section '.data' data readable writeable
include 'Globals.Inc'
; --------------------------------------------------------------------------
; Code Modules
; --------------------------------------------------------------------------
section '.code' code readable executable
include 'TApp.Asm'
include 'TConsole.Asm'
include 'TString.Asm'
include 'TCmdBuf.Asm'
include 'TGame.Asm'
include 'TMsgTable.Asm'
include 'TCommon.Asm'
include 'TRandom.Asm'
include 'TArray.Asm'
include 'TFormat.Asm'
include 'TSrScan.Asm'
include 'TLrScan.Asm'
include 'TChart.Asm'
include 'TMove.Asm'
include 'TFinish.Asm'
include 'TAttack.Asm'
include 'TEvents.Asm'
include 'TNova.Asm'
include 'TPhasers.Asm'
include 'TShields.Asm'
include 'TDock.Asm'
include 'TPhotons.Asm'
include 'TPlanet.Asm'
include 'TImpulse.Asm'
include 'TLog.Asm'
;{INCLIMPL} (Code modules will be inserted before this line)
; --------------------------------------------------------------------------
; Entry Point
; --------------------------------------------------------------------------
align PROC_ALIGN
start:
call TApp_SetLocalDir
jnc .exit
call TApp_Init
call TApp_Run
.exit:
invoke ExitProcess, 0
; --------------------------------------------------------------------------
; Imports
; --------------------------------------------------------------------------
section '.idata' import data readable writeable
include 'Imports.Inc'
; --- EOF ---

View File

@ -0,0 +1,292 @@
_DEBUG = 1
; --- Parameters inside WndProc
hWnd equ [ebp + 8]
uiMsg equ [ebp + 12]
WParam equ [ebp + 16]
LParam equ [ebp + 20]
; --- Splitting WndProc parameters
macro mcLPtoXY LParam {
; OUT: EDX = Y coordinate or HEIGHT
; OUT: EAX = X coordinate or WIDTH
mov eax, LParam
mov edx, LParam
and eax, 0000FFFFh
shr edx, 16
}
; --- String operation (WCHAR)
macro mcStrCopy {
xor eax, eax
@@:
lodsw
stosw
test eax, eax
jnz @r
}
; --- Indirectly call STDCALL procedure
macro invoke api_proc, [arg]
{
common
if ~ arg eq
reverse
pushd arg
common
end if
call [api_proc]
}
macro rinvoke api_proc_reg, [arg]
{
common
if ~ arg eq
reverse
pushd arg
common
end if
call api_proc_reg
}
; --- FPU
macro mcFpuPushR32 r32
{
mov [glb_FPU_Int32], r32
fild [glb_FPU_Int32]
}
macro mcFpuPop
{
fstp [glb_dbl_FpuPopper]
}
; --- Heap allocator
macro mcMemAlloc hHeap, nBytes {
invoke HeapAlloc, hHeap, HEAP_NO_SERIALIZE, nBytes
}
macro mcMemFree hHeap, pBuf {
invoke HeapFree, hHeap, HEAP_NO_SERIALIZE, pBuf
}
macro mcGlobalMalloc nBytes {
mcMemAlloc [glb_HAllocator], nBytes
}
macro mcGlobalFree pBuf {
mcMemFree [glb_HAllocator], pBuf
}
; --- Page allocator
macro mcAllocatePages nBytes {
invoke VirtualAlloc, 0, nBytes, \
MEM_RESERVE or MEM_COMMIT, \
PAGE_READWRITE
}
macro mcReleasePages pData {
invoke VirtualFree, pData, 0, MEM_RELEASE
}
; --- Local variables
macro mcLoadLocalRef AnyReg, instance {
lea AnyReg, [esp + instance]
}
macro mcLoadLocal AnyReg, instance {
mov AnyReg, [esp + instance]
}
macro mcStoreThis {
mov [esp], ebx
}
macro mcLoadThis {
mov ebx, [esp]
}
macro mcStoreLocal instance, AnyReg {
mov [esp + instance], AnyReg
}
macro mcBeginLocals LocalSize {
sub esp, LocalSize
}
macro mcEndLocals LocalSize {
add esp, LocalSize
}
; --- Virtual call on the object instance
macro mcVirtCallOnEBX OfsMethod {
mov eax, [ebx]
call dword [eax + OfsMethod]
}
macro mcVirtCall Instance, OfsMethod {
lea ebx, [Instance]
mov eax, [ebx]
call dword [eax + OfsMethod]
}
; --- CALLBACK
macro mcProlog {
push ebp
mov ebp, esp
push ebx
push esi
push edi
}
macro mcEpilog {
pop edi
pop esi
pop ebx
leave
}
; --- Misc...
macro mc_CMP_ST0_ST1
{
fcomip st, st1
fstp [glb_dbl_FpuPopper]
}
macro mcLoadQuadStatePtr r32
{
mov r32, [glb_pGameState]
add r32, TGameState.game_QuadState
}
macro mcLoadNeg1 r32
{
mcZeroBits r32
dec r32
}
macro mcLoad8bitsToReg32 r32, _8bit_value
{
push _8bit_value
pop r32
}
macro mcLoad1 r32
{
mcZeroBits r32
inc r32
}
; ESI = source
; EDI = destination
macro mcMemCopy nBytesAligned4
{
mov ecx, nBytesAligned4
shr ecx, 2
rep movsd
}
macro mcMul10 r32 {
push esi
shl r32, 1
push r32
shl r32, 2
pop esi
add r32, esi
pop esi
}
macro mcZeroBits any_reg {
xor any_reg, any_reg
}
macro mcLoadRGB reg32, r8, g8, b8 {
mov reg32, (b8 shl 16) or (g8 shl 8) or r8
}
; --- Rectangle
macro mcRectCopy {
; ESI = source rectangle
; EDI = target rectangle
movsd
movsd
movsd
movsd
}
macro mcRectCopySafe {
; ESI = source rectangle
; EDI = target rectangle
push esi
movsd
movsd
movsd
movsd
pop esi
}
macro mcRectWidth r32, pRect {
mov r32, [pRect + RECT.rc_Right]
sub r32, [pRect + RECT.rc_Left]
}
macro mcRectHeight r32, pRect {
mov r32, [pRect + RECT.rc_Bottom]
sub r32, [pRect + RECT.rc_Top]
}
; --- Branching
macro mcOnRegEqu AnyReg, AnyValue, AnyLabel {
cmp AnyReg, AnyValue
je AnyLabel
}
macro mcOnRegNotEqu AnyReg, AnyValue, AnyLabel {
cmp AnyReg, AnyValue
jne AnyLabel
}
macro mcOnRegZero AnyReg, AnyLabel {
test AnyReg, AnyReg
jz AnyLabel
}
macro mcOnRegNotZero AnyReg, AnyLabel {
test AnyReg, AnyReg
jnz AnyLabel
}
; --- OOP
macro mcLoadMemberRef AnyReg, instance {
lea AnyReg, [ebx + instance]
}
macro mcLoadMember AnyReg, instance {
mov AnyReg, [ebx + instance]
}
macro mcStoreMember instance, AnyReg {
mov [ebx + instance], AnyReg
}
macro mcAttachVTable addrvtbl {
mov eax, addrvtbl
mov [ebx], eax
}
; --- EOF ---

View File

@ -0,0 +1,770 @@
; --------------------------------------------------------------------------
; FILE: TApp.Asm
; DATE: September 21, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; DESTRCT
; --------------------------------------------------------------------------
virtual at 0
loc84:
.nCountDown COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_SelfDestruct:
mcBeginLocals loc84.size
mov cl, DEV_COMPUTER
call TArray_IsDamaged
jnc .L5
call TConsole_ScrollUp
mov ecx, 686
call TConsole_ProutGameMsg
call TConsole_ScrollUp
jmp .done
.L5:
call TConsole_ScrollUp
mov ecx, 290
call TConsole_ProutGameMsg
mov ecx, 687
call TConsole_Prout
inc ecx
call TConsole_Prout
call TConsole_ScrollUp
mcLoad8bitsToReg32 ecx, 10
mcStoreLocal loc84.nCountDown, ecx
.pre_sequence:
mov ecx, 694
call TConsole_Cram
mcLoadLocal eax, loc84.nCountDown
call TConsole_CramInt
call TConsole_RefreshCaretLine
invoke Sleep, 1000
dec [esp + loc84.nCountDown]
cmp [esp + loc84.nCountDown], 6
jae .pre_sequence
call TConsole_ScrollUp
call TConsole_ScrollUp
mov cl, ATTR_PROMPT_TEXT
call TConsole_SetAttr
mov ecx, 689
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TGame_Prompt
call TConsole_ScrollUp
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .password_rejected
mcLoadGameDataPtr edi
add edi, TREKDATA.PASSWD
call TString_AnsiEqual
jnc .password_rejected
mov ecx, 692
call TConsole_ProutGameMsg
mov cl, 22
call TConsole_RepeatBlank
.final_sequence:
mov ecx, 694
call TConsole_Cram
mcLoadLocal eax, loc84.nCountDown
call TConsole_CramInt
call TConsole_RefreshCaretLine
invoke Sleep, 1000
dec [esp + loc84.nCountDown]
jnz .final_sequence
call TConsole_ScrollUp
fld [glb_dbl_0dot05]
call TRandom_Ranf
mc_CMP_ST0_ST1
jnc .everyone_wasted
mov ecx, 693
call TConsole_ProutGameMsg
invoke Sleep, 1000
.everyone_wasted:
call TConsole_ScrollUp
call TConsole_ScrollUp
call TPlanet_KaBoom
jmp .done
.password_rejected:
mov ecx, 695
call TConsole_ProutGameMsg
inc ecx
call TConsole_Prout
call TConsole_ScrollUp
call TConsole_ScrollUp
.done:
mcEndLocals loc84.size
ret
; --------------------------------------------------------------------------
; PLAQUE
; --------------------------------------------------------------------------
virtual at 0
loc112:
.pNextInByte PCHAR ?
.pNextOutByte PCHAR ?
.bufAnsiValue CHARS 16
.bufAnsiKirkAlias CHARS 32
.pAllocatedOutBuffer PCHAR ?
.timeNow rb SYSTIME.size
.nLenName COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_PlaqueProcessor:
mcBeginLocals loc112.size
mov ecx, 727
call TGame_Prompt
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .done
mcLoadLocalRef edi, loc112.bufAnsiKirkAlias
call TString_AnsiCopy
mov esi, glb_Plaque
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, 8192 ; <-- 2 pages is enough!
mcStoreLocal loc112.pAllocatedOutBuffer, eax
mcStoreLocal loc112.pNextOutByte, eax
mcStoreLocal loc112.pNextInByte, esi
.load_input_byte:
mcLoadLocal esi, loc112.pNextInByte
inc [esp + loc112.pNextInByte]
mov al, [esi]
mcOnRegEqu al, PLAQUE_STRING, .dump_string
mcOnRegEqu al, PLAQUE_INSERT_DATE, .dump_date
mcOnRegEqu al, PLAQUE_INSERT_KLRATE, .dump_klrate
mcOnRegEqu al, PLAQUE_INSERT_LEVEL, .dump_level
mcOnRegEqu al, PLAQUE_INSERT_NAME, .dump_captain_name
mcOnRegEqu al, PLAQUE_INSERT_SCORE, .dump_score
mcOnRegEqu al, PLAQUE_END_OF_LINE, .dump_CR_LF
mcOnRegEqu al, PLAQUE_END_OF_ALL, .save
;
; This byte is a count of charactes defined by next byte
;
movzx ecx, al
mov al, [esi + 1]
inc [esp + loc112.pNextInByte]
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep stosb
jmp .load_input_byte
.dump_string:
;
; The next byte is a length of data to be copied
;
movzx ecx, byte [esi + 1]
inc [esp + loc112.pNextInByte]
;
; Copy data
;
mcLoadLocal edi, loc112.pNextOutByte
mcLoadLocal esi, loc112.pNextInByte
add [esp + loc112.pNextInByte], ecx
add [esp + loc112.pNextOutByte], ecx
rep movsb
jmp .load_input_byte
.dump_date:
mcLoadLocalRef edi, loc112.timeNow
invoke GetLocalTime, edi
movzx ecx, word [edi + SYSTIME.wMonth]
add ecx, 714
call TMsgTable_GetItem
call TCmdBuf_AnsiStrLen
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep movsb
mov al, ' '
stosb
inc [esp + loc112.pNextOutByte]
mcLoadLocalRef esi, loc112.timeNow
movzx eax, word [esi + SYSTIME.wDay]
mcLoadLocalRef edi, loc112.bufAnsiValue
call TFormat_Int32
mov esi, edi
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep movsb
mov al, ','
stosb
mov al, ' '
stosb
add [esp + loc112.pNextOutByte], 2
mcLoadLocalRef esi, loc112.timeNow
movzx eax, word [esi + SYSTIME.wYear]
mcLoadLocalRef edi, loc112.bufAnsiValue
call TFormat_Int32
mov esi, edi
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep movsb
jmp .load_input_byte
.dump_klrate:
mov cl, 2
mcLoadLocalRef edi, loc112.bufAnsiValue
fld [glb_dbl_KlingonsPerDate]
call TFormat_Double
mov esi, edi
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep movsb
jmp .load_input_byte
.dump_level:
mcLoadGameDataPtr esi
movzx ecx, [esi + TREKDATA.SKILL]
add cl, 12
call TMsgTable_GetItem
mcLoadLocal edi, loc112.pNextOutByte
mcZeroBits eax
mcZeroBits ecx
.next_level_char:
lodsb
mcOnRegZero eax, .level_copied
stosb
inc ecx
jmp .next_level_char
.level_copied:
add [esp + loc112.pNextOutByte], ecx
jmp .load_input_byte
.dump_captain_name:
;
; NSKIP = 65 - LEN (NAME)/2
;
mcLoadLocalRef esi, loc112.bufAnsiKirkAlias
call TCmdBuf_AnsiStrLen
mcStoreLocal loc112.nLenName, ecx
mcLoad8bitsToReg32 eax, 65
shr ecx, 1
sub eax, ecx
mov cl, ' '
xchg eax, ecx
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep stosb
mcLoadLocalRef esi, loc112.bufAnsiKirkAlias
mcLoadLocal ecx, loc112.nLenName
add [esp + loc112.pNextOutByte], ecx
rep movsb
jmp .dump_CR_LF
.dump_score:
mcLoadLocalRef edi, loc112.bufAnsiValue
mov eax, [glb_Score]
call TFormat_Int32
mov esi, edi
mcLoadLocal edi, loc112.pNextOutByte
add [esp + loc112.pNextOutByte], ecx
rep movsb
jmp .load_input_byte
.dump_CR_LF:
mcLoadLocal edi, loc112.pNextOutByte
mov al, 0Dh
stosb
mov al, 0Ah
stosb
mcStoreLocal loc112.pNextOutByte, edi
jmp .load_input_byte
.save:
invoke CreateFileAnsi, str_PlaqueFile, GENERIC_WRITE, 0, 0,\
CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0
mov ebx, eax
mcOnRegEqu ebx, -1, .done
mcLoadLocal esi, loc112.pAllocatedOutBuffer
mcLoadLocalRef edi, loc112.pNextInByte
mcLoadLocal ecx, loc112.pNextOutByte
sub ecx, esi
invoke WriteFile, ebx, esi, ecx, edi, 0
invoke CloseHandle, ebx
call TConsole_SetGameMsgAttr
mov cl, 3
call TConsole_Skip
mov ecx, 728
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
mov cl, 3
call TConsole_Skip
.done:
mcEndLocals loc112.size
ret
; --------------------------------------------------------------------------
; Output:
; CF = TRUE if directory has been set
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_SetLocalDir:
mcBeginLocals 260*2
mov esi, esp
invoke GetModuleFileName, 0, esi, 260
mcZeroBits eax
mcZeroBits edi
.next_char:
lodsw
mcOnRegZero eax, .set_dir
cmp al, '\'
jne .next_char
mov edi, esi
jmp .next_char
.set_dir:
mcOnRegZero edi, .failed
stosw
invoke SetCurrentDir, esp
mcOnRegZero eax, .failed
.done:
mcEndLocals 260*2
stc
ret
.failed:
invoke MessageBox, 0, str_SetDirFailed, str_MainWndTitle, 10h
mcEndLocals 260*2
ret
; --------------------------------------------------------------------------
; Input:
; EAX = HDC
; --------------------------------------------------------------------------
virtual at 0
loc1:
.hDC HDC ?
.hMemDC HDC ?
.hSurfaceBmp HBITMAP ?
.hDefaultBmp HBITMAP ?
.hDefaultFont HFONT ?
.rect_Client rb RECT.size
.bkMode INT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_WmPaint:
mcBeginLocals loc1.size
mcStoreLocal loc1.hDC, eax
mcLoadLocalRef edi, loc1.rect_Client
invoke GetClientRect, [glb_MainWnd], edi
mcLoadLocal edx, loc1.hDC
invoke CreateCompatibleDC, edx
mcStoreLocal loc1.hMemDC, eax
mov ebx, esp
invoke CreateCompatibleBitmap, [ebx + loc1.hDC], \
dword [ebx + loc1.rect_Client + RECT.rc_Right], \
dword [ebx + loc1.rect_Client + RECT.rc_Bottom]
mcStoreLocal loc1.hSurfaceBmp, eax
invoke SelectObject, [ebx + loc1.hMemDC], eax
mcStoreLocal loc1.hDefaultBmp, eax
invoke GetStockObject, BLACK_BRUSH
mcLoadLocalRef esi, loc1.rect_Client
invoke FillRect, [ebx + loc1.hMemDC], esi, eax
invoke SetBkMode, [ebx + loc1.hMemDC], TRANSPARENT
mcStoreLocal loc1.bkMode, eax
invoke SelectObject, [ebx + loc1.hMemDC], [glb_Font]
mcStoreLocal loc1.hDefaultFont, eax
mcLoadLocal edx, loc1.hMemDC
call TConsole_DrawAllLines
mov ebx, esp
invoke SetBkMode, [ebx + loc1.hMemDC], [ebx + loc1.bkMode]
invoke SelectObject, [ebx + loc1.hMemDC], [ebx + loc1.hDefaultFont]
mcZeroBits ecx
invoke BitBlt, [ebx + loc1.hDC], ecx, ecx, \
dword [ebx + loc1.rect_Client + RECT.rc_Right], \
dword [ebx + loc1.rect_Client + RECT.rc_Bottom], \
[ebx + loc1.hMemDC], ecx, ecx, SRCCOPY
invoke SelectObject, [ebx + loc1.hMemDC], [ebx + loc1.hDefaultBmp]
invoke DeleteObject, [ebx + loc1.hSurfaceBmp]
invoke DeleteDC, [ebx + loc1.hMemDC]
mcEndLocals loc1.size
ret
; --------------------------------------------------------------------------
; Input:
; EAX = WCHAR received from user
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_WmChar:
and eax, 0FFh
cmp al, 20h
jb .control_char
cmp al, 'a'
jb .draw_symbol
cmp al, 'z'
ja .draw_symbol
sub al, 20h
.draw_symbol:
mov cl, ATTR_PROMPT_VALUE
call TConsole_SetAttr
call TCmdBuf_PutChar
call TConsole_PutChar
call TConsole_RefreshCaretLine
ret
.backspace:
call TCmdBuf_IsEmpty
jnc .del_last_char
ret
.del_last_char:
call TCmdBuf_Backspace
call TConsole_Backspace
ret
.command_complete:
call TConsole_ScrollUp
call TCmdBuf_Parse
lock inc [glb_GameThreadBusy]
ret
.key_escape:
ret
.control_char:
cmp al, CHAR_BACKSPACE
je .backspace
cmp al, CHAR_ENTER
je .command_complete
cmp al, CHAR_ESC
je .key_escape
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_QueryTextSize:
invoke GetDC, 0
mov esi, eax
invoke SelectObject, eax, [glb_Font]
push eax
invoke GetTextExtentPoint32, esi, str_CharSizeText, 2, glb_CharSize
pop edx
invoke SelectObject, esi, edx
invoke ReleaseDC, 0, esi
shr dword [glb_CharSize + SIZE.size_Width], 1
ret
; --------------------------------------------------------------------------
; Input:
; ESI = address of rectangle to redraw
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_RefreshMainWndRect:
mov ebx, [glb_MainWnd]
invoke InvalidateRect, ebx, esi, 1
invoke UpdateWindow, ebx
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_AdjustWndRect:
mcBeginLocals RECT.size
mov esi, esp
mcZeroBits eax
mov [esi + RECT.rc_Left], eax
mov [esi + RECT.rc_Top], eax
mov ecx, dword [glb_CharSize + SIZE.size_Width]
imul ecx, CONSOLE_COLS
add ecx, 2
mov [esi + RECT.rc_Right], ecx
mov ecx, dword [glb_CharSize + SIZE.size_Height]
imul ecx, CONSOLE_ROWS
add ecx, 2
mov [esi + RECT.rc_Bottom], ecx
invoke OffsetRect, esi, 200, 32
invoke AdjustWindowRect, esi, WS_NOSIZEWND, 0
mcRectWidth ecx, esi
mcRectHeight edx, esi
invoke MoveWindow, [glb_MainWnd], \
[esi + RECT.rc_Left], \
[esi + RECT.rc_Top], \
ecx, edx, 0
mcEndLocals RECT.size
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_WmCreate:
call TCommon_Allocate
call TMsgTable_Load
call TCmdBuf_Create
call TApp_QueryTextSize
call TApp_AdjustWndRect
invoke PostMessage, [glb_MainWnd], WM_CUSTOM_DO_PRELIM, 0, 0
ret
; --------------------------------------------------------------------------
; Input:
; hWnd, uiMsg, WParam, LParam
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_WndProc:
mcProlog
mov eax, uiMsg
mcOnRegEqu eax, WM_CREATE, .OnCreate
mcOnRegEqu eax, WM_DESTROY, .OnDestroy
mcOnRegEqu eax, WM_ERASEBKGND, .OnEraseBkGnd
mcOnRegEqu eax, WM_PAINT, .OnPaint
mcOnRegEqu eax, WM_CHAR, .OnChar
mcOnRegEqu eax, WM_CUSTOM_DO_PRELIM, .StartGameThread
invoke DefWindowProc, hWnd, uiMsg, WParam, LParam
.exit:
mcEpilog
ret 10h
.StartGameThread:
invoke CreateThread, 0, 0, TGame_Thread, 0, 0, 0
.ret_zero:
mcZeroBits eax
jmp .exit
.OnCreate:
mov eax, hWnd
mov [glb_MainWnd], eax
call TApp_WmCreate
jmp .ret_zero
.OnDestroy:
invoke PostQuitMessage, 0
jmp .ret_zero
.OnEraseBkGnd:
mcLoad1 eax
jmp .exit
.OnPaint:
mcBeginLocals PAINTSTRUCT.size
invoke BeginPaint, [glb_MainWnd], esp
call TApp_WmPaint
invoke EndPaint, [glb_MainWnd], esp
mcEndLocals PAINTSTRUCT.size
jmp .ret_zero
.OnChar:
mcZeroBits eax
lock add [glb_GameThreadBusy], eax
jnz .ret_zero
mov eax, WParam
call TApp_WmChar
jmp .ret_zero
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_CreateFont:
mcBeginLocals LOGFONT.size
mov edi, esp
mov ecx, LOGFONT.size
mcZeroBits eax
rep stosb
mov edx, FW_NORMAL
mov [esp + LOGFONT.lf_Weight], edx
mov dl, DEFAULT_CHARSET
mov [esp + LOGFONT.lf_CharSet], dl
lea edi, [esp + LOGFONT.lf_FaceName]
mov esi, str_FontFace
call TString_Copy
invoke GetDC, 0
mov esi, eax
invoke GetDeviceCaps, esi, LOGPIXELSY
invoke MulDiv, 12, eax, 72
neg eax
mov [esp + LOGFONT.lf_Height], eax
invoke ReleaseDC, 0, esi
invoke CreateFontIndirect, esp
mov [glb_Font], eax
mcEndLocals LOGFONT.size
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_RegisterWnd:
mcBeginLocals WNDCLASS.size
mov ebx, esp
mcZeroBits ecx
mcStoreMember WNDCLASS.wc_lpszMenuName, ecx
mcStoreMember WNDCLASS.wc_cbClsExtra, ecx
mcStoreMember WNDCLASS.wc_cbWndExtra, ecx
mcStoreMember WNDCLASS.wc_hbrBackground, ecx
invoke LoadCursor, 0, IDC_ARROW
mcStoreMember WNDCLASS.wc_hCursor, eax
invoke LoadIcon, 0, IDI_EXCLAMATION
mcStoreMember WNDCLASS.wc_hIcon, eax
mov eax, [glb_Instance]
mcStoreMember WNDCLASS.wc_hInstance, eax
mov eax, TApp_WndProc
mcStoreMember WNDCLASS.wc_lpfnWndProc, eax
mov eax, str_MainWndClass
mcStoreMember WNDCLASS.wc_lpszClassName, eax
invoke RegisterClass, ebx
mcEndLocals WNDCLASS.size
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_CreateMainWnd:
invoke CreateWindowEx, WS_EX_APPWINDOW, str_MainWndClass, \
str_MainWndTitle, WS_NOSIZEWND, \
80, 40, 500, 500, \
0, 0, [glb_Instance], 0
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_Init:
invoke GetModuleHandle, 0
mov [glb_Instance], eax
invoke HeapCreate, HEAP_NO_SERIALIZE, 0x20000, 0
mov [glb_Allocator], eax
call TRandom_Create
call TApp_RegisterWnd
call TApp_CreateFont
call TApp_CreateMainWnd
call TConsole_Create
call TLog_Create
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TApp_Run:
mcBeginLocals MSG.size
mov esi, [glb_MainWnd]
invoke ShowWindow, esi, SW_SHOWNORMAL
invoke UpdateWindow, esi
@@:
mcZeroBits eax
mov edi, esp
invoke GetMessage, edi, eax, eax, eax
mcOnRegZero eax, .done
invoke TranslateMessage, edi
invoke DispatchMessage, edi
jmp @r
.done:
call TLog_Disable
mcEndLocals MSG.size
ret
; --- EOF ---

View File

@ -0,0 +1,677 @@
; --------------------------------------------------------------------------
; FILE: TArray.Asm
; DATE: October 4, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; LEAVE
; --------------------------------------------------------------------------
; Input:
; ECX = 1-based index (IESC) of the leaving enemy
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_Leave:
pushad
mcLoadGameDataPtr ebx
movzx edx, [ebx + TREKDATA.NENHERE]
dec edx
dec ecx
mcLoadMemberRef edi, TREKDATA.KX
mov al, [edi + edx]
mov [edi + ecx], al
mcLoadMemberRef edi, TREKDATA.KY
mov al, [edi + edx]
mov [edi + ecx], al
imul ecx, 10
imul edx, 10
mcLoadMemberRef edi, TREKDATA.KPOWER
fld tbyte [edi + edx]
fstp tbyte [edi + ecx]
mcLoadMemberRef edi, TREKDATA.KDIST
fld tbyte [edi + edx]
fstp tbyte [edi + ecx]
dec [ebx + TREKDATA.KLHERE]
dec [ebx + TREKDATA.NENHERE]
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED
je .done
call TCommon_NewCondition
.done:
popad
ret
; --------------------------------------------------------------------------
; Input:
; EDI = array relative offset
; ECX = 1-based index of DOUBLE cell
; ST(0) = value to store
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetDouble:
push eax ecx
movzx ecx, cl
dec ecx
imul ecx, 10
mcLoadGameDataPtr eax
add edi, eax
fstp tbyte [edi + ecx]
pop ecx eax
ret
; --------------------------------------------------------------------------
; Input:
; CL = 1-based index of KPOWER cell
; Output:
; EDX = address of that DOUBLE cell
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_KlingonPowerPtr:
push ecx
movzx ecx, cl
mcLoadGameDataPtr edx
add edx, TREKDATA.KPOWER
dec ecx
imul ecx, 10
add edx, ecx
pop ecx
ret
; --------------------------------------------------------------------------
; Input:
; EDI = array relative offset
; CL = 1-based index of DOUBLE cell
; Output:
; ST(0) = loaded value
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GetDouble:
push eax ecx
movzx ecx, cl
dec ecx
imul ecx, 10
mcLoadGameDataPtr eax
add edi, eax
fld tbyte [edi + ecx]
pop ecx eax
ret
; --------------------------------------------------------------------------
; Input:
; CL = 1-based index of DAMAGE cell
; Output:
; ST(0) = loaded value
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GetDblDamage:
push edi
mcLoad8bitsToReg32 edi, TREKDATA.DAMAGE
call TArray_GetDouble
pop edi
ret
; --------------------------------------------------------------------------
; Input:
; CL = 1-based index of DEVICE
; Output:
; CF=1 if device is damaged
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_IsDamaged:
call TArray_GetDblDamage
fldz
mc_CMP_ST0_ST1
jz .no_damage
stc
ret
.no_damage:
clc
ret
; --------------------------------------------------------------------------
; Input:
; ECX = 1-based index of KPOWER cell
; Output:
; ST(0) = loaded value
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GetDblKPower:
push edi
mcLoad8bitsToReg32 edi, TREKDATA.KPOWER
call TArray_GetDouble
pop edi
ret
; --------------------------------------------------------------------------
; Input:
; ECX = 1-based index of KDIST cell
; Output:
; ST(0) = loaded value
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GetDblKDist:
push edi
mcLoad8bitsToReg32 edi, TREKDATA.KDIST
call TArray_GetDouble
pop edi
ret
; --------------------------------------------------------------------------
; Input:
; ECX = 1-based index of DAMAGE cell
; ST(0) = value to store
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetDblDamage:
push edi
mcLoad8bitsToReg32 edi, TREKDATA.DAMAGE
call TArray_SetDouble
pop edi
ret
; --------------------------------------------------------------------------
; Input:
; ECX = 1-based index of KPOWER cell
; ST(0) = value to store
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetDblKPower:
push edi
mcLoad8bitsToReg32 edi, TREKDATA.KPOWER
call TArray_SetDouble
pop edi
ret
; --------------------------------------------------------------------------
; Input:
; ECX = 1-based index of KDIST cell
; ST(0) = value to store
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetDblKDist:
push edi
mcLoad8bitsToReg32 edi, TREKDATA.KDIST
call TArray_SetDouble
pop edi
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..10]
; DL = Y coordinate in range [1..10]
; Output:
; EBX = address of QUAD (X,Y)
; NOTE:
; Coordinates are preserved during the call
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_QuadPtr:
push eax ecx edx
;
; I = (X-1)*10 + (Y-1)
;
dec al
dec dl
cbw
imul ax, 10
add al, dl
movzx ecx, al
;
; Load address into EBX
;
mov ebx, [glb_pGameData]
lea ebx, [ebx + ecx + TREKDATA.QUAD]
pop edx ecx eax
ret
; --------------------------------------------------------------------------
; Output:
; CF=TRUE if CHAR_WEB is the only element encountered around
; the quadrant edges.
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_IsWebComplete:
;
; Check the way from sector 1-1 to sector 1-10
;
mcLoad1 eax
mov edx, eax
call TArray_QuadPtr
mcLoad8bitsToReg32 ecx, 10
mov al, CHAR_WEB
.check_1:
cmp [ebx], al
jne .return_false
inc ebx
loop .check_1
;
; Check the way from sector 10-1 to sector 10-10
;
mov al, 10
mov dl, 1
call TArray_QuadPtr
mcLoad8bitsToReg32 ecx, 10
mov al, CHAR_WEB
.check_2:
cmp [ebx], al
jne .return_false
inc ebx
loop .check_2
;
; Check the vertical ways:
; 1. From sector 1-1 to sector 10-1
; 2. From sector 1-10 to sector 10-10
;
mov al, 2
mov dl, 1
call TArray_QuadPtr
mcLoad8bitsToReg32 ecx, 8
mov al, CHAR_WEB
.check_3:
cmp [ebx], al
jne .return_false
cmp [ebx + 9], al
jne .return_false
add ebx, 10
loop .check_3
;
; All plugged!
;
stc
ret
.return_false:
clc
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetShip:
mcLoadGameDataPtr ebx
mcLoadMember al, TREKDATA.SECTX
mcLoadMember dl, TREKDATA.SECTY
push ebx
call TArray_QuadPtr
pop esi
mov al, [esi + TREKDATA.SHIP]
mov [ebx], al
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; ECX = index into array (NOT OFFSET)
; NOTE:
; Coordinates are preserved during the call
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_8x8Index:
;
; In STAR TREK cosmos: coordinate X is row and
; coordinate Y is column in the matrix, so
; index is calculated as:
;
; I = (X-1)*8 + (Y-1)
;
push eax edx
dec al
dec dl
shl al, 3
add al, dl
movzx ecx, al
pop edx eax
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; EBX = address of SCANNED (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_ScannedQuadPtr:
push ecx
call TArray_8x8Index
mov ebx, [glb_pGameData]
lea ebx, [ebx + ecx + TREKDATA.SCANNED]
pop ecx
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetScanned:
push ebx
call TArray_ScannedQuadPtr
mov byte [ebx], 1
pop ebx
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; CF=TRUE if quadrant was scanned by SRSCAN command
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_IsScanned:
push eax
push ebx
call TArray_ScannedQuadPtr
mov al, [ebx]
pop ebx
shr al, 1
pop eax
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; EBX = address of NEWSTUF (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_NewStufPtr:
push ecx
call TArray_8x8Index
mov ebx, [glb_pGameData]
lea ebx, [ebx + ecx + TREKDATA.NEWSTUF]
pop ecx
ret
; --------------------------------------------------------------------------
; Output:
; EBX = address of NEWSTUF (QUADX,QUADY) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_MyNewStufPtr:
push eax edx esi
mov esi, [glb_pGameData]
mov al, [esi + TREKDATA.QUADX]
mov dl, [esi + TREKDATA.QUADY]
call TArray_NewStufPtr
pop esi edx eax
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; EBX = address of GALAXY (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GalaxyPtr:
push ecx
call TArray_8x8Index
mov ebx, [glb_pGameData]
lea ebx, [ebx + ecx*4 + TREKDATA.GALAXY]
pop ecx
ret
; --------------------------------------------------------------------------
; Input:
; AL = quadrant X coordinate in range [1..8]
; DL = quadrant Y coordinate in range [1..8]
; ESI = TPlanet address
; Output:
; CF=1 if location is matching PLNETS array item
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_IsPlanetHere:
cmp [esi + TPlanet.planet_X], al
jne .ret_false
cmp [esi + TPlanet.planet_Y], dl
jne .ret_false
stc
ret
.ret_false:
clc
ret
; --------------------------------------------------------------------------
; Input:
; AL = quadrant X coordinate in range [1..8]
; DL = quadrant Y coordinate in range [1..8]
; ECX = commander index (1-based)
; Output:
; CF=1 if location is matching CX,CY arrays
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_IsCommanderHere:
push ebx ecx esi edi
mcLoadGameDataPtr ebx
mcLoadMemberRef esi, TREKDATA.CX
mcLoadMemberRef edi, TREKDATA.CY
dec ecx
cmp [esi + ecx], al
jne .ret_false
cmp [edi + ecx], dl
jne .ret_false
pop edi esi ecx ebx
stc
ret
.ret_false:
pop edi esi ecx ebx
clc
ret
; --------------------------------------------------------------------------
; Input:
; AL = quadrant X coordinate in range [1..8]
; DL = quadrant Y coordinate in range [1..8]
; Output:
; ECX = 1-based index into PLNETS array or zero
; ESI = address of TPlanet structure
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_FindPlanet:
mcLoadGameDataPtr ebx
mcLoadMemberRef esi, TREKDATA.PLNETS
mcLoad1 ecx
.check_planet:
call TArray_IsPlanetHere
jc .done
inc ecx
cmp cl, [ebx + TREKDATA.INPLAN]
ja .ret_false
add esi, TPlanet.size
jmp .check_planet
.ret_false:
mcZeroBits ecx
.done:
ret
; --------------------------------------------------------------------------
; Input:
; AL = quadrant X coordinate in range [1..8]
; DL = quadrant Y coordinate in range [1..8]
; Output:
; ECX = 1-based index into CX,CY arrays or zero
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_FindCommander:
mcLoadGameDataPtr esi
mcLoad1 ecx
.scan:
call TArray_IsCommanderHere
jc .found_it
inc ecx
cmp cl, [esi + TREKDATA.REMCOM]
jbe .scan
mcZeroBits ecx
.found_it:
ret
; --------------------------------------------------------------------------
; Input:
; ECX = planet index (1-based)
; Output:
; EDI = address of TPlanet structure
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_PlanetPtr:
dec ecx
mcLoadGameDataPtr edi
imul ecx, TPlanet.size
lea edi, [edi + ecx + TREKDATA.PLNETS]
ret
; --------------------------------------------------------------------------
; Output:
; EBX = address of GALAXY (QUADX,QUADY) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_MyGalaxyPtr:
push eax edx esi
mov esi, [glb_pGameData]
mov al, [esi + TREKDATA.QUADX]
mov dl, [esi + TREKDATA.QUADY]
call TArray_GalaxyPtr
pop esi edx eax
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; EBX = address of STARCH (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_StarChartPtr:
push ecx
call TArray_8x8Index
mov ebx, [glb_pGameData]
lea ebx, [ebx + ecx*4 + TREKDATA.STARCH]
pop ecx
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; ECX = value of STARCH (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GetStarChartValue:
push ebx
call TArray_StarChartPtr
mov ecx, [ebx]
pop ebx
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; Output:
; ECX = value of GALAXY (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_GetGalaxyValue:
push ebx
call TArray_GalaxyPtr
mov ecx, [ebx]
pop ebx
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; ECX = value to set at STARCH (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetStarChartValue:
push ebx
call TArray_StarChartPtr
mov [ebx], ecx
pop ebx
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate in range [1..8]
; DL = Y coordinate in range [1..8]
; ECX = value to set at GALAXY (8,8) cell
; NOTE:
; All registers are preserved
; --------------------------------------------------------------------------
align PROC_ALIGN
TArray_SetGalaxyValue:
push ebx
call TArray_GalaxyPtr
mov [ebx], ecx
pop ebx
ret
; --- EOF ---

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,317 @@
; --------------------------------------------------------------------------
; FILE: TChart.Asm
; DATE: October 12, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; Input:
; EAX = X quadrant coordinate
; EDX = Y quadrant coordinate
; --------------------------------------------------------------------------
align PROC_ALIGN
TChart_SetQuadAttr:
push ebx ecx
mcLoadGameDataPtr ebx
cmp al, [ebx + TREKDATA.QUADX]
jne .no_ship_here
cmp dl, [ebx + TREKDATA.QUADY]
je .ship_here
.no_ship_here:
call TArray_IsScanned
jc .set_scanned_color
mov cl, ATTR_REPORT_VALUE
jmp .apply
.set_scanned_color:
mov cl, ATTR_PLANET
jmp .apply
.ship_here:
mov cl, ATTR_SHIP_QUAD
.apply:
call TConsole_SetAttr
pop ecx ebx
ret
; --------------------------------------------------------------------------
; CHART
; --------------------------------------------------------------------------
virtual at 0
loc25:
.nI INDEX ?
.nJ INDEX ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TChart_Main:
mcBeginLocals loc25.size
mov cl, ATTR_REPORT_TEXT
call TConsole_SetAttr
mcLoad8bitsToReg32 ecx, 136
call TConsole_Prout
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
mcLoad8bitsToReg32 ecx, 137
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 138
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 139
call TConsole_Prout
mcLoad1 eax
mcStoreLocal loc25.nI, eax
.row_begins:
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
mcLoadLocal eax, loc25.nI
call TConsole_CramInt
mcLoad8bitsToReg32 ecx, 140
call TConsole_Cram
mcLoad1 ecx
mcStoreLocal loc25.nJ, ecx
.load_chart_value:
mcLoadLocal eax, loc25.nI
mcLoadLocal edx, loc25.nJ
call TChart_SetQuadAttr
call TArray_GetStarChartValue
add ecx, 0
js .L10
jz .L20
cmp ecx, 999
ja .L35
call TArray_GetGalaxyValue
mov eax, ecx
.put_value:
mov cl, 5
call TConsole_CramIntWidth
jmp .L40
.L35:
lea eax, [ecx - 1000]
jmp .put_value
.L40:
inc [esp + loc25.nJ]
cmp [esp + loc25.nJ], 8
jbe .load_chart_value
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
call TConsole_ScrollUp
mcLoad8bitsToReg32 ecx, 139
call TConsole_Prout
inc [esp + loc25.nI]
cmp [esp + loc25.nI], 8
jbe .row_begins
call TConsole_ScrollUp
mov cl, ATTR_REPORT_TEXT
call TConsole_SetAttr
mov cl, 2
call TConsole_RepeatBlank
call TConsole_CramShip
mcLoad8bitsToReg32 ecx, 143
call TConsole_Cram
mov cl, 1
mcLoadGameDataPtr esi
mov al, [esi + TREKDATA.QUADX]
mov dl, [esi + TREKDATA.QUADY]
call TConsole_CramLoc
jmp .done
.L10:
mcLoad8bitsToReg32 ecx, 141
.L101:
call TConsole_Cram
jmp .L40
.L20:
mcLoad8bitsToReg32 ecx, 142
jmp .L101
.done:
call TConsole_ScrollUp
call TConsole_ScrollUp
mcEndLocals loc25.size
ret
; --------------------------------------------------------------------------
; SETWARP
; --------------------------------------------------------------------------
virtual at 0
loc51:
.pTrekData PVOID ?
.dbl_OLDFAC DOUBLE ?
.dbl_FNUM DOUBLE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TChart_SetWarp:
mcBeginLocals loc51.size
mcLoadGameDataPtr esi
mcStoreLocal loc51.pTrekData, esi
.L10:
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
jne .L20
mov ecx, 585
call TGame_Prompt
jmp .L10
.L20:
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .L40
fld [ebx + TCmdBuf.cmdbuf_FNUM]
fstp [esp + loc51.dbl_FNUM]
mov cl, DEV_WARP_ENGINES
call TArray_GetDblDamage
fld [glb_dbl_Ten]
mc_CMP_ST0_ST1
jc .L70
mov cl, DEV_WARP_ENGINES
call TArray_IsDamaged
jnc .validate_warp
fld [esp + loc51.dbl_FNUM]
fld [glb_dbl_4]
mc_CMP_ST0_ST1
jc .L80
.validate_warp:
fld1
fld [esp + loc51.dbl_FNUM]
mc_CMP_ST0_ST1
jc .L50
fld [esp + loc51.dbl_FNUM]
fld [glb_dbl_Ten]
mc_CMP_ST0_ST1
jc .L60
mcLoadLocal esi, loc51.pTrekData
fld [esi + TREKDATA.WARPFAC]
fstp [esp + loc51.dbl_OLDFAC]
fld [esp + loc51.dbl_FNUM]
fstp [esi + TREKDATA.WARPFAC]
fld [esp + loc51.dbl_FNUM]
fld st
fmulp
fstp [esi + TREKDATA.WFACSQ]
fld [esp + loc51.dbl_OLDFAC]
fld [esi + TREKDATA.WARPFAC]
mc_CMP_ST0_ST1
jc .L31
jz .L31
fld [glb_dbl_6]
fld [esi + TREKDATA.WARPFAC]
mc_CMP_ST0_ST1
jc .L31
jz .L31
fld [glb_dbl_8]
fld [esi + TREKDATA.WARPFAC]
mc_CMP_ST0_ST1
jc .L32
jmp .L33
.L31:
call TConsole_SetCrewMsgAttr
mov ecx, 586
call TConsole_Cram
mcLoadLocal esi, loc51.pTrekData
fld [esi + TREKDATA.WARPFAC]
mov cl, 1
call TConsole_CramFloat
mov ecx, 587
call TConsole_Prout
jmp .done
.L32:
call TConsole_SetCrewMsgAttr
mov ecx, 588
call TConsole_Prout
jmp .done
.L33:
mcLoadLocal esi, loc51.pTrekData
fld [esi + TREKDATA.WARPFAC]
fld [glb_dbl_Ten]
mc_CMP_ST0_ST1
jz .L36
call TConsole_SetCrewMsgAttr
mov ecx, 589
call TConsole_Prout
jmp .done
.L36:
call TConsole_SetCrewMsgAttr
mov ecx, 590
call TConsole_Prout
jmp .done
.L40:
call TMove_BegPardon
jmp .done
.L50:
call TConsole_SetCrewMsgAttr
mov ecx, 591
call TConsole_Prout
jmp .done
.L60:
call TConsole_SetCrewMsgAttr
mov ecx, 592
call TConsole_Prout
jmp .done
.L70:
mov ecx, 593
call TConsole_ProutGameMsg
jmp .done
.L80:
call TConsole_SetCrewMsgAttr
mov ecx, 594
call TConsole_Prout
mov ecx, 595
call TConsole_Prout
.done:
mcEndLocals loc51.size
ret
; --- EOF ---

View File

@ -0,0 +1,529 @@
; --------------------------------------------------------------------------
; FILE: TCmdBuf.Asm
; DATE: September 27, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; Input:
; ESI = ANSI token scanned
; CL = ANSI text to match (1-based index into message table)
; Output:
; CF=TRUE if first token exactly matches text at index in CL
; CF=FALSE if no match (message given to the user)
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_VerifyToken:
movzx ecx, cl
TCmdBuf_VerifyToken_ECX:
push esi
call TMsgTable_GetItem
pop edi
call TString_AnsiEqual
jnc .ret_false
ret
.ret_false:
call TConsole_ScrollUp
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 93
call TConsole_Prout
call TConsole_ScrollUp
clc
ret
; --------------------------------------------------------------------------
; Input:
; ESI = ANSI token scanned
; ECX = ANSI text to match (1-based index into message table)
; Output:
; CF=TRUE if text at EDI has a prefix like ESI
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_Crop:
push esi esi
call TMsgTable_GetItem
mov edi, esi
pop esi
mcZeroBits edx
mcZeroBits eax
.load_chars:
lodsb
mov dl, [edi]
inc edi
cmp dl, al
je .check_zero
mcOnRegZero eax, .match
pop esi
clc
ret
.check_zero:
mcOnRegNotZero eax, .load_chars
.match:
pop esi
stc
ret
; --------------------------------------------------------------------------
; Input:
; AX = WCHAR to append
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_PutChar:
mov ebx, [glb_pCmdBuf]
cmp [ebx + TCmdBuf.cmdbuf_CmdColumn], CMDBUF_MAX_CHARS
je .done
mcLoadMember ecx, TCmdBuf.cmdbuf_CmdColumn
mov [ebx + ecx*2], ax
inc [ebx + TCmdBuf.cmdbuf_CmdColumn]
.done:
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_Parse:
mcZeroBits eax
call TCmdBuf_PutChar
mov ebx, [glb_pCmdBuf]
mcStoreMember TCmdBuf.cmdbuf_NumTokens, eax
mcStoreMember TCmdBuf.cmdbuf_CmdColumn, eax
dec eax
mcStoreMember TCmdBuf.cmdbuf_TokenIterator, eax
inc eax
mov esi, ebx
mov edx, eax
mcLoadMemberRef edi, TCmdBuf.cmdbuf_CmdTokens
.load_char:
lodsw
mcOnRegZero eax, .done
cmp al, CHAR_BLANK
je .separator
mcOnRegNotZero edx, .load_char
lea edx, [esi - 2]
mov [edi], edx
add edi, 4
inc [ebx + TCmdBuf.cmdbuf_NumTokens]
cmp [ebx + TCmdBuf.cmdbuf_NumTokens], CMDBUF_MAX_TOKENS
je .done
jmp .load_char
.separator:
mcZeroBits edx
mov [esi - 2], dx
jmp .load_char
.done:
ret
; --------------------------------------------------------------------------
; Input:
; AL = character
; Output:
; CF = TRUE if AL is a digit
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_IsDigit:
cmp al, '0'
jb .false
cmp al, '9'
ja .false
stc
ret
.false:
clc
ret
; --------------------------------------------------------------------------
; Input:
; ESI = token address
; Output:
; CF = TRUE if token is a real value: "-100" or "5.6"
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_IsRealToken:
mcZeroBits ecx
mcZeroBits eax
mcZeroBits edi
.load_char:
mov ax, [esi + ecx*2]
inc ecx
mcOnRegZero eax, .true
mcOnRegEqu al, '-', .minus
mcOnRegEqu al, '.', .period
;
; Check if digit
;
call TCmdBuf_IsDigit
jc .load_char
.false:
clc
ret
.minus:
mcOnRegEqu ecx, 1, .load_char
jmp .false
.period:
mcOnRegNotZero edi, .false
mov edi, esi
jmp .load_char
.true:
stc
ret
; --------------------------------------------------------------------------
; Output:
; ESI = token address or NULL
; EAX = token type (CMD_TOKEN_ALPHA, CMD_TOKEN_REAL, CMD_TOKEN_EOL)
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_GetNextToken:
mov ebx, [glb_pCmdBuf]
inc [ebx + TCmdBuf.cmdbuf_TokenIterator]
mcLoadMember ecx, TCmdBuf.cmdbuf_TokenIterator
cmp ecx, [ebx + TCmdBuf.cmdbuf_NumTokens]
jae .end_of_line
mov esi, [ebx + ecx*4 + TCmdBuf.cmdbuf_CmdTokens]
call TCmdBuf_IsRealToken
jc .real_value
mcLoad8bitsToReg32 eax, CMD_TOKEN_ALPHA
ret
.real_value:
mcLoad8bitsToReg32 eax, CMD_TOKEN_REAL
ret
.end_of_line:
mcZeroBits eax
mcZeroBits esi
ret
; --------------------------------------------------------------------------
; Input:
; ESI = ANSI text
; AL = character to find
; Output:
; ECX = character offset (CF=TRUE)
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_AnsiFindChar:
mcZeroBits ecx
.test_char:
cmp byte [esi + ecx], 0
je .not_found
cmp [esi + ecx], al
je .found
inc ecx
jmp .test_char
.found:
stc
ret
.not_found:
clc
ret
; --------------------------------------------------------------------------
; Output:
; EBX = TCmdBuf instance
; ESI = ANSI token scanned
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_Scan:
call TCmdBuf_GetNextToken
mcStoreMember TCmdBuf.cmdbuf_KEY, al
mcZeroBits edx
mcStoreMember TCmdBuf.cmdbuf_INUM, edx
mcStoreMember TCmdBuf.cmdbuf_AnsiTokenBuf, dl
fldz
fstp [ebx + TCmdBuf.cmdbuf_FNUM]
mcOnRegZero esi, .done
;
; Convert the token into ANSI
;
mcLoadMemberRef edi, TCmdBuf.cmdbuf_AnsiTokenBuf
mov eax, edx
.convert_char:
lodsw
stosb
mcOnRegNotZero eax, .convert_char
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA
je .done
mcLoadMemberRef esi, TCmdBuf.cmdbuf_AnsiTokenBuf
mov al, '.'
call TCmdBuf_AnsiFindChar
jc .set_fp_num
;
; Integer value scanned
;
call TCmdBuf_AnsiStr2Int32
mcStoreMember TCmdBuf.cmdbuf_INUM, eax
fild [ebx + TCmdBuf.cmdbuf_INUM]
fstp [ebx + TCmdBuf.cmdbuf_FNUM]
jmp .done
.set_fp_num:
;
; FP value scanned
;
mcLoadMemberRef edi, TCmdBuf.cmdbuf_FNUM
call TCmdBuf_AnsiStr2Double
.done:
mcLoadMemberRef esi, TCmdBuf.cmdbuf_AnsiTokenBuf
ret
; --------------------------------------------------------------------------
; Input:
; ESI = ANSI text
; Output:
; ECX = number of characters in the string
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_AnsiStrLen:
push edx
mcZeroBits ecx
mcZeroBits edx
.check_char:
cmp [esi + ecx], dl
je .done
inc ecx
jmp .check_char
.done:
pop edx
ret
; --------------------------------------------------------------------------
; Input:
; ESI = ANSI text
; Output:
; EAX = converted value
; --------------------------------------------------------------------------
virtual at 0
loc5:
.bNegative BOOL ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_AnsiStr2Int32:
mcBeginLocals loc5.size
mcZeroBits eax
mcZeroBits edx
mcStoreLocal loc5.bNegative, eax
cmp byte [esi], '-'
jne .convert
inc [esp + loc5.bNegative]
inc esi
.convert:
mov dl, [esi]
mcOnRegZero edx, .apply_sign
sub dl, '0'
inc esi
imul eax, 10
add eax, edx
jmp .convert
.apply_sign:
cmp byte [esp + loc5.bNegative], 0
je .done
neg eax
.done:
mcEndLocals loc5.size
ret
; --------------------------------------------------------------------------
; Input:
; ESI = text
; EDI = pointer to DOUBLE value
; --------------------------------------------------------------------------
virtual at 0
loc6:
.pszDot PCHAR ?
.pszValue PCHAR ?
.bNegative BOOL ?
.iPart1 INT32 ?
.iPart2 INT32 ?
.pDblResult PDOUBLE ?
.dblPart1 DOUBLE ?
.dblPart2 DOUBLE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_AnsiStr2Double:
mcBeginLocals loc6.size
mcStoreLocal loc6.pszValue, esi
mcStoreLocal loc6.pDblResult, edi
mcZeroBits eax
mcStoreLocal loc6.bNegative, eax
mcStoreLocal loc6.pszDot, eax
cmp byte [esi], '-'
jne .parse
inc [esp + loc6.bNegative]
inc [esp + loc6.pszValue]
inc esi
.parse:
lodsb
mcOnRegZero eax, .analysis
mcOnRegEqu al, '.', .dot
jmp .parse
.dot:
lea edx, [esi - 1]
mcStoreLocal loc6.pszDot, edx
jmp .parse
.analysis:
cmp byte [esp + loc6.pszDot], 0
jne .combine_parts
;
; No decimal point
;
mcLoadLocal esi, loc6.pszValue
call TCmdBuf_AnsiStr2Int32
mcStoreLocal loc6.iPart1, eax
fild [esp + loc6.iPart1]
jmp .apply_sign
.combine_parts:
mcLoadLocal edi, loc6.pszDot
mcZeroBits al
stosb
fldz
fldz
fstp [esp + loc6.dblPart1]
fstp [esp + loc6.dblPart2]
mov esi, edi
call TCmdBuf_AnsiStr2Int32
mcStoreLocal loc6.iPart2, eax
mcLoadLocal esi, loc6.pszValue
call TCmdBuf_AnsiStr2Int32
mcStoreLocal loc6.iPart1, eax
mcLoadLocal esi, loc6.pszDot
inc esi
call TCmdBuf_AnsiStrLen
jecxz .combine
fild [esp + loc6.iPart2]
@@:
fld [glb_dbl_Ten]
fdivp
loop @r
fstp [esp + loc6.dblPart2]
.combine:
fild [esp + loc6.iPart1]
fld [esp + loc6.dblPart2]
faddp
.apply_sign:
cmp byte [esp + loc6.bNegative], 0
je .done
fchs
.done:
mcLoadLocal edi, loc6.pDblResult
fstp tbyte [edi]
mcEndLocals loc6.size
ret
; --------------------------------------------------------------------------
; Output:
; CF = TRUE if buffer has no characters
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_IsEmpty:
mov ebx, [glb_pCmdBuf]
cmp [ebx + TCmdBuf.cmdbuf_CmdColumn], 0
sete cl
shr cl, 1
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_Backspace:
mov ebx, [glb_pCmdBuf]
cmp [ebx + TCmdBuf.cmdbuf_CmdColumn], 0
je .done
dec [ebx + TCmdBuf.cmdbuf_CmdColumn]
.done:
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TCmdBuf_Create:
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TCmdBuf.size
mov [glb_pCmdBuf], eax
mov edi, eax
mcZeroBits eax
mov ecx, TCmdBuf.size
rep stosb
ret
; --- EOF ---

View File

@ -0,0 +1,37 @@
; --------------------------------------------------------------------------
; FILE: TCmdBuf.Inc
; DATE: September 27, 2008
; --------------------------------------------------------------------------
CMDBUF_ROOM_CHARS = 64
CMDBUF_MAX_CHARS = (CMDBUF_ROOM_CHARS - 1)
CMDBUF_MAX_TOKENS = 16
; --------------------------------------------------------------------------
CMD_TOKEN_EOL = 0
CMD_TOKEN_REAL = 1
CMD_TOKEN_ALPHA = 2
CMD_TOKEN_ERROR = 3
; --------------------------------------------------------------------------
virtual at 0
TCmdBuf:
.cmdbuf_FullBuffer WCHARS CMDBUF_ROOM_CHARS
.cmdbuf_CmdColumn INDEX ?
.cmdbuf_CmdTokens STRINGS CMDBUF_MAX_TOKENS
.cmdbuf_NumTokens COUNT ?
.cmdbuf_TokenIterator INDEX ?
.cmdbuf_AnsiTokenBuf CHARS CMDBUF_ROOM_CHARS
;
; If scanned token is of type CMD_TOKEN_REAL
; then following section is filled, otherwise
; all following members are set to zero
;
.cmdbuf_INUM INT32 ?
.cmdbuf_FNUM DOUBLE ?
.cmdbuf_KEY BYTE ?
.cmdbuf_Reserved BYTE ?
.size = $
end virtual
; --- EOF ---

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,185 @@
; --------------------------------------------------------------------------
; FILE: TCommon.Inc
; DATE: October 4, 2008
; --------------------------------------------------------------------------
DEV_SR_SENSORS = 1
DEV_LR_SENSORS = 2
DEV_PHASERS = 3
DEV_PHOTON_TUBES = 4
DEV_LIFE_SUPPORT = 5
DEV_WARP_ENGINES = 6
DEV_IMPULSE_ENGINES = 7
DEV_SHIELDS = 8
DEV_SUBSPACE_RADIO = 9
DEV_SHUTTLE_CRAFT = 10
DEV_COMPUTER = 11
DEV_TRANSPORTER = 12
DEV_SHIELD_CONTROL = 13
DEV_DEATHRAY = 14
CONDITION_GREEN = 1
CONDITION_RED = 2
CONDITION_YELLOW = 3
CONDITION_DOCKED = 4
virtual at 0
TPlanet:
.planet_X BYTE ?
.planet_Y BYTE ?
.planet_CLASS BYTE ?
.planet_DILITHIUM BYTE ?
.planet_SCANNED BYTE ?
.size = $
end virtual
virtual at 0
TREKDATA:
.CRYPROB DOUBLE ?
.DATE DOUBLE ?
.REMRES DOUBLE ?
.REMTIME DOUBLE ?
.KPOWER DOUBLES 20
.KDIST DOUBLES 20
.DAMAGE DOUBLES 14
.INRESOR DOUBLE ?
.INTIME DOUBLE ?
.INENRG DOUBLE ?
.INSHLD DOUBLE ?
.INLSR DOUBLE ?
.INDATE DOUBLE ?
.ENERGY DOUBLE ?
.SHLD DOUBLE ?
.WARPFAC DOUBLE ?
.WFACSQ DOUBLE ?
.LSUPRES DOUBLE ?
.DIST DOUBLE ?
.DIREC DOUBLE ?
.TIME DOUBLE ?
.DOCKDATE DOUBLE ?
.DAMFAC DOUBLE ?
.FUTURE1 DOUBLE ?
.FUTURE2 DOUBLE ?
.FUTURE3 DOUBLE ?
.FUTURE4 DOUBLE ?
.FUTURE5 DOUBLE ?
.FUTURE6 DOUBLE ?
.FUTURE7 DOUBLE ?
.HEIGHT DOUBLE ?
;
; Integer variables
;
align 4
.GALAXY INTEGERS 64
.STARCH INTEGERS 64
.INSTAR INT32 ?
.REMKL BYTE ?
.REMCOM BYTE ?
.REMBASE BYTE ?
.STARKL BYTE ?
.BASEKL BYTE ?
.KILLK BYTE ?
.KILLC BYTE ?
.CX BYTES 10
.CY BYTES 10
.BASEQX BYTES 5
.BASEQY BYTES 5
.NEWSTUF BYTES 64
.SCANNED BYTES 64
.PLNETS BYTES (10 * TPlanet.size)
.ISX BYTE ?
.ISY BYTE ?
.KSTUF4 BYTE ?
.KSTUF5 BYTE ?
.NSCREM BYTE ?
.NROMKL BYTE ?
.NROMREM BYTE ?
.NSCKILL BYTE ?
.ICRYSTL BYTE ?
.NPLANKL BYTE ?
.QUAD BYTES 100
.KX BYTES 20
.KY BYTES 20
.INKLING BYTE ?
.INBASE BYTE ?
.INCOM BYTE ?
.INTORPS BYTE ?
.SHLDUP BYTE ?
.CONDIT BYTE ?
.TORPS BYTE ?
.SHIP BYTE ?
.QUADX BYTE ?
.QUADY BYTE ?
.SECTX BYTE ?
.SECTY BYTE ?
.ITHX BYTE ?
.ITHY BYTE ?
.ITHERE BYTE ?
.LENGTH BYTE ?
.SKILL BYTE ?
.QTORPS BYTE ?
.NPTUBES BYTE ?
.PASSWD CHARS 12
.BASEX BYTE ?
.BASEY BYTE ?
.KLHERE BYTE ?
.COMHERE BYTE ?
.CASUAL BYTE ?
.NHELP BYTE ?
.NKINKS BYTE ?
.IDIDIT BYTE ?
.KDIDIT BYTE ?
.KSHOT BYTE ?
.GAMEWON BYTE ?
.ALIVE BYTE ?
.JUSTIN BYTE ?
.RESTING BYTE ?
.ALLDONE BYTE ?
.SHLDCHG BYTE ?
.THINGX BYTE ?
.THINGY BYTE ?
.PLNETX BYTE ?
.PLNETY BYTE ?
.INORBIT BYTE ?
.LANDED BYTE ?
.IPLANET BYTE ?
.IMINE BYTE ?
.INPLAN BYTE ?
.NENHERE BYTE ?
.ISHERE BYTE ?
.NEUTZ BYTE ?
.IRHERE BYTE ?
.ICRAFT BYTE ?
.IENTESC BYTE ?
.ISCRAFT BYTE ?
.ISATB BYTE ?
.ISCATE BYTE ?
.IPHWHO BYTE ?
.BATX BYTE ?
.BATY BYTE ?
.ICSOS BYTE ?
.ISSOS BYTE ?
.ISUBDAM BYTE ?
.SHUTUP BYTE ?
.size = $
end virtual
virtual at 0
TCommon:
.SNAP BYTE ?
.SNAPSHT BYTES TREKDATA.size
align 16
.GAMEDB BYTES TREKDATA.size
.size = $
end virtual
macro mcLoadGameDataPtr r32
{
mov r32, [glb_pGameData]
}
PTCommon equ dd
PTGameData equ dd
; --- EOF ---

View File

@ -0,0 +1,839 @@
; --------------------------------------------------------------------------
; FILE: TConsole.Asm
; DATE: September 21, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; CRAM3AS
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_Cram3Asterisks:
mcLoad8bitsToReg32 ecx, 181
call TConsole_Cram
ret
; --------------------------------------------------------------------------
; CRAMSHP
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramShip:
mcLoadGameDataPtr ebx
mcLoadMember al, TREKDATA.SHIP
mcOnRegEqu al, CHAR_ENTERPRISE, .good_ship
mcOnRegEqu al, CHAR_FQUEENE, .crappy_ship
ret
.good_ship:
push 144
jmp .dump
.crappy_ship:
push 145
.dump:
pop ecx
call TConsole_Cram
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_ScrollUp:
pushad
mov ebx, [glb_pConsole]
mov edi, ebx
lea esi, [edi + TLine.size]
mov ecx, TConsole.cons_LastRow
rep movsb
lea edi, [ebx + TConsole.cons_LastRow]
mcZeroBits eax
mov ecx, TLine.size
rep stosb
mcStoreMember TConsole.cons_CaretColumn, eax
mov esi, eax
call TApp_RefreshMainWndRect
mov al, 0Dh
call TLog_DumpChar
mov al, 0Ah
call TLog_DumpChar
popad
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_RefreshCaretLine:
mcBeginLocals RECT.size
mov esi, esp
invoke GetClientRect, [glb_MainWnd], esi
mov eax, [esi + RECT.rc_Bottom]
sub eax, dword [glb_CharSize + SIZE.size_Height]
dec eax
mov [esi + RECT.rc_Top], eax
call TApp_RefreshMainWndRect
mcEndLocals RECT.size
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_Backspace:
mov ebx, [glb_pConsole]
cmp [ebx + TConsole.cons_CaretColumn], 0
je .done
dec [ebx + TConsole.cons_CaretColumn]
mcZeroBits eax
call TConsole_PutChar
dec [ebx + TConsole.cons_CaretColumn]
call TConsole_RefreshCaretLine
.done:
ret
; --------------------------------------------------------------------------
; Input:
; AL = character code
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_PutChar:
mov ebx, [glb_pConsole]
cmp [ebx + TConsole.cons_CaretColumn], CONSOLE_LAST_COL
jae .done
mcLoadMember ecx, TConsole.cons_CaretColumn
inc [ebx + TConsole.cons_CaretColumn]
imul ecx, TCharacter.size
lea edi, [ebx + ecx + TConsole.cons_LastRow]
mcLoadMember edx, TConsole.cons_ActiveColor
mov [edi + TCharacter.char_Symbol], al
mov [edi + TCharacter.char_Attribute], dl
pushad
call TLog_DumpChar
popad
.done:
ret
; --------------------------------------------------------------------------
; Input:
; CL = index of color
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_SetAttr:
cmp cl, CONSOLE_ATTRS
jae .done
and ecx, 0FFh
push ebx
mov ebx, [glb_pConsole]
mcStoreMember TConsole.cons_ActiveColor, ecx
pop ebx
.done:
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_SetGameMsgAttr:
mov cl, ATTR_GAME_MSG
call TConsole_SetAttr
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_SetCrewMsgAttr:
mov cl, ATTR_CREW_MSG
call TConsole_SetAttr
ret
; --------------------------------------------------------------------------
; Input:
; AL = character code
; CL = number of characters
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_RepeatChar:
and ecx, 0FFh
.next:
push ecx
call TConsole_PutChar
pop ecx
loop .next
ret
; --------------------------------------------------------------------------
; Input:
; CL = number of characters
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_RepeatBlank:
mov al, CHAR_BLANK
call TConsole_RepeatChar
ret
; --------------------------------------------------------------------------
; Input:
; CL = number of characters
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_RepeatAsterisk:
mov al, CHAR_ASTERISK
call TConsole_RepeatChar
ret
; --------------------------------------------------------------------------
; SUBROUTINE CRAM from original FORTRAN source
; --------------------------------------------------------------------------
; Input:
; ECX = index of the message table
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_Cram:
call TMsgTable_GetItem
mcZeroBits eax
.get_char:
lodsb
mcOnRegZero eax, .done
call TConsole_PutChar
jmp .get_char
.done:
ret
; --------------------------------------------------------------------------
; Input:
; ESI = UNICODE text
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramWide:
mcZeroBits eax
.get_char:
lodsw
mcOnRegZero eax, .done
call TConsole_PutChar
jmp .get_char
.done:
ret
; --------------------------------------------------------------------------
; Input:
; ESI = ANSI text
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramAnsi:
mcZeroBits eax
.get_char:
lodsb
mcOnRegZero eax, .done
call TConsole_PutChar
jmp .get_char
.done:
ret
; --------------------------------------------------------------------------
; Input:
; ECX = index of the message table
; DL = field width
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramString:
movzx edx, dl
call TMsgTable_GetLength
cmp eax, edx
jae .cram_and_exit
sub edx, eax
push edx
call TConsole_Cram
pop ecx
call TConsole_RepeatBlank
ret
.cram_and_exit:
call TConsole_Cram
ret
; --------------------------------------------------------------------------
; Input:
; CL = 1-based device index (like DEV_IMPULSE_ENGINES)
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramDevice:
movzx ecx, cl
add ecx, 59
call TConsole_Cram
ret
; --------------------------------------------------------------------------
; CRAMEN
; --------------------------------------------------------------------------
; Input:
; AL = object symbol
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramEnemy:
pushad
mov edi, glb_ObjectMap
mcLoad8bitsToReg32 ecx, 9
mov edx, edi
repne scasb
jne .done
.cram_it:
sub edi, edx
lea ecx, [edi + 202]
call TConsole_Cram
.done:
popad
ret
; --------------------------------------------------------------------------
; CRMSENA
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate
; DL = Y coordinate
; CL = 1 for "QUADRANT", 2 for "SECTOR", 0 for none
; BL = Enemy character
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramEnemyAt:
push eax ecx edx
mov al, bl
call TConsole_CramEnemy
mov ecx, 257
call TConsole_Cram
pop edx ecx eax
call TConsole_CramLoc
ret
; --------------------------------------------------------------------------
; Input:
; AL = sector X coordinate
; DL = sector Y coordinate
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramEnemyAtEx:
push ebx
call TArray_QuadPtr
mov bl, [ebx]
mov cl, 2
call TConsole_CramEnemyAt
pop ebx
ret
; --------------------------------------------------------------------------
; Input:
; EAX = Int32 value to print
; CL = field width or zero (value is padded with blanks on the left side)
; --------------------------------------------------------------------------
virtual at 0
loc19:
.bufInt32 CHARS 12
.nWidth COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramIntWidth:
mcBeginLocals loc19.size
movzx ecx, cl
mcStoreLocal loc19.nWidth, ecx
mcLoadLocalRef edi, loc19.bufInt32
call TFormat_Int32
cmp [esp + loc19.nWidth], 0
je .dump
cmp [esp + loc19.nWidth], ecx
jbe .dump
sub ecx, [esp + loc19.nWidth]
neg ecx
call TConsole_RepeatBlank
.dump:
mcLoadLocalRef esi, loc19.bufInt32
mcZeroBits eax
.next:
lodsb
mcOnRegZero eax, .done
call TConsole_PutChar
jmp .next
.done:
mcEndLocals loc19.size
ret
; --------------------------------------------------------------------------
; Input:
; EAX = Int32 value to print
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramInt:
pushad
mcZeroBits ecx
call TConsole_CramIntWidth
popad
ret
; --------------------------------------------------------------------------
; Input:
; ECX = message table index
; EAX = Int32 value to print
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramSinglePlural:
push eax ecx
call TConsole_CramInt
mov al, CHAR_BLANK
call TConsole_PutChar
pop ecx
call TConsole_Cram
pop eax
cmp al, 1
je .done
mov al, 'S'
call TConsole_PutChar
.done:
ret
; --------------------------------------------------------------------------
; Input:
; AL = X coordinate
; DL = Y coordinate
; CL = KEY (1 - print "QUADRANT", 2 - print "SECTOR")
; --------------------------------------------------------------------------
virtual at 0
loc21:
.nIX INT32 ?
.nIY INT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramLoc:
mcBeginLocals loc21.size
movzx eax, al
movzx edx, dl
mcStoreLocal loc21.nIX, eax
mcStoreLocal loc21.nIY, edx
mcOnRegZero cl, .print_values
add cl, 56
movzx ecx, cl
call TConsole_Cram
.print_values:
mov al, CHAR_BLANK
call TConsole_PutChar
mcLoadLocal eax, loc21.nIX
call TConsole_CramInt
mcLoad8bitsToReg32 ecx, 59
call TConsole_Cram
mcLoadLocal eax, loc21.nIY
call TConsole_CramInt
mcEndLocals loc21.size
ret
; --------------------------------------------------------------------------
; Input:
; ST(0) = value to print
; CL = precision
; DL = field width or zero
; --------------------------------------------------------------------------
virtual at 0
loc20:
.bufDouble CHARS 16
.nWidth COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramFloatWidth:
mcBeginLocals loc20.size
movzx edx, dl
mcStoreLocal loc20.nWidth, edx
mcLoadLocalRef edi, loc20.bufDouble
call TFormat_Double
cmp [esp + loc20.nWidth], 0
je .dump
cmp [esp + loc20.nWidth], ecx
jbe .dump
sub ecx, [esp + loc20.nWidth]
neg ecx
call TConsole_RepeatBlank
.dump:
mcLoadLocalRef esi, loc20.bufDouble
mcZeroBits eax
.next:
lodsb
mcOnRegZero eax, .done
call TConsole_PutChar
jmp .next
.done:
mcEndLocals loc20.size
ret
; --------------------------------------------------------------------------
; Input:
; ST(0) = value to print
; CL = precision
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_CramFloat:
pushad
mcZeroBits edx
call TConsole_CramFloatWidth
popad
ret
; --------------------------------------------------------------------------
; SUBROUTINE PROUT from original FORTRAN source
; --------------------------------------------------------------------------
; Input:
; ECX = index of the message table
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_Prout:
push ecx
call TConsole_Cram
call TConsole_ScrollUp
pop ecx
ret
; --------------------------------------------------------------------------
; Input:
; CL = number of lines to skip
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_Skip:
movzx ecx, cl
.skipping:
push ecx
call TConsole_ScrollUp
pop ecx
loop .skipping
ret
; --------------------------------------------------------------------------
; Input:
; ECX = index of the message table
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_ProutGameMsg:
push ecx
call TConsole_SetGameMsgAttr
pop ecx
call TConsole_Prout
ret
; --------------------------------------------------------------------------
; Input:
; CL = index of color
; Output:
; EAX = COLORREF at the specified index
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_GetColorAtIndex:
mcLoadRGB eax, 255, 0, 0
cmp cl, CONSOLE_ATTRS
jae .done
and ecx, 0FFh
mov ebx, [glb_pConsole]
mov eax, [ebx + 4*ecx + TConsole.cons_Attributes]
.done:
ret
; --------------------------------------------------------------------------
; Input:
; EDX = HDC
; EAX = Y coordinate
; ESI = address of TLine structure
; ECX = number of lines left in the loop
; --------------------------------------------------------------------------
virtual at 0
loc2:
.hDC HDC ?
.yText INT32 ?
.xText INT32 ?
.pTChar PTCharacter ?
.rgbNow COLORREF ?
.strOneChar WCHARS 2
.nLinesLeft COUNT ?
.rect_Caret rb RECT.size
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_DrawLine:
mcBeginLocals loc2.size
mcStoreLocal loc2.nLinesLeft, ecx
mcStoreLocal loc2.hDC, edx
mcStoreLocal loc2.yText, eax
mcStoreLocal loc2.pTChar, esi
mcZeroBits eax
mcStoreLocal loc2.rgbNow, eax
inc eax
mcStoreLocal loc2.xText, eax
.load_char:
mcLoadLocal esi, loc2.pTChar
cmp [esi + TCharacter.char_Symbol], 0
je .draw_caret
movzx eax, [esi + TCharacter.char_Symbol]
mov [esp + loc2.strOneChar], ax
mov cl, [esi + TCharacter.char_Attribute]
call TConsole_GetColorAtIndex
mcLoadLocal edi, loc2.hDC
cmp [esp + loc2.rgbNow], eax
je .draw_char
mcStoreLocal loc2.rgbNow, eax
invoke SetTextColor, edi, eax
.draw_char:
mov ebx, esp
lea esi, [ebx + loc2.strOneChar]
invoke TextOut, edi, \
[ebx + loc2.xText], \
[ebx + loc2.yText], esi, 1
add [ebx + loc2.pTChar], TCharacter.size
mov eax, dword [glb_CharSize + SIZE.size_Width]
add [ebx + loc2.xText], eax
jmp .load_char
.draw_caret:
cmp [esp + loc2.nLinesLeft], 1
jne .done
;
; Paint a rectangular caret
;
mov ebx, esp
mcLoadMemberRef edi, loc2.rect_Caret
mcLoadMember edx, loc2.xText
mcLoadMember eax, loc2.yText
mov [edi + RECT.rc_Left], edx
mov [edi + RECT.rc_Top], eax
mov esi, glb_CharSize
add edx, [esi + SIZE.size_Width]
add eax, [esi + SIZE.size_Height]
mov [edi + RECT.rc_Right], edx
mov [edi + RECT.rc_Bottom], eax
mov cl, ATTR_PROMPT_VALUE
call TConsole_GetColorAtIndex
invoke CreateSolidBrush, eax
mov esi, eax
mcLoadLocal edx, loc2.hDC
mcLoadLocalRef edi, loc2.rect_Caret
inc [edi + RECT.rc_Left]
inc [edi + RECT.rc_Right]
invoke FillRect, edx, edi, eax
invoke DeleteObject, esi
.done:
mcEndLocals loc2.size
ret
; --------------------------------------------------------------------------
; Input:
; EDX = HDC
; --------------------------------------------------------------------------
virtual at 0
loc3:
.hDC HDC ?
.yText INT32 ?
.pLineOfChars PTLine ?
.nLines COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_DrawAllLines:
mcBeginLocals loc3.size
mcStoreLocal loc3.hDC, edx
mcLoad1 eax
mcStoreLocal loc3.yText, eax
mov ebx, [glb_pConsole]
mcStoreLocal loc3.pLineOfChars, ebx
mcLoad8bitsToReg32 ecx, CONSOLE_ROWS
mcStoreLocal loc3.nLines, ecx
.paint_row:
mcLoadLocal edx, loc3.hDC
mcLoadLocal eax, loc3.yText
mcLoadLocal esi, loc3.pLineOfChars
mcLoadLocal ecx, loc3.nLines
call TConsole_DrawLine
add [esp + loc3.pLineOfChars], TLine.size
mov eax, dword [glb_CharSize + SIZE.size_Height]
add [esp + loc3.yText], eax
dec [esp + loc3.nLines]
jnz .paint_row
mcEndLocals loc3.size
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TConsole_Create:
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TConsole.size
mov [glb_pConsole], eax
mov edi, eax
mov ecx, TConsole.size
mcZeroBits eax
push edi
rep stosb
pop esi
;
; Init palette
;
lea edi, [esi + TConsole.cons_Attributes]
mcLoadRGB eax, 128, 191, 255
stosd ; ATTR_GAME_MSG
mcLoadRGB eax, 255, 255, 206
stosd ; ATTR_CREW_MSG
mcLoadRGB eax, 94, 174, 174
stosd ; ATTR_KLINGON
mcLoadRGB eax, 0, 176, 0
stosd ; ATTR_ROMULAN
mcLoadRGB eax, 192, 192, 192
stosd ; ATTR_COSMOS
mcLoadRGB eax, 255, 255, 255
stosd ; ATTR_SHIP
mcLoadRGB eax, 255, 255, 0
stosd ; ATTR_STAR
mcLoadRGB eax, 6, 131, 255
stosd ; ATTR_BASE
mcLoadRGB eax, 128, 128, 64
stosd ; ATTR_THOLIAN
mcLoadRGB eax, 128, 128, 128
stosd ; ATTR_BLACK_HOLE
mcLoadRGB eax, 230, 211, 157
stosd ; ATTR_PLANET
mcLoadRGB eax, 0, 128, 255
stosd ; ATTR_REPORT_TEXT
mcLoadRGB eax, 62, 158, 255
stosd ; ATTR_REPORT_VALUE
mcLoadRGB eax, 248, 108, 41
stosd ; ATTR_GALAXY_EDGE
mcLoadRGB eax, 149, 255, 202
stosd ; ATTR_SHIP_QUAD
mcLoadRGB eax, 174, 194, 247
stosd ; ATTR_SCANNED_QUAD
mcLoadRGB eax, 218, 191, 5
stosd ; ATTR_SCAN_SCALE
mcLoadRGB eax, 255, 170, 170
stosd ; ATTR_HIT_DAMAGE
mcLoadRGB eax, 181, 181, 106
stosd ; ATTR_WEB
mcLoadRGB eax, 46, 170, 43
stosd ; ATTR_COND_GREEN
mcLoadRGB eax, 255, 255, 130
stosd ; ATTR_COND_YELLOW
mcLoadRGB eax, 255, 73, 64
stosd ; ATTR_COND_RED
mcLoadRGB eax, 0, 155, 0
stosd ; ATTR_PROMPT_TEXT
mcLoadRGB eax, 73, 231, 69
stosd ; ATTR_PROMPT_VALUE
ret
; --- EOF ---

View File

@ -0,0 +1,63 @@
; --------------------------------------------------------------------------
; FILE: TConsole.Inc
; DATE: September 21, 2008
; --------------------------------------------------------------------------
CONSOLE_ROWS = 40
CONSOLE_COLS = 80
CONSOLE_ATTRS = 24
CONSOLE_LAST_COL = (CONSOLE_COLS - 1)
; --------------------------------------------------------------------------
ATTR_GAME_MSG = 0
ATTR_CREW_MSG = 1
ATTR_KLINGON = 2
ATTR_ROMULAN = 3
ATTR_COSMOS = 4
ATTR_SHIP = 5
ATTR_STAR = 6
ATTR_BASE = 7
ATTR_THOLIAN = 8
ATTR_BLACK_HOLE = 9
ATTR_PLANET = 10
ATTR_REPORT_TEXT = 11
ATTR_REPORT_VALUE = 12
ATTR_GALAXY_EDGE = 13
ATTR_SHIP_QUAD = 14
ATTR_SCANNED_QUAD = 15
ATTR_SCAN_SCALE = 16
ATTR_HIT_DAMAGE = 17
ATTR_WEB = 18
ATTR_COND_GREEN = 19
ATTR_COND_YELLOW = 20
ATTR_COND_RED = 21
ATTR_PROMPT_TEXT = 22
ATTR_PROMPT_VALUE = 23
; --------------------------------------------------------------------------
virtual at 0
TCharacter:
.char_Symbol db ?
.char_Attribute db ?
.size = $
end virtual
; --------------------------------------------------------------------------
virtual at 0
TLine:
.cons_Symbols rb (TCharacter.size * CONSOLE_COLS)
.size = $
end virtual
; --------------------------------------------------------------------------
virtual at 0
TConsole:
.cons_Rows rb (TLine.size * (CONSOLE_ROWS - 1))
.cons_LastRow rb TLine.size
.cons_CaretColumn INDEX ?
.cons_ActiveColor INDEX ?
.cons_Attributes COLORREFS CONSOLE_ATTRS
.size = $
end virtual
; --- EOF ---

View File

@ -0,0 +1,848 @@
; --------------------------------------------------------------------------
; FILE: TDock.Asm
; DATE: October 25, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; ABANDON
; --------------------------------------------------------------------------
virtual at 0
loc86:
.pTrekData PVOID ?
.nAttempts COUNT ?
.dbl_ShuttleDamage DOUBLE ?
.dbl_padding DOUBLE ?
.nBaseSectorX INT32 ?
.nBaseSectorY INT32 ?
.nFQSectorX INT32 ?
.nFQSectorY INT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_Abandon:
mcBeginLocals loc86.size
mcLoadGameDataPtr esi
mcStoreLocal loc86.pTrekData, esi
mov cl, DEV_SHUTTLE_CRAFT
call TArray_GetDblDamage
fstp [esp + loc86.dbl_ShuttleDamage]
fld [esp + loc86.dbl_ShuttleDamage]
fldz
mc_CMP_ST0_ST1
jc .L10
jz .L15
fld [esp + loc86.dbl_ShuttleDamage]
fld1
fchs
mc_CMP_ST0_ST1
jz .L6
mov ecx, 443
call TConsole_ProutGameMsg
jmp .done
.L6:
mov ecx, 444
call TConsole_ProutGameMsg
jmp .done
.L10:
mov ecx, 445
call TConsole_ProutGameMsg
jmp .done
.L15:
mcLoadLocal esi, loc86.pTrekData
cmp [esi + TREKDATA.LANDED], 1
jne .check1
.must_be_aboard:
mov ecx, 675
call TConsole_ProutGameMsg
jmp .done
.check1:
cmp [esi + TREKDATA.ICRAFT], 1
je .must_be_aboard
cmp [esi + TREKDATA.ISCRAFT], 1
je .L17
mov ecx, 674
call TConsole_ProutGameMsg
jmp .done
.L17:
call TConsole_ScrollUp
mov cl, ATTR_COND_RED
call TConsole_SetAttr
mov ecx, 676
call TConsole_Prout
inc ecx
call TConsole_Prout
call TConsole_ScrollUp
invoke Sleep, 800
mov ecx, 678
call TConsole_ProutGameMsg
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
mcLoadLocal esi, loc86.pTrekData
cmp [esi + TREKDATA.REMBASE], 0
je .finished
invoke Sleep, 800
call TConsole_ScrollUp
mov ecx, 681
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
mcLoadLocal esi, loc86.pTrekData
mcZeroBits eax
mov [esi + TREKDATA.ICRYSTL], al
mov [esi + TREKDATA.IMINE], al
mov [esi + TREKDATA.ISCATE], al
movzx edx, [esi + TREKDATA.REMBASE]
call TRandom_IRan
mov ecx, eax
mcLoadLocal ebx, loc86.pTrekData
mcLoadMemberRef esi, TREKDATA.BASEQX
mcLoadMemberRef edi, TREKDATA.BASEQY
mov al, [esi + ecx]
mov dl, [edi + ecx]
mcStoreMember TREKDATA.QUADX, al
mcStoreMember TREKDATA.QUADY, dl
.L40:
mov al, 5
mcStoreMember TREKDATA.SECTX, al
mcStoreMember TREKDATA.SECTY, al
call TCommon_NewQuad
mov al, 5
mov dl, al
call TArray_QuadPtr
mov byte [ebx], CHAR_COSMOS
;
; Three attempts to put F.Q. beside the base
;
mcLoad8bitsToReg32 eax, 3
mcStoreLocal loc86.nAttempts, eax
mcLoadLocal esi, loc86.pTrekData
movzx eax, [esi + TREKDATA.BASEX]
movzx edx, [esi + TREKDATA.BASEY]
mcStoreLocal loc86.nBaseSectorX, eax
mcStoreLocal loc86.nBaseSectorY, edx
.attempt:
mcLoad8bitsToReg32 edx, 3
call TRandom_IRan
dec eax
add eax, [esp + loc86.nBaseSectorX]
mcStoreLocal loc86.nFQSectorX, eax
call TPhotons_IsValidSector
jnc .next_attempt
mcLoad8bitsToReg32 edx, 3
call TRandom_IRan
dec eax
add eax, [esp + loc86.nBaseSectorY]
mcStoreLocal loc86.nFQSectorY, eax
call TPhotons_IsValidSector
jnc .next_attempt
mcLoadLocal eax, loc86.nFQSectorX
mcLoadLocal edx, loc86.nFQSectorY
call TArray_QuadPtr
cmp byte [ebx], CHAR_COSMOS
je .L60
.next_attempt:
dec [esp + loc86.nAttempts]
jnz .attempt
jmp .L40
.L60:
mov byte [ebx], CHAR_FQUEENE
mcLoadLocal esi, loc86.pTrekData
mov [esi + TREKDATA.SHIP], CHAR_FQUEENE
mov [esi + TREKDATA.CONDIT], CONDITION_DOCKED
mcLoadLocal eax, loc86.nFQSectorX
mcLoadLocal edx, loc86.nFQSectorY
mov [esi + TREKDATA.SECTX], al
mov [esi + TREKDATA.SECTY], dl
lea edi, [esi + TREKDATA.DAMAGE]
mcLoad8bitsToReg32 ecx, 14
.clear_damages:
fldz
fstp tbyte [edi]
add edi, 10
loop .clear_damages
fld [glb_dbl_3000]
fld st
fstp [esi + TREKDATA.INENRG]
fstp [esi + TREKDATA.ENERGY]
fld [glb_dbl_1250]
fld st
fstp [esi + TREKDATA.INSHLD]
fstp [esi + TREKDATA.SHLD]
mov al, 6
mov [esi + TREKDATA.INTORPS], al
mov [esi + TREKDATA.TORPS], al
fld [glb_dbl_3]
fld st
fstp [esi + TREKDATA.INLSR]
fstp [esi + TREKDATA.LSUPRES]
mov [esi + TREKDATA.SHLDUP], 0
fld [glb_dbl_5]
fstp [esi + TREKDATA.WARPFAC]
fld [glb_dbl_25]
fstp [esi + TREKDATA.WFACSQ]
jmp .done
.finished:
mov al, 9
call TFinish_Main
.done:
mcEndLocals loc86.size
ret
; --------------------------------------------------------------------------
; DREPORT
; --------------------------------------------------------------------------
virtual at 0
loc38:
.nJDAM INT32 ?
.pDAMAGE PDOUBLE ?
.nL INDEX ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_DamageReport:
mcBeginLocals loc38.size
mcZeroBits eax
mcStoreLocal loc38.nJDAM, eax
inc eax
mcStoreLocal loc38.nL, eax
mcLoadGameDataPtr esi
add esi, TREKDATA.DAMAGE
mcStoreLocal loc38.pDAMAGE, esi
.check_device:
fldz
mcLoadLocal ebx, loc38.pDAMAGE
fld tbyte [ebx]
mc_CMP_ST0_ST1
jc .L20
jz .L20
cmp [esp + loc38.nJDAM], 0
jne .L10
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
call TConsole_ScrollUp
mov ecx, 270
call TConsole_Prout
mov ecx, 271
call TConsole_Prout
inc [esp + loc38.nJDAM]
.L10:
mov cl, 2
call TConsole_RepeatBlank
mov cl, ATTR_REPORT_TEXT
call TConsole_SetAttr
mov dl, 22
mcLoadLocal ecx, loc38.nL
add ecx, 59
call TConsole_CramString
mov cl, ATTR_REPORT_VALUE
call TConsole_SetAttr
cmp [esp + loc38.nL], 14
je .deathray
mcLoadLocal esi, loc38.pDAMAGE
fld tbyte [esi]
fld [glb_dbl_0dot005]
faddp
mov cl, 2
mov dl, 5
call TConsole_CramFloatWidth
jmp .docked_value
.deathray:
mov ecx, 269
call TConsole_Cram
.docked_value:
mcLoadLocal esi, loc38.pDAMAGE
fld tbyte [esi]
fld [glb_dbl_DOCKFAC]
fmulp
fld [glb_dbl_0dot005]
faddp
mov cl, 2
mov dl, 10
call TConsole_CramFloatWidth
call TConsole_ScrollUp
.L20:
;
; Next device
;
add [esp + loc38.pDAMAGE], 10
inc [esp + loc38.nL]
cmp [esp + loc38.nL], 14
jbe .check_device
cmp [esp + loc38.nJDAM], 0
jne .done
call TConsole_ScrollUp
call TConsole_SetGameMsgAttr
mov ecx, 268
call TConsole_Prout
.done:
call TConsole_ScrollUp
mcEndLocals loc38.size
ret
; --------------------------------------------------------------------------
; This function will check if sufficient time passed between dockings to
; prevent the cheating by docking a few times in a row and getting
; additional photon tubes, quantum charges, etc.
; --------------------------------------------------------------------------
; Returns CF=1 if additional devices are allowed.
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_IsTime4Goodies:
mcLoadGameDataPtr esi
fld [esi + TREKDATA.DATE]
fld [esi + TREKDATA.DOCKDATE]
fsubp
fld [glb_dbl_0dot8]
mc_CMP_ST0_ST1
ret
; --------------------------------------------------------------------------
; Check if enhanced torpedoes available
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_GetQuantumCharges:
call TDock_IsTime4Goodies
jnc .done
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.QTORPS], 1
je .done
cmp [esi + TREKDATA.SKILL], 5
jb .done
mcLoad8bitsToReg32 edx, 100
call TRandom_IRan
inc eax
cmp eax, 25
ja .done
mcLoadGameDataPtr edi
inc [edi + TREKDATA.QTORPS]
mcZeroBits ecx
cmp [edi + TREKDATA.SHIP], CHAR_ENTERPRISE
sete cl
mov al, 8
shl al, cl
mov [edi + TREKDATA.TORPS], al
.report:
call TConsole_SetCrewMsgAttr
mov ecx, 707
call TConsole_Prout
.done:
ret
; --------------------------------------------------------------------------
; Check if additional photon tubes were installed
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_InstallTubes:
mcBeginLocals 4
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.SKILL], 5
jb .done
cmp [esi + TREKDATA.NPTUBES], 3
ja .done
mcLoad8bitsToReg32 edx, 100
call TRandom_IRan
inc eax
cmp eax, 20
ja .done
call TRandom_Ranf
fld [glb_dbl_3]
fmulp
call TCommon_FP_Truncate
inc eax
mov [esp], eax
mcLoadGameDataPtr edi
add [edi + TREKDATA.NPTUBES], al
call TConsole_SetCrewMsgAttr
mov ecx, 701
call TConsole_Cram
mov eax, [esp]
call TConsole_CramInt
mov ecx, 702
call TConsole_Cram
cmp dword [esp], 1
je .skip
mov al, 'S'
call TConsole_PutChar
.skip:
mov ecx, 703
call TConsole_Prout
.done:
mcEndLocals 4
ret
; --------------------------------------------------------------------------
; DOCK
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_Main:
call TConsole_SetGameMsgAttr
mcLoadGameDataPtr esi
mov [esi + TREKDATA.IDIDIT], 0
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED
je .L30
cmp [esi + TREKDATA.INORBIT], 0
jne .L40
cmp [esi + TREKDATA.BASEX], 0
je .L5
mov al, [esi + TREKDATA.SECTX]
mov dl, [esi + TREKDATA.SECTY]
sub al, [esi + TREKDATA.BASEX]
sub dl, [esi + TREKDATA.BASEY]
movsx eax, al
movsx edx, dl
call TCommon_AbsEAX
cmp eax, 1
ja .L5
mov eax, edx
call TCommon_AbsEAX
cmp eax, 1
jbe .L10
.L5:
call TConsole_CramShip
mov ecx, 264
jmp .msg_end
.L10:
mcLoadGameDataPtr edi
mov [edi + TREKDATA.CONDIT], CONDITION_DOCKED
mov ecx, 265
call TConsole_Prout
call TDock_InstallTubes
call TDock_GetQuantumCharges
mcLoadGameDataPtr edi
inc [edi + TREKDATA.IDIDIT]
fld [edi + TREKDATA.INSHLD]
fstp [edi + TREKDATA.SHLD]
fld [edi + TREKDATA.INLSR]
fstp [edi + TREKDATA.LSUPRES]
cmp [edi + TREKDATA.QTORPS], 1
je .check_power
mov al, [edi + TREKDATA.INTORPS]
mov [edi + TREKDATA.TORPS], al
.check_power:
fld [edi + TREKDATA.INENRG]
fld [edi + TREKDATA.ENERGY]
mc_CMP_ST0_ST1
jc .refuel
ret
.refuel:
fld [edi + TREKDATA.INENRG]
fstp [edi + TREKDATA.ENERGY]
ret
.L30:
mov ecx, 266
jmp .msg_end
.L40:
mov ecx, 267
.msg_end:
call TConsole_Prout
mcLoadGameDataPtr esi
fld [esi + TREKDATA.DATE]
fstp [esi + TREKDATA.DOCKDATE]
ret
; --------------------------------------------------------------------------
; HELP
; --------------------------------------------------------------------------
virtual at 0
loc49:
.pTrekData PVOID ?
.dbl_DIST DOUBLE ?
.dbl_XDIST DOUBLE ?
.dbl_TEMP1 DOUBLE ?
.dbl_TEMP2 DOUBLE ?
.dbl_PROBF DOUBLE ?
.nIX BYTE ?
.nIY BYTE ?
.nLINE INDEX ?
.nL INDEX ?
.nLL INDEX ?
.nSUM INT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TDock_Help:
mcBeginLocals loc49.size
mcLoadGameDataPtr esi
mcStoreLocal loc49.pTrekData, esi
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED
jne .L10
call TConsole_SetCrewMsgAttr
mov ecx, 562
call TConsole_Prout
jmp .done
.L10:
mov cl, DEV_SUBSPACE_RADIO
call TArray_IsDamaged
jnc .L20
mov ecx, 563
call TConsole_ProutGameMsg
jmp .done
.L20:
mcLoadLocal esi, loc49.pTrekData
cmp [esi + TREKDATA.REMBASE], 0
jne .L30
call TConsole_SetCrewMsgAttr
mov ecx, 564
call TConsole_Prout
jmp .done
.L30:
cmp [esi + TREKDATA.LANDED], 1
jne .L31
call TConsole_SetGameMsgAttr
mov ecx, 565
call TConsole_Cram
call TConsole_CramShip
mov al, '.'
call TConsole_PutChar
call TConsole_ScrollUp
jmp .done
.L31:
cmp [esi + TREKDATA.ISCRAFT], 0
jne .L32
mov ecx, 407
call TConsole_ProutGameMsg
jmp .done
.L32:
inc [esi + TREKDATA.NHELP]
cmp [esi + TREKDATA.BASEX], 0
je .L40
mov al, [esi + TREKDATA.BASEX]
sub al, [esi + TREKDATA.SECTX]
movzx eax, al
imul eax, eax
mov dl, [esi + TREKDATA.BASEY]
sub dl, [esi + TREKDATA.SECTY]
movzx edx, dl
imul edx, edx
add eax, edx
call TCommon_FPU_Load_EAX
fsqrt
fstp [esp + loc49.dbl_DIST]
jmp .L60
.L40:
fld [glb_dbl_1000]
fstp [esp + loc49.dbl_DIST]
movzx ecx, [esi + TREKDATA.REMBASE]
lea edi, [esi + TREKDATA.BASEQX]
lea ebx, [esi + TREKDATA.BASEQY]
mcZeroBits edx
.check_base_distance:
mov al, [edi]
sub al, [esi + TREKDATA.QUADX]
movsx eax, al
imul eax, eax
mcStoreLocal loc49.nSUM, eax
mov al, [ebx]
sub al, [esi + TREKDATA.QUADY]
movsx eax, al
imul eax, eax
add eax, [esp + loc49.nSUM]
call TCommon_FPU_Load_EAX
fsqrt
fld [glb_dbl_Ten]
fmulp
fld st
fstp [esp + loc49.dbl_XDIST]
fld [esp + loc49.dbl_DIST]
mc_CMP_ST0_ST1
jc .next_base
fld [esp + loc49.dbl_XDIST]
fstp [esp + loc49.dbl_DIST]
mcStoreLocal loc49.nLINE, edx
.next_base:
inc edi
inc ebx
inc edx
loop .check_base_distance
lea edi, [esi + TREKDATA.BASEQX]
lea ebx, [esi + TREKDATA.BASEQY]
mcLoadLocal ecx, loc49.nLINE
mov al, [edi + ecx]
mov dl, [ebx + ecx]
mov [esi + TREKDATA.QUADX], al
mov [esi + TREKDATA.QUADY], dl
inc [esi + TREKDATA.SHUTUP]
push esi
call TCommon_NewQuad
pop esi
dec [esi + TREKDATA.SHUTUP]
.L60:
mov al, [esi + TREKDATA.SECTX]
mov dl, [esi + TREKDATA.SECTY]
call TArray_QuadPtr
mov byte [ebx], CHAR_COSMOS
call TConsole_SetGameMsgAttr
mov ecx, 199
call TConsole_Cram
mov cl, 1
mcLoadLocal esi, loc49.pTrekData
mov al, [esi + TREKDATA.QUADX]
mov dl, [esi + TREKDATA.QUADY]
call TConsole_CramLoc
mov ecx, 566
call TConsole_Cram
call TConsole_CramShip
mov ecx, 567
call TConsole_Prout
mov esi, glb_dbl_0dot98
mcLoadLocalRef edi, loc49.dbl_DIST
call TCommon_X_exp_Y
fld1
fsubrp
fstp [esp + loc49.dbl_TEMP1]
fld1
fld [glb_dbl_3]
fdivp
fstp [esp + loc49.dbl_TEMP2]
mcLoadLocalRef esi, loc49.dbl_TEMP1
mcLoadLocalRef edi, loc49.dbl_TEMP2
call TCommon_X_exp_Y
fstp [esp + loc49.dbl_PROBF]
mcLoad1 eax
mcStoreLocal loc49.nL, eax
call TConsole_SetGameMsgAttr
.attempt:
mov ecx, 567
add ecx, [esp + loc49.nL]
call TConsole_Cram
mov ecx, 571
call TConsole_Cram
call TConsole_CramShip
mov ecx, 572
call TConsole_Cram
invoke Sleep, 1200
call TRandom_Ranf
fld [esp + loc49.dbl_PROBF]
mc_CMP_ST0_ST1
jc .L90
.L70:
mov ecx, 573
call TConsole_Prout
inc [esp + loc49.nL]
cmp [esp + loc49.nL], 3
jbe .attempt
mov al, 11
call TFinish_Main
jmp .done
.L90:
mcLoad1 eax
mcStoreLocal loc49.nLL, eax
mcLoadLocal esi, loc49.pTrekData
.find_adjacent_pos:
call TRandom_Ranf
fld [glb_dbl_3]
fmulp
call TCommon_FP_Truncate
add al, [esi + TREKDATA.BASEX]
dec eax
call TPhotons_IsValidSector
jnc .next_adjacent_try
mcStoreLocal loc49.nIX, al
call TRandom_Ranf
fld [glb_dbl_3]
fmulp
call TCommon_FP_Truncate
add al, [esi + TREKDATA.BASEY]
dec eax
call TPhotons_IsValidSector
jnc .next_adjacent_try
mcStoreLocal loc49.nIY, al
mcLoadLocal al, loc49.nIX
mcLoadLocal dl, loc49.nIY
call TArray_QuadPtr
cmp byte [ebx], CHAR_COSMOS
je .L110
.next_adjacent_try:
inc [esp + loc49.nLL]
cmp [esp + loc49.nLL], 5
jbe .find_adjacent_pos
jmp .L70
.L110:
push ebx
mov ecx, 574
call TConsole_Prout
pop ebx
mcLoadLocal esi, loc49.pTrekData
mcLoadLocal al, loc49.nIX
mcLoadLocal dl, loc49.nIY
mov [esi + TREKDATA.SECTX], al
mov [esi + TREKDATA.SECTY], dl
mov al, [esi + TREKDATA.SHIP]
mov byte [ebx], al
call TCommon_ResetDist
call TCommon_SortKlingons
call TDock_Main
call TConsole_ScrollUp
call TConsole_SetCrewMsgAttr
mov ecx, 575
call TConsole_Prout
.done:
mcEndLocals loc49.size
ret
; --- EOF ---

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,551 @@
; --------------------------------------------------------------------------
; FILE: TFinish.Asm
; DATE: October 13, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; FINISH
; --------------------------------------------------------------------------
; Input:
; AL = game ending code
; --------------------------------------------------------------------------
virtual at 0
loc47:
.pTrekData PVOID ?
.bIGotIt BOOL ?
.nEndCode INT32 ?
.dbl_DateDiff DOUBLE ?
.dbl_RateMax DOUBLE ?
.dbl_PerDate DOUBLE ?
.dbl_Goodies DOUBLE ?
.dbl_Baddies DOUBLE ?
.dbl_Advantage DOUBLE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TFinish_Main:
mcBeginLocals loc47.size
movzx eax, al
mcStoreLocal loc47.nEndCode, eax
invoke Sleep, 1000
mcLoadGameDataPtr edi
mcStoreLocal loc47.pTrekData, edi
inc [edi + TREKDATA.ALLDONE]
mcZeroBits eax
mcStoreLocal loc47.bIGotIt, eax
call TConsole_ScrollUp
call TConsole_ScrollUp
call TConsole_ScrollUp
mov cl, ATTR_SHIP
call TConsole_SetAttr
mov ecx, 477
call TConsole_Cram
mov cl, 1
mcLoadLocal esi, loc47.pTrekData
fld [esi + TREKDATA.DATE]
call TConsole_CramFloat
mov ecx, 478
call TConsole_Prout
call TConsole_ScrollUp
mcLoadLocal eax, loc47.nEndCode
mcOnRegEqu eax, 1, .L100
mcOnRegEqu eax, 2, .L200
mcOnRegEqu eax, 3, .L300
mcOnRegEqu eax, 4, .L400
mcOnRegEqu eax, 5, .L500
mcOnRegEqu eax, 6, .L600
mcOnRegEqu eax, 7, .L700
mcOnRegEqu eax, 8, .L800
mcOnRegEqu eax, 9, .L900
mcOnRegEqu eax, 10, .L1000
mcOnRegEqu eax, 11, .L1100
mcOnRegEqu eax, 12, .L5000
mcOnRegEqu eax, 13, .L1300
mcOnRegEqu eax, 14, .L1400
mcOnRegEqu eax, 15, .L1500
mcOnRegEqu eax, 16, .L1600
mcOnRegEqu eax, 17, .L1700
mcOnRegEqu eax, 18, .L1800
mcOnRegEqu eax, 21, .L2100
mcOnRegEqu eax, 22, .L2200
;int 3
jmp .done
.L100:
mcLoadLocal esi, loc47.pTrekData
cmp [esi + TREKDATA.NROMREM], 0
je .L105
movzx eax, [esi + TREKDATA.NROMREM]
push eax
mov ecx, 479
call TConsole_Cram
pop eax
call TConsole_CramInt
mov ecx, 480
call TConsole_Prout
call TConsole_ScrollUp
.L105:
mov ecx, 481
call TConsole_Prout
mov ecx, 482
call TConsole_Prout
mcLoadLocal esi, loc47.pTrekData
mov [esi + TREKDATA.GAMEWON], 1
cmp [esi + TREKDATA.ALIVE], 0
je .L130
cmp [esi + TREKDATA.BASEKL], 0
jne .L130
cmp [esi + TREKDATA.SHIP], CHAR_ENTERPRISE
jne .L130
movzx eax, [esi + TREKDATA.STARKL]
imul eax, 5
movzx ecx, [esi + TREKDATA.CASUAL]
add eax, ecx
movzx ecx, [esi + TREKDATA.NPLANKL]
imul ecx, 10
add eax, ecx
movzx ecx, [esi + TREKDATA.NHELP]
imul ecx, 45
add eax, ecx
cmp eax, 100
jae .L130
fld [glb_dbl_5]
fld [esi + TREKDATA.DATE]
fld [esi + TREKDATA.INDATE]
fsubp
fld st
fstp [esp + loc47.dbl_DateDiff]
mc_CMP_ST0_ST1
jc .L110
mov al, [esi + TREKDATA.SKILL]
call TCommon_LoadByteIntoFPU
fld [glb_dbl_0dot1]
fmulp
inc al
call TCommon_LoadByteIntoFPU
fmulp
fld [glb_dbl_0dot1]
faddp
fstp [esp + loc47.dbl_RateMax]
mov al, [esi + TREKDATA.KILLK]
add al, [esi + TREKDATA.KILLC]
add al, [esi + TREKDATA.NSCKILL]
fld [esp + loc47.dbl_DateDiff]
fdivp
fstp [esp + loc47.dbl_PerDate]
fld [esp + loc47.dbl_RateMax]
fld [esp + loc47.dbl_PerDate]
mc_CMP_ST0_ST1
jc .L130
.L110:
call TConsole_ScrollUp
mov ecx, 483
call TConsole_Prout
mcLoadLocal esi, loc47.pTrekData
cmp [esi + TREKDATA.SKILL], 4
je .L120
cmp [esi + TREKDATA.SKILL], 5
je .L125
mov ecx, 484
call TConsole_Cram
mov ecx, 484
mcLoadLocal esi, loc47.pTrekData
movzx eax, [esi + TREKDATA.SKILL]
add ecx, eax
call TConsole_Prout
mov ecx, 488
call TConsole_Prout
jmp .L130
.L120:
mov ecx, 489
call TConsole_Prout
inc [esp + loc47.bIGotIt]
call TConsole_ScrollUp
mov ecx, 490
call TConsole_Prout
mov ecx, 491
call TConsole_Prout
mov ecx, 492
call TConsole_Prout
jmp .L130
.L125:
call TConsole_ScrollUp
mov ecx, 493
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 494
call TConsole_Prout
mov ecx, 495
call TConsole_Prout
mov ecx, 495
call TConsole_Prout
mov ecx, 495
call TConsole_Prout
mov ecx, 496
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 497
call TConsole_Prout
inc [esp + loc47.bIGotIt]
.L130:
call TConsole_ScrollUp
mov ecx, 498
call TConsole_Prout
call TGame_Score
cmp [esp + loc47.bIGotIt], 0
je .done
call TApp_PlaqueProcessor
jmp .done
.L200:
mov ecx, 499
call TConsole_Prout
mov ecx, 500
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 501
call TConsole_Prout
mov ecx, 502
call TConsole_Prout
mcLoadLocal esi, loc47.pTrekData
movzx eax, [esi + TREKDATA.REMKL]
movzx edx, [esi + TREKDATA.INKLING]
imul eax, 3
cmp eax, edx
ja .L210
mov ecx, 503
call TConsole_Prout
mcLoadLocal esi, loc47.pTrekData
mov [esi + TREKDATA.ALIVE], 0
.score_and_return:
call TGame_Score
jmp .done
.L210:
mov ecx, 504
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 498
call TConsole_Prout
jmp .score_and_return
.L300:
mov ecx, 505
call TConsole_Prout
mov ecx, 506
call TConsole_Prout
.L310:
call TConsole_ScrollUp
mov ecx, 507
call TConsole_Prout
jmp .L5000
.L400:
mov ecx, 508
call TConsole_Prout
jmp .L310
.L500:
mov ecx, 509
call TConsole_Cram
call TConsole_CramShip
mov ecx, 510
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 511
call TConsole_Prout
jmp .L5000
.L600:
mov ecx, 512
call TConsole_Prout
mov ecx, 513
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 514
call TConsole_Prout
jmp .score_and_return
.L700:
mov ecx, 515
call TConsole_Prout
.L705:
mov ecx, 516
call TConsole_Prout
jmp .L5000
.L800:
mov ecx, 509
call TConsole_Cram
call TConsole_CramShip
mov ecx, 517
call TConsole_Prout
mov ecx, 518
call TConsole_Prout
jmp .L5000
.L900:
mov ecx, 519
call TConsole_Prout
mov ecx, 520
call TConsole_Prout
mov ecx, 521
call TConsole_Prout
mov ecx, 522
call TConsole_Prout
jmp .L5000
.L1000:
mov ecx, 523
call TConsole_Prout
jmp .L5000
.L1100:
mov ecx, 524
call TConsole_Prout
mov ecx, 525
call TConsole_Prout
jmp .L5000
.L1300:
mov ecx, 526
call TConsole_Prout
mov ecx, 527
call TConsole_Prout
jmp .L1410
.L1400:
mcLoadLocal esi, loc47.pTrekData
movzx ecx, [esi + TREKDATA.IPLANET]
call TArray_PlanetPtr
mov al, [edi + TPlanet.planet_CLASS]
mcOnRegNotEqu al, 1, .L1401
mov ecx, 528
call TConsole_Prout
mov ecx, 529
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 530
call TConsole_Prout
jmp .L1410
.L1401:
push eax
mov ecx, 531
call TConsole_Prout
mov ecx, 532
call TConsole_Cram
pop eax
add al, 'L'
call TConsole_PutChar
mov ecx, 533
call TConsole_Prout
mov ecx, 534
call TConsole_Prout
mov ecx, 535
call TConsole_Prout
.L1410:
call TConsole_ScrollUp
mov ecx, 536
call TConsole_Prout
call TConsole_CramShip
mov ecx, 537
call TConsole_Prout
jmp .L5000
.L1500:
mov ecx, 538
call TConsole_Prout
jmp .L705
.L1600:
mov ecx, 539
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 540
call TConsole_Cram
call TConsole_CramShip
call TConsole_ScrollUp
mov ecx, 541
call TConsole_Prout
jmp .L5000
.L1700:
mov ecx, 542
call TConsole_Prout
jmp .L1600
.L1800:
mov ecx, 543
call TConsole_Prout
mov ecx, 544
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 545
call TConsole_Prout
jmp .L1410
.L2100:
mov ecx, 546
call TConsole_Prout
mov ecx, 547
call TConsole_Prout
jmp .L5000
.L2200:
mov ecx, 548
call TConsole_Prout
mov ecx, 549
call TConsole_Prout
jmp .L705
.L5000:
call TConsole_ScrollUp
mcLoadLocal esi, loc47.pTrekData
mov [esi + TREKDATA.ALIVE], 0
mcZeroBits edx
mcZeroBits eax
mov al, CHAR_FQUEENE
cmp [esi + TREKDATA.SHIP], CHAR_ENTERPRISE
cmove edx, eax
mov [esi + TREKDATA.SHIP], dl
cmp [esi + TREKDATA.REMKL], 0
je .L5050
fld [esi + TREKDATA.REMRES]
fld [esi + TREKDATA.INRESOR]
fdivp
fstp [esp + loc47.dbl_Goodies]
mov al, [esi + TREKDATA.REMCOM]
add al, al
add al, [esi + TREKDATA.REMKL]
call TCommon_LoadByteIntoFPU
mov al, [esi + TREKDATA.INCOM]
add al, al
add al, [esi + TREKDATA.INKLING]
call TCommon_LoadByteIntoFPU
fdivp
fstp [esp + loc47.dbl_Baddies]
fld [esp + loc47.dbl_Goodies]
fld [esp + loc47.dbl_Baddies]
fdivp
fstp [esp + loc47.dbl_Advantage]
call TRandom_Ranf
fld [glb_dbl_0dot5]
fmulp
fld1
faddp
fld [esp + loc47.dbl_Advantage]
mc_CMP_ST0_ST1
jc .L5020
mov ecx, 550
call TConsole_Prout
mov ecx, 551
call TConsole_Prout
call TRandom_Ranf
fld [glb_dbl_3]
faddp
fld [esp + loc47.dbl_Advantage]
mc_CMP_ST0_ST1
jc .L5010
mov ecx, 552
call TConsole_Prout
call TConsole_ScrollUp
mov ecx, 555
call TConsole_Prout
jmp .L5030
.L5010:
mov ecx, 553
call TConsole_Prout
jmp .L5030
.L5020:
mov ecx, 554
call TConsole_Prout
jmp .L5030
.L5050:
mov ecx, 556
call TConsole_Prout
mov ecx, 557
call TConsole_Prout
mov ecx, 558
call TConsole_Prout
mov ecx, 559
call TConsole_Prout
mcLoadLocal ebx, loc47.pTrekData
mov [ebx + TREKDATA.GAMEWON], 1
mov [ebx + TREKDATA.ALIVE], 0
.L5030:
call TGame_Score
.done:
mcEndLocals loc47.size
ret
; --- EOF ---

View File

@ -0,0 +1,155 @@
; --------------------------------------------------------------------------
; FILE: TFormat.Asm
; DATE: October 7, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; Input:
; EDI = ANSI buffer
; EAX = value to format
; Output:
; ECX = length of text
; NOTE:
; All registers are safe
; --------------------------------------------------------------------------
virtual at 0
loc18:
.buffer CHARS 12
.nChars INT32 ?
.bSigned BOOL ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TFormat_Int32:
push edx eax esi edi
mcBeginLocals loc18.size
mcLoadLocalRef esi, loc18.nChars
mcLoad8bitsToReg32 ecx, 10
mcZeroBits edx
mcStoreLocal loc18.nChars, edx
mcStoreLocal loc18.bSigned, edx
add eax, edx
jns .div_10
neg eax
inc [esp + loc18.bSigned]
.div_10:
mcZeroBits edx
div ecx
add dl, '0'
dec esi
mov [esi], dl
inc [esp + loc18.nChars]
mcOnRegNotZero eax, .div_10
cmp [esp + loc18.bSigned], 0
je .copy
dec esi
mov byte [esi], '-'
inc [esp + loc18.nChars]
.copy:
mcLoadLocal ecx, loc18.nChars
push ecx
rep movsb
stosb
pop ecx
mcEndLocals loc18.size
pop edi esi eax edx
ret
; --------------------------------------------------------------------------
; Input:
; ST(0) = value to format
; EDI = ANSI buffer
; CL = number of digits after dot
; Output:
; ECX = length of text
; --------------------------------------------------------------------------
virtual at 0
loc17:
.dbl_Value DOUBLE ?
.buf_AllDigits CHARS 10
.nValue INT32 ?
.nDigits INT32 ?
.pszBuffer PCHAR ?
.bSigned BOOL ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TFormat_Double:
push eax ebx esi edi
mcBeginLocals loc17.size
.prepare:
mcStoreLocal loc17.pszBuffer, edi
movzx ecx, cl
mcStoreLocal loc17.nDigits, ecx
fld1
.make_factor:
fld [glb_dbl_Ten]
fmulp
loop .make_factor
fmulp
frndint
call TCommon_FP_Truncate
mcStoreLocal loc17.nValue, eax
mcLoadLocalRef edi, loc17.buf_AllDigits
call TFormat_Int32
cmp ecx, [esp + loc17.nDigits]
ja .print_all
mcLoadLocal ebx, loc17.pszBuffer
mov byte [ebx], '0'
mov byte [ebx + 1], '.'
je .copy_all_at_EBX
mov al, [edi]
mov byte [ebx + 2], '0'
mov byte [ebx + 3], al
mov byte [ebx + 4], 0
jmp .done
.copy_all_at_EBX:
mov esi, edi
lea edi, [ebx + 2]
inc ecx
rep movsb
jmp .done
.print_all:
mov esi, edi
mcLoadLocal edi, loc17.pszBuffer
sub ecx, [esp + loc17.nDigits]
rep movsb
mov al, '.'
stosb
mov ecx, [esp + loc17.nDigits]
inc ecx
rep movsb
.done:
mcLoadLocal esi, loc17.pszBuffer
call TCmdBuf_AnsiStrLen
mcEndLocals loc17.size
pop edi esi ebx eax
ret
; --- EOF ---

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,158 @@
; --------------------------------------------------------------------------
; FILE: TImpulse.Asm
; DATE: November 9, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; IMPULSE
; --------------------------------------------------------------------------
virtual at 0
loc50:
.pTrekData PVOID ?
.dbl_POWER DOUBLE ?
.__padded__ BYTES 2
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TImpulse_Main:
mcBeginLocals loc50.size
mcLoadGameDataPtr esi
mcStoreLocal loc50.pTrekData, esi
mov [esi + TREKDATA.IDIDIT], 0
mov cl, DEV_IMPULSE_ENGINES
call TArray_IsDamaged
jc .L40
fld [glb_dbl_30]
fld [esi + TREKDATA.ENERGY]
mc_CMP_ST0_ST1
jc .L5
jz .L5
call TMove_GetCourseDistance
mcLoadLocal esi, loc50.pTrekData
fldz
fld [esi + TREKDATA.DIREC]
mc_CMP_ST0_ST1
jc .done
fld [esi + TREKDATA.DIST]
fld [glb_dbl_100]
fmulp
fld [glb_dbl_20]
faddp
fstp [esp + loc50.dbl_POWER]
fld [esi + TREKDATA.ENERGY]
fld [esp + loc50.dbl_POWER]
mc_CMP_ST0_ST1
jc .L20
.L5:
call TConsole_ScrollUp
call TConsole_SetCrewMsgAttr
mov ecx, 576
call TConsole_Prout
mov ecx, 577
call TConsole_Prout
mcLoadLocal esi, loc50.pTrekData
fld [glb_dbl_30]
fld [esi + TREKDATA.ENERGY]
mc_CMP_ST0_ST1
jnc .L10
mov ecx, 578
call TConsole_Prout
jmp .done
.L10:
mov ecx, 579
call TConsole_Prout
mcLoadLocal esi, loc50.pTrekData
fld [esi + TREKDATA.ENERGY]
fld [glb_dbl_20]
fsubp
fld [glb_dbl_0dot01]
fmulp
fld [glb_dbl_0dot05]
fsubp
mov cl, 1
call TConsole_CramFloat
mov ecx, 580
call TConsole_Prout
jmp .done
.L20:
mcLoadLocal esi, loc50.pTrekData
fld [esi + TREKDATA.DIST]
fld [glb_dbl_0dot095]
fdivp
fstp [esi + TREKDATA.TIME]
fld [esi + TREKDATA.REMTIME]
fld [esi + TREKDATA.TIME]
mc_CMP_ST0_ST1
jc .L30
call TConsole_SetCrewMsgAttr
mov ecx, 581
call TConsole_Prout
mov ecx, 582
call TConsole_Prout
mov ecx, 583
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 158
call TGame_JA
jnc .done
.L30:
call TMove_Move
mcLoadLocal esi, loc50.pTrekData
inc [esi + TREKDATA.IDIDIT]
cmp [esi + TREKDATA.ALLDONE], 0
jne .done
fld [esi + TREKDATA.DIST]
fld [glb_dbl_100]
fmulp
fld [glb_dbl_20]
faddp
fld [esi + TREKDATA.ENERGY]
fsubrp
fstp [esi + TREKDATA.ENERGY]
fld [esi + TREKDATA.DIST]
fld [glb_dbl_0dot095]
fdivp
fstp [esi + TREKDATA.TIME]
fld [esi + TREKDATA.ENERGY]
fldz
mc_CMP_ST0_ST1
jc .done
mov al, 4
call TFinish_Main
jmp .done
.L40:
call TConsole_ScrollUp
mov ecx, 584
call TConsole_ProutGameMsg
.done:
mcEndLocals loc50.size
ret
; --- EOF ---

View File

@ -0,0 +1,143 @@
; --------------------------------------------------------------------------
; FILE: TLog.Asm
; DATE: February 21, 2009
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
align PROC_ALIGN
TLog_Create:
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TLog.size
mov [glb_pLog], eax
mov edi, eax
mcZeroBits eax
mov [edi + TLog.nRemainChars], eax
mov [edi + TLog.nStoredChars], eax
mov [edi + TLog.pCurrentBufPos], eax
invoke VirtualAlloc, 0, MAX_LOG_ROOM, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE
mov [edi + TLog.pBuffer], eax
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TLog_Enable:
invoke CreateFile, str_LogFileName, GENERIC_WRITE, \
0, 0, CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0
invoke CloseHandle, eax
mov edi, [glb_pLog]
mcZeroBits eax
mov edx, MAX_LOG_ROOM
mov ebx, [edi + TLog.pBuffer]
mov [edi + TLog.nRemainChars], edx
mov [edi + TLog.nStoredChars], eax
mov [edi + TLog.pCurrentBufPos], ebx
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TLog_Backspace:
cmp [glb_LogEnabled], 1
je .do_it
ret
.do_it:
mov esi, [glb_pLog]
cmp [esi + TLog.nStoredChars], 0
je .print_backspace
dec [esi + TLog.nStoredChars]
dec [esi + TLog.pCurrentBufPos]
inc [esi + TLog.nRemainChars]
ret
.print_backspace:
mov al, '\'
call TLog_DumpChar
mov al, 'B'
call TLog_DumpChar
mov al, 'S'
call TLog_DumpChar
mov al, 'P'
call TLog_DumpChar
mov al, '\'
call TLog_DumpChar
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TLog_Disable:
cmp [glb_LogEnabled], 1
je .do_it
ret
.do_it:
call TLog_Flush
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TLog_Flush:
mov esi, [glb_pLog]
mov ecx, [esi + TLog.nStoredChars]
jecxz .done
invoke CreateFile, str_LogFileName, GENERIC_WRITE, \
0, 0, OPEN_EXISTING, FILE_FLAG_SEQ_SCAN, 0
mov ebx, eax
invoke SetFilePointer, eax, 0, 0, 2
invoke WriteFile, ebx, [esi + TLog.pBuffer], [esi + TLog.nStoredChars], glb_FPU_Int32, 0
invoke CloseHandle, ebx
mcZeroBits eax
mov edx, MAX_LOG_ROOM
mov ebx, [esi + TLog.pBuffer]
mov [esi + TLog.nRemainChars], edx
mov [esi + TLog.nStoredChars], eax
mov [esi + TLog.pCurrentBufPos], ebx
.done:
ret
; --------------------------------------------------------------------------
; Input:
; AL = character to append into log buffer.
; --------------------------------------------------------------------------
align PROC_ALIGN
TLog_DumpChar:
cmp [glb_LogEnabled], 1
je .do_it
ret
.do_it:
mcOnRegZero al, .do_backspace
mov esi, [glb_pLog]
cmp [esi + TLog.nRemainChars], 0
jne .dump
push eax
call TLog_Flush
pop eax
mov esi, [glb_pLog]
.dump:
mov edi, [esi + TLog.pCurrentBufPos]
stosb
mov [esi + TLog.pCurrentBufPos], edi
inc [esi + TLog.nStoredChars]
dec [esi + TLog.nRemainChars]
ret
.do_backspace:
call TLog_Backspace
ret
; --- EOF ---

View File

@ -0,0 +1,28 @@
; --------------------------------------------------------------------------
; FILE: TLog.Inc
; DATE: February 21, 2009
; --------------------------------------------------------------------------
MAX_LOG_ROOM = 40000h
; --------------------------------------------------------------------------
PLAQUE_INSERT_KLRATE = 0F8h
PLAQUE_INSERT_SCORE = 0F9h
PLAQUE_INSERT_DATE = 0FAh
PLAQUE_INSERT_LEVEL = 0FBh
PLAQUE_INSERT_NAME = 0FCh
PLAQUE_STRING = 0FDh
PLAQUE_END_OF_LINE = 0FEh
PLAQUE_END_OF_ALL = 0FFh
; --------------------------------------------------------------------------
virtual at 0
TLog:
.pBuffer PCHAR ?
.pCurrentBufPos PCHAR ?
.nStoredChars COUNT ?
.nRemainChars COUNT ?
.size = $
end virtual
; --- EOF ---

View File

@ -0,0 +1,184 @@
; --------------------------------------------------------------------------
; FILE: TLrScan.Asm
; DATE: October 11, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; Enable/Disable log file
; --------------------------------------------------------------------------
align PROC_ALIGN
TLrScan_Log:
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA
je .check_yes_no
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .print_log_state
.print_log_format:
mov ecx, 712
.print:
call TConsole_ProutGameMsg
ret
.check_yes_no:
mcLoad8bitsToReg32 ecx, 159
call TCmdBuf_Crop
jc .yes
mcLoad8bitsToReg32 ecx, 122
call TCmdBuf_Crop
jnc .print_log_format
;
; Switch logging OFF
;
cmp [glb_LogEnabled], 0
je .msg710
call TLog_Disable
mov [glb_LogEnabled], 0
.msg710:
mov ecx, 710
jmp .print
.yes:
;
; Switch logging ON
;
cmp [glb_LogEnabled], 1
je .msg711
mov [glb_LogEnabled], 1
call TLog_Enable
.msg711:
mov ecx, 711
jmp .print
.print_log_state:
movzx ecx, [glb_LogEnabled]
add ecx, 710
jmp .print
; --------------------------------------------------------------------------
; Input:
; EAX = X quadrant coordinate (may be out of range)
; EDX = Y quadrant coordinate (may be out of range)
; --------------------------------------------------------------------------
align PROC_ALIGN
TLrScan_DumpContents:
push eax edx
cmp eax, 1
jb .out_of_range
cmp edx, 1
jb .out_of_range
cmp eax, 8
ja .out_of_range
cmp edx, 8
ja .out_of_range
mcLoad1 ecx
call TArray_SetStarChartValue
mov cl, ATTR_REPORT_VALUE
call TConsole_SetAttr
call TArray_GetGalaxyValue
mov eax, ecx
mov cl, 5
call TConsole_CramIntWidth
jmp .done
.out_of_range:
mov cl, ATTR_GALAXY_EDGE
call TConsole_SetAttr
mcLoad8bitsToReg32 ecx, 134
call TConsole_Cram
.done:
pop edx eax
ret
; --------------------------------------------------------------------------
; LRSCAN
; --------------------------------------------------------------------------
align PROC_ALIGN
TLrScan_Main:
mov cl, DEV_LR_SENSORS
call TArray_IsDamaged
jnc .proceed
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED
jne .not_available
.proceed:
call TConsole_ScrollUp
mov cl, ATTR_REPORT_TEXT
call TConsole_SetAttr
mcLoad8bitsToReg32 ecx, 135
call TConsole_Cram
mov cl, 1
mcLoadGameDataPtr ebx
mov al, [ebx + TREKDATA.QUADX]
mov dl, [ebx + TREKDATA.QUADY]
call TConsole_CramLoc
call TConsole_ScrollUp
call TConsole_ScrollUp
;
; EAX = QUADX-1
; EDX = QUADY-1
;
mcLoadGameDataPtr ebx
movzx eax, [ebx + TREKDATA.QUADX]
movzx edx, [ebx + TREKDATA.QUADY]
dec eax
dec edx
call TLrScan_DumpContents
inc edx
call TLrScan_DumpContents
inc edx
call TLrScan_DumpContents
push edx eax
call TConsole_ScrollUp
pop eax edx
inc eax
sub edx, 2
call TLrScan_DumpContents
inc edx
call TLrScan_DumpContents
inc edx
call TLrScan_DumpContents
push edx eax
call TConsole_ScrollUp
pop eax edx
inc eax
sub edx, 2
call TLrScan_DumpContents
inc edx
call TLrScan_DumpContents
inc edx
call TLrScan_DumpContents
call TConsole_ScrollUp
jmp .done
.not_available:
call TConsole_ScrollUp
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 133
call TConsole_Prout
.done:
call TConsole_ScrollUp
ret
; --- EOF ---

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,191 @@
; --------------------------------------------------------------------------
; FILE: TMsgTable.Asm
; DATE: September 28, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
align PROC_ALIGN
TMsgTable_CountItems:
mov esi, [glb_pRawMsgBuffer]
mcZeroBits eax
mcZeroBits ecx
mcZeroBits edx
.load_char:
lodsb
mcOnRegZero eax, .done
cmp al, 0Dh
sete dl
add ecx, edx
jmp .load_char
.done:
mov [glb_NumMsgItems], ecx
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TMsgTable_Parse:
mov ecx, [glb_NumMsgItems]
shl ecx, 2
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, ecx
mov [glb_pMsgItems], eax
mov edi, eax
mov esi, [glb_pRawMsgBuffer]
mcZeroBits eax
mov [glb_NumMsgItems], eax
.load_char:
lodsb
mcOnRegZero eax, .done
mcOnRegEqu al, '{', .begin_item
mcOnRegEqu al, '}', .end_item
jmp .load_char
.begin_item:
mov [edi], esi
add edi, 4
inc [glb_NumMsgItems]
jmp .load_char
.end_item:
lea edx, [esi - 1]
mov byte [edx], 0
jmp .load_char
.done:
ret
; --------------------------------------------------------------------------
; Input:
; EDI = buffer address
; ECX = buffer size in bytes
; --------------------------------------------------------------------------
align PROC_ALIGN
TMsgTable_Decrypt:
pushad
.reset_key:
mov esi, TMsgTable_GetItem
mcLoad8bitsToReg32 edx, 27
.next:
lodsb
xor [edi], al
inc edi
dec ecx
jz .done
dec edx
jz .reset_key
jmp .next
.done:
popad
ret
; --------------------------------------------------------------------------
virtual at 0
loc4:
.hFile HFILE ?
.dwSize UINT32 ?
.dwLoaded UINT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TMsgTable_Load:
mcBeginLocals loc4.size
invoke CreateFile, str_MsgFileName, GENERIC_READ, \
0, 0, OPEN_EXISTING, FILE_FLAG_SEQ_SCAN, 0
mcStoreLocal loc4.hFile, eax
cmp eax, -1
je .done
mov ebx, esp
invoke GetFileSize, [ebx + loc4.hFile], 0
mcStoreLocal loc4.dwSize, eax
mcOnRegZero eax, .close
inc eax
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, eax
mov [glb_pRawMsgBuffer], eax
mcOnRegZero eax, .close
mcLoadMemberRef edi, loc4.dwLoaded
invoke ReadFile, [ebx + loc4.hFile], eax, \
[ebx + loc4.dwSize], edi, 0
mov edi, [glb_pRawMsgBuffer]
mcLoadLocal ecx, loc4.dwLoaded
mcZeroBits eax
mov [edi + ecx], al
call TMsgTable_Decrypt
call TMsgTable_CountItems
call TMsgTable_Parse
.close:
mov ebx, esp
invoke CloseHandle, [ebx + loc4.hFile]
.done:
mcEndLocals loc4.size
ret
; --------------------------------------------------------------------------
; Input:
; ECX = item index (1-based)
; Output:
; ESI = points to ANSI text at specified index or empty string
; --------------------------------------------------------------------------
align PROC_ALIGN
TMsgTable_GetItem:
cmp ecx, [glb_NumMsgItems]
ja .empty
dec ecx
push edx
mov edx, [glb_pMsgItems]
mov esi, [edx + ecx*4]
pop edx
ret
.empty:
mov esi, str_CharSizeText + 4
ret
; --------------------------------------------------------------------------
; Input:
; ECX = item index (1-based)
; Output:
; EAX = string length
; --------------------------------------------------------------------------
align PROC_ALIGN
TMsgTable_GetLength:
push esi ecx
call TMsgTable_GetItem
mcZeroBits eax
mcZeroBits ecx
.next_char:
lodsb
mcOnRegZero eax, .done
inc ecx
jmp .next_char
.done:
mov eax, ecx
pop ecx esi
ret
; --- EOF ---

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,324 @@
; --------------------------------------------------------------------------
; FILE: TRandom.Asm
; DATE: October 4, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_Create:
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TRandom.size
mov [glb_pMersenne], eax
mcZeroBits ecx
mov [eax + TRandom.rand_NextIndex], ecx
rdtsc
call TRandom_Seed
ret
; --------------------------------------------------------------------------
; Input:
; EAX = seed value
; --------------------------------------------------------------------------
virtual at 0
loc7:
.index INDEX ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_Seed:
mcBeginLocals loc7.size
mcLoad1 ecx
mcStoreLocal loc7.index, ecx
mov edi, [glb_pMersenne]
stosd
.set_next_value:
;
; MT [i-1]
;
mov edx, [edi - 4]
;
; Right shift by 30 bits
;
mov eax, edx
shr eax, 30
;
; XOR it with MT [i-1]
;
xor edx, eax
;
; Add current index
;
add edx, [esp + loc7.index]
;
; Multiply by 6C078965h
;
mov eax, 6C078965h
mul edx
;
; Store as MT [i]
;
stosd
;
; Continue until index reaches 623
;
inc [esp + loc7.index]
cmp [esp + loc7.index], 623
jbe .set_next_value
mcEndLocals loc7.size
ret
; --------------------------------------------------------------------------
; Input:
; EAX = value
; Output:
; EAX = value MOD 624
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_GetModulo624:
push ecx edx
mcZeroBits edx
mov ecx, 624
div ecx
mov eax, edx
pop edx ecx
ret
; --------------------------------------------------------------------------
virtual at 0
loc8:
.index INDEX ?
.y UINT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_Generate624:
mcBeginLocals loc8.size
;
; i=0
;
mcZeroBits eax
mcStoreLocal loc8.index, eax
;
; MT array
;
mov esi, [glb_pMersenne]
.calc_y:
;
; MT [(i+1) MOD 624]
;
mcLoadLocal eax, loc8.index
inc eax
call TRandom_GetModulo624
mov ecx, [esi + eax*4]
;
; Get last 31 bits of ECX
;
and ecx, 7FFFFFFFh
;
; 32nd bit of MT [i]
;
mcLoadLocal eax, loc8.index
mov edx, [esi + eax*4]
and edx, 80000000h
;
; Combine them and store as Y
;
or edx, ecx
mcStoreLocal loc8.y, edx
;
; MT [i] = MT [(i+397) MOD 624] xor (y >> 1)
;
mcLoadLocal eax, loc8.index
add eax, 397
call TRandom_GetModulo624
mov ecx, [esi + eax*4]
shr edx, 1
xor ecx, edx
mcLoadLocal eax, loc8.index
mov [esi + eax*4], ecx
;
; IF ((Y MOD 2) == 1) THEN MT [i] ^= 9908B0DFh
;
test [esp + loc8.y], 1
jz .continue
xor dword [esi + eax*4], 9908B0DFh
.continue:
inc [esp + loc8.index]
cmp [esp + loc8.index], 623
jbe .calc_y
mcEndLocals loc8.size
ret
; --------------------------------------------------------------------------
; Output:
; EAX = next random value from a sequence
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_GetNextNumber:
push ebx
mov ebx, [glb_pMersenne]
;
; IF (index == 0) THEN generate next 624 values
;
cmp [ebx + TRandom.rand_NextIndex], 0
jne .get_it
push esi
call TRandom_Generate624
pop esi
mov ebx, [glb_pMersenne]
.get_it:
mcLoadMember ecx, TRandom.rand_NextIndex
mov eax, [ebx + ecx*4]
mov edx, eax
shr edx, 11
xor eax, edx
mov edx, eax
shl edx, 7
and edx, 9D2C5680h
xor eax, edx
mov edx, eax
shl edx, 15
and edx, 0EFC60000h
xor eax, edx
mov edx, eax
shr edx, 18
xor eax, edx
;
; Index = (Index+1) MOD 624
;
push eax
mov eax, ecx
call TRandom_GetModulo624
mcStoreMember TRandom.rand_NextIndex, eax
pop eax
pop ebx
ret
; --------------------------------------------------------------------------
; Input:
; EDX = N
; Output:
; EAX = random value in range [0..N-1]
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_IRan:
push edx
call TRandom_GetNextNumber
mcZeroBits edx
pop ecx
div ecx
mov eax, edx
ret
; --------------------------------------------------------------------------
; Output:
; ST(0) = random value in range [0..1]
; --------------------------------------------------------------------------
virtual at 0
loc9:
.dbl_2e31 DOUBLE ?
.dbl_padded DOUBLE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_Ranf:
pushad
mcBeginLocals loc9.size
fldz
fstp [esp + loc9.dbl_2e31]
call TRandom_GetNextNumber
test eax, 80000000h
jz .add_two_parts
fld [glb_dbl_2e31]
fstp [esp + loc9.dbl_2e31]
and eax, 7FFFFFFFh
.add_two_parts:
call TCommon_FPU_Load_EAX
fld [esp + loc9.dbl_2e31]
faddp
fld [glb_dbl_2e32]
fdivp
mcEndLocals loc9.size
popad
ret
; --------------------------------------------------------------------------
; Output:
; EAX = value 1 or 10 (X,Y sector of Tholian!)
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_TholianSect:
call TRandom_Ranf
fld [glb_dbl_0dot5]
faddp
call TCommon_FP_Truncate
imul eax, 9
inc eax
ret
; --------------------------------------------------------------------------
; Output:
; EAX = random X value in range [1..8]
; EDX = random Y value in range [1..8]
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_IRan8:
mcLoad8bitsToReg32 edx, 8
call TRandom_IRan
inc eax
push eax
mcLoad8bitsToReg32 edx, 8
call TRandom_IRan
inc eax
mov edx, eax
pop eax
ret
; --------------------------------------------------------------------------
; Output:
; EAX = random X value in range [1..10]
; EDX = random Y value in range [1..10]
; --------------------------------------------------------------------------
align PROC_ALIGN
TRandom_IRan10:
mcLoad8bitsToReg32 edx, 10
call TRandom_IRan
inc eax
push eax
mcLoad8bitsToReg32 edx, 10
call TRandom_IRan
inc eax
mov edx, eax
pop eax
ret
; --- EOF ---

View File

@ -0,0 +1,13 @@
; --------------------------------------------------------------------------
; FILE: TRandom.Inc
; DATE: October 4, 2008
; --------------------------------------------------------------------------
virtual at 0
TRandom:
.rand_NumberSet INTEGERS 624
.rand_NextIndex INT32 ?
.size = $
end virtual
; --- EOF ---

View File

@ -0,0 +1,314 @@
; --------------------------------------------------------------------------
; FILE: TShields.Asm
; DATE: October 18, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; SHIELDS
; --------------------------------------------------------------------------
virtual at 0
loc35:
.pTrekData PVOID ?
.dbl_ETRANS DOUBLE ?
.dbl_reserved DOUBLE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TShields_Main:
mcBeginLocals loc35.size
mcLoadGameDataPtr ebx
mcStoreLocal loc35.pTrekData, ebx
mov [ebx + TREKDATA.IDIDIT], 0
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
jne TShields_Up.L30
.L15:
mcLoad8bitsToReg32 ecx, 225
call TGame_JA
jc TShields_Up.L8010
mov cl, DEV_SHIELDS
call TArray_IsDamaged
jc TShields_Up.L60
mcLoadLocal esi, loc35.pTrekData
cmp [esi + TREKDATA.SHLDUP], 0
jne TShields_Up.L20
jmp TShields_Up.ENTRY
; --------------------------------------------------------------------------
; SHLDSUP
; --------------------------------------------------------------------------
align PROC_ALIGN
TShields_Up:
mcBeginLocals loc35.size
mcLoadGameDataPtr ebx
mcStoreLocal loc35.pTrekData, ebx
.ENTRY:
mcLoad8bitsToReg32 ecx, 226
call TGame_JA
jc .L40
jmp .L90
.L20:
mcLoad8bitsToReg32 ecx, 227
call TGame_JA
jc .L50
jmp .L90
.L30:
mcLoad8bitsToReg32 ecx, 244
call TCmdBuf_Crop
jc .L80
mov cl, DEV_SHIELDS
call TArray_IsDamaged
jc .L60
mcLoad8bitsToReg32 ecx, 245
call TCmdBuf_Crop
jc .L40
mcLoad8bitsToReg32 ecx, 246
call TCmdBuf_Crop
jc .L50
jmp TShields_Main.L15
.L40:
;
; Raising shields
;
mcLoadLocal esi, loc35.pTrekData
cmp [esi + TREKDATA.SHLDUP], 0
jne .L45
mov [esi + TREKDATA.SHLDUP], 1
mov [esi + TREKDATA.SHLDCHG], 1
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED
je .L401
fld [esi + TREKDATA.ENERGY]
fld [glb_dbl_50]
fsubp
fstp [esi + TREKDATA.ENERGY]
.L401:
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 228
call TConsole_Prout
mcLoadLocal esi, loc35.pTrekData
fldz
fld [esi + TREKDATA.ENERGY]
mc_CMP_ST0_ST1
jc .L70
.did_it:
mcLoadLocal edi, loc35.pTrekData
inc [edi + TREKDATA.IDIDIT]
jmp .done
.L45:
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 230
call TConsole_Prout
jmp .done
.L50:
;
; Lowering shields
;
mcLoadLocal esi, loc35.pTrekData
cmp [esi + TREKDATA.SHLDUP], 0
je .L55
dec [esi + TREKDATA.SHLDUP]
mov [esi + TREKDATA.SHLDCHG], 1
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 229
call TConsole_Prout
jmp .did_it
.L55:
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 231
call TConsole_Prout
jmp .done
.L60:
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 232
call TConsole_Prout
jmp .done
.L70:
call TConsole_ScrollUp
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 233
call TConsole_Prout
mov al, 4
call TFinish_Main
jmp .done
.L80:
call TCmdBuf_Scan
fld [ebx + TCmdBuf.cmdbuf_FNUM]
fstp [esp + loc35.dbl_ETRANS]
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
je .L81
.L8010:
mcLoad8bitsToReg32 ecx, 234
call TGame_Prompt
jmp .L80
.L81:
fld [esp + loc35.dbl_ETRANS]
fldz
mc_CMP_ST0_ST1
jz .L90
mcLoadLocal esi, loc35.pTrekData
fld [esi + TREKDATA.ENERGY]
fld [esp + loc35.dbl_ETRANS]
mc_CMP_ST0_ST1
jc .L82
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 235
call TConsole_Prout
jmp .L90
.L82:
mcLoadLocal edi, loc35.pTrekData
inc [edi + TREKDATA.IDIDIT]
fld [edi + TREKDATA.INSHLD]
fld [edi + TREKDATA.SHLD]
fld [esp + loc35.dbl_ETRANS]
faddp
mc_CMP_ST0_ST1
jc .L83
jz .L83
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 236
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 237
call TConsole_Prout
mcLoadLocal esi, loc35.pTrekData
fld [esi + TREKDATA.SHLD]
fld [esi + TREKDATA.INSHLD]
fsubp
fld [esi + TREKDATA.ENERGY]
faddp
fstp [esi + TREKDATA.ENERGY]
fld [esi + TREKDATA.INSHLD]
fstp [esi + TREKDATA.SHLD]
jmp .L90
.L83:
fld [esp + loc35.dbl_ETRANS]
fldz
mc_CMP_ST0_ST1
jc .L8310
mcLoadLocal esi, loc35.pTrekData
fld [esi + TREKDATA.INENRG]
fld [esi + TREKDATA.ENERGY]
fld [esp + loc35.dbl_ETRANS]
fsubp
mc_CMP_ST0_ST1
jc .L8310
jz .L8310
fld [esi + TREKDATA.INENRG]
fld [esi + TREKDATA.ENERGY]
fld [esi + TREKDATA.SHLD]
faddp
mc_CMP_ST0_ST1
jc .L8310
jz .L8310
call TConsole_SetCrewMsgAttr
call TConsole_ScrollUp
mcLoad8bitsToReg32 ecx, 148
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 238
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 239
call TConsole_Prout
mcLoadLocal edi, loc35.pTrekData
dec [edi + TREKDATA.IDIDIT]
jmp .L90
.L8310:
mcLoadLocal esi, loc35.pTrekData
fld [esi + TREKDATA.SHLD]
fld [esp + loc35.dbl_ETRANS]
faddp
fldz
mc_CMP_ST0_ST1
jc .L84
jz .L84
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 240
call TConsole_Prout
mcLoadLocal esi, loc35.pTrekData
fld [esi + TREKDATA.ENERGY]
fld [esi + TREKDATA.SHLD]
faddp
fstp [esi + TREKDATA.ENERGY]
fldz
fstp [esi + TREKDATA.SHLD]
jmp .L90
.L84:
call TConsole_SetCrewMsgAttr
mcLoad8bitsToReg32 ecx, 242
mcLoad8bitsToReg32 edx, 243
fld [esp + loc35.dbl_ETRANS]
fldz
mc_CMP_ST0_ST1
cmovnc ecx, edx
call TConsole_Prout
mcLoadLocal ebx, loc35.pTrekData
fld [ebx + TREKDATA.SHLD]
fld [esp + loc35.dbl_ETRANS]
faddp
fstp [ebx + TREKDATA.SHLD]
fld [ebx + TREKDATA.ENERGY]
fld [esp + loc35.dbl_ETRANS]
fsubp
fstp [ebx + TREKDATA.ENERGY]
.L90:
mcLoadLocal esi, loc35.pTrekData
fld [esi + TREKDATA.SHLD]
fldz
mc_CMP_ST0_ST1
jc .done
dec [esi + TREKDATA.SHLDUP]
.done:
mcEndLocals loc35.size
ret
; --- EOF ---

View File

@ -0,0 +1,519 @@
; --------------------------------------------------------------------------
; FILE: TSrScan.Asm
; DATE: October 11, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; Input:
; AL = character from QUAD array
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_SetCosmosAttr:
push ecx
mcOnRegEqu al, CHAR_ASTERISK, .attr_star
mcOnRegEqu al, CHAR_BLACK_HOLE, .attr_bhole
mcOnRegEqu al, CHAR_COMMANDER, .attr_klingon
mcOnRegEqu al, CHAR_ENTERPRISE, .attr_ship
mcOnRegEqu al, CHAR_FQUEENE, .attr_ship
mcOnRegEqu al, CHAR_KLINGON, .attr_klingon
mcOnRegEqu al, CHAR_PLANET, .attr_planet
mcOnRegEqu al, CHAR_ROMULAN, .attr_romulan
mcOnRegEqu al, CHAR_SCOM, .attr_klingon
mcOnRegEqu al, CHAR_STARBASE, .attr_base
mcOnRegEqu al, CHAR_THING, .attr_thing
mcOnRegEqu al, CHAR_THOLIAN, .attr_tholian
mcOnRegEqu al, CHAR_WEB, .attr_web
mov cl, ATTR_COSMOS
jmp .apply
.attr_star:
mov cl, ATTR_STAR
jmp .apply
.attr_bhole:
mov cl, ATTR_BLACK_HOLE
jmp .apply
.attr_klingon:
mov cl, ATTR_KLINGON
jmp .apply
.attr_ship:
mov cl, ATTR_SHIP
jmp .apply
.attr_planet:
mov cl, ATTR_PLANET
jmp .apply
.attr_romulan:
mov cl, ATTR_ROMULAN
jmp .apply
.attr_base:
mov cl, ATTR_BASE
jmp .apply
.attr_thing:
mov cl, ATTR_BLACK_HOLE
jmp .apply
.attr_tholian:
mov cl, ATTR_THOLIAN
jmp .apply
.attr_web:
mov cl, ATTR_WEB
.apply:
call TConsole_SetAttr
pop ecx
ret
; --------------------------------------------------------------------------
; Input:
; EAX = row index from 1 to 10
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_CramSpaceRow:
dec eax
imul eax, 10
mcLoadGameDataPtr edx
lea esi, [edx + eax + TREKDATA.QUAD]
mcLoad8bitsToReg32 ecx, 10
.dump_sector:
push ecx
lodsb
call TSrScan_SetCosmosAttr
call TConsole_PutChar
mov al, CHAR_BLANK
call TConsole_PutChar
pop ecx
loop .dump_sector
ret
; --------------------------------------------------------------------------
; Input:
; ECX = index of SRSCAN report item text
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_Helper1:
call TConsole_Cram
mov cl, ATTR_REPORT_VALUE
call TConsole_SetAttr
mcLoadGameDataPtr ebx
ret
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_PrintTubesInfo:
mov ecx, 705
call TConsole_Cram
mcLoadGameDataPtr esi
movzx eax, [esi + TREKDATA.NPTUBES]
call TConsole_CramInt
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.QTORPS], 0
je .close_bracket
cmp [esi + TREKDATA.TORPS], 0
je .close_bracket
mov ecx, 706
call TConsole_Cram
.close_bracket:
mov al, ')'
call TConsole_PutChar
ret
; --------------------------------------------------------------------------
; Input:
; EAX = row index from 1 to 10
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_CramStatusRow:
mov cl, ATTR_REPORT_TEXT
call TConsole_SetAttr
mcOnRegEqu eax, 1, .print_stardate
mcOnRegEqu eax, 2, .print_condition
mcOnRegEqu eax, 3, .print_position
mcOnRegEqu eax, 4, .print_lsupport
mcOnRegEqu eax, 5, .print_warp
mcOnRegEqu eax, 6, .print_energy
mcOnRegEqu eax, 7, .print_torpedoes
mcOnRegEqu eax, 8, .print_shields
mcOnRegEqu eax, 9, .print_klingons
;
; Time left
;
mcLoad8bitsToReg32 ecx, 103
call TSrScan_Helper1
fld [ebx + TREKDATA.REMTIME]
mov cl, 2
call TConsole_CramFloat
jmp .done
.print_stardate:
mcLoad8bitsToReg32 ecx, 94
call TSrScan_Helper1
fld [ebx + TREKDATA.DATE]
mov cl, 1
call TConsole_CramFloat
jmp .done
.print_condition:
mcLoad8bitsToReg32 ecx, 95
call TSrScan_Helper1
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED
je .do_condition
push ebx
call TCommon_NewCondition
pop ebx
.do_condition:
movzx eax, [ebx + TREKDATA.CONDIT]
mov esi, glb_AttrCondition
mov cl, [esi + eax - 1]
call TConsole_SetAttr
lea ecx, [eax + 103]
call TConsole_Cram
jmp .done
.print_position:
mcLoad8bitsToReg32 ecx, 96
call TSrScan_Helper1
mov al, [ebx + TREKDATA.QUADX]
mov dl, [ebx + TREKDATA.QUADY]
mcZeroBits ecx
push ebx
call TConsole_CramLoc
mov al, ','
call TConsole_PutChar
pop ebx
mov al, [ebx + TREKDATA.SECTX]
mov dl, [ebx + TREKDATA.SECTY]
mcZeroBits ecx
call TConsole_CramLoc
jmp .done
.print_lsupport:
mcLoad8bitsToReg32 ecx, 97
call TSrScan_Helper1
mov cl, DEV_LIFE_SUPPORT
call TArray_IsDamaged
jc .L44
mcLoad8bitsToReg32 ecx, 108
call TConsole_Cram
jmp .done
.L44:
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED
jne .L45
mcLoad8bitsToReg32 ecx, 109
call TConsole_Cram
jmp .done
.L45:
mcLoad8bitsToReg32 ecx, 110
push ebx
call TConsole_Cram
pop ebx
fld [ebx + TREKDATA.LSUPRES]
mov cl, 2
mov dl, 4
call TConsole_CramFloatWidth
jmp .done
.print_warp:
mcLoad8bitsToReg32 ecx, 98
call TSrScan_Helper1
fld [ebx + TREKDATA.WARPFAC]
mov cl, 1
call TConsole_CramFloat
jmp .done
.print_energy:
mcLoad8bitsToReg32 ecx, 99
call TSrScan_Helper1
fld [ebx + TREKDATA.ENERGY]
mov cl, 2
call TConsole_CramFloat
jmp .done
.print_torpedoes:
mcLoad8bitsToReg32 ecx, 100
call TSrScan_Helper1
movzx eax, [ebx + TREKDATA.TORPS]
call TConsole_CramInt
call TSrScan_PrintTubesInfo
jmp .done
.print_shields:
mcLoad8bitsToReg32 ecx, 101
call TSrScan_Helper1
mov cl, DEV_SHIELDS
call TArray_IsDamaged
jc .shields_damaged
movzx ecx, [ebx + TREKDATA.SHLDUP]
add cl, 120
.cram_shields_state:
push ebx
call TConsole_Cram
pop ebx
fld [ebx + TREKDATA.SHLD]
fld [ebx + TREKDATA.INSHLD]
fdivp
fld [glb_dbl_100]
fmulp
frndint
call TCommon_FP_Truncate
push ebx
call TConsole_CramInt
mcLoad8bitsToReg32 ecx, 111
call TConsole_Cram
pop ebx
fld [ebx + TREKDATA.SHLD]
frndint
call TCommon_FP_Truncate
call TConsole_CramInt
mcLoad8bitsToReg32 ecx, 112
call TConsole_Cram
jmp .done
.shields_damaged:
mcLoad8bitsToReg32 ecx, 119
jmp .cram_shields_state
.print_klingons:
mcLoad8bitsToReg32 ecx, 102
call TSrScan_Helper1
movzx eax, [ebx + TREKDATA.REMKL]
call TConsole_CramInt
.done:
ret
; --------------------------------------------------------------------------
; STATUS
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_Status:
call TConsole_ScrollUp
mcLoad1 eax
mcLoad8bitsToReg32 ecx, 10
.dump_row:
push eax ecx
call TSrScan_CramStatusRow
call TConsole_ScrollUp
pop ecx eax
inc eax
loop .dump_row
call TConsole_ScrollUp
ret
; --------------------------------------------------------------------------
; REQUEST
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_Request:
.L301:
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA
je .L303
.L302:
mcLoad8bitsToReg32 ecx, 115
call TGame_Prompt
jmp .L301
.L303:
mcLoad8bitsToReg32 edx, 1
.check_cmd:
mcLoad8bitsToReg32 ecx, 122
add ecx, edx
push edx
call TCmdBuf_Crop
pop edx
jc .row_in_EDX
inc edx
cmp edx, 10
jbe .check_cmd
;
; List possible request items
;
call TConsole_ScrollUp
call TConsole_SetGameMsgAttr
mcLoad8bitsToReg32 ecx, 116
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 117
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 118
call TConsole_Prout
call TConsole_ScrollUp
jmp .L302
.row_in_EDX:
push edx
call TConsole_ScrollUp
pop eax
;
; Due to mapping we need to swap places of
; TIME and TORPEDOES request. Basic logic here as follows:
;
; IF (EAX == 7) THEN EAX=10
; IF (EAX == 10) THEN EAX=7
;
mcOnRegEqu eax, 7, .load_10
mcOnRegEqu eax, 10, .load_7
.dump_info:
call TSrScan_CramStatusRow
call TConsole_ScrollUp
call TConsole_ScrollUp
ret
.load_7:
sub eax, 3
jmp .dump_info
.load_10:
add eax, 3
jmp .dump_info
; --------------------------------------------------------------------------
; SRSCAN
; --------------------------------------------------------------------------
virtual at 0
loc24:
.bRightSide BOOL ?
.nRow INDEX ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TSrScan_Main:
mcBeginLocals loc24.size
mov cl, DEV_SR_SENSORS
call TArray_IsDamaged
jnc .proceed
mcLoadGameDataPtr ebx
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED
jne .not_available
.proceed:
mcLoad1 eax
mcStoreLocal loc24.bRightSide, eax
mcStoreLocal loc24.nRow, eax
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .L3
mcLoad8bitsToReg32 ecx, 122
call TCmdBuf_Crop
jnc .L3
dec [esp + loc24.bRightSide]
.L3:
mcLoadLocal ecx, loc24.nRow
mcLoadGameDataPtr ebx
mcLoadMember al, TREKDATA.QUADX
mcLoadMember dl, TREKDATA.QUADY
call TArray_SetStarChartValue
call TArray_SetScanned
call TConsole_ScrollUp
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
mcLoad8bitsToReg32 ecx, 113
call TConsole_Prout
.dump_row:
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
mcLoadLocal eax, loc24.nRow
mov cl, 3
call TConsole_CramIntWidth
mov al, CHAR_BLANK
call TConsole_PutChar
mcLoadLocal eax, loc24.nRow
call TSrScan_CramSpaceRow
cmp [esp + loc24.bRightSide], 0
je .next_row
mcLoadLocal eax, loc24.nRow
call TSrScan_CramStatusRow
.next_row:
call TConsole_ScrollUp
inc [esp + loc24.nRow]
cmp [esp + loc24.nRow], 10
jbe .dump_row
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
mcLoad8bitsToReg32 ecx, 113
call TConsole_Prout
jmp .done
.not_available:
call TConsole_SetGameMsgAttr
call TConsole_ScrollUp
mcLoad8bitsToReg32 ecx, 114
call TConsole_Prout
.done:
call TConsole_ScrollUp
mcEndLocals loc24.size
ret
; --- EOF ---

View File

@ -0,0 +1,78 @@
; --------------------------------------------------------------------------
; FILE: TString.Asm
; DATE: September 21, 2008
; --------------------------------------------------------------------------
; --------------------------------------------------------------------------
; Input:
; ESI = source string
; EDI = destination string
; --------------------------------------------------------------------------
align PROC_ALIGN
TString_Copy:
mcZeroBits eax
.more:
lodsw
stosw
mcOnRegNotZero eax, .more
ret
; --------------------------------------------------------------------------
; Input:
; ESI = source string
; EDI = destination string
; --------------------------------------------------------------------------
align PROC_ALIGN
TString_AnsiCopy:
mcZeroBits eax
.more:
lodsb
stosb
mcOnRegNotZero eax, .more
ret
; --------------------------------------------------------------------------
; Input:
; ESI = string #1
; EDI = string #2
; Output:
; CF=1 if strings are same
; --------------------------------------------------------------------------
align PROC_ALIGN
TString_AnsiEqual:
push esi edi
.check_both:
cmpsb
jne .ret_false
cmp byte [esi - 1], 0
jne .check_both
pop edi esi
stc
ret
.ret_false:
pop edi esi
clc
ret
; --------------------------------------------------------------------------
; Input:
; ESI = source string
; EDI = destination string
; Output:
; EDI = set to concatenate another string
; --------------------------------------------------------------------------
align PROC_ALIGN
TString_CopyEx:
call TString_Copy
sub edi, 2
ret
; --- EOF ---

View File

@ -0,0 +1,255 @@
; -----------------------------------------------------------
; Win32 API definitions
; -----------------------------------------------------------
; -----------------------------------------------------------
; Type Alias Section
; -----------------------------------------------------------
INT32 equ dd
PINT32 equ dd
INT16 equ dw
SHORT equ dw
WNDPROC equ dd
COUNT equ dd
UINT32 equ dd
UINT8 equ db
WORD equ dw
BYTE equ db
CHAR equ db
PBYTE equ dd
NBYTES equ dd
HICON equ dd
HBRUSH equ dd
HBITMAP equ dd
HCURSOR equ dd
HINSTANCE equ dd
PWCHAR equ dd
PCHAR equ dd
PPCHAR equ dd
PDOUBLE equ dd
PPWCHAR equ dd
WCHARS equ rw
CHARS equ rb
HWND equ dd
DOUBLE equ dt
DOUBLES equ rt
HANDLE equ dd
HFILE equ dd
HDC equ dd
HFONT equ dd
BOOL equ dd
PBOOL equ dd
LONG equ dd
WPARAM equ dd
LPARAM equ dd
INDEX equ dd
COLORREF equ dd
PSIZE equ dd
PVOID equ dd
PCOORD equ dd
FUNCTOR equ dd
PDEVICE equ dd
STRINGS equ rd
INTEGERS equ rd
POINTERS equ rd
COLORREFS equ rd
CHARS equ rb
BYTES equ rb
; -----------------------------------------------------------
; Pointers to classes
; -----------------------------------------------------------
PTLine equ dd
PTOutputCell equ dd
PTCmdBuf equ dd
PTRandom equ dd
PTPalette equ dd
PTGameState equ dd
PTPlanet equ dd
PTKlingon equ dd
PTCharAttr equ dd
PTLineBuf equ dd
PTConsole equ dd
PTCharacter equ dd
; -----------------------------------------------------------
; Constants
; -----------------------------------------------------------
HEAP_NO_SERIALIZE = 1
DEFAULT_CHARSET = 1
LF_FACESIZE = 32
IDC_ARROW = 32512
IDI_EXCLAMATION = 32515
SM_CXSCREEN = 0
SM_CYSCREEN = 1
WS_EX_APPWINDOW = 40000h
WS_THICKFRAME = 40000h
WS_SYSMENU = 80000h
WS_MINIMIZEBOX = 20000h
WS_CAPTION = 0C00000h
WS_OVERLAPPEDWND = WS_CAPTION or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX
WS_NOSIZEWND = WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX
WM_CREATE = 1
WM_DESTROY = 2
WM_PAINT = 0Fh
WM_CLOSE = 10h
WM_ERASEBKGND = 14h
WM_CHAR = 102h
WM_APP = 8000h
MEM_COMMIT = 1000h
MEM_RESERVE = 2000h
MEM_RELEASE = 8000h
PAGE_READWRITE = 4
SW_SHOWNORMAL = 1
SM_CYCAPTION = 4
SM_CXBORDER = 5
SM_CYBORDER = 6
LOGPIXELSY = 90
FW_NORMAL = 400
CHAR_BACKSPACE = 8
CHAR_ENTER = 0Dh
CHAR_ESC = 1Bh
CHAR_BLANK = 20h
CHAR_COSMOS = 0B7h
;CHAR_COSMOS = '.'
CHAR_ASTERISK = '*'
CHAR_ENTERPRISE = 'E'
CHAR_FQUEENE = 'F'
CHAR_ZERO = '0'
CHAR_PLANET = 'P'
CHAR_KLINGON = 'K'
CHAR_ROMULAN = 'R'
CHAR_SCOM = 'S'
CHAR_THOLIAN = 'T'
CHAR_WEB = '#'
CHAR_THING = '?'
CHAR_STARBASE = 'B'
CHAR_BLACK_HOLE = '@'
CHAR_COMMA = ','
CHAR_COMMANDER = 'C'
SRCCOPY = 0CC0020h
FIXED_PITCH = 1
TRANSPARENT = 1
TA_UPDATECP = 1
WHITE_BRUSH = 0
BLACK_BRUSH = 4
WM_CUSTOM_CMD_READY = (WM_APP + 1)
WM_CUSTOM_DO_PRELIM = (WM_APP + 2)
WM_CUSTOM_NEW_GAME = (WM_APP + 3)
GENERIC_READ = 80000000h
GENERIC_WRITE = 40000000h
CREATE_ALWAYS = 2
OPEN_EXISTING = 3
FILE_FLAG_SEQ_SCAN = 08000000h
FILE_ATTR_DIR = 10h
; -----------------------------------------------------------
; Structure Definitions
; -----------------------------------------------------------
virtual at 0
SIZE:
.size_Width INT32 ?
.size_Height INT32 ?
.size = $
end virtual
virtual at 0
RECT:
.rc_Left INT32 ?
.rc_Top INT32 ?
.rc_Right INT32 ?
.rc_Bottom INT32 ?
.size = $
end virtual
virtual at 0
MSG:
.msg_hWnd HWND ?
.msg_uiMsg UINT32 ?
.msg_wParam WPARAM ?
.msg_lParam LPARAM ?
.msg_uiTime UINT32 ?
.msg_xCoord INT32 ?
.msg_yCoord INT32 ?
.size = $
end virtual
virtual at 0
LOGFONT:
.lf_Height LONG ?
.lf_Width LONG ?
.lf_Escapement LONG ?
.lf_Orientation LONG ?
.lf_Weight LONG ?
.lf_Italic UINT8 ?
.lf_Underline UINT8 ?
.lf_StrikeOut UINT8 ?
.lf_CharSet UINT8 ?
.lf_OutPrecision UINT8 ?
.lf_ClipPrecision UINT8 ?
.lf_Quality UINT8 ?
.lf_PitchAndFamily UINT8 ?
.lf_FaceName WCHARS LF_FACESIZE
.size = $
end virtual
virtual at 0
WIN32_FIND_DATA:
.dwAttr UINT32 ?
._pad1 rd 10
.strName WCHARS 260
.strName2 WCHARS 14
.size = $
end virtual
virtual at 0
SYSTIME:
.wYear WORD ?
.wMonth WORD ?
.wDayOfWeek WORD ?
.wDay WORD ?
.wHour WORD ?
.wMinute WORD ?
.wSecond WORD ?
.wMillisecond WORD ?
.size = $
end virtual
virtual at 0
PAINTSTRUCT:
.hDC HDC ?
.bErase BOOL ?
.rcPaint rb RECT.size
.bRestore BOOL ?
.bIncUpdate BOOL ?
.rgbReserved rb 32
.size = $
end virtual
virtual at 0
LOCATION:
.coord_X BYTE ?
.coord_Y BYTE ?
.size = $
end virtual
virtual at 0
WNDCLASS:
.wc_style UINT32 ?
.wc_lpfnWndProc WNDPROC ?
.wc_cbClsExtra NBYTES ?
.wc_cbWndExtra NBYTES ?
.wc_hInstance HINSTANCE ?
.wc_hIcon HICON ?
.wc_hCursor HCURSOR ?
.wc_hbrBackground HBRUSH ?
.wc_lpszMenuName PWCHAR ?
.wc_lpszClassName PWCHAR ?
.size = $
end virtual
;<EOF>