GDR Forum Index
Podcast Podcast
Dev Dev Logs
Search Search
Register Register
Log in Log in
Reply to topic GDR Forum Index -> Game Developer's Refuge -> [hacking] graphics ripping Page Previous  1, 2
View previous topic :: View next topic  
Author Message

Joined: 26 Dec 2005
Posts: 1696
Location: Your consciousness.
PostPosted: Fri May 05, 2017 4:26 am    Post subject: Reply with quote

Currently looking at this piece of the puzzle:

seg003:3673 sub_13813       proc far                ; CODE XREF: start+DCP
seg003:3673                 mov     ax, 140h        ; 320
seg003:3676                 mov     bx, 0F0h ; '='  ; 240
seg003:3679                 xor     cx, cx
seg003:367B                 mov     dx, 20h ; ' '   ; 32
seg003:367E                 mov     si, seg seg009
seg003:3681                 mov     di, 4220h
seg003:3684                 call    some_bookkeeping_A
seg003:3689                 mov     const_240dec_after_init, bx
seg003:368D                 mov     word ptr [bx-469Ah], 0
seg003:3693                 call    some_bookkeeping_A_sub_flagsBit5set
seg003:3698                 call    sub_1873A
seg003:369D                 mov     word_475A, 0
seg003:36A3                 mov     cx, [bx-6E22h]
seg003:36A7                 mov     dx, [bx-6A8Ah]
seg003:36AB                 mov     word_4756, cx
seg003:36AF                 mov     word_4758, dx
seg003:36B3                 mov     word_467A, cx
seg003:36B7                 mov     word_467C, cx
seg003:36BB                 mov     word_467E, dx
seg003:36BF                 mov     word_4680, dx
seg003:36C3                 retf
seg003:36C3 sub_13813       endp

I am sure it is related to graphics in some way. 320 and 240, my mind always links those numbers to graphics although they could be anything but other variables that have already been identified as graphics related pop up in routines it calls, so it must be graphics related.

Down into the "some_bookkeeping_A" there is stuff that looks like a heap or like a data structure where individual fields of the structure are stored in separate arrays of 460 words each. One of the arrays ([bx-71BAh]) appears to contain bitflags of which the highest bit seems to mark an item as "occupied" or "in use".


seg003:7F4D some_bookkeeping_A proc far             ; CODE XREF: sub_1071F:loc_10786P
seg003:7F4D                                         ; seg003:06E9P ...
seg003:7F4D                 push    bx
seg003:7F4E                 cld
seg003:7F4F                 xor     bx, bx          ; start index = 0
seg003:7F4F                                         ; for bx=0
seg003:7F4F                                         ; [bx-71BA] = dseg:8E46
seg003:7F4F                                         ;
seg003:7F4F                                         ; [bx-6E22] = dseg:91DE
seg003:7F4F                                         ;
seg003:7F4F                                         ; [bx-6A8A] = dseg:9576
seg003:7F4F                                         ; [bx-66F2] = dseg:990E
seg003:7F4F                                         ; [bx-635A] = dseg:9CA6
seg003:7F4F                                         ;
seg003:7F4F                                         ; [bx-71BA] = dseg:8E46
seg003:7F4F                                         ; [bx-54FA] = dseg:AB06
seg003:7F4F                                         ; [bx-4DCA] = dseg:B236
seg003:7F4F                                         ; [bx-5162] = dseg:AE9E
seg003:7F4F                                         ; [bx-4A32] = dseg:B5CE
seg003:7F4F                                         ;
seg003:7F4F                                         ; [bx-144A] = dseg:EBB6
seg003:7F4F                                         ; [bx-10B2] = dseg:EF4E
seg003:7F4F                                         ; [bx-0D1A] = dseg:F2E6
seg003:7F51 look_for_unoccupied_storage:            ; CODE XREF: some_bookkeeping_A+13j
seg003:7F51                 test    word ptr [bx-71BAh], 10000000b ; test highest bit
seg003:7F51                                         ; (seems to mark 'occupied')
seg003:7F51                                         ; some kind of heap?
seg003:7F51                                         ; for bx = 0 leads to dseg:8E46
seg003:7F57                 jz      short found_unoccupied_storage
seg003:7F59                 add     bx, 2
seg003:7F5C                 cmp     bx, 920         ; max index * 2 (460 16 bit values)
seg003:7F60                 jl      short look_for_unoccupied_storage
seg003:7F62                 pop     bx
seg003:7F63                 stc                     ; error ? (not enough room to store some info?)
seg003:7F64                 retf
seg003:7F65 ; ---------------------------------------------------------------------------
seg003:7F65 found_unoccupied_storage:               ; CODE XREF: some_bookkeeping_A+Aj
seg003:7F65                 mov     [bx-6E22h], ax
seg003:7F69                 pop     ax              ; take previously pushed bx from stack into ax
seg003:7F6A                 mov     [bx-6A8Ah], ax  ; 6e22h - 6a8ah = 920 dec ... seems like these are
seg003:7F6A                                         ; all arrays of 460 16bit values
seg003:7F6E                 mov     [bx-66F2h], cx
seg003:7F72                 mov     [bx-635Ah], cx
seg003:7F76                 or      dx, 128         ; mark highest bit (mark something as 'occupied' ?)
seg003:7F7A                 mov     [bx-71BAh], dx
seg003:7F7E                 mov     [bx-54FAh], si
seg003:7F82                 mov     [bx-4DCAh], si
seg003:7F86                 mov     [bx-5162h], di
seg003:7F8A                 mov     [bx-4A32h], di
seg003:7F8E                 xor     ax, ax
seg003:7F90                 mov     [bx-144Ah], ax
seg003:7F94                 mov     [bx-10B2h], ax
seg003:7F98                 mov     [bx-0D1Ah], ax
seg003:7F9C                 call    some_bookkeeping_A_continued
seg003:7F9F                 retf
seg003:7F9F some_bookkeeping_A endp

The other flags in there perhaps mark the resource type of the graphic item or the resource type in general or maybe even tell how it is supposed to be decoded, because the bits are used to branch into different subroutines.


seg003:7FA0 some_bookkeeping_A_continued proc near  ; CODE XREF: sub_1807A+6Bp
seg003:7FA0                                         ; some_bookkeeping_A+4Fp
seg003:7FA0                 mov     word ptr [bx-469Ah], 0
seg003:7FA6                 mov     word ptr [bx-5EAh], 0FFFFh
seg003:7FAC                 test    word ptr [bx-71BAh], 100000b ; test bit 5 (32)
seg003:7FB2                 jz      short bit5notset
seg003:7FB4                 push    cs
seg003:7FB5                 call    near ptr some_bookkeeping_A_sub_flagsBit5set
seg003:7FB8                 nop
seg003:7FB9 bit5notset:                             ; CODE XREF: some_bookkeeping_A_continued+12j
seg003:7FB9                 push    cs
seg003:7FBA                 call    near ptr sub_18470
seg003:7FBD                 nop
seg003:7FBE                 test    word ptr [bx-71BAh], 100b ; test bit 2 (4)
seg003:7FC4                 jnz     short bit2set
seg003:7FC6                 push    cs
seg003:7FC7                 call    near ptr some_bookkeeping_A_sub_flagsBit2notset
seg003:7FCA                 nop
seg003:7FCB bit2set:                                ; CODE XREF: some_bookkeeping_A_continued+24j
seg003:7FCB                 mov     ax, [bx-4302h]
seg003:7FCF                 mov     [bx-34A2h], ax
seg003:7FD3                 mov     ax, [bx-3F6Ah]
seg003:7FD7                 mov     [bx-310Ah], ax
seg003:7FDB                 mov     ax, [bx-3BD2h]
seg003:7FDF                 mov     [bx-2D72h], ax
seg003:7FE3                 mov     ax, [bx-383Ah]
seg003:7FE7                 mov     [bx-29DAh], ax
seg003:7FEB                 xor     ax, ax
seg003:7FED                 mov     [bx-1F12h], ax
seg003:7FF1                 mov     [bx-2642h], ax
seg003:7FF5                 mov     cx, screen_width_in_pixels_div8
seg003:7FF9                 dec     cx
seg003:7FFA                 mov     [bx-1B7Ah], cx
seg003:7FFE                 mov     dx, screen_height_in_pixels
seg003:8002                 dec     dx
seg003:8003                 mov     [bx-22AAh], dx
seg003:8007                 mov     [bx-17E2h], dx
seg003:800B                 cmp     bx, word_8DC6
seg003:800F                 jbe     short loc_181B5
seg003:8011                 mov     word_8DC6, bx
seg003:8015 loc_181B5:                              ; CODE XREF: some_bookkeeping_A_continued+6Fj
seg003:8015                 clc
seg003:8016                 retn
seg003:8016 some_bookkeeping_A_continued endp

Current notes that I keep open on the side. Unfortunately, IDA does not allow to assign names to computed addresses, so I have to rely on my eyes' pattern matching abilities on these to not miss anything. Having all the numbers opened on the side helps with that.


seg003:3673                 mov     ax, 140h        ; 320
seg003:3676                 mov     bx, 0F0h ; '='  ; 240
seg003:3679                 xor     cx, cx
seg003:367B                 mov     dx, 20h ; ' '   ; 32
seg003:367E                 mov     si, seg seg009
seg003:3681                 mov     di, 4220h
seg003:3684                 call    some_bookkeeping_A 
                                               ; gets called a lot, must be some
                                               ; heap management and bookkeeping stuff
for bx=0 inside that particular call leads to
dseg:8E46 [bx-71BA] flags (bit 7 = occupied)

dseg:91DE [bx-6E22] 320 (ax)
dseg:9576 [bx-6A8A] 240 (bx)
(6e22 - 6a8a = 920 dec (the limit for the loop))

dseg:990E [bx-66F2] 0 (cx)
dseg:9CA6 [bx-635A] 0 (cx)
(66f2 - 635A = 920 dec (also the limit for the loop))

dseg:8E46 [bx-71BA] 128 (occupied bit) | 32 (dx)
dseg:AB06 [bx-54FA] seg009
dseg:B236 [bx-4DCA] seg009    (some source pointer)
dseg:AE9E [bx-5162] 4220h
dseg:B5CE [bx-4A32] 4220h     (some offset relative to source)

dseg:EBB6 [bx-144A] 0
dseg:EF4E [bx-10B2] 0
dseg:F2E6 [bx-0D1A] 0

call some_bookkeeping_A_continued

[bx-469A] = dseg:0000   0 (hardcoded)
[bx-05EA] = dseg:0000  -1 (hardcoded)

View user's profile Send private message Visit poster's website
Reply to topic GDR Forum Index -> Game Developer's Refuge -> [hacking] graphics ripping Page Previous  1, 2
Game Developer's Refuge
is proudly hosted by,


All trademarks and copyrights on this page are owned by their respective owners. All comments owned by their respective posters.
phpBB code © 2001, 2005 phpBB Group. Other message board code © Kevin Reems.