General Information
Author: THOMAS TANIDA
Published: 1987
Any Point, Any Color
The APAC System, or Any Point, Any Color was a software-driven display mode capable of displaying an image using all 256 of the Atari's possible colors. By taking 80×192 mode lines that displayed 16 hues, and those that displayed 16 shades, and either interlacing rows of them, quickly alternating between rows of them, or both, a screen displaying 80×96 or 80×192 pixels in 256 colors could be perceived.
APAC was created in early 1987 and later introduced in the magazine A.N.A.L.O.G. Computing, Issue #60, May 1988 in an article by Tom Tanida. The source code was written in 6502 assembly language.
APAC used a Display List Interrupt, or DLI, after each line of the screen was drawn to alternate between GTIA Graphics Mode 9 (15 hues) and 11 (15 shades of grey) of the GTIA chip. The hues and luminances would blend together on the screen (usually a television) to create the effect of a palette of 256 visible colors, with the artifact of a thinner, horizontal blank line in between each visible line.
APAC used a very basic API consisting of four functions:
A second article for an "APAC-II" mode was hinted at in the original article. This mode would have alternated the GTIA 9 and 11 modes during a vertical blank interrupt, or VBI. The article was neither completed nor published.
10 ****************************** 20 * APAC SYSTEM, V1.1 * 30 * CREATED BY THOMAS TANIDA * 40 * FIRST STARTED: 1/3/87 * 50 * LAST REVISED: 2/7/87 * 60 ****************************** 70 *= $22FD 80 .OPT NO EJECT 90 .TAB 8,12,30 0100 ****************************** 0110 ZTEMP = $00 0120 COLSAV = 203 0130 YBYT = 204 0140 T8 = 206 0150 FX = 212 ;212-222 USED 0160 FY = 213 ; FOR DRAWTO 0170 XD = 214 0180 YD = 215 0190 XACC = 216 0200 YACC = 217 0210 DELTX = 218 0220 DELTY = 219 0230 EPOINT = 220 0240 TMP1 = 221 0250 COUNT = 222 0260 ****************************** 0270 * SYSTEM EQUATES * 0280 ****************************** 0290 CASINI = $02 ;2 0300 TRAMSZ = $06 ;6 0310 WARMST = $08 ;8 0320 DOSVEC = $0A ;10 0330 DOSINI = $0C ;12 0340 ROWCRS = $54 ;84 0350 COLCRS = $55 ;85 0360 SCREEN = $58 ;88 0370 RAMTOP = $6A ;106 0380 LOMEM = $80 ;128 0390 VDSLST = $0200 ;512 0400 VVBLKI = $0222 ;546 0410 SDMCTL = $022F ;559 0420 SDLSTL = $0230 ;560 0430 GPRIOR = $026F ;623 0440 COLOR4 = $02CB ;712 0450 MEMLO = $02E7 ;743 0460 ICCOM = $0342 ;834 0470 ICBADR = $0344 ;836 0480 ICBLEN = $0348 ;840 0490 ICAUX1 = $034A ;842 0500 COLBK = $D01A ;53274 0510 PRIOR = $D01B ;53275 0520 WSYNC = $D40A ;54282 0530 VCOUNT = $D40B ;54283 0540 NMIEN = $D40E ;54286 0550 CIOV = $E456 ;58454 0560 SETVBV = $E45C ;58460 0570 SYSVBV = $E45F ;58463 0580 ****************************** 0590 * (FOR BINARY LOADS) 0600 JMP SYSSET 0610 * 0620 * BASIC ENTRY POINTS: 0630 JMP BASPLT ;PLOT 0640 JMP BASDRW2 ;DRAWTO 0650 JMP BASEXGT ;EXIT APAC 0660 JMP BASINGT ;INIT APAC 0670 * ML ENTRY POINTS: 0680 JMP PLT256 ;PLOT 0690 JMP DRT256 ;DRAWTO 0700 JMP EXITGT ;EXIT APAC 0710 JMP INITGT ;INIT APAC 0720 ****************************** 0730 * BASIC ENTRY: 0740 * Q=USR(BASPLT,X,Y,COL) 0750 * 0760 * THIS SUBR PLOTS A POINT 0770 * ON THE APAC SCREEN AT THE 0780 * GIVEN X,Y POSITION USING THE 0790 * GIVEN COLOR (0-255). 0800 * REMEMBER: THERE ARE 192 LINES, 0810 * ALTERNATING LUM AND COL, 0820 * SO THE SCREEN LIMITS ARE 0830 * 80 HORIZONTAL AND 192/2=96 0840 * VERTICAL 0850 * 0860 * FIRST MAKE SURE THERE ARE 3 0870 * (NO MORE, NO LESS) ARGUMENTS 0880 * 0890 BASPLT 0900 PLA 0910 CMP #3 0920 BEQ GETPARM 0930 JMP TRAP ;WRONG # OF ARGS 0940 GETPARM 0950 PLA ;IGNORE HI-BYTE 0960 PLA 0970 TAX ;X-POS 0980 PLA ;IGNORE HI 0990 PLA 1000 TAY ;Y-POS 1010 PLA 1020 PLA ;COLOR 1030 * CHECK FOR ILLEGAL PLOT 1040 JSR BOUNDCK 1050 * ML ENTRY: A=COLOR 1060 * X=X-POS 1070 * Y=Y-POS 1080 PLT256 1090 STA COLSAV ;SAVE COLOR 1100 PSAMCOL 1110 STX COLCRS ;UPDATE CURSOR 1120 STY ROWCRS 1130 * GET LO-BYTE OF SCREEN MEM PNTR 1140 LDA SCRALO,Y 1150 STA YBYT 1160 * GET HI-BYTE OF SCREEN MEM PNTR 1170 LDA SCRAHI,Y 1180 STA YBYT+1 1190 TXA 1200 LSR A ;A=A/2 1210 TAY 1220 * GET BYTE WITH PIXEL FROM THE 1230 * SCREEN CONTAINING THE LUM 1240 LDA (YBYT),Y 1250 STA T8 ;SAVE IT 1260 TXA 1270 AND #1 ;X=1=ODD X-POS 1280 TAX ;X=0=EVEN 1290 LDA T8 1300 * MASK PREVIOUS PIXEL FROM SCRN 1310 AND BITABL,X 1320 STA T8 1330 * RETRIEVE COLOR 1340 LDA COLSAV 1350 CPX #1 1360 BNE LHNYB ;X IS EVEN 1370 * THIS WORKS SINCE THE LUM 1380 * IS IN THE LOWER NYBBLE OF THE 1390 * COLOR, AND IF X IS ODD THEN 1400 * THE LOWER NYBBLE OF THE SCR 1410 * BYTE WILL CONTAIN THE PIXEL 1420 AND #$0F 1430 JMP POKLUM 1440 * MOVE LUM INTO HI-NYBBLE 1450 LHNYB 1460 ASL A 1470 ASL A 1480 ASL A 1490 ASL A 1500 * POKE THE LUM BACK INTO THE SCR 1510 POKLUM 1520 ORA T8 1530 STA (YBYT),Y 1540 CLC 1550 LDA YBYT 1560 ADC #40 ;ADD 40 FOR THE 1570 STA YBYT ;NXT LINE (COLR) 1580 BCC GETCOLR 1590 INC YBYT+1 1600 * GETS THE BYTE CONTAINING THE 1610 * PIXEL WITH THE COLOR AND SAVE 1620 * IN T8 1630 GETCOLR 1640 LDA (YBYT),Y 1650 AND BITABL,X 1660 STA T8 1670 LDA COLSAV 1680 CPX #1 1690 BNE CHNYB 1700 * SINCE THE COLOR ITSELF IS IN 1710 * THE HI-NYBBLE OF THE GIVEN 1720 * COLOR, MOVE IT TO THE LOWER 1730 * NYBBLE SINCE THE X-POS IS ODD 1740 LSR A 1750 LSR A 1760 LSR A 1770 LSR A 1780 JMP POKCOL 1790 CHNYB 1800 AND #$F0 ;SINCE XPOS EVEN 1810 POKCOL 1820 ORA T8 1830 * PUT IT INTO THE SCREEN 1840 STA (YBYT),Y 1850 RTS 1860 * BIT MASKS TABLE 1870 BITABL .BYTE $0F,$F0 1880 ****************************** 1890 * BASIC ENTRY: 1900 * Q=USR(BASDRW2,X,Y,COL) 1910 * 1920 * THIS SUBR DRAWS A LINE FROM 1930 * THE CURRENT CURSOR POSITION 1940 * TO THE GIVEN X,Y USING 1950 * THE GIVEN COLOR 1960 * 1970 * FIRST MAKE SURE THERE ARE 3 1980 * (NO MORE, NO LESS) ARGUMENTS 1990 * 2000 BASDRW2 2010 PLA 2020 CMP #3 2030 BEQ GETARGS 2040 JMP TRAP ;WRONG # OF ARGS 2050 GETARGS 2060 PLA 2070 PLA 2080 TAX ;DEST-X 2090 PLA 2100 PLA 2110 TAY ;DEST-Y 2120 LDA COLCRS ;CURSOR X-POS 2130 STA FX ;FROM-X 2140 LDA ROWCRS ;CURSOR Y-POS 2150 STA FY ;FROM-Y 2160 PLA 2170 PLA 2180 * CHECK FOR ILLEGAL DRAWTO 2190 JSR BOUNDCK 2200 * ML ENTRY: A=COLOR 2210 * X=DEST-X 2220 * Y=DEST-Y 2230 DRT256 2240 STX TMP1 ;SAVE X 2250 STY YD ;SAVE Y 2260 * PLOT THE DESTINATION PIXEL 2270 JSR PLT256 2280 LDY YD ;RESTORE Y 2290 * LOOP TO SET XD,YD,XACC,YACC, 2300 * DELTX,DELTY TO 0 2310 LDX #6 2320 LDA #0 2330 POKZ0 2340 STA XD-1,X 2350 DEX 2360 BNE POKZ0 2370 * THE FOLLOWING ROUTINE IS BASED 2380 * ON THE VECTOR ROUTINE PRINTED 2390 * IN ANALOG, ISSUE #18, IN THE 2400 * "BASIC TRAINING" COLUMN BY 2410 * TOM HUDSON 2420 * INIT THE X VARIABLES 2430 LDX TMP1 2440 CPX FX 2450 BEQ SGNY 2460 BCC NEGXD 2470 TXA ;DELTX=TX-FX 2480 SBC FX ;CARRY WAS SET 2490 INC XD ;XD=1 2500 BNE SAVDLX ;ALWAYS 2510 NEGXD 2520 DEC XD ;XD=-1 ($FF) 2530 STX TMP1 2540 LDA FX ;DELTX=FX-TX 2550 SEC 2560 SBC TMP1 2570 SAVDLX 2580 STA DELTX 2590 * INIT THE Y VARIABLES 2600 SGNY 2610 CPY FY 2620 BEQ INTCNT 2630 BCC NEGY 2640 TYA ;DELTY=YD-FY 2650 SBC FY ;CARRY WAS SET 2660 INC YD ;YD=1 2670 BNE SAVDLY ;ALWAYS 2680 NEGY 2690 DEC YD ;YD=-1 ($FF) 2700 STY TMP1 2710 LDA FY ;DELTY=FY-TY 2720 SEC 2730 SBC TMP1 2740 SAVDLY 2750 STA DELTY 2760 INTCNT 2770 LDA DELTX 2780 CMP DELTY 2790 BCC XLTY 2800 STA YACC 2810 BCS INTEPT ;ALWAYS 2820 * (X LESS THAN Y) 2830 XLTY 2840 LDA DELTY 2850 STA XACC 2860 INTEPT 2870 STA COUNT 2880 STA EPOINT 2890 LSR XACC ;XACC=XACC/2 2900 LSR YACC ;YACC=YACC/2 2910 * EXIT IF DESTINATION X,Y 2920 * SAME AS CURRENT X,Y 2930 LDA COUNT 2940 BEQ EXDRT 2950 * 2960 * THE MAIN LOOP! 2970 XCALC 2980 LDA XACC ;CHANGE X 2990 CLC 3000 ADC DELTX 3010 STA XACC 3020 CMP EPOINT 3030 BCC YCALC 3040 SBC EPOINT ;CARRY WAS SET 3050 STA XACC 3060 LDA FX 3070 CLC 3080 ADC XD 3090 STA FX 3100 YCALC 3110 LDA YACC ;CHANGE Y 3120 CLC 3130 ADC DELTY 3140 STA YACC 3150 CMP EPOINT 3160 BCC PLIT 3170 SBC EPOINT ;CARRY WAS SET 3180 STA YACC 3190 LDA FY 3200 CLC 3210 ADC YD 3220 STA FY 3230 * PLOT THE CALCULATED POINT 3240 PLIT 3250 LDX FX 3260 LDY FY 3270 JSR PSAMCOL ;PLOT SAME COLOR 3280 DEC COUNT 3290 BNE XCALC ;DO MORE POINTS 3300 EXDRT 3310 RTS 3320 ****************************** 3330 * BASIC ENTRY: 3340 * Q=USR(BASEXGT) 3350 * 3360 * THIS SUBR RESTORES THE SCREEN 3370 * TO GRAPHICS 0 AND RESETS OS 3380 * INTERRUPT POINTERS, ETC. 3390 * IT STILL PROTECTS APAC 3400 * 3410 BASEXGT 3420 PLA 3430 BEQ EXITGT ;NO PARAMETERS! 3440 JMP TRAP 3450 * ML ENTRY: 3460 * (REGISTERS IGNORED) 3470 EXITGT 3480 LDA VCOUNT ;MAKE SURE 3490 CMP #64 ;WE AREN'T NEAR 3500 BCS EXITGT ;A VBI 3510 LDA SAVVBI ;RESTORE OS VBI 3520 STA VVBLKI 3530 LDA SAVVBI+1 3540 STA VVBLKI+1 3550 * 3560 LDA #64 3570 STA NMIEN ;NO DLI'S 3580 LDX #$00 ;IOCB 0 3590 LDA #$0C ;CLOSE 3600 STA ICCOM 3610 JSR CIOV ;GO DO IT 3620 * 3630 LDX #$00 ;IOCB 0 3640 STX ICAUX1+1 3650 LDA #$03 ;OPEN 3660 STA ICCOM 3670 * POINT TO "E:", BELOW 3680 LDA # <SCRDEV 3690 STA ICBADR 3700 LDA # >SCRDEV 3710 STA ICBADR+1 3720 LDA #$0C ;READ/WRITE 3730 STA ICAUX1 3740 JSR CIOV ;GO DO IT 3750 * 3760 LDA #$7F 3770 STA NMIEN ;NORML INTRUPTS 3780 * PROTECT APAC BY MOVING THE 3790 * BASIC AND OS POINTERS UP 3800 SETMEM 3810 LDA # <ENDAPAC ;LO-BYTE 3820 STA MEMLO 3830 STA LOMEM 3840 LDA # >ENDAPAC ;HI-BYTE 3850 STA MEMLO+1 3860 STA LOMEM+1 3870 RTS 3880 SAVVBI .BYTE 0,0 3890 SCRDEV .BYTE "E:" 3900 ****************************** 3910 * BASIC ENTRY: 3920 * Q=USR(BASINGT) 3930 * 3940 * THIS SUBR SETS UP THE SPECIAL 3950 * APAC SCREEN WITH ALTERNATING 3960 * LINES OF LUMINANCE AND COLOR 3970 * 3980 BASINGT 3990 PLA 4000 BEQ INITGT ;ZERO ARGS 4010 JMP TRAP 4020 * ML ENTRY: 4030 * (REGISTERS IGNORED) 4040 INITGT 4050 LDA #0 4060 STA SDMCTL ;DISABLE SCR 4070 STA NMIEN ;NO INTERRUPTS 4080 STA ROWCRS ;CURSOR=(0,0) 4090 STA COLCRS 4100 STA COLCRS+1 4110 STA COLOR4 ;BAKGRND=BLACK 4120 STA COLSAV ;DEFAULT COL=0 4130 STA YBYT ;MY POINTR TO DL 4140 STA SDLSTL ;OS POINTR TO DL 4150 TAY ;Y=0 4160 LDA RAMTOP ;HI-BYTE OF 4170 SEC ;DLIST ADR= 4180 SBC #32 ; RAMTOP-32 4190 STA YBYT+1 4200 STA SDLSTL+1 4210 * CREATE THE DISPLAY LIST 4220 * 4230 * THE APAC DISPLAY LIST IS MUCH 4240 * THE SAME AS A GRAPHICS 8 DL 4250 * EXCEPT THERE ARE DLI'S ON 4260 * EVERY LINE, INCL THE LAST 4270 * BLANK SCAN LINE AT TOP OF THE 4280 * SCREEN 4290 LDA #112 ;CMD, 8 BLNK LNS 4300 NXTBNK 4310 STA (YBYT),Y 4320 INY 4330 CPY #3 4340 BNE NXTBNK 4350 LDA #$90 ;8 BLNKS+DLI 4360 STA (YBYT),Y 4370 LDA #$CF ;MODE 15+DLI+LMS 4380 INY ;Y=4 4390 STA (YBYT),Y 4400 LDA #0 ;LO-BYTE, SCRN 4410 INY ;Y=5 4420 STA (YBYT),Y 4430 STA SCREEN 4440 LDX YBYT+1 ;HI-BYTE OF SCRN 4450 INX ;IS RAMTOP-31 4460 TXA 4470 STA SCREEN+1 4480 INY ;Y=6 4490 STA (YBYT),Y 4500 INY ;Y=7 4510 LDA #$8F ;ANTIC 15+DLI 4520 NXANTLN 4530 STA (YBYT),Y 4540 INY 4550 CPY #200 4560 BNE NXANTLN 4570 LDY #102 ;102TH BYTE, DL 4580 LDA #$CF ;MODE 15+DLI+LMS 4590 STA (YBYT),Y 4600 LDA #0 ;ADR OF 2ND HALF 4610 INY ;OF SCRN IS: 4620 STA (YBYT),Y 4630 LDA RAMTOP ;(RAMTOP-16)*256 4640 SEC 4650 SBC #16 4660 INY ;Y=104 4670 STA (YBYT),Y 4680 LDY #200 4690 LDA #65 4700 STA (YBYT),Y 4710 INY ;Y=201 4720 LDA #0 ;LO-BYTE, ADR DL 4730 STA (YBYT),Y 4740 INY ;Y=202 4750 LDA YBYT+1 ;HI-BYTE, ADR DL 4760 STA (YBYT),Y 4770 * CLEAR OUT SCREEN MEMORY 4780 CLRSCR 4790 LDA SCREEN 4800 STA ZTEMP 4810 LDA SCREEN+1 4820 STA ZTEMP+1 4830 CLC 4840 ADC #30 ;LAST PAGE OF 4850 STA TMP1 ;MEM TO CLEAR+1 4860 SPAGE 4870 LDY #0 4880 TYA ;A=0 4890 ZERSB 4900 STA (ZTEMP),Y 4910 DEY 4920 BNE ZERSB 4930 INC ZTEMP+1 4940 LDA ZTEMP+1 4950 CMP TMP1 ;END? 4960 BCC SPAGE ;NOPE 4970 * INITIALIZE THE TABLE 4980 * OF ADDRESSES THAT POINT TO THE 4990 * 96 APAC SCREEN LINES 5000 LDA SCREEN+1 5010 STA ZTEMP+1 ;HI-BYTE 5020 LDY #$00 5030 NXTLN80 5040 LDA ZTEMP ;SAVE LO 5050 STA SCRALO,Y 5060 LDA ZTEMP+1 ;SAVE HI 5070 STA SCRAHI,Y 5080 CLC 5090 LDA ZTEMP 5100 ADC #80 ;80 BYTES PER 5110 STA ZTEMP ;APAC LINE 5120 BCC NXTY 5130 INC ZTEMP+1 5140 NXTY 5150 INY 5160 CPY #96 ;96 LINES TO DO 5170 BNE NXTLN80 5180 LDA VVBLKI ;SAVE THE OS VBI 5190 STA SAVVBI 5200 LDA VVBLKI+1 5210 STA SAVVBI+1 5220 * POINT TO THE APAC IMM VBI 5230 LDA #6 ;STAGE 1 VBI 5240 LDX # >IVBI ;HI-BYTE 5250 LDY # <IVBI ;LO-BYTE 5260 JSR SETVBV ;SET IT 5270 * POINT TO THE FIRST DLI 5280 LDA # <DLI1 5290 STA VDSLST 5300 LDA # >DLI1 5310 STA VDSLST+1 5320 LDA #$40 ;GRAPHICS 9 5330 STA GPRIOR 5340 LDA #$C0 ;ALL INTERRUPTS 5350 STA NMIEN 5360 LDA #34 5370 STA SDMCTL ;SCREEN ON 5380 LEAVE 5390 RTS 5400 ****************************** 5410 * THE RESET HANDLER: 5420 * THE JSR $FFFF WILL POINT TO 5430 * DOS AFTER LOADING APAC 5440 * (SEE SYSSET, BELOW) 5450 * 5460 WRMSTRT 5470 JSR $FFFF 5480 * POINT THE OS RESET VECTORS 5490 * TO WRMSTRT 5500 SETVEC 5510 LDA # <WRMSTRT ;LO-BYTE 5520 STA DOSINI 5530 STA CASINI 5540 LDA # >WRMSTRT ;HI-BYTE 5550 STA DOSINI+1 5560 STA CASINI+1 5570 * GO SET THE LOMEM POINTERS 5580 JMP SETMEM 5590 ****************************** 5600 * MAKE SURE X<80 AND Y<96 5610 * 5620 BOUNDCK 5630 CPX #80 5640 BCC CKYPOS 5650 BCS ERRBND ;X>79, EXIT APAC 5660 CKYPOS 5670 CPY #96 5680 BCC LEAVE ;ALL'S WELL 5690 ERRBND 5700 PLA ;Y>95, SO PULL 5710 PLA ;JSR TO BOUNDCK 5720 RTS ;EXIT APAC 5730 ****************************** 5740 * PULL OFF EXCESS ARGUMENTS 5750 * 5760 TRAP 5770 TAX 5780 BEQ EXTRAP ;NO ARGS TO PULL 5790 DELARG 5800 PLA ;PULL HI 5810 PLA ;PULL LO 5820 DEX 5830 BNE DELARG ;DO MORE ARGS 5840 EXTRAP 5850 RTS 5860 ****************************** 5870 * APAC'S IMM MODE VBI KEEPS 5880 * EVERYTHING TIMED RIGHT 5890 * 5900 IVBI 5910 PHA ;SAVE ACC. 5920 LDA #$C0 ;ENABLE 5930 STA NMIEN ;ALL INTERRUPTS 5940 LDA # <DLI1 ;POINT TO 5950 STA VDSLST ;FIRST DLI 5960 STA COLOR4 ;BACKGRND=BLACK 5970 PLA ;RESTORE ACC. 5980 JMP SYSVBV ;DO OS IMM VBI 5990 ****************************** 6000 * THE DLI'S TOGGLE- I.E. THEY 6010 * APPEAR EVERY OTHER LINE, 6020 * ALTERNATING GRAPHICS 9 & 11 6030 * 6040 DLI1 6050 PHA ;SAVE ACC. 6060 LDA # <DLI2 6070 STA VDSLST ;POINT TO DLI2 6080 LDA #$40 6090 STA WSYNC 6100 STA PRIOR ;GRAPHICS 9 6110 PLA ;RESTORE ACC. 6120 RTI 6130 DLI2 6140 PHA ;SAVE ACC. 6150 LDA # <DLI1 6160 STA VDSLST ;POINT TO DLI1 6170 LDA #$C0 6180 STA WSYNC 6190 STA PRIOR ;GRAPHICS 11 6200 PLA ;RESTORE ACC. 6210 RTI 6220 ****************************** 6230 SCRALO *= *+96 6240 SCRAHI *= *+96 6250 ENDAPAC = * 6260 ****************************** 6270 * SYSSET INITIALIZES WRMSTRT 6280 * (POINTS A JSR THERE TO DOS) 6290 * ALSO JSR'S TO SETVEC 6300 * WHICH INITS APAC'S RESET TRAP 6310 * AND SELF-PROTECTION 6320 * 6330 *= $4000 6340 SYSSET 6350 LDA DOSINI ;MODIFY CODE 6360 STA WRMSTRT+1 ; IN SUBR 6370 LDA DOSINI+1 ; WARMSTRT 6380 STA WRMSTRT+2 6390 JSR SETVEC 6400 LDA TRAMSZ ;IF 1, CART IN 6410 BNE GOCART 6420 RTS ;(NO CARTRIDGE) 6430 GOCART 6440 LDA #0 6450 STA WARMST ;DO A WARMSTART 6460 JMP $A000 ;TO CARTRIDGE
10 **************************** 20 * APAC KAL DEMO, V2.0 * 30 * CREATED BY THOMAS TANIDA * 40 * FIRST STARTED: 1/31/87 * 50 * LAST REVISED: 2/7/87 * 60 **************************** 70 *= $6000 80 .OPT NO EJECT 90 .TAB 8,12,30 0100 ******************************** 0110 ZTEMP = $80 0120 DLE = $82 0130 COLOR = $84 0140 COORDS = $85 0150 DLTX = $89 0160 OFFX = $8D 0170 PNTPOS = $96 0180 TEMP = $A0 0190 STORE = $B0 0200 * 0210 * SYSTEM EQUATES 0220 * 0230 KEYDEL = $02F1 ;753 0240 KEYPRS = $02FC ;754 0250 CONSOL = $D01F ;53279 0260 RANDOM = $D20A ;53770 0270 * 0280 * APAC SYS EQUATES 0290 * 0300 APACPLOT = $230C 0310 APACDRAW = $230F 0320 APACEXIT = $2312 0330 APACINIT = $2315 0340 * 0350 ******************************** 0360 STARTUP 0370 JSR APACINIT ;SET UP APAC 0380 LDX #39 ;INIT VARS 0390 STX OFFX ;OFFSETS 0400 STX OFFX+1 0410 INX 0420 STX OFFX+3 0430 * 0440 LDA #$00 ;ZERO OUT 0450 LDX #$08 ;$A5-$AC 0460 INT0 0470 STA COORDS-1,X 0480 DEX 0490 BNE INT0 0500 STA COLOR ;1ST COLOR=BLACK 0510 LOOP 0520 LDA #$FF ;CLEAR KEYBD REG 0530 STA KEYPRS 0540 JSR POSSET ;LINE 1 0550 JSR POSSET ;LINE 2 0560 LDA RANDOM ;GET A RAND # 0570 AND #$1F ;FROM 0-31 0580 BNE GOMOV ;31 IN 32 0590 JSR DIRSET ;1 IN 32 0600 GOMOV 0610 JSR MAKMOV 0620 INC COLOR ;CHANGE COLOR 0630 LDA CONSOL ;GET CONSOLE KEY 0640 CMP #6 ;START PRESSED? 0650 BEQ STARTUP ;YEP- CLEAR SCR 0660 LDA KEYPRS ;GET KEY 0670 CMP #33 ;SPACE PRESSED? 0680 BEQ PAUSE ;YEP- PAUSE 0690 CMP #28 ;ESC PRESSED? 0700 BNE LOOP ;NO- MAIN LOOP 0710 JMP APACEXIT 0720 ******************************** 0730 PAUSE 0740 LDA KEYDEL ;WAIT FOR KEY 0750 BNE PAUSE ;TO BE RELEASED 0760 LDA #$FF ;CLEAR KEYBD 0770 STA KEYPRS 0780 GETSPC 0790 LDA KEYPRS ;GET KEYCODE 0800 CMP #33 ;SPACE? 0810 BNE GETSPC ;WAIT FOR SPACE 0820 JMP LOOP ;BACK TO MAIN 0830 ******************************** 0840 POSSET 0850 LDX #2 0860 NXP2 0870 LDA COORDS+1,X ;ROTATE X2,Y2 0880 JSR SUB256 0890 STA COORDS+1,X 0900 DEX 0910 BNE NXP2 0920 JSR PNTSCR 0930 * 0940 LDX #2 0950 NXP1 0960 LDA COORDS-1,X ;ROTATE X1,Y1 0970 JSR SUB256 0980 STA COORDS-1,X 0990 DEX 1000 BNE NXP1 1010 JMP PNTSCR 1020 ******************************** 1030 SUB256 1040 EOR #$FF ;ACC=256-ACC 1050 CLC 1060 ADC #1 1070 RTS 1080 ******************************** 1090 * DIRSET CHANGES THE DIRECTION 1100 * OF THE MOVEMENT OF LINES YOU 1110 * SEE. OTHERWISE, THE KAL WOULD 1120 * BE REPETITIVE AND BORING. 1130 * 1140 DIRSET 1150 LDX #4 1160 GETPLM 1170 LDA RANDOM ;GET A RANDOM # 1180 AND #$03 ;FROM 0-3 1190 BEQ GETPLM ;BUT NOT 0 1200 SEC ;MAKE IT -1,0,1 1210 SBC #2 1220 STA DLTX-1,X ;SAVE IT 1230 DEX ;4 TIMES 1240 BNE GETPLM 1250 RTS 1260 ******************************** 1270 MAKMOV 1280 LDX #4 1290 NXTPSX 1300 LDA COORDS-1,X ;GET COORD 1310 CLC 1320 ADC DLTX-1,X ;ADD -1,0 OR 1 1330 * ESSENTIALLY THESE NEXT FEW 1340 * LINES DO A "ACC MOD 40" 1350 * BY SUBTRACTING 40 EACH TIME 1360 * ACC>=40 UNTIL ACC<40 1370 * 1380 * THE PURPOSE IS TO MAKE SURE 1390 * THE COORDS DON'T GO OUTSIDE 1400 * SCREEN LIMITS (THERE ARE 4 1410 * QUADRANTS 40 BY 40) 1420 MOD40 1430 CMP #40 1440 BCC LT40 ;LESS THAN 40 1450 SEC 1460 SBC #40 ;A=A-40 1470 BCS MOD40 ;GO BACK 1480 LT40 1490 STA COORDS-1,X ;SAVE IT BACK 1500 DEX 1510 BNE NXTPSX ;NEXT POSITION 1520 RTS 1530 ******************************** 1540 PNTSCR 1550 LDY #4 1560 NXPERM 1570 LDX OFOFF-1,Y ;ALTERNATE 1580 LDA COORDS-1,Y ;THE COORDS 1590 CLC ;PLOTTED 1600 ADC OFFX,X ;TO REFLECT 1610 LDX PNTOFF-1,Y ;IN EACH 1620 STA PNTPOS,X ;PART OF THE 1630 DEY ;SCREEN 1640 BNE NXPERM 1650 JSR PUTONSCR ;DRAW ON SCR 1660 * 1670 LDY #4 ;SAME AS ABOVE 1680 NXCOMB 1690 LDX OFOFF+1,Y ;SEE END OF 1700 LDA COORDS-1,Y ;KAL FOR THE 1710 CLC ;REARRANGEMENT 1720 ADC OFFX,X ;OF THE COORDS 1730 LDX PNTOFF+1,Y 1740 STA PNTPOS,X 1750 DEY 1760 BNE NXCOMB 1770 * (FALLS THROUGH TO BELOW) 1780 ******************************** 1790 PUTONSCR 1800 LDA COLOR ;GET COLOR 1810 LDX PNTPOS ;X-POS 1820 LDY PNTPOS+1 ;Y-POS 1830 JSR APACPLOT ;PLOT X1,Y1 1840 LDA COLOR ;GET COLOR 1850 LDX PNTPOS+2 ;DEST X-POS 1860 LDY PNTPOS+3 ;DEST Y-POS 1870 JSR APACDRAW ;DRAWTO X2,Y2 1880 * 1890 LDA COLOR ;GET COLOR 1900 LDX PNTPOS+1 ;X-POS 1910 LDY PNTPOS+2 ;Y-POS 1920 JSR APACPLOT ;PLOT Y1,X2 1930 LDA COLOR ;GET COLOR 1940 LDX PNTPOS ;DEST X-POS 1950 LDY PNTPOS+3 ;DEST Y-POS 1960 JMP APACDRAW ;DRAWTO X1,Y2 1970 ******************************** 1980 OFOFF .BYTE 0,0,1,1,0,0 1990 PNTOFF .BYTE 0,2,1,3,0,2