417
edits
(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=== |
edits