Welcome to the Sogna Digital Museum Forum!Notice to New Forum Registrants:If you register and don't get the validation email, you may contact us at sognadigitalmuseum@gmail.com for manual activation.
open WIN filewhile( end-of-file isn't reached ){ opcode = read 1 byte switch( opcode ) { case 0x00: do nothing case 0x01: read 2 bytes; read 2 bytes; do some stuff ... case 0x03: read 1 byte; read filename; do some stuff ... }}close WIN file
[] - 1 Byte[[]] - 2 Bytes[[[]]] - 4 Bytes{} - Variable LengthXX - Unknown?? - Unknown(?) - Partially Known or Need to be confirmedVIPER V6========[01][[Left]][[Top]] - Set Viewport Position Stores Top @ 427570 Stores Left @ 427574[02][[Width]][[Height]] - Set Viewport Size[03][Slot]{FileName}[00] - Load ANM Load ANM file and associate with Image Slot.[04][XX] - ??
[05][Color][[Frames]] - Fade In Fade in from Color (00=Black, FF=White). Frames is number of frame refreshes (0001: Fast, FFFF: Slow).[06][Color][[Frames]] - Fade Out Fade out to Color (00=Black, FF=White). Frames is number of frame refreshes (0001: Fast, FFFF: Slow).[07][Slot] - Set Viewport Palette[08] - WaitForSingleObject (?) Stores 1 @ 420550 Stores 0 @ 420564 Stores 0 @ 42055C Stores 5 @ 420580[09] - WaitForSingleObject (?) Stores 0 @ 420550 Stores 0 @ 420564 Stores 0 @ 42055C Stores 5 @ 420580[0A][Slot][[Left]][[Top]][R?][G?][B?][[Colors]][[Frame]] - Display ANM (?) Prints ANM's Frame @ XPos & YPos Stores YPos @ 427570 Stores XPos @ 427574[0B][XX] - ??[0C][XX] - ??[0D] - ??[0E] - ?? Relation to [15]?[10][XX] - ??[12][XX][XX][XX][[XXXX]][[XXXX]] - ??[13][[Time]] - Sleep Sleep for the specified number of hundredth-seconds (a value of 100 sleeps for one second).[14][[Offset]] - Jump Unconditionally Jumps to StartOfWIN+Offset[15][[Offset]] - Conditional Jump Stores StartOfWIN+Offset @ 420570 If Mouse Button is pressed, Jumps to StartOfWIN+Offset Relation with [0E] and [3E]?[17][XX][[XXXX]][[XXXX]][[XXXX]][[XXXX]][[XXXX]][[XXXX]][[XXXX]] - ??[19][Loop][Slot] - Play MIDI Play MIDI in specified Audio Slot. If Loop is nonzero, it should loop; if zero, it will play just once.[1A] - Stop MIDI[1B][Slot]{FileName}[00] - Load MIDI Load specified MIDI file to Audio Slot. Slot generally begins at 2 because the audio streams are shared between MIDI and PCM. Slots 0 and 1 would generally be used by voice and sound effects.[1D][Slot]{FileName}[00] - Play PCM Slot should be 0 or 1, see [1B].[1E] - Stop PCM[1F] - ?? Must use after [28]?[20][[Left]][[Top]][Chars][Lines] - Text Box Display Chars is number of half-width characters (54 means 27 full width chars can be shown) - this number should probably always be a multiple of two for this reason.[21]{String}[00] - Display String Displays Shift-JIS encoded String. Some characters direct the program to perform special actions: full-width dollar sign (Unicode FF04) translates to a half-width space (Unicode 20); full-width caret character (Unicode FF3E) causes the entire active text box to be cleared; a full-width Yen symbol (FFE5) causes a new line; 01XX causes token replacement using token XX minus 1 (see [24]).[22][Mode] - Set Wait Mode (?) Stores Mode @ 4204DC[23][Height] - Create Font Width = Height/2 CreateFontA @ 414A0E By default, creates a MS Gothic True-Type font.[24][Token]{String}[00] - Store String Associates a text token with a token number. This is used primarily for names and String can include characters that get translated in [21].[25][[Offset]] - Jump (?) Loads Index stored @ 42056C Stores next opcode offset (after this [25][[Offset]]) @ Index*4+4275A8 Increments Index @ 42056C[28][Effect][[Speed]][Colors]{Palette} - Display ANM (?) Effect: 0 - No effect, 1 - FadeOut, 2 - FadeOut & FadeIn repeatedly Palette: (Colors * 3 + Colors) bytes It's used to display the gray viper logo![29][[Offset]] - Enable Menu Item (?) Enables Item 0x75 ('Exit Menu'), Menu NULL Stores StartOfWin+Offset @ 420578[2A] - Disable Menu Item (?) Disables Item 0x75 ('Exit Menu'), Menu NULL Stores 0x00 @ 420578[2B][[Offset]] - Enable Menu Item (?) Enables Item 0x00, Menu 0x02E40BDD Stores StartOfWIN+Offset @ 42057C (Is this how it saves the game??)[2C] - Disable Menu Item (?) Disables Item 0x00, Menu NULL[2D] - Reset Jump Offset (?) Sets Addresses 420570 & 420574 to 0 Related to [15]?[2E][Index][[ConditionA]][[Offset]] - Conditional Jump Loads ConditionB stored @ Index*2+426E3C Checks if ConditionA == ConditionB and if so, Jumps to StartOfWIN+Offset[2F][Index][[ConditionA]][[Offset]] - Conditional Jump Loads ConditionB stored @ Index*2+426E3C Checks if ConditionA != ConditionB and if so, Jumps to StartOfWIN+Offset[30][Index][[ConditionA]][[Offset]] - Conditional Jump Loads ConditionB stored @ Index*2+426E3C Checks if ConditionA >= ConditionB and if so, Jumps to StartOfWIN+Offset[31][Index][[ConditionA]][[Offset]] - Conditional Jump Loads ConditionB stored @ Index*2+426E3C Checks if ConditionA <= ConditionB and if so, Jumps to StartOfWIN+Offset[32][Index] - Store Jump Condition for [33] & [48] Loads Condition stored @ Index*2+426E3C Stores Condition @ 42703C[33][[ConditionA]][[Offset]] - Conditional Jump Loads ConditionB stored @ 42703C Checks if ConditionA != ConditionB and if so, Jumps to StartOfWIN+Offset[34][Index][[Condition]] - Store Jump Condition for [32] Stores Condition @ Index*2+426E3C[35][XX] - ??[38][Index][[Condition]] - Store Jump Condition for [32] ORs Condition with content stored @ Index*2+426E3C[3B] - Create Registry Key Calls RegCreateKeyEx(SubKey = ".Default\Software\SOGNA\V6", hKey = HKEY_USERS)[3D][[Left]][[Top]][[Width]][[Height]] - Paint Black Rectangle ROP = 42 (BLACKNESS) @ 4150E0: PatBlt[3E][00][[XXXX]][[XXXX]][XX][Lines]{String}[00] - Display String (?)[40][Condition] - Enable or Disable Menu Item (?) If Condition == 0: Disables Item 0x01, Menu 0x001108C5 If Condition != 0: Enables Item 0x01, Menu 0x001108C5[41][Colors]{Palette} - Display ANM (?) Must use after [28][...][1F]?[43][[XXXX]] - ?? Stores XXXX @ 4204E8[45][Index] - ?? Loads XX stored @ 42054C Stores XX @ Index*2+426E3C[46] - ?? Loads Condition stored @ 42054C Checks if Condition != 0 and if so, Stores 0x0B @ 420580[48][[ConditionA]][[Offset]] - Conditional Jump Loads ConditionB stored @ 42703C Checks if ConditionA AND ConditionB == 0 and if so, Jumps to StartOfWIN+Offset[4A]{FileName}[00] - Load WIN[4B][[Left]][[Top]] - Set Caret Specifies the location of the wait caret (the animated keypress icon in the lower right of the text box)
[20][[left]][[top]][chars][lines]
[22][charwidth] - set font width
[4B][[left]][[top]] - Set caret position
[03][slot]{FileName}[00] - Load ANM to slot[07][slot] - Set viewport palette from image loaded in slot[0A][slot][[left]][[top]][R?][G?][B?][[Colors]][[Frame]] - Display ANM
I can shed some light on the WaitForSingleObject code though. It's needed to wait for user input. If the system wasn't multithreaded it wouldn't allow you to access the menu or record your keypresses while it was in the middle of drawing a scene, at least not without polling. Thus, the drawing is in one thread and user input is in another.
Clarifications I'm discovering as I write my decompiler:
OPCODE 15 is an IF statement..i think, different from OPCODE 14I found out it doesn't jump, unless you click on the mouse...
Regarding [0C], it seems to be the case but it doesn't follow the [0A] associated with HEBI.ANM in START.WIN. HEBI has 2 frames, could it be related?
I've already documented [32], [33] and [34].
I've also confirmed [1E], it's a single byte opcode.
[25] is a jump opcode like [14] but it does some stuff in-between which I haven't confirmed yet; check my notes.
I haven't confirmed [2B] yet but it calls WINAPI functions 'EnableMenuItem' and 'DrawMenuBar'.
Also haven't confirmed [2D] but it seems to reset the jump offset from [15].I've documented [2E] and [48], they're conditional jumps.
The opcode table only has 0x4B opcodes so there is no [4E] or [FF].
I forgot to mention that I'm completely sure about opcode sizes because I'm using a debugger and I have a breakpoint at the ASM instruction responsible for reading each opcode so I can see how many bytes it skips when moving to the next one. You should check my list to confirm opcode sizes, for instance, the [04] opcode only reads 1 byte and not the 5 you've mentioned. [10] and [35] also read 1 byte only.
EDIT: By the way, we should be using some sort of collaborative tool like Google Docs, I can set up a public document (modifiable by the three of us) with what we already have. What do you think?
Your wording is needlessly complicated though. The way I see it SGS defines 257 registers. 256 for values and one for comparison. Where the register values are stored should be arbitary, and may not be the same address in later versions of SGS.
Can you supply the lengths of all the opcodes for me? I'm decoding as I go so I have to figure out how many bytes are being consumed by trial and error. (I realize 0A, 28, and any opcode dealing with text are variable in length.)
I found some more info regarding [04], the next byte seems to act as a flag; if set to 1 then the program enters a loop where a sequence of functions 'GlobalHandle', 'GlobalUnlock' and 'GlobalFree' are called....[10] is executed the moment the game enters the story selection screen and [04] is executed when I click one of the 4 possible options at that screen. [10] executes 'GlobalAlloc' with MemSize=0x384 and Flags=GMEM_MOVEABLE (these parameters are invariable btw); then it immediately executes 'GlobalLock' for the address returned by the previous function.
In fact, if you can get assembler code instructions out of your debugger for what happens in these opcodes, that might be even better.
004144F1 |> 68 E8030000 |PUSH 3E8 ; /Timeout = 1000. ms; Case D of switch 00413F2B004144F6 |. FF35 D0754200 |PUSH DWORD PTR DS:[4275D0] ; |hObject = NULL004144FC |. E8 D6480000 |CALL <JMP.&KERNEL32.WaitForSingleObject>; \WaitForSingleObject00414501 |. 85C0 |TEST EAX,EAX00414503 |. 74 0A |JE SHORT SGS_NOCD.0041450F00414505 |. E8 800F0000 |CALL SGS_NOCD.0041548A0041450A |. E9 670F0000 |JMP SGS_NOCD.004154760041450F |> 33C9 |XOR ECX,ECX00414511 |> 69C1 88000000 |/IMUL EAX,ECX,8800414517 |. 33D2 ||XOR EDX,EDX00414519 |. 8914C5 3434420>||MOV DWORD PTR DS:[EAX*8+423434],EDX00414520 |. 41 ||INC ECX00414521 |. 83F9 08 ||CMP ECX,800414524 |.^7C EB |\JL SHORT SGS_NOCD.0041451100414526 |. C705 80054200 >|MOV DWORD PTR DS:[420580],500414530 |. FF35 D0754200 |PUSH DWORD PTR DS:[4275D0] ; /hMutex = NULL00414536 |. E8 60480000 |CALL <JMP.&KERNEL32.ReleaseMutex> ; \ReleaseMutex0041453B |. E9 360F0000 |JMP SGS_NOCD.00415476
00414557 |> 6A 01 |PUSH 1 ; /Arg1 = 00000001; Case F of switch 00413F2B00414559 |. E8 42E8FFFF |CALL SGS_NOCD.00412DA0 ; \SGS_NOCD.00412DA00041455E |. 59 |POP ECX0041455F |. C705 80054200 >|MOV DWORD PTR DS:[420580],100414569 |. E9 080F0000 |JMP SGS_NOCD.00415476
0041456E |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 10 of switch 00413F2B00414570 |. FF06 |INC DWORD PTR DS:[ESI]00414572 |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]00414575 |. 50 |PUSH EAX ; /Arg100414576 |. E8 78D6FFFF |CALL SGS_NOCD.00411BF3 ; \SGS_NOCD.00411BF30041457B |. 59 |POP ECX0041457C |. E9 F50E0000 |JMP SGS_NOCD.00415476
00414581 |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 12 of switch 00413F2B00414583 |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]00414586 |. 8945 F8 |MOV DWORD PTR SS:[EBP-8],EAX00414589 |. FF06 |INC DWORD PTR DS:[ESI]0041458B |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]0041458D |. 0FB638 |MOVZX EDI,BYTE PTR DS:[EAX]00414590 |. FF06 |INC DWORD PTR DS:[ESI]00414592 |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]00414594 |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]00414597 |. 8945 F4 |MOV DWORD PTR SS:[EBP-C],EAX0041459A |. FF06 |INC DWORD PTR DS:[ESI]0041459C |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]0041459E |. 0FB718 |MOVZX EBX,WORD PTR DS:[EAX]004145A1 |. 8306 02 |ADD DWORD PTR DS:[ESI],2004145A4 |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]004145A6 |. 0FB700 |MOVZX EAX,WORD PTR DS:[EAX]004145A9 |. 8945 F0 |MOV DWORD PTR SS:[EBP-10],EAX004145AC |. 8306 02 |ADD DWORD PTR DS:[ESI],2004145AF |. FF75 F0 |PUSH DWORD PTR SS:[EBP-10] ; /Arg5004145B2 |. 53 |PUSH EBX ; |Arg4004145B3 |. FF75 F4 |PUSH DWORD PTR SS:[EBP-C] ; |Arg3004145B6 |. 57 |PUSH EDI ; |Arg2004145B7 |. FF75 F8 |PUSH DWORD PTR SS:[EBP-8] ; |Arg1004145BA |. E8 69D6FFFF |CALL SGS_NOCD.00411C28 ; \SGS_NOCD.00411C28004145BF |. 83C4 14 |ADD ESP,14004145C2 |. E9 AF0E0000 |JMP SGS_NOCD.00415476
004147AB |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 18 of switch 00413F2B004147AD |. 8A18 |MOV BL,BYTE PTR DS:[EAX]004147AF |. FF06 |INC DWORD PTR DS:[ESI]004147B1 |. 68 E8030000 |PUSH 3E8 ; /Timeout = 1000. ms004147B6 |. FF35 D0754200 |PUSH DWORD PTR DS:[4275D0] ; |hObject = NULL004147BC |. E8 16460000 |CALL <JMP.&KERNEL32.WaitForSingleObject>; \WaitForSingleObject004147C1 |. 85C0 |TEST EAX,EAX004147C3 |. 74 0A |JE SHORT SGS_NOCD.004147CF004147C5 |. E8 C00C0000 |CALL SGS_NOCD.0041548A004147CA |. E9 A70C0000 |JMP SGS_NOCD.00415476004147CF |> 33C0 |XOR EAX,EAX004147D1 |. 8AC3 |MOV AL,BL004147D3 |. 69C0 88000000 |IMUL EAX,EAX,88004147D9 |. F604C5 3534420>|TEST BYTE PTR DS:[EAX*8+423435],80004147E1 |. 74 27 |JE SHORT SGS_NOCD.0041480A004147E3 |. 33C0 |XOR EAX,EAX004147E5 |. 8AC3 |MOV AL,BL004147E7 |. 69C0 88000000 |IMUL EAX,EAX,88004147ED |. F604C5 3434420>|TEST BYTE PTR DS:[EAX*8+423434],10004147F5 |. 74 13 |JE SHORT SGS_NOCD.0041480A004147F7 |. 33C0 |XOR EAX,EAX004147F9 |. 8AC3 |MOV AL,BL004147FB |. A3 84054200 |MOV DWORD PTR DS:[420584],EAX00414800 |. C705 80054200 >|MOV DWORD PTR DS:[420580],60041480A |> FF35 D0754200 |PUSH DWORD PTR DS:[4275D0] ; /hMutex = NULL00414810 |. E8 86450000 |CALL <JMP.&KERNEL32.ReleaseMutex> ; \ReleaseMutex00414815 |. E9 5C0C0000 |JMP SGS_NOCD.00415476
00414917 |> 833D A0054200 >|CMP DWORD PTR DS:[4205A0],0 ; Case 1F of switch 00413F2B0041491E |. 0F85 520B0000 |JNZ SGS_NOCD.0041547600414924 |. 833D A4054200 >|CMP DWORD PTR DS:[4205A4],00041492B |. 0F84 450B0000 |JE SGS_NOCD.0041547600414931 |. 33C0 |XOR EAX,EAX00414933 |. A3 AC054200 |MOV DWORD PTR DS:[4205AC],EAX00414938 |. C705 80054200 >|MOV DWORD PTR DS:[420580],700414942 |. E9 2F0B0000 |JMP SGS_NOCD.00415476
00414A6D |> FF0D 6C054200 |DEC DWORD PTR DS:[42056C] ; Case 26 of switch 00413F2B00414A73 |. A1 6C054200 |MOV EAX,DWORD PTR DS:[42056C]00414A78 |. 8B0485 A875420>|MOV EAX,DWORD PTR DS:[EAX*4+4275A8]00414A7F |. 8906 |MOV DWORD PTR DS:[ESI],EAX00414A81 |. E9 F0090000 |JMP SGS_NOCD.00415476
00414A86 |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 27 of switch 00413F2B00414A88 |. FF06 |INC DWORD PTR DS:[ESI]00414A8A |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]00414A8D |. 50 |PUSH EAX ; /Arg100414A8E |. E8 1DDCFFFF |CALL SGS_NOCD.004126B0 ; \SGS_NOCD.004126B000414A93 |. 59 |POP ECX00414A94 |. E9 DD090000 |JMP SGS_NOCD.00415476
00414D3B |> 33C0 |XOR EAX,EAX ; Case 2D of switch 00413F2B00414D3D |. A3 70054200 |MOV DWORD PTR DS:[420570],EAX00414D42 |. 33C0 |XOR EAX,EAX00414D44 |. A3 74054200 |MOV DWORD PTR DS:[420574],EAX00414D49 |. E9 28070000 |JMP SGS_NOCD.00415476
00414E8F |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 35 of switch 00413F2B00414E91 |. 8A18 |MOV BL,BYTE PTR DS:[EAX]00414E93 |. FF06 |INC DWORD PTR DS:[ESI]00414E95 |. 33C0 |XOR EAX,EAX00414E97 |. 8AC3 |MOV AL,BL00414E99 |. 66:FF0445 3C6E>|INC WORD PTR DS:[EAX*2+426E3C]00414EA1 |. E9 D0050000 |JMP SGS_NOCD.00415476
00414EA6 |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 36 of switch 00413F2B00414EA8 |. 8A18 |MOV BL,BYTE PTR DS:[EAX]00414EAA |. FF06 |INC DWORD PTR DS:[ESI]00414EAC |. 33C0 |XOR EAX,EAX00414EAE |. 8AC3 |MOV AL,BL00414EB0 |. 66:FF0C45 3C6E>|DEC WORD PTR DS:[EAX*2+426E3C]00414EB8 |. E9 B9050000 |JMP SGS_NOCD.00415476
00414EBD |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 37 of switch 00413F2B00414EBF |. 8A18 |MOV BL,BYTE PTR DS:[EAX]00414EC1 |. FF06 |INC DWORD PTR DS:[ESI]00414EC3 |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]00414EC5 |. 66:8B00 |MOV AX,WORD PTR DS:[EAX]00414EC8 |. 33D2 |XOR EDX,EDX00414ECA |. 8AD3 |MOV DL,BL00414ECC |. 66:010455 3C6E>|ADD WORD PTR DS:[EDX*2+426E3C],AX00414ED4 |. 8306 02 |ADD DWORD PTR DS:[ESI],200414ED7 |. E9 9A050000 |JMP SGS_NOCD.00415476
00414EFB |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 39 of switch 00413F2B00414EFD |. 8A18 |MOV BL,BYTE PTR DS:[EAX]00414EFF |. FF06 |INC DWORD PTR DS:[ESI]00414F01 |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]00414F03 |. 66:8B00 |MOV AX,WORD PTR DS:[EAX]00414F06 |. 33D2 |XOR EDX,EDX00414F08 |. 8AD3 |MOV DL,BL00414F0A |. 66:210455 3C6E>|AND WORD PTR DS:[EDX*2+426E3C],AX00414F12 |. 8306 02 |ADD DWORD PTR DS:[ESI],200414F15 |. E9 5C050000 |JMP SGS_NOCD.00415476
0041528B |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 43 of switch 00413F2B0041528D |. 0FB700 |MOVZX EAX,WORD PTR DS:[EAX]00415290 |. A3 E8044200 |MOV DWORD PTR DS:[4204E8],EAX00415295 |. 8306 02 |ADD DWORD PTR DS:[ESI],200415298 |. E9 D9010000 |JMP SGS_NOCD.00415476
0041529D |> C705 80054200 >|MOV DWORD PTR DS:[420580],0A ; Case 44 of switch 00413F2B004152A7 |. E9 CA010000 |JMP SGS_NOCD.00415476
004152C7 |> 803D 4C054200 >|CMP BYTE PTR DS:[42054C],0 ; Case 46 of switch 00413F2B004152CE |. 0F84 A2010000 |JE SGS_NOCD.00415476004152D4 |. C705 80054200 >|MOV DWORD PTR DS:[420580],0B004152DE |. E9 93010000 |JMP SGS_NOCD.00415476
004152E3 |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 47 of switch 00413F2B004152E5 |. FF06 |INC DWORD PTR DS:[ESI]004152E7 |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]004152EA |. 50 |PUSH EAX ; /Arg1004152EB |. E8 5BDBFFFF |CALL SGS_NOCD.00412E4B ; \SGS_NOCD.00412E4B004152F0 |. 59 |POP ECX004152F1 |. E9 80010000 |JMP SGS_NOCD.00415476
00415322 |> 8B06 |MOV EAX,DWORD PTR DS:[ESI] ; Case 49 of switch 00413F2B00415324 |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]00415327 |. 8945 F8 |MOV DWORD PTR SS:[EBP-8],EAX0041532A |. FF06 |INC DWORD PTR DS:[ESI]0041532C |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]0041532E |. 0FB638 |MOVZX EDI,BYTE PTR DS:[EAX]00415331 |. 4F |DEC EDI00415332 |. FF06 |INC DWORD PTR DS:[ESI]00415334 |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]00415336 |. 0FB600 |MOVZX EAX,BYTE PTR DS:[EAX]00415339 |. 8945 F4 |MOV DWORD PTR SS:[EBP-C],EAX0041533C |. FF06 |INC DWORD PTR DS:[ESI]0041533E |. 57 |PUSH EDI ; /Arg20041533F |. FF75 F8 |PUSH DWORD PTR SS:[EBP-8] ; |Arg100415342 |. E8 6FDBFFFF |CALL SGS_NOCD.00412EB6 ; \SGS_NOCD.00412EB600415347 |. 83C4 08 |ADD ESP,80041534A |. 25 FF000000 |AND EAX,0FF0041534F |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C]00415352 |. 66:890455 3C6E>|MOV WORD PTR DS:[EDX*2+426E3C],AX0041535A |. E9 17010000 |JMP SGS_NOCD.00415476
Also, whenever you see a CALL statement that isn't an API function (like CALL SGS_NOCD.00411BF3) I'd need the assembler statements for that block of code (starting at 00411BF3). I'm unable to tell what these statements are doing yet.
In the meantime, here's a file with the ASM for all opcodes:http://dl.dropbox.com/u/2910075/opcode%20table.txt