00001 0000 ; ======================================== 00002 0001 ; PROJECT : HIRES 00003 0001 ; TARGET : COMMODORE 64 00004 0001 ; COMMENTS : A DOWN & DIRTY BITMAP GRAPHICS WEDGE 00005 0001 ; AUTHOR : MICHAEL CASSERA 00006 0001 ; ======================================== 00007 0001 00008 0001 *=$C000 00009 C000 00010 C000 00011 C000 CHROUT = $FFD2 ;OUTPUT ROUTINE 00012 C000 VIC-II = $D018 ;VICII REGISTER 00013 C000 VICBANK = $DD00 ;BANK SELECTOR 00014 C000 BITMAP = $D011 ;BITMAP MODE 00015 C000 ERROR = $A437 ;KERNAL ERROR ROUTINE 00016 C000 SCREEN = $E000 ;GRAPHIC SCREEN START LOCATION 00017 C000 CSCREEN = $CC00 ;COLOR SCREEN START LOCATION 00018 C000 WRETURN = $03FC ;VECTOR TO GIVE CONTROL BACK 00019 C000 ;TO BASIC 00020 C000 QUE1 = $A000 ;QUES USED FOR FILL 00021 C000 QUE2 = $B000 00022 C000 00023 C000 00024 C000 ;START WITH AJUMP TABLE IN CASE YOU DON'T WANT TO USE THE WEDGE: 00025 C000 ;ALSO USE SYS COMMANDS IF YOU WANT TO COMPILE THE BASIC PROGRAM 00026 C000 00027 C000 4C 3A C0 JMP SETUP: ;INSERT THE WEDGE 00028 C003 00029 C003 4C 2C C1 JMP GRAPHIC0: ;TEXT GRAPHICS 00030 C006 00031 C006 4C 45 C1 JMP GRAPHIC1: ;BITMAP GRAPHICS 00032 C009 00033 C009 4C 61 C1 JMP CLEARSCREEN: ;CLEAR SCREEN 00034 C00C 00035 C00C 4C 7A C1 JMP SETCOLOR: ;SET COLOR 00036 C00F 00037 C00F 20 7A C2 JSR PLOT: ;PLOT 00038 C012 4C 38 C5 JMP MAKEPUOLD: 00039 C015 00040 C015 20 D3 C2 JSR UPLOT: ;UPLOT 00041 C018 4C 38 C5 JMP MAKEPUOLD: 00042 C01B 00043 C01B A9 00 LDA #$00 ;DRAW 00044 C01D 8D C1 CB STA DRAW: 00045 C020 4C 0E C3 JMP DRAWTO: 00046 C023 00047 C023 A9 FF LDA #$FF ;UNDRAW 00048 C025 8D C1 CB STA DRAW: 00049 C028 4C 0E C3 JMP DRAWTO: 00050 C02B 00051 C02B 4C 51 C5 JMP FLOODFILL: ;FLOOD FILL 00052 C02E 00053 C02E 4C 69 C6 JMP OUTPUTTEXT: ;OUTPUT CHAR 00054 C031 00055 C031 20 A2 C7 JSR GETX%Y%: ;INFORMATION 00056 C034 4C E3 C6 JMP CHECKBYTE: ;CHECK THE POINT 00057 C037 00058 C037 4C 58 C0 JMP EXIT: ;REMOVE THE WEDGE 00059 C03A 00060 C03A ;NOW WE GET INTO THE MEAT OF THE PROGRAM, STARTING WITH 00061 C03A ;INSERTING THE WEDGE INTO BASIC 00062 C03A 00063 C03A SETUP: 00064 C03A AD 08 03 LDA $0308 ;GET THE VECTOR FOR BASIC 00065 C03D C9 65 CMP #WEDGE: ;CHARACTER 00075 C054 8D 09 03 STA $0309 00076 C057 SKIPSET: 00077 C057 60 RTS 00078 C058 00079 C058 EXIT: 00080 C058 AD FC 03 LDA WRETURN ;THIS RESTORES THE BASIC JUMP 00081 C05B 8D 08 03 STA $0308 ;VECTOR, DISABLING OUR WEDGE 00082 C05E AD FD 03 LDA WRETURN+1 00083 C061 8D 09 03 STA $0309 00084 C064 60 RTS 00085 C065 00086 C065 00087 C065 WEDGE: 00088 C065 A0 01 LDY #$01 00089 C067 B1 7A LDA ($7A),Y ;LOOK AHEAD IN BASIC 00090 C069 C9 5F CMP #$5F ;IS IT A LEFT ARROW? 00091 C06B F0 03 BEQ DOWEDGE: 00092 C06D 6C FC 03 JMP (WRETURN) 00093 C070 DOWEDGE: 00094 C070 20 73 00 JSR $0073 ;MOVE THE CURSOR ALONG 00095 C073 A0 01 LDY #$01 00096 C075 B1 7A LDA ($7A),Y ;LOOK AT NEXT CHAR 00097 C077 C9 54 CMP #$54 ; T TEXT SCREEN 00098 C079 F0 32 BEQ QT: 00099 C07B C9 47 CMP #$47 ; G GRAPHIC SCREEN 00100 C07D F0 37 BEQ QG: 00101 C07F C9 43 CMP #$43 ; C CLEAR SCREEN 00102 C081 F0 3C BEQ QC: 00103 C083 C9 4C CMP #$4C ; L SET COLOR 00104 C085 F0 41 BEQ QL: 00105 C087 C9 50 CMP #$50 ; P PLOT POINT 00106 C089 F0 46 BEQ QP: 00107 C08B C9 55 CMP #$55 ; U PLOT POINT 00108 C08D F0 4E BEQ QU: 00109 C08F C9 44 CMP #$44 ; D DRAWTO 00110 C091 F0 56 BEQ QD: 00111 C093 C9 57 CMP #$57 ; W UNDRAWTO 00112 C095 F0 60 BEQ QW: 00113 C097 C9 46 CMP #$46 ; F FLOOD DILL 00114 C099 F0 6A BEQ QF: 00115 C09B C9 4F CMP #$4F ; O OUTPUT TEXT 00116 C09D F0 6F BEQ QO: 00117 C09F C9 49 CMP #$49 ; I INFO 00118 C0A1 F0 74 BEQ QI: 00119 C0A3 C9 58 CMP #$58 ; X EXIT 00120 C0A5 F0 7C BEQ QX: 00121 C0A7 20 99 C8 JSR HELP: 00122 C0AA 6C FC 03 JMP (WRETURN) 00123 C0AD 00124 C0AD 00125 C0AD 20 73 00 QT: JSR $0073 ;MOVE THE CURSOR ALONG 00126 C0B0 20 2C C1 JSR GRAPHIC0: ;TURN OFF BITMAP MODE 00127 C0B3 6C FC 03 JMP (WRETURN) 00128 C0B6 20 73 00 QG: JSR $0073 ;MOVE THE CURSOR ALONG 00129 C0B9 20 45 C1 JSR GRAPHIC1: ;TURN ON BITMAP MODE 00130 C0BC 6C FC 03 JMP (WRETURN) 00131 C0BF 20 73 00 QC: JSR $0073 ;MOVE THE CURSOR ALONG 00132 C0C2 20 61 C1 JSR CLEARSCREEN: ;CLEAR THE SCREEN MEMORY 00133 C0C5 6C FC 03 JMP (WRETURN) 00134 C0C8 20 73 00 QL: JSR $0073 ;MOVE THE CURSOR ALONG 00135 C0CB 20 7A C1 JSR SETCOLOR: ;SET THE SCREEN/DOT COLOR 00136 C0CE 6C FC 03 JMP (WRETURN) 00137 C0D1 20 73 00 QP: JSR $0073 ;MOVE THE CURSOR ALONG 00138 C0D4 20 7A C2 JSR PLOT: ;PLOT A POINT 00139 C0D7 20 38 C5 JSR MAKEPUOLD: 00140 C0DA 6C FC 03 JMP (WRETURN) 00141 C0DD 20 73 00 QU: JSR $0073 ;MOVE THE CURSOR ALONG 00142 C0E0 20 D3 C2 JSR UPLOT: ;UNPLOT A POINT 00143 C0E3 20 38 C5 JSR MAKEPUOLD: 00144 C0E6 6C FC 03 JMP (WRETURN) 00145 C0E9 20 73 00 QD: JSR $0073 ;MOVE THE CURSOR ALONG 00146 C0EC A9 00 LDA #$00 ;SET DRAW FLAG TO $00 00147 C0EE 8D C1 CB STA DRAW: ;TO DRAW A LINE 00148 C0F1 20 0E C3 JSR DRAWTO: 00149 C0F4 6C FC 03 JMP (WRETURN) 00150 C0F7 20 73 00 QW: JSR $0073 ;MOVE THE CURSOR ALONG 00151 C0FA A9 FF LDA #$FF ;SET DRAW FLAG TO $FF 00152 C0FC 8D C1 CB STA DRAW: ;TO UNDRAW A LINE 00153 C0FF 20 0E C3 JSR DRAWTO: 00154 C102 6C FC 03 JMP (WRETURN) 00155 C105 20 73 00 QF: JSR $0073 ;MOVE THE CURSOR ALONG 00156 C108 20 51 C5 JSR FLOODFILL: ;FLOOD FILL 00157 C10B 6C FC 03 JMP (WRETURN) 00158 C10E 20 73 00 QO: JSR $0073 ;MOVE THE CURSOR ALONG 00159 C111 20 69 C6 JSR OUTPUTTEXT: ;OUTPUTTEXT 00160 C114 6C FC 03 JMP (WRETURN) 00161 C117 20 73 00 QI: JSR $0073 ;MOVE THE CURSOR ALONG 00162 C11A 20 A2 C7 JSR GETX%Y%: ;GET X%,Y% TO FIND INFO 00163 C11D 20 E3 C6 JSR CHECKBYTE: ;CHECK THE BYTE 00164 C120 6C FC 03 JMP (WRETURN) 00165 C123 20 73 00 QX: JSR $0073 ;MOVE THE CURSOR ALONG 00166 C126 20 58 C0 JSR EXIT: ;AND RESTORE BASIC VECTOR JUMP 00167 C129 6C FC 03 JMP (WRETURN) ;LOCATION 00168 C12C 00169 C12C GRAPHIC0: 00170 C12C AD 00 DD LDA VICBANK ;SELECT BANK 1 00171 C12F 09 03 ORA #%00000011 00172 C131 8D 00 DD STA VICBANK 00173 C134 AD 11 D0 LDA BITMAP ;TURN BITMAP MODE OFF 00174 C137 29 DF AND #%11011111 00175 C139 8D 11 D0 STA BITMAP 00176 C13C AD 18 D0 LDA VIC-II 00177 C13F 29 17 AND #%00010111 ;TEXT MATRIX 00178 C141 8D 18 D0 STA VIC-II 00179 C144 60 RTS 00180 C145 00181 C145 GRAPHIC1: 00182 C145 20 A6 C1 JSR SEARCHVARS: 00183 C148 AD 00 DD LDA VICBANK ;SELECT BANK 3 00184 C14B 29 FC AND #%11111100 00185 C14D 8D 00 DD STA VICBANK 00186 C150 AD 11 D0 LDA BITMAP ;TURN BITMAP MODE ON 00187 C153 09 20 ORA #%00100000 00188 C155 8D 11 D0 STA BITMAP 00189 C158 AD 18 D0 LDA VIC-II ;BITMAP MEM MAP LOCATION & MATRIX 00190 C15B 09 38 ORA #%00111000 ;KBYTE PAST START OF VIDEO BANK 00191 C15D 8D 18 D0 STA VIC-II 00192 C160 60 RTS 00193 C161 00194 C161 CLEARSCREEN: 00195 C161 A9 00 LDA #SCREEN 00198 C167 85 FC STA $FC 00199 C169 A0 00 LDY #$00 00200 C16B A2 20 LDX #$20 00201 C16D A9 00 LDA #$00 00202 C16F LOOP1: 00203 C16F 91 FB STA ($FB),Y 00204 C171 C8 INY 00205 C172 D0 FB BNE LOOP1: 00206 C174 E6 FC INC $FC 00207 C176 CA DEX 00208 C177 D0 F6 BNE LOOP1: 00209 C179 60 RTS 00210 C17A 00211 C17A SETCOLOR: 00212 C17A 00213 C17A 20 31 C2 JSR FINDC: 00214 C17D A9 00 LDA #CSCREEN 00217 C183 85 FC STA $FC 00218 C185 A2 04 LDX #$04 00219 C187 20 97 C1 JSR GETCOLOR: 00220 C18A A0 00 LDY #$00 00221 C18C 00222 C18C LOOP2: 00223 C18C 91 FB STA ($FB),Y 00224 C18E C8 INY 00225 C18F D0 FB BNE LOOP2: 00226 C191 E6 FC INC $FC 00227 C193 CA DEX 00228 C194 D0 F6 BNE LOOP2: 00229 C196 60 RTS 00230 C197 00231 C197 GETCOLOR: 00232 C197 AD B1 CB LDA COLR: 00233 C19A 85 FD STA $FD 00234 C19C AD B2 CB LDA COLR:+1 00235 C19F 85 FE STA $FE 00236 C1A1 A0 01 LDY #$01 00237 C1A3 B1 FD LDA ($FD),Y 00238 C1A5 60 RTS 00239 C1A6 00240 C1A6 SEARCHVARS: 00241 C1A6 A5 2D FINDX: LDA $2D ;VARIABLE STORAGE LO 00242 C1A8 85 FB STA $FB 00243 C1AA A5 2E LDA $2E ;VARIABLE STORAGE HI 00244 C1AC 85 FC STA $FC 00245 C1AE A0 00 LDY #$00 00246 C1B0 LOOP3: 00247 C1B0 B1 FB LDA ($FB),Y 00248 C1B2 C9 D8 CMP #$D8 00249 C1B4 F0 08 BEQ SKIPLOOP3: 00250 C1B6 20 60 C2 KLOOP3: JSR INCSEARCH: 00251 C1B9 A0 00 LDY #$00 00252 C1BB 4C B0 C1 JMP LOOP3: 00253 C1BE SKIPLOOP3: 00254 C1BE C8 INY 00255 C1BF B1 FB LDA ($FB),Y 00256 C1C1 C9 80 CMP #$80 00257 C1C3 D0 F1 BNE KLOOP3: 00258 C1C5 18 CLC 00259 C1C6 A5 FB LDA $FB 00260 C1C8 69 02 ADC #$02 00261 C1CA 8D 9B CB STA XPOS: ;STORE LO 00262 C1CD A5 FC LDA $FC 00263 C1CF 69 00 ADC #$00 ;ADD CARRY 00264 C1D1 8D 9C CB STA XPOS:+1 ;STORE HI 00265 C1D4 00266 C1D4 A5 2D FINDY: LDA $2D ;VARIABLE STORAGE LO 00267 C1D6 85 FB STA $FB 00268 C1D8 A5 2E LDA $2E ;VARIABLE STORAGE HI 00269 C1DA 85 FC STA $FC 00270 C1DC A0 00 LDY #$00 00271 C1DE LOOP4: 00272 C1DE B1 FB LDA ($FB),Y 00273 C1E0 C9 D9 CMP #$D9 00274 C1E2 F0 08 BEQ SKIPLOOP4: 00275 C1E4 20 60 C2 KLOOP4: JSR INCSEARCH: 00276 C1E7 A0 00 LDY #$00 00277 C1E9 4C DE C1 JMP LOOP4: 00278 C1EC SKIPLOOP4: 00279 C1EC C8 INY 00280 C1ED B1 FB LDA ($FB),Y 00281 C1EF C9 80 CMP #$80 00282 C1F1 D0 F1 BNE KLOOP4: 00283 C1F3 18 CLC 00284 C1F4 A5 FB LDA $FB 00285 C1F6 69 02 ADC #$02 00286 C1F8 8D 9D CB STA YPOS: ;STORE LO 00287 C1FB A5 FC LDA $FC 00288 C1FD 69 00 ADC #$00 ;ADD CARRY 00289 C1FF 8D 9E CB STA YPOS:+1 ;STORE HI 00290 C202 00291 C202 00292 C202 A5 2D FINDZ: LDA $2D ;VARIABLE STORAGE LO 00293 C204 85 FB STA $FB 00294 C206 A5 2E LDA $2E ;VARIABLE STORAGE HI 00295 C208 85 FC STA $FC 00296 C20A A0 00 LDY #$00 00297 C20C LOOP6: 00298 C20C B1 FB LDA ($FB),Y 00299 C20E C9 DA CMP #$DA 00300 C210 F0 08 BEQ SKIPLOOP6: 00301 C212 20 60 C2 KLOOP6: JSR INCSEARCH: 00302 C215 A0 00 LDY #$00 00303 C217 4C 0C C2 JMP LOOP6: 00304 C21A SKIPLOOP6: 00305 C21A C8 INY 00306 C21B B1 FB LDA ($FB),Y 00307 C21D C9 80 CMP #$80 00308 C21F D0 F1 BNE KLOOP6: 00309 C221 18 CLC 00310 C222 A5 FB LDA $FB 00311 C224 69 02 ADC #$02 00312 C226 8D 9F CB STA ZPOS: ;STORE LO 00313 C229 A5 FC LDA $FC 00314 C22B 69 00 ADC #$00 ;ADD CARRY 00315 C22D 8D A0 CB STA ZPOS:+1 ;STORE HI 00316 C230 60 RTS 00317 C231 00318 C231 A5 2D FINDC: LDA $2D ;VARIABLE STORAGE LO 00319 C233 85 FB STA $FB 00320 C235 A5 2E LDA $2E ;VARIABLE STORAGE HI 00321 C237 85 FC STA $FC 00322 C239 A0 00 LDY #$00 00323 C23B LOOP5: 00324 C23B B1 FB LDA ($FB),Y 00325 C23D C9 C3 CMP #$C3 00326 C23F F0 08 BEQ SKIPLOOP5: 00327 C241 20 60 C2 KLOOP5: JSR INCSEARCH: 00328 C244 A0 00 LDY #$00 00329 C246 4C 3B C2 JMP LOOP5: 00330 C249 SKIPLOOP5: 00331 C249 C8 INY 00332 C24A B1 FB LDA ($FB),Y 00333 C24C C9 80 CMP #$80 00334 C24E D0 F1 BNE KLOOP5: 00335 C250 18 CLC 00336 C251 A5 FB LDA $FB 00337 C253 69 02 ADC #$02 00338 C255 8D B1 CB STA COLR: ;STORE LO 00339 C258 A5 FC LDA $FC 00340 C25A 69 00 ADC #$00 ;ADD CARRY 00341 C25C 8D B2 CB STA COLR:+1 ;STORE HI 00342 C25F 60 RTS 00343 C260 00344 C260 INCSEARCH: 00345 C260 18 CLC 00346 C261 A5 FB LDA $FB 00347 C263 69 01 ADC #$01 00348 C265 85 FB STA $FB 00349 C267 A5 FC LDA $FC 00350 C269 69 00 ADC #$00 00351 C26B 85 FC STA $FC 00352 C26D C9 A0 CMP #$A0 00353 C26F F0 01 BEQ ERRORBREAK: 00354 C271 60 RTS 00355 C272 00356 C272 ERRORBREAK: 00357 C272 20 2C C1 JSR GRAPHIC0: 00358 C275 A2 0E LDX #$0E ;ILLEGAL QUANTITY ERROR 00359 C277 4C 37 A4 JMP ERROR ;GOTO ERROR PRINT ROUTINE 00360 C27A 00361 C27A 00362 C27A PLOT: 00363 C27A 20 A2 C7 JSR GETX%Y%: 00364 C27D PLOTD: 00365 C27D 20 EA C7 JSR GETBYTE: 00366 C280 18 CLC ;ADD BASE 00367 C281 A9 00 LDA #SCREEN 00372 C28E 6D C9 CB ADC HBYTE: 00373 C291 8D A2 C2 STA PUTDOT:+2 00374 C294 8D A5 C2 STA PUTDOT:+5 00375 C297 00376 C297 00377 C297 20 84 C7 JSR KERNALOFF: 00378 C29A 00379 C29A AE C3 CB LDX XBIT: 00380 C29D BD 7F CB LDA XLOOKUP:,X 00381 C2A0 00382 C2A0 0D 00 E0 PUTDOT: ORA SCREEN ;ALTERED BY PROGRAM 00383 C2A3 8D 00 E0 STA SCREEN 00384 C2A6 00385 C2A6 20 8C C7 JSR KERNALON: 00386 C2A9 PUTCOL: 00387 C2A9 4E C9 CB LSR HBYTE: ;DIVIDE BYTE BY 8 TO GET 00388 C2AC 6E C8 CB ROR LBYTE: ;CHARACTOR LOCATION 00389 C2AF 4E C9 CB LSR HBYTE: 00390 C2B2 6E C8 CB ROR LBYTE: 00391 C2B5 4E C9 CB LSR HBYTE: 00392 C2B8 6E C8 CB ROR LBYTE: 00393 C2BB 18 CLC 00394 C2BC AD C8 CB LDA LBYTE: 00395 C2BF 69 00 ADC #CSCREEN 00399 C2C9 8D D1 C2 STA CBYTE:+2 00400 C2CC 00401 C2CC 00402 C2CC 20 97 C1 JSR GETCOLOR: 00403 C2CF 8D 00 CC CBYTE: STA CSCREEN 00404 C2D2 60 RTS 00405 C2D3 00406 C2D3 UPLOT: 00407 C2D3 20 A2 C7 JSR GETX%Y%: 00408 C2D6 PLOTE: 00409 C2D6 20 EA C7 JSR GETBYTE: 00410 C2D9 18 CLC ;ADD BASE 00411 C2DA A9 00 LDA #SCREEN 00416 C2E7 6D C9 CB ADC HBYTE: 00417 C2EA 8D FB C2 STA GETDOT:+2 00418 C2ED 8D FE C2 STA GETDOT:+5 00419 C2F0 00420 C2F0 20 84 C7 JSR KERNALOFF: 00421 C2F3 00422 C2F3 AE C3 CB LDX XBIT: 00423 C2F6 BD 87 CB LDA ULOOKUP:,X 00424 C2F9 00425 C2F9 2D 00 E0 GETDOT: AND SCREEN ;ALTERED BY PROGRAM 00426 C2FC 8D 00 E0 STA SCREEN 00427 C2FF 00428 C2FF 20 8C C7 JSR KERNALON: 00429 C302 60 RTS 00430 C303 00431 C303 PLOTB: 00432 C303 AD C1 CB LDA DRAW: 00433 C306 F0 03 BEQ DP: 00434 C308 4C D6 C2 JMP PLOTE: 00435 C30B 4C 7D C2 DP: JMP PLOTD: 00436 C30E 00437 C30E DRAWTO: 00438 C30E 00439 C30E AD A1 CB LDA XOLD: ;GET X1 AND X2 00440 C311 8D A7 CB STA X1: ;X1 AND Y1 ARE PULLED FROM XOLD WHICH 00441 C314 AD A2 CB LDA XOLD:+1 ;IS SAVED FROM THE LAST DRAWING 00442 C317 8D A8 CB STA X1:+1 ;COMMAND 00443 C31A AD A3 CB LDA YOLD: 00444 C31D 8D AB CB STA Y1: ;X2 AND Y2 ARE PULLED FROM THE CURRENT 00445 C320 AD A4 CB LDA YOLD:+1 ;BASIC VARIABLES X% AND Y% 00446 C323 8D AC CB STA Y1:+1 00447 C326 00448 C326 20 A2 C7 JSR GETX%Y%: 00449 C329 AD AD CB LDA XC: 00450 C32C 8D A5 CB STA X2: 00451 C32F AD AE CB LDA XC:+1 00452 C332 8D A6 CB STA X2:+1 00453 C335 00454 C335 AD AF CB LDA YC: 00455 C338 8D A9 CB STA Y2: 00456 C33B AD B0 CB LDA YC:+1 00457 C33E 8D AA CB STA Y2:+1 00458 C341 00459 C341 AD A7 CB LDA X1: ;CHECKING TO MAKE SURE 00460 C344 CD A5 CB CMP X2: ;X1,Y1 != X2,Y2 00461 C347 D0 19 BNE XDELTA: 00462 C349 AD A8 CB LDA X1:+1 ;THIS WILL CAUSE PROBLEMS 00463 C34C CD A6 CB CMP X2:+1 ;IF THERE IS NO LINE TO DRAW 00464 C34F D0 11 BNE XDELTA: 00465 C351 AD AB CB LDA Y1: ;IF ANYTHING DOESN'T MATCH 00466 C354 CD A9 CB CMP Y2: ;WE CAN CONTINUE TO THE 00467 C357 D0 09 BNE XDELTA: ;LINE ALGORITHM 00468 C359 AD AC CB LDA Y1:+1 00469 C35C CD AA CB CMP Y2:+1 00470 C35F D0 01 BNE XDELTA: 00471 C361 60 RTS 00472 C362 00473 C362 ;BRESENHAM LINE ALGORITHM 00474 C362 ;FIRST START WITH FINDING THE X AND Y DELTAS AND 00475 C362 ;DIRECTION OF THE LINE 00476 C362 ;X1,Y1 FROM POINT 00477 C362 ;X2,Y2 TO POINT 00478 C362 ;DX,DY X AND Y DELTAS 00479 C362 ;INCX, INCY DIRECTION 00480 C362 ;ALL NUMBERS ARE 16BIT INTEGERS 00481 C362 00482 C362 XDELTA: 00483 C362 AD A6 CB LDA X2:+1 ; IF (X2 >= X1) XCASE1 ELSE XCASE2 00484 C365 CD A8 CB CMP X1:+1 00485 C368 90 2D BCC XCASE2: ;IF (X2(HI) < X1(HI)) 00486 C36A D0 0B BNE XCASE1: ;IF (X2(HI) != X1(HI)) X2 MUST BE GREATER THAN X1 00487 C36C AD A5 CB LDA X2: ;IF (X2(HI) = X1(HI)) WE NEED TO CHECK LO 00488 C36F CD A7 CB CMP X1: 00489 C372 B0 03 BCS XCASE1: ;IF (X2(LO) >= X1(LO)) 00490 C374 4C 97 C3 JMP XCASE2: ;SKIP TO XCASE2 00491 C377 XCASE1: 00492 C377 38 SEC ;DX = X2 - X1 00493 C378 AD A5 CB LDA X2: 00494 C37B ED A7 CB SBC X1: 00495 C37E 8D B3 CB STA DX: 00496 C381 AD A6 CB LDA X2:+1 00497 C384 ED A8 CB SBC X1:+1 00498 C387 8D B4 CB STA DX:+1 00499 C38A 00500 C38A A9 01 LDA #$01 ;INCX = 1 00501 C38C 8D BB CB STA INCX: 00502 C38F A9 00 LDA #$00 00503 C391 8D BC CB STA INCX:+1 00504 C394 00505 C394 4C B2 C3 JMP YDELTA: 00506 C397 00507 C397 XCASE2: 00508 C397 38 SEC ;DX = X1 - X2 00509 C398 AD A7 CB LDA X1: 00510 C39B ED A5 CB SBC X2: 00511 C39E 8D B3 CB STA DX: 00512 C3A1 AD A8 CB LDA X1:+1 00513 C3A4 ED A6 CB SBC X2:+1 00514 C3A7 8D B4 CB STA DX:+1 00515 C3AA 00516 C3AA A9 FF LDA #$FF ;INCX = -1 00517 C3AC 8D BB CB STA INCX: 00518 C3AF 8D BC CB STA INCX:+1 00519 C3B2 00520 C3B2 YDELTA: 00521 C3B2 AD AA CB LDA Y2:+1 ; IF (Y2 >= Y1) YCASE1 ELSE YCASE2 00522 C3B5 CD AC CB CMP Y1:+1 00523 C3B8 90 2D BCC YCASE2: ;IF (Y2(HI) < Y1(HI)) 00524 C3BA D0 0B BNE YCASE1: ;IF (Y2(HI) != Y1(HI)) Y2 MUST BE GREATER THAN Y1 00525 C3BC AD A9 CB LDA Y2: ;IF (Y2(HI) = Y1(HI)) WE NEED TO CHECK LO 00526 C3BF CD AB CB CMP Y1: 00527 C3C2 B0 03 BCS YCASE1: ;IF (Y2(LO) >= Y1(LO)) 00528 C3C4 4C E7 C3 JMP YCASE2: ;SKIP TO YCASE2 00529 C3C7 00530 C3C7 YCASE1: 00531 C3C7 38 SEC ;DY = Y2 - Y1 00532 C3C8 AD A9 CB LDA Y2: 00533 C3CB ED AB CB SBC Y1: 00534 C3CE 8D B5 CB STA DY: 00535 C3D1 AD AA CB LDA Y2:+1 00536 C3D4 ED AC CB SBC Y1:+1 00537 C3D7 8D B6 CB STA DY:+1 00538 C3DA 00539 C3DA A9 01 LDA #$01 ;INCY = 1 00540 C3DC 8D BD CB STA INCY: 00541 C3DF A9 00 LDA #$00 00542 C3E1 8D BE CB STA INCY:+1 00543 C3E4 00544 C3E4 4C 02 C4 JMP DRAWLINE: 00545 C3E7 00546 C3E7 YCASE2: 00547 C3E7 38 SEC ;DY = Y1 - Y2 00548 C3E8 AD AB CB LDA Y1: 00549 C3EB ED A9 CB SBC Y2: 00550 C3EE 8D B5 CB STA DY: 00551 C3F1 AD AC CB LDA Y1:+1 00552 C3F4 ED AA CB SBC Y2:+1 00553 C3F7 8D B6 CB STA DY:+1 00554 C3FA 00555 C3FA A9 FF LDA #$FF ;INCY = -1 00556 C3FC 8D BD CB STA INCY: 00557 C3FF 8D BE CB STA INCY:+1 00558 C402 00559 C402 DRAWLINE: 00560 C402 00561 C402 AD A7 CB LDA X1: ;TRANSFER X1,Y1 TO XC,YC TO WORK 00562 C405 8D AD CB STA XC: ;WITH PLOT ROUTINE 00563 C408 AD A8 CB LDA X1:+1 00564 C40B 8D AE CB STA XC:+1 00565 C40E AD AB CB LDA Y1: 00566 C411 8D AF CB STA YC: 00567 C414 AD AC CB LDA Y1:+1 00568 C417 8D B0 CB STA YC:+1 00569 C41A 00570 C41A AD B4 CB LDA DX:+1 ; IF (DX >= DY) DCASE1 ELSE DCASE2 00571 C41D CD B6 CB CMP DY:+1 00572 C420 90 0A BCC JDCASE2: ;IF (DX(HI) < DY(LO)) 00573 C422 D0 0B BNE DCASE1: ;IF (DX(HI) != DY(LO)) DX MUST BE GREATER THEN DY 00574 C424 AD B3 CB LDA DX: ;IF (DX(HI) = DY(HI)) WE NEED TO CHECK LO 00575 C427 CD B5 CB CMP DY: 00576 C42A B0 03 BCS DCASE1: ;IF (DX(LO) >= DY(LO)) 00577 C42C JDCASE2: 00578 C42C 4C B5 C4 JMP DCASE2: ;SKIP TO DCASE2 00579 C42F 00580 C42F DCASE1: 00581 C42F 00582 C42F 0E B5 CB ASL DY: ; DY <<= 1 00583 C432 2E B6 CB ROL DY:+1 00584 C435 00585 C435 38 SEC ; BALANCE = DY - DX 00586 C436 AD B5 CB LDA DY: 00587 C439 ED B3 CB SBC DX: 00588 C43C 8D BF CB STA BALANCE: 00589 C43F AD B6 CB LDA DY:+1 00590 C442 ED B4 CB SBC DX:+1 00591 C445 8D C0 CB STA BALANCE:+1 00592 C448 00593 C448 0E B3 CB ASL DX: ; DX <<= 1 00594 C44B 2E B4 CB ROL DX:+1 00595 C44E 00596 C44E DCASE1LOOP: 00597 C44E 20 03 C3 JSR PLOTB: ;PLOT A POINT 00598 C451 AD C0 CB LDA BALANCE:+1 00599 C454 30 26 BMI SKIPADJUSTY: ;BALANCE < 0 SKIP Y ADJUSTMENT 00600 C456 00601 C456 18 CLC ;Y += INCY 00602 C457 AD AF CB LDA YC: 00603 C45A 6D BD CB ADC INCY: 00604 C45D 8D AF CB STA YC: 00605 C460 AD B0 CB LDA YC:+1 00606 C463 6D BE CB ADC INCY:+1 00607 C466 8D B0 CB STA YC:+1 00608 C469 00609 C469 38 SEC ;BALANCE -= DX 00610 C46A AD BF CB LDA BALANCE: 00611 C46D ED B3 CB SBC DX: 00612 C470 8D BF CB STA BALANCE: 00613 C473 AD C0 CB LDA BALANCE:+1 00614 C476 ED B4 CB SBC DX:+1 00615 C479 8D C0 CB STA BALANCE:+1 00616 C47C 00617 C47C SKIPADJUSTY: 00618 C47C 18 CLC ;BALANCE += DY 00619 C47D AD BF CB LDA BALANCE: 00620 C480 6D B5 CB ADC DY: 00621 C483 8D BF CB STA BALANCE: 00622 C486 AD C0 CB LDA BALANCE:+1 00623 C489 6D B6 CB ADC DY:+1 00624 C48C 8D C0 CB STA BALANCE:+1 00625 C48F 00626 C48F 18 CLC ;X += INCX 00627 C490 AD AD CB LDA XC: 00628 C493 6D BB CB ADC INCX: 00629 C496 8D AD CB STA XC: 00630 C499 AD AE CB LDA XC:+1 00631 C49C 6D BC CB ADC INCX:+1 00632 C49F 8D AE CB STA XC:+1 00633 C4A2 00634 C4A2 CD A6 CB CMP X2:+1 ;X != X2 THEN LOOP 00635 C4A5 D0 A7 BNE DCASE1LOOP: 00636 C4A7 AD AD CB LDA XC: 00637 C4AA CD A5 CB CMP X2: 00638 C4AD D0 9F BNE DCASE1LOOP: 00639 C4AF 00640 C4AF 20 03 C3 JSR PLOTB: ;PLOT ONE LAST POINT 00641 C4B2 4C 38 C5 JMP MAKEPUOLD: 00642 C4B5 00643 C4B5 00644 C4B5 DCASE2: 00645 C4B5 00646 C4B5 0E B3 CB ASL DX: ; DX <<= 1 00647 C4B8 2E B4 CB ROL DX:+1 00648 C4BB 00649 C4BB 38 SEC ; BALANCE = DX - DY 00650 C4BC AD B3 CB LDA DX: 00651 C4BF ED B5 CB SBC DY: 00652 C4C2 8D BF CB STA BALANCE: 00653 C4C5 AD B4 CB LDA DX:+1 00654 C4C8 ED B6 CB SBC DY:+1 00655 C4CB 8D C0 CB STA BALANCE:+1 00656 C4CE 00657 C4CE 0E B5 CB ASL DY: ; DY <<= 1 00658 C4D1 2E B6 CB ROL DY:+1 00659 C4D4 00660 C4D4 DCASE2LOOP: 00661 C4D4 20 03 C3 JSR PLOTB: ;PLOT A POINT 00662 C4D7 AD C0 CB LDA BALANCE:+1 00663 C4DA 30 26 BMI SKIPADJUSTX: ;BALANCE < 0 SKIP X ADJUSTMENT 00664 C4DC 00665 C4DC 18 CLC ;X += INCX 00666 C4DD AD AD CB LDA XC: 00667 C4E0 6D BB CB ADC INCX: 00668 C4E3 8D AD CB STA XC: 00669 C4E6 AD AE CB LDA XC:+1 00670 C4E9 6D BC CB ADC INCX:+1 00671 C4EC 8D AE CB STA XC:+1 00672 C4EF 00673 C4EF 38 SEC ;BALANCE -= DY 00674 C4F0 AD BF CB LDA BALANCE: 00675 C4F3 ED B5 CB SBC DY: 00676 C4F6 8D BF CB STA BALANCE: 00677 C4F9 AD C0 CB LDA BALANCE:+1 00678 C4FC ED B6 CB SBC DY:+1 00679 C4FF 8D C0 CB STA BALANCE:+1 00680 C502 00681 C502 SKIPADJUSTX: 00682 C502 18 CLC ;BALANCE += DX 00683 C503 AD BF CB LDA BALANCE: 00684 C506 6D B3 CB ADC DX: 00685 C509 8D BF CB STA BALANCE: 00686 C50C AD C0 CB LDA BALANCE:+1 00687 C50F 6D B4 CB ADC DX:+1 00688 C512 8D C0 CB STA BALANCE:+1 00689 C515 00690 C515 18 CLC ;Y += INCX 00691 C516 AD AF CB LDA YC: 00692 C519 6D BD CB ADC INCY: 00693 C51C 8D AF CB STA YC: 00694 C51F AD B0 CB LDA YC:+1 00695 C522 6D BE CB ADC INCY:+1 00696 C525 8D B0 CB STA YC:+1 00697 C528 00698 C528 CD AA CB CMP Y2:+1 ;Y != Y2 THEN LOOP 00699 C52B D0 A7 BNE DCASE2LOOP: 00700 C52D AD AF CB LDA YC: 00701 C530 CD A9 CB CMP Y2: 00702 C533 D0 9F BNE DCASE2LOOP: 00703 C535 00704 C535 20 03 C3 JSR PLOTB: ;PLOT ONE LAST POINT 00705 C538 00706 C538 MAKEPUOLD: ;TRANSFER THE LAST PLOTTED POSITION 00707 C538 AD AD CB LDA XC: ;TO XOLD & YOLD SO THEY CAN BE USED 00708 C53B 8D A1 CB STA XOLD: ;IN A DRAWTO STATEMENT. 00709 C53E AD AE CB LDA XC:+1 00710 C541 8D A2 CB STA XOLD:+1 00711 C544 AD AF CB LDA YC: 00712 C547 8D A3 CB STA YOLD: 00713 C54A AD B0 CB LDA YC:+1 00714 C54D 8D A4 CB STA YOLD:+1 00715 C550 60 RTS 00716 C551 00717 C551 FLOODFILL: 00718 C551 20 A2 C7 JSR GETX%Y%: ;FOR FLOOD FILL, GRAB THE INITIAL 00719 C554 A2 00 LDX #$00 ;POINT AND PUSH IT TO THE FIRST QUE. 00720 C556 AD AD CB LDA XC: 00721 C559 8D 00 A0 STA QUE1 00722 C55C AD AE CB LDA XC:+1 00723 C55F 8D 01 A0 STA QUE1+1 00724 C562 AD AF CB LDA YC: 00725 C565 8D 02 A0 STA QUE1+2 00726 C568 A9 FF LDA #$FF 00727 C56A 8D 03 A0 STA QUE1+3 00728 C56D 8D 04 A0 STA QUE1+4 00729 C570 8D 05 A0 STA QUE1+5 00730 C573 00731 C573 00732 C573 ROUND1: 00733 C573 A9 00 LDA #$00 ;SET COUNTERS FOR QUE 00734 C575 8D CC CB STA Q1: ;1 FOR PULLING AND 1 FOR PUSHING 00735 C578 8D CE CB STA Q2: 00736 C57B A9 A0 LDA #$A0 00737 C57D 8D CD CB STA Q1:+1 00738 C580 A9 B0 LDA #$B0 00739 C582 8D CF CB STA Q2:+1 00740 C585 20 94 C7 JSR BASICOFF: 00741 C588 AD 02 A0 LDA QUE1+2 00742 C58B C9 FF CMP #$FF 00743 C58D F0 06 BEQ ENDFILL: 00744 C58F 20 9B C7 JSR BASICON: 00745 C592 4C 99 C5 JMP FLOOP1: 00746 C595 00747 C595 ENDFILL: 00748 C595 20 9B C7 JSR BASICON: 00749 C598 60 RTS 00750 C599 00751 C599 00752 C599 FLOOP1: 00753 C599 20 20 C7 JSR PULLQ1: ;FIRST CHECK TO MAKE SURE IT'S NOT 00754 C59C ;ALREADY FILLED IN. 00755 C59C AD AF CB LDA YC: 00756 C59F C9 FF CMP #$FF 00757 C5A1 D0 06 BNE SKIPFCHECK: 00758 C5A3 20 55 C7 JSR PUSHQ2: 00759 C5A6 4C 14 C6 JMP ROUND2: 00760 C5A9 00761 C5A9 SKIPFCHECK: 00762 C5A9 00763 C5A9 00764 C5A9 20 E3 C6 JSR CHECKBYTE: 00765 C5AC AD CA CB LDA TEMP: 00766 C5AF D0 E8 BNE FLOOP1: 00767 C5B1 20 7D C2 JSR PLOTD: ;PLOT THE POINT 00768 C5B4 00769 C5B4 AD AD CB LDA XC: 00770 C5B7 8D A7 CB STA X1: 00771 C5BA AD AE CB LDA XC:+1 00772 C5BD 8D A8 CB STA X1:+1 00773 C5C0 AD AF CB LDA YC: 00774 C5C3 8D AB CB STA Y1: 00775 C5C6 00776 C5C6 A2 03 LDX #$03 00777 C5C8 FLOOP2: 00778 C5C8 8E A5 CB STX X2: 00779 C5CB 18 CLC 00780 C5CC BD 8F CB LDA XFLOOKUPLO:,X 00781 C5CF 6D A7 CB ADC X1: 00782 C5D2 8D AD CB STA XC: 00783 C5D5 BD 93 CB LDA XFLOOKUPHI:,X 00784 C5D8 6D A8 CB ADC X1:+1 00785 C5DB 8D AE CB STA XC:+1 00786 C5DE 30 25 BMI NX: ;CHECK TO MAKE SURE WE ARE STILL 00787 C5E0 C9 02 CMP #$02 ;ON THE BITAP WHILE DOING CHECKS. 00788 C5E2 B0 21 BCS NX: ;IF OUT OF BOUNDS, SKIP TO NEXT CHECK 00789 C5E4 C9 00 CMP #$00 00790 C5E6 F0 07 BEQ SKIPLO: 00791 C5E8 AD AD CB LDA XC: 00792 C5EB C9 40 CMP #$40 00793 C5ED B0 16 BCS NX: 00794 C5EF SKIPLO: 00795 C5EF 18 CLC 00796 C5F0 BD 97 CB LDA YFLOOKUP:,X 00797 C5F3 6D AB CB ADC Y1: 00798 C5F6 8D AF CB STA YC: 00799 C5F9 C9 C8 CMP #$C8 00800 C5FB B0 08 BCS NX: 00801 C5FD 20 E3 C6 JSR CHECKBYTE: 00802 C600 AD CA CB LDA TEMP: 00803 C603 F0 09 BEQ PUSH: 00804 C605 AE A5 CB NX: LDX X2: 00805 C608 CA DEX 00806 C609 10 BD BPL FLOOP2: 00807 C60B 4C 99 C5 JMP FLOOP1: 00808 C60E PUSH: 00809 C60E 20 55 C7 JSR PUSHQ2: 00810 C611 4C 05 C6 JMP NX: 00811 C614 00812 C614 ROUND2: 00813 C614 A9 00 LDA #$00 00814 C616 85 FB STA $FB 00815 C618 85 FD STA $FD 00816 C61A A9 A0 LDA #$A0 00817 C61C 85 FC STA $FC 00818 C61E A9 B0 LDA #$B0 00819 C620 85 FE STA $FE 00820 C622 20 94 C7 JSR BASICOFF: 00821 C625 A0 00 LDY #$00 00822 C627 R2LOOP: 00823 C627 B1 FD LDA ($FD),Y 00824 C629 91 FB STA ($FB),Y 00825 C62B C9 FF CMP #$FF 00826 C62D F0 18 BEQ CHECKEND: 00827 C62F C8 INY 00828 C630 D0 F5 BNE R2LOOP: 00829 C632 20 38 C6 JSR INCFMEM: 00830 C635 4C 27 C6 JMP R2LOOP: 00831 C638 00832 C638 INCFMEM: 00833 C638 18 CLC 00834 C639 A9 01 LDA #$01 00835 C63B 65 FC ADC $FC 00836 C63D 85 FC STA $FC 00837 C63F 18 CLC 00838 C640 A9 01 LDA #$01 00839 C642 65 FE ADC $FE 00840 C644 85 FE STA $FE 00841 C646 60 RTS 00842 C647 00843 C647 00844 C647 CHECKEND: 00845 C647 C8 INY 00846 C648 D0 03 BNE CE1: 00847 C64A 20 38 C6 JSR INCFMEM: 00848 C64D B1 FD CE1: LDA ($FD),Y 00849 C64F 91 FB STA ($FB),Y 00850 C651 C9 FF CMP #$FF 00851 C653 D0 D2 BNE R2LOOP: 00852 C655 C8 INY 00853 C656 D0 03 BNE CE2: 00854 C658 20 38 C6 JSR INCFMEM: 00855 C65B B1 FD CE2: LDA ($FD),Y 00856 C65D 91 FB STA ($FB),Y 00857 C65F C9 FF CMP #$FF 00858 C661 D0 C4 BNE R2LOOP: 00859 C663 20 9B C7 JSR BASICON: 00860 C666 4C 73 C5 JMP ROUND1: 00861 C669 00862 C669 OUTPUTTEXT: 00863 C669 20 A2 C7 JSR GETX%Y%: 00864 C66C 20 EA C7 JSR GETBYTE: 00865 C66F 18 CLC 00866 C670 AD C8 CB LDA LBYTE: 00867 C673 29 F8 AND #$F8 00868 C675 69 00 ADC #SCREEN 00872 C67F 8D CA C6 STA PUTCHAR:+2 00873 C682 AD 9F CB LDA ZPOS: 00874 C685 85 FB STA $FB 00875 C687 AD A0 CB LDA ZPOS:+1 00876 C68A 85 FC STA $FC 00877 C68C A9 00 LDA #$00 00878 C68E 8D CB CB STA TEMP:+1 00879 C691 A0 01 LDY #$01 00880 C693 B1 FB LDA ($FB),Y 00881 C695 29 7F AND #%01111111 00882 C697 18 CLC 00883 C698 0A ASL A 00884 C699 2E CB CB ROL TEMP:+1 00885 C69C 0A ASL A 00886 C69D 2E CB CB ROL TEMP:+1 00887 C6A0 0A ASL A 00888 C6A1 2E CB CB ROL TEMP:+1 00889 C6A4 8D CA CB STA TEMP: 00890 C6A7 8D C4 C6 STA GETCHAR:+1 00891 C6AA AD 0E DC LDA $DC0E 00892 C6AD 29 FE AND #$FE 00893 C6AF 8D 0E DC STA $DC0E 00894 C6B2 A5 01 LDA $01 00895 C6B4 29 FB AND #$FB 00896 C6B6 85 01 STA $01 00897 C6B8 00898 C6B8 18 CLC 00899 C6B9 A9 DC LDA #$DC 00900 C6BB 6D CB CB ADC TEMP:+1 00901 C6BE 8D C5 C6 STA GETCHAR:+2 00902 C6C1 00903 C6C1 00904 C6C1 00905 C6C1 A0 00 LDY #$00 00906 C6C3 GETCHAR: 00907 C6C3 B9 00 D0 LDA $D000,Y 00908 C6C6 49 FF EOR #$FF 00909 C6C8 00910 C6C8 PUTCHAR: 00911 C6C8 99 00 E0 STA SCREEN,Y 00912 C6CB C8 INY 00913 C6CC 98 TYA 00914 C6CD C9 08 CMP #$08 00915 C6CF D0 F2 BNE GETCHAR: 00916 C6D1 00917 C6D1 A5 01 LDA $01 00918 C6D3 09 04 ORA #$04 00919 C6D5 85 01 STA $01 00920 C6D7 AD 0E DC LDA $DC0E 00921 C6DA 09 01 ORA #$01 00922 C6DC 8D 0E DC STA $DC0E 00923 C6DF 20 A9 C2 JSR PUTCOL: 00924 C6E2 60 RTS 00925 C6E3 00926 C6E3 00927 C6E3 00928 C6E3 00929 C6E3 CHECKBYTE: 00930 C6E3 20 EA C7 JSR GETBYTE: 00931 C6E6 18 CLC ;ADD BASE 00932 C6E7 A9 00 LDA #SCREEN 00936 C6F1 6D C9 CB ADC HBYTE: 00937 C6F4 8D 02 C7 STA SEEDOT:+2 00938 C6F7 00939 C6F7 20 84 C7 JSR KERNALOFF: 00940 C6FA 00941 C6FA AE C3 CB LDX XBIT: 00942 C6FD BD 7F CB LDA XLOOKUP:,X 00943 C700 00944 C700 2D 00 E0 SEEDOT: AND SCREEN ;ALTERED BY PROGRAM 00945 C703 8D CA CB STA TEMP: 00946 C706 20 8C C7 JSR KERNALON: 00947 C709 AD 9F CB LDA ZPOS: 00948 C70C 85 FB STA $FB 00949 C70E AD A0 CB LDA ZPOS:+1 00950 C711 85 FC STA $FC 00951 C713 A0 00 LDY #$00 00952 C715 A9 00 LDA #$00 00953 C717 91 FB STA ($FB),Y 00954 C719 AD CA CB LDA TEMP: 00955 C71C C8 INY 00956 C71D 91 FB STA ($FB),Y 00957 C71F 00958 C71F 60 RTS 00959 C720 00960 C720 00961 C720 00962 C720 00963 C720 PULLQ1: 00964 C720 20 94 C7 JSR BASICOFF: 00965 C723 AD CC CB LDA Q1: 00966 C726 85 FB STA $FB 00967 C728 AD CD CB LDA Q1:+1 00968 C72B 85 FC STA $FC 00969 C72D A0 00 LDY #$00 00970 C72F B1 FB LDA ($FB),Y 00971 C731 8D AD CB STA XC: 00972 C734 C8 INY 00973 C735 B1 FB LDA ($FB),Y 00974 C737 8D AE CB STA XC:+1 00975 C73A C8 INY 00976 C73B B1 FB LDA ($FB),Y 00977 C73D 8D AF CB STA YC: 00978 C740 18 CLC 00979 C741 A9 03 LDA #$03 00980 C743 6D CC CB ADC Q1: 00981 C746 8D CC CB STA Q1: 00982 C749 A9 00 LDA #$00 00983 C74B 6D CD CB ADC Q1:+1 00984 C74E 8D CD CB STA Q1:+1 00985 C751 20 9B C7 JSR BASICON: 00986 C754 60 RTS 00987 C755 00988 C755 00989 C755 PUSHQ2: 00990 C755 AD CE CB LDA Q2: 00991 C758 85 FB STA $FB 00992 C75A AD CF CB LDA Q2:+1 00993 C75D 85 FC STA $FC 00994 C75F A0 00 LDY #$00 00995 C761 AD AD CB LDA XC: 00996 C764 91 FB STA ($FB),Y 00997 C766 C8 INY 00998 C767 AD AE CB LDA XC:+1 00999 C76A 91 FB STA ($FB),Y 01000 C76C C8 INY 01001 C76D AD AF CB LDA YC: 01002 C770 91 FB STA ($FB),Y 01003 C772 18 CLC 01004 C773 A9 03 LDA #$03 01005 C775 6D CE CB ADC Q2: 01006 C778 8D CE CB STA Q2: 01007 C77B A9 00 LDA #$00 01008 C77D 6D CF CB ADC Q2:+1 01009 C780 8D CF CB STA Q2:+1 01010 C783 60 RTS 01011 C784 01012 C784 01013 C784 KERNALOFF: 01014 C784 78 SEI 01015 C785 A5 01 LDA $01 ;TURN OFF KERNAL 01016 C787 29 FD AND #%11111101 01017 C789 85 01 STA $01 01018 C78B 60 RTS 01019 C78C 01020 C78C KERNALON: 01021 C78C A5 01 LDA $01 ;TURN ON KERNAL 01022 C78E 09 02 ORA #%00000010 01023 C790 85 01 STA $01 01024 C792 58 CLI 01025 C793 60 RTS 01026 C794 01027 C794 BASICOFF: 01028 C794 A5 01 LDA $01 ;TURN OFF BASIC 01029 C796 29 FE AND #%11111110 01030 C798 85 01 STA $01 01031 C79A 60 RTS 01032 C79B 01033 C79B BASICON: 01034 C79B A5 01 LDA $01 ;TURN ON BASIC 01035 C79D 09 01 ORA #%00000001 01036 C79F 85 01 STA $01 01037 C7A1 60 RTS 01038 C7A2 01039 C7A2 GETX%Y%: ;GET X AND Y FROM THE BASIC VARIABLES 01040 C7A2 AD 9B CB LDA XPOS: ;X% & Y%. 01041 C7A5 85 FB STA $FB 01042 C7A7 AD 9C CB LDA XPOS:+1 01043 C7AA 85 FC STA $FC 01044 C7AC A0 01 LDY #$01 ;NOTE THAT BASIC STORES INTEGERS 01045 C7AE B1 FB LDA ($FB),Y ;IN HI BYTE, LO BYTE ORDER UNLIKE 01046 C7B0 8D AD CB STA XC: ;ANYTHING ELSE IN 6502. 01047 C7B3 A0 00 LDY #$00 01048 C7B5 B1 FB LDA ($FB),Y ;SWITCHING IT AT THE SOURCE SO IT 01049 C7B7 8D AE CB STA XC:+1 ;DOESN'T CONFUSE US LATER. 01050 C7BA C9 02 CMP #$02 01051 C7BC B0 29 BCS COORDERROR: 01052 C7BE C9 01 CMP #$01 01053 C7C0 D0 07 BNE CHECKYVAL: 01054 C7C2 AD AD CB LDA XC: 01055 C7C5 C9 40 CMP #$40 01056 C7C7 B0 1E BCS COORDERROR: 01057 C7C9 01058 C7C9 CHECKYVAL: ;JUST WANT TO MAKE SURE X OR Y STAY 01059 C7C9 AD 9D CB LDA YPOS: ;WITHIN THE BOUNDS OF THE SCREEN. 01060 C7CC 85 FB STA $FB 01061 C7CE AD 9E CB LDA YPOS:+1 ; 0 <= X <= 319 01062 C7D1 85 FC STA $FC ; 0 <= Y <= 199 01063 C7D3 A0 01 LDY# $01 01064 C7D5 01065 C7D5 B1 FB LDA ($FB),Y ;IF X OR Y ARE OUTSIDE THESE LIMITS 01066 C7D7 8D AF CB STA YC: ;THE TEXT SCREEN IS CALLED AND AN 01067 C7DA 88 DEY ;ILLEGAL QUANTITY ERROR OCCURS 01068 C7DB B1 FB LDA ($FB),Y 01069 C7DD 30 08 BMI COORDERROR: 01070 C7DF AD AF CB LDA YC: 01071 C7E2 01072 C7E2 C9 C8 CMP #$C8 01073 C7E4 B0 01 BCS COORDERROR: 01074 C7E6 60 RTS 01075 C7E7 01076 C7E7 COORDERROR: 01077 C7E7 4C 72 C2 JMP ERRORBREAK: 01078 C7EA 01079 C7EA GETBYTE: ;GET THE ACTUAL MEMORY LOCATION THAT 01080 C7EA ;COORISPONDS TO THE X,Y COORDINATES 01081 C7EA ;AS WELL AS THE BIT FROM THE BYTE THAT 01082 C7EA ;IS REPRESENTED. 01083 C7EA 01084 C7EA 01085 C7EA 01086 C7EA AD AF CB LDA YC: ;Y 01087 C7ED ;NEED SOME Y RANGE ERROR CHECKING HERE 01088 C7ED ; 0 <= Y <= 199 01089 C7ED 29 07 AND #$07 01090 C7EF 8D C2 CB STA LINE: 01091 C7F2 01092 C7F2 ;TIME FOR FORMULA 01093 C7F2 ;BYTE = BASE + Y * 40 + X + LINE 01094 C7F2 ;BYTE = BASE + Y * 32 + Y * 8 + X + LINE 01095 C7F2 18 CLC 01096 C7F3 01097 C7F3 A9 00 LDA #$00 01098 C7F5 8D C4 CB STA YLO1: 01099 C7F8 8D C6 CB STA YLO2: 01100 C7FB 8D C5 CB STA YHI1: 01101 C7FE 8D C7 CB STA YHI2: 01102 C801 8D C8 CB STA LBYTE: 01103 C804 8D C9 CB STA HBYTE: 01104 C807 8D C5 CB STA YHI1: 01105 C80A 8D C7 CB STA YHI2: 01106 C80D 01107 C80D AD AF CB LDA YC: ;Y * 32 01108 C810 29 F8 AND #$F8 01109 C812 8D C4 CB STA YLO1: 01110 C815 0E C4 CB ASL YLO1: 01111 C818 2E C5 CB ROL YHI1: 01112 C81B 0E C4 CB ASL YLO1: 01113 C81E 2E C5 CB ROL YHI1: 01114 C821 0E C4 CB ASL YLO1: 01115 C824 2E C5 CB ROL YHI1: 01116 C827 0E C4 CB ASL YLO1: 01117 C82A 2E C5 CB ROL YHI1: 01118 C82D 0E C4 CB ASL YLO1: 01119 C830 2E C5 CB ROL YHI1: 01120 C833 AD AF CB LDA YC: ;Y * 8 01121 C836 29 F8 AND #$F8 01122 C838 8D C6 CB STA YLO2: 01123 C83B 0E C6 CB ASL YLO2: 01124 C83E 2E C7 CB ROL YHI2: 01125 C841 0E C6 CB ASL YLO2: 01126 C844 2E C7 CB ROL YHI2: 01127 C847 0E C6 CB ASL YLO2: 01128 C84A 2E C7 CB ROL YHI2: 01129 C84D 01130 C84D 18 CLC ;ADD THE TWO YS TOGETHER 01131 C84E AD C4 CB LDA YLO1: 01132 C851 6D C6 CB ADC YLO2: 01133 C854 8D C8 CB STA LBYTE: 01134 C857 AD C5 CB LDA YHI1: 01135 C85A 6D C7 CB ADC YHI2: 01136 C85D 8D C9 CB STA HBYTE: 01137 C860 AD AD CB LDA XC: ;X 01138 C863 29 07 AND #$07 01139 C865 8D C3 CB STA XBIT: 01140 C868 38 SEC 01141 C869 A9 07 LDA #$07 01142 C86B ED C3 CB SBC XBIT: 01143 C86E 8D C3 CB STA XBIT: 01144 C871 01145 C871 18 CLC ;ADD X 01146 C872 AD AD CB LDA XC: 01147 C875 29 F8 AND #$F8 01148 C877 6D C8 CB ADC LBYTE: 01149 C87A 8D C8 CB STA LBYTE: 01150 C87D AD AE CB LDA XC:+1 01151 C880 6D C9 CB ADC HBYTE: 01152 C883 8D C9 CB STA HBYTE: 01153 C886 01154 C886 18 CLC ;ADD LINE: 01155 C887 AD C2 CB LDA LINE: 01156 C88A 6D C8 CB ADC LBYTE: 01157 C88D 8D C8 CB STA LBYTE: 01158 C890 A9 00 LDA #$00 01159 C892 6D C9 CB ADC HBYTE: 01160 C895 8D C9 CB STA HBYTE: 01161 C898 60 RTS 01162 C899 01163 C899 01164 C899 HELP: ;THE HELP SCREEN PRINTING ROUTINE 01165 C899 A9 B5 LDA #HLPDATA: 01168 C89F 85 FC STA $FC 01169 C8A1 A0 00 LDY #$00 01170 C8A3 HELPLOOP: 01171 C8A3 B1 FB LDA ($FB),Y 01172 C8A5 C9 FF CMP #$FF 01173 C8A7 F0 0B BEQ EXITHELP: 01174 C8A9 20 D2 FF JSR CHROUT 01175 C8AC C8 INY 01176 C8AD D0 F4 BNE HELPLOOP: 01177 C8AF E6 FC INC $FC 01178 C8B1 4C A3 C8 JMP HELPLOOP: 01179 C8B4 EXITHELP: 01180 C8B4 60 RTS 01181 C8B5 01182 C8B5 HLPDATA: 01183 C8B5 0D BYTE $0D 01184 C8B6 20 20 20 TEXT " DOWN & DIRTY GRAPHICS WEDGE" 01185 C8D8 0D BYTE $0D 01186 C8D9 20 20 20 TEXT " WWW.DEFIANCESTUDIOS.COM" 01187 C8F9 0D 0D 20 BYTE $0D,$0D,$20,$5F 01188 C8FD 54 20 2D TEXT "T - TEXT SCREEN (49155)" 01189 C922 0D 20 5F BYTE $0D,$20,$5F 01190 C925 47 20 2D TEXT "G - GRAPHIC SCREEN (49158)" 01191 C94A 0D 20 5F BYTE $0D,$20,$5F 01192 C94D 43 20 2D TEXT "C - CLEAR GRAPHIC SCREEN (49161)" 01193 C972 0D 20 5F BYTE $0D,$20,$5F 01194 C975 4C 20 2D TEXT "L - SET POINT/SCREEN COLOR (49164)" 01195 C99A 0D 20 5F BYTE $0D,$20,$5F 01196 C99D 50 20 2D TEXT "P - PLOT A POINT AT X%,Y% (49167)" 01197 C9C2 0D 20 5F BYTE $0D,$20,$5F 01198 C9C5 55 20 2D TEXT "U - UNPLOT A POINT AT X%,Y% (49173)" 01199 C9EA 0D 20 5F BYTE $0D,$20,$5F 01200 C9ED 44 20 2D TEXT "D - DRAW LINE TO X%,Y% (49179)" 01201 CA12 0D 20 5F BYTE $0D,$20,$5F 01202 CA15 57 20 2D TEXT "W - UNDRAW LINE TO X%,Y% (49187)" 01203 CA3A 0D 20 5F BYTE $0D,$20,$5F 01204 CA3D 46 20 2D TEXT "F - FLOOD FILL AT X%,Y% (49195)" 01205 CA62 0D 20 5F BYTE $0D,$20,$5F 01206 CA65 4F 20 2D TEXT "O - PUT CHAR Z% AT X%,Y% (49198)" 01207 CA8A 0D 20 5F BYTE $0D,$20,$5F 01208 CA8D 49 20 2D TEXT "I - GET PIXEL STATE AT X%,Y% (49201)" 01209 CAB2 0D 20 5F BYTE $0D,$20,$5F 01210 CAB5 58 20 2D TEXT "X - STOP THE WEDGE PROGRAM (49207)" 01211 CADA 01212 CADA 0D 0D BYTE $0D, $0D 01213 CADC 20 20 58 TEXT " X%, Y%, Z%, AND C% MUST BE DECLARED" 01214 CB01 0D BYTE $0D 01215 CB02 20 20 42 TEXT " BEFORE ANY WEDGE COMMANDS ARE USED." 01216 CB27 0D BYTE $0D 01217 CB28 20 20 43 TEXT " C%(16*POINT)+SCREEN." 01218 CB3E 0D 0D BYTE $0D, $0D 01219 CB40 20 20 52 TEXT " READ Z% TO GET THE PIXEL STATE" 01220 CB60 0D BYTE $0D 01221 CB61 20 20 41 TEXT " AFTER RUNNING A " 01222 CB73 5F BYTE $5F 01223 CB74 49 20 43 TEXT "I COMMAND." 01224 CB7E FF BYTE $FF 01225 CB7F 01226 CB7F 01227 CB7F 01228 CB7F ;LOOKUP TABLE FOR DOTS IN THE BYTE. XLOOKUP IS FOR THE 01229 CB7F ;PLOT ROUTINE AND ULOOKUP IS FOR THE UNPLOT ROUTINE 01230 CB7F 01231 CB7F 01 02 04 XLOOKUP: BYTE %00000001, %00000010, %00000100, %00001000 01232 CB83 10 20 40 BYTE %00010000, %00100000, %01000000, %10000000 01233 CB87 01234 CB87 FE FD FB ULOOKUP: BYTE %11111110, %11111101, %11111011, %11110111 01235 CB8B EF DF BF BYTE %11101111, %11011111, %10111111, %01111111 01236 CB8F 01237 CB8F ; R L D U DIRECTION TO LOOK 01238 CB8F 01 FF 00 XFLOOKUPLO: BYTE $01,$FF,$00,$00 01239 CB93 00 FF 00 XFLOOKUPHI: BYTE $00,$FF,$00,$00 01240 CB97 00 00 01 YFLOOKUP: BYTE $00,$00,$01,$FF 01241 CB9B 01242 CB9B 01243 CB9B 00 00 XPOS: BYTE $00,$00 01244 CB9D 00 00 YPOS: BYTE $00,$00 01245 CB9F 00 00 ZPOS: BYTE $00,$00 01246 CBA1 00 00 XOLD: BYTE $00,$00 01247 CBA3 00 00 YOLD: BYTE $00,$00 01248 CBA5 00 00 X2: BYTE $00,$00 01249 CBA7 00 00 X1: BYTE $00,$00 01250 CBA9 00 00 Y2: BYTE $00,$00 01251 CBAB 00 00 Y1: BYTE $00,$00 01252 CBAD 00 00 XC: BYTE $00,$00 01253 CBAF 00 00 YC: BYTE $00,$00 01254 CBB1 00 00 COLR: BYTE $00,$00 01255 CBB3 00 00 DX: BYTE $00,$00 01256 CBB5 00 00 DY: BYTE $00,$00 01257 CBB7 00 00 YI: BYTE $00,$00 01258 CBB9 00 00 XI: BYTE $00,$00 01259 CBBB 00 00 INCX: BYTE $00,$00 01260 CBBD 00 00 INCY: BYTE $00,$00 01261 CBBF 00 00 BALANCE: BYTE $00,$00 01262 CBC1 00 DRAW: BYTE $00 01263 CBC2 00 LINE: BYTE $00 01264 CBC3 00 XBIT: BYTE $00 01265 CBC4 00 YLO1: BYTE $00 01266 CBC5 00 YHI1: BYTE $00 01267 CBC6 00 YLO2: BYTE $00 01268 CBC7 00 YHI2: BYTE $00 01269 CBC8 00 LBYTE: BYTE $00 01270 CBC9 00 HBYTE: BYTE $00 01271 CBCA 00 00 TEMP: BYTE $00,$00 01272 CBCC 00 A0 Q1: BYTE QUE1 01273 CBCE 00 B0 Q2: BYTE QUE2 01274 CBD0