1000 ;--------------- PRANTIC by Claus Buchholz, 1983 1010 IOCB=3 1020 ICCMD=$342 1030 ICBAL=$344 1040 ICAX1=$34A 1050 CIOV=$E456 1060 ICBLL=$348 1070 DLLCZ=$CC ; Display List Location Counter 1080 DDLCZ=$CE ; Display Data Location Counter 1090 ADDRZ=$D0 ; Zero page temporary 1100 USR=$D4 1110 *=$2000 1380 ;--------------- ENTRY POINT FOR SCREEN DUMP 1390 ENTRY PLA 1400 LDX #IOCB*$10 1410 LDA #$C ; Close IOCB 1420 STA ICCMD,X 1430 JSR CIOV 1440 LDA $22F ; DMA Control Register 1450 AND #3 1460 BNE *+3 1470 RTS ; Return if DMA off 1480 LDA #3 ; Open P: 1490 STA ICCMD,X 1500 LDA #FSPEC&$FF 1510 STA ICBAL,X 1520 LDA #FSPEC/$100 1530 STA ICBAL+1,X 1540 LDA #8 1550 STA ICAX1,X 1560 LDA #0 1570 STA ICAX1+1,X 1580 JSR CIOV 1590 LDA #$B ; Set up IOCB for printing 1600 STA ICCMD,X 1610 LDA #OUTSTR&$FF 1620 STA ICBAL,X 1630 LDA #OUTSTR/$100 1640 STA ICBAL+1,X 1690 LDX #0 ; Zero buffer 1700 TXA 1710 CLRLPA STA BUFFER,X 1711 STA BUFFER+$100,X 1720 INX 1730 BNE CLRLPA 1740 CLRLPB STA BUFFER+$200,X 1750 INX 1760 CPX #640-$200 1770 BNE CLRLPB 1780 STA DONE ; Initialize variables 1790 STA CLOCKS 1800 STA LINES 1810 STA NYB 1820 STA USR 1830 STA USR+1 1840 LDA #1 1850 STA HCLOK 1860 LDX #0 1870 L1040 LDA $2C0,X 1880 AND #$F ; Set gray levels from color registers 1890 STA PFCOL-4,X 1900 INX 1910 CPX #9 1920 BNE L1040 1930 LDA $230 ; Display list address 1940 STA DLLCZ 1950 LDA $231 1960 STA DLLCZ+1 1970 LDY #0 1980 L1095 LDA (DLLCZ),Y 1990 AND #$0F 2000 BNE L1096 ; Skip blank scan lines 2010 INY 2020 BNE L1095 2030 L1096 CLC 2040 TYA 2050 ADC DLLCZ ; Adjust dlist pointer 2060 STA DLLCZ 2070 LDA #0 2080 ADC DLLCZ+1 2090 STA DLLCZ+1 2100 L1100 LDA DONE 2110 BEQ L1110 ; While not DONE: 2120 JMP L1530 2130 L1110 LDY #0 ; Fetch dlist instruction 2140 LDA (DLLCZ),Y 2150 AND #$F 2160 STA MODE ; bits 0-3 2170 LDA (DLLCZ),Y 2180 LSR A 2190 LSR A 2200 LSR A 2210 LSR A 2220 AND #7 2230 STA INST ; bits 4-6 2240 INC DLLCZ 2250 BNE L1130 2260 INC DLLCZ+1 2270 L1130 LDA MODE 2280 CMP #1 ; Check for jump instruction 2290 BEQ L1160 2300 JMP L1190 2310 L1160 LDA #1 ; If jump, 2320 STA SLIN ; one blank line 2330 LDA INST 2340 AND #4 2350 BEQ L1140 2360 LDA #1 2370 STA DONE ; if end of dlist, done 2380 LDA #4 2390 STA SLIN 2400 L1140 LDY #0 ; set dlist pointer 2410 LDA (DLLCZ),Y 2420 TAX 2430 INY 2440 LDA (DLLCZ),Y 2450 STA DLLCZ+1 2460 STX DLLCZ 2470 LDA #40 ; generate blank line 2480 STA CLOK 2490 LDX #4 2500 STX COL 2510 JSR PIXEL 2511 JSR PIXEL 2520 JSR PIXEL 2521 JSR PIXEL 2530 JMP L1100 ; next instruction 2540 L1190 LDA MODE 2550 BNE L1215 ; Check for blank line instruction 2560 LDA INST ; If blank lines, 2570 AND #3 2580 TAX 2590 INX 2600 STX SLIN ; number of scan lines mod 4 2610 LDA #40 ; generate blank lines 2620 STA CLOK 2630 LDX #4 2640 STX COL 2650 JSR PIXEL 2651 JSR PIXEL 2660 JSR PIXEL 2661 JSR PIXEL 2670 LDA INST 2680 AND #4 2690 BEQ L1195 2700 STA SLIN ; if number>4, generate 4 more 2710 JSR PIXEL 2711 JSR PIXEL 2720 JSR PIXEL 2721 JSR PIXEL 2730 L1195 JMP L1100 ; next instruction 2740 L1215 LDA INST 2750 AND #4 ; Check for Load Memory Scan instruction 2760 BEQ L1220 2770 LDY #0 ; If so, set display data pointer 2780 LDA (DLLCZ),Y 2790 STA DDLCZ 2800 INY 2810 LDA (DLLCZ),Y 2820 STA DDLCZ+1 2830 CLC 2840 LDA #2 ; and adjust dlist pointer 2850 ADC DLLCZ 2860 STA DLLCZ 2870 LDA #0 2880 ADC DLLCZ+1 2890 STA DLLCZ+1 2900 L1220 LDA MODE 2910 AND #8 ; Check for bit-map modes 2920 BNE L1230 2930 JMP L1290 2940 L1230 LDA MODE 2950 AND #7 ; If bit-map, 2960 STA BMODE 2970 TAX ; get parameters 2980 LDA CLOKS,X 2990 STA CLOK 3000 LDA SLINS,X 3010 STA SLIN 3020 JSR DEFCOL ; define colors 3030 JSR WDCORR ; correct for display width 3040 LDA #0 3050 STA I ; for each data byte, 3060 L1250A LDX BMODE 3070 LDA DBYTS,X 3080 CMP I 3090 BEQ L1270 3100 LDY I ; fetch byte 3110 LDA (DDLCZ),Y 3120 STA BYTE 3130 JSR BYTEMAP ; process it 3140 INC I 3150 BNE L1250A ; next data byte 3160 L1270 CLC ; Adjust data pointer, 3170 LDA I 3180 ADC WCORR ; correcting for display width 3190 CLC 3200 ADC DDLCZ 3210 STA DDLCZ 3220 LDA #0 3230 ADC DDLCZ+1 3240 STA DDLCZ+1 3250 JMP L1100 ; next instruction 3260 L1290 SEC ; If character mode, 3270 LDA #10 3280 SBC MODE ; find corresponding bit-map mode 3290 CMP #8 3300 BNE L1290A 3310 LDA #7 3320 L1290A STA BMODE 3330 TAX ; set parameters 3340 LDA CLOKS,X 3350 STA CLOK 3360 LDA SLINS,X 3370 STA SLIN 3380 JSR WDCORR ; width correction 3390 LDA #0 3400 STA J ; for each bit-map mode line, 3410 L1300A LDA J 3420 CMP #8 3430 BEQ JEQ8 3440 CMP #10 3450 BNE L1310 3460 JDUN JMP L1480 3470 JEQ8 LDA MODE 3480 CMP #3 ; 10-line character mode 3490 BNE JDUN 3500 L1310 LDA #0 3510 STA I ; for each character byte, 3520 L1310A LDY BMODE 3530 LDA DBYTS,Y 3540 CMP I 3550 BNE L1320 3560 JMP L1470 3570 L1320 JSR DEFCOL ; define colors 3580 LDY I 3590 LDA (DDLCZ),Y 3600 STA NAME ; character name 3610 LDA MODE 3620 CMP #6 ; check for 64-char mode 3630 BMI L1350 3640 JMP L1420 3650 L1350 CMP #4 ; if 128-char mode, 3660 BPL L1380 ; check for multicolor mode 3670 LDA NAME ; if not, 3680 AND #128 ; process high bit 3690 BEQ L1400 3700 LDA $2F3 ; Character Control Register 3710 AND #2 3720 BEQ L1365 3730 LDA #2 ; reverse video 3740 STA COLS+1 3750 LDA #1 3760 STA COLS+2 3770 L1365 LDA $2F3 3780 AND #1 3790 BEQ L1400 3800 LDA COLS+2 ; blanking 3810 STA COLS+1 3820 JMP L1400 3830 L1380 LDA NAME ; if multicolor mode, 3840 AND #128 ; process high bit 3850 BEQ L1400 3860 LDA #3 3870 STA COLS+2 3880 L1400 LDA $2F4 ; Character Base Register 3890 AND #$FC ; find char data address 3900 STA ADDRZ+1 3910 LDA NAME 3920 ASL A 3930 ASL A 3940 ASL A 3950 STA ADDRZ 3960 LDA J 3970 AND #7 3980 ORA ADDRZ 3990 STA ADDRZ 4000 LDA NAME 4010 LSR A 4020 LSR A 4030 LSR A 4040 LSR A 4050 LSR A 4060 AND #3 4070 ORA ADDRZ+1 4080 STA ADDRZ+1 4090 JMP L1450 4100 L1420 LDA NAME ; if 64-char mode, 4110 LSR A ; find char color 4120 LSR A 4130 LSR A 4140 LSR A 4150 LSR A 4160 LSR A 4170 STA COLS 4180 LDA NAME 4190 ASL A ; find char data address 4200 ASL A 4210 ASL A 4220 ORA J 4230 STA ADDRZ 4240 LDA $2F4 ; Character Base Register 4250 AND #$FE 4260 ADC #0 4270 STA ADDRZ+1 4280 L1450 LDA $2F3 ; Character Control Register 4290 AND #4 ; check for upside down char 4300 BEQ L1450A 4310 LDA ADDRZ 4320 EOR #7 4330 STA ADDRZ 4340 L1450A LDY #0 ; fetch data byte 4350 LDA (ADDRZ),Y 4360 STA BYTE 4370 LDA MODE 4380 CMP #3 4390 BNE L1459 4400 LDA J ; descenders mode 4410 CMP #2 4420 BPL L1452 4430 LDA NAME 4440 AND #$60 4450 CMP #$60 4460 BNE L1459 4470 L1451 LDA #0 4480 STA BYTE 4490 JMP L1459 4500 L1452 CMP #8 4510 BMI L1459 4520 LDA NAME 4530 AND #$60 4540 CMP #$60 4550 BNE L1451 4560 L1459 JSR BYTEMAP ; process byte 4570 INC I ; next data byte 4580 JMP L1310A 4590 L1470 INC J ; next mode line 4600 JMP L1300A 4610 L1480 CLC ; adjust data pointer 4620 LDA I 4630 ADC WCORR ; width correction 4640 CLC 4650 ADC DDLCZ 4660 STA DDLCZ 4670 LDA #0 4680 ADC DDLCZ+1 4690 STA DDLCZ+1 4700 JMP L1100 ; next instruction 4710 L1530 LDX #IOCB*$10 ; Done! 4720 LDA #36 ; Final printing 4730 STA OUTSTR+3 4740 LDA #4 4750 STA ICBLL,X 4760 LDA #0 4770 STA ICBLL+1,X 4780 JSR CIOV 4790 LDA #$C ; Close IOCB 4800 STA ICCMD,X 4810 JSR CIOV 4820 RTS ; Return to caller 4829 ;--------------- SUBROUTINE TO INITIALIZE COLOR REGISTER POINTERS 4830 DEFCOL LDX #4 4840 DEFLUP TXA 4850 STA COLS,X 4860 DEX 4870 BPL DEFLUP 4880 RTS 4889 ;--------------- SUBROUTINE FOR WIDTH CORRECTION 4890 WDCORR LDX BMODE 4900 LDY DBYTS,X ; Get # data bytes per line 4910 DEY 4920 TYA 4930 LSR A 4940 LSR A 4950 LSR A ; Divide by 10 4960 STA WCORR 4970 LDA $22F ; DMA Control Register 4980 AND #3 ; Display width 4990 STA I 5000 LDA INST 5010 AND #1 ; Correct for horizontal scroll 5020 CLC 5030 ADC I 5040 CMP #2 5050 BEQ CORR2 5060 BPL CORR3 5070 SEC ; Narrow width, negative correction 5080 LDA DDLCZ 5090 SBC WCORR 5100 STA DDLCZ 5110 LDA DDLCZ+1 5120 SBC #0 5130 STA DDLCZ+1 5140 CLC 5150 LDA WCORR 5160 EOR #$FF 5170 ADC #1 5180 STA WCORR 5190 RTS 5200 CORR2 LDA #0 ; Standard width, no correction 5210 STA WCORR 5220 RTS 5230 CORR3 CLC ; Wide, positive correction 5240 LDA DDLCZ 5250 ADC WCORR 5260 STA DDLCZ 5270 LDA DDLCZ+1 5280 ADC #0 5290 STA DDLCZ+1 5300 RTS 5309 ;--------------- SUBROUTINE FOR MAPPING DISPLAY DATA BYTE 5310 BYTEMAP LDX BMODE 5320 LDA DBITS,X ; Get # bits per pixel 5330 STA BITS 5340 TAX 5350 LDA #4 5360 CPX #1 5370 BNE KISOK 5380 ASL A 5390 KISOK STA K ; For each pixel in byte, 5400 L2020 LDA BYTE 5410 ASL A ; rotate pixel into X 5420 TAY 5430 LDA #0 5440 ROL A 5450 TAX 5460 LDA BITS 5470 CMP #1 5480 BEQ PISOK 5490 TYA 5500 ASL A 5510 TAY 5520 TXA 5530 ROL A 5540 TAX 5550 PISOK STY BYTE 5560 LDA BMODE 5570 CMP #7 5580 BNE L2040 5590 TXA ; monochrome mode correction 5600 EOR #3 5610 TAX 5620 L2040 CPX #0 ; background color? 5630 BNE L2050 5640 LDX #5 5650 L2050 DEX ; color reg # is pixel data - 1 5660 LDA COLS,X 5670 STA COL 5680 JSR PIXEL ; generate pixel 5690 DEC K ; next pixel 5700 BNE L2020 5710 RTS 5719 ;--------------- SUBROUTINE TO GENERATE A PIXEL 5720 PIXEL LDA CLOCKS 5730 CMP #160 ; Mode line length so far 5740 BNE L3010A 5750 LDA #0 ; If end of mode line: 5760 STA CLOCKS 5770 LDA LINES ; Mode line height 5780 CLC 5790 ADC SLIN 5800 CMP #5 ; Does next mode line fit in buffer? 5810 BMI L3010A 5820 LDA LINES ; No, so print buffer 5830 ASL A 5831 ADC LINES 5832 ASL A 5840 STA OUTSTR+3 ; Set vertical spacing 5841 CMP #24 5842 BNE *+5 5843 DEC OUTSTR+3 5850 JSR SHBUF ; Prepare buffer 5860 JSR CIOV ; Print it 5870 LDA OLDMD 5880 BNE DNPRT 5890 JSR CIOV ; Repeat for ANTIC mode 8 5900 DNPRT LDX #0 ; Zero buffer 5910 TXA 5920 CLRLP1 STA BUFFER,X 5921 STA BUFFER+$100,X 5930 INX 5940 BNE CLRLP1 5950 CLRLP2 STA BUFFER+$200,X 5960 INX 5970 CPX #640-$200 5980 BNE CLRLP2 5990 CLC 6000 LDA LINES 6010 ADC USR ; Update scan line count 6020 STA USR 6030 LDA #0 6040 STA LINES 6050 L3010A LDA CLOCKS 6060 BNE L3040 ; Check for beginning of line 6070 LDA HCLOK 6080 BEQ L3040 6090 LDX SLIN 6100 LDA #0 6110 L3010B SEC ; If beginning, 6120 ROL A ; form bit mask 6130 SEC 6140 ROL A 6150 DEX 6160 BNE L3010B 6170 TAY 6180 LDA #4 6190 SEC 6200 SBC LINES 6210 SBC SLIN 6220 TAX 6230 TYA 6240 CPX #0 6250 BEQ L3010C 6260 L3010D CLC ; shift into position 6270 ROL A 6280 ROL A 6290 DEX 6300 BNE L3010D 6310 L3010C STA MASK ; and save 6320 CLC 6330 LDA SLIN 6340 ADC LINES ; update buffer scan line count 6350 STA LINES 6360 LDA BMODE 6370 STA OLDMD 6380 LDA #1 ; init half-clock counter (1 bit) 6390 STA HCLOK 6400 L3040 LDA CLOK ; If half-clock pixel, 6410 BNE L3040A 6420 LDA HCLOK 6430 EOR #1 ; inc half-clock counter 6440 STA HCLOK 6450 L3040A TAX 6460 LDA $26F ; Check GPRIOR for GTIA modes 6470 AND #$C0 6480 BEQ *+5 6490 JMP GMODES ; Branch if GTIA mode 6500 JSR BP2C ; Find buffer address of pixel 6510 LDX COL 6520 LDA PFCOL,X ; Get gray level of pixel 6525 LSR A 6526 TAY 6530 LDX EIGHT,Y ; Adjust range for pure blacks and whites 6540 LDA CLOK 6550 BEQ HAFPUT ; Check pixel size 6560 STA N ; If >=1 clock, 6570 LDY #0 6580 PUTLUP LDA DOT,X ; get 4-byte gray level dot pattern 6590 AND MASK ; mask it 6600 ORA (ADDRZ),Y ; put into buffer 6610 STA (ADDRZ),Y 6620 INY 6630 LDA DOT+$10,X 6640 AND MASK 6650 ORA (ADDRZ),Y 6660 STA (ADDRZ),Y 6670 INY 6680 LDA DOT+$20,X 6690 AND MASK 6700 ORA (ADDRZ),Y 6710 STA (ADDRZ),Y 6720 INY 6721 LDA DOT+$30,X 6722 AND MASK 6723 ORA (ADDRZ),Y 6724 STA (ADDRZ),Y 6725 INY 6730 DEC N 6740 BNE PUTLUP ; repeat for each clock 6750 RTS 6760 HAFPUT LDY #2 6761 LDA HCLOK ; If half-clock pixel, 6770 BNE SECHAF 6780 LDY #0 ; if HCLOK=0, do first half 6790 LDA DOT,X 6800 AND MASK 6810 ORA (ADDRZ),Y 6820 STA (ADDRZ),Y 6840 INY 6850 LDA DOT+$10,X 6860 AND MASK 6870 ORA (ADDRZ),Y 6880 STA (ADDRZ),Y 6890 RTS 6900 SECHAF LDA DOT+$20,X ; if HCLOK=1, do second half 6910 AND MASK 6920 ORA (ADDRZ),Y 6930 STA (ADDRZ),Y 6931 INY 6932 LDA DOT+$30,X 6933 AND MASK 6934 ORA (ADDRZ),Y 6935 STA (ADDRZ),Y 6940 RTS 6950 GMODES CPX #2 ; GTIA modes: 6960 BCS GPIX ; Check pixel size 6970 LDA CLOCKS ; If <2 clocks, 6980 AND #1 ; build color nybble 6990 BEQ GM1 7000 LDA COL 7010 AND #3 7020 BPL GM2 7030 GM1 LDA COL 7040 AND #3 7050 ASL A 7060 ASL A 7070 GM2 LDY CLOK 7080 BNE *+4 7090 AND #5 7100 LDY HCLOK 7110 BNE *+3 7120 ASL A 7130 ORA NYB 7140 STA NYB 7150 CLC 7160 TXA 7170 ADC CLOCKS ; update CLOCKS 7180 STA CLOCKS 7190 AND #1 7200 BEQ *+3 7210 RTS ; return if nybble not complete 7220 LDA HCLOK 7230 BNE *+3 7240 RTS 7250 LDA CLOCKS ; if nybble complete, do a 2-clock pixel 7260 SEC 7270 SBC #2 7280 STA CLOCKS 7290 LDX #2 7300 BNE GPUT 7310 GPIX LDA COL ; If pixel >=2 clocks, build nybble 7320 AND #3 7330 STA NYB 7340 ASL A 7350 ASL A 7360 ORA NYB 7370 STA NYB 7380 GPUT JSR BP2C ; Find buffer address for pixel 7410 STX N 7420 LDA $26F ; GPRIOR 7430 AND #$C0 ; Check GTIA mode 7440 CMP #$40 7450 BNE GM3 7460 LDA NYB ; Luminance mode: 7470 ORA PFCOL+4 ; Or with background luma 7475 TAX 7480 JMP GM6 7490 GM3 CMP #$80 7500 BNE GM4 7510 LDA NYB ; Indirection mode (slightly inaccurate): 7520 AND #$C 7530 CMP #8 7540 BEQ GM3A 7550 LDA NYB 7560 AND #7 7570 GM3A TAX 7580 LDA PFCOL-4,X ; Select color 7590 JMP GM5 7600 GM4 LDA NYB ; Chrominance mode: 7610 BEQ GM5 ; If zero data, zero luma 7620 LDA PFCOL+4 7630 GM5 LSR A 7631 TAY 7635 LDX EIGHT,Y ; Luminance (gray level) 7640 GM6 LDY #0 7650 STY NYB ; Reset NYB 7660 GPTLP LDA DOT,X ; Put 4-byte dot pattern into buffer 7670 AND MASK 7680 ORA (ADDRZ),Y 7690 STA (ADDRZ),Y 7700 INY 7710 LDA DOT+$10,X 7720 AND MASK 7730 ORA (ADDRZ),Y 7740 STA (ADDRZ),Y 7750 INY 7760 LDA DOT+$20,X 7770 AND MASK 7780 ORA (ADDRZ),Y 7790 STA (ADDRZ),Y 7800 INY 7810 LDA DOT+$30,X 7820 AND MASK 7830 ORA (ADDRZ),Y 7840 STA (ADDRZ),Y 7850 INY 7960 DEC N 7970 BNE GPTLP ; Repeat for each clock pair 7980 RTS 7989 ;--------------- SUBROUTINE TO FIND BUFFER ADDRESS FOR A PIXEL 7990 BP2C LDA CLOCKS 8010 ASL A ; Multiply CLOCKS by 4 8020 STA ADDRZ 8030 LDA #0 8040 ADC #0 8050 STA ADDRZ+1 8121 LDA ADDRZ 8122 ASL A 8123 STA ADDRZ 8124 LDA ADDRZ+1 8125 ROL A 8126 STA ADDRZ+1 8130 CLC ; and add to BUFFER 8140 LDA #BUFFER&$FF 8150 ADC ADDRZ 8160 STA ADDRZ 8170 LDA #BUFFER/$100 8180 ADC ADDRZ+1 8190 STA ADDRZ+1 8200 CLC 8210 TXA 8220 ADC CLOCKS 8230 STA CLOCKS 8240 RTS 8249 ;--------------- SUBROUTINE TO PREPARE BUFFER FOR PRINTING 8250 SHBUF LDX #0 8260 CHKCR1 LDA BUFFER,X 8270 CMP #$9B ; Weed out carriage returns 8280 BNE *+5 8290 DEC BUFFER,X 8291 LDA BUFFER+$100,X 8292 CMP #$9B 8293 BNE *+5 8294 DEC BUFFER+$100,X 8300 INX 8310 BNE CHKCR1 8320 CHKCR2 LDA BUFFER+$200,X 8330 CMP #$9B 8340 BNE *+5 8350 DEC BUFFER+$200,X 8360 INX 8370 CPX #640-$200 8380 BNE CHKCR2 8390 LDA $22F ; DMA Control Register 8400 AND #3 ; Check screen width 8410 CMP #1 8420 BNE NORMWD 8430 LDX #63 ; If narrow, blank the edges 8440 LDA #0 8450 NARROW STA BUFFER,X 8460 STA END-64,X 8470 DEX 8480 BPL NARROW 8490 NORMWD LDA #END&$FF 8500 STA ADDRZ ; Find last non-zero byte in buffer 8510 LDA #END/$100-1 8520 STA ADDRZ+1 8530 LDY #$FF 8540 ZSRLPA LDA (ADDRZ),Y 8550 BNE NONZER 8560 DEY 8561 CPY #$FF 8570 BNE ZSRLPA 8571 DEC ADDRZ+1 8572 LDA ADDRZ+1 8573 CMP #END/$100-3 8574 BNE ZSRLPA 8580 LDA #BUFFER&$FF 8590 STA ADDRZ 8600 LDA #BUFFER/$100 8610 STA ADDRZ+1 8620 LDY #$7F 8630 ZSRLPB LDA (ADDRZ),Y 8640 BNE NONZER 8650 DEY 8660 BNE ZSRLPB 8670 NONZER CLC ; Find buffer length 8680 TYA 8690 ADC ADDRZ 8700 STA ADDRZ 8710 LDA #0 8720 ADC ADDRZ+1 8730 STA ADDRZ+1 8740 SEC 8750 LDA ADDRZ 8760 SBC #BUFFER&$FF 8770 STA ADDRZ 8780 LDA ADDRZ+1 8790 SBC #BUFFER/$100 8800 STA ADDRZ+1 8810 LDA ADDRZ 8820 CMP #$9A ; Eliminate possible carriage return 8830 BNE NCARET 8840 INC ADDRZ 8850 NCARET CLC ; Specify length 8860 LDA ADDRZ 8870 ADC #1 8880 STA OUTSTR+11 8890 LDA ADDRZ+1 8900 ADC #0 8910 STA OUTSTR+12 8920 LDX #IOCB*$10 8930 CLC 8940 LDA ADDRZ 8950 ADC #14 8960 STA ICBLL,X 8970 LDA ADDRZ+1 8980 ADC #0 8990 STA ICBLL+1,X 9000 RTS 9009 ;--------------- PROGRAM CONSTANTS 9010 FSPEC .BYTE "P:",$9B ; Printer filespec 9020 CLOKS .BYTE 4,2,2,1,1,1,1,0 ; Table: clocks per pixel 9030 SLINS .BYTE 4,4,4,2,1,2,1,1 ; Table: scan lines per pixel 9040 DBYTS .BYTE 10,10,20,20,20,40,40,40 ; Table: data bytes per mode line 9050 DBITS .BYTE 2,1,2,1,1,2,2,1 ; Table: data bits per pixel 9060 DOT .BYTE $FF,$FF,$EE,$AA,$AA,$AA,$AA,$AA ; Dot patterns matrix 9070 .BYTE $AA,$22,0,0,0,0,0,0 9100 .BYTE $FF,$FF,$FF,$FF,$FF,$77,$55,$55 9110 .BYTE $55,$55,$55,$55,$44,$44,$44,0 9140 .BYTE $FF,$BB,$BB,$BB,$AA,$AA,$AA,$AA 9150 .BYTE $88,$88,$88,0,0,0,0,0 9160 .BYTE $FF,$FF,$FF,$FF,$FF,$DD,$DD,$55 9170 .BYTE $55,$55,$55,$55,$55,$11,0,0 9175 EIGHT .BYTE 0,2,4,7,9,11,13,15 ; Table: 8 lumas with pure black and white 9179 ;--------------- PROGRAM VARIABLES 9180 *=*+4 ; Color registers 9190 PFCOL *=*+5 9200 COLS *=*+5 ; Color reg pointer table 9210 DONE *=*+1 ; Done flag 9220 MODE *=*+1 ; Current ANTIC mode 9230 INST *=*+1 ; ANTIC instruction bits 4-6 9240 SLIN *=*+1 ; Height of current pixel (scan lines) 9250 CLOK *=*+1 ; Width of current pixel (color clocks) 9260 N *=*+1 ; Loop variable in PIXEL 9270 COL *=*+1 ; Color reg pointer for current pixel 9280 BMODE *=*+1 ; Current bit-map mode 9290 OLDMD *=*+1 ; Last bit-map mode 9300 I *=*+1 ; Loop index 9310 BYTE *=*+1 ; Current data byte 9320 J *=*+1 ; Loop index 9330 NAME *=*+1 ; Current character name 9340 BITS *=*+1 ; Bits per pixel in BYTEMAP 9350 K *=*+1 ; Loop index in BYTEMAP 9360 CLOCKS *=*+1 ; Cumulative # of color clocks in mode line 9370 LINES *=*+1 ; Cumulative # of scan lines in buffer 9380 MASK *=*+1 ; Bit mask for building the buffer 9390 HCLOK *=*+1 ; Half-clock 1-bit counter 9400 NYB *=*+1 ; Data nybble for GTIA modes 9410 WCORR *=*+1 ; Correction to data pointer for display width 9419 ;--------------- PRINT BUFFER 9420 OUTSTR .BYTE $9B,$1B,$33,$24 ; Graftrax command string 9425 .BYTE " " 9430 .BYTE $1B,$2A,6,640&$FF,640/$100 9440 BUFFER *=*+640 ; Buffer space 9450 END 9900 *=$2E7 9910 .WORD END ; Set MEMLO