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

Jump to navigation Jump to search
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

Navigation menu