home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ENTERPRS
/
C128
/
TEXT
/
HACKING1.SFX
/
hacking1.txt
next >
Wrap
Text File
|
1990-02-12
|
63KB
|
1,185 lines
===========================================================================
╙ORRY THAT THIS IS LATER THAN ╔ HAD HOPED TO GET IT OUT, BUT HERE IT IS --
┼XPECT ANOTHER ONE SOON IN A MONTH OR TWO DEPENDING ON SUBMISSIONS... ╨RAISE,
├OMMENTS, (╔T SUCKS, ╔ LOVED IT, ETC) ARE WELCOME ->
DUCK@PEMBVAX1.PEMBROKE.EDU. ═ANY THANKS TO ├RAIG ┬RUCE FOR HIS ARTICLE ON LINE
DRAWING / DOT PLOTTING WITH THE 80 COLUMN SCREEN ON THE ├=128.
===============================================================================
╚ACKING / ╘HIS ═AGAZINE
BY ├RAIG ╘AYLOR
DUCK@PEMBVAX1.PEMBROKE.EDU
─EF:
╚ACKER - ╬OUN - ┴ TALENTED AMATEUR USER OF COMPUTERS.
╙OURCE - ╫EBSTER'S ╬EW ╫ORLD ─ICTIONARY
├ORRECTION:
╚ACKER - ╬OUN - ┴ TALENTED USER OF COMPUTERS.
╘HERE, NOW THAT WE GOT THAT OUT OF THE WAY, LET'S SEE HOW SOME PEOPLE
INTERPRET THE WORD HACKER. ╔N THE 1980'S NEWSPAPERS, MAGAZINES, MOVIES -
EVERYWHERE YA LOOKED PEOPLE WERE USING THE TERM "╚ACKER" TO DENOTE A PERSON WHO
MALICIOUSLY TRIED TO DESTROY / BORE ILL INTENT TOWARDS ANOTHER COMPUTER SYSTEM.
╘HIS WAS THE RESULT OF THE MISUNDERSTANDING OF THE ACTUAL DEFINITION OF
"╚ACKER" (UNDER MY CORRECTION ABOVE).
╘HIS MAGAZINE WILL NOT TELL PEOPLE HOW TO "PHREAK", HOW TO HHACK VOICE
MAILBOXES AND OTHER ILLEGAL ACTIVITIES. ╚OWEVER, IT WILL ATTEMPT TO REVEAL
SOME OF THE "MYSTIQUE" BEHIND SOME OF THE NEW TECHNIQUES AND ABILITIES FOUND IN
THE ├OMMODORE 64 AND ├OMMODORE 128 THAT ARE JUST NOW BEING REVEALED.
╔N THE EVENT THAT AN ARTICLE IS SUBMITTED AND THERE IS A QUESTION ABOUT IT'S
ABILITY TO BE APPLIED TOWARDS ILLEGAL ACTIVITES, THE ARTICLE WILL BE CARRIED
WITH A WARNING THAT THE INTENT IS NOT TOWARDS THAT ACTIVITY. ╚OPEFULLY, THESE
WILL NEVER COME ALONG. :-)
╘HE ├OMMODORE 64 CAME OUT IN LATE 1982 (╔ BELIEVE) AND WAS KNOWN TO ONLY
SUPPORT 16 COLORS, 320 X 200 RESOLUTION GRAPHICS OF 2 COLORS, 160X200
RESOLUTION GRAPHICS OF 4 COLORS. ╙INCE THEN PEOPLE HAVE PUSHED THE ├OMMODORE
64 TO ITS LIMITS WITH APPARENT RESOLUTION OF 320 X 200 WITH A RESOLUTION OF 4
COLORS AND EVEN HIGHER... MORE THAN 8 SPRITES ON THE SCREEN... FAST
HIGH-QUALITY DIGITIZED SOUNDS....
╘HE ├OMMODORE 128 CAME OUT AS AN "UPGRADE" FROM THE ├OMMODORE 64 AND WITH
IT'S UNIQUE MEMORY MANAGEMENT SCHEME AND THE ┌80A CHIP STILL ON THERE PEOPLE
ARE STILL FINDING OUT UNIQUE AND INTERESTING WAYS TO EXPLORE THE ├=128. ╧NE OF
THE MOST INTERESTING HAS BEEN THAT OF THE SEPERATE VIDEO DISPLAY CHIP WHICH
MAKES IT POSSIBLE TO DISPALY 640X200 RESOLUTION GRAPHICS QUICKLY AND EASILY.
**┴╘╘┼╬╘╔╧╬**
╘HIS MAGAZINE IS GOING TO BE A SOURCEBOOK OF MANY PEOPLE - ╔F YOU KNOW
ANYTHING ABOUT SOMETHING, PLEASE FEEL FREE TO SUBMIT IT. ╩UST MAIL THE ARTICLE
TO THE FOLLOWING :
DUCK@PEMBVAX1.PEMBROKE.EDU
AND A SUBJECT OF "┴╥╘╔├╠┼ - " AND THEN THE ARTICLE NAME.
╘HE SOURCE CODE FOR ALL PROGRAMS MENTIONED WITHIN ARTICLES WILL BE PROVIDED
AS WELL AS ANY EXECUTABLES UUENCODED SENT OUT SEPRATELY. [┼D. ╬OTE - ╔N THIS
ISSUE, THE SOURCE IS NOT SENT SEPERATELY DUE TO ONLY ONE ARTICLE WITH FILES]
╔N ADDITION, THE MAGAZINE WILL GO OUT WHEN THERE ARE ENOUGH ARTICLES
COLLECTED. ┴LSO, ╔'M CURRENTLY IN COLLEGE - SO - IT WILL ALSO BE DEPENDANT ON
FEW TESTS ETC BEING AROUND THE RELEASE PERIOD.
╔N THIS ISSUE:
╘ITLE ┴UTHOR(S)
------------------------------------------------------------------------------
╚ACKING - ─EFINITION ╧F DUCK@PEMBVAX1.PEMBROKE.EDU
╠EARNING ═╠ - ╨ART 1 DUCK@PEMBVAX1.PEMBROKE.EDU
6502 ╦NOWN/╒NKNOWN ╧PCODES COMPILATION OF SEVERAL
─OT ╨LOTTING & ┬ITMAPPING F2RX@JUPITER.SUN.CSD.UNB.CA
THE 8563 ╙CREEN.
** ┴LL ARTICLES AND FILES (├) 1992 BY THEIR RESPECTIVE AUTHORS.
=============================================================================
┬EGINNING ═╠ - ╨ART ╧NE
(├) 1992 BY ├RAIG ╘AYLOR
╘HE BEST WAY TO LEARN MACHINE LANGUAGE IS TO ACTUALLY CODE ROUTINES THAT YOU
DON'T THINK WILL WORK, HOPE THAT THEY WORK, AND THEN FIGURE OUT WHY THEY DON'T
WORK. (╔F THEY DO WORK, YOU TRY TO FIGURE OUT WHY YOU DIDN'T THINK THEY'D
WORK). ╔E: ╘╚┼ ┬┼╙╘ ╫┴┘ ╘╧ ╠┼┴╥╬ ┴╬┘ ╨╥╧╟╥┴══╔╬╟ ╠┴╬╟╒┴╟┼ ╔╙ ╘╧ ╨╥╧╟╥┴═ ╔╬
╘╚┴╘ ╠┴╬╟╒┴╟┼. ┴ND ═ACHINE ╠ANGUAGE IS A PROGRAMMING LANGUAGE.
╬OW, LET'S GET A FEW TERMS AND DEFINITIONS OUT OF THE WAY:
═ACHINE ╠ANGUAGE - ╔NSTRUCTIONS THAT THE COMPUTER UNDERSTANDS AT A PRIMITIVE
LEVEL AND EXECUTES ACCORDINGLY.
┴SSEMBLY ╠ANGUAGE - ╔NSTRUCTIONS MORE UNDERSTANDABLE TO HUMANS THAN PURE
═ACHINE ╠ANGUAGE THAT MAKES LIFE EASIER.
┴SSEMBLY: ═ACHINE:
┼XAMPLE: LDA #$00 $┴9 $00
╚UH? YOU MIGHT BE SAYING AT THE MOMENT. ╘URNS OUT THAT ╠─┴ STANDS FOR, OR IS
A MNEMONIC (COMPUTER PEOPLE ALWAYS COME UP WITH THESE BIG LONG WORDS -- YOU'LL
SEE MNEMONIC'S OFTEN WHEN DEALING WITH MACHINE LANGUAGE) FOR THE FOLLOWING:
"╠╧┴─ REGISTER ┴ WITH THE FOLLOWING VALUE"
^ ^ ^
├OOL 'EH? ┘EAH, BUT THERE'S SOMEBODY GRUMBLING NOW ABOUT WHY NOT MAKE IT
╠╧┴─┴ ETC.. ╚EY, THAT'S LIFE. (╟╥╔╬).
╧H, MORE DEFINITIONS:
╥EGISTER - ┴ LOCATION INSIDE THE ├╨╒ THAT CAN BE MANIPULATED DIRECTLY WITHOUT
HAVING TO ACCESS MEMORY.
╘HE "┴" REGISTER IS OFTEN CALLED THE ACCUMALATOR WHICH INDICATES ITS
FUNCTION: ALL MATH AND LOGICAL MANIPULATIONS ARE DONE TO THE "┴" REGISTER (FROM
HEREON OUT IT WILL BE REFERRED TO AS .┴).
╘HERE ARE TWO OTHER REGISTERS INSIDE THE 6502 PROCESSOR, SPECIFICALLY .╪ AND
.┘. ╘HESE REGISTERS HELP ACT AS COUNTERS AND INDEXES INTO MEMORY (SORTA LIKE
MEM[X] IN PASCAL BUT NOT QUITE...).
╬OW, LET'S ADD 3 AND 5 AND LEAVE THE RESULT IN THE ACCUMALATOR (.┴).
LDA #3 ; ╚ERE .┴ = 3 (ANYTHING W/ A ; IS A
; COMMENT AND WILL BE IGNORED BY THE ASSEMBLER...
CLC ; HU? - ╘HIS CLEARS THE CARRY. ╘HE 6502
; DOES ADDITION *EVERYTIME* WITH THE CARRY ... SO IF WE CLEAR IT IT WON'T
; AFFECT THE RESULT.
ADC #5 ; ╬OW, .┴ = .┴ + 5
AND WE'RE DONE. ╔F THE ├╠├ CONFUSED YOU THEN CONSIDER THAT IF YOU'RE ADDING
A COLUMN OF #'S:
12 <--\__╘HE 2 + 9 = 11, BUT WE PUT THE 1 DOWN AND SET THE CARRY TO 1.
+ 89 <---/
--
101
╘HEN WE SAY 1 + 8 + CARRY , WHICH IN THIS CASE HAPPENS TO = 1 AND WE GET 10
AND AGAIN WE SET THE CARRY AND WRITE DOWN 0. ╘HEN IT'S JUST THE CARRY AND WE
WRITE THAT DOWN. ╔F WE DIDN'T CLEAR THE CARRY WE MAY HAVE ENDED UP WITH THE
VALUE OF 9 INSTEAD 8 IF THE CARRY HAD HAPPENED TO BE SET.
┴AAGH, ═ATH - ╠ET'S CONTINUE - ╘HE ├╠├ MNEMONIC STANDS FOR "├╠┼┴╥ ├┴╥╥┘" AND
THE ┴─├ STANDS FOR "┴── WITH ├┴╥╥┘". ╧N MANY PROCESSORS THERE IS A ┴──
(WITHOUT A CARRY) BUT UNFORTUNATELY THE 6502 PROCESSOR INSIDE THE ├=64 DOESN'T
HAVE IT.
╙O WE'VE GOT:
LOAD REG ┴ WITH THE VALUE 5 LDA #5
CLEAR THE CARRY CLC
ADD REG A AND VALUE 3 ADC #3
╔N ┬ASIC IT'S JUST:
┴ = 5+3
╧NE STATEMENT... ╔N ═ACHINE ╠ANGUAGE YOU'VE GOT TO BREAK EVERYTHING DOWN INTO
SMALLER AND SMALLER STEPS AND QUITE OFTEN THE ═╠ LISTING WILL BE FAR LONGER
THAN THE ┬┴╙╔├ OR ╨┴╙├┴╠ OR ├ EQUIVLENT.
─EFINITIONS:
┴SSEMBLER - ╨ROGRAM TAKES SOURCE CODE IN BASIC FORM OR FROM A FILE AND
WRITES TO MEMORY OR A FILE THE RESULTING EXECUTABLE. ┴LLOWS HIGHER FLEXIBILITY
THAN A MONITOR (SEE BELOW) DUE TO USE OF LABELS ETC AND NOT HAVING TO KEEP
TRACK OF EACH ADDRESS WITHIN THE PROGRAM.
═ONITOR - ┴ PROGRAM, RESIDENT IN MEMORY, INVOKED BY A SYS CALL FROM BASIC OR
BY HITTING THE RESTORE KEY THAT WILL LET YOU DISASSEMBLE, ASSEMBLE AND EXAMINE
AREAS OF MEMORY AND EXECUTE PROGRAMS DIRECTLY FROM THE MONITOR. ╒SEFUL FOR
DEBUGGING PROGRAMS AND FOR WRITING SHORT PROGRAMS.
╠ET'S ENTER THE FOLLOWING INTO A MONITOR (IF YOU DON'T HAVE ONE THEN CONTACT
DUCK@PEMBVAX1.PEMBROKE.EDU AND ╔'LL SEND YA ONE):
128: C64:
>A 1300 LDA #$93 >A C000 LDA #$93
>A 1302 JSR $FFD2 >A C003 JSR $FFD2
>A 1305 RTS >A C005 RTS
(EXIT MONITOR) (EXIT MONITOR)
BANK15:SYS4864 SYS 49152
╫OW! ╔T CLEARED THE SCREEN. ╬EAT 'EH? ┬UT SEE HOW MUCH YA GOTTA BREAK
PROBLEMS DOWN? ╘HE FIRST STATEMENT LOADS IN $93 HEX INTO THE ACCUMALATOR ($93
HEX JUST HAPPENS TO EQUAL 147 WHICH IS ALSO THE ├OMMODORSCII CODE FOR CLEAR
SCREEN. ╞OR A WHOLE LIST JUST LOOK IN THE BACK OF THE BOOK THAT CAME WITH THE
COMPUTER). ╘HEN WE JUMP TO A SYSTEM ROUTINE WHICH ├OMMODORE SO GRACIOUSLY
SUPPLIED US WITH THAT PRINTS THE VALUE OF THE CHARACTER IN .┴ TO THE SCREEN.
(JSR $FFD2) THEN WE DO A ╥╘╙ (╥E╘URN FROM ╙UBROUTINE) SO THAT WE WILL GO BACK
TO BASIC AND THE ╥EADY PROMPT WHEN WE ARE FINISHED WITH THE SYS CALL.
┘OU ├= 128 PEOPLE MAY BE WONDERING WHY YOU HAD TO DO A BANK 15 AND ASSEMBLE
THE STUFF AT A DIFFERENT MEMORY LOCATION. ╘URNS OUT THAT THE ├128 MEMORY MAP
OF WHERE ROUTINES ETC ARE AT IS MUCH MORE COMPLEX THAN THE ├=64 AND THUS YOU
HAVE TO TELL BASIC WHICH BANK YOU WISH TO HAVE ALL SYS, PEEK, AND POKE CALLS TO
TAKE PLACE IN. ┴LSO, $C000 AS USED ON THE ├=64 IS NOT AN AREA THAT IS FREE TO
USE ON THE ├128 IN THIS MANNER.
┴SSIGNMENT: ╘AKE A LOOK @ THE DIFFERENT COMMANDS AS LISTED IN 6502 ╧PCODES
AND TRY TO UNDERSTAND WHAT THEY DO. ┼XPERIMENT WITH THE JSR $FFD2 ROUTINE BY
USING DIFFERENT VALUES ETC.
╬EXT ╘IME: ╨RINTING OUT STRINGS, AND UNDERSTANDING '╔NDEXING'.
===========================================================================
6502 ╧PCODES AND ╤UASI-╧PCODES.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╘HE FOLLOWING TABLE LISTS ALL OF THE AVAILABLE OPCODES ON THE 65XX LINE OF
MICRO-PROCESSORS (SUCH AS THE 6510 ON THE ├=64 AND THE 8502 ON THE ├=128)
-----------------------------------------------------------------------------
╙TD ═NEMONIC ╚EX ╓ALUE ─ESCRIPTION ┴DDRESSING ═ODE ┬YTES/╘IME
* ┬╥╦ $00 ╙TACK <- ╨├, ╨├ <- ($FFFE) (╔MMEDIATE) 1/7
* ╧╥┴ $01 ┴ <- (┴) ╓ ═ (╔ND,╪) 6/2
╩┴═ $02 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╙╠╧ $03 ═ <- (═ >> 1) + ┴ + ├ (╔ND,╪) 2/8
╬╧╨ $04 [NO OPERATION] (┌-╨AGE) 2/3
* ╧╥┴ $05 ┴ <- (┴) ╓ ═ (┌-╨AGE) 2/3
* ┴╙╠ $06 ├ <- ┴7, ┴ <- (┴) << 1 (┌-╨AGE) 2/5
╙╠╧ $07 ═ <- (═ >> 1) + ┴ + ├ (┌-╨AGE) 2/5
* ╨╚╨ $08 ╙TACK <- (╨) (╔MPLIED) 1/3
* ╧╥┴ $09 ┴ <- (┴) ╓ ═ (╔MMEDIATE) 2/2
* ┴╙╠ $0┴ ├ <- ┴7, ┴ <- (┴) << 1 (┴CCUMALATOR) 1/2
┴╬├ $0┬ ┴ <- ┴ /\ ═, ├=~┴7 (╔MMEDIATE) 1/2
╬╧╨ $0├ [NO OPERATION] (┴BSOLUTE) 3/4
* ╧╥┴ $0─ ┴ <- (┴) ╓ ═ (┴BSOLUTE) 3/4
* ┴╙╠ $0┼ ├ <- ┴7, ┴ <- (┴) << 1 (┴BSOLUTE) 3/6
╙╠╧ $0╞ ═ <- (═ >> 1) + ┴ + ├ (┴BSOLUTE) 3/6
* ┬╨╠ $10 IF ╬=0, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ╧╥┴ $11 ┴ <- (┴) ╓ ═ ((╔ND),┘) 2/5'1
╩┴═ $12 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╙╠╧ $13 ═ <- (═ >. 1) + ┴ + ├ ((╔ND),┘) 2/8'5
╬╧╨ $14 [NO OPERATION] (┌-╨AGE,╪) 2/4
* ╧╥┴ $15 ┴ <- (┴) ╓ ═ (┌-╨AGE,╪) 2/4
* ┴╙╠ $16 ├ <- ┴7, ┴ <- (┴) << 1 (┌-╨AGE,╪) 2/6
╙╠╧ $17 ═ <- (═ >> 1) + ┴ + ├ (┌-╨AGE,╪) 2/6
* ├╠├ $18 ├ <- 0 (╔MPLIED) 1/2
* ╧╥┴ $19 ┴ <- (┴) ╓ ═ (┴BSOLUTE,┘) 3/4'1
╬╧╨ $1┴ [NO OPERATION] (╔MPLIED) 1/2
╙╠╧ $1┬ ═ <- (═ >> 1) + ┴ + ├ (┴BSOLUTE,┘) 3/7
╬╧╨ $1├ [NO OPERATION] (┴BSOLUTE,╪) 2/4'1
* ╧╥┴ $1─ ┴ <- (┴) ╓ ═ (┴BSOLUTE,╪) 3/4'1
* ┴╙╠ $1┼ ├ <- ┴7, ┴ <- (┴) << 1 (┴BSOLUTE,╪) 3/7
╙╠╧ $1╞ ═ <- (═ >> 1) + ┴ + ├ (┴BSOLUTE,╪) 3/7
* ╩╙╥ $20 ╙TACK <- ╨├, ╨├ <- ┴DDRESS (┴BSOLUTE) 3/6
* ┴╬─ $21 ┴ <- (┴) /\ ═ (╔ND,╪) 2/6
╩┴═ $22 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╥╠┴ $23 ═ <- (═ << 1) /\ (┴) (╔ND,╪) 2/8
* ┬╔╘ $24 ┌ <- ~(┴ /\ ═) ╬<-═7 ╓<-═6 (┌-╨AGE) 2/3
* ┴╬─ $25 ┴ <- (┴) /\ ═ (┌-╨AGE) 2/3
* ╥╧╠ $26 ├ <- ┴7 & ┴ <- ┴ << 1 + ├ (┌-╨AGE) 2/5
╥╠┴ $27 ═ <- (═ << 1) /\ (┴) (┌-╨AGE) 2/5'5
* ╨╠╨ $28 ┴ <- (╙TACK) (╔MPLIED) 1/4
* ┴╬─ $29 ┴ <- (┴) /\ ═ (╔MMEDIATE) 2/2
* ╥╧╠ $2┴ ├ <- ┴7 & ┴ <- ┴ << 1 + ├ (┴CCUMALATOR) 1/2
┴╬├ $2┬ ┴ <- ┴ /\ ═, ├ <- ~┴7 (╔MMEDIATE9 1/2
* ┬╔╘ $2├ ┌ <- ~(┴ /\ ═) ╬<-═7 ╓<-═6 (┴BSOLUTE) 3/4
* ┴╬─ $2─ ┴ <- (┴) /\ ═ (┴BSOLUTE) 3/4
* ╥╧╠ $2┼ ├ <- ┴7 & ┴ <- ┴ << 1 + ├ (┴BSOLUTE) 3/6
╥╠┴ $2╞ ═ <- (═ << 1) /\ (┴) (┴BSOLUTE) 3/6'5
* ┬═╔ $30 IF ╬=1, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ┴╬─ $31 ┴ <- (┴) /\ ═ ((╔ND),┘) 2/5'1
╩┴═ $32 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╥╠┴ $33 ═ <- (═ << 1) /\ (┴) ((╔ND),┘) 2/8'5
╬╧╨ $34 [NO OPERATION] (┌-╨AGE,╪) 2/4
* ┴╬─ $35 ┴ <- (┴) /\ ═ (┌-╨AGE,╪) 2/4
* ╥╧╠ $36 ├ <- ┴7 & ┴ <- ┴ << 1 + ├ (┌-╨AGE,╪) 2/6
╥╠┴ $37 ═ <- (═ << 1) /\ (┴) (┌-╨AGE,╪) 2/6'5
* ╙┼├ $38 ├ <- 1 (╔MPLIED) 1/2
* ┴╬─ $39 ┴ <- (┴) /\ ═ (┴BSOLUTE,┘) 3/4'1
╬╧╨ $3┴ [NO OPERATION] (╔MPLIED) 1/2
╥╠┴ $3┬ ═ <- (═ << 1) /\ (┴) (┴BSOLUTE,┘) 3/7'5
╬╧╨ $3├ [NO OPERATION] (┴BSOLUTE,╪) 3/4'1
* ┴╬─ $3─ ┴ <- (┴) /\ ═ (┴BSOLUTE,╪) 3/4'1
* ╥╧╠ $3┼ ├ <- ┴7 & ┴ <- ┴ << 1 + ├ (┴BSOLUTE,╪) 3/7
╥╠┴ $3╞ ═ <- (═ << 1) /\ (┴) (┴BSOLUTE,╪) 3/7'5
* ╥╘╔ $40 ╨ <- (╙TACK), ╨├ <-(╙TACK) (╔MPLIED) 1/6
* ┼╧╥ $41 ┴ <- (┴) \-/ ═ (╔ND,╪) 2/6
╩┴═ $42 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╙╥┼ $43 ═ <- (═ >> 1) \-/ ┴ (╔ND,╪) 2/8
╬╧╨ $44 [NO OPERATION] (┌-╨AGE) 2/3
* ┼╧╥ $45 ┴ <- (┴) \-/ ═ (┌-╨AGE) 2/3
* ╠╙╥ $46 ├ <- ┴0, ┴ <- (┴) >> 1 (┴BSOLUTE,╪) 3/7
╙╥┼ $47 ═ <- (═ >> 1) \-/ ┴ (┌-╨AGE) 2/5
* ╨╚┴ $48 ╙TACK <- (┴) (╔MPLIED) 1/3
* ┼╧╥ $49 ┴ <- (┴) \-/ ═ (╔MMEDIATE) 2/2
* ╠╙╥ $4┴ ├ <- ┴0, ┴ <- (┴) >> 1 (┴CCUMALATOR) 1/2
┴╙╥ $4┬ ┴ <- [(┴ /\ ═) >> 1] (╔MMEDIATE) 1/2
* ╩═╨ $4├ ╨├ <- ┴DDRESS (┴BSOLUTE) 3/3
* ┼╧╥ $4─ ┴ <- (┴) \-/ ═ (┴BSOLUTE) 3/4
* ╠╙╥ $4┼ ├ <- ┴0, ┴ <- (┴) >> 1 (┴BSOLUTE) 3/6
╙╥┼ $4╞ ═ <- (═ >> 1) \-/ ┴ (┴BSOLUTE) 3/6
* ┬╓├ $50 IF ╓=0, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ┼╧╥ $51 ┴ <- (┴) \-/ ═ ((╔ND),┘) 2/5'1
╩┴═ $52 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╙╥┼ $53 ═ <- (═ >> 1) \-/ ┴ ((╔ND),┘) 2/8
╬╧╨ $54 [NO OPERATION] (┌-╨AGE,╪) 2/4
* ┼╧╥ $55 ┴ <- (┴) \-/ ═ (┌-╨AGE,╪) 2/4
* ╠╙╥ $56 ├ <- ┴0, ┴ <- (┴) >> 1 (┌-╨AGE,╪) 2/6
╙╥┼ $57 ═ <- (═ >> 1) \-/ ┴ (┌-╨AGE,╪) 2/6
* ├╠╔ $58 ╔ <- 0 (╔MPLIED) 1/2
* ┼╧╥ $59 ┴ <- (┴) \-/ ═ (┴BSOLUTE,┘) 3/4'1
╬╧╨ $5┴ [NO OPERATION] (╔MPLIED) 1/2
╙╥┼ $5┬ ═ <- (═ >> 1) \-/ ┴ (┴BSOLUTE,┘) 3/7
╬╧╨ $5├ [NO OPERATION] (┴BSOLUTE,╪) 3/4'1
* ┼╧╥ $5─ ┴ <- (┴) \-/ ═ (┴BSOLUTE,╪) 3/4'1
╙╥┼ $5╞ ═ <- (═ >> 1) \-/ ┴ (┴BSOLUTE,╪) 3/7
* ╥╘╙ $60 ╨├ <- (╙TACK) (╔MPLIED) 1/6
* ┴─├ $61 ┴ <- (┴) + ═ + ├ (╔ND,╪) 2/6
╩┴═ $62 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╥╥┴ $63 ═ <- (═ >> 1) + (┴) + ├ (╔ND,╪) 2/8'5
╬╧╨ $64 [NO OPERATION] (┌-╨AGE) 2/3
* ┴─├ $65 ┴ <- (┴) + ═ + ├ (┌-╨AGE) 2/3
* ╥╧╥ $66 ├<-┴0 & ┴<- (┴7=├ + ┴>>1) (┌-╨AGE) 2/5
╥╥┴ $67 ═ <- (═ >> 1) + (┴) + ├ (┌-╨AGE) 2/5'5
* ╨╠┴ $68 ┴ <- (╙TACK) (╔MPLIED) 1/4
* ┴─├ $69 ┴ <- (┴) + ═ + ├ (╔MMEDIATE) 2/2
* ╥╧╥ $6┴ ├<-┴0 & ┴<- (┴7=├ + ┴>>1) (┴CCUMALATOR) 1/2
┴╥╥ $6┬ ┴ <- [(┴ /\ ═) >> 1] (╔MMEDIATE) 1/2'5
* ╩═╨ $6├ ╨├ <- ┴DDRESS (╔NDIRECT) 3/5
* ┴─├ $6─ ┴ <- (┴) + ═ + ├ (┴BSOLUTE) 3/4
* ╥╧╥ $6┼ ├<-┴0 & ┴<- (┴7=├ + ┴>>1) (┴BSOLUTE) 3/6
╥╥┴ $6╞ ═ <- (═ >> 1) + (┴) + ├ (┴BSOLUTE) 3/6'5
* ┬╓╙ $70 IF ╓=1, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ┴─├ $71 ┴ <- (┴) + ═ + ├ ((╔ND),┘) 2/5'1
╩┴═ $72 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╥╥┴ $73 ═ <- (═ >> 1) + (┴) + ├ ((╔ND),┘) 2/8'5
╬╧╨ $74 [NO OPERATION] (┌-╨AGE,╪) 2/4
* ┴─├ $75 ┴ <- (┴) + ═ + ├ (┌-╨AGE,╪) 2/4
* ╥╧╥ $76 ├<-┴0 & ┴<- (┴7=├ + ┴>>1) (┌-╨AGE,╪) 2/6
╥╥┴ $77 ═ <- (═ >> 1) + (┴) + ├ (┌-╨AGE,╪) 2/6'5
* ╙┼╔ $78 ╔ <- 1 (╔MPLIED) 1/2
* ┴─├ $79 ┴ <- (┴) + ═ + ├ (┴BSOLUTE,┘) 3/4'1
╬╧╨ $7┴ [NO OPERATION] (╔MPLIED) 1/2
╥╥┴ $7┬ ═ <- (═ >> 1) + (┴) + ├ (┴BSOLUTE,┘) 3/7'5
╬╧╨ $7├ [NO OPERATION] (┴BSOLUTE,╪) 3/4'1
* ┴─├ $7─ ┴ <- (┴) + ═ + ├ (┴BSOLUTE,╪) 3/4'1
* ╥╧╥ $7┼ ├<-┴0 & ┴<- (┴7=├ + ┴>>1) (┴BSOLUTE,╪) 3/7
╥╥┴ $7╞ ═ <- (═ >> 1) + (┴) + ├ (┴BSOLUTE,╪) 3/7'5
╬╧╨ $80 [NO OPERATION] (╔MMEDIATE) 2/2
* ╙╘┴ $81 ═ <- (┴) (╔ND,╪) 2/6
╬╧╨ $82 [NO OPERATION] (╔MMEDIATE) 2/2
╙┴╪ $83 ═ <- (┴) /\ (╪) (╔ND,╪) 2/6
* ╙╘┘ $84 ═ <- (┘) (┌-╨AGE) 2/3
* ╙╘┴ $85 ═ <- (┴) (┌-╨AGE) 2/3
* ╙╘╪ $86 ═ <- (╪) (┌-╨AGE) 2/3
╙┴╪ $87 ═ <- (┴) /\ (╪) (┌-╨AGE) 2/3
* ─┼┘ $88 ┘ <- (┘) - 1 (╔MPLIED) 1/2
╬╧╨ $89 [NO OPERATION] (╔MMEDIATE) 2/2
* ╘╪┴ $8┴ ┴ <- (╪) (╔MPLIED) 1/2
┴╬┼ $8┬ ═ <-[(┴)\/$┼┼] /\ (╪)/\(═) (╔MMEDIATE) 2/2^4
* ╙╘┘ $8├ ═ <- (┘) (┴BSOLUTE) 3/4
* ╙╘┴ $8─ ═ <- (┴) (┴BSOLUTE) 3/4
* ╙╘╪ $8┼ ═ <- (╪) (┴BSOLUTE) 3/4
╙┴╪ $8╞ ═ <- (┴) /\ (╪) (┴BSOLUTE) 3/4
* ┬├├ $90 IF ├=0, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ╙╘┴ $91 ═ <- (┴) ((╔ND),┘) 2/6
╩┴═ $92 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╙╚┴ $93 ═ <- (┴) /\ (╪) /\ (╨├╚+1) (┴BSOLUTE,╪) 3/6'3
* ╙╘┘ $94 ═ <- (┘) (┌-╨AGE,╪) 2/4
* ╙╘┴ $95 ═ <- (┴) (┌-╨AGE,╪) 2/4
╙┴╪ $97 ═ <- (┴) /\ (╪) (┌-╨AGE,┘) 2/4
* ╙╘╪ $96 ═ <- (╪) (┌-╨AGE,┘) 2/4
* ╘┘┴ $98 ┴ <- (┘) (╔MPLIED) 1/2
* ╙╘┴ $99 ═ <- (┴) (┴BSOLUTE,┘) 3/5
* ╘╪╙ $9┴ ╙ <- (╪) (╔MPLIED) 1/2
╙╚╙ $9┬ ╪ <- (┴) /\ (╪), ╙ <- (╪) (┴BSOLUTE,┘) 3/5
═ <- (╪) /\ (╨├╚+1)
╙╚┘ $9├ ═ <- (┘) /\ (╨├╚+1) (┴BSOLUTE,┘) 3/5'3
* ╙╘┴ $9─ ═ <- (┴) (┴BSOLUTE,╪) 3/5
╙╚╪ $9┼ ═ <- (╪) /\ (╨├╚+1) (┴BSOLUTE,╪) 3/5'3
╙╚┴ $9╞ ═ <- (┴) /\ (╪) /\ (╨├╚+1) (┴BSOLUTE,┘) 3/5'3
* ╠─┘ $┴0 ┘ <- ═ (╔MMEDIATE) 2/2
* ╠─┴ $┴1 ┴ <- ═ (╔ND,╪) 2/6
* ╠─╪ $┴2 ╪ <- ═ (╔MMEDIATE) 2/2
╠┴╪ $┴3 ┴ <- ═, ╪ <- ═ (╔ND,╪) 2/6
* ╠─┘ $┴4 ┘ <- ═ (┌-╨AGE) 2/3
* ╠─┴ $┴5 ┴ <- ═ (┌-╨AGE) 2/3
* ╠─╪ $┴6 ╪ <- ═ (┌-╨AGE) 2/3
╠┴╪ $┴7 ┴ <- ═, ╪ <- ═ (┌-╨AGE) 2/3
* ╘┴┘ $┴8 ┘ <- (┴) (╔MPLIED) 1/2
* ╠─┴ $┴9 ┴ <- ═ (╔MMEDIATE) 2/2
* ╘┴╪ $┴┴ ╪ <- (┴) (╔MPLIED) 1/2
╠╪┴ $┴┬ ╪04 <- (╪04) /\ ═04 (╔MMEDIATE) 1/2
┴04 <- (┴04) /\ ═04
* ╠─┘ $┴├ ┘ <- ═ (┴BSOLUTE) 3/4
* ╠─┴ $┴─ ┴ <- ═ (┴BSOLUTE) 3/4
* ╠─╪ $┴┼ ╪ <- ═ (┴BSOLUTE) 3/4
╠┴╪ $┴╞ ┴ <- ═, ╪ <- ═ (┴BSOLUTE) 3/4
* ┬├╙ $┬0 IF ├=1, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ╠─┴ $┬1 ┴ <- ═ ((╔ND),┘) 2/5'1
╩┴═ $┬2 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╠┴╪ $┬3 ┴ <- ═, ╪ <- ═ ((╔ND),┘) 2/5'1
* ╠─┘ $┬4 ┘ <- ═ (┌-╨AGE,╪) 2/4
* ╠─┴ $┬5 ┴ <- ═ (┌-╨AGE,╪) 2/4
* ╠─╪ $┬6 ╪ <- ═ (┌-╨AGE,┘) 2/4
╠┴╪ $┬7 ┴ <- ═, ╪ <- ═ (┌-╨AGE,┘) 2/4
* ├╠╓ $┬8 ╓ <- 0 (╔MPLIED) 1/2
* ╠─┴ $┬9 ┴ <- ═ (┴BSOLUTE,┘) 3/4'1
* ╘╙╪ $┬┴ ╪ <- (╙) (╔MPLIED) 1/2
╠┴┼ $┬┬ ╪,╙,┴ <- (╙ /\ ═) (┴BSOLUTE,┘) 3/4'1
* ╠─┘ $┬├ ┘ <- ═ (┴BSOLUTE,╪) 3/4'1
* ╠─┴ $┬─ ┴ <- ═ (┴BSOLUTE,╪) 3/4'1
* ╠─╪ $┬┼ ╪ <- ═ (┴BSOLUTE,┘) 3/4'1
╠┴╪ $┬╞ ┴ <- ═, ╪ <- ═ (┴BSOLUTE,┘) 3/4'1
* ├╨┘ $├0 (┘ - ═) -> ╬┌├ (╔MMEDIATE) 2/2
* ├═╨ $├1 (┴ - ═) -> ╬┌├ (╔ND,╪) 2/6
╬╧╨ $├2 [NO OPERATION] (╔MMEDIATE) 2/2
─├╨ $├3 ═ <- (═)-1, (┴-═) -> ╬┌├ (╔ND,╪) 2/8
* ├╨┘ $├4 (┘ - ═) -> ╬┌├ (┌-╨AGE) 2/3
* ├═╨ $├5 (┴ - ═) -> ╬┌├ (┌-╨AGE) 2/3
* ─┼├ $├6 ═ <- (═) - 1 (┌-╨AGE) 2/5
─├╨ $├7 ═ <- (═)-1, (┴-═) -> ╬┌├ (┌-╨AGE) 2/5
* ╔╬┘ $├8 ┘ <- (┘) + 1 (╔MPLIED) 1/2
* ├═╨ $├9 (┴ - ═) -> ╬┌├ (╔MMEDIATE) 2/2
* ─┼╪ $├┴ ╪ <- (╪) - 1 (╔MPLIED) 1/2
╙┬╪ $├┬ ╪ <- (╪)/\(┴) - ═ (╔MMEDIATE) 2/2
* ├╨┘ $├├ (┘ - ═) -> ╬┌├ (┴BSOLUTE) 3/4
* ├═╨ $├─ (┴ - ═) -> ╬┌├ (┴BSOLUTE) 3/4
* ─┼├ $├┼ ═ <- (═) - 1 (┴BSOLUTE) 3/6
─├╨ $├╞ ═ <- (═)-1, (┴-═) -> ╬┌├ (┴BSOLUTE) 3/6
* ┬╬┼ $─0 IF ┌=0, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ├═╨ $─1 (┴ - ═) -> ╬┌├ ((╔ND),┘) 2/5'1
╩┴═ $─2 [LOCKS UP MACHINE] (╔MPLIED) 1/-
─├╨ $─3 ═ <- (═)-1, (┴-═) -> ╬┌├ ((╔ND),┘) 2/8
╬╧╨ $─4 [NO OPERATION] (┌-╨AGE,╪) 2/4
* ├═╨ $─5 (┴ - ═) -> ╬┌├ (┌-╨AGE,╪) 2/4
* ─┼├ $─6 ═ <- (═) - 1 (┌-╨AGE,╪) 2/6
─├╨ $─7 ═ <- (═)-1, (┴-═) -> ╬┌├ (┌-╨AGE,╪) 2/6
* ├╠─ $─8 ─ <- 0 (╔MPLIED) 1/2
* ├═╨ $─9 (┴ - ═) -> ╬┌├ (┴BSOLUTE,┘) 3/4'1
╬╧╨ $─┴ [NO OPERATION] (╔MPLIED) 1/2
─├╨ $─┬ ═ <- (═)-1, (┴-═) -> ╬┌├ (┴BSOLUTE,┘) 3/7
╬╧╨ $─├ [NO OPERATION] (┴BSOLUTE,╪) 3/4'1
* ├═╨ $── (┴ - ═) -> ╬┌├ (┴BSOLUTE,╪) 3/4'1
* ─┼├ $─┼ ═ <- (═) - 1 (┴BSOLUTE,╪) 3/7
─├╨ $─╞ ═ <- (═)-1, (┴-═) -> ╬┌├ (┴BSOLUTE,╪) 3/7
* ├╨╪ $┼0 (╪ - ═) -> ╬┌├ (╔MMEDIATE) 2/2
* ╙┬├ $┼1 ┴ <- (┴) - ═ - ~├ (╔ND,╪) 2/6
╬╧╨ $┼2 [NO OPERATION] (╔MMEDIATE) 2/2
╔╙┬ $┼3 ═ <- (═) - 1,┴ <- (┴)-═-~├ (╔ND,╪) 3/8'1
* ├╨╪ $┼4 (╪ - ═) -> ╬┌├ (┌-╨AGE) 2/3
* ╙┬├ $┼5 ┴ <- (┴) - ═ - ~├ (┌-╨AGE) 2/3
* ╔╬├ $┼6 ═ <- (═) + 1 (┌-╨AGE) 2/5
╔╙┬ $┼7 ═ <- (═) - 1,┴ <- (┴)-═-~├ (┌-╨AGE) 2/5
* ╔╬╪ $┼8 ╪ <- (╪) +1 (╔MPLIED) 1/2
* ╙┬├ $┼9 ┴ <- (┴) - ═ - ~├ (╔MMEDIATE) 2/2
* ╬╧╨ $┼┴ [NO OPERATION] (╔MPLIED) 1/2
╙┬├ $┼┬ ┴ <- (┴) - ═ - ~├ (╔MMEDIATE) 1/2
* ╙┬├ $┼─ ┴ <- (┴) - ═ - ~├ (┴BSOLUTE) 3/4
* ├╨╪ $┼├ (╪ - ═) -> ╬┌├ (┴BSOLUTE) 3/4
* ╔╬├ $┼┼ ═ <- (═) + 1 (┴BSOLUTE) 3/6
╔╙┬ $┼╞ ═ <- (═) - 1,┴ <- (┴)-═-~├ (┴BSOLUTE) 3/6
* ┬┼╤ $╞0 IF ┌=1, ╨├ = ╨├ + OFFSET (╥ELATIVE) 2/2'2
* ╙┬├ $╞1 ┴ <- (┴) - ═ - ~├ ((╔ND),┘) 2/5'1
╩┴═ $╞2 [LOCKS UP MACHINE] (╔MPLIED) 1/-
╔╙┬ $╞3 ═ <- (═) - 1,┴ <- (┴)-═-~├ ((╔ND),┘) 2/8
╬╧╨ $╞4 [NO OPERATION] (┌-╨AGE,╪) 2/4
* ╙┬├ $╞5 ┴ <- (┴) - ═ - ~├ (┌-╨AGE,╪) 2/4
* ╔╬├ $╞6 ═ <- (═) + 1 (┌-╨AGE,╪) 2/6
╔╙┬ $╞7 ═ <- (═) - 1,┴ <- (┴)-═-~├ (┌-╨AGE,╪) 2/6
* ╙┼─ $╞8 ─ <- 1 (╔MPLIED) 1/2
* ╙┬├ $╞9 ┴ <- (┴) - ═ - ~├ (┴BSOLUTE,┘) 3/4'1
╬╧╨ $╞┴ [NO OPERATION] (╔MPLIED) 1/2
╔╙┬ $╞┬ ═ <- (═) - 1,┴ <- (┴)-═-~├ (┴BSOLUTE,┘) 3/7
╬╧╨ $╞├ [NO OPERATION] (┴BSOLUTE,╪) 3/4'1
* ╙┬├ $╞─ ┴ <- (┴) - ═ - ~├ (┴BSOLUTE,╪) 3/4'1
* ╔╬├ $╞┼ ═ <- (═) + 1 (┴BSOLUTE,╪) 3/7
╔╙┬ $╞╞ ═ <- (═) - 1,┴ <- (┴)-═-~├ (┴BSOLUTE,╪) 3/7
'1 - ┴DD ONE IF ADDRESS CROSSES A PAGE BOUNDRY.
'2 - ┴DD 1 IF BRANCH SUCCEEDS, OR 2 IF INTO ANOTHER PAGE.
'3 - ╔F PAGE BOUNDRY CROSSED THEN ╨├╚+1 IS JUST ╨├╚
'4 - ╙OURCES DISPUTED ON EXACT OPERATION, OR SOMETIMES DOES NOT WORK.
'5 - ╞ULL EIGHT BIT ROTATION (WITH CARRY)
╙OURCES:
╨ROGRAMMING THE 6502, ╥ODNEY ┌AKS, (C) 1983 ╙YBEX
╨AUL ╧JALA, ╨OST TO ├OMP.╙YS.├BM (PO87553@CS.TUT.FI / ALBERT@CC.TUT.FI)
─ ╩OHN ═CKENNA, ╨OST TO ├OMP.╙YS.├BM (GUDJM@UNIWA.UWA.OZ.AU)
├OMPILED BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
==============================================================================
╙IMPLE ╚IRES ╠INE ─RAWING ╨ACKAGE FOR THE ├-128 80-├OLUMN ╙CREEN
├OPYRIGHT (C) 1992 ├RAIG ┬RUCE <F2RX@JUPITER.SUN.CSD.UNB.CA>
1. ╟╥┴╨╚╔├╙ ╨┴├╦┴╟┼ ╧╓┼╥╓╔┼╫
╘HE GRAPHICS PACKAGE THIS ARTICLE EXPLAINS IS ┬╠╧┴─ED INTO MEMORY AT ADDRESS
$1300 ON BANK 15 AND HAS THREE ENTRY POINTS:
$1300 = MOVE THE PIXEL CURSOR OR DRAW A LINE: .┴╪=X, .┘=Y, .├=CMD
$1303 = ACTIVATE GRAPHICS MODE AND CLEAR THE SCREEN
$1306 = EXIT GRAPHICS MODE AND RELOAD THE CHARACTER SET
╘O MOVE THE PIXEL CURSOR TO THE START POINT OF A LINE, LOAD THE .┴╪ REGISTERS
WITH THE ╪ COORDINATE (0-639), LOAD THE .┘ REGISTER WITH THE ┘ COORDINATE
(0-199), CLEAR THE CARRY FLAG, AND CALL $1300. (═AKE SURE THAT ┬ANK 15 IS IN
CONTEXT). ╘HIS CAN BE DONE IN ┬┴╙╔├ AS FOLLOWS:
╙┘╙ 4864, ╪ ┴╬─ 255, ╪/256, ┘, 0
╘O DRAW A LINE FROM THE PIXEL CURSOR LOCATION TO A GIVEN POINT, LOAD THE .┴╪
AND .┘ REGISTERS LIKE BEFORE, SET THE CARRY FLAG, AND CALL $1300. ╘HE PIXEL
CURSOR WILL THEN BE SET TO THE END POINT OF THE LINE JUST DRAWN, SO YOU DO NOT
HAVE TO SET IT AGAIN IF YOU ARE DRAWING A CONTINUOUS OBJECT (LIKE A SQUARE).
╙┘╙ 4864, ╪ ┴╬─ 255, ╪/256, ┘, 1
╘HE ACTIVATE AND EXIT ROUTINES ARE CALLED WITHOUT ANY PARAMETERS AND WORK VERY
SIMPLY. ┘OU SHOULD BE SURE TO CALL EXIT BEFORE RETURNING TO THE PROGRAM
EDITING MODE OR YOU WILL NOT BE ABLE TO SEE WHAT YOU ARE TYPING.
┴ ┬┴╙╔├ 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) ]
================================================================================
;*****************************************************************************
;* "╚╔╥┼╙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
.$1432 [A9 00 ] LDA #$00 ;SET THE NUMERATOR FRACTIONAL PORTION TO .0
.$1434 [85 60 ] STA $60
.$1436 [85 61 ] STA $61
.$1438 [20 CF 13] JSR $13CF ;32-BIT DIVIDE
.$143B [68 ] PLA ;IF THE SIGN OF THE RESULT IS SUPPOSED TO BE
.$143C [10 19 ] BPL $1457 ; POSITIVE, THEN EXIT
.$143E [38 ] SEC ;IF THE SIGN OF THE RESULT IS NEGATIVE, TAKE
.$143F [A9 00 ] LDA #$00 ; GET THE 2'S COMPLEMENT OF THE POSITIVE
.$1441 [E5 64 ] SBC $64 ; RESULT
.$1443 [85 64 ] STA $64
.$1445 [A9 00 ] LDA #$00
.$1447 [E5 65 ] SBC $65
.$1449 [85 65 ] STA $65
.$144B [A9 00 ] LDA #$00
.$144D [E5 66 ] SBC $66
.$144F [85 66 ] STA $66
.$1451 [A9 00 ] LDA #$00
.$1453 [E5 67 ] SBC $67
.$1455 [85 67 ] STA $67
.$1457 [60 ] RTS
;*****************************************************************************
;* GET THE ╪ AND ┘ PLOTTING INCREMENTS AND THE PIXELS-TO-PLOT COUNT *
;*****************************************************************************
.$1458 [A5 0C ] LDA $0C ;GET ┴┬╙(─╪)
.$145A [A4 0D ] LDY $0D
.$145C [20 1A 14] JSR $141A
.$145F [85 FA ] STA $FA
.$1461 [84 FB ] STY $FB
.$1463 [A5 10 ] LDA $10 ;GET ┴┬╙(─┘)
.$1465 [A4 11 ] LDY $11
.$1467 [20 1A 14] JSR $141A
.$146A [85 FC ] STA $FC
.$146C [84 FD ] STY $FD
.$146E [A5 FC ] LDA $FC ;COMPARE ┴┬╙(─┘) TO ┴┬╙(─╪)
.$1470 [C5 FA ] CMP $FA
.$1472 [A5 FD ] LDA $FD
.$1474 [E5 FB ] SBC $FB
.$1476 [B0 44 ] BCS $14BC ;IF ┴┬╙(─┘) >= ┴┬╙(─╪) THEN BRANCH AHEAD
.$1478 [A5 FA ] LDA $FA ;SET PIXELS-TO-PLOT COUNT TO ┴┬╙(─╪)
.$147A [85 12 ] STA $12
.$147C [85 50 ] STA $50
.$147E [A5 FB ] LDA $FB
.$1480 [85 13 ] STA $13
.$1482 [85 51 ] STA $51 ;SET THE NUMERATOR (TOP) TO ─┘ AND THE
.$1484 [A5 FC ] LDA $FC ; DENOMINATOR (BOTTOM) TO ┴┬╙(─╪)
.$1486 [85 62 ] STA $62
.$1488 [A5 FD ] LDA $FD
.$148A [85 63 ] STA $63
.$148C [A5 11 ] LDA $11 ;GET THE SIGN OF ─┘ - WILL BE THE SIGN OF DIV
.$148E [20 31 14] JSR $1431 ;PERFORM THE SIGNED FRACTIONAL DIVISION
.$1491 [A2 03 ] LDX #$03 ;STORE THE RESULT IN THE ┘ INCREMENT VALUE
.$1493 [B5 64 ] LDA $64,X
.$1495 [95 0E ] STA $0E,X
.$1497 [CA ] DEX
.$1498 [10 F9 ] BPL $1493
.$149A [A5 0D ] LDA $0D ;GET THE ╪ INCREMENT
.$149C [30 0A ] BMI $14A8
.$149E [A9 00 ] LDA #$00 ;IF ─╪ IS POSITIVE, ╪ INC IS +1
.$14A0 [85 0D ] STA $0D ; (NOTE THAT ─╪ CANNOT BE 0 HERE SO WE DON'T
.$14A2 [A9 01 ] LDA #$01 ; HAVE TO WORRY ABOUT THAT CASE)
.$14A4 [85 0C ] STA $0C
.$14A6 [D0 06 ] BNE $14AE
.$14A8 [A9 FF ] LDA #$FF ;IF ─╪ IS NEGATIVE, ╪ INC IS -1
.$14AA [85 0D ] STA $0D
.$14AC [85 0C ] STA $0C
.$14AE [38 ] SEC ;TAKE THE NEGATIVE OF THE NUMBER OF PIXELS
.$14AF [A9 00 ] LDA #$00 ; TO PLOT AND EXIT
.$14B1 [E5 12 ] SBC $12 ;╔ DON'T REMEMBER EXACTLY WHY ╔ USE THE
.$14B3 [85 12 ] STA $12 ; NEGATIVE; THERE IS NOT MUCH OF A SPEED
.$14B5 [A9 00 ] LDA #$00 ; IMPROVEMENT. ╧H WELL, T'IS DONE.
.$14B7 [E5 13 ] SBC $13
.$14B9 [85 13 ] STA $13
.$14BB [60 ] RTS
.$14BC [A5 FC ] LDA $FC ;SET THE PIXELS-TO-PLOT COUNT TO ┴┬╙(─┘)
.$14BE [85 12 ] STA $12
.$14C0 [85 50 ] STA $50
.$14C2 [A5 FD ] LDA $FD
.$14C4 [85 13 ] STA $13
.$14C6 [85 51 ] STA $51 ;SET THE NUMERATOR (TOP) TO ─╪ AND THE
.$14C8 [A5 FA ] LDA $FA ; DENOMINATOR(BOTTOM) TO ┴┬╙(─┘)
.$14CA [85 62 ] STA $62
.$14CC [A5 FB ] LDA $FB
.$14CE [85 63 ] STA $63
.$14D0 [A5 0D ] LDA $0D ;GET THE SIGN OF ─╪ - WILL BE THE SIGN OF DIV
.$14D2 [20 31 14] JSR $1431 ;DO THE 32-BIT SIGNED FRACTIONAL DIVISION
.$14D5 [A2 03 ] LDX #$03 ;STORE THE RESULT IN THE ╪ INCREMENT
.$14D7 [B5 64 ] LDA $64,X
.$14D9 [95 0A ] STA $0A,X
.$14DB [CA ] DEX
.$14DC [10 F9 ] BPL $14D7
.$14DE [4C EA 14] JMP $14EA ;JUMP OVER THE NEXT SECTION
;-------
.$14E1 [2C FF FF] BIT $FFFF ;╘HIS SECTION CONTAINED JUNK BEFORE AND ╔
.$14E4 [2C FF FF] BIT $FFFF ; DON'T KNOW HOW IT GOT HERE. ╔ REPLACED
.$14E7 [2C FF FF] BIT $FFFF ; IT WITH ┬╔╘S AND NOW JUMP OVER IT.
;-------
.$14EA [A5 11 ] LDA $11
.$14EC [30 0A ] BMI $14F8
.$14EE [A9 00 ] LDA #$00 ;IF ─┘ IS POSITIVE THEN ┘ INC IS +1
.$14F0 [85 11 ] STA $11 ; (WE DO NOT HAVE TO WORRY ABOUT THE CASE
.$14F2 [A9 01 ] LDA #$01 ; OF ─┘ BEING ZERO SINCE THEN THE INCREMENT
.$14F4 [85 10 ] STA $10 ; WOULD NOT BE IMPORTANT)
.$14F6 [D0 06 ] BNE $14FE
.$14F8 [A9 FF ] LDA #$FF ;IF ─┘ IS NEGATIVE THEN ┘ INC IS -1
.$14FA [85 11 ] STA $11
.$14FC [85 10 ] STA $10
.$14FE [4C AE 14] JMP $14AE ;JUMP BACK TO THE EXIT
;*****************************************************************************
;* MAIN ROUTINE: DRAW LINE OR SET PIXEL CURSOR POSITION *
;*****************************************************************************
.$1501 [B0 07 ] BCS $150A ;GOTO DRAW ROUTINE IF .├=1
.$1503 [85 8B ] STA $8B ;STORE X AND Y PIXEL CURSOR COORDINATES
.$1505 [86 8C ] STX $8C
.$1507 [84 8D ] STY $8D
.$1509 [60 ] RTS ;EXIT SET PIXEL CURSOR
.$150A [85 04 ] STA $04 ;SAVE DRAW-TO COORDINATES
.$150C [86 05 ] STX $05
.$150E [84 08 ] STY $08
.$1510 [A2 07 ] LDX #$07 ;CLEAR $0A-$0D AND $0E-$11
.$1512 [A9 00 ] LDA #$00
.$1514 [95 0A ] STA $0A,X
.$1516 [CA ] DEX
.$1517 [10 FB ] BPL $1514
.$1519 [38 ] SEC ;GET DX VALUE = ─RAW╘O╪ - ╨IXEL├URSOR╪
.$151A [A5 04 ] LDA $04 ; DX IS AT [$0D $0C . $0B $0A]
.$151C [E5 8B ] SBC $8B
.$151E [85 0C ] STA $0C
.$1520 [A5 05 ] LDA $05
.$1522 [E5 8C ] SBC $8C
.$1524 [85 0D ] STA $0D
.$1526 [38 ] SEC ;GET DY VALUE = ─RAW╘O┘ - ╨IXEL├URSOR┘
.$1527 [A5 08 ] LDA $08 ; DY IS AT [$11 $10 . $0F $0E]
.$1529 [E5 8D ] SBC $8D
.$152B [85 10 ] STA $10
.$152D [A9 00 ] LDA #$00
.$152F [B0 02 ] BCS $1533
.$1531 [A9 FF ] LDA #$FF
.$1533 [85 11 ] STA $11
.$1535 [20 58 14] JSR $1458 ;CALCULATE THE ╪ AND ┘ PLOTTING INCREMENTS
.$1538 [A5 8B ] LDA $8B ;SET THE DRAWING ╪ POSITION TO X+0.5
.$153A [85 04 ] STA $04 ; ╪ IS AT [$05 $04 . $03 $02]
.$153C [A5 8C ] LDA $8C
.$153E [85 05 ] STA $05
.$1540 [A9 80 ] LDA #$80
.$1542 [85 03 ] STA $03
.$1544 [85 07 ] STA $07
.$1546 [A9 00 ] LDA #$00
.$1548 [85 02 ] STA $02
.$154A [85 06 ] STA $06
.$154C [A5 8D ] LDA $8D ;SET THE DRAWING ┘ POSITION TO Y+0.5
.$154E [85 08 ] STA $08 ; ┘ IS AT [$09 $08 . $07 $06]
.$1550 [A9 00 ] LDA #$00
.$1552 [85 09 ] STA $09
.$1554 [A5 04 ] LDA $04 ;GET THE PIXEL ╪ AND ┘ COORDINATES
.$1556 [A6 05 ] LDX $05
.$1558 [A4 08 ] LDY $08
.$155A [20 A8 13] JSR $13A8 ;PLOT THE PIXEL
.$155D [A5 12 ] LDA $12 ;CHECK THE PIXELS-TO-PLOT COUNT FOR ZERO
.$155F [05 13 ] ORA $13
.$1561 [F0 3B ] BEQ $159E ;IF NO MORE PIXELS TO PLOT, EXIT LOOP
.$1563 [18 ] CLC ;ADD THE ╪ INCREMENT TO THE ╪ COORDINATE
.$1564 [A5 02 ] LDA $02
.$1566 [65 0A ] ADC $0A
.$1568 [85 02 ] STA $02
.$156A [A5 03 ] LDA $03
.$156C [65 0B ] ADC $0B
.$156E [85 03 ] STA $03
.$1570 [A5 04 ] LDA $04
.$1572 [65 0C ] ADC $0C
.$1574 [85 04 ] STA $04
.$1576 [A5 05 ] LDA $05
.$1578 [65 0D ] ADC $0D
.$157A [85 05 ] STA $05
.$157C [18 ] CLC ;ADD THE ┘ INCREMENT TO THE ┘ COORDINATE
.$157D [A5 06 ] LDA $06
.$157F [65 0E ] ADC $0E
.$1581 [85 06 ] STA $06
.$1583 [A5 07 ] LDA $07
.$1585 [65 0F ] ADC $0F
.$1587 [85 07 ] STA $07
.$1589 [A5 08 ] LDA $08
.$158B [65 10 ] ADC $10
.$158D [85 08 ] STA $08
.$158F [A5 09 ] LDA $09
.$1591 [65 11 ] ADC $11
.$1593 [85 09 ] STA $09
.$1595 [E6 12 ] INC $12 ;INCREMENT THE PIXELS TO PLOT COUNT
.$1597 [D0 BB ] BNE $1554 ; NOTE THAT IT IS STORED AS THE NEGATIVE OF
.$1599 [E6 13 ] INC $13 ; THE COUNT
.$159B [4C 54 15] JMP $1554 ;REPEAT PLOTTING LOOP
.$159E [A5 04 ] LDA $04 ;EXIT - SET THE PIXEL CURSOR POSITION TO THE
.$15A0 [A6 05 ] LDX $05 ; LAST PIXEL PLOTTED ON THE LINE
.$15A2 [A4 08 ] LDY $08
.$15A4 [4C 03 15] JMP $1503