Graphics 10/7 Painter Assembly Source


The article describing this program appears on a separate page.

Assembly Listing

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.
Transfer Program

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 ;

Previous | Contents | Next

Original text copyright 1984 by ANALOG Computing. Reprinted with permission by the Digital ANALOG Archive.