The article describing this program appears on a separate page.
PAINTER1.ASM is available in ATASCII format.
0100 ; FILL ROUTINE USING CIO
0110 ;
0120 ; CIO EQUATES USED
0130 ;
0140 CIO = $E456
0150 ICCOM = $0342
0160 ICBLEN = $0348
0170 CGBINR = $07 ; GET BINARY RECORD
0180 CPBINR = $0B ; PUT BINARY RECORD
0190 ;
0200 BUFA = $CB ; ADRESSES FOR IND,Y
0210 BUFB = $CD ; ADDRESSING FOR
0220 BUFC = $CF ; PIXEL COORDINATE
0230 BUFD = $D4 ; STORAGE
0240 ;
0250 XPOS = $55 ; X COORDINATE see OS
0260 YPOS = $54 ; Y COORDINATE " "
0270 ;
0280 COLOR = $D1 ; COLOR TO PLOT
0290 ;
0300 ; THE FOLLOWING LOCATIONS CAN ONLY
0310 ; BE USED TEMPORARILY, BECAUSE THEY
0320 ; ARE RESERVED FOR THE FLOATING POINT
0330 ; ROUTINES.
0340 ;
0350 COLOVER = $E6 ; COLOR TO COVER
0360 COUNTNEW = $E7 ; # NEW PIXELS
0370 COUNTOLD = $E8 ; # PIXELS TO TEST
0380 ; AROUND
0390 XPSTOR = $E9 ; STORE ORIGINAL XPOS
0400 YPSTOR = $EA
0410 XP = $D6 ; X COORDINATE
0420 YP = $D7 ; Y COORDINATE
0430 TEM = $EB ; TO STORE Y INDEX
0440 ;
0450 ; THE FILL ROUTINE USES PAGE 6
0460 ;
0470 *= $0600
0480 ;
0490 PLA
0500 PLA
0510 PLA ; THE COLOR TO PLOT
0520 STA COLOR
0530 LDA $06FE ; BUFD ADDRESS STORED
0540 STA BUFD ; HERE BECAUSE OF THE
0550 LDA $06FF ; LIMITED FREE SPACE
0560 STA BUFD+1 ; IN PAGE 0
0570 ;
0580 LDA #0
0590 STA COUNTNEW ; INITIALIZATION
0600 LDY #1 ; ONE PIXEL FIRST TIME
0610 LDA XPOS ; FROM O.S.
0620 STA (BUFA),Y
0630 STA XPSTOR
0640 STA XP ; FOR THE FIRST LOCATE
0650 LDA YPOS ; FROM O.S.
0660 STA (BUFB),Y
0670 STA YPSTOR
0680 STA YP ; FOR THE FIRST LOCATE
0690 STY COUNTOLD ; ONE PIXEL
0700 JSR LOCATE ; GET COLOR TO COVER
0710 STA COLOVER
0720 CMP COLOR ; ITSELF ?
0730 BNE PRELOOP
0740 RTS ; IF ITSELF QUIT OR GET
0750 ; INFINITE LOOP !
0760 ;
0770 PRELOOP JSR PLOT
0780 LOOP LDA (BUFA),Y
0790 STA XP ; X FOR CURRENT PIXEL
0800 LDA (BUFB),Y
0810 STA YP ; Y FOR CURRENT PIXEL
0820 ;
0830 LOOP0 INC XP ; TEST TO RIGHT
0840 LDA XP
0850 CMP #80 ; RHS LIMIT TO SCREEN
0860 BCS LOOP1
0870 JSR LOCATE ; IF WITHIN SCREEN
0880 ; THEN SEE IF THE PIXEL
0890 ; CONTAINS THE COLOR TO
0900 ; BE OVERWRITTEN. THE
0910 ; LOCATE ROUTINE
0920 ; CONTAINS THE COMPARE.
0930 ;
0940 BNE LOOP1
0950 JSR KEEP ; PLOT IT AND MARK IT
0960 ; FOR ITS OWN TEST
0970 ; NEXT TIME THROUGH THE
0980 ; LIST OF LOCATIONS.
0990 ;
1000 LOOP1 DEC XP
1010 DEC XP
1020 LDA XP
1030 CMP #255 ; CHECK SCREEN LHS
1040 BEQ LOOP2
1050 JSR LOCATE
1060 BNE LOOP2
1070 JSR KEEP
1080 ;
1090 LOOP2 INC XP
1100 INC YP ; TEST BELOW
1110 LDA YP
1120 CMP #80 ; BOTTOM OF SCREEN
1130 BCS LOOP3
1140 JSR LOCATE
1150 BNE LOOP3
1160 JSR KEEP
1170 ;
1180 LOOP3 DEC YP
1190 DEC YP
1200 LDA YP
1210 CMP #255
1220 BEQ LOOP4
1230 JSR LOCATE
1240 BNE LOOP4
1250 JSR KEEP
1260 ;
1270 LOOP4 DEC COUNTOLD
1280 BEQ DONELOOP ; ALL POINTS DONE
1290 INY ; ELSE DO NEXT POINT
1300 JMP LOOP
1310 ;
1320 DONELOOP LDY COUNTNEW
1330 BEQ RETURN0 ; IF NO NEW POINTS
1340 ; IN THE COLOR TO
1350 ; COVER REMAIN
1360 ;
1370 STY COUNTOLD ; THIS BECOMES THE
1380 ; NEW # PIXELS TO
1390 ; PLOT AND TEST
1400 ;
1410 TRANSFER LDA (BUFD),Y
1420 STA (BUFB),Y
1430 LDA (BUFC),Y
1440 STA (BUFA),Y
1450 DEY
1460 BNE TRANSFER ; MOVE BUFFERS
1470 LDY #1
1480 LDA #0
1490 STA COUNTNEW ; INITIALIZE
1500 JMP LOOP ; BEGIN AGAIN
1510 ;
1520 ; THE SUBROUTINES
1530 ;
1540 KEEP JSR PLOT ; Y REG. IN TEM
1550 INC COUNTNEW
1560 BEQ RETURN2 ; BUFFER OVERFLOWS
1570 LDY COUNTNEW
1580 LDA XP ; STORE THE COORD.
1590 STA (BUFC),Y ; OF THIS PIXEL
1600 LDA YP ; FOR PLOTTING AND
1610 STA (BUFD),Y ; TESTING.
1620 LDY TEM ; RECOVER Y REG.
1630 RTS
1640 ;
1650 LOCATE JSR POS
1660 LDA #CGBINR
1670 STA ICCOM,X
1680 JSR CIO ; CIO LOCATE
1690 LDY TEM
1700 CMP COLOVER ; PIXEL IN A REG.
1710 RTS
1720 ;
1730 POS STY TEM
1740 LDA XP
1750 STA XPOS ; POSITION X
1760 LDA YP
1770 STA YPOS ; AND Y
1780 LDX #$60 ; TO USE IN LOCATE
1790 LDA #0 ; AND IN PLOT
1800 STA ICBLEN,X ; ONE PIXEL AS
1810 STA ICBLEN+1,X ; IN ACCUM.
1820 RTS
1830 ;
1840 PLOT JSR POS
1850 LDA #CPBINR
1860 STA ICCOM,X
1870 LDA COLOR ; THE ONE TO PLOT
1880 JSR CIO
1890 LDY TEM
1900 RTS
1910 ;
1920 RETURN0 LDA YPSTOR
1930 STA YPOS
1940 LDA XPSTOR
1950 STA XPOS
1960 RTS
1970 ;
1980 RETURN2 JSR RETURN0
1990 PLA ; WE EXITED A SUBROUTINE
2000 PLA ; SO POP RETURN ADDRESS
2010 RTS ; TO BASIC
2020 ;
2030 ; TO USE FOR ANY GRAPHICS
2040 ; MODE OTHER THAN 8, FIX
2050 ; THE SCREEN LIMIT TESTS.
PAINTER2.ASM is available in ATASCII format.
0100 ; PICTURE TRANSFER
0110 ;
0120 *= $0600
0130 ;
0140 PLA ; TERMS
0150 PLA
0160 STA $0355 ; ICBADR+1+$10
0170 PLA
0180 STA $0354 ; ICBADR+$10
0190 LDA #0
0200 STA $0358
0210 LDA #$20 ; MAX POSSIBLE LENGTH
0220 STA $0359
0230 LDA #7 ; C. GET BIN. REC.
0240 STA $0352
0250 LDX #$10
0260 JSR $3456 ; IGNORE ERRORS
0270 RTS
0280 ;