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 ;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