Open main menu

Difference between revisions of "AGI/Specifications/Other/AGI256/Implementation Details"

Added first part of AGIOBJS.OVL's disassembly.
(Added info on new files in AGI256 and changed files.)
(Added first part of AGIOBJS.OVL's disassembly.)
Line 24: Line 24:
* AGI.EXE
* AGI.EXE
* AGIDATA.OVL
* AGIDATA.OVL
===Disassembly of AGIOBJS.OVL===
<pre>
codeseg:9DB0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
codeseg:9DB0
codeseg:9DB0 ; AGIOBJS.OVL starts here at 0x9DB0
codeseg:9DB0 ; Attributes: thunk
codeseg:9DB0
codeseg:9DB0 j_AO_agi256_saveArea proc near          ; CODE XREF: sub_45E+15�p
codeseg:9DB0                                        ; sub_5EDB+E4�p
codeseg:9DB0                jmp    AO_agi256_saveArea ; savearea(struct Sprite *s) {
codeseg:9DB0 j_AO_agi256_saveArea endp              ;  int srcOffset = screenOffset(s->xPos, s->yPos);
codeseg:9DB0                                        ;  uint8 *src = agi256PicSeg[srcOffset + 160];
codeseg:9DB0                                        ;  for (int y = 0; y < s->ySize; y++)
codeseg:9DB0                                        ;    memcpy(s->buffer + s->xSize * y, src + 320 * y, s->xSize);
codeseg:9DB0                                        ; }
codeseg:9DB3
codeseg:9DB3 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
codeseg:9DB3
codeseg:9DB3 ; Attributes: thunk
codeseg:9DB3
codeseg:9DB3 j_AO_agi256_restoreArea proc near      ; CODE XREF: sub_307+13�p
codeseg:9DB3                                        ; sub_5EDB+121�p
codeseg:9DB3                jmp    AO_agi256_restoreArea ; restoreArea(struct Sprite *s) {
codeseg:9DB3 j_AO_agi256_restoreArea endp            ;  int destOffset = screenOffset(s->xPos, s->yPos);
codeseg:9DB3                                        ;  uint8 *dest = &agi256PicSeg[destOffset + 160];
codeseg:9DB3                                        ;  for (int y = 0; y < s->ySize; y++)
codeseg:9DB3                                        ;    memcpy(dest + 320 * y, s->buffer + s->xSize * y, s->xSize);
codeseg:9DB3                                        ; }
codeseg:9DB6
codeseg:9DB6 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
codeseg:9DB6
codeseg:9DB6 ; Attributes: thunk
codeseg:9DB6
codeseg:9DB6 j_AO_agi256_blit proc near              ; CODE XREF: sub_45E+1E�p
codeseg:9DB6                                        ; sub_57CF+22�p ...
codeseg:9DB6                jmp    AO_agi256_blit
codeseg:9DB6 j_AO_agi256_blit endp
codeseg:9DB6
codeseg:9DB9
codeseg:9DB9 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
codeseg:9DB9
codeseg:9DB9 ; savearea(struct Sprite *s) {
codeseg:9DB9 ;  int srcOffset = screenOffset(s->xPos, s->yPos);
codeseg:9DB9 ;  uint8 *src = agi256PicSeg[srcOffset + 160];
codeseg:9DB9 ;  for (int y = 0; y < s->ySize; y++)
codeseg:9DB9 ;    memcpy(s->buffer + s->xSize * y, src + 320 * y, s->xSize);
codeseg:9DB9 ; }
codeseg:9DB9 ; Attributes: bp-based frame
codeseg:9DB9
codeseg:9DB9 AO_agi256_saveArea proc near            ; CODE XREF: j_AO_agi256_saveArea�j
codeseg:9DB9
codeseg:9DB9 spritePtr      = word ptr  8
codeseg:9DB9
codeseg:9DB9                push    si
codeseg:9DBA                push    di
codeseg:9DBB                push    bp
codeseg:9DBC                mov    bp, sp
codeseg:9DBE                sub    sp, 2
codeseg:9DC1                mov    bp, [bp+spritePtr]
codeseg:9DC4                mov    al, byte ptr [bp+Sprite.yPos] ; At some places only lowest 8 bits are used
codeseg:9DC7                mov    ah, byte ptr [bp+Sprite.xPos] ; At some places only lowest 8 bits are used
codeseg:9DCA                call    screenOffset    ; Calculates the screen offset for given coordinate? Video or AGI screen offset?
codeseg:9DCA                                        ; DI = AL * 320 + AH
codeseg:9DCA                                        ; (Destroys BX contents (Returns with BH = 0, BL = AH))
codeseg:9DCA                                        ;
codeseg:9DCA                                        ; Maybe not named quite correctly?
codeseg:9DCD                mov    si, di
codeseg:9DCF                mov    ah, byte ptr [bp+Sprite.ySize] ; At some places only lowest 8 bits are used
codeseg:9DD2                mov    al, byte ptr [bp+Sprite.xSize] ; At some places only lowest 8 bits are used
codeseg:9DD5                mov    di, [bp+Sprite.buffer]
codeseg:9DD8                push    ds
codeseg:9DD9                mov    ds, agi256PicSeg
codeseg:9DDD                xor    dx, dx
codeseg:9DDF                mov    cx, dx
codeseg:9DE1                jmp    AO_agi256_saveArea_loop_init ; DX = 320 - Sprite.xSize (AL)
codeseg:9DE1 AO_agi256_saveArea endp                ; SI += 160 (This is done in part 2 of the loop init, actually)
codeseg:9DE1                                        ; This is elsewhere than directly inside AO_agi256_saveArea
codeseg:9DE1                                        ; probably because it didn't fit otherwise. Returns to AO_agi256_saveArea_loop
codeseg:9DE1                                        ; (Although calls AO_agi256_saveArea_loop_init_part2 first)
codeseg:9DE4 ; ---------------------------------------------------------------------------
codeseg:9DE4                nop
codeseg:9DE5                nop
codeseg:9DE6
codeseg:9DE6 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
codeseg:9DE6
codeseg:9DE6 ; Loop in pseudo C:
codeseg:9DE6 ; for (int y = 0; y < Sprite.ySize; y++) {
codeseg:9DE6 ;  memcpy(ES:DI, DS:SI, Sprite.xSize);
codeseg:9DE6 ;  SI += 320;
codeseg:9DE6 ;  DI += Sprite.xSize; 
codeseg:9DE6 ; }
codeseg:9DE6
codeseg:9DE6 AO_agi256_saveArea_loop proc near      ; CODE XREF: AO_agi256_saveArea_loop+8�j
codeseg:9DE6                                        ; AO_agi256_saveArea_loop_init_part2+4�j
codeseg:9DE6                mov    cl, al          ; Move Sprite.xSize bytes per row
codeseg:9DE8                repe movsb              ; Move the bytes from DS:SI to ES:DI
codeseg:9DEA                add    si, dx          ; Move to the next row
codeseg:9DEA                                        ; repe movsb added Sprite.xSize to SI
codeseg:9DEA                                        ; add si,dx adds (320 - Sprite.xSize) to SI
codeseg:9DEA                                        ; so the addition is Sprite.xSize + (320 - Sprite.xSize) = 320
codeseg:9DEC                dec    ah              ; Loop Sprite.ySize times
codeseg:9DEE                jnz    AO_agi256_saveArea_loop ; Loop in pseudo C:
codeseg:9DEE                                        ; for (int y = 0; y < Sprite.ySize; y++) {
codeseg:9DEE                                        ;  memcpy(ES:DI, DS:SI, Sprite.xSize);
codeseg:9DEE                                        ;  SI += 320;
codeseg:9DEE                                        ;  DI += Sprite.xSize; 
codeseg:9DEE                                        ; }
codeseg:9DF0                pop    ds
codeseg:9DF1                add    sp, 2
codeseg:9DF4                pop    bp
codeseg:9DF5                pop    di
codeseg:9DF6                pop    si
codeseg:9DF7                retn
codeseg:9DF7 AO_agi256_saveArea_loop endp ; sp =  0Ah
codeseg:9DF7
codeseg:9DF8
codeseg:9DF8 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
codeseg:9DF8
codeseg:9DF8 ; restoreArea(struct Sprite *s) {
codeseg:9DF8 ;  int destOffset = screenOffset(s->xPos, s->yPos);
codeseg:9DF8 ;  uint8 *dest = &agi256PicSeg[destOffset + 160];
codeseg:9DF8 ;  for (int y = 0; y < s->ySize; y++)
codeseg:9DF8 ;    memcpy(dest + 320 * y, s->buffer + s->xSize * y, s->xSize);
codeseg:9DF8 ; }
codeseg:9DF8 ; Attributes: bp-based frame
codeseg:9DF8
codeseg:9DF8 AO_agi256_restoreArea proc near        ; CODE XREF: j_AO_agi256_restoreArea�j
codeseg:9DF8
codeseg:9DF8 spritePtr      = word ptr  8
codeseg:9DF8
codeseg:9DF8                push    si
codeseg:9DF9                push    di
codeseg:9DFA                push    bp
codeseg:9DFB                mov    bp, sp
codeseg:9DFD                sub    sp, 2
codeseg:9E00                mov    bp, [bp+spritePtr]
codeseg:9E03                mov    al, byte ptr [bp+Sprite.yPos] ; At some places only lowest 8 bits are used
codeseg:9E06                mov    ah, byte ptr [bp+Sprite.xPos] ; At some places only lowest 8 bits are used
codeseg:9E09                call    screenOffset    ; Calculates the screen offset for given coordinate? Video or AGI screen offset?
codeseg:9E09                                        ; DI = AL * 320 + AH
codeseg:9E09                                        ; (Destroys BX contents (Returns with BH = 0, BL = AH))
codeseg:9E09                                        ;
codeseg:9E09                                        ; Maybe not named quite correctly?
codeseg:9E0C                mov    si, [bp+Sprite.buffer]
codeseg:9E0F                mov    ah, byte ptr [bp+Sprite.ySize] ; At some places only lowest 8 bits are used
codeseg:9E12                mov    al, byte ptr [bp+Sprite.xSize] ; At some places only lowest 8 bits are used
codeseg:9E15                push    es
codeseg:9E16                mov    es, agi256PicSeg
codeseg:9E1A                xor    dx, dx
codeseg:9E1C                mov    cx, dx
codeseg:9E1E                jmp    AO_agi256_restoreArea_loop_init ; DX = 320 - Sprite.xSize (AL)
codeseg:9E1E AO_agi256_restoreArea endp              ; DI += 160
codeseg:9E1E                                        ; This is elsewhere than directly inside AO_agi256_restoreArea
codeseg:9E1E                                        ; probably because it didn't fit otherwise. Returns to AO_agi256_restoreArea_loop
codeseg:9E21 ; ---------------------------------------------------------------------------
codeseg:9E21                nop
codeseg:9E22                nop
codeseg:9E23
</pre>


===Differences between AGI v2.936's AGI.EXE and AGI256's hacked AGI.EXE===
===Differences between AGI v2.936's AGI.EXE and AGI256's hacked AGI.EXE===
417

edits