ATARI 800 CHECKERS DISPLAY BY C. SHAW 3/31/80 ; Copyright 1980 Atari, Inc. and Carol Shaw#
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