; Atari display module. Procedure Handle_TIA is called every time the ; screen registers are changed. ; Set the following line to 1 for 160x200 mode, 0 for 320x200 mode LOWRES EQU 0 _Base EQU 16384 + 256 VSYNC EQU 0 VBLANK EQU 1 WSYNC EQU 2 RSYNC EQU 3 NUSIZ0 EQU 4 NUSIZ1 EQU 5 COLUP0 EQU 6 COLUP1 EQU 7 COLUPF EQU 8 COLUBK EQU 9 CTRLPF EQU 0Ah REFP0 EQU 0Bh REFP1 EQU 0Ch PF0 EQU 0Dh PF1 EQU 0Eh PF2 EQU 0Fh RESP0 EQU 10h RESP1 EQU 11h RESM0 EQU 12h RESM1 EQU 13h RESBL EQU 14h GRP0 EQU 1Bh GRP1 EQU 1Ch ENAM0 EQU 1Dh ENAM1 EQU 1Eh ENABL EQU 1Fh HMP0 EQU 20h HMP1 EQU 21h HMM0 EQU 22h HMM1 EQU 23h HMBL EQU 24h VDELP0 EQU 25h VDELP1 EQU 26h VDELBL EQU 27h RESMP0 EQU 28h RESMP1 EQU 29h HMOVE EQU 2Ah HMCLR EQU 2Bh CXCLR EQU 2Ch SWCHA1 EQU 280h SWACNT1 EQU 281h SWCHB1 EQU 282h SWBCNT1 EQU 283h INTTIM1 EQU 284h TIM1T1 EQU 294h TIM2T1 EQU 295h TIM3T1 EQU 296h TIM4T1 EQU 297h SWCHA2 EQU 380h SWACNT2 EQU 381h SWCHB2 EQU 382h SWBCNT2 EQU 383h INTTIM2 EQU 384h TIM1T2 EQU 394h TIM2T2 EQU 395h TIM3T2 EQU 396h TIM4T2 EQU 397h Player0Set EQU 2 Player1Set EQU 4 Missile0Set EQU 8 Missile1Set EQU 16 BallSet EQU 32 P0CBase EQU 07D8Fh P1CBase EQU 08D7Fh M0CBase EQU 0FE33h M1CBase EQU 032FFh PFCBase EQU 0D7D5h BLCBase EQU 0EBE9h ; was EBEBh data segment byte public 'data' assume DS:data extrn TIA_Regs : byte extrn TIA_Count : byte extrn Old_TIA_Count : byte extrn ObjectLoc : byte extrn ObjectPix : byte extrn Player0Size : byte extrn Player1Size : byte extrn Player0Size160 : byte extrn Player1Size160 : byte extrn Player0Size128 : byte extrn Player1Size128 : byte extrn Missile0SizeNum : byte extrn Missile1SizeNum : byte extrn MissileTable : byte extrn Addr : byte extrn BitSwap : byte extrn Limit : byte extrn ColorLum : byte extrn ByteShift : byte extrn Missile0Size : byte extrn Missile1Size : byte extrn Missile0Size160 : byte extrn Missile1Size160 : byte extrn BallSize : byte extrn BallSize160 : byte extrn BitTest : byte extrn CLW : byte extrn CRW : byte extrn Input_Byte : byte extrn TIA_Scan : byte extrn Handle_TIA_Jump : byte extrn Handle_TIA_Jump_Set : byte extrn DispJump : byte extrn DoHMOVE : byte extrn LineStart : byte extrn LastScan : byte extrn NewScan : byte extrn TopVBLANK : byte extrn CTRLPFLatch : byte extrn CTRLPFScan : byte extrn CTRLPFCount : byte extrn MissileSize : byte extrn BallAdjust : byte extrn Config : byte data ends code segment para public 'code' assume DS:data,CS:code public Handle_TIA .486 ; ------------------------------------------------------------------------- ; Display player 0 and missile 0 ; ------------------------------------------------------------------------- _P0M0 macro local Show0,GetOut1,ShowM0,GetOut3,GetOut3a,Show1,Show1a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut1 JNZ SHORT Show0 ADD WORD PTR ObjectPix[Player0Set * 2 + _Base],160 Show0: ADD BX,WORD PTR Player0Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP0 + _Base] JZ SHORT GetOut1 MOV BX,WORD PTR ColorLum[0 + _Base] MOV WORD PTR ES:[DI],BX ; Display missile 0 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut3 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Missile0Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Missile0SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut3 JMP SHORT GetOut3a GetOut1: AND SI,P0CBase ; Display missile 0 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut3 JNZ SHORT Show1a ADD WORD PTR ObjectPix[Missile0Set * 2 + _Base],160 Show1a: ADD BX,WORD PTR Missile0SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut3 MOV BX,WORD PTR ColorLum[0 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut3a GetOut3: AND SI,M0CBase GetOut3a: endm ; ------------------------------------------------------------------------- ; Display player 0 and missile 0 for 160x200 mode ; ------------------------------------------------------------------------- _P0M0_160 macro local Show0,GetOut1,ShowM0,GetOut3,GetOut3a,Show1,Show1a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut1 JNZ SHORT Show0 ADD WORD PTR ObjectPix[Player0Set * 2 + _Base],160 Show0: ADD BX,WORD PTR Player0Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP0 + _Base] JZ SHORT GetOut1 MOV BL,BYTE PTR ColorLum[0 + _Base] MOV BYTE PTR ES:[DI],BL ; Display missile 0 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut3 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Missile0Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Missile0SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut3 JMP SHORT GetOut3a GetOut1: AND SI,P0CBase ; Display missile 0 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut3 JNZ SHORT Show1a ADD WORD PTR ObjectPix[Missile0Set * 2 + _Base],160 Show1a: ADD BX,WORD PTR Missile0SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut3 MOV BL,BYTE PTR ColorLum[0 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut3a GetOut3: AND SI,M0CBase GetOut3a: endm ; ------------------------------------------------------------------------- ; Display player 0 ; ------------------------------------------------------------------------- _P0 macro local Show0,GetOut1,GetOut3a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut1 JNZ SHORT Show0 ADD WORD PTR ObjectPix[Player0Set * 2 + _Base],160 Show0: ADD BX,WORD PTR Player0Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP0 + _Base] JZ SHORT GetOut1 MOV BX,WORD PTR ColorLum[0 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut3a GetOut1: AND SI,P0CBase GetOut3a: endm ; ------------------------------------------------------------------------- ; Display player 0 for 160x200 mode ; ------------------------------------------------------------------------- _P0_160 macro local Show0,GetOut1,GetOut3a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut1 JNZ SHORT Show0 ADD WORD PTR ObjectPix[Player0Set * 2 + _Base],160 Show0: ADD BX,WORD PTR Player0Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP0 + _Base] JZ SHORT GetOut1 MOV BL,BYTE PTR ColorLum[0 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut3a GetOut1: AND SI,P0CBase GetOut3a: endm ; ------------------------------------------------------------------------- ; Display missile 0 ; ------------------------------------------------------------------------- _M0 macro local ShowM0,GetOut3,GetOut3a,Show1 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut3 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Missile0Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Missile0SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut3 MOV BX,WORD PTR ColorLum[0 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut3a GetOut3: AND SI,M0CBase GetOut3a: endm ; ------------------------------------------------------------------------- ; Display missile 0 for 160x200 mode ; ------------------------------------------------------------------------- _M0_160 macro local ShowM0,GetOut3,GetOut3a,Show1 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile0Set * 2 + _Base] CMP BX,WORD PTR Player0Size[_Base] JA SHORT GetOut3 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Missile0Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Missile0SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut3 MOV BL,BYTE PTR ColorLum[0 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut3a GetOut3: AND SI,M0CBase GetOut3a: endm ; ------------------------------------------------------------------------- ; Display player 1 and missile 1 ; ------------------------------------------------------------------------- _P1M1 macro local Show1,GetOut2,ShowM1,GetOut4,GetOut4a,Show2,Show2a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut2 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Player1Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Player1Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP1 + _Base] JZ SHORT GetOut2 MOV BX,WORD PTR ColorLum[2 + _Base] MOV WORD PTR ES:[DI],BX ; Display missile 1 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut4 JNZ SHORT Show2 ADD WORD PTR ObjectPix[Missile1Set * 2 + _Base],160 Show2: ADD BX,WORD PTR Missile1SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut4 JMP SHORT GetOut4a GetOut2: AND SI,P1CBase ; Display missile 1 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut4 JNZ SHORT Show2a ADD WORD PTR ObjectPix[Missile1Set * 2 + _Base],160 Show2a: ADD BX,WORD PTR Missile1SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut4 MOV BX,WORD PTR ColorLum[2 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut4a GetOut4: AND SI,M1CBase GetOut4a: endm ; ------------------------------------------------------------------------- ; Display player 1 and missile 1 for 160x200 mode ; ------------------------------------------------------------------------- _P1M1_160 macro local Show1,GetOut2,ShowM1,GetOut4,GetOut4a,Show2,Show2a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut2 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Player1Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Player1Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP1 + _Base] JZ SHORT GetOut2 MOV BL,BYTE PTR ColorLum[2 + _Base] MOV BYTE PTR ES:[DI],BL ; Display missile 1 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut4 JNZ SHORT Show2 ADD WORD PTR ObjectPix[Missile1Set * 2 + _Base],160 Show2: ADD BX,WORD PTR Missile1SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut4 JMP SHORT GetOut4a GetOut2: AND SI,P1CBase ; Display missile 1 MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut4 JNZ SHORT Show2a ADD WORD PTR ObjectPix[Missile1Set * 2 + _Base],160 Show2a: ADD BX,WORD PTR Missile1SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut4 MOV BL,BYTE PTR ColorLum[2 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut4a GetOut4: AND SI,M1CBase GetOut4a: endm ; ------------------------------------------------------------------------- ; Display player 1 ; ------------------------------------------------------------------------- _P1 macro local Show1,GetOut2,GetOut4a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut2 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Player1Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Player1Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP1 + _Base] JZ SHORT GetOut2 MOV BX,WORD PTR ColorLum[2 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut4a GetOut2: AND SI,P1CBase GetOut4a: endm ; ------------------------------------------------------------------------- ; Display player 1 for 160x200 mode ; ------------------------------------------------------------------------- _P1_160 macro local Show1,GetOut2,GetOut4a MOV BX,AX SUB BX,WORD PTR ObjectPix[Player1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut2 JNZ SHORT Show1 ADD WORD PTR ObjectPix[Player1Set * 2 + _Base],160 Show1: ADD BX,WORD PTR Player1Size128[_Base] MOV DL,BYTE PTR ByteShift[BX + _Base] TEST DL,BYTE PTR TIA_Regs[GRP1 + _Base] JZ SHORT GetOut2 MOV BL,BYTE PTR ColorLum[2 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut4a GetOut2: AND SI,P1CBase GetOut4a: endm ; ------------------------------------------------------------------------- ; Display missile 1 ; ------------------------------------------------------------------------- _M1 macro local ShowM1,GetOut4,GetOut4a,Show2a MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut4 JNZ SHORT Show2a ADD WORD PTR ObjectPix[Missile1Set * 2 + _Base],160 Show2a: ADD BX,WORD PTR Missile1SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut4 MOV BX,WORD PTR ColorLum[2 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut4a GetOut4: AND SI,M1CBase GetOut4a: endm ; ------------------------------------------------------------------------- ; Display missile 1 for 160x200 mode ; ------------------------------------------------------------------------- _M1_160 macro local ShowM1,GetOut4,GetOut4a,Show2a MOV BX,AX SUB BX,WORD PTR ObjectPix[Missile1Set * 2 + _Base] CMP BX,WORD PTR Player1Size[_Base] JA SHORT GetOut4 JNZ SHORT Show2a ADD WORD PTR ObjectPix[Missile1Set * 2 + _Base],160 Show2a: ADD BX,WORD PTR Missile1SizeNum[_Base] TEST BYTE PTR MissileTable[BX + _Base],DH ; 0FFh JZ SHORT GetOut4 MOV BL,BYTE PTR ColorLum[2 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut4a GetOut4: AND SI,M1CBase GetOut4a: endm ; ------------------------------------------------------------------------- ; Display ball ; ------------------------------------------------------------------------- _BL macro local ShowBL,GetOut5,GetOut5a MOV BX,AX SUB BX,WORD PTR ObjectLoc[BallSet * 2 + _Base] CMP BX,WORD PTR BallSize[_Base] JB SHORT ShowBL CMP BX,WORD PTR BallSize160[_Base] JGE SHORT GetOut5 ShowBL: MOV BX,WORD PTR ColorLum[4 + _Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut5a GetOut5: AND SI,BLCBase GetOut5a: endm ; ------------------------------------------------------------------------- ; Display ball for 160x200 mode ; ------------------------------------------------------------------------- _BL_160 macro local ShowBL,GetOut5,GetOut5a MOV BX,AX SUB BX,WORD PTR ObjectLoc[BallSet * 2 + _Base] CMP BX,WORD PTR BallSize[_Base] JB SHORT ShowBL CMP BX,WORD PTR BallSize160[_Base] JGE SHORT GetOut5 ShowBL: MOV BL,BYTE PTR ColorLum[4 + _Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut5a GetOut5: AND SI,BLCBase GetOut5a: endm ; ------------------------------------------------------------------------- ; Display playfield before anything else ; ------------------------------------------------------------------------- _PF1st macro local L1,L2,GetOut MOV BL,AL MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] AND BX,01FCh TEST ECX,DWORD PTR BitTest[BX + _Base] JZ SHORT L2 CMP AL,80 JAE SHORT L1 MOV BX,WORD PTR CLW[_Base] JMP SHORT GetOut L1: MOV BX,WORD PTR CRW[_Base] JMP SHORT GetOut L2: MOV BX,WORD PTR ColorLum[6 + _Base] AND SI,PFCBase GetOut: MOV WORD PTR ES:[DI],BX endm ; ------------------------------------------------------------------------- ; Display playfield before anything else for 160x200 mode ; ------------------------------------------------------------------------- _PF1st_160 macro local L1,L2,GetOut MOV BL,AL MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] AND BX,01FCh TEST ECX,DWORD PTR BitTest[BX + _Base] JZ SHORT L2 CMP AL,80 JAE SHORT L1 MOV BL,BYTE PTR CLW[_Base] JMP SHORT GetOut L1: MOV BL,BYTE PTR CRW[_Base] JMP SHORT GetOut L2: MOV BL,BYTE PTR ColorLum[6 + _Base] AND SI,PFCBase GetOut: MOV BYTE PTR ES:[DI],BL endm ; ------------------------------------------------------------------------- ; Display playfield after everything else ; ------------------------------------------------------------------------- _PFlast macro local L1,L2,Getout MOV BL,AL MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] AND BX,01FCh TEST ECX,DWORD PTR BitTest[BX + _Base] JZ SHORT L2 CMP AL,80 JAE SHORT L1 MOV BX,WORD PTR CLW[_Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut L1: MOV BX,WORD PTR CRW[_Base] MOV WORD PTR ES:[DI],BX JMP SHORT GetOut L2: AND SI,PFCBase GetOut: endm ; ------------------------------------------------------------------------- ; Display playfield after everything else for 160x200 mode ; ------------------------------------------------------------------------- _PFlast_160 macro local L1,L2,Getout MOV BL,AL MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] AND BX,01FCh TEST ECX,DWORD PTR BitTest[BX + _Base] JZ SHORT L2 CMP AL,80 JAE SHORT L1 MOV BL,BYTE PTR CLW[_Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut L1: MOV BL,BYTE PTR CRW[_Base] MOV BYTE PTR ES:[DI],BL JMP SHORT GetOut L2: AND SI,PFCBase GetOut: endm ; ------------------------------------------------------------------------- ; Display loop ; ------------------------------------------------------------------------- _Disp macro Collision,P0,M0,P1,M1,Ball local Top1,Top TEST BYTE PTR TIA_Regs[CTRLPF + _Base],4 JZ Top Top1: MOV SI,Collision ; Set up collision counter MOV BX,WORD PTR ColorLum[6 + _Base] ; Default: background color MOV WORD PTR ES:[DI],BX if P1 ne 0 if M1 ne 0 _P1M1 else _P1 endif else if M1 ne 0 _M1 endif endif if P0 ne 0 if M0 ne 0 _P0M0 else _P0 endif else if M0 ne 0 _M0 endif endif if Ball ne 0 _BL endif _PFlast ADD DI,2 ; Write pixel and move on OR BP,SI ; Tally collisions INC AL ; Next pixel CMP AL,BYTE PTR Limit[_Base] JB Top1 JMP @Exiting Top: MOV SI,Collision ; Set up collision counter _PF1st if Ball ne 0 _BL endif if P1 ne 0 if M1 ne 0 _P1M1 else _P1 endif else if M1 ne 0 _M1 endif endif if P0 ne 0 if M0 ne 0 _P0M0 else _P0 endif else if M0 ne 0 _M0 endif endif ADD DI,2 ; Write pixel and move on OR BP,SI ; Tally collisions INC AL ; Next pixel CMP AL,BYTE PTR Limit[_Base] JB Top endm ; ------------------------------------------------------------------------- ; Display loop for 160x200 mode ; ------------------------------------------------------------------------- _Disp160 macro Collision,P0,M0,P1,M1,Ball local Top1,Top TEST BYTE PTR TIA_Regs[CTRLPF + _Base],4 JZ Top Top1: MOV SI,Collision ; Set up collision counter MOV BL,BYTE PTR ColorLum[6 + _Base] ; Default: background color MOV BYTE PTR ES:[DI],BL if P1 ne 0 if M1 ne 0 _P1M1_160 else _P1_160 endif else if M1 ne 0 _M1_160 endif endif if P0 ne 0 if M0 ne 0 _P0M0_160 else _P0_160 endif else if M0 ne 0 _M0_160 endif endif if Ball ne 0 _BL_160 endif _PFlast_160 INC DI ; Write pixel and move on OR BP,SI ; Tally collisions INC AL ; Next pixel CMP AL,BYTE PTR Limit[_Base] JB Top1 JMP @Exiting Top: MOV SI,Collision ; Set up collision counter _PF1st_160 if Ball ne 0 _BL_160 endif if P1 ne 0 if M1 ne 0 _P1M1_160 else _P1_160 endif else if M1 ne 0 _M1_160 endif endif if P0 ne 0 if M0 ne 0 _P0M0_160 else _P0_160 endif else if M0 ne 0 _M0_160 endif endif INC DI ; Write pixel and move on OR BP,SI ; Tally collisions INC AL ; Next pixel CMP AL,BYTE PTR Limit[_Base] JB Top endm ; ------------------------------------------------------------------------- ; Display loop, used for playfield only ; ------------------------------------------------------------------------- _DispNothingLoop macro local L2A,NoPix,Outside,Leaving,Lt1,Lt2,Lt3,Lt1No,Lt2No,Lt3No,Outside1,Lt0,Lt0No SUB AH,AL MOV BL,AL AND BX,01FCh TEST ECX,DWORD PTR BitTest[BX + _Base] JZ SHORT NoPix MOV BL,AL ; Playfield is displayed AND AL,0FCh AND BL,3 JZ SHORT Outside1 CMP BL,1 JZ SHORT Lt1 CMP BL,2 JZ SHORT Lt2 JMP SHORT Lt3 NoPix: MOV BL,AL ; Background is displayed AND AL,0FCh AND BL,3 JZ SHORT L2A CMP BL,1 JZ SHORT Lt1No CMP BL,2 JZ Lt2No JMP Lt3No Outside: MOV BL,AL ADD AL,4 TEST ECX,DWORD PTR BitTest[BX + _Base + 4] JZ SHORT L2A Outside1: TEST AH,0FCh JZ SHORT Lt0 MOV DWORD PTR ES:[DI],EDX MOV DWORD PTR ES:[DI + 4],EDX ADD DI,8 SUB AH,4 JNZ SHORT Outside JZ SHORT Leaving Lt0: MOV WORD PTR ES:[DI],DX ADD DI,2 ; Write pixel and move on DEC AH JZ SHORT Leaving Lt1: MOV WORD PTR ES:[DI],DX ADD DI,2 ; Write pixel and move on DEC AH JZ SHORT Leaving Lt2: MOV WORD PTR ES:[DI],DX ADD DI,2 ; Write pixel and move on DEC AH JZ SHORT Leaving Lt3: MOV WORD PTR ES:[DI],DX ADD DI,2 ; Write pixel and move on DEC AH JNZ SHORT Outside ; OR BP,1 ; JMP @Exiting JMP Leaving L2A: TEST AH,0FCh JZ SHORT Lt0No MOV DWORD PTR ES:[DI],ESI MOV DWORD PTR ES:[DI + 4],ESI ADD DI,8 SUB AH,4 JNZ SHORT Outside JZ SHORT Leaving Lt0No: MOV WORD PTR ES:[DI],SI ADD DI,2 ; Write pixel and move on DEC AH JZ SHORT Leaving Lt1No: MOV WORD PTR ES:[DI],SI ADD DI,2 ; Write pixel and move on DEC AH JZ SHORT Leaving Lt2No: MOV WORD PTR ES:[DI],SI ADD DI,2 ; Write pixel and move on DEC AH JZ SHORT Leaving Lt3No: MOV WORD PTR ES:[DI],SI ADD DI,2 ; Write pixel and move on DEC AH JNZ Outside Leaving: OR BP,1 endm ; ------------------------------------------------------------------------- ; Display loop, used for playfield only for 160x200 mode ; ------------------------------------------------------------------------- _DispNothingLoop160 macro local L2A,NoPix,Outside,Leaving,Lt1,Lt2,Lt3,Lt1No,Lt2No,Lt3No,Outside1,Lt0,Lt0No SUB AH,AL MOV BL,AL AND BX,01FCh TEST ESI,DWORD PTR BitTest[BX + _Base] JZ SHORT NoPix MOV BL,AL ; Playfield is displayed AND AL,0FCh AND BL,3 JZ SHORT Outside1 CMP BL,1 JZ SHORT Lt1 CMP BL,2 JZ SHORT Lt2 JMP SHORT Lt3 NoPix: MOV BL,AL ; Background is displayed AND AL,0FCh AND BL,3 JZ SHORT L2A CMP BL,1 JZ SHORT Lt1No CMP BL,2 JZ Lt2No JMP Lt3No Outside: MOV BL,AL ADD AL,4 TEST ESI,DWORD PTR BitTest[BX + _Base + 4] JZ SHORT L2A Outside1: TEST AH,0FCh JZ SHORT Lt0 MOV DWORD PTR ES:[DI],EDX ADD DI,4 SUB AH,4 JNZ SHORT Outside JZ SHORT Leaving Lt0: MOV BYTE PTR ES:[DI],DL INC DI ; Write pixel and move on DEC AH JZ SHORT Leaving Lt1: MOV BYTE PTR ES:[DI],DL INC DI ; Write pixel and move on DEC AH JZ SHORT Leaving Lt2: MOV BYTE PTR ES:[DI],DL INC DI ; Write pixel and move on DEC AH JZ SHORT Leaving Lt3: MOV BYTE PTR ES:[DI],DL INC DI ; Write pixel and move on DEC AH JNZ SHORT Outside ; OR BP,1 ; JMP @Exiting JMP Leaving L2A: TEST AH,0FCh JZ SHORT Lt0No MOV DWORD PTR ES:[DI],ECX ADD DI,4 SUB AH,4 JNZ SHORT Outside JZ SHORT Leaving Lt0No: MOV BYTE PTR ES:[DI],CL INC DI ; Write pixel and move on DEC AH JZ SHORT Leaving Lt1No: MOV BYTE PTR ES:[DI],CL INC DI ; Write pixel and move on DEC AH JZ SHORT Leaving Lt2No: MOV BYTE PTR ES:[DI],CL INC DI ; Write pixel and move on DEC AH JZ SHORT Leaving Lt3No: MOV BYTE PTR ES:[DI],CL INC DI ; Write pixel and move on DEC AH JNZ Outside Leaving: OR BP,1 endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only ; ------------------------------------------------------------------------- _DispNothingX macro local Top,L1,L2,Top1,TopA MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] CMP AL,80 JAE SHORT Top1 MOV EDX,DWORD PTR CLW[_Base] Top: MOV BL,AL AND BX,01FCh TEST ECX,DWORD PTR BitTest[BX + _Base] JZ SHORT L2 CMP AL,80 JAE SHORT L1 MOV WORD PTR ES:[DI],DX ADD DI,2 ; Write pixel and move on INC AL ; Next pixel CMP AL,AH JB SHORT Top OR BP,1 JMP @Exiting L1: MOV EDX,DWORD PTR CRW[_Base] MOV WORD PTR ES:[DI],DX ADD DI,2 ; Write pixel and move on INC AL ; Next pixel CMP AL,AH JB SHORT TopA OR BP,1 JMP @Exiting L2: MOV WORD PTR ES:[DI],SI ADD DI,2 ; Write pixel and move on INC AL ; Next pixel CMP AL,AH JB SHORT Top OR BP,1 JMP @Exiting ; Draws right side of screen: pixel 80 and up Top1: MOV EDX,DWORD PTR CRW[_Base] TopA: _DispNothingLoop endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only for 160x200 mode ; ------------------------------------------------------------------------- _DispNothing macro local Top1,L1 MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] CMP AL,80 JAE Top1 MOV EDX,DWORD PTR CLW[_Base] PUSH AX CMP AH,80 JLE L1 MOV AH,80 L1: _DispNothingLoop POP AX CMP AH,80 JLE @Exiting MOV AL,80 Top1: MOV EDX,DWORD PTR CRW[_Base] _DispNothingLoop endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only for 160x200 mode ; ------------------------------------------------------------------------- _DispNothing160X macro local Top,L1,L2,Top1,TopA MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] XCHG ESI,ECX CMP AL,80 JAE SHORT Top1 MOV EDX,DWORD PTR CLW[_Base] Top: MOV BL,AL AND BX,01FCh TEST ESI,DWORD PTR BitTest[BX + _Base] JZ SHORT L2 CMP AL,80 JAE SHORT L1 MOV BYTE PTR ES:[DI],DL INC DI ; Write pixel and move on INC AL ; Next pixel CMP AL,AH JB SHORT Top OR BP,1 JMP @Exiting L1: MOV EDX,DWORD PTR CRW[_Base] MOV BYTE PTR ES:[DI],DL INC DI ; Write pixel and move on INC AL ; Next pixel CMP AL,AH JB SHORT TopA OR BP,1 JMP @Exiting L2: MOV BYTE PTR ES:[DI],CL INC DI ; Write pixel and move on INC AL ; Next pixel CMP AL,AH JB SHORT Top OR BP,1 JMP @Exiting ; Draws right side of screen: pixel 80 and up Top1: MOV EDX,DWORD PTR CRW[_Base] TopA: _DispNothingLoop160 endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only for 160x200 mode ; ------------------------------------------------------------------------- _DispNothing160 macro local Top1,L1 MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] XCHG ESI,ECX CMP AL,80 JAE Top1 MOV EDX,DWORD PTR CLW[_Base] PUSH AX CMP AH,80 JLE L1 MOV AH,80 L1: _DispNothingLoop160 POP AX CMP AH,80 JLE @Exiting MOV AL,80 Top1: MOV EDX,DWORD PTR CRW[_Base] _DispNothingLoop160 endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only (left side) ; ------------------------------------------------------------------------- _DispLeftNothing macro MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] MOV EDX,DWORD PTR CLW[_Base] _DispNothingLoop endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only (left side) for 160x200 mode ; ------------------------------------------------------------------------- _DispLeftNothing160 macro MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] XCHG ESI,ECX MOV EDX,DWORD PTR CLW[_Base] _DispNothingLoop160 endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only (right side) ; ------------------------------------------------------------------------- _DispRightNothing macro MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] MOV EDX,DWORD PTR CRW[_Base] _DispNothingLoop endm ; ------------------------------------------------------------------------- ; Display loop -- special case; playfield only (right side) for 160x200 mode ; ------------------------------------------------------------------------- _DispRightNothing160 macro MOV BH,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV AH,BYTE PTR Limit[_Base] MOV SI,WORD PTR ColorLum[6 + _Base] BSWAP ESI MOV SI,WORD PTR ColorLum[6 + _Base] XCHG ECX,ESI MOV EDX,DWORD PTR CRW[_Base] _DispNothingLoop160 endm ; ------------------------------------------------------------------------- align 16 Handle_TIA proc far TEST BYTE PTR TIA_Regs[VBLANK + _Base],2 JZ SHORT @TestOk1 MOV AX,WORD PTR TIA_Scan[_Base] CMP AX,WORD PTR NewScan[_Base] JGE SHORT @ExitP1 JMP SHORT @TestOk1 @ExitP1: MOV AX,WORD PTR LastScan[_Base] MOV WORD PTR NewScan[_Base],AX JMP @ExitP @TestOk1: MOV AX,WORD PTR TIA_Count[_Base] CMP AX,WORD PTR Old_TIA_Count[_Base] JG SHORT @TestOk2 ; MOV AX,WORD PTR Old_TIA_Count[_Base] ; MOV WORD PTR TIA_Count[_Base],AX JMP @ExitP @TestOk2: OR AX,AX JNS SHORT @TestOk3 JMP @ExitP @TestOk3: CMP BYTE PTR TIA_Scan[_Base],200 JAE @ExitP ; We're going to use BP as a general-purpose register; there MUST NOT ; be any local variables!!! PUSH BP ; Set up collision total SUB BP,BP ; Fill the jump table if it hasn't been filled yet TEST BYTE PTR Handle_TIA_Jump_Set[_Base],0FFh JNZ @JumpTableSet IF LOWRES EQ 0 MOV WORD PTR Handle_TIA_Jump[_Base + 00h * 2],OFFSET DoNothing MOV WORD PTR Handle_TIA_Jump[_Base + 01h * 2],OFFSET DoBL MOV WORD PTR Handle_TIA_Jump[_Base + 02h * 2],OFFSET DoM1 MOV WORD PTR Handle_TIA_Jump[_Base + 03h * 2],OFFSET DoM1BL MOV WORD PTR Handle_TIA_Jump[_Base + 04h * 2],OFFSET DoP1 MOV WORD PTR Handle_TIA_Jump[_Base + 05h * 2],OFFSET DoP1BL MOV WORD PTR Handle_TIA_Jump[_Base + 06h * 2],OFFSET DoM1P1 MOV WORD PTR Handle_TIA_Jump[_Base + 07h * 2],OFFSET DoM1P1BL MOV WORD PTR Handle_TIA_Jump[_Base + 08h * 2],OFFSET DoM0 MOV WORD PTR Handle_TIA_Jump[_Base + 09h * 2],OFFSET DoM0BL MOV WORD PTR Handle_TIA_Jump[_Base + 0Ah * 2],OFFSET DoM0M1 MOV WORD PTR Handle_TIA_Jump[_Base + 0Bh * 2],OFFSET DoM0M1BL MOV WORD PTR Handle_TIA_Jump[_Base + 0Ch * 2],OFFSET DoM0P1 MOV WORD PTR Handle_TIA_Jump[_Base + 0Dh * 2],OFFSET DoM0P1BL MOV WORD PTR Handle_TIA_Jump[_Base + 0Eh * 2],OFFSET DoM0P1M1 MOV WORD PTR Handle_TIA_Jump[_Base + 0Fh * 2],OFFSET DoM0P1M1BL MOV WORD PTR Handle_TIA_Jump[_Base + 10h * 2],OFFSET DoP0 MOV WORD PTR Handle_TIA_Jump[_Base + 11h * 2],OFFSET DoP0BL MOV WORD PTR Handle_TIA_Jump[_Base + 12h * 2],OFFSET DoP0M1 MOV WORD PTR Handle_TIA_Jump[_Base + 13h * 2],OFFSET DoP0M1BL MOV WORD PTR Handle_TIA_Jump[_Base + 14h * 2],OFFSET DoP0P1 MOV WORD PTR Handle_TIA_Jump[_Base + 15h * 2],OFFSET DoP0P1BL MOV WORD PTR Handle_TIA_Jump[_Base + 16h * 2],OFFSET DoP0P1M1 MOV WORD PTR Handle_TIA_Jump[_Base + 17h * 2],OFFSET DoP0P1M1BL MOV WORD PTR Handle_TIA_Jump[_Base + 18h * 2],OFFSET DoP0M0 MOV WORD PTR Handle_TIA_Jump[_Base + 19h * 2],OFFSET DoP0M0BL MOV WORD PTR Handle_TIA_Jump[_Base + 1Ah * 2],OFFSET DoP0M0M1 MOV WORD PTR Handle_TIA_Jump[_Base + 1Bh * 2],OFFSET DoP0M0M1BL MOV WORD PTR Handle_TIA_Jump[_Base + 1Ch * 2],OFFSET DoP0M0P1 MOV WORD PTR Handle_TIA_Jump[_Base + 1Dh * 2],OFFSET DoP0M0P1BL MOV WORD PTR Handle_TIA_Jump[_Base + 1Eh * 2],OFFSET DoP0M0P1M1 MOV WORD PTR Handle_TIA_Jump[_Base + 1Fh * 2],OFFSET DoP0M0P1M1BL ELSE MOV WORD PTR Handle_TIA_Jump[_Base + 00h * 2],OFFSET DoNothing160 MOV WORD PTR Handle_TIA_Jump[_Base + 01h * 2],OFFSET DoBL160 MOV WORD PTR Handle_TIA_Jump[_Base + 02h * 2],OFFSET DoM1160 MOV WORD PTR Handle_TIA_Jump[_Base + 03h * 2],OFFSET DoM1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 04h * 2],OFFSET DoP1160 MOV WORD PTR Handle_TIA_Jump[_Base + 05h * 2],OFFSET DoP1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 06h * 2],OFFSET DoM1P1160 MOV WORD PTR Handle_TIA_Jump[_Base + 07h * 2],OFFSET DoM1P1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 08h * 2],OFFSET DoM0160 MOV WORD PTR Handle_TIA_Jump[_Base + 09h * 2],OFFSET DoM0BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 0Ah * 2],OFFSET DoM0M1160 MOV WORD PTR Handle_TIA_Jump[_Base + 0Bh * 2],OFFSET DoM0M1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 0Ch * 2],OFFSET DoM0P1160 MOV WORD PTR Handle_TIA_Jump[_Base + 0Dh * 2],OFFSET DoM0P1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 0Eh * 2],OFFSET DoM0P1M1160 MOV WORD PTR Handle_TIA_Jump[_Base + 0Fh * 2],OFFSET DoM0P1M1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 10h * 2],OFFSET DoP0160 MOV WORD PTR Handle_TIA_Jump[_Base + 11h * 2],OFFSET DoP0BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 12h * 2],OFFSET DoP0M1160 MOV WORD PTR Handle_TIA_Jump[_Base + 13h * 2],OFFSET DoP0M1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 14h * 2],OFFSET DoP0P1160 MOV WORD PTR Handle_TIA_Jump[_Base + 15h * 2],OFFSET DoP0P1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 16h * 2],OFFSET DoP0P1M1160 MOV WORD PTR Handle_TIA_Jump[_Base + 17h * 2],OFFSET DoP0P1M1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 18h * 2],OFFSET DoP0M0160 MOV WORD PTR Handle_TIA_Jump[_Base + 19h * 2],OFFSET DoP0M0BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 1Ah * 2],OFFSET DoP0M0M1160 MOV WORD PTR Handle_TIA_Jump[_Base + 1Bh * 2],OFFSET DoP0M0M1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 1Ch * 2],OFFSET DoP0M0P1160 MOV WORD PTR Handle_TIA_Jump[_Base + 1Dh * 2],OFFSET DoP0M0P1BL160 MOV WORD PTR Handle_TIA_Jump[_Base + 1Eh * 2],OFFSET DoP0M0P1M1160 MOV WORD PTR Handle_TIA_Jump[_Base + 1Fh * 2],OFFSET DoP0M0P1M1BL160 ENDIF MOV BYTE PTR Handle_TIA_Jump_Set[_Base],1 @JumpTableSet: ; Check CTRLPF write delay MOV AL,BYTE PTR CTRLPFLatch[_Base] CMP AL,BYTE PTR TIA_Regs[CTRLPF + _Base] JE @NoCopy MOV AX,WORD PTR TIA_Scan[_Base] CMP AX,WORD PTR CTRLPFScan[_Base] JNE SHORT @NewCTRLPF MOV AX,WORD PTR TIA_Count[_Base] ; MOV BX,0 ; CMP AX,BX ; JL @ContCopy ; MOV BX,80 ; CMP AX,BX ; JL @ContCopy ; MOV BX,160 ;@ContCopy: MOV BX,WORD PTR CTRLPFCount[_Base] ADD BX,64 CMP AX,BX JLE @NoCopy @DoCopy: ; Break up into two runs; pre-change and post-change PUSH WORD PTR TIA_Count[_Base] MOV WORD PTR TIA_Count[_Base],BX CALL Handle_TIA POP WORD PTR TIA_Count[_Base] @NewCTRLPF: ; Copy CTRLPF from latch MOV SI,CTRLPF MOV AL,BYTE PTR CTRLPFLatch[_Base] MOV BYTE PTR [SI],AL MOV BYTE PTR TIA_Regs[CTRLPF + _Base],AL ; Recall collisions from previous run MOV AX,WORD PTR Input_Byte[6 + _Base] AND AX,0C080h MOV BP,AX SHR BP,2 MOV AX,WORD PTR Input_Byte[4 + _Base] AND AX,0C0C0h OR BP,AX SHR BP,2 MOV AX,WORD PTR Input_Byte[2 + _Base] AND AX,0C0C0h OR BP,AX SHR BP,2 MOV AX,WORD PTR Input_Byte[0 + _Base] AND AX,0C0C0h OR BP,AX ; Act on the new CTRLPF MOV AL,BYTE PTR TIA_Regs[CTRLPF + _Base] MOV SI,AX SHR SI,4 AND SI,3 MOV CL,BYTE PTR MissileSize[SI + _Base] SUB CH,CH MOV WORD PTR BallSize[_Base],CX MOV DX,CX DEC DX SHR DX,1 MOV WORD PTR BallAdjust[_Base],DX SUB CX,160 MOV WORD PTR BallSize160[_Base],CX MOV CX,WORD PTR ColorLum[0 + _Base] MOV DX,WORD PTR ColorLum[2 + _Base] MOV BX,WORD PTR ColorLum[4 + _Base] TEST AL,2 JZ SHORT @LCPF1 MOV WORD PTR CLW[_Base],CX MOV WORD PTR CLW[_Base + 2],CX MOV WORD PTR CRW[_Base],DX MOV WORD PTR CRW[_Base + 2],DX JMP SHORT @LCPF2 @LCPF1: MOV WORD PTR CLW[_Base],BX MOV WORD PTR CLW[_Base + 2],BX MOV WORD PTR CRW[_Base],BX MOV WORD PTR CRW[_Base + 2],BX @LCPF2: @NoCopy: ; Check for wraparound MOV CX,WORD PTR Old_TIA_Count[_Base] CMP CX,0 JGE SHORT @Positive SUB CX,CX @Positive: TEST BYTE PTR DoHMOVE[_Base],1 JZ SHORT @HMOVEOkA CMP CX,8 JAE SHORT @HMOVEOkA MOV CX,8 @HMOVEOkA: ; Player 0 MOV AX,WORD PTR ObjectLoc[Player0Set * 2 + _Base] MOV BX,AX ADD BX,WORD PTR Player0Size160[_Base] JLE SHORT @P0NotOk CMP BX,CX ; WORD PTR Old_TIA_Count[_Base] JL SHORT @P0NotOk SUB AX,160 @P0NotOk: MOV WORD PTR ObjectPix[Player0Set * 2 + _Base],AX ; Player 1 MOV AX,WORD PTR ObjectLoc[Player1Set * 2 + _Base] MOV BX,AX ADD BX,WORD PTR Player1Size160[_Base] JLE SHORT @P1NotOk CMP BX,CX ; WORD PTR Old_TIA_Count[_Base] JL SHORT @P1NotOk SUB AX,160 @P1NotOk: MOV WORD PTR ObjectPix[Player1Set * 2 + _Base],AX ; Missile 0 MOV AX,WORD PTR ObjectLoc[Missile0Set * 2 + _Base] MOV BX,AX ; ADD BX,WORD PTR Player0Size160[_Base] ADD BX,WORD PTR Missile0Size160[_Base] JLE SHORT @M0NotOk CMP BX,CX ; WORD PTR Old_TIA_Count[_Base] JL SHORT @M0NotOk SUB AX,160 @M0NotOk: MOV WORD PTR ObjectPix[Missile0Set * 2 + _Base],AX ; Missile 1 MOV AX,WORD PTR ObjectLoc[Missile1Set * 2 + _Base] MOV BX,AX ; ADD BX,WORD PTR Player1Size160[_Base] ADD BX,WORD PTR Missile1Size160[_Base] JLE SHORT @M1NotOk CMP BX,CX ; WORD PTR Old_TIA_Count[_Base] JL SHORT @M1NotOk SUB AX,160 @M1NotOk: MOV WORD PTR ObjectPix[Missile1Set * 2 + _Base],AX ; Set up playfield data SUB BH,BH MOV BL,BYTE PTR TIA_Regs[PF0 + _Base] MOV CH,BYTE PTR BitSwap[BX + _Base] BSWAP ECX MOV CH,BYTE PTR TIA_Regs[PF1 + _Base] MOV BL,BYTE PTR TIA_Regs[PF2 + _Base] MOV CL,BYTE PTR BitSwap[BX + _Base] ; Set up pointer to screen MOV AX,0A000h MOV ES,AX MOV DI,WORD PTR Addr[_Base] ; Set starting position MOV AX,WORD PTR Old_TIA_Count[_Base] OR AX,AX JNS SHORT @StartOk SUB AX,AX @StartOk: ; Loop across screen from Old_TIA_Count to TIA_Count - 1 or 159 MOV AH,BYTE PTR TIA_Count[_Base] CMP AH,160 JBE SHORT @AHOk MOV AH,160 @AHOk: ; Check for 160x200 mode ; TEST BYTE PTR Config[31 + _Base],0FFh ; JZ SHORT @No160x200A IF LOWRES EQ 1 SHR DI,1 ENDIF ;@No160x200A: ; See if the first 8 pixels need to be blanked out TEST BYTE PTR DoHMOVE[_Base],1 JZ SHORT @HMOVEOk CMP AL,8 JAE SHORT @HMOVEOk SUB EBX,EBX MOV SI,WORD PTR LineStart[_Base] MOV DWORD PTR ES:[SI],EBX MOV DWORD PTR ES:[SI + 4],EBX ; TEST BYTE PTR Config[31 + _Base],0FFh ; JNZ SHORT @No160x200B IF LOWRES EQ 0 MOV DWORD PTR ES:[SI + 8],EBX MOV DWORD PTR ES:[SI + 12],EBX ENDIF ;@No160x200B: MOV BL,AH CMP BL,8 JBE SHORT @No MOV BL,8 @No: SUB BL,AL ADD AL,BL ; TEST BYTE PTR Config[31 + _Base],0FFh ; JNZ @No160x200C IF LOWRES EQ 0 ADD BX,BX ENDIF ;@No160x200C: ADD DI,BX @HMOVEOk: CMP AH,AL JNE SHORT @NotSame ; TEST BYTE PTR Config[31 + _Base],0FFh ; JZ @Exiting ; JMP @Exiting160 JMP @Exiting @NotSame: TEST BYTE PTR TIA_Regs[VBLANK + _Base],2 JZ SHORT @NotBlank TEST BYTE PTR TopVBLANK[_Base],0FFh JNZ SHORT @ContinueBlank ; TEST BYTE PTR Config[31 + _Base],0FFh ; JZ @Exiting ; JMP @Exiting160 JMP @Exiting ; JZ SHORT @DoneFour @ContinueBlank: CLD MOV CL,AH SUB CL,AL SUB CH,CH SUB EAX,EAX ; TEST BYTE PTR Config[31 + _Base],0FFh ; JZ SHORT @No160x200D IF LOWRES EQ 1 TEST CX,3 JZ SHORT @DoFourA MOV BX,CX AND CX,3 REP STOSB MOV CX,BX @DoFourA: SHR CX,2 OR CX,CX JZ SHORT @DoneFourA REP STOSD @DoneFourA: ; JMP @Exiting160 ELSE ;@No160x200D: TEST CX,3 JZ SHORT @DoFour MOV BX,CX AND CX,3 REP STOSW MOV CX,BX @DoFour: SHR CX,1 AND CX,0FFFEh OR CX,CX JZ SHORT @DoneFour REP STOSD @DoneFour: ENDIF JMP @Exiting ; Vertical blanking is off @NotBlank: MOV BYTE PTR Limit[_Base],AH SUB AH,AH MOV DH,0FFh ; Jump via the jump table MOV BL,BYTE PTR DispJump[_Base] SUB BH,BH ; TEST BYTE PTR Config[31 + _Base],0FFh ; JZ @No160x200E ;IF LOWRES EQ 1 ; ADD BX,64 ;ENDIF ;@No160x200E: JMP WORD PTR Handle_TIA_Jump[BX + _Base] IF LOWRES EQ 0 DoBL: ; ------------------------------------------------------------------------- ; Displaying BL ; ------------------------------------------------------------------------- _Disp 0 0 0 0 1 JMP @Exiting DoM1BL: ; ------------------------------------------------------------------------- ; Displaying M1 and BL ; ------------------------------------------------------------------------- _Disp 0 0 0 1 1 JMP @Exiting DoM0BL: ; ------------------------------------------------------------------------- ; Displaying M0 and BL ; ------------------------------------------------------------------------- _Disp 0 1 0 0 1 JMP @Exiting DoM0M1BL: ; ------------------------------------------------------------------------- ; Displaying M0,M1, and BL ; ------------------------------------------------------------------------- _Disp 0 1 0 1 1 JMP @Exiting DoP1BL: ; ------------------------------------------------------------------------- ; Displaying P1 and BL ; ------------------------------------------------------------------------- _Disp 0 0 1 0 1 JMP @Exiting DoM1P1BL: ; ------------------------------------------------------------------------- ; Displaying P1,M1, and BL ; ------------------------------------------------------------------------- _Disp 0 0 1 1 1 JMP @Exiting DoM0P1BL: ; ------------------------------------------------------------------------- ; Displaying M0,P1, and BL ; ------------------------------------------------------------------------- _Disp 0 1 1 0 1 JMP @Exiting DoM0P1M1BL: ; ------------------------------------------------------------------------- ; Displaying M0,P1,M1, and BL ; ------------------------------------------------------------------------- _Disp 0 1 1 1 1 JMP @Exiting DoP0BL: ; ------------------------------------------------------------------------- ; Displaying P0 and BL ; ------------------------------------------------------------------------- _Disp 1 0 0 0 1 JMP @Exiting DoP0M1BL: ; ------------------------------------------------------------------------- ; Displaying P0,M1, and BL ; ------------------------------------------------------------------------- _Disp 1 0 0 1 1 JMP @Exiting DoP0M0BL: ; ------------------------------------------------------------------------- ; Displaying P0,M0, and BL ; ------------------------------------------------------------------------- _Disp 1 1 0 0 1 JMP @Exiting DoP0M0M1BL: ; ------------------------------------------------------------------------- ; Displaying P0,M0,M1, and BL ; ------------------------------------------------------------------------- _Disp 1 1 0 1 1 JMP @Exiting DoP0P1BL: ; ------------------------------------------------------------------------- ; Displaying P0,P1, and BL ; ------------------------------------------------------------------------- _Disp 1 0 1 0 1 JMP @Exiting DoP0P1M1BL: ; ------------------------------------------------------------------------- ; Displaying P0,P1,M1, and BL ; ------------------------------------------------------------------------- _Disp 1 0 1 1 1 JMP @Exiting DoP0M0P1BL: ; ------------------------------------------------------------------------- ; Displaying P0,M0,P1, and BL ; ------------------------------------------------------------------------- _Disp 1 1 1 0 1 JMP @Exiting DoP0M0P1M1BL: ; ------------------------------------------------------------------------- ; Displaying P0,M0,P1,M1, and BL ; ------------------------------------------------------------------------- _Disp <0FFFFh> 1 1 1 1 1 JMP @Exiting DoNothing: ; ------------------------------------------------------------------------- ; Displaying nothing (playfield only) ; ------------------------------------------------------------------------- CMP BYTE PTR Limit[_Base],80 JAE @MaybeRight _DispLeftNothing JMP @Exiting @MaybeRight: CMP AL,80 JAE @OnlyRight _DispNothing JMP @Exiting @OnlyRight: _DispRightNothing JMP @Exiting ; _Disp 0 0 0 0 0 ; JMP @Exiting DoM1: ; ------------------------------------------------------------------------- ; Displaying M1 ; ------------------------------------------------------------------------- _Disp 0 0 0 1 0 JMP @Exiting DoM0: ; ------------------------------------------------------------------------- ; Displaying M0 ; ------------------------------------------------------------------------- _Disp 0 1 0 0 0 JMP @Exiting DoM0M1: ; ------------------------------------------------------------------------- ; Displaying M0 and M1 ; ------------------------------------------------------------------------- _Disp 0 1 0 1 0 JMP @Exiting DoP1: ; ------------------------------------------------------------------------- ; Displaying P1 ; ------------------------------------------------------------------------- _Disp 0 0 1 0 0 JMP @Exiting DoM1P1: ; ------------------------------------------------------------------------- ; Displaying P1 and M1 ; ------------------------------------------------------------------------- _Disp 0 0 1 1 0 JMP @Exiting DoM0P1: ; ------------------------------------------------------------------------- ; Displaying M0 and P1 ; ------------------------------------------------------------------------- _Disp 0 1 1 0 0 JMP @Exiting DoM0P1M1: ; ------------------------------------------------------------------------- ; Displaying M0,P1, and M1 ; ------------------------------------------------------------------------- _Disp 0 1 1 1 0 JMP @Exiting DoP0: ; ------------------------------------------------------------------------- ; Displaying P0 ; ------------------------------------------------------------------------- _Disp 1 0 0 0 0 JMP @Exiting DoP0M1: ; ------------------------------------------------------------------------- ; Displaying P0 and M1 ; ------------------------------------------------------------------------- _Disp 1 0 0 1 0 JMP @Exiting DoP0M0: ; ------------------------------------------------------------------------- ; Displaying P0 and M0 ; ------------------------------------------------------------------------- _Disp 1 1 0 0 0 JMP @Exiting DoP0M0M1: ; ------------------------------------------------------------------------- ; Displaying P0,M0, and M1 ; ------------------------------------------------------------------------- _Disp 1 1 0 1 0 JMP @Exiting DoP0P1: ; ------------------------------------------------------------------------- ; Displaying P0 and P1 ; ------------------------------------------------------------------------- _Disp 1 0 1 0 0 JMP @Exiting DoP0P1M1: ; ------------------------------------------------------------------------- ; Displaying P0,P1, and M1 ; ------------------------------------------------------------------------- _Disp 1 0 1 1 0 JMP @Exiting DoP0M0P1: ; ------------------------------------------------------------------------- ; Displaying P0,M0, and P1 ; ------------------------------------------------------------------------- _Disp 1 1 1 0 0 JMP @Exiting DoP0M0P1M1: ; ------------------------------------------------------------------------- ; Displaying P0,M0,P1, and M1 ; ------------------------------------------------------------------------- _Disp 1 1 1 1 0 ; JMP @Exiting ELSE ; ------------------------------------------------------------------------- ; This code is used exclusively for 160x200x256 mode ; ------------------------------------------------------------------------- DoBL160: ; ------------------------------------------------------------------------- ; Displaying BL ; ------------------------------------------------------------------------- _Disp160 0 0 0 0 1 JMP @Exiting DoM1BL160: ; ------------------------------------------------------------------------- ; Displaying M1 and BL ; ------------------------------------------------------------------------- _Disp160 0 0 0 1 1 JMP @Exiting DoM0BL160: ; ------------------------------------------------------------------------- ; Displaying M0 and BL ; ------------------------------------------------------------------------- _Disp160 0 1 0 0 1 JMP @Exiting DoM0M1BL160: ; ------------------------------------------------------------------------- ; Displaying M0,M1, and BL ; ------------------------------------------------------------------------- _Disp160 0 1 0 1 1 JMP @Exiting DoP1BL160: ; ------------------------------------------------------------------------- ; Displaying P1 and BL ; ------------------------------------------------------------------------- _Disp160 0 0 1 0 1 JMP @Exiting DoM1P1BL160: ; ------------------------------------------------------------------------- ; Displaying P1,M1, and BL ; ------------------------------------------------------------------------- _Disp160 0 0 1 1 1 JMP @Exiting DoM0P1BL160: ; ------------------------------------------------------------------------- ; Displaying M0,P1, and BL ; ------------------------------------------------------------------------- _Disp160 0 1 1 0 1 JMP @Exiting DoM0P1M1BL160: ; ------------------------------------------------------------------------- ; Displaying M0,P1,M1, and BL ; ------------------------------------------------------------------------- _Disp160 0 1 1 1 1 JMP @Exiting DoP0BL160: ; ------------------------------------------------------------------------- ; Displaying P0 and BL ; ------------------------------------------------------------------------- _Disp160 1 0 0 0 1 JMP @Exiting DoP0M1BL160: ; ------------------------------------------------------------------------- ; Displaying P0,M1, and BL ; ------------------------------------------------------------------------- _Disp160 1 0 0 1 1 JMP @Exiting DoP0M0BL160: ; ------------------------------------------------------------------------- ; Displaying P0,M0, and BL ; ------------------------------------------------------------------------- _Disp160 1 1 0 0 1 JMP @Exiting DoP0M0M1BL160: ; ------------------------------------------------------------------------- ; Displaying P0,M0,M1, and BL ; ------------------------------------------------------------------------- _Disp160 1 1 0 1 1 JMP @Exiting DoP0P1BL160: ; ------------------------------------------------------------------------- ; Displaying P0,P1, and BL ; ------------------------------------------------------------------------- _Disp160 1 0 1 0 1 JMP @Exiting DoP0P1M1BL160: ; ------------------------------------------------------------------------- ; Displaying P0,P1,M1, and BL ; ------------------------------------------------------------------------- _Disp160 1 0 1 1 1 JMP @Exiting DoP0M0P1BL160: ; ------------------------------------------------------------------------- ; Displaying P0,M0,P1, and BL ; ------------------------------------------------------------------------- _Disp160 1 1 1 0 1 JMP @Exiting DoP0M0P1M1BL160: ; ------------------------------------------------------------------------- ; Displaying P0,M0,P1,M1, and BL ; ------------------------------------------------------------------------- _Disp160 <0FFFFh> 1 1 1 1 1 JMP @Exiting DoNothing160: ; ------------------------------------------------------------------------- ; Displaying nothing (playfield only) ; ------------------------------------------------------------------------- CMP BYTE PTR Limit[_Base],80 JAE @MaybeRight160 _DispLeftNothing160 JMP @Exiting @MaybeRight160: CMP AL,80 JAE @OnlyRight160 _DispNothing160 JMP @Exiting @OnlyRight160: _DispRightNothing160 JMP @Exiting ; _Disp160 0 0 0 0 0 ; JMP @Exiting DoM1160: ; ------------------------------------------------------------------------- ; Displaying M1 ; ------------------------------------------------------------------------- _Disp160 0 0 0 1 0 JMP @Exiting DoM0160: ; ------------------------------------------------------------------------- ; Displaying M0 ; ------------------------------------------------------------------------- _Disp160 0 1 0 0 0 JMP @Exiting DoM0M1160: ; ------------------------------------------------------------------------- ; Displaying M0 and M1 ; ------------------------------------------------------------------------- _Disp160 0 1 0 1 0 JMP @Exiting DoP1160: ; ------------------------------------------------------------------------- ; Displaying P1 ; ------------------------------------------------------------------------- _Disp160 0 0 1 0 0 JMP @Exiting DoM1P1160: ; ------------------------------------------------------------------------- ; Displaying P1 and M1 ; ------------------------------------------------------------------------- _Disp160 0 0 1 1 0 JMP @Exiting DoM0P1160: ; ------------------------------------------------------------------------- ; Displaying M0 and P1 ; ------------------------------------------------------------------------- _Disp160 0 1 1 0 0 JMP @Exiting DoM0P1M1160: ; ------------------------------------------------------------------------- ; Displaying M0,P1, and M1 ; ------------------------------------------------------------------------- _Disp160 0 1 1 1 0 JMP @Exiting DoP0160: ; ------------------------------------------------------------------------- ; Displaying P0 ; ------------------------------------------------------------------------- _Disp160 1 0 0 0 0 JMP @Exiting DoP0M1160: ; ------------------------------------------------------------------------- ; Displaying P0 and M1 ; ------------------------------------------------------------------------- _Disp160 1 0 0 1 0 JMP @Exiting DoP0M0160: ; ------------------------------------------------------------------------- ; Displaying P0 and M0 ; ------------------------------------------------------------------------- _Disp160 1 1 0 0 0 JMP @Exiting DoP0M0M1160: ; ------------------------------------------------------------------------- ; Displaying P0,M0, and M1 ; ------------------------------------------------------------------------- _Disp160 1 1 0 1 0 JMP @Exiting DoP0P1160: ; ------------------------------------------------------------------------- ; Displaying P0 and P1 ; ------------------------------------------------------------------------- _Disp160 1 0 1 0 0 JMP @Exiting DoP0P1M1160: ; ------------------------------------------------------------------------- ; Displaying P0,P1, and M1 ; ------------------------------------------------------------------------- _Disp160 1 0 1 1 0 JMP @Exiting DoP0M0P1160: ; ------------------------------------------------------------------------- ; Displaying P0,M0, and P1 ; ------------------------------------------------------------------------- _Disp160 1 1 1 0 0 JMP @Exiting DoP0M0P1M1160: ; ------------------------------------------------------------------------- ; Displaying P0,M0,P1, and M1 ; ------------------------------------------------------------------------- _Disp160 1 1 1 1 0 ; JMP @Exiting ; ------------------------------------------------------------------------- ENDIF ;@Exiting160: ; ADD DI,DI @Exiting: IF LOWRES EQ 1 ADD DI,DI ENDIF ; Unpack collisions and add to the existing ones OR WORD PTR Input_Byte[0 + _Base],BP SHL BP,2 OR WORD PTR Input_Byte[2 + _Base],BP SHL BP,2 OR WORD PTR Input_Byte[4 + _Base],BP SHL BP,2 OR WORD PTR Input_Byte[6 + _Base],BP AND WORD PTR Input_Byte[0 + _Base],0C0C0h AND WORD PTR Input_Byte[2 + _Base],0C0C0h AND WORD PTR Input_Byte[4 + _Base],0C0C0h AND WORD PTR Input_Byte[6 + _Base],0C080h OR WORD PTR Input_Byte[0 + _Base],00101h OR WORD PTR Input_Byte[2 + _Base],00101h OR WORD PTR Input_Byte[4 + _Base],00101h OR WORD PTR Input_Byte[6 + _Base],00101h ; Cleanup MOV WORD PTR Addr[_Base],DI MOV AX,WORD PTR TIA_Count[_Base] MOV WORD PTR Old_TIA_Count[_Base],AX ; Restore BP POP BP @ExitP: RET Handle_TIA endp code ends end