home *** CD-ROM | disk | FTP | other *** search
- ┴ ┬┴╙╔├ DEMONSTRATION PROGRAM IS ALSO INCLUDED IN THE ╒╒ SECTION FOR THIS
- PACKAGE. ╔T STARTS BY PUTTING THE PIXEL CURSOR AT THE CENTER OF THE SCREEN
- AND THEN PICKS A RANDOM POINT TO DRAW TO, AND REPEATS UNTIL YOU PRESS A KEY
- TO STOP IT. ╞OR AN INTERESTING EFFECT, PUT A CALL TO $1303 IMMEDIATELY BEFORE
- THE CALL TO DRAW THE LINE.
-
- ╘HE POINT PLOTTING SPEED IS ABOUT 4,100 PIXELS PER SECOND AND THE LINE DRAWING
- SPEED IS A BIT SLOWER THAN THIS BECAUSE OF ALL OF THE CALCULATIONS THAT HAVE
- TO BE DONE TO DRAW A LINE. ╘HERE ARE FASTER PIXEL PLOTTING AND LINE DRAWING
- ALGORITHMS THAN THE ONES IMPLEMENTED HERE, BUT THAT IS MATERIAL FOR A FUTURE
- ARTICLE.
-
- 2. ╔╬╘╥╧─╒├╘╔╧╬ ╘╧ ╘╚┼ ╓─├
-
- ╨ROGRAMMING THE 8563 ╓IDEO ─ISPLAY ├ONTROLLER IS QUITE STRAIGHT FORWARD. ┘OU
- ACCESS IT A BIT INDIRECTLY, BUT IT CAN STILL BE DONE AT RELATIVELY HIGH SPEEDS
- USING MACHINE LANGUAGE. ╘HE ╓─├ CONTAINS 37 CONTROL REGISTERS AND FROM 16╦ TO
- 64╦ OF DEDICATED DISPLAY MEMORY THAT IS SEPARATE FROM THE MAIN PROCESSOR. ╘HE
- MEMORY MUST BE ACCESSED THROUGH THE ╓─├ REGISTERS.
-
- ╘HE IMPORTANT ╓─├ REGISTERS FOR THIS EXERCISE ARE:
-
- ╥┼╟ ┬╔╘╙ ─┼╙├
- --- ---- ----
- $12 7-0 ╓─├ ╥┴═ ADDRESS HIGH BYTE
- $13 7-0 ╓─├ ╥┴═ ADDRESS LOW BYTE
- $18 7 ┬LOCK COPY / BLOCK FILL MODE SELECT
- $19 7 ┬ITMAP / ├HARACTER MODE SELECT
- $19 6 ├OLOR / ═ONOCHROME MODE SELECT
- $1A 7-4 ╞OREGROUND COLOR
- $1A 3-0 ┬ACKGROUND COLOR
- $1E 7-0 ├OPY / FILL REPETITION COUNT
- $1F 7-0 ╓─├ ╥┴═ DATA READ / WRITE
-
- ┘OU ACCESS THE ╓─├ CHIP REGISTERS THOUGH ADDRESSES $─╞00 AND $─╞01 ON BANK 15.
- ╠OCATION $─╞00 SELECTS THE ╓─├ REGISTER TO USE ON WRITE AND RETURNS THE ╓─├
- STATUS ON READ. ╘HE ONLY IMPORTANT STATUS INFORMATION IS BIT 7 (VALUE $80)
- WHICH IS THE "READY" FLAG. ╘HE FOLLOWING TWO SUBROUTINES READ OR WRITE THE
- VALUE IN .┴ TO ╓─├ REGISTER NUMBER .╪:
-
- ╓DC╥EAD: STX $DF00 ╓DC╫RITE: STX $DF00
- ╫AIT╠OOP: BIT $DF00 ╫AIT╠OOP: BIT $DF00
- BPL ╫AIT╠OOP BPL ╫AIT╠OOP
- LDA $DF01 STA $DF01
- RTS RTS
-
- ╧NCE THE CURRENT ╓─├ REGISTER IS SELECTED AT $DF00, IT REMAINS SELECTED. ┘OU
- MAY READ OR WRITE IT THOUGH $DF01 AS MANY TIMES AS YOU LIKE AS LONG AS YOU
- WAIT FOR THE ╓─├ TO BE "READY" BETWEEN ACCESSES.
-
- ╔N ORDER TO ACCESS THE ╓─├ ╥┴═, YOU MUST FIRST PUT THE HIGH AND LOW BYTES OF
- THE ╓─├ ╥┴═ ADDRESS INTO REGISTERS $12 AND $13 (HIGH BYTE FIRST) AND THEN
- READ OR WRITE THROUGH REGISTER $1F TO READ OR WRITE THE DATA IN THE ╓─├ ╥┴═.
- ┴FTER EACH ACCESS TO REGISTER $1F, THE ╓─├ ╥┴═ ADDRESS IS INCREMENTED BY ONE.
- ╙O, IF YOU REPEATEDLY READ OR WRITE TO REGISTER $1F YOU CAN READ OR WRITE A
- CHUNK OF ╓─├ MEMORY VERY QUICKLY.
-
- 3. ┼╬╘┼╥╔╬╟ ╟╥┴╨╚╔├╙ ═╧─┼
-
- ┴CTIVATING THE GRAPHICS MODE OF THE ╓─├ IS VERY SIMPLE - YOU JUST HAVE TO SET
- BIT 7 OR ╓─├ REGISTER $19 AND POOF! ┘OU SHOULD ALSO CLEAR BIT 6 OF THAT
- REGISTER TO DISABLE THE CHARACTER COLOR MODE. ╘HIS GRAPHICS PACKAGE SUPPORTS
- ONLY MONOCHROME GRAPHICS SINCE THE STANDARD 16╦ ╓─├ DOES NOT HAVE ENOUGH SPACE
- TO HOLD BOTH THE BITMAP AND THE 8*8 PIXEL CELL ATTRIBUTES. ╘HE 640*200 PIXEL
- DISPLAY TAKES 128,000 BITS OR 16,000 BYTES. ╘HIS LEAVES 384 BYTES OF ╓─├ ╥┴═
- THAT IS NOT NEEDED BY THE BITMAP BUT IT IS NOT LARGE ENOUGH TO DO ANYTHING
- WITH, SO IT IS WASTED.
-
- ╫HEN YOU DISABLE THE CHARACTER COLOR MODE, THE ╓─├ TAKES ITS FOREGROUND AND
- BACKGROUND COLOR VALUES FROM REGISTER $1A. ╘HE FOREGROUND COLOR IS WHAT COLOR
- THE "1" BITS IN THE BITMAP WILL BE DISPLAYED IN AND THE BACKGROUND COLOR, THE
- "0" BITS.
-
- ╬OW THAT THE BITMAP MODE IS SET UP, WE MUST CLEAR THE ╓─├ MEMORY LOCATIONS 0
- TO 15999 (DECIMAL) TO CLEAR THE BITMAP SCREEN. ╘HIS CAN BE DONE VERY QUICKLY
- USING THE ╓─├ FILL MODE. ╔F YOU POKE A VALUE INTO ╓─├ REGISTER NUMBER $1E,
- THE ╓─├ WILL FILL ITS MEMORY FROM THE LOCATION CURRENTLY IN THE ╓─├ ╥┴═
- ADDRESS REGISTERS FOR THE NUMBER OF BYTES YOU JUST POKED INTO REGISTER $1E
- WITH THE VALUE THAT YOU LAST POKED INTO THE ╓─├ ╥┴═ DATA REGISTER. (╘HIS IS
- ASSUMING THAT "FILL" MODE IS SELECTED IN REGISTER $18). ╔F YOU POKE A 0 INTO
- THE REPEAT REGISTER IT MEANS TO FILL 256 BYTES.
-
- ╙O, TO CLEAR THE BITMAP, POKE A ZERO INTO BOTH OF THE ╓─├ ╥┴═ ADDRESS
- REGISTERS SINCE THE BITMAP STARTS AT LOCATION 0. ╘HEN POKE A VALUE OF 0 INTO
- ╓─├ ╥┴═ DATA REGISTER. ╘HIS SETS THE FILL VALUE TO 0 AND POKES THE FIRST ╓─├
- ╥┴═ LOCATION. ╘HEN, GO INTO A LOOP AND PUT A ZERO INTO THE ╓─├ REPEAT
- REGISTER 63 TIMES. ╘HIS WILL FILL 63 CONTIGUOUS CHUNKS OF 256 BYTES EACH.
- ╫E END UP FILLING 16,129 BYTES, BUT THAT IS NOT A PROBLEM SINCE WE HAVE 384
- "SAFETY" BYTES AT THE END OF THE BITMAP. ╔NTERNALLY, THE ╓─├ WILL FILL ITS
- MEMORY AT A RATE OF ABOUT 1 ═EGABYTE PER SECOND (IF ╔ REMEMBER MY TEST RESULTS
- CORRECTLY), SO CLEARING THE SCREEN IS A ╨─╤ OPERATION.
-
- 4. ┼╪╔╘╔╬╟ ╟╥┴╨╚╔├╙ ═╧─┼
-
- ╘O EXIT FROM GRAPHICS MODE WE HAVE TO RELOAD THE CHARACTER SET FROM THE ╥╧═
- ON BANK 14 AND WE HAVE TO GO BACK INTO CHARACTER MODE AND CLEAR THE TEXT
- SCREEN. ╘HE KERNEL PROVIDES ITS OWN CHARACTER RELOAD ROUTINE SO ╔ USED THAT.
- ╘HE ONLY PROBLEM WITH IT IS THAT IT IS A LOT SLOWER THAN IT HAS TO BE. ╔T
- TAKES ABOUT 0.45 SECONDS WHEREAS THE SAME JOB CAN BE DONE IN ABOUT 0.09
- SECONDS. ╘HE KERNEL IS SO SLOW BECAUSE IT USES THE KERNEL ╔╬─╞┼╘├╚ NONSENSE.
-
- ╘HEN YOU JUST SET THE BITMAP MODE BIT TO ZERO AND THE CHARACTER COLOR MODE TO
- ONE. ╘HIS GETS YOU BACK TO NORMAL CHARACTER MODE. ┘OU ALSO HAVE TO CLEAR THE
- TEXT SCREEN SINCE IT WILL BE FILLED WITH GARBAGE FROM THE GRAPHING.
-
- 5. ╨╧╔╬╘ ╨╠╧╘╘╔╬╟
-
- ╘HE PIXELS ON THE SCREEN ACCESSED BY THEIR ╪ AND ┘ COORDINATES, 0 <= ╪ <= 639,
- 0 <= ┘ <= 199. ╘HE FORMULA TO CALCULATE THE BYTE ADDRESS IN THE ╓─├ ╥┴═ GIVEN
- THE ╪ AND ┘ COORDINATES IS MADE SIMPLE BY THE MAPPING OF BYTES TO THE PIXELS
- ON THE SCREEN. ╘HE BYTES OF ╓─├ MEMORY GO ACROSS THE SCREEN RATHER THAN IN
- 8*8 CELLS LIKE THE ╓╔├ SCREEN. ┼ACH PIXEL ROW IS DEFINED BY 80 CONSECUTIVE
- BYTES OF ╓─├ ╥┴═.
-
- ╘HE FORMULA FOR THE BYTE ADDRESS OF A PIXEL IS: ┴─=┘*80+╔╬╘(╪/8), AND THE
- FORMULA FOR THE BIT NUMBER IS SIMPLY ┬╔=╪ ┴╬─ 7. ╘HE BIT NUMBER CAN BE USED
- AS AN INDEX INTO A TABLE OF BIT VALUES: [$80,$40,$20,$10,$08,$04,$02,$01],
- SUCH THAT INDEX 0 CONTAINS $80, SINCE THE HIGHEST BIT IS THE LEFTMOST BIT.
-
- ├ALCULATING THE BIT NUMBER AND LOOKING UP THE BIT VALUE IS VERY EASY TO DO IN
- MACHINE LANGUAGE, BUT THE BYTE ADDRESS CALCULATION REQUIRES A LITTLE MORE
- WORK. ╞IRST WE HAVE TO MULTIPLY THE ┘ VALUE BY 80, USING A 16-BIT WORD FOR
- STORAGE. ╘HIS IS DONE BY SHIFTING THE ┘ VALUE LEFT TWICE, ADDING THE ORIGINAL
- ┘ VALUE, AND SHIFTING LEFT FOUR MORE TIMES. ╘HEN WE HAVE TO SHIFT THE ╪ VALUE
- RIGHT BY THREE USING A 16-BIT WORD FOR STORAGE TO GET ╔╬╘(╪/8), AND WE ADD THE
- TWO RESULTS TOGETHER AND WE HAVE THE BYTE ADDRESS.
-
- ╘O PLOT THE POINT, WE HAVE TO PEEK INTO THE ╓─├ ╥┴═ AT THE BYTE ADDRESS TO SEE
- WHAT IS "BEHIND" THE PIXEL WE WANT TO PLOT. ╘HEN ╧╥ THE NEW BIT VALUE ON TO
- THE "BACKGROUND" VALUE AND POKE THE RESULT BACK INTO ╓─├ ╥┴═ AT THE BYTE
- ADDRESS. ╒NFORTUNATELY, SINCE THE ╓─├ ╥┴═ ADDRESS REGISTER AUTO-INCREMENTS
- AFTER EACH REFERENCE, WE WILL HAVE TO SET IT TWICE - ONCE FOR THE READ AND
- ONCE FOR THE WRITE. ╘HAT MEANS THAT THE ╓─├ REGISTERS HAVE TO BE ACCESSED SIX
- TIMES FOR EACH PIXEL. ╞ORTUNATELY, THE ╓─├ OPERATES AT ITS HIGHEST SPEED IN
- MONOCHROME BITMAP MODE (IT HAS LESS WORK TO DO THAN IN COLOR CHARACTER MODE,
- SO IT IS ABLE TO PAY MORE ATTENTION TO THE ├╨╒).
-
- ┼FFECTS OTHER THAN JUST PLOTTING THE POINT CAN BE ACHIEVED BY USING FUNCTIONS
- OTHER THAN ╧╥ TO PUT THE POINT ON THE BACKGROUND. ┼╧╥ WOULD "FLIP" THE PIXEL,
- AND ┴╬─-╬╧╘ (ACHIEVED BY ╠─┴ BITVAL : ┼╧╥ #$FF : ┴╬─ BACKGROUND) WOULD ERASE
- THE PIXEL.
-
- 6. ╠╔╬┼ ─╥┴╫╔╬╟
-
- ╘HE LINE DRAWING ROUTINE THAT IS IMPLEMENTED IN THE PACKAGE IS GIVEN BY THE
- FOLLOWING ┬┴╙╔├ CODE (IN FACT, ╔ PROGRAMMED IT IN ┬┴╙╔├ FIRST TO GET IT
- WORKING; OF COURSE, THE ┬┴╙╔├ VERSION IS AS SLOW AS HELL):
-
- 10 DX=X-LX:DY=Y-LY
- 20 IF ABS(DX)>ABS(DY) THEN BEGIN R=DX:GY=DY/ABS(DX):GX=SGN(DX)
- 30 BEND:ELSE R=DY:GX=DX/ABS(DY):GY=SGN(DY)
- 40 PX=LX+0.5:PY=LY+0.5
- 50 FORI=1TO ABS(R): <╨╠╧╘ ╨╪,╨┘> :PX=PX+GX:PY=PY+GY:NEXT
- 60 LX=X:LY=Y
-
- ╘HIS IMPLEMENTS THE ┬ASIC ╔NCREMENTAL ┴LGORITHM FOR RASTER LINE DRAWING. ╘HE
- "LX" AND "LY" ARE THE POSITION OF THE PIXEL CURSOR AND "X" AND "Y" ARE THE
- COORDINATES TO DRAW THE LINE TO. ╘HE "DX" AND "DY" ARE THE DIFFERENCES IN THE
- ╪ AND ┘ DIRECTIONS. ╘HE IDEA IS THAT WE WILL INCREMENT THE PIXEL CURSOR BY
- A CONSTANT OF 1 IN ONE DIRECTION AND BY A FRACTION 0.0 <= G <= 1.0 IN THE
- OTHER DIRECTION. ╘HIS FRACTION IS ACTUALLY THE SLOPE OF THE LINE.
-
- ╠INES 20 AND 30 FIGURE OUT THE INCREMENTS FOR THE ╪ AND ┘ DIRECTIONS ("GX" AND
- "GY"). ╘HESE ARE SIGNED FRACTIONAL NUMBERS ON THE RANGE -1.0 <= G <= 1.0.
- ╫E CHECK THE "DX" AND "DY" TO SEE WHICH HAS THE GREATEST ABSOLUTE VALUE AND
- THAT WILL BE THE DIRECTION THAT IS INCREMENTED BY 1, 0, OR -1 AND THE OTHER
- DIRECTION WILL INCREMENT BY THE (FRACTIONAL) SLOPE OF THE LINE WITH RESPECT TO
- THE OTHER DIRECTION.
-
- ╠INE 40 STARTS THE PLOTTING AT THE CURRENT PIXEL CURSOR LOCATION ╨╠╒╙ 0.5. ╫E
- ADD 1/2 TO THE ╪ AND ┘ POSITIONS TO "CENTER" ONTO THE PIXEL CELL. ╔F WE
- DIDN'T DO THIS, WE WOULD NOTICE DIS-SYMMETRY IN PLOTTING TO THE LEFT AND TO
- THE RIGHT. ╞OR EXAMPLE, 50.0 - 0.3 = 49.7 AND 50.0 + 0.3 = 50.3. ╔F WE
- TRUNCATE THESE VALUES, GOING LEFT BY 0.3 MOVES US TO POSITION 49 WHEREAS GOING
- RIGHT BY 0.3 MAKES US STAY IN THE SAME POSITION. ╘HIS IS DIS-SYMMETRY AND
- MAKES PLOTS LOOK A BIT OFF. ┴DDING 0.5 CORRECTS THE PROBLEM.
-
- ╠INE 50 GOES INTO A LOOP FOR THE LONGEST DIMENSION OF THE LINE (THE ONE
- INCREMENTED BY 1). ╘HE <╨╠╧╘ ╨╪,╨┘> IS NOT EXACTLY ┬┴╙╔├; YOU SUBSTITUTE
- THE CALL TO THE POINT PLOT ROUTINE DESCRIBED IN THE PREVIOUS SECTION. ╔T
- REPEATEDLY ADDS THE ╪ AND ┘ INCREMENT VALUES UNTIL THE LINE IS FINISHED.
- ╘HIS ALGORITHM DRAWS THE LINE IN THE DIRECTION THAT YOUR END POINTS IMPLY.
-
- 6.1. ╞╥┴├╘╔╧╬┴╠ ╬╒═┬┼╥ ╥┼╨╥┼╙┼╬╘┴╘╔╧╬
-
- ╘HERE ARE ONLY TWO REAL COMPLICATIONS TO THE MACHINE LANGUAGE IMPLEMENTATION
- ARE THE REPRESENTATION OF THE SIGNED FRACTIONAL NUMBERS AND THE DIVISION OF
- THE FRACTIONAL NUMBERS. ╘O REPRESENT THE NUMBERS ╔ USE A 32-BIT FORMAT WITH
- A 16-BIT SIGNED INTEGER PORTION (-32768 TO +32767) AND A 16-BIT FRACTIONAL
- PORTION (0.0 TO 0.99998474 IN 0.00001526 INCREMENTS). ╘HE WEIGHT VALUES OF
- THE BIT POSITIONS ARE AS FOLLOWS:
-
- ╨╧╙ 31 ... 22 21 20 19 18 17 16 15 14 13 12 11 10 9 ... 0
- ╓┴╠ 32768 ... 64 32 16 8 4 2 1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 ...1/65536
-
- ╞OR EXAMPLE, 0...00001011101.10011010000...0 (NOTICE THE ┬╔╬┴╥┘ POINT) IS
- 64 + 16 + 8 + 4 + 1 + 1/2 + 1/16 + 1/32 + 1/128 = 93.6015625 IN DECIMAL. ╧R,
- AS A SHORT CUT, YOU CAN CONSIDER THE INTEGER 16 BITS AND THE FRACTIONAL 16
- BITS AS INDEPENDENT WORDS AND ADD 1/65536TH OF THE SECOND TO THE FIRST. ╘HUS,
- FOR THE EXAMPLE ABOVE, THE QUANTITY IS 93 + (32768+4096+2048+512)/65536 =
- 93.6015625. (╟OOD, THEY BOTH MATCH). ╘HE FIRST CALCULATION USES TRUE BASE 2
- WHEREAS THE SECOND CALCULATION USES BASE 65536.
-
- ╘WO'S COMPLEMENT REPRESENTATION IS USED TO ACHIEVE SIGNEDNESS (,╨ARK!). ╫E
- SHOULD ALL KNOW ABOUT TWO'S COMP. ╫ELL, IT WORKS JUST FINE FOR FRACTIONAL
- BINARY NUMBERS AS WELL. ╔N FACT, IT MAKES NO DIFFERENCE AT ALL. ┘OU CAN JUST
- THINK OF THE QUANTITY AS AN INTEGER NUMBER OF 65536'S OF A PIXEL AND YOU GET
- THE INTEGER OPERATIONS OF COMPLEMENT, ADD, AND SUBTRACT FOR FREE. ╘HE EASY
- WAY TO GET THE TWO'S COMP. REPRESENTATION OF A NUMBER IS TO TAKE THE POSITIVE
- BINARY IMAGE OF THE NUMBER AND SUBTRACT IT FROM 0 (THIS MAKES PERFECT SENSE
- SINCE 0 - X = -X).
-
- ╞RACTIONAL BINARY DIVISION IS A LITTLE MORE COMPLICATED. ╘HERE IS NO PROBLEM
- WITH THE BINARY POINT, SINCE THE LAWS OF MATHEMATICS SAY WE CAN MULTIPLY THE
- TOP AND BOTTOM BY THE SAME QUANTITY (LIKE 65536) WITHOUT CHANGING THE RESULT,
- BUT HANDLING THE TWO'S COMPLEMENT IS A PROBLEM. ╫HAT ╔ DID WAS FIGURE OUT
- WHAT THE SIGN OF THE RESULT OF THE DIVISION WAS GOING TO BE (BY ┼╧╥ING THE
- SIGN BITS TOGETHER) AND THEN CONVERTED THE TWO OPERANDS TO THEIR POSITIVE
- VALUE IF THEY WERE ORIGINALLY NEGATIVE. ╘HIS LETS ME PERFORM A 32-BIT
- UNSIGNED DIVISION OPERATION AND THEN ╔ CONVERT THE RESULT TO A NEGATIVE IF THE
- RESULT IS SUPPOSED TO BE NEGATIVE. ╘HE 32-BIT DIVIDE IS NOT ALL THAT
- COMPLICATED; IT IS DONE THE SAME WAY THAT YOU WOULD DO IT ON PAPER (REMEMBER
- THOSE DAYS) EXCEPT YOU USE BINARY DIGITS. ╘HE DIVIDE SUBROUTINE DOES NOT
- EXACTLY RIVAL SUPERCOMPUTER SPEEDS, BUT IT DOES GET THE JOB DONE.
-
- 6.2. ═┴├╚╔╬┼ ╠┴╬╟╒┴╟┼ ╧╨┼╥┴╘╔╧╬
-
- ╫HILE DRAWING THE LINE, THE ╪ AND ┘ COORDINATES ARE 32-BIT SIGNED FRACTIONAL
- NUMBERS AS WELL AS THE "GX" AND "GY" VECTOR COMPONENTS ("GO" VALUES). ╠INES
- 20 AND 30 REQUIRE QUITE A BIT OF WORK IN 6502 MACHINE LANGUAGE AND USE THE
- 32-BIT ADD, SUBTRACT, 2'S COMPLEMENT, AND DIVIDE OPERATIONS DESCRIBED IN THE
- PREVIOUS SECTION. ╘O FIND THE ┴┬╙OLUTE VALUE OF A NUMBER, CHECK TO SEE
- WHETHER IT IS POSITIVE OR NEGATIVE. ╔F IT IS POSITIVE, YOU ARE DONE. ╔F IT
- IS NEGATIVE, JUST DO A 2'S COMPLEMENT ON IT (MAKES SENSE: 0 - (-X) = X).
-
- ╠INE 40 IS DONE BY SIMPLY TAKING THE PIXEL CURSOR ╪ AND ┘ COORDINATES (WHICH
- ARE STORED AS UNSIGNED INTEGERS AND ARE REMEMBERED BETWEEN LINE DRAW CALLS)
- AND PUT THEM INTO THE HIGH WORD OF A 32-BIT FIELD AND THEN PUT $8000 (32768)
- INTO THE LOW WORD (WHICH GIVES ╓ + 1/2).
-
- ╠INE 50 IS EASILY IMPLEMENTED AS A LOOP THAT DECREMENTS THE "R" WORD UNTIL IT
- REACHES ZERO, WHILE CALLING THE POINT PLOT ROUTINE AND DOING THE 32-BIT ADD TO
- ADD THE "G" VALUES TO THE ╪ AND ┘ COORDINATES. ╫HEN THE LINE IS FINISHED, THE
- FINAL ╪ AND ┘ COORDINATES ARE PUT BACK INTO THE PIXEL CURSOR POSITION STORAGE
- AND THE PACKAGE IS READY FOR THE NEXT CALL.
-
- 7. ├╧╬├╠╒╙╔╧╬
-
- ╚A! ╘HIS AIN'T NO FORMAL PAPER SO ╔ DON'T HAVE TO WRITE A CONCLUSION.
- ╙O THERE! [┼D.╬OTE - ╚E IS CURRENTLY WORKING ON HIS ═ASTERS THESIS, SO YOU'LL
- HAVE TO PARDON 'EM HERE.. (GRIN) ]
-
- ================================================================================
- BEGIN 640 HIRES80.BIN
- ═`!-,`15,$1-,2!-,$!-,$!.╙8*─`├0#_╩>"┬&┬#,╙:╞'╚┴─@╙,╓╔`*(2(,╙-
- ═┌"#,╙:─`(,╦-╩2"┬&"#,╙:─`╚┴┌@/╥#,╙8├0^╞`@#,┌╔─╥#2_┌(9╩4=,╙,╓$
- ═^╚7\╞*``┴/╠*)╧╠*)╧╠89?╩0`╬;["┬;["┬;["┬;["┬;[┴?╩┼_(;]1╧╒╩1╧╒╩
- ═1╧╒╩&&7┌┴?╩┼_67[┴?╬┼_"─'╩╦╓>$╪7\8(!`(!`(!`(!```@5╤.┼^┌(2(,╙-
- ═╔?╦╚(,╙-(-├-!?╥╚╔?╬┬$┬#,╙:7┌┌"#,╙9┴,╥╠╓╔`(5─┴66%9╚5╟┴5*%4╪54
- ═╚┬`&8"9┴)╞(╞8╥92)┼,╞5*54╘`╩┼4╠50╔5/┼49`1.*52┘5"%4╩53┘5&%4[`"
- ═╤┼0╞9"9┼)╞8╞9\╦0╥&"$4*90$!`╪┴5"╔`.502(10╩0#┼4*┴╚8$┬╔`(5@┴6$@
- ═╙╤-╚$!─╪╩0#┼9(5─╩0#┼985┼╩0#┼9╚5╞╩0#┼9╪5╟8*4,╔`╘@&┴2%^╚3[╔1"─
- ═$2`:%(7\┴/╓┼_,7┌╔?╫┼^[!$╔?╩%$╚50╔?╬%$╪51╔?╥%8╩7]┴6.┼$2`╤%*(#
- ══625#╠╚0^:4-,`╩╔`(4-╩0&%#-`&╩?^%#84,.*─`┘1*%$╩─`┘1.%$╓"┼_(42
- ═┴5"┼_843┴5&┼^╚5┬╔?╬%8┌4-(#$4╚@.╒9)4*╥┴#┘3.╚4+/__+/__+/__╔1$╨
- ═"╩─`┴1&╔`840╘`:╔_╪41┴1!,╦┴2╨!╪6+┴╚╥$├6"%!(8%┴`┬┬!┌─`┼0╦*$/╠╪
- ═╔03┼┬╪4,╔07┼├(4-.*4(┘8╓%$*─`╠`*╔_╪41(%@4╔8╬%!*6,┴06╔@(4#┴0>╔
- ═`(4"┴0:┼├84(╩0"%":4$╔@6─"""╚$┌42!1/╨.╤┬┼`╞4*┴0*┼`╓4+┴0.┼!&4,
- ═┴02┼!64-┴048╔09┼#╚4&╔0=┼#╪4'╔0┴┼$(4(╔0┼┼$84)┘┴+0╬^833%05╔02╞
- &!:0(3`,5
- `
- END
- ================================================================================
- BEGIN 640 HIRES.DEMO
- ═`1╨╤'&0`┬╥#"*-$╚(├$╙,$8┬*2─@╠[$@╘2@┬0├,┬*2"╟(/╪1(─┴)4─53.#`╬
- ═0─┼.(@!!'&╪`╟┬#1*"(╤,╙`╙(┬─`4┴╤╪`$12╠═$╚(├$╙,#`┬*0!╙'((`╟┬!$
- ═4┬╨╙,├`@╦╥`╥-34╠,╙(╨╦3(╒-┬╨╤,#`╠,`"%'(╨`6+*╒*+╠╚,2╞╠-├0╨*0"7
- ═')8`6;*╒*+╠╚,2╞╠,├`╨*0"╥'*``╟┬!$4┬╤8(*\@,├4╒+%┬═,├4╓+%─╠,0"[
- ╠'*╚`╚2!!)`#-'+0`┬╥!!)+(┬(┬"╟(#$╘,`#='+╪`╟┬#1*"(╤,╙`╓(┬─```"[
- `
- END
- ==============================================================================
- ;*****************************************************************************
- ;* "╚╔╥┼╙80.┬╔╬" HIRES LINE PLOTTING PACKAGE FOR THE ├OMMODORE 128 80-COL *
- ;* SCREEN. *
- ;* *
- ;* ╘HIS PACKAGE CONTAINS A COUPLE OF IRREGULARITIES THAT ╔ DISCOVERED *
- ;* WHILE ╔ WAS COMMENTING IT. ╔ LEFT THEM IN RATHER THAN START ALL OVER, *
- ;* SINCE THIS PACKAGE WAS WRITTEN WITH A MONITOR RATHER THAN AN ASSEMBLER. *
- ;*****************************************************************************
-
- ;*****************************************************************************
- ;* PACKAGE ENTRY POINTS *
- ;*****************************************************************************
-
- .$1300 [4C 01 15] JMP $1501 ;JMP TO DRAW LINE/POSITION PIXEL CURSOR
- .$1303 [4C 11 13] JMP $1311 ;JMP TO ENTER HIRES MODE
- .$1306 [4C 48 13] JMP $1348 ;JMP TO EXIT HIRES MODE
- .$1309 [4C 10 13] JMP $1310 ;RESERVED
- .$130C [4C 10 13] JMP $1310 ;RESERVED
- .$130F: $B3 ;LIBRARY LOADED IDENTIFIER
- .$1310 [60 ] RTS
-
- ;*****************************************************************************
- ;* ENTER HIRES MODE *
- ;*****************************************************************************
-
- .$1311 [A9 00 ] LDA #$00 ;SWITCH TO BANK 15 (KERNAL BANK)
- .$1313 [8D 00 FF] STA $FF00
- .$1316 [A9 E0 ] LDA #$E0 ;SET COLOR TO LIGHT GREY ON BLACK
- .$1318 [A2 1A ] LDX #$1A
- .$131A [20 CC CD] JSR $CDCC
- .$131D [A9 87 ] LDA #$87 ;ENTER BITMAP MODE (NOTE - FOR VERSION 2 ╓─├)
- .$131F [A2 19 ] LDX #$19
- .$1321 [20 CC CD] JSR $CDCC
- .$1324 [A9 00 ] LDA #$00 ;SET ╓─├ ╥┴═ ADDRESS HIGH
- .$1326 [A2 12 ] LDX #$12
- .$1328 [20 CC CD] JSR $CDCC
- .$132B [E8 ] INX ;SET ╓─├ ╥┴═ ADDRESS LOW
- .$132C [20 CC CD] JSR $CDCC
- .$132F [A9 00 ] LDA #$00 ;SET ╓─├ ╥┴═ DATA REGISTER TO $00
- .$1331 [20 CA CD] JSR $CDCA
- .$1334 [A9 20 ] LDA #$20 ;SELECT BLOCK FILL MODE
- .$1336 [A2 18 ] LDX #$18
- .$1338 [20 CC CD] JSR $CDCC
- .$133B [A9 00 ] LDA #$00 ;FILL 256*63 ╓─├ BYTES WITH 0
- .$133D [A2 1E ] LDX #$1E ; TO CLEAR THE HIRES SCREEN
- .$133F [A0 3F ] LDY #$3F
- .$1341 [20 CC CD] JSR $CDCC
- .$1344 [88 ] DEY
- .$1345 [D0 FA ] BNE $1341
- .$1347 [60 ] RTS
-
- ;*****************************************************************************
- ;* EXIT HIRES MODE *
- ;*****************************************************************************
-
- .$1348 [20 0C CE] JSR $CE0C ;RELOAD THE CHARACTER SETS
- .$134B [A9 93 ] LDA #$93 ;CLEAR THE TEXT SCREEN
- .$134D [20 D2 FF] JSR $FFD2
- .$1350 [A2 19 ] LDX #$19 ;RESTORE COLOR TEXT MODE
- .$1352 [A9 47 ] LDA #$47
- .$1354 [4C CC CD] JMP $CDCC
-
- ;*****************************************************************************
- ;*CALCULATE THE BITMAP BYTE ADDRESS AND BIT VALUE FOR PIXEL GIVEN X=.┴╪,Y=.┘ *
- ;*****************************************************************************
-
- .$1357 [84 FA ] STY $FA ;SAVE .┴ AND .┘
- .$1359 [85 FC ] STA $FC
- .$135B [98 ] TYA ;PUT PIXEL CURSOR Y POSITION INTO .┴
- .$135C [A0 00 ] LDY #$00 ;CLEAR PIXEL CURSOR Y POSITION HIGH BYTE
- .$135E [84 FB ] STY $FB
- .$1360 [0A ] ASL A ;MULTIPLY PIXEL CURSOR Y BY 2 GIVING Y*2
- .$1361 [26 FB ] ROL $FB ; AND WE MUST SHIFT THE HIGH BYTE TO
- .$1363 [0A ] ASL A ;AGAIN, GIVING Y*4
- .$1364 [26 FB ] ROL $FB
- .$1366 [18 ] CLC ;ADD THE ORIGINAL Y, GIVING Y*5
- .$1367 [65 FA ] ADC $FA
- .$1369 [90 02 ] BCC $136D
- .$136B [E6 FB ] INC $FB
- .$136D [0A ] ASL A ;MULTIPLY BY 2 AGAIN, GIVING Y*10
- .$136E [26 FB ] ROL $FB
- .$1370 [0A ] ASL A ;AGAIN, GIVING Y*20
- .$1371 [26 FB ] ROL $FB
- .$1373 [0A ] ASL A ;AGAIN, GIVING Y*40
- .$1374 [26 FB ] ROL $FB
- .$1376 [0A ] ASL A ;AGAIN, GIVING Y*80: HA! WE ARE DONE
- .$1377 [26 FB ] ROL $FB
- .$1379 [85 FA ] STA $FA ;SAVE LOW BYTE OF Y*80
- .$137B [A5 FC ] LDA $FC ;RESTORE X COORDINATE LOW BYTE
- .$137D [86 FD ] STX $FD ;SET UP X COORDINATE HIGH BYTE
- .$137F [46 FD ] LSR $FD ;DIVIDE THE X COORDINATE BY 2 GIVING X/2
- .$1381 [6A ] ROR A ; WE MUST ROR THE HIGH BYTE, THEN THE LOW
- .$1382 [46 FD ] LSR $FD ;AGAIN, GIVING X/4
- .$1384 [6A ] ROR A
- .$1385 [46 FD ] LSR $FD ;AGAIN, GIVING X/8: DONE
- .$1387 [6A ] ROR A
- .$1388 [18 ] CLC ;NOW ADD Y*80 AND X/8
- .$1389 [65 FA ] ADC $FA
- .$138B [85 FA ] STA $FA
- .$138D [A5 FD ] LDA $FD
- .$138F [65 FB ] ADC $FB
- .$1391 [85 FB ] STA $FB ;GIVING US THE PIXEL BYTE ADDRESS IN ($FA)
- .$1393 [A5 FC ] LDA $FC ;GET X MOD 8
- .$1395 [29 07 ] AND #$07 ; HA! WE CAN JUST EXTRACT THE LOW THREE BITS
- .$1397 [AA ] TAX
- .$1398 [BD 9E 13] LDA $139E,X ;LOOK UP THE BIT VALUE IN THE TABLE
- .$139B [85 FC ] STA $FC ; AND SAVE IT AT $FC
- .$139D [60 ] RTS ;EXIT WITH ADDRESS IN ($FA) AND VALUE IN $FC
-
- ;*****************************************************************************
- ;* BIT VALUE TABLE *
- ;*****************************************************************************
-
- .$139E: $80 $40 $20 $10 ;BIT VALUES STORED LEFT TO RIGHT
- .$13A2: $08 $04 $02 $01
-
- .$13A6 [00 ] BRK ;FILLER - ╔ FORGET WHY ╔ PUT IT HERE
- .$13A7 [00 ] BRK
-
- ;*****************************************************************************
- ;* PLOT PIXEL AT X=.┴╪, Y=.┘ ON BITMAP SCREEN *
- ;*****************************************************************************
-
- .$13A8 [20 57 13] JSR $1357 ;CALCULATE THE PIXEL ADDRESS AND VALUE
- .$13AB [A5 FB ] LDA $FB ;SET ╓─├ ╥┴╬ ADDRESS HIGH TO PIXEL ADDRESS
- .$13AD [A2 12 ] LDX #$12
- .$13AF [20 CC CD] JSR $CDCC
- .$13B2 [A5 FA ] LDA $FA ;SET ╓─├ ╥┴═ ADDRESS LOW TO PIXEL ADDRESS
- .$13B4 [E8 ] INX
- .$13B5 [20 CC CD] JSR $CDCC
- .$13B8 [20 D8 CD] JSR $CDD8 ;PEEK THE ╓─├ ╥┴═ ADDRESS
- .$13BB [05 FC ] ORA $FC ;╧╥ ON THE NEW PIXEL VALUE
- .$13BD [A8 ] TAY ; AND SAVE THE RESULT (BYTE TO POKE BACK)
- .$13BE [A5 FB ] LDA $FB ;RESET THE ╓─├ ╥┴═ ADDRESS TO THE PIXEL
- .$13C0 [A2 12 ] LDX #$12 ; ADDRESS; THIS IS NECESSARY SINCE THE
- .$13C2 [20 CC CD] JSR $CDCC ; ╓─├ WILL INCREMENT ITS ╥┴═ ADDRESS ON
- .$13C5 [A5 FA ] LDA $FA ; EVERY ACCESS
- .$13C7 [E8 ] INX
- .$13C8 [20 CC CD] JSR $CDCC
- .$13CB [98 ] TYA
- .$13CC [4C CA CD] JMP $CDCA ;AND POKE THE NEW PIXEL BYTE VALUE
-
- ;*****************************************************************************
- ;* PERFORM THE UNSIGNED 32-BIT DIVIDE WITH 16-BIT DENOMINATOR (BOTTOM) *
- ;* [$63 $62 $61 $60] IS THE NUMERATOR (TOP) *
- ;* [$51 $50] IS THE DENOMINATOR (BOTTOM) *
- ;* [$67 $66 $65 $64] IS THE QUOTIENT (RESULT) *
- ;* [$54 $53 $52] IS THE REMAINDER *
- ;*****************************************************************************
-
- .$13CF [A9 00 ] LDA #$00 ;SET THE RESULT TO 0
- .$13D1 [85 64 ] STA $64
- .$13D3 [85 65 ] STA $65
- .$13D5 [85 66 ] STA $66
- .$13D7 [85 67 ] STA $67
-
- .$13D9 [85 52 ] STA $52 ;CLEAR THE REMAINDER
- .$13DB [85 53 ] STA $53
- .$13DD [85 54 ] STA $54
-
- .$13DF [A2 20 ] LDX #$20 ;SET THE LOOP COUNT TO 32 BITS
- .$13E1 [06 60 ] ASL $60 ;SHIFT OUT THE HIGH BIT OF THE NUMERATOR
- .$13E3 [26 61 ] ROL $61
- .$13E5 [26 62 ] ROL $62
- .$13E7 [26 63 ] ROL $63
- .$13E9 [26 52 ] ROL $52 ;SHIFT IT INTO THE REMAINDER
- .$13EB [26 53 ] ROL $53
- .$13ED [26 54 ] ROL $54
- .$13EF [A5 54 ] LDA $54 ;CHECK IF THE REMAINDER IS >= THE DENOMINATOR
- .$13F1 [D0 0A ] BNE $13FD
- .$13F3 [A5 52 ] LDA $52
- .$13F5 [C5 50 ] CMP $50
- .$13F7 [A5 53 ] LDA $53
- .$13F9 [E5 51 ] SBC $51
- .$13FB [90 11 ] BCC $140E ;IF NOT, GO TO NEXT BIT
- .$13FD [38 ] SEC ;SUBRACT THE DENOMINATOR FROM THE REMAINDER
- .$13FE [A5 52 ] LDA $52
- .$1400 [E5 50 ] SBC $50
- .$1402 [85 52 ] STA $52
- .$1404 [A5 53 ] LDA $53
- .$1406 [E5 51 ] SBC $51
- .$1408 [85 53 ] STA $53
- .$140A [B0 02 ] BCS $140E
- .$140C [C6 54 ] DEC $54
- .$140E [26 64 ] ROL $64 ;SHIFT A "1" BIT INTO THE DENOMINATOR. ╬OTE
- .$1410 [26 65 ] ROL $65 ; THE FIRST "ROL" SHOULD HAVE BEEN PRECEEDED
- .$1412 [26 66 ] ROL $66 ; BY A "SEC"; THIS IS A ┬╒╟! ╚OWEVER, IT
- .$1414 [26 67 ] ROL $67 ; WILL FAIL ONLY IF DENOM >=32768 WHICH
- ; CANNOT HAPPEN IN THIS APPLICATION.
- .$1416 [CA ] DEX ;GO ON TO THE NEXT BIT
- .$1417 [D0 C8 ] BNE $13E1
- .$1419 [60 ] RTS
-
- ;*****************************************************************************
- ;* GET THE ABSOLUTE VALUE OF THE 2'S COMP NUMBER IN .┴┘ -> .┴┘ *
- ;*****************************************************************************
-
- .$141A [84 50 ] STY $50
- .$141C [A6 50 ] LDX $50
- .$141E [10 10 ] BPL $1430 ;IF THE NUMBER IS POSITIVE, EXIT
- .$1420 [38 ] SEC ;ELSE TAKE THE 2'S COMPLEMENT OF THE NEGATIVE
- .$1421 [85 50 ] STA $50 ; VALUE TO GET THE POSITIVE VALUE
- .$1423 [A9 00 ] LDA #$00
- .$1425 [E5 50 ] SBC $50
- .$1427 [48 ] PHA
- .$1428 [84 50 ] STY $50
- .$142A [A9 00 ] LDA #$00
- .$142C [E5 50 ] SBC $50
- .$142E [A8 ] TAY
- .$142F [68 ] PLA
- .$1430 [60 ] RTS
-
- ;*****************************************************************************
- ;* PERFORM THE FRACTIONAL SIGNED 32-BIT DIVIDE *
- ;*****************************************************************************
-
- .$1431 [48 ] PHA ;REMEMBER THE SIGN OF THE RESULT
-
-