ATARI 800 CHECKERS DISPLAY BY C. SHAW 3/31/80 ; Copyright 1980 Atari, Inc. and Carol Shaw#

ATR image#


Source Code#

10           TITLE "ATARI 800 CHECKERS DISPLAY BY C. SHAW 3/31/80"
20 ;
30 ;COPYRIGHT ATARI 1980
40 ;
50 ;THIS IS AN EXAMPLE OF A DISPLAY LIST WHICH USES CHARACTER MAPPING TO
60 ;PRODUCE THE CHECKERS AND THE TOP AND BOTTOM BORDERS OF THE BOARD.
70 ;PLAYERS ARE USED FOR THE RED SQUARES. THIS GIVES 6 COLORS WITHOUT
80 ;CHANGING THE COLOR REGISTERS.
90 ;MISSILES ARE USED FOR THE LEFT AND RIGHT BORDERS.
0100 ;THE PROGRAM STARTS AT THE LOCATION SPECIFIED BY PMB.
0110 ;A FEW TRICKS ARE USED TO SAVE RAM, BUT FURTHER OPTIMIZATION IS POSSIBLE
0120 ;THIS IS A RAM BASED PROGRAM WHICH RUNS WITH THE ASSEMBLER CARTRIDGE, NOT A
0120 ;ROM CARTRIDGE.
0140 ;
0150 ;COLLEEN (ATARI 800) EQUATES
0160 ;
0170 CHBASE =    $D409
0180 DMACTL =    $D400
0190 SDMCTL =    $022F
0200 HPOSP0 =    $D000
0210 SIZEP0 =    $D008
0220 PCOLR0 =    $02C0
0230 SDLSTL =    $0230
0240 SDLSTH =    $0231
0250 GRACTL =    $D01D
0260 PMBASE =    $D407
0270 GPRIOR =    $026F
0280 VDSLST =    $0200
0290 NMIEN  =    $D40E
0300 ;
0310 ;DISPLAY LIST EQUATES
0320 ;
0330 INT    =    $80   ;DISPLAY LIST INTERRUPT (BIT 7 OF NMI STATUS)
0340 JMPWT  =    $41   ;JUMP AND WAIT UNTIL END OF NEXT VERTICAL BLANK (2 BYTES)
0350 RELOAD =    $40   ;RELOAD MEM SCAN COUNTER (2 BYTES)
0360 VSC    =    $20   ;VERTICAL SCROLL ENABLE
0370 HSC    =    $10   ;HORIZONTAL SCROLL ENABLE
0380 JUMP   =    1     ;JUMP INSTRUCTION (2 BYTES)
0390 BLANK1 =    0     ;1 BLANK TV LINE
0400 BLANK2 =    $10   ;2 BLANK LINES
0410 BLANK3 =    $20   ;3
0420 BLANK4 =    $30   ;4
0430 BLANK5 =    $40   ;5
0440 BLANK6 =    $50   ;6
0450 BLANK7 =    $60   ;7
0460 BLANK8 =    $70   ;8 BLANK TV LINES
0470         PAGE
0480 ;
0490 INTOFF =    $20       ;USED TO GET INTERNAL CODE FOR UPPER CASE ALPHANUMERICS
0500 ;
0510 ;INTERNAL CHARACTER CODES
0520 ;
0530 SPI    =    ' -INTOFF
0540 AI     =    'A-INTOFF
0550 CI     =    'C-INTOFF
0560 DI     =    'D-INTOFF
0570 EI     =    'E-INTOFF
0580 GI     =    'G-INTOFF
0590 HI     =    'H-INTOFF
0600 II     =    'I-INTOFF
0610 OI     =    'O-INTOFF
0620 PI     =    'P-INTOFF
0630 RI     =    'R-INTOFF
0640 TI     =    'T-INTOFF
0650 YI     =    'Y-INTOFF
0660 N1I    =    '1-INTOFF
0670 N8I    =    '8-INTOFF
0680 N9I    =    '9-INTOFF
0690 N0I    =    '0-INTOFF
0700 ;
0710 ;CHECKERS EQUATES
0720 ;
0730 ;CODES FOR SPECIAL CHECKERS CHARACTER SET
0740 ;
0750 EMPTY  =    0      ;EMPTY SQUARE
0760 CHECKER=    1      ;ORDINARY CHECKER
0770 KING   =    2
0780 CURS   =    3      ;CURSOR (X)
0790 BORDER =    4      ;USED FOR TOP AND BOTTOM BORDERS OF BOARD
0800 ;
0810 CLP0   =    0      ;PLAYER 0 (HUMAN)
0820 CLP1   =    $80        ;PLAYER 1 (COMPUTER)
0830 CLBOR  =    $C0        ;BORDER COLOR (USED TO SET UP 2 MSB'S OF CHAR)
0840 PMB    =    $5000  ;PLAYER MISSILE BASE ADDRESS & PROGRAM LOCATION
0850         PAGE
0860 ;
0870 ; RAM VARIABLES
0880 ;
0890        *=  PMB
0900 BOARD  *=  *+32        ;CHECKER BOARD (ONLY 32 BLOCK SQUARES ARE USED)
0910 T0     *=  *+1         ;TEMP FOR MOVING BOARD TO MEM MAP
0920 ;
0930 ;PLAYER AND MISSILE GRAPHICS.
0940 ;PLAYERS ARE USED FOR SQUARES, MISSILES FOR LEFT AND RIGHT BORDERS.
0950 ;
0960        *=   PMB+$180
0970 GRM03  *=   *+$80     ;MISSILE GRAPHICS
0980 GRP0   *=   *+$80     ;PLAYER 0 GRAPHICS
0990 GRP1   *=   *+$80     ;PLAYER 1
1000 GRP2   *=   *+$80     ;       2
1010 GRP3   *=   *+$80     ;       3
1020 ;
1030 TITL   *=   *+20      ;TOP LINE OF CHARS -- ATASCII MESSAGE
1040 TOPBRD *=   *+16      ;TOP BORDER OF BOARD
1050 BRDSP  *=   8*16+*    ;BOARD DISPLAY
1060 BOTBRD *=   *+16      ;BOTTOM BORDER
1070         PAGE
1080 ;
1090 ;GP -- SPECIAL CHECKERS CHARACTER SET (ONLY CODES 0-4 ARE USED).
1100 ;
1110        *=   PMB+$600
1120 GR
1130        .BYTE 0,0,0,0,0,0,0,0 ; BLANK (0)
1140        .BYTE $3C,$7E,$FF,$FF,$FF,$FF,$7E,$3C ;CHECKER (1)
1150        .BYTE $3C,$7E,$A5,$A5,$C3,$C3,$7E,$3C ;KING (2)
1160        .BYTE $C3,$66,$3C,$18,$18,$3C,$66,$C3 ;CURSOR (3)
1170        .BYTE 0,$FF,$FF,$FF,$FF,$FF,$FF,0 ;BORDER (4)
1180         PAGE
1190 ;
1200 ;
1210 ;DISPLAY LIST
1220 ;
1230 DSP
1240        .BYTE BLANK8 ;24 BLANK LINES
1250        .BYTE BLANK8
1260        .BYTE BLANK8
1270        .BYTE RELOAD+6 ;LINES 0-7 MESSAGE LINE: 20 ACROSS X 5 COLOR X 1 LINE RESOLUTION CHARACTERS
1280        .WORD TITL
1290        .BYTE INT+BLANK1 ;8. INTERRUPT TO CHANGE CHARACTER BASE ADDRESS AND CHANGE TO NARROW SCREEN.
1300        .BYTE 6        ;9-16. TOP BORDER: 16 X 5 X 1 CHARS (LAST LINE IS TOP OF 1ST ROW OF SQUARES)
1310        .BYTE BLANK2   ;17-18. TOP OF FIRST ROW OF SQUARES
1320 ;                     CHECKERBOARD (8 LINES OF CHARS WITH SPACES INBETWEEN - 22 LINES/SQUARE)
1330        .BYTE 7        ;19-34. 16X5X2 LINE RESOLUTION CHARS
1340        .BYTE BLANK6   ;35-40. FIRST 3 LINES=BOTTOM OF PREVIOUS SQUARE.
1350        .BYTE 7        ;41-56
1360        .BYTE BLANK6   ;57-62. LAST 3 LINES=TOP OF NEXT SQUARE.
1370        .BYTE 7        ;63-78
1380        .BYTE BLANK6   ;79-84
1390        .BYTE 7        ;85-100
1400        .BYTE BLANK6   ;101-106
1410        .BYTE 7        ;107-122
1420        .BYTE BLANK6   ;123-128
1430        .BYTE 7        ;129-144
1440        .BYTE BLANK6   ;145-150
1450        .BYTE 7        ;151-166
1460        .BYTE BLANK6   ;167-172
1470        .BYTE 7        ;173-188
1480 ;                      NEXT THREE LINES ARE BOTTOM OF PREVIOUS SQUARE
1490        .BYTE BLANK2   ;189-190. END OF NORMAL DISPLAY (SHOULD BE ON SCREEN ON ALL TV'S).
1500        .BYTE 6        ;191-198. BOTTOM BORDER (MAY OVERSCAN, BUT NOT ESSENTIAL TO GAME PLAY)
1510        .BYTE JMPWT    ;WAIT FOR NEXT VBLANK, THEN START OVER
1520        .WORD DSP
1530 ;
1540 ;
1550 ;DSP -- DISPLAY LIST INTERRUPT HANDLER.
1560 ;CHANGES CHARACTER BASE AND WIDTH OF DISPLAY FOR SPECIAL CHECKERS GRAPHICS
1570 ;THE OS WILL CHANGE CHBASE BACK TO NORMAL DURING VERTICAL BLANK.
1580 ;
1590 NCHR
1600        PHA
1610        LDA  #GR/256
1620        STA  CHBASE
1630 ;
1640 ;INSTRUCTION FETCH DMA ENABLE, P/M 2 LINE RES, P/M DMA ENABLE, NARROW SCREEN (128 CLOCKS)
1650        LDA  #$2D
1660        STA  DMACTL
1670        PLA
1680        RTI
1690         PAGE
1700 ;
1710 ;INITIALIZATION CODE -- START EXECUTION HERE
1720 ;
1730        *=   PMB+$700
1740 ;
1750 ;INIT OS'S DMACTL VRRIRBLE
1760 ;INSTRUCTION FETCH DMA ENABLE, P/M 2 LINE RES, P/M DMA ENABLE, STANDARD SCREEN (160 CLOCKS)
1770 ;
1780        LDA  #$2E
1790        STA  SDMCTL
1800 ;
1810 ;CLEAR RAM
1820 ;
1830        LDA  #0
1840        TAX
1850 INITLP
1860        STA  PMB,X
1870        STA  PMB+$100,X
1880        STA  PMB+$200,X
1890        STA  PMB+$300,X
1900        STA  PMB+$400,X
1910        INX
1920        BNE  INITLP
1930 ;
1940 ;INITIALIZE MISSILE GRAPHICS FOR BORDERS
1950 ;
1960        LDA  #$0E
1970        LDY  #$5E
1980 LQPZ   STA  GRM03+$14,Y
1990        DEY
2000        BNE  LQPZ
2010 ;
2020 ;INITIALIZE TOP AND BOTTOM BORDERS.
2030 ;
2040        LDY  #16
2050        LDA  #CLBOR+BORDER
2060 TBLP   STA  TOPBRD-1,Y
2070        STA  BOTBRD-1,Y
2080        DEY
2090        BNE  TBLP ; CONTINUE UNTIL Y=0
2100 ;
2110 ;INITIALIZE PLAYER GRAPHICS FOR SQUARES (CHECKER BOARD) Y=0
2120 ;
2130        LDA  #$F0
2140 IN2    LDX  #10
2150 IN3    STA  GRP0+$18,Y
2160        STA  GRP1+$18,Y
2170        STA  GRP2+$18,Y
2180        STA  GRP3+$18,Y
2190 ;
2200        PHA
2210        LDA  #$0A
2220        STA  GRM03+$18,Y ;REST OF MISSILE GRAPHICS
2230        PLA
2240        INY
2250        DEX
2260        BPL  IN3
2270        EOR  #$FF      ;FILL IN OPPOSITE SQUARES
2280        CPY  #88
2290        BCC  IN2
2300        LDY  #8
2310 ;
2320 ; INITIALIZE PLAYER AND MISSILE POSITIONS AND COLORS
2330 ;
2340 IN4    LDA  ITBL,Y
2350        STA  HPOSP0,Y
2360        TXA           ;$FF
2370        STA  SIZEP0,Y ;$03 INDICATES 4 TIMES NORMAL SIZE (REST IS DON'T CARE)
2380        LDA  ITBL1,Y
2390        STA  PCOLR0,Y
2400        DEY
2410        BPL  IN4
2420 ;
2430 ;OS, ANTIC, POKEY INITIALIZATION
2440 ;
2450        LDA  #DSP&$FF  ; DISPLAY LIST START ADDRESS (LSB)
2460        STA  SDLSTL
2470        LDA  #DSP/256  ; MSB OF ADDRESS
2480        STA  SDLSTH
2490        LDA  #3        ;ENABLE PLAYER/MISSILE DMA TO GRAPHICS REGS.
2500        STA  GRACTL
2510        LDA  #PMB/256  ;MSB OF ADDRESS OF PLAYER/MISSILE GRAPHICS
2520        STA  PMBASE
2530        LDA  #$14      ;5TH PLAYER ENABLE (USE PF3 FOR MISSILE COLOR), PF TAKES PRIO OVER PLAYERS
2540        STA  GPRIOR    ;OS PRIORITY REG
2550        LDA  #NCHR&$FF ;DISPLAY LIST INTERRUPT VECTOR (LSB)
2560        STA  VDSLST
2570        LDA  #NCHR/256
2580        STA  VDSLST+1
2590        STX  NMIEN     ;X=$FF   $C0 ENABLES DISPLAY LIST & VBLANK INTERRUPTS.
2600 ;
2610 ;INITIALIZE BOARD DISPLAY
2620 ;
2630        LDX  #11
2640 BRDLP
2650        LDA  #CHECKER+CLP0 ;HUMAN PIECES ON SQUARES 0-11
2660        STA  BOARD,X
2670        LDA  #CHECKER+CLP1 ;COMPUTER PIECES ON SQUARES 20-31
2680        STA  BOARD+20,X
2690        DEX
2700        BPL  BRDLP
2710 ;
2720 ;MOVE COPYRIGHT MESSAGE TO MESSAGE DISPLAY LINE
2730 ;
2740        LDX  #19
2750 IN6    LDA  COPY,X
2760        STA  TITL,X
2770        DEX
2780        BPL  IN6
2790 ;
2800 ;LOOP TO MOVE BOARD TO GRAPHICS AREA.
2810 ;THE CHECKERS PROGRAM LOGIC COULD BE ADDED HERE OR A VBLANK INTERRUPT COULD BE USED.
2820 ;
2830 LOOP
2840        JSR  UPCHR
2850        JMP  LOOP
2860 ;
2870 ;
2880 ;
2890 ;
2900 ;UPCHR -- SUBROUTINE TO MOVE 32 BYTES OF CHECKER BOARD TO DISPLAY RAM.
2910 ;
2920 UPCHR
2930        LDX  #31       ;SQUARE 31 = UPPER LEFT
2940        LDY  #0
2950 UPLP1
2960        LDA  #4-1      ;4 SQUARES/LINE
2970        STA  T0
2980 UPLP2
2990        LDA  BOARD,X
3000        STA  BRDSP+2,Y ; FOR ROWS SHIFTED TO RIGHT
3010        LDA  BOARD-4,X
3020        STA  BRDSP+$10,Y ; FOR ROWS SHIFTED TO LEFT
3030        INY
3040        INY
3050        INY
3060        INY
3070        DEX
3080        DEC  T0
3090        BPL  UPLP2
3100 ;
3110        TYA
3120        CLC
3130        ADC  #$10
3140        TAY
3150        TXA
3160        SBC  #4-1      ;CARRY IS CLEAR (SUBTRACT 4)
3170        TAX
3180        BCS  UPLP1
3190        RTS
3200 ;
3210 ;
3220 ;
3230 ;
3240 ;DATA
3250 ;HORIZONTAL POSITION OF PLAYERS (SQUARES) AND MISSILES (SIDE BORDERS).
3260 ;M0=RIGHT BORDER, M1=LEFT BORDER
3270 ;M2 & M3 ARE PLACED WITH M1.
3280 ;             P0, P1, P2, P3, M0, M1, M2, M2
3290 ITBL
3300        .BYTE $3C,$5C,$7C,$9C,$BC,$38,$38,$38
3310 ;
3320 ;COLOR TABLE
3330 ITBL1
3340        .BYTE $34,$34,$34,$34 ;4 PLAYERS (RED SQUARES)
3350        .BYTE $36      ;PF0 RED CHECKERS AND MESSAGES
3360        .BYTE $88      ;PF1 BLUE CHARACTERS
3370        .BYTE $0E      ;PF2 WHITE CHECKERS AND MESSAGES
3380        .BYTE $26      ;PF3 YELLOW BORDER (CHARS & MISSILES)
3390        .BYTE 0        ;BK: BLACK BACKGROUND
3400 ;
3410 ;"COPYRIGHT ATARI 1980" MESSAGE
3420 ;
3430 OF     =    $00       ;FOR PF0 COLOR (RED)
3440 OF2    =    $80       ;FOR PF2 COLOR (WHITE)
3450 OF3    =    $40       ;FOR PF1 COLOR (BLUE)
3460 TGTBL
3470 COPY   .BYTE SPI,CI+OF,OI+OF,PI+OF,YI+OF,RI+OF,II+OF,GI+OF,HI+OF,TI+OF
3480        .BYTE AI+OF2,TI+OF2,AI+OF2,RI+OF2,II+OF2,N1I+OF3,N9I+OF3,N8I+OF3,N0I+OF3