; 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 <P0CBase and P1CBase and M0CBase and M1CBase> 0 0 0 0 1
        JMP   @Exiting

DoM1BL:

; -------------------------------------------------------------------------
; Displaying M1 and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase and P1CBase and M0CBase> 0 0 0 1 1
        JMP   @Exiting

DoM0BL:

; -------------------------------------------------------------------------
; Displaying M0 and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase and P1CBase and M1CBase> 0 1 0 0 1
        JMP   @Exiting

DoM0M1BL:

; -------------------------------------------------------------------------
; Displaying M0,M1, and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase and P1CBase> 0 1 0 1 1
        JMP   @Exiting

DoP1BL:

; -------------------------------------------------------------------------
; Displaying P1 and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase and M0CBase and M1CBase> 0 0 1 0 1
        JMP   @Exiting

DoM1P1BL:

; -------------------------------------------------------------------------
; Displaying P1,M1, and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase and M0CBase> 0 0 1 1 1
        JMP   @Exiting

DoM0P1BL:

; -------------------------------------------------------------------------
; Displaying M0,P1, and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase and M1CBase> 0 1 1 0 1
        JMP   @Exiting

DoM0P1M1BL:

; -------------------------------------------------------------------------
; Displaying M0,P1,M1, and BL
; -------------------------------------------------------------------------

        _Disp <P0CBase> 0 1 1 1 1
        JMP   @Exiting

DoP0BL:

; -------------------------------------------------------------------------
; Displaying P0 and BL
; -------------------------------------------------------------------------

        _Disp <P1CBase and M0CBase and M1CBase> 1 0 0 0 1
        JMP   @Exiting

DoP0M1BL:

; -------------------------------------------------------------------------
; Displaying P0,M1, and BL
; -------------------------------------------------------------------------

        _Disp <P1CBase and M0CBase> 1 0 0 1 1
        JMP   @Exiting

DoP0M0BL:

; -------------------------------------------------------------------------
; Displaying P0,M0, and BL
; -------------------------------------------------------------------------

        _Disp <P1CBase and M1CBase> 1 1 0 0 1
        JMP   @Exiting

DoP0M0M1BL:

; -------------------------------------------------------------------------
; Displaying P0,M0,M1, and BL
; -------------------------------------------------------------------------

        _Disp <P1CBase> 1 1 0 1 1
        JMP   @Exiting

DoP0P1BL:

; -------------------------------------------------------------------------
; Displaying P0,P1, and BL
; -------------------------------------------------------------------------

        _Disp <M0CBase and M1CBase> 1 0 1 0 1
        JMP   @Exiting

DoP0P1M1BL:

; -------------------------------------------------------------------------
; Displaying P0,P1,M1, and BL
; -------------------------------------------------------------------------

        _Disp <M0CBase> 1 0 1 1 1
        JMP   @Exiting

DoP0M0P1BL:

; -------------------------------------------------------------------------
; Displaying P0,M0,P1, and BL
; -------------------------------------------------------------------------

        _Disp <M1CBase> 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 <P0CBase and P1CBase and M0CBase and m1CBase and BLCBase> 0 0 0 0 0
;        JMP   @Exiting

DoM1:

; -------------------------------------------------------------------------
; Displaying M1
; -------------------------------------------------------------------------

        _Disp <P0CBase and P1CBase and M0CBase and BLCBase> 0 0 0 1 0
        JMP   @Exiting

DoM0:

; -------------------------------------------------------------------------
; Displaying M0
; -------------------------------------------------------------------------

        _Disp <P0CBase and P1CBase and M1CBase and BLCBase> 0 1 0 0 0
        JMP   @Exiting

DoM0M1:

; -------------------------------------------------------------------------
; Displaying M0 and M1
; -------------------------------------------------------------------------

        _Disp <P0CBase and P1CBase and BLCBase> 0 1 0 1 0
        JMP   @Exiting

DoP1:

; -------------------------------------------------------------------------
; Displaying P1
; -------------------------------------------------------------------------

        _Disp <P0CBase and M0CBase and M1CBase and BLCBase> 0 0 1 0 0
        JMP   @Exiting

DoM1P1:

; -------------------------------------------------------------------------
; Displaying P1 and M1
; -------------------------------------------------------------------------

        _Disp <P0CBase and M0CBase and BLCBase> 0 0 1 1 0
        JMP   @Exiting

DoM0P1:

; -------------------------------------------------------------------------
; Displaying M0 and P1
; -------------------------------------------------------------------------

        _Disp <P0CBase and M1CBase and BLCBase> 0 1 1 0 0
        JMP   @Exiting

DoM0P1M1:

; -------------------------------------------------------------------------
; Displaying M0,P1, and M1
; -------------------------------------------------------------------------

        _Disp <P0CBase and BLCBase> 0 1 1 1 0
        JMP   @Exiting

DoP0:

; -------------------------------------------------------------------------
; Displaying P0
; -------------------------------------------------------------------------

        _Disp <P1CBase and M0CBase and M1CBase and BLCBase> 1 0 0 0 0
        JMP   @Exiting

DoP0M1:

; -------------------------------------------------------------------------
; Displaying P0 and M1
; -------------------------------------------------------------------------

        _Disp <P1CBase and M0CBase and BLCBase> 1 0 0 1 0
        JMP   @Exiting

DoP0M0:

; -------------------------------------------------------------------------
; Displaying P0 and M0
; -------------------------------------------------------------------------

        _Disp <P1CBase and M1CBase and BLCBase> 1 1 0 0 0
        JMP   @Exiting

DoP0M0M1:

; -------------------------------------------------------------------------
; Displaying P0,M0, and M1
; -------------------------------------------------------------------------

        _Disp <P1CBase and BLCBase> 1 1 0 1 0
        JMP   @Exiting

DoP0P1:

; -------------------------------------------------------------------------
; Displaying P0 and P1
; -------------------------------------------------------------------------

        _Disp <M0CBase and M1CBase and BLCBase> 1 0 1 0 0
        JMP   @Exiting

DoP0P1M1:

; -------------------------------------------------------------------------
; Displaying P0,P1, and M1
; -------------------------------------------------------------------------

        _Disp <M0CBase and BLCBase> 1 0 1 1 0
        JMP   @Exiting

DoP0M0P1:

; -------------------------------------------------------------------------
; Displaying P0,M0, and P1
; -------------------------------------------------------------------------

        _Disp <M1CBase and BLCBase> 1 1 1 0 0
        JMP   @Exiting

DoP0M0P1M1:

; -------------------------------------------------------------------------
; Displaying P0,M0,P1, and M1
; -------------------------------------------------------------------------

        _Disp <BLCBase> 1 1 1 1 0
;        JMP   @Exiting
ELSE
; -------------------------------------------------------------------------
; This code is used exclusively for 160x200x256 mode
; -------------------------------------------------------------------------

DoBL160:

; -------------------------------------------------------------------------
; Displaying BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase and M0CBase and M1CBase> 0 0 0 0 1
        JMP   @Exiting

DoM1BL160:

; -------------------------------------------------------------------------
; Displaying M1 and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase and M0CBase> 0 0 0 1 1
        JMP   @Exiting

DoM0BL160:

; -------------------------------------------------------------------------
; Displaying M0 and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase and M1CBase> 0 1 0 0 1
        JMP   @Exiting

DoM0M1BL160:

; -------------------------------------------------------------------------
; Displaying M0,M1, and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase> 0 1 0 1 1
        JMP   @Exiting

DoP1BL160:

; -------------------------------------------------------------------------
; Displaying P1 and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and M0CBase and M1CBase> 0 0 1 0 1
        JMP   @Exiting

DoM1P1BL160:

; -------------------------------------------------------------------------
; Displaying P1,M1, and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and M0CBase> 0 0 1 1 1
        JMP   @Exiting

DoM0P1BL160:

; -------------------------------------------------------------------------
; Displaying M0,P1, and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and M1CBase> 0 1 1 0 1
        JMP   @Exiting

DoM0P1M1BL160:

; -------------------------------------------------------------------------
; Displaying M0,P1,M1, and BL
; -------------------------------------------------------------------------

        _Disp160 <P0CBase> 0 1 1 1 1
        JMP   @Exiting

DoP0BL160:

; -------------------------------------------------------------------------
; Displaying P0 and BL
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and M0CBase and M1CBase> 1 0 0 0 1
        JMP   @Exiting

DoP0M1BL160:

; -------------------------------------------------------------------------
; Displaying P0,M1, and BL
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and M0CBase> 1 0 0 1 1
        JMP   @Exiting

DoP0M0BL160:

; -------------------------------------------------------------------------
; Displaying P0,M0, and BL
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and M1CBase> 1 1 0 0 1
        JMP   @Exiting

DoP0M0M1BL160:

; -------------------------------------------------------------------------
; Displaying P0,M0,M1, and BL
; -------------------------------------------------------------------------

        _Disp160 <P1CBase> 1 1 0 1 1
        JMP   @Exiting

DoP0P1BL160:

; -------------------------------------------------------------------------
; Displaying P0,P1, and BL
; -------------------------------------------------------------------------

        _Disp160 <M0CBase and M1CBase> 1 0 1 0 1
        JMP   @Exiting

DoP0P1M1BL160:

; -------------------------------------------------------------------------
; Displaying P0,P1,M1, and BL
; -------------------------------------------------------------------------

        _Disp160 <M0CBase> 1 0 1 1 1
        JMP   @Exiting

DoP0M0P1BL160:

; -------------------------------------------------------------------------
; Displaying P0,M0,P1, and BL
; -------------------------------------------------------------------------

        _Disp160 <M1CBase> 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 <P0CBase and P1CBase and M0CBase and m1CBase and BLCBase> 0 0 0 0 0
;        JMP   @Exiting

DoM1160:

; -------------------------------------------------------------------------
; Displaying M1
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase and M0CBase and BLCBase> 0 0 0 1 0
        JMP   @Exiting

DoM0160:

; -------------------------------------------------------------------------
; Displaying M0
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase and M1CBase and BLCBase> 0 1 0 0 0
        JMP   @Exiting

DoM0M1160:

; -------------------------------------------------------------------------
; Displaying M0 and M1
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and P1CBase and BLCBase> 0 1 0 1 0
        JMP   @Exiting

DoP1160:

; -------------------------------------------------------------------------
; Displaying P1
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and M0CBase and M1CBase and BLCBase> 0 0 1 0 0
        JMP   @Exiting

DoM1P1160:

; -------------------------------------------------------------------------
; Displaying P1 and M1
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and M0CBase and BLCBase> 0 0 1 1 0
        JMP   @Exiting

DoM0P1160:

; -------------------------------------------------------------------------
; Displaying M0 and P1
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and M1CBase and BLCBase> 0 1 1 0 0
        JMP   @Exiting

DoM0P1M1160:

; -------------------------------------------------------------------------
; Displaying M0,P1, and M1
; -------------------------------------------------------------------------

        _Disp160 <P0CBase and BLCBase> 0 1 1 1 0
        JMP   @Exiting

DoP0160:

; -------------------------------------------------------------------------
; Displaying P0
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and M0CBase and M1CBase and BLCBase> 1 0 0 0 0
        JMP   @Exiting

DoP0M1160:

; -------------------------------------------------------------------------
; Displaying P0 and M1
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and M0CBase and BLCBase> 1 0 0 1 0
        JMP   @Exiting

DoP0M0160:

; -------------------------------------------------------------------------
; Displaying P0 and M0
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and M1CBase and BLCBase> 1 1 0 0 0
        JMP   @Exiting

DoP0M0M1160:

; -------------------------------------------------------------------------
; Displaying P0,M0, and M1
; -------------------------------------------------------------------------

        _Disp160 <P1CBase and BLCBase> 1 1 0 1 0
        JMP   @Exiting

DoP0P1160:

; -------------------------------------------------------------------------
; Displaying P0 and P1
; -------------------------------------------------------------------------

        _Disp160 <M0CBase and M1CBase and BLCBase> 1 0 1 0 0
        JMP   @Exiting

DoP0P1M1160:

; -------------------------------------------------------------------------
; Displaying P0,P1, and M1
; -------------------------------------------------------------------------

        _Disp160 <M0CBase and BLCBase> 1 0 1 1 0
        JMP   @Exiting

DoP0M0P1160:

; -------------------------------------------------------------------------
; Displaying P0,M0, and P1
; -------------------------------------------------------------------------

        _Disp160 <M1CBase and BLCBase> 1 1 1 0 0
        JMP   @Exiting

DoP0M0P1M1160:

; -------------------------------------------------------------------------
; Displaying P0,M0,P1, and M1
; -------------------------------------------------------------------------

        _Disp160 <BLCBase> 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
