home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-02-12 | 204.1 KB | 6,093 lines |
-
- @@@@@@@@
- @@@@@@@@@@@@@@@@@@
- @@@@@@ @@@@@@
- @@@@@
- @@@@@ @@@@ @@@@ @@ @@@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@@
- @@@@@ @@ @@ @@@@ @@ @@ @@ @@@ @@ @@@@ @@ @@ @@
- @@@@@ @@@@@@@@ @@ @@ @@ @@@@@ @@ @@ @@ @@ @@
- @@@@@ @@ @@ @@@@@@@@ @@ @@ @@ @@@ @@ @@ @@@@ @@ @@
- @@@@@ @@@@ @@@@ @@@@ @@@@ @@@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@@@
- @@@@@ @@
- @@@@@@ @@@@@@ ╔SSUE #5
- @@@@@@@@@@@@@@@@@@ ═ARCH 7, 1993
- @@@@@@@@
-
- -----------------------------------------------------------------------------
- ┼DITOR'S ╬OTES:
- BY ├RAIG ╘AYLOR
-
- ╔T SEEMS THAT EACH ISSUE OF ├= ╚ACKING HAS ALWAYS BEGAN WITH A "╙ORRY, ╔T'S
- LATE BUT HERE IT IS MESSAGE." - ╫ELL, THIS ONE WILL START OUT AGAIN LIKE
- THAT - ╘HIS ISSUE WAS ORIGINALLY SCHEDULED TO BE OUT THE MIDDLE OF ╩ANUARY
- BUT DUE TO SEVERAL DELAYS IN OBTAINING ARTICLES AND MY DELAYING TRYING TO
- DEBUG THE MULTI-TASKING SOURCE CODE IT'S BEEN HELD UP UNTIL NOW.
-
- ═Y APOLOGIES TO THE AUTHORS WHO HAVE HAD THEIR ARTICLES INTO ME ON TIME -
- SCHOOL IS COMING FIRST FOR ME AND HAVING TO DO A LOT OF CODING FOR SEVERAL
- CLASSES WAS THE MAJOR CONTRIBUTING FACTOR TO THE DELAYS.
-
- ╬OW, AFTER THE APOLOGIES ARE OUT OF THE WAY - ╠ET'S TAKE A LOOK AT WHAT HAS
- HAPPENED SINCE LAST TIME ╔ WROTE.
-
- - ╥╒╬ MAGAZINE IS NO LONGER WITH US.
-
- ┴S ONE OF THE LAST HOLD-OUTS ╔ WAS EXPECTING ╥╒╬ MAGAZINE TO KEEP ON PRINTING
- UNTIL THE ├OMMODORE 64/128'S REALLY DID DIE OUT BUT APPARENTLY THE PUBLISHERS
- DECIDED IT WOULDN'T BE SO. ╘HIS LEAVES THE ╘WIN ├ITIES MAGAZINE AS THE ONLY
- ╒╙ MAGAZINE IN PUBLICATION FOR THE ├OMMODORE (6502 BASED) COMPUTERS THAT ╔ AM
- AWARE OF. ╙PEAKING OF ╘WIN ├ITIES (NOT SURE IF HE'S COMBINING THE 64/128 OR
- JUST COMING OUT WITH SEPERATE ╘WIN ├ITIES MAGAZINES) DOES ANYBODY KNOW OR
- HAVE ANY INFORMATION ON WHEN THE NEXT ISSUE WILL BE OUT? ╧R HAS MY
- LASTEST ISSUE JUST NOT BEEN SENT OUT?
-
- ┴S ╔ WAS WRITING THIS ╔ GOT THE LATEST ISSUE OF ╘WIN ├ITIES WHICH HAS
- EXPANDED TO ├=64 COVERAGE ALSO. ╘HE NEW ISSUE LOOKS VERY NICE, ABOUT 53
- PAGES OF SO OF GOOD DECENT MATERIAL. ╔'D RECOMMEND GET A SUBSCRIPTION FOR
- THOSE OF YOU WHO ARE LOOKING TO STILL HEAR ABOUT NEW ├OMMODORE PRODUCTS.
-
- ╔'D LIKE TO GET PEOPLE'S REACTIONS ON THE DEMISE OF ╥╒╬ AND WHAT WILL
- PEOPLE WILL THINK WILL PROBABLY BE THE MAIN SOURCE OF INFORMATION FOR ├=
- OWNERS. ┴ LOT OF PEOPLE READING THIS MAGAZINE ARE ON THE COMP.SYS.CBM
- NEWSGROUP BUT ╔'M WONDERING ABOUT INDIVIDUALS WHO DO NOT HAVE ACCESS TO
- SUCH A NEWSGROUP AND DO NOT HAVE ACCESS TO THE INTERNET. ╠ET ME KNOW WHAT
- YOU THINK - HOPEFULLY THROUGH A FRIEND W/ ACCESS TO THE INTERNET. ╙ORT OF
- A CATCH-22 ╔ GUESS.
-
- - ┴ ═AIL-╙ERVER HAS BEEN SETUP TO AUTOMATE SENDING ISSUE REQUESTS.
-
- ╘HE FULL DETAILS OF HOW TO USE THE ═AIL-╙ERVER IS IN A DOCUMENTATION FILE
- CONTAINED WITHIN BUT THIS MAIL-SERVER (WHOSE SOURCE CODE IS AVAILABLE FOR
- ANYONE WHO WISHES TO SEE IT WRITTEN IN ╓┴╪ ─├╠ CODE) ALSO ALLOWS FILE
- REQUESTS WHICH WILL BE UUENCODED AND SENT TO YOU. ╔ AM TRYING TO HAVE ALL OF
- THE PROGRAMS IN EACH ISSUE AVAILABLE VIA REQUEST AS FOR SOME PEOPLE IT IS
- A MINOR PAIN TRYING TO EXTRACT AND COMPILE THE PROGRAMS CONTAINED WITHIN.
-
- - ╔ SAW A NOTE RECENTLY THAT THE SPEED-UP BOARD WORK WAS STILL BEING DONE.
-
- ─OES ANYBODY KNOW ANYTHING FURTHER ABOUT THIS? ╔'M INTERESTED IN THIS AND
- HOW IT WOULD BE CARRIED OUT / DONE BUT ASIDE FROM AN OCCASIONAL POST HERE
- AND THERE ABOUT IT ╔ ACTUALLY HEAR VERY LITTLE.
-
- - ╘HERE IS ALSO WORK ON AN ┴NSI ├ COMPILER BEING DONE.
-
- ╥ECENTLY A GROUP OF PEOPLE (ABOUT 9 CURRENTLY) ARE WORKING ON A ├ COMPILER
- FOR THE ├=64 AND ├=128 WHICH WILL EVENTUALLY SUPPORT THE FULL ┴╬╙╔ ├
- LIBRARY. ┴ LARGE LIST OF EXTENSIONS HAVE BEEN PROPOSED AND THE COMPILER
- WILL PROBABLY BE RELEASED AS EITHER SHAREWARE OR POSSIBLY, PUBLIC DOMAIN.
-
- ┴CK! - ╘HIS MAGAZINE KEEPS GROWING. ╘HE LAST ISSUE WAS APPROX.
- SOMEWHERE AROUND 3000 LINES, THIS ONE IS JUST A TAD OVER 6000. ╔'M
- SURE THAT WE'RE NOT SUFFERING THE QUALITY JUST BECAUSE OF THE
- QUANTITY. :-) ┬E SURE TO TAKE A LOOK AT THE PREVIOUS BACK ISSUES
- AVAILABLE VIA THE ═AIL-╙ERVER AND DON'T BE AFRAID TO SUGGEST COMMENTS
- OR SUGGESTIONS. ╫HILE USUALLY THE AUTHORS ARE TOO BUSY TO TAKE IDEAS
- FOR NEW PROGRAMS WE ALWAYS WELCOME TO HEAR HOW USEFUL YOU FIND CERTAIN
- PROGRAMS INCLUDED HEREIN ETC.
-
- ┴LSO ╔ AM LOOKING FOR ARTICLES ON ANY TYPE OF SOFTWARE PROJECT, HARDWARE
- PROJECT OR GENERAL THEORY ARTICLES THAT YOU WOULD LIKE TO SUBMIT. ╩UST
- LEAVE ME A MESSAGE VIA EMAIL AT "DUCK@PEMBVAX1.PEMBROKE.EDU". ╬OTE ALSO
- THAT ╔'VE JUST SIGNED UP FOR A ╟┼╬╔┼ ACCOUNT AND CAN BE REACHED THERE VIA
- ├.╘┴┘╠╧╥37 ONCE MY ACCOUNT IS APPROVED.
-
- =============================================================================
-
- ╨LEASE NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS
- ╞╘╨ FROM CCOSUN.CALTECH.EDU UNDER PUB/RKNOP/HACKING.MAG IN ADDITION TO THE
- MAILSERVER WHICH IS DOCUMENTED IN THIS ISSUE.
-
- =============================================================================
-
- ╬╧╘╔├┼: ╨ERMISSION IS GRANTED TO RE-DISTRIBUTE THIS "NET-MAGAZINE", IN
- WHOLE, FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL
- AUTHORS FOR PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPERATELY.
- ┴ CHARGE OF NO GREATER THAN 5 ╒╙. ─OLLARS OR EQUIVLENT MAY BE CHARGED FOR
- LIBRARY SERVICE / DISKETTE COSTS FOR THIS "NET-MAGAZINE."
-
- =============================================================================
- ╔N THIS ╔SSUE:
-
- ═AIL-╙ERVER ─OCUMENTATION
-
- ╘HIS ARTICLES DESCRIBES HOW TO ACCESS THE MAIL-SERVER FOR ├OMMODORE ╚ACKING
- AND INCLUDES A LIST OF CURRENTLY AVAILABLE FILES AND BACK-ISSUES.
-
- ╙TRETCHING ╙PRITES
-
- ╔T'S POSSIBLE TO EXPAND SPRITES TO MORE THAN TWICE THEIR ORIGINAL SIZE, BUT
- THERE IS NO NEED TO EXPAND ALL OF THEM EQUALLY. ╘HIS ARTICLE EXAMINS HOW TO
- EXPAND THEM 2,3, OR MORE MULTIPLES OF THEIR ORIGINAL SIZE.
-
- ╥OB ╚UBBARD'S ═USIC: ─ISASSEMBLED, ├OMMENTED AND ┼XPLAINED
-
- ╘HIS ARTICLE WRITTEN BY ┴NTHONY ═C╙WEENEY, PRESENTS THE VALUABLE SOURCE TO
- ╥OB ╚UBBARD'S FIRST MUSIC ROUTINE. ╘HIS ROUTINE WAS USED IN ╥OB'S FIRST 20
- OR 30 MUSICS, INCLUDING SUCH CLASSICS AS ╘HING ON A ╙PRING (╟REMLIN ╟RAPHICS),
- ├OMMANDO (┼LITE), ╘HRUST (╞IREBIRD), ╔NTERNATIONAL ╦ARATE (╙YSTEM 3), AND
- ╨ROTEUS (ALSO KNOWN AS ╫ARHAWK, BY ╞IREBIRD).
-
- ┌╨═3 AND ┌├├╨ ┼NHANCEMENTS FOR ├╨/═ ╨LUS FROM ╙IMEON ├RAN
-
- ┴LTHOUGH ALL THE ARTICLES TO DATE IN ├= ╚ACKING HAVE FOCUSED ON 6510/ 8502
- PROGRAMMING, THERE HAVE BEEN SOME INTERESTING DEVELOPMENTS ON THE ┌80 FRONT.
- ├128 ├╨/═ USERS SHOULD BE AWARE OF THE BENEFITS OF A NEW SET OF ENHANCEMENTS
- TO THE OPERATING SYSTEM THAT OFFERS INREASED SPEED AND FLEXIBILITY AS WELL
- AS NEW FEATURES. ╔F THAT ISN'T ENOUGH, THIS PACKAGE WILL ALSO RUN ┌├╨╥ 3.3
- UTILITIES AND APPLICATIONS THAT WON'T RUN UNDER STANDARD ├╨/═ ╨LUS.
-
- ═ULTI-╘ASKING ON THE ├=128 - ╨ART 1
-
- ╘HIS ARTICLE EXAMINES THE RUDIMENTS OF ═ULTI-╘ASKING AND ALSO DETAILS THE
- SYSTEM CALLS IN THE ═ULTI-╘ASKING PACKAGE TO BE RELEASED IN THE NEXT ISSUE
- OF ├= ╚ACKING.
-
- ╠╔╘╘╠┼ ╥┼─ ╫╥╔╘┼╥: ═╙-─╧╙ FILE READER/WRITER FOR THE ├128 AND 1571/81.
-
- ╘HIS ARTICLE IS AN EXTENSION ON ╠ITTLE ╥ED ╥EADER WHICH WAS PRESENTED IN THE
- LAST ISSUE AND ALLOWS FOR READING AND WRITING OF ═╙-─OS DISKETTES FROM AND TO
- 1571/81 DRIVES.
-
- =============================================================================
- ═AIL-╙ERVER ─OCUMENTATION
- BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
-
- ╫HAT IS A MAIL-SERVER?
-
- ┴ MAILSERVER IS AN AUTOMATED JOB THAT WILL SCAN MY MAIL FILE FOR MESSAGES
- WITH A SUBJECT LINE OF "═┴╔╠╙┼╥╓" AND WILL THEN AUTOMATICALLY CARRY OUT
- CERTAIN OPERATIONS WITHIN THE BODY OF THE MAIL MESSAGE. ╘HIS MAKES IT EASIER
- ON ME AND YOU. ┼ASIER FOR ME SO THAT ╔ DON'T HAVE TO DEAL WITH 50+ MESSAGES
- EACH MONTH ASKING FOR FILES TO BE SENT OUT AND ALSO INSURES THAT YOUR FILES
- THAT YOU REQUESTED WILL BE SENT WITHIN 24 HOURS. ╔N ADDITION IT ALLOWS
- FILES TO BE MORE EASILY SENT AND ACCESSED IN CASE YOU ARE NOT ABLE TO
- EXTRACT THE SOURCE FILES FROM ├= ╚ACKING.
-
- ╔F YOU HAVE ╞╘╨ ACCESS PLEASE SEE THE ┼DITOR'S ╬OTES AT THE START FOR
- INFORMATION ON ╥. ╦NOP'S ╞╘╨ SITE AND HOW TO ACCESS IT AS YOU MAY FIND
- USING THAT SOMEWHAT QUICKER TO USE.
-
- ╚OW TO USE THE MAIL-SERVER / ╫HAT IT IS.
-
- ╘HIS MAIL-SERVER IS INTENDED TO HELP ME KEEP TRACK / MORE EASILY UPDATE MY
- MAILING LIST OF INDIVIDUALS WHO WISH TO SUB-SCRIBE OR GET BACK-ISSUES OF
- ├= ╚ACKING MAILED TO THEM.
-
- ╘O USE IT SIMPLY SEND A MESSAGE TO "DUCK@PEMBVAX1.PEMBROKE.EDU" (ME) WITH A
- SUBJECT LINE OF "═┴╔╠╙┼╥╓" AND THEN WITH ONE OF THE FOLLOWING COMMANDS IN THE
- BODY OF THE MAIL MESSAGE:
-
- ├URRENTLY THE FOLLOWING COMMANDS ARE SUPPORTED:
-
- HELP - SENDS CURRENT DOCUMENTATION F FILE LIST
- SEND ISS<NUMBER>. - SENDS ISSUE # (1-4 CURRENTLY). ╥EMEMBER THE PERIOD!!
- SUBSCRIBE - SUBSCRIBE TO THE MAILING LIST AUTOMATICALLY
- *SUBSCRIBE CATALOG - SUBSCRIBES TO A LIST THAT WILL BE SENT OUT
- EVERYTIME THE CATALOG CHANGES.
- CATALOG - SHOW LIST OF AVAILABLE SOURCE /UUENCODED BINARIES
- PSEND NAME - SEND UUENCODED BINARY.
-
- ├OMMANDS NO LONGER SUPPORTED:
-
- STATUS - RETURNS THE CURRENT COMMANDS (THIS LIST)
- (USE THE HELP FILE)
-
- ╨LEASE NOTE THAT THE MAILSERVER IS ONLY RUN AT 2:00 ┴═ ┼╙╘.
-
- ├ATALOG ╠IST - ╠AST UPDATE ╞EBRUARY 27, 1993.
-
- ISS1. - ├= ╚ACKING, ╔SSUE #1
- ISS2. - ├= ╚ACKING, ╔SSUE #2
- ISS3. - ├= ╚ACKING, ╔SSUE #3
- ISS4. - ├= ╚ACKING, ╔SSUE #4
- ISS5. - ├= ╚ACKING, ╔SSUE #5
- CONTENTS.LIS - ├ONTENT ╠ISTING OF ╔SSUES #1-4
- MAILSERV.012493 - ╓┴╪/─├╠ ═AILSERVER .SHARE FILE
-
- *INVASION1.SFX - ╙PACE ╔NVASION ╙OURCE (╙TARTING WITH ╔SSUE 4)
- *BMOVER.SFX - ╟EOS 128 ┬ANKING WITH ┬ANKS 2F3 (╔SSUE #2)
- *VDC-BG.SFX - ╒SE OF 64╦ ╓─├ ╥┴═ IN ╟EOS (╔SSUE #3)
- *C64.ZIP - ├64 ┼MULATOR FOR ╔┬═
- *LRR.SFX - ╠ITTLE ╥ED ╥EADER (FROM ├= ╚ACKING #4)
-
- -- ╘EMPORARY ╞ILES -> ╧R FILES THAT WILL BE DELETED AS NEEDED FOR SPACE
-
- *ZEDV075.SFX - ┌ED-128 ╘EXT ┼DITOR
- *RAMDOSII.SFX - ╥┼╒ ─OS FOR THE ├=128 ┴LLOWS > 512K ╥┼╒.
-
- ╬╧╘┼: ╞ILES MARKED WITH "*" SHOULD BE REQUESTED VIA ╨╙┼╬─ - THEY WILL BE
- SENT TO YOU IN UUENCODED FORM. ╘HEY MAY _NOT_ BE REQUESTED VIA ╙┼╬─.
-
- =============================================================================
- ╘HE ─EMO ├ORNER: ╙TRETCHING ╙PRITES
- BY ╨ASI '┴LBERT' ╧JALA (PO87553@CS.TUT.FI)
- ╫RITTEN: 16-═AY-91 ╘RANSLATION/╥EVISION 01-╩UN-92, ─EC-92
-
- (┴LL TIMINGS ARE IN ╨┴╠, PRINCIPLES WILL APPLY TO ╬╘╙├ TOO)
-
- ┘OU MIGHT HAVE HEARD THAT IT IS POSSIBLE TO EXPAND SPRITES TO MORE THAN
- TWICE THEIR ORIGINAL SIZE. ╔MAGINE A SPRITE SCROLLER WITH 6-TIMES EXPANDED
- SPRITES. ╚OWEVER, THERE IS NO NEED TO EXPAND ALL OF THEM EQUALLY. ╒SING
- THIS TECHNIQUE, IT IS POSSIBLE TO MAKE EASY SINUS EFFECTS AND CONSTANTLY
- EXPANDING AND SHRINKING LETTERS.
-
- ╘HE ╓╔├ (VIDEO INTERFACE CONTROLLER) MAY BE FOOLED IN MANY THINGS. ╧NE OF
- THEM IS THE VERTICAL EXPANSION OF SPRITES. ╔F YOU CLEAR THE EXPAND FLAG AND
- THEN SET IT BACK STRAIGHT AWAY, ╓╔├ WILL THINK IT HAS ONLY DISPLAYED THE
- FIRST ONE OF THE EXPANDED LINES. ╔F WE DO THE TRICK AGAIN, ╓╔├ WILL CONTINUE
- TO DISPLAY THE SAME DATA AGAIN AND AGAIN. ┬UT WHY DOES ╓╔├ BEHAVE LIKE THIS ?
-
-
- _╠OGIC GATES WILL TELL THE TRUTH_
-
- ╔T IS NOT REALLY A BUG, BUT A FEATURE. ╘HE HARDWARE DESIGN TO IMPLEMENT THE
- VERTICAL ENLARGEMENT WAS JUST AS SIMPLE AS POSSIBLE. ╘HOSE, WHO DO NOT CARE
- ABOUT HARDWARE SHOULD SKIP THIS PART... ╘HE WHOLE Y-ENLARGEMENT IS HANDLED
- WITH FIVE SIMPLE LOGICAL PORTS. ┼ACH SPRITE HAS AN ASSOCIATED ╙ET-╥ESET
- FLIP-FLOP TO TELL WHETHER TO JUMP TO THE NEXT SPRITE LINE (ADD THREE BYTES
- TO THE DATA COUNTER) OR NOT.
-
- ╠ET'S CALL THE STATE OF THE FLIP-FLOP ╤ AND THE INPUTS ╥ (RESET) AND ╙ (SET).
- ╘HE FUNCTION OF A ╙╥ FLIP-FLOP IS QUITE SIMPLE: IF ╥ IS ONE, ╤ GOES TO ZERO,
- IF ╙ IS ONE, ╤ GOES TO ONE. ╧THERWISE THE STATE OF THE FLIP-FLOP DOES NOT
- CHANGE. ╔N THIS CASE THE FLIP-FLOP IS ╙ET, IF EITHER THE ┘-ENLARGEMENT BIT
- IS ZERO OR THE STATE OF THE FLIP-FLOP IS ZERO AT THE END OF A SCAN LINE. ╘HE
- FLIP-FLOP IS RESET, IF BOTH THE STATE AND THE ┘-ENLARGEMENT ARE ONES AT THE
- END OF THE LINE.
-
- ╫HEN YOU CLEAR THE BIT IN THE VERTICAL EXPANSION REGISTER, THE FLIP-FLOP WILL
- BE SET REGARDLESS OF THE ELECTRON BEAM POSITION ON THE SCAN LINE. ╔F YOU
- SET THE BIT AGAIN BEFORE THE END OF THE LINE, THE FLIP-FLOP WILL BE CLEARED
- AND ╓╔├ WILL BE DISPLAYING THE SAME SPRITE LINE AGAIN. ╔N OTHER WORDS, ╓╔├
- WILL THINK THAT IT IS STARTING TO DISPLAY THE SECOND LINE OF THE EXPANDED
- SPRITE ROW. ╘HIS WAY ANY OF THE LINES IN ANY OF THE SPRITES MAY BE STRETCHED
- AS WANTED.
-
- .---- ├URRENT FLIPFLOP STATE (IF ONE, ENABLES ADD TO SPRITE POINTER)
- | .---- ┘-EXPANSION BIT.
- | | .--- ┼ND OF LINE PULSE (BRIEFLY ONE AT END OF LINE)
- | | | .--- ╬EXT STATE (╫HAT STATE WILL BECOME UNDER THESE CONDITIONS)
- | | | |
- 0 0 0 1
- 0 0 1 1
- 0 1 0 NO CHANGE
- 0 1 1 1
- 1 0 0 1 ├LEAR $─017 -> FLIP-FLOP IS SET
- 1 0 1 1
- 1 1 0 NO CHANGE ╙ET $─017 -> FLIP-FLOP RESETS AT THE END OF LINE
- 1 1 1 0
-
- ╙O, SIMPLY, AT ANY TIME, IF VERTICAL EXPAND IS ZERO, THE ADD ENABLE IS SET
- TO ONE. ┴T THE END OF THE LINE - BEFORE ADDING - THE STATE IS CLEARED IF
- VERTICAL EXPAND IS ONE.
-
-
- _┼VEN ODDER ?_
-
- ╙OMETHING VERY WEIRD HAPPENS WHEN WE CLEAR THE EXPANSION BIT RIGHT WHEN ╓╔├
- IS ADDING THREE TO THE SPRITE IMAGE COUNTERS. ╘HE VALUES IN THE COUNTERS WILL
- BE INCREASED ONLY BY TWO, AND THE DATA IS THEN READ FROM THE WRONG PLACE.
-
- ╬ORMALLY THE DISPLAY OF A SPRITE ENDS WHEN ╓╔├ HAS SHOWN ALL OF THE 21
- LINES OF THE SPRITE (THE COUNTER WILL END UP TO $3F). ╔F THERE HAS BEEN A
- COUNTER MIXUP, $3F IS NOT REACHED AFTER 21 LINES AND ╓╔├ WILL GO ON COUNTING
- AND WILL DISPLAY THE SPRITE AGAIN, NOW NORMALLY. ╔F WE FOOL THE COUNTER ONLY
- ONCE, THE COUNTER VALUE $3F IS REACHED WHEN THE SPRITE IS DISPLAYED TWICE.
-
-
- _╞IDDLING_
-
- ╔ DON'T THINK THE DISTORTED COUNTER EFFECT CAN BE USED FOR ANYTHING, BUT
- THERE IS MANY THINGS WHERE THE VARIABLE STRETCHING COULD BE USED. ╫HEN YOU
- OPEN THE BORDERS, YOU CAN BE SURE THAT THERE IS A CONSTANT AMOUNT OF TIME,
- IF YOU STRETCH THE SPRITES TO THE WHOLE LENGHT OF THE AREA. ┘OU MAY STRETCH
- ONLY THE FIRST AND LAST LINES, STRETCH THE OTHER LINES BY A CONSTANT OR
- USING A TABLE, OR USING A VARIABLE TABLE OR ANY OF THE COMBINATIONS POSSIBLE.
-
-
- _┴ RASTER ROUTINE IS A MUST_
-
- ┬ECAUSE YOU HAVE TO ACCESS THE ╓╔├ REGISTERS ON EACH LINE DURING THE STRETCH,
- YOU NEED SOME KIND OF ROUTINE WHICH CAN DO OTHER KINDS OF TRICKS BESIDES THE
- STRETCH. ┘OU CAN OPEN THE SIDE BORDERS AND CHANGE THE BACKGROUND COLOR AND
- MAYBE YOU HAVE TO SHIFT THE SCREEN (AND THE BAD LINES WITH IT) DOWNWARDS.
- [╙EE PREVIOUS ├=╚ACKING ╔SSUES FOR TALK ABOUT RASTER INTERRUPTS.]
-
- ╠OOK AT THE DEMO PROGRAM. ╔N THE BEGINNING OF THE RASTER ROUTINE THERE IS
- FIRST SOME TIMING, THEN A LOOP THAT LASTS EXACTLY 46 CLOCK CYCLES. ╔T TAKES
- EXACTLY ONE SCAN LINE TO EXECUTE. ╔NSIDE THE LOOP WE FIRST DO THE NECASSARY
- MODIFICATIONS TO THE VERTICAL SCROLL REGISTER, THEN WE CHANGE THE BACKGROUND
- COLOR AND THEN WE OPEN THE SIDE BORDERS. ┴ND FINALLY WE HANDLE THE STRETCHING
- USING THE STRETCH DATA, WHERE A ZERO-BIT MEANS THAT THE CORRESPONDING SPRITE
- WILL BE STRETCHED. ┴ ONE-BIT MEANS THAT ╓╔├ IS ALLOWED TO GO TO THE NEXT LINE
- OF THE SPRITE DATA.
-
-
- _╙TRETCHING TAKES TIME_
-
- ┬ESIDES SHOWING THE STRETCHED SPRITES WE NEED TIME TO GENERATE THE STRETCHING
- DATA, UNLESS OF COURSE, THE STRETCH IS CONSTANT. ╫E HAVE TO HAVE 20
- ONE-BITS FOR EACH SPRITE IN OUR TABLE. ╔T IS NOT FEASIBLE TO DETERMINE THE
- STATE OF EACH BYTE IN THE TABLE, INSTEAD YOU CLEAR THE TABLE AND PLOT THE
- NEEDED BITS.
-
- ╘HE ROUTINE IS QUITE STRAIGHTFORWARD, BUT MANY OPTIMIZATIONS MAY BE APPLIED
- TO MAKE IT FASTER. ╞IRST WE LOAD ┘ WITH THE STRETCH OF THE FIRST LINE (THE
- Y-COORDINATE OF THE DATA). ╘HEN WE USE IT AS AN INDEX TO THE TABLE AND PLOT
- THE RIGHT BIT AND INCREASE ┘ WITH THE EXPANSION VALUE. ╘HEN WE DO IT AGAIN
- UNTIL WE HAVE ALL OF THE 20 BITS SCATTERED TO THE TABLE. ╘HE LAST SPRITE LINE
- WILL THEN STRETCH UNTIL WE STOP THE STRETCHING, BECAUSE THE LAST LINE IS
- NOT ALLOWED TO BE DRAWN.
-
-
- _╙PEED IS EVERYTHING_
-
- ╘HE CALCULATION ITSELF IS EASY, BUT OPTIMIZING THE ROUTINE IS NOT. ╔F ALL
- OF THE SPRITES ARE STRETCHED EQUALLY (BY INTEGER AMOUNTS) AND FROM THE SAME
- POSITION, THE ROUTINE IS THE FASTEST POSSIBLE. ┘OU CAN ALSO HAVE VARIABLE
- AND SMOOTH STRETCH. ╙MOOTH STRETCH USES OTHER THAN INTEGER EXPANSION VALUES
- AND THUS ALSO NEEDS MORE PROCESSOR TIME. ╔F EACH SPRITE HAS TO BE STRETCHED
- INDIVIDUALLY, YOU NEED MUCH MORE TIME TO DO IT.
-
- ╘HE FASTEST ROUTINE ╔ HAVE EVER WRITTEN USES SOME SERIOUS SELFMODIFICATION
- TRICKS. ╘HERE ARE ALSO SOME OTHER TRICKS TO SPEED UP THE STRETCH, BUT THEY
- ARE ALL SECRET ONES.. :-) ╫ELL, WHAT THE H*CK, ╔ WILL INCLUDE IT ANYWAY.
- ┬Y THE TIME YOU READ THIS ╔ HAVE ALREADY MADE A FASTER ROUTINE..
-
- ┘OU CAN SPEED UP THAT ROUTINE (BY 17%) BY UNROLLING THE INNER LOOP, BUT YOU
- HAVE TO USE A DIFFERENT ADDRESSING MODE FOR ╧╥┴ (ZERO-PAGE). ┘OU ALSO NEED
- TO PLACE SOME RESTRICTIONS TO THE TABLES USED.. ╔F YOU UNROLL BOTH LOOPS,
- YOU CAN GET ~25% FASTER ROUTINE THAN THE ╞ORE!-VERSION.
-
-
- _─EMO PROGRAM_
-
- ╔ TRIED TO COLLECT ALL OF THE MAIN PRINCIPLES OF STRETCHING AND RASTER
- ROUTINES TO THE DEMO PROGRAM. ╔ USE THE TERM "RASTER ROUTINE" WHEN THE
- EXECUTION IS TIGHTLY SYNCHRONIZED TO THE ELECTRON BEAM AND TO THE SCREEN
- DISPLAY. ╘HE PROGRAM MAY BE UNCLEAR IN PLACES, BUT ╔ WANTED TO KEEP IT AS
- SHORT AS POSSIBLE. ╘HE ROUTINE OPENS THE SIDE BORDERS, SCROLLS THE SCREEN
- VERTICALLY, CHANGES THE BACKGROUND COLOR AND STRETCHES THE SPRITES.
-
- ╘HE STRETCHER ROUTINE ALLOWS DIFFERENT Y-POSITION AND AMOUNT OF EXPANSION
- FOR EACH SPRITE. ╘HIS ROUTINE USES 1/8 FRACTIONS TO DO THE COUNTING, AND SO
- IT IS MUCH TOO SLOW TO USE IN A REAL DEMO. ╓╔├ REGISTERS ARE INITIALIZED
- FROM A TABLE, INSTEAD OF SETTING THEM SEPARATELY. ╔NTERRUPT POSITION IS ONE
- LINE ABOVE THE SPRITES. ╘HE PROGRAM DOES NOT OPEN THE TOP OR BOTTOM BORDERS.
- (╔ USUALLY USE A ╬═╔ TO OPEN THE VERTICAL BORDERS, SO THAT ╔ ONLY NEED TO
- USE ONE RASTER-╔╥╤ POSITION.)
-
- ╔ TRIED TO MAKE A ╬╘╙├ VERSION, BUT ╔ COULDN'T GET IT TO SYNCHRONIZE.
- ╘HERE ARE ALSO LESS CYCLES AVAILABLE SO YOU CAN'T STRETCH ALL OF THE SPRITES
- INDIVIDUALLY IN ╬╘╙├ (WITH THIS ROUTINE THAT IS..).
-
- --------------------------------------------------------------------------
- ╞AST-STRETCH FROM ═EGADEMO92 (PART: ╞ORE!)
-
- ╙╔╬╨╧╙ ╙TRETCH SINUS INDEX
- ╙╔╬╙╨┼┼─ ╙TRETCH SINUS INDEX SPEED
- ┘╙╔╬╨╧╙ ┘-SINUS INDEX
- ┘╙╔╬╙╨┼┼─ ┘-SINUS INDEX SPEED
- ═┴╙╦ ┬IT MASK FOR PASSESS (USUALLY $01,$02,$04,$08,$10..)
-
- ┘╙╔╬╒╙ ┘-SINUS TABLE
- ╙╘╥┼╘├╚ ╙PRITE LINE SIZES (╠╙┬ OF THE ADDRESS MUST BE 0)
- ╙╔┌┼╘ ╙PRITE SIZE/2 TABLE (╠╙┬ OF THE ADDRESS MUST BE 0)
- ─┴╘┴ ╙TRETCH DATA TABLE (CLEARED BEFORE THIS ROUTINE)
-
- [XX] MARKS SELFMODIFICATION. ╞OR EXAMPLE LOOP COUNTER, BIT MASK AND
- INDEX TO THE STRETCH AND SIZE DATA TABLES ARE STORED STRAIGHT IN THE
- CODE.
-
- 0B90 LDA #$06 ; ╬UMBER OF SPRITES-1 (HERE ╔ USED ONLY 7 SPRITES)
- 0B92 STA $0B96
- 0B95 LDX #$[FF] ; ╠OAD COUNTER
- 0B97 CLC ; ├LEAR CARRY FOR ADC
- 0B98 LDA ╙╔╬╨╧╙,X ; ╙TRETCH SINUS POSITION
- 0B9B STA $0BD1 ; ╙ET LOW BYTES OF INDICES
- 0B9E STA $0BB8
- 0BA1 ADC ╙╔╬╙╨┼┼─,X ; ┴DD STRETCH SINUS SPEED (CARRY IS NOT SET)
- 0BA4 AND #$7F ; ╘ABLE IS 128 BYTES (TWICE)
- 0BA6 STA ╙╔╬╨╧╙,X ; ╙AVE NEW SINUS POSITION
- 0BA9 LDA ┘╙╔╬╨╧╙,X ; ╟ET THE ┘ SINUS POSITION
- 0BAC ADC ┘╙╔╬╙╨┼┼─,X ; ┴DD ┘ SINUS SPEED
- 0BAF STA ┘╙╔╬╨╧╙,X ; ╙AVE NEW ┘ SINUS POSITION
- 0BB2 TAY ; ╨OSITION TO INDEX REGISTER
- 0BB3 LDA ┘╙╔╬╒╙,Y ; ╟ET ┘-POSITION FROM TABLE (CAN BE 256 BYTES LONG)
- 0BB6 SEC ; ADC EITHER SETS OR CLEARS CARRY, WE HAVE TO SET IT
- 0BB7 SBC ╙╔┌┼╘[1E] ; ╙UBTRACT SIZE OF THE SPRITE/2 TO GET THE SPRITE
- 0BBA CLC ; TO STRETCH FROM THE MIDDLE.
- 0BBB TAY ; ═AX╙IZE/2 < ┘-SINUS < ┴REA╚EIGHT-═AX╙IZE/2
- 0BBC LDA ═┴╙╦,X ; ╟ET THE ORA-MASK FOR THIS PASS
- 0BBF STA $0BCB ; ╙TORE MASK
- 0BC2 STA $0BDB
- 0BC5 LDX #$13 ; 19 LINES HERE + 1 AFTER
- 0BC7 LDA ─┴╘┴,Y ; ╠OAD & ORA-MASK & STORE
- 0BCA ORA #[$01]
- 0BCC STA ─┴╘┴,Y
- 0BCF TYA
- 0BD0 ADC ╙╘╥┼╘├╚[1E],X ; ┴DD THE STRETCH FROM THE TABLE (CARRY IS NOT SET)
- 0BD3 TAY
- 0BD4 DEX ; DECREASE COUNTER
- 0BD5 BNE $0BC7 ; ─O THE 19 LINES
- 0BD7 LDA ─┴╘┴,Y ; ╠OAD & ORA-MASK & STORE THE 20TH LINE
- 0BDA ORA #[$01]
- 0BDC STA ─┴╘┴,Y
- 0BDF DEC $0B96 ; ╬EXT SPRITE(S)
- 0BE2 BPL $0B95
- 0BE4 RTS
-
- ╘IMINGS:
- -------
- CLEAR 128 BYTES: 514 + 12 CYCLES 8.16 LINES
- 7 PASSES : 3820 + 12 CYCLES 60.6 LINES = 8.66 LINES/PASS
-
- ╘HE UNROLLED CLEAR ROUTINE CONSISTS OF ONE LOAD (LDA #$00) AND 128
- STORE INSTRUCTIONS (STA $NNNN). 12 CYCLES ARE COUNTED FOR ╩╙╥/╥╘╙.
-
- ╙TRETCHING OF 8 SPRITES WOULD TAKE SLIGHTLY LESS THAN 80 LINES, WHICH IS ONE
- FOURTH OF THE TOTAL RASTER TIME. ─ISPLAYING A 128-LINE HIGH STRETCHER TAKES
- ABOUT 130 LINES (COUNTING SPRITE SETUP AND SYNCHRONIZATION), SCROLLER COUPLE
- OF LINES MORE. ╘OTAL 212 LINES LEAVES 100 LINES (6300 CYCLES) FREE FOR OTHER
- ACTIVITIES IN A ╨┴╠ SYSTEM. ╔N A ╬╘╙├ SYSTEM YOU WOULD HAVE ONLY 50 LINES
- LEFT.
-
-
- ┴ SIMPLE BASIC ROUTINE TO CREATE THE STRETCH DATA:
- -------------------------------------------------
- A=0:FOR F=0 TO 127:A=A+╚EIGHT*(2+SIN(F*╨╔/64)):POKE ╘ABLE+F,A:
- POKE ╘ABLE+F+128,A:A=A-INT(A):NEXT F
-
- ╘HIS WILL ALSO HANDLE THE 'ROUNDING'. ┬ECAUSE OF THIS WE DON'T HAVE TO
- HANDLE FRACTIONS IN THE STRETCHER ROUTINE. ╘HE USE OF A TABLE ALSO GIVES THE
- OPPORTUNITY TO HAVE A SEPARATE SIZE FOR EACH SPRITE LINE. ╘HE TABLE DOES
- NOT NEED TO BE A SINUS, IT COULD HAVE TRIANGLE OR ANY OTHER 'WAVEFORM' AS
- LONG AS THE MINIMUM VALUE IN THE TABLE (SPRITE LINE SIZE) IS 1.
-
-
- ┴ BASIC ROUTINE TO DO THE SIZE/2 TABLE:
- --------------------------------------
- A=0:FOR F=0 TO 19:A=A+PEEK(╘ABLE+F):NEXT F: REM GET THE SIZE IN POSITION 0
- FOR F=0 TO 127:POKE ╙╘ABLE+F,A/2:A=A-PEEK(╘ABLE+F)+PEEK(╘ABLE+F+20):NEXT F
-
- --------------------------------------------------------------------------
- _╙TRETCHER PROGRAM_
-
- ┘╙├╥╧╠╠= $├╞00 ; ╓ERTICAL SCROLL TABLE (MOVES BAD LINES)
- ╙╘╥┼╘├╚= $├╞80 ; ╙TRETCH TABLE
- ├╧╠╧╥╙= $├┼80 ; ╘ABLE FOR BACKGROUND COLORS
- ┘├╧╧╥─= $0380 ; ╙PRITE Y-POSITIONS (EIGHT BYTES)
- ╚┼╔╟╚╘= $0388 ; ╙PRITE STRETCHES (EIGHT BYTES)
- ┘╨╧╙= 52 ; ╙PRITE Y-COORDINATE
- ╙╨╥├╧╠= 2 ; ╙PRITE COLORS
-
-
- *= $├000
-
- ╙┼╔ ; ─ISABLE INTERRUPTS
- ╠─┴ #$7╞
- ╙╘┴ $─├0─ ; ─ISABLE TIMER INTERRUPTS
- ╠─┴ #<╔╥╤ ; ╧UR OWN INTERRUPT HANDLER
- ╙╘┴ $0314
- ╠─┴ #>╔╥╤
- ╙╘┴ $0315
- ╠─╪ #$3┼ ; ╫E CREATE A SPRITE TO CASSETTE BUFFER
- ╠╧╧╨ ╠─┴ ╙╨╥╔╘┼,╪
- ╙╘┴ $0340,╪
- ─┼╪
- ┬╨╠ ╠╧╧╨
- ╠─╪ #7
- ╠╧╧╨2 ╠─┴ #$─ ; ╙ET THE SPRITE IMAGE POINTERS
- ╙╘┴ $07╞8,╪
- ╠─┴ #╙╨╥├╧╠ ; ╙ET SPRITE COLORS
- ╙╘┴ $─027,╪
- ─┼╪
- ┬╨╠ ╠╧╧╨2
- ╠─╪ #$26
- ╠╧╧╨3 ╠─┴ ╓╔─┼╧,╪ ; ╔NIT ╓╔├
- ╙╘┴ $─000,╪
- ─┼╪
- ┬╨╠ ╠╧╧╨3
- ╠─╪ #$7╞ ; ├REATE THE Y-SCROLL TABLE
- ╠╧╧╨4 ╘╪┴ ; AND CLEAR THE COLOR TABLE
- ┴╬─ #$07
- ╧╥┴ #$10 ; ╬ON-BLANK SCREEN
- ╙╘┴ ┘╙├╥╧╠╠,╪
- ╠─┴ #$00
- ╙╘┴ ├╧╠╧╥╙,╪
- ─┼╪
- ┬╨╠ ╠╧╧╨4
- ╙╘┴ $3╞╞╞
- ╠─╪ #23 ; ├REATE A COLOR TABLE
- ╠╧╧╨5 ╠─┴ ┬┴├╦,╪
- ╙╘┴ ├╧╠╧╥╙+8,╪
- ╙╘┴ ├╧╠╧╥╙+32,╪
- ╙╘┴ ├╧╠╧╥╙+56,╪
- ╙╘┴ ├╧╠╧╥╙+80,╪
- ╙╘┴ ├╧╠╧╥╙+96,╪
- ─┼╪
- ┬╨╠ ╠╧╧╨5
- ╩╙╥ ├╚┴╬╟┼ ; ╔NIT SPRITE SIZES AND Y-POSITIONS
- ├╠╔ ; ┼NABLE INTERRUPTS
- ╥╘╙
-
- ╔╥╤ ╠─╪ #$01
- ╠─┘ #$08 ; 'NORMAL' $─016
- ╬╧╨ ; ╘IMING
- ╬╧╨
- ╬╧╨
- ┬╔╘ $┼┴ ; (┴DD ╬╧╨'S ETC. FOR ╬╘╙├)
- ╠╧╧╨6 ╠─┴ ┘╙├╥╧╠╠-1,╪ ; ═OVE THE SCREEN (BAD LINES) 5
- ╙╘┴ $─011 4
- ╠─┴ ├╧╠╧╥╙,╪ ; ╠OAD THE BACKGROUND COLOR 4
- ─┼├ $─016 ; ╧PEN THE BORDER 6
- ╙╘┴ $─021 ; ╙ET THE BACKGROUND COLOR 4
- ╙╘┘ $─016 ; ╙CREEN TO NORMAL 4
- ╠─┴ ╙╘╥┼╘├╚,╪ ; ╙TRETCH THE SPRITES 4
- ╙╘┴ $─017 4
- ┼╧╥ #$╞╞ 2
- ╙╘┴ $─017 4
- ; (┴DD ╬╧╨ FOR ╬╘╙├ +2)
- ╔╬╪ ; ╔NCREASE COUNTER 2
- ┬╨╠ ╠╧╧╨6 ; ╠OOP 127 TIMES + 3
- ---
- ╠─┴ #1 ; ┴CK THE RASTER INTERRUPT =46
- ╙╘┴ $─019 +17(SPRITES)
- ---
- ╩╙╥ ─╧╙╘╥┼╘├╚ ; ╬EW STRETCH =63(WHOLE)
-
- ╩═╨ $┼┴31
-
- ╙╨╥╔╘┼ ┬┘╘ 0,0,0,3,$╞┬,0,7,$7┼ ; ┴N ┼XAMPLE SPRITE
- ┬┘╘ 0,$35,$─╞,0,$1─,$77,0,$┬7
- ┬┘╘ $5─,0,$┬─,$83,$7┼,$┼╞,1,$─┼
- ┬┘╘ $┬┬,1,$78,$┴┼,3,$70,$┼┬,0
- ┬┘╘ 0,$┬┴,3,$60,$┼┼,3,$─8,$╞┬
- ┬┘╘ 2,$╞6,$╞┼,$83,$┬─,$9╞,$┬┴,0
- ┬┘╘ $37,$┼┼,0,$3─,$╞┬,0,7,$7┼
- ┬┘╘ 0,3,$─╞,0,0,0,0
-
- ╓╔─┼╧ ┬┘╘ $┼8,┘╨╧╙,$20,┘╨╧╙,$50,┘╨╧╙,$80,┘╨╧╙,$┬0,┘╨╧╙
- ┬┘╘ $┼0,┘╨╧╙,$10.┘╨╧╙,$40,┘╨╧╙,$├1,$18,┘╨╧╙-1,0,0
- ┬┘╘ $╞╞,8,$╞╞,$15,1,1,$╞╞,$╞╞,$╞╞,0,0,0,0,0,0,0,1,10
- ; ╔NIT VALUES FOR ╓╔├ - SPRITES, INTERRUPTS, COLORS
-
- ┬┴├╦ ┬┘╘ 0,$┬,$├,$╞,1,$╞,$├,$┬ ; ┼XAMPLE COLOR BARS
- ┬┘╘ 0,6,$┼,$─,1,$─,$┼,6
- ┬┘╘ 0,9,2,$┴,1,$┴,2,9
-
- ─╧╙╘╥┼╘├╚
- ╠─╪ #31 ; ├LEAR THE TABLE
- ╠─┴ #0 ; (╒NROLLING WILL HELP THE SPEED,
- ╠╧╧╨7 ╙╘┴ ╙╘╥┼╘├╚,╪ ; BECAUSE ╙╘┴ NNNN,╪ IS 5 CYCLES
- ╙╘┴ ╙╘╥┼╘├╚+32,╪ ; AND ╙╘┴ NNNX IS ONLY 4 CYCLES.)
- ╙╘┴ ╙╘╥┼╘├╚+64,╪
- ╙╘┴ ╙╘╥┼╘├╚+96,╪
- ─┼╪
- ┬╨╠ ╠╧╧╨7
- ╙╘┴ ╥┼═┴╔╬─+1 ; ├LEAR THE REMAINDER
- ╠─┴ #7
- ╙╘┴ ├╧╒╬╘┼╥+1 ; ╔NIT COUNTER FOR 8 LOOPS
- ╠─┴ #$80
- ╙╘┴ ═┴╙╦+1 ; ╞IRST SPRITE 7, MASK IS $80
- ├╧╒╬╘┼╥ ╠─╪ #$00 ; ╘HE ARGUMENT IS THE COUNTER
- ╠─┘ ┘├╧╧╥─,╪ ; Y-POSITION
- ╠─┴ ╚┼╔╟╚╘,╪ ; ╚EIGHT OF ONE LINE (5 BIT INTEGER PART)
- ╙╘┴ ┴──+1
- ╠─╪ #20 ; ╚ANDLE 20 LINES
- ╠╧╧╨8 ╠─┴ ╙╘╥┼╘├╚+2,┘
- ═┴╙╦ ╧╥┴ #$00
- ╙╘┴ ╙╘╥┼╘├╚+2,┘ ; ╙ET A ONE-BIT
- ╙╘┘ ┘┴──+1
- ╥┼═┴╔╬─ ╠─┴ #0
- ┴╬─ #7 ; ╨REVIOUS REMAINDER
- ┴── ┴─├ #0 ; ADD TO THE HEIGHT
- ╙╘┴ ╥┼═┴╔╬─+1 ; ╙AVE THE NEW VALUE
- ╠╙╥
- ╠╙╥
- ╠╙╥
- ├╠├ ; ╘AKE THE INTEGER PART
- ┘┴── ┴─├ #0
- ╘┴┘ ; ╬EW VALUE TO Y-REGISTER
- ─┼╪
- ┬╬┼ ╠╧╧╨8
- ╠╙╥ ═┴╙╦+1 ; ╒SE NEW MASK
- ─┼├ ├╧╒╬╘┼╥+1 ; ╬EXT SPRITE
- ┬╨╠ ├╧╒╬╘┼╥
-
- ├╚┴╬╟┼ ╠─┴ #$00
- ┴╙╠ ; ╙PRITE HEIGHT CHANGES WITH 2X SPEED
- ┴╬─ #$3╞
- ╘┴┘ ; 64 BYTES LONG TABLE
- ╔╬├ ├╚┴╬╟┼+1 ; ╔NCREASE THE COUNTER
- ╠─╪ #7 ; ─O EIGHT SPRITES
- ╠╧╧╨9 ╠─┴ ╙╔╬╒╙,┘
- ╠╙╥
- ╠╙╥
- ├╠├ ; ╒SE THE SAME SINUS AS Y-DATA
- ┴─├ #8
- ╙╘┴ ╚┼╔╟╚╘,╪ ; ╙PRITE HEIGHT WILL BE FROM 1 TO 3 LINES
- ╘┘┴
- ┴─├ #10 ; ╬EXT SPRITE ENLARGEMENT WILL BE 10 ENTRIES
- ┴╬─ #$3╞ ; FROM THIS
- ╘┴┘
- ─┼╪
- ┬╨╠ ╠╧╧╨9
- ╠─╪ #7
- ╠─┴ ├╚┴╬╟┼+1
- ┴╬─ #$3╞
- ╘┴┘
- ╠╧╧╨10 ╠─┴ ╙╔╬╒╙,┘ ; ┘-POSITION
- ╙╘┴ ┘├╧╧╥─,╪
- ╘┘┴
- ┴─├ #10 ; ╬EXT SPRITE POSITION IS 10 ENTRIES FROM THIS ONE
- ┴╬─ #$3╞
- ╘┴┘
- ─┼╪
- ┬╨╠ ╠╧╧╨10
- ╥╘╙
-
- ╙╔╬╒╙ ┬┘╘ $20,$23,$26,$29,$2├,$2╞,$31,$34 ; ┴ PART OF A SINUS TABLE
- ┬┘╘ $36,$38,$3┴,$3├,$3─,$3┼,$3╞,$3╞
- ┬┘╘ $3╞,$3╞,$3╞,$3┼,$3─,$3├,$3┴,$38
- ┬┘╘ $36,$34,$31,$2╞,$2├,$29,$26,$23
- ┬┘╘ $20,$1├,$19,$16,$13,$10,$┼,$┬
- ┬┘╘ 9,7,5,3,2,1,0,0,0,0,0,1,2,3,5,7
- ┬┘╘ 9,$┬,$┼,$10,$13,$16,$19,$1├
-
- --------------------------------------------------------------------------
- ╙TRETCHING SPRITES DEMO PROGRAM BASIC LOADER (╨┴╠)
-
- 1 ╙=49152
- 2 ─┼╞╞╬╚(├)=├-48+7*(├>64)
- 3 ├╚=0:╥┼┴─┴$,┴:╨╥╔╬╘┴$:╔╞┴$="┼╬─"╘╚┼╬╨╥╔╬╘"<CLR>":╙┘╙49152:┼╬─
- 4 ╞╧╥╞=0╘╧31:╤=╞╬╚(┴╙├(═╔─$(┴$,╞*2+1)))*16+╞╬╚(┴╙├(═╔─$(┴$,╞*2+2)))
- 5 ├╚=├╚+╤:╨╧╦┼╙,╤:╙=╙+1:╬┼╪╘:╔╞├╚=┴╘╚┼╬3
- 6 ╨╥╔╬╘"├╚┼├╦╙╒═ ┼╥╥╧╥":┼╬─
- 100 ─┴╘┴ 78┴9648─1403┴9├08─1503┴23┼┬─96├09─4003├┴10╞7┴207┴90─9─╞807┴9029─, 3614
- 101 ─┴╘┴ 27─0├┴10╞3┴226┬──5├09─00─0├┴10╞7┴27╞8┼0──├8┴290709109─00├╞┴9009─, 3897
- 102 ─┴╘┴ 80├┼├┴10╞08─╞╞3╞┴217┬─╞├├09─88├┼9─┴0├┼9─┬8├┼9──0├┼9─┼0├┼├┴10┼┬20, 5281
- 103 ─┴╘┴ 67├15860┴201┴008┼┴┼┴┼┴24┼┴┬─╞╞├┼8─11─0┬─80├┼├┼16─08─21─08├16─0┬─, 4699
- 104 ─┴╘┴ 80├╞8─17─049╞╞8─17─0┼810┼0┼┼19─02014├14├31┼┴00000003╞┬00077┼0035, 3394
- 105 ─┴╘┴ ─╞001─7700┬75─00┬─837┼┼╞01─┼┬┬0178┴┼0370┼┬0000┬┴0360┼┼03─8╞┬02╞6, 3628
- 106 ─┴╘┴ ╞┼83┬─9╞┬┴0037┼┼003─╞┬00077┼0003─╞00000000┼834203450348034┬034┼0, 3015
- 107 ─┴╘┴ 3410344034├118330000╞╞08╞╞150101╞╞╞╞╞╞00000000000000010┴000┬0├0╞, 1859
- 108 ─┴╘┴ 010╞0├0┬00060┼0─010─0┼060009020┴010┴0209┴21╞┴9009─80├╞9─┴0├╞9─├0, 1876
- 109 ─┴╘┴ ├╞9─┼0├╞├┴10╞18─4─├1┴9078─35├1┴9808─45├1┴200┬├8003┬─88038─51├1┴2, 4314
- 110 ─┴╘┴ 14┬982├╞09009982├╞8├5┴├1┴900290769008─4─├14┴4┴4┴186900┴8├┴─0┼24┼, 3430
- 111 ─┴╘┴ 45├1├┼35├110├─┴9000┴293╞┴8┼┼68├1┴207┬99┼├14┴4┴1869089─880398690┴, 3474
- 112 ─┴╘┴ 293╞┴8├┴10┼├┴207┴─68├1293╞┴8┬99┼├19─800398690┴293╞┴8├┴10╞1602023, 3622
- 113 ─┴╘┴ 26292├2╞313436383┴3├3─3┼3╞3╞3╞3╞3╞3┼3─3├3┴383634312╞2├292623201├, 1654
- 114 ─┴╘┴ 191613100┼0┬09070503020100000000000102030507090┬0┼101316191├0000, 296
- 200 ─┴╘┴ ┼╬─,0
-
- --------------------------------------------------------------------------
- ╒UENCODED ├64 EXUTABLE FOR STRETCHING SPRITES (╨┴╠)
-
- BEGIN 644 STRETCH.64
- ═`0@-"`$`4[(╘.3$╒,@`╞"`(`┼╩5(*$,╔╠─.╦-#┬╩-┌╨╚0[$╓-"─`40@#`$-(?
- ═╠├`┌┴╘$─+$$┌╞4$─.╚═!)+(┬14┘$(╩>9(╔,┬.╔╪╘.3$╒,├╩``(@(!`"!1╦(╨/
- ═╔#,╤.┼&╥╔4@╚╤┬├**$$─+$:╠,╩╚╤*2─╔╦#$╓╩╩5(*,8╚╥┬┴!)"╤&╦#*╩,┬─╔:
- ═*0"╔"`4`0╘┬╥0╘┬╩43╩74╥╤1.┼.╥4┌╚╤.╚(┌┬╘-(╠─&╟,╨#!"`8`╞2)#2$5#╞
- ═2╒-532!%4┼)/4┬(┌@``."60`@╥`╫.$$┘-├0╪1#$╘,#-!.4,╨.$0╤-3`╙03(╙3
- ═14)$.39#,#┼$-#`╨,╘-!,3!&-╘$╥,#=!.3!$.41&.#`╫03─╨,├┼$+"`╙-├$╘╨
- ═`%╠)90"#(#(╫1#!#03$╨1├-!,├(╓0─1$-4,╨.40╨,$0╨0╘$╤,$8╫03(╫1├┴%4
- ═,$1$0╙┴!,├─╨-╙`┘,3`┘1#`╨0╘9!.3`╨.40╠(#,╪.3<`╩`┼╞`(,@.#!#14-!┬
- ═,3!&,#┴$1─8╙1─$╥,3="1$9#0╙`┘1#@╪0╘4┘1$$╨0╘4┘1$(╪0╘4┘1$0╨0╘4┘1
- ═1$4╨0╘5#03$╨14(╥,"╨@-3(╪,0#╒"6<`@╥`╓-╘,╤-3@╓,$$╥,#%!,#`╪14%%?
- ═045!,├1%04)$1─9#13┴$,3%$,$)$.#!#14-%,39$,#┴$,├%$,#┴#,39$,$)$╟
- ═+"`╘-├─┘`$(*:`"#(#@╨0╘8╪1#$╫1#`╘.49&.$0╤-╘0╨13@╤,$4╨144╤.40╨4
- ═,├`╤-$,╤-$,╙,45!,#`╨,#`╨,#-&0├`╨,#<╫13`╨,╙4╠(#,╙.30`├╨╔╔`(,@╓
- ═1$8╨,#%$-╙<╨,$(╫-40╨,$)$.#,╫145&,#%$14)",#$╫.$%%,#,╫,$5",#`╨<
- ═,$)!,#,╓,$5%,#-$.$9",#)&-┬╨@,╙8╥.`#<"╞╚`@╥!&13@╙0─0┘1─)!,#`╙╬
- ═-╘5%,#`╙1$9",#`╨-╙=%,#`╨,╘1&,#`╨,#`╨,#!%.#,╘,├`╙-#4╨,╙0╪,#,╘╪
- ═0├`╙-$4╨+"`╙,#$╒`"─+:╨"#(#,╘,3`╙-#0╨,╙1#,3$╪,╙,╨,#`╨1─8╨.$9&┬
- ═,34╨,3`╤1─9&1─9&,#`╨,#`╨,#`╨,#`╨,#`╨,3!!,#`╨0├!#,$8╠(#$╪-3─`<
- ═=@═╠`(,@,#$╨1├!#,$(╨,#`╓,$4╨1#`╤,$0╨13`╓,#`╨.3`╥,$$╨,3!!,#(╨╦
- ═.4$╥,49!.3`╨.40╪,$-&.41!,$-&.41#,"╨@,3@╫-@##"╓╘`@╥!#1├┼$13!#0
- ═1─-!,3!&,3┴$-$1#,4$┘,#<╪1#,╒0╙%!.3@╨.$0╘-4,╤03(╨,$)#.#`╨,╘)$╟
- ═.#@╨,╙┴$-3%#,4$╥+"`╘,╙$╘`!`,;@"#(#$╘0├─╪,─-&,#─╨,#─┘.#)#1├┴#=
- ═-4%#,4$┘,#`╥.3`╫-├─╨,#┴$-$1#,31!-$$╘03$╪-├─╨,$$╪0╘%$,$4╥-$4╠╤
- ═(#,╘,╙``70╤╧`(,@-#5#,4-%,╙5#,3$╨0╘1!.3`╨,$$╥.3-&03┴%138╪0╙%!├
- ═,├`╫0├─┘14,╤-$$╘03$╪-├─╨.#┼$.#@╨,╙─╪-├─╨02╨@,╙0╫-`"╩#'``@╥`╥╩
- ═.3-&03┴#03$╨14-!,├`╫040╓.$,╤,├─╙1─$╪0├─┘14,╤.40╪,#`╙.3@╓.3!!\
- ═,├─╙1─$╪0╘$╤,$8╤-├`╥,#(╙+"`╙-├(╥`/<,<0"#(#(╓,├─╥0╙)&,╙$╙-#,╓*
- ═,╙@╙03-#,╘0╙13-&,╘8╙1├-&,╘8╙13-$,╘,╙03,╪,╙8╙-#,╤,─8╥0╙(┘,├8╥+
- ═,╙(╨,4,╠(#$╓-30`0╨╒╥`(,@,3─╤-├$╙,3`╨13!",#─╨-╙`╒,#,╨,├`╤,#`╨╥
- ═,#`╨,#`╨,#`╤,#(╨,╙`╒,#<╨.3!",$4╤,#$╙,38╤.3%#,#`╨,"╨@,├─╓`$\-┼
- ,╥`"#($5.1"╨╨````>
- ``
- END
- SIZE 1362
-
- =============================================================================
- ╥OB ╚UBBARD'S ═USIC: ─ISASSEMBLED, ├OMMENTED AND ┼XPLAINED
- BY ┴NTHONY ═C╙WEENEY (U882859@POSTOFFICE.UTAS.EDU.AU)
-
- [┼D'S ╬OTE: ╔ QUESTIONED THIS ARTICLE CONCERNING COPYRIGHT PROBLEMS AND HE
- HAS ASSURED ME THAT IT IS LEGAL TO PRESENT IT IN ENTIRITY LIKE THIS AS IT IS
- PAST A CERTAIN # OF YEARS. ┴CCORDINGLY ╔'M PRESENTING IT AND ANY CONCERNS
- SHOULD BE TAKEN UP WITH HIM AND NOT MYSELF.]
-
- ╔NTRODUCTION:
- ************
-
- ╚OW DO YOU INTRODUCE SOMEONE LIKE ╥OB ╚UBBARD?? ╚E CAME, HE SAW AND HE
- CONQUERED THE '64 WORLD. ╔N MY ESTIMATION, THIS ONE MAN WAS RESPOSIBLE FOR
- SELLING MORE '64 SOFTWARE THAN ANY OTHER SINGLE PERSON. ╚ELL! ╔ THINK THAT ╥OB
- ╚UBBARD WAS RESPONSIBLE FOR SELLING MORE ├╧══╧─╧╥┼ 64'S THAN ANY OTHER PERSON!
- ╔ CERTAINLY BOUGHT MY '64 AFTER BEING BLOWN AWAY BY THE ═ONTY ON THE ╥UN MUSIC
- IN ─ECEMBER 1985. ╔N THE NEXT FEW YEARS, ╥OB WOULD TOTALLY DOMINATE THE '64
- MUSIC SCENE, RELEASING ONE HIT AFTER ANOTHER. ╔ WILL EVEN SAY THAT SOME REALLY
- TERRIBLE GAMES SOLD WELL ONLY ON THE STRENGTH OF THEIR BRILLIANT ╥OB ╚UBBARD
- MUSIC (EG. ╦NUCKLE┬USTERS AND ╫.┴.╥.).
-
- ╙O HOW DID ╥OB ACHIEVE THIS SUCCESS? ╞IRSTLY (OF COURSE) HE IS A SUPERB
- COMPOSER AND MUSICIAN, ABLE TO MAKE THE TUNES THAT BRING JOY TO OUR HEARTS
- EVERYTIME WE HEAR THEM! (ALSO CONSIDER THE AMAZING DIVERSITY OF STYLES OF
- MUSIC THAT ╥OB COMPOSED). ╙ECONDLY, HE WAS ABLE TO MAKE MUSIC WHICH WAS SUITED
- TO THE STRENGTHS AND LIMITATIONS OF THE ╙╔─ CHIP. ╩UST RECALL THE SOUNDFX USED
- AT THE BEGINNING OF ╘HRUST, OR IN THE ─ELTA IN-GAME MUSIC. ╨ERHAPS THE BIGGEST
- LIMITATION OF ╙╔─ MUST BE THE MEAGRE 3 CHANNELS THAT CAN BE USED, BUT MOST
- ╚UBBARD SONGS APPEAR TO HAVE FOUR, FIVE OR EVEN MORE INSTRUMENTS GOING (JUST
- LISTEN TO THE BEGINNING OF ╨HANTOMS OF THE ┴STERIODS FOR EXAMPLE... THAT'S
- ONLY ONE CHANNEL USED!!). ╔ COULD REALLY GO ON FOR (P)AGES IDENTIFYING THE
- OUTSTANDING THINGS THAT ╥OB ╚UBBARD DID, SO ╔ WILL FINALLY MENTION THAT ╥OB'S
- CODING SKILLS AND HIS MUSIC ROUTINES WERE A MAJOR FACTOR IN HIS SUCCESS.
-
-
- ╘HE ╞IRST ╥OB ╚UBBARD ╥OUTINE:
- *****************************
-
- ╥OB ╚UBBARD CREATED A SUPERB MUSIC ROUTINE FROM THE VERY FIRST TUNE WHICH
- WAS RELEASED (├ONFUZION). ╞URTHERMORE, ╥OB USED THIS ROUTINE TO MAKE MUSIC
- FOR A VERY LONG TIME, ONLY CHANGING IT _SLIGHTLY_ OVER TIME. ╘HE SOURCECODE
- THAT ╔ PRESENT HERE WAS USED (WITH SLIGHT MODIFICATIONS) IN: ├ONFUZION, ╘HING
- ON A ╙PRING, ═ONTY ON THE ╥UN, ┴CTION ┬IKER, ├RAZY ├OMETS, ├OMMANDO, ╚UNTER
- ╨ATROL, ├HRIMERA, ╘HE ╠AST ╓8, ┬ATTLE OF ┬RITAIN, ╚UMAN ╥ACE, ┌OIDS, ╥ASPUTIN,
- ═ASTER OF ═AGIC, ╧NE ═AN & ╚IS ─ROID, ╟AME ╦ILLER, ╟ERRY THE ╟ERM, ╟EOFF ├APES
- ╙TRONGMAN ├HALLENGE, ╨HANTOMS OF THE ┴STEROIDS, ╦ENTILLA, ╘HRUST,
- ╔NTERNATIONAL ╦ARATE, ╙PELLBOUND, ┬UMP ╙ET AND ╙PIKE, ╞ORMULA 1 ╙IMULATOR,
- ╓IDEO ╨OKER, ╫ARHAWK OR ╨ROTEUS AND MANY, MANY MORE! ┴LL YOU WOULD NEED TO DO
- TO PLAY A DIFFERENT MUSIC IS TO CHANGE THE MUSIC DATA AT THE BOTTOM, AND A FEW
- LINES OF THE CODE.
-
- ╘HIS PARTICULAR ROUTINE HAS BEEN RIPPED OFF BY MANY FAMOUS GROUPS AND
- PEOPLE OVER THE YEARS, BUT ╔ DON'T THINK THAT THEY WERE EVER GENEROUS ENOUGH
- TO SHARE IT AROUND. ├AN YOU REMEMBER ╘HE ╩UDGES AND ╥ED ╙OFTWARE?? ╘HEY MADE
- THE FAMOUS ╥ED-╚UBBARD DEMO, AND USED IT IN ╥HAA-╠OVELY AND MANY OF THEIR
- OTHER PRODUCTIONS. ╔'M SURE THAT THE (┴TARI) ╙╘ FREAKS READING THIS WILL LOVE
- ═AD ═AX (AKA ╩OCHEN ╚IPPEL), AND REMEMBER THE ┬╔╟ DEMO WHICH FEATURED APPROX
- 100 ╥OB ╚UBBARD TUNES CONVERTED TO THE ╙╘. ┴LTHOUGH ╔ HATE TO ADMIT IT, ╔
- DECIDED TO START SHARING AROUND MY OWN SOURCECODE AFTER RECEIVING THE AMAZING
- ╨ROTRACKER SOURCECODE (340╦!) ON THE ┴MIGA (THANKS ╠ARS ╚AMRE). ╘HAT MADE ME
- SHAMEFUL TO BE SELFISH, ESPECIALLY AFTER ╔ LEARNED ALOT OF FROM IT. ╫HY DON'T
- ┘╧╒ SHARE AROUND YOUR OLD SOURCECODES TOO!
-
- ╘HE PARTICULAR ROUTINE THAT IS INCLUDED BELOW WAS RIPPED FROM ═ONTY ON THE
- ╥UN, AND IT APPEARED IN MEMORY FROM $8000 TO ABOUT $9554. ╘HE COMPLETE
- ROUTINE HAD CODE FOR SOUNDFX IN IT, WHICH ╔ HAVE TAKEN OUT FOR THE SAKE OF
- CLARITY. ┴LTHOUGH THE ROUTINE IS REALLY TINY - A MERE 900 OR 1000 BYTES OF
- CODE, THERE ARE SOME AMAZINGLY COMPLEX CONCEPTS IN IT WHICH REQUIRE ALOT OF
- EXPLANATION IF YOU DON'T KNOW MUCH ABOUT COMPUTER MUSIC OR ╙╔─. ╞ORTUNATELY
- FOR YOU, ╔ HAVE PUT IN EXCELLENT LABEL NAMES FOR YOU, AND ALSO ALOT OF REALLY
- HELPFUL AND AMAZING COMMENTS. ╔N FACT, ╔ THINK THIS SOURCECODE MUST HAVE A
- MUCH BETTER STRUCTURE AND COMMENTS THAN ╥OB ╚UBBARD'S ORIGINAL!!! ╔ THINK THAT
- THE BEST WAY TO UNDERSTAND THE SOURCECODE IS TO STUDY IT, AND FIGURE OUT WHAT
- IS GOING ON USING THE COMMENTS.
-
- ╔N ADDITION TO THE COMMENTS IN THE SOURCE, THERE ARE *3* DESCRIPTIONS OF
- THE ROUTINE IN THIS ARTICLE. ╘HE FIRST TELLS YOU HOW TO USE THE MUSIC ROUTINE
- WHEN IT'S VIEWED AS AN ALREADY ASSEMBLED 'MODULE'. ╘HE SECOND GOES THROUGH AN
- OVERVIEW OF THE MUSIC AND INSTRUMENT DATA FORMAT, AND IS GREAT FOR GETTING AN
- OVERALL FEEL FOR WHAT THE CODE IS DOING. ╘HE THIRD DESCRIPTION LOOKS AT THE
- VARIOUS SECTIONS OF THE CODE, AND HOW THEY COME TOGETHER.
-
-
- ╚OW TO USE THE SOURCECODE:
- *************************
-
- JSR MUSIC+0 TO INITIALIZE THE MUSIC NUMBER IN THE ACCUMULATOR
- JSR MUSIC+3 TO PLAY THE MUSIC
- JSR MUSIC+6 TO STOP THE MUSIC AND QUIETEN ╙╔─
-
- ╘HE MUSIC IS SUPPOSED TO RUN AT 50╚Z, OR 50 TIMES PER SECOND. ╘HEREFORE
- ╨┴╠ USERS CAN RUN THE MUSIC ROUTINE OFF THE ╔╥╤ LIKE THIS:
-
- LDA #$00 ; INIT MUSIC NUMBER 0
- JSR MUSIC+0
- SEI ; INSTALL THE IRQ AND A RASTER COMPARE
- LDA #<IRQ
- LDX #>IRQ
- STA $314
- STX $315
- LDA #$1B
- STA $D011
- LDA #$01
- STA $D01A
- LDA #$7F
- STA $DC0D
- CLI
- LOOP =*
- JMP LOOP ; ENDLESS LOOP (MUSIC IS NOW PLAYING OFF INTERRUPT :-)
-
- IRQ =*
- LDA #$01
- STA $D019
- LDA #$3C
- STA $D012
-
- INC $D020 ; PLAY MUSIC, AND SHOW A RASTER FOR THE TIME IT TAKES
- JSR MUSIC+3
- DEC $D020
-
- LDA #$14
- STA $D018
- JMP $EA31
-
- ╔F THIS METHOD IS USED ON ╬╘╙├ MACHINES, THEN THE MUSIC WILL BE RUNNING AT
- 60╚Z AND WILL SOUND MUCH TO FAST - POSSIBLY IT MIGHT SOUND TERRIBLE. ╔'M
- AFRAID YOU'LL HAVE TO PUT UP WITH THIS UNLESS ┘╧╒ ARE GOOD ENOUGH TO MAKE A
- ├╔┴ INTERRUPT AT 50╚Z. ┴S ╔ HAVN'T HAD TO WORRY ABOUT ╬╘╙├ USERS BEFORE,
- PERHAPS SOMEONE WILL SEND ME THE BEST WAY TO DO THIS...
-
- [┼D. ╬OTE: ┘OU COULD ALSO KEEP A COUNTER FOR THE ╔╥╤ AND DON'T EXECUTE IT
- EVERY 6 INTERRUPT. ╘HIS WILL MAKE IT THE RIGHT SPEED ALTHOUGH THE BEST
- SOLUTION IS FOR MODIFYING THE ├╔┴ TO 50╚Z LIKE HE MENTIONS ABOVE.]
-
- ╚OW THE MUSIC DATA IS ARRANGED:
- ******************************
-
- 1. ╘HE MUSIC 'MODULE' CONTAINS ONE OR MORE SONGS.
-
- ┼ACH ╥╚ MUSIC IS MADE UP OF A 'BUNCH' OF SONGS IN A SINGLE MODULE. ╘HUS
- THE 'MODULE' CAN HAVE THE TITLE MUSIC, IN-GAME MUSIC, AND THE GAME-OVER MUSIC
- ALL USING THE SAME PLAYROUTINE (AND EVEN THE SAME INSTRUMENTS :). ╘HE SOURCE
- THAT APPEARS BELOW ONLY HAS THE ONE SONG IN IT, AND THE MUSIC NUMBER IS
- AUTOMATICALLY SET TO 0 AS A RESULT (LINE 20). ╘HE LABEL 'SONGS' IS WHERE YOU
- WANT TO LOOK FOR THE POINTERS TO THE SONGS IF YOU WANT TO CHANGE THIS.
-
- 2. ┼ACH SONG IS MADE UP OF THREE TRACKS.
-
- ╫E ALL KNOW THAT THERE ARE ONLY 3 CHANNELS ON THE ╙╔─ CHIP, SO THERE ARE
- ALSO 3 TRACKS - ONE FOR EACH CHANNEL. ╫HEN ╔ SAID 'POINTERS TO THE SONGS'
- ABOVE, ╔ WAS THEREFORE REFERRING TO 'POINTERS TO THE THREE TRACKS THAT MAKE UP
- THE SONG'...HENCE WE ARE LOOKING AT THE LABEL 'SONGS' AGAIN. ┼ACH TRACK NEEDS
- A HIGH AND LOW POINTER, SO THERE ARE 6 BYTES NEEDED TO POINT TO A SONG.
-
- 3. ┼ACH TRACK IS MADE UP OF A LIST OF PATTERN NUMBERS
-
- ┼ACH TRACK CONSISTS OF A LIST OF THE PATTERN NUMBERS IN THE ORDER IN WHICH
- THEY ARE TO BE PLAYED. ╚ERE WE ARE LOOKING AT THE LABELS 'MONTYMAINTR1' AND
- 'MONTYMAINTR2'AND 'MONTYMAINTR3'. ╘HEREFORE ╔ CAN TELL YOU THAT THE INITIAL
- PATTERNS PLAYED IN THIS SONG ARE $11, $12 AND $13 ON CHANNELS 1,2 AND 3
- RESPECTIVELY. ╘HE TRACK IS EITHER ENDED WITH A $FF OR $FE BYTE. ┴ $FF MEANS
- THAT THE SONG NEEDS TO BE LOOPED WHEN THE END OF THE TRACK IS REACHED (LIKE
- THE MONTY MAIN TUNE), WHILE A $FE MEANS THAT THE SONG IS ONLY TO BE PLAYED
- ONCE. ╘HE CURRENT OFFSET INTO THE TRACK IS OFTEN CALLED THE CURRENT ╨╧╙╔╘╔╧╬
- FOR THAT TRACK.
-
- 4. ┴ PATTERN CONSISTS OF A SEQUENCE OF NOTES.
-
- ┴ PATTERN CONTAINS THE DATA THAT SAYS WHEN THE NOTES SHOULD BE PLAYED, HOW
- LONG THEY SHOULD BE PLAYED FOR, AT WHAT PITCH, WITH WHAT INSTRUMENT, SHOULD
- THERE BE ┴─╙╥, SHOULD THERE BE BENDING (PORTAMENTO) OF THE NOTES ETC. ┼ACH
- PATTERN IS ENDED WITH A $FF BYTE, AND WHEN THIS IS ENCOUNTERED, THE NEXT
- PATTERN IN THE TRACK WILL BE PLAYED. ┼ACH NOTE HAS UP TO A 4 BYTE
- SPECIFICATION.
-
- - ╘HE FIRST BYTE IS ALWAYS THE LENGTH OF THE NOTE FROM 0-31 OR 0-$1F IN HEX.
- ┘OU WILL NOTICE THAT THE TOP THREE BITS ARE NOT USED FOR THE LENGTH OF THE
- NOTE, SO THEY ARE USED FOR OTHER THINGS.
- - ┬IT#5 SIGNALS NO RELEASE NEEDED. - ┬IT#6 SIGNALS THAT THIS NOTE IS
- APPENDED TO THE LAST ONE (NO ATTACK/ETC). - ┬IT#7 SIGNALS THAT A NEW
- INSTRUMENT OR PORTAMENTO IS COMING UP.
-
- - ╘HE SECOND BYTE IS AN OPTIONAL BYTE, AND IT HOLDS THE INSTUMENT NUMBER TO
- USE OR THE PORTAMENTO VALUE (IE A BENDED NOTE). ╘HIS BYTE WILL BE NEEDED
- ACCORDING TO WHETHER BIT#7 OF THE FIRST BYTE IS SET OR NOT...IE IF THE 1ST
- BYTE WAS NEGATIVE, THEN THIS BYTE IS NEEDED.
- - ╔F THE SECOND BYTE IS POSITIVE, THEN THIS IS THE NEW INSTRUMENT NUMBER.
- - ╔F THE SECOND BYTE IS NEGATIVE, THEN THIS IS A BENDED NOTE (PORTAMENTO).
- AND THE VALUE IS THE SPEED OF THE PORTAMENTO (EXCEPT FOR BITS #7 AND #0)
- ┬IT #0 OF THE PORTAMENTO BYTE DETERMINES THE DIRECTION OF THE BEND.
- - ┬IT#0 = 0 THEN PORTAMENTO IS UP.
- - ┬IT#0 = 1 THEN PORTAMENTO IS DOWN.
-
- - ╘HE THIRD BYTE OF THE SPECIFICATION IS THE PITCH OF THE NOTE. ┴ PITCH OF
- 0 IS THE LOWEST ├ POSSIBLE. ┴ PITCH OF 12 OR $├(HEX) IS THE NEXT HIGHEST
- ├ ABOVE THAT. ╘HESE PITCHES ARE DENOTED FAIRLY UNIVERSALLY AS EG. '├-1' AND
- FOR SHARPS EG. '─#3'. ╬OTICE THAT THIS ROUTINE USES PITCHES OF HIGHER THAN
- 72 ($48) WHICH IS C-6 :-)
-
- - ╘HE FOURTH BYTE IF IT EXISTS WILL DENOTE THE END OF THE PATTERN.
- IE. ╔F THE NEXT BYTE IS A $FF, THEN THIS IS THE END OF THE PATTERN.
-
- ╬╧╘┼: ╔ HAVE LABELLED THE VARIOUS BYTES WITH NUMBERS FOR CONVENIENCE. ┬EAR
- IN MIND THAT SOME OF THESE ARE OPTIONAL, SO IF THE SECOND BYTE IS NOT NEEDED,
- THEN ╔ WILL SAY THAT THE PITCH OF THE NOTE COMING UP IS THE 'THIRD BYTE',
- EVEN THOUGH IT ISN'T REALLY.
-
- ╧KAY, HERE ARE SOME EXAMPLES:
-
- EG. $84,$04,$24 MEANS THAT THE LENGTH OF THE NOTE IS 4 (FROM THE LOWER 5 BITS
- OF THE FIRST BYTE), THAT THE INSTRUMENT TO USE IS INSTRUMENT NUMBER 4
- (THE SECOND BYTE, AS INDICATED BY BIT #7 OF THE FIRST BYTE), AND THAT THE
- PITCH OF THE NOTE IS $24 OR C-3.
- EG. $─6,$98,$25,$╞╞ MEANS THAT THE LENGTH OF THE NOTE IS 22 ($16), THAT THIS
- NOTE SHOULD BE APPENDED TO THE LAST, THAT THE SECOND BYTE IS A PORTAMENTO
- (AS BOTH 1ST AND 2ND BYTES -VE!), THAT THE PORTAMENTO IS GOING UP (AS
- BIT#0 = 0) WITH A SPEED OF 24 ($18), THAT THE PITCH OF THE NOTE IS $25
- OR C#3, AND THAT THIS IS THE END OF THE PATTERN.
-
- ╔T DOESN'T GET ANY HARDER THAN THAT!! ─ID YOU REALISE THAT THIS IS EXACTLY
- THE WAY THAT ╥OB ╚UBBARD MADE THE MUSIC!! ╚E WORKED OUT SOME MUSICAL IDEAS
- ON HIS CHEAP (MUSICAL) KEYBOARD, AND TYPED THE NOTES INTO HIS ASSEMBLER IN
- HEX, JUST LIKE THIS.
-
-
- 5. ╘HE INSTRUMENTS ARE AN 8 BYTE DATA STRUCTURE.
-
- ┘OU ARE LOOKING AT THE LABEL 'INSTR' AT THE BOTTOM OF THE SOURCECODE. ╘HE
- 8 BYTES WHICH COME ALONG FIRST ARE INSTRUMENT NUMNBER 0, THE NEXT 8 DEFINE
- INSTRUMENT NUMBER 1, ETC. ╚ERE ARE THE MEANINGS OF THE BYTES, BUT ╔ SUGGEST
- THAT YOU CHECK OUT YOUR PROGRAMMING MANUALS IF YOU ARE UNFAMILIAR WITH THESE:
-
- - ┬YTE 0 IS THE PULSE WIDTH LOW BYTE, AND
- - ┬YTE 1 IS THE PULSE WIDTH HIGH BYTE. (ALSO SEE BYTE 7).
-
- - ┬YTE 2 IS THE CONTROL REGISTER BYTE.
- ╘HIS SPECIFIES WHICH TYPE OF SOUND SHOULD BE USED; SINE, SAWTOOTH ETC.
-
- - ┬YTE 3 IS THE ATTACK AND DECAY VALUES, AND
- - ┬YTE 4 IS THE SUSTAIN AND RELEASE VALUES.
- ╘HE NOTE'S VOLUME IS ALTERED ACCORDING TO THESE VALUES. ╫HEN THE ATTACK AND
- DECAY ARE OVER, THE VOLUME OF THE NOTE IS HELD AT THE SUSTAIN LEVEL. ╫HEN
- LENGTH OF A NOTE IS OVER, A RELEASE IS DONE THROUGH THE 'GATE' BIT IN ╙╔─.
-
- - ┬YTE 5 IS THE VIBRATO DEPTH FOR THE INSTRUMENT.
-
- - ┬YTE 6 IS THE PULSE SPEED.
- ╘IMBRE IS CREATED BY CHANGING THE SHAPE OF THE WAVEFORM EACH 50TH OF A
- SECOND, AND THIS IS THE MOST COMMON WAY OF ACHIEVING IT. ╘HE SHAPE OF
- THE PULSE WAVEFORM CHANGES FROM SQUARE TO A VERY RECTANGULAR AT A SPEED
- ACCORDING TO THIS BYTE.
- ╬.┬. IF YOU ARE INTERESTED IN HOW THE PULSE VALUE NUMBER WORKS, THEN
- E-MAIL ME SOMETIME, AS ╔ FOUND THIS OUT (EXHAUSTIVELY) A FEW DAYS AGO!
-
- - ┬YTE 7 IS THE INSTRUMENT FX BYTE, AND IS THE MAJOR THING WHICH CHANGES
- BETWEEN DIFFERENT MUSIC ROUTINES. ┼ACH BIT IN THIS BYTE DETERMINES WHETHER
- THIS INSTRUMENT WILL HAVE A CERTAIN EFFECT IN IT.
- - ┬IT#0 SIGNALS THAT THIS IS A DRUM. ─RUMS ARE MADE FROM A NOISE CHANNEL
- AND ALSO A FAST FREQUENCY DOWN, WITH FAST DECAY. ┬ASS DRUMS USE A SQUARE
- WAVE, AND ONLY THE FIRST 50TH OF A SECOND IS A NOISE CHANNEL. ╘HIS IS
- THE TELL-TALE INSTRUMENT THAT GIVES AWAY A ╥OB ╚UBBARD ROUTINE! ╚IHATS
- AND OTHER DRUMS USE NOISE ALL THE TIME.
- - ┬IT#1 SIGNALS A 'SKYDIVE'. ╘HIS IS A SLOWER FREQUENCY DOWN, THAT ╔ THINK
- SOUNDS LIKE SOMEBODY YELLING AS THEY FALL OUT OF A PLANE .. ┴╚╚╚╚HHHHGH..
- ..HENCE ╔ CALL IT A SKYDIVE!!
- - ┬IT#2 SIGNALS AN OCTAVE ARPEGGIO. ╔T'S A VERY LIMITED ARPEGGIO ROUTINE IN
- THIS SONG. ╠ISTEN FOR THE ARPEGGIO AND THE SKYDIVE WHEN COMBINED, WHICH
- IS USED ALOT IN ╚UBBARD SONGS.
- - ┴LL THE OTHER BITS HAVE NO MEANING IN THIS MUSIC, BUT WERE USED ALOT IN
- LATER MUSIC FOR THE FX.
-
- ┴ BIG REASON THAT ╔ PRESENTED THIS EARLY ROUTINE, WAS BECAUSE THERE WAS NOT
- TOO MUCH IN THE WAY OF SPECIAL FX TO CONFUSE YOU. ┴S A RESULT, YOU CAN
- CONCENTRATE ON THE GUTS OF THE CODE INSTEAD OF THE SPECIAL FX :-)
-
-
- ╚OW THE SOURCECODE WORKS:
- ************************
-
- ╘HE ROUTINES AT THE TOP OF THE SOURCECODE ARE CONCERNED WITH TURNING THE
- MUSIC ON AND OFF, AND YOU WILL SEE THAT THIS IS DONE THROUGH A VARIABLE CALLED
- 'MSTATUS' (OR MUSIC STATUS). ╔F MSTATUS IS SET TO $├0, THEN THE MUSIC IS
- TURNED OFF AND ╙╔─ IS QUIETENED, THEREAFTER MSTATUS IS SET TO $80 WHICH MEANS
- THAT THE MUSIC IS STILL OFF, BUT ╙╔─ DOESN'T NEED TO BE QUIETENED AGAIN. ╫HEN
- THE MUSIC IS INITIALIZED, THEN MSTATUS IS GIVEN A VALUE OF $40 WHICH KICKS IN
- THE FURTHER INITIALIZATION STUFF. ╔F MSTATUS IS ANY OTHER VALUE, THEN THE
- MUSIC IS BEING PLAYED. ╞OR ANY OF THE INITIALIZATION STUFF TO HAVE ANY MEANING
- TO YOU, YOU OFCOURSE HAVE TO UNDERSTAND THE REST OF THE PLAYROUTINE :-)
-
- ┴FTER WE HAVE GOT PAST THE ON/OFF/INIT STUFF, WE ARE AT THE LABEL CALLED
- 'CONTPLAY' AT AROUND LINE 100. ╘HE FIRST THING YOU SHOULD NOTICE IS THAT THIS
- IS THE START OF A HUGE LOOP THAT IS DONE *3* TIMES - ONCE FOR EACH CHANNEL.
- ╘HE LOOP REALLY *IS* HUGE, AS IT ENDS RIGHT ON THE LAST FEW LINES OF THE CODE
- :-)
-
- ╬OW THAT WE ARE TALKING ABOUT ROUTINES WITHIN THE LOOP, WE ARE TALKING ABOUT
- THESE ROUTINES BEING APPLIED TO THE CHANNELS INDEPENDANTLY. ╘HERE ARE 2 MAIN
- ROUTINES WITHIN THE LOOP, ONE IS CALLED ╬OTE╫ORK, AND THE OTHER IS CALLED
- ╙OUND╫ORK. ╬OTE╫ORK CHECKS TO SEE WHETHER A NEW NOTE IS NEEDED ON THIS
- CHANNEL, AND IF IT IS, THEN THE NOTEDATA IS FETCHED AND STUFF IS INITIALIZED.
- ╔F NO NOTE IS NEEDED, THEN ╙OUND╫ORK IS CALLED WHICH PROCESSES THE INSTRUMENTS
- AND DOES THE PORTAMENTO.
-
- ╬OTE╫ORK FIRST CHECKS THE SPEED AT WHICH THE NOTES ARE FETCHED. ╔F THE DELAY
- IS STILL OCCURRING, THEN NEW NOTES ARE NOT NEEDED AND SOUNDWORK IS CALLED.
- ╬.┬. THAT THE SPEED FOR ═ONTY ON THE ╥UN IS 1, WHICH MEANS THAT A NOTE OF
- LENGTH $1F WILL LAST FOR 64 CALLS TO THE ROUTINE (IE JUST OVER A SECOND). ╔F
- THE SPEED OF THE SONG IS RESET, THEN ╬OTE╫ORK DECREMENTS THE LENGTH OF THE
- CURRENT NOTE. ╫HEN THE LENGTH OF THE CURRENT NOTE HITS $FF (-1) THEN A NEW
- NOTE IS NEEDED, OTHERWISE ╙OUND╫ORK IS JUMPED TO.
-
- ╘HE DATA FOR A NEW NOTE IS COLLECTED AT THE LABEL 'GETNEWNOTE'. ╔N THE
- SIMPLEST CASE, THIS INVOLVES GETTING THE NEXT BYTES OF DATA FROM THE CURRENT
- PATTERN ON THIS CHANNEL, BUT IF THE END OF THE PATTERN IS REACHED, THEN THE
- NEXT PATTERN NUMBER IS FETCHED BY REFERENCE TO THE CURRENT POSITION WITHIN
- THIS CHANNEL'S TRACK. ╔N AN EVEN MORE COMPLEX SITUATION, THE END OF A TRACK IS
- REACHED, AND THE CURRENT POSITION NEEDS TO BE RESET TO 0 BEFORE THE NEXT
- PATTERN NUMBER CAN BE FOUND.
-
- ┘OU CAN SEE QUITE CLEARLY IN THIS PART OF THE ROUTINE WHERE THE LENGTH OF
- THE NOTE IS COLLECTED, AND IT IS DETERMINED WHETHER A 2ND BYTE IS NEEDED,
- WHERE THE PITCH IS COLLECTED, AND THE END OF THE SONG CHECKED. ┘OU CAN ALSO
- SEE WHERE SOME OF THE DATA IS COLLECTED FROM THE CURRENT INSTRUMENT AND JAMMED
- INTO THE ╙╔─ REGISTERS.
-
- ╙OUND╫ORK IS CALLED IF NO NEW NOTES ARE NEEDED, AND IT PROCESSES THE
- INSTRUMENTS AND DOES THE PORTAMENTO ETC. ╘HIS PART OF THE ROUTINE IS NEATLY
- EXPRESSED IN SECTIONS WHICH ARE REALLY WELL COMMENTED AND QUITE EASY TO
- UNDERSTAND.
-
- - ╘HE FIRST THING THAT OCCURS IN ╙OUND╫ORK IS THAT THE 'GATE BIT' OF ╙╔─ IS
- SET WHEN THE LENGTH OF THE NOTE IS OVER - THIS CAUSES A RELEASE OF THE NOTE.
-
- - ╘HE VIBRATO ROUTINE IS QUITE INEFFICIENT, BUT IT'S PRETTY GOOD FOR 1985!
- ╧FCOURSE VIBRATO IS IMPLEMENTED BY RAISING AND LOWERING THE PITCH OF THE
- NOTE EVER-SO-SLIGHTLY CAUSING THE NOTE TO 'FLOAT'. ╘HE AMOUNT OF THE
- VIBRATO IS DETERMINED IN THE CURRENT INSTRUMENT.
-
- - ╘HE PULSEWORK ROUTINE CHANGES THE PULSEWIDTH BETWEEN SQUARE WAVE AND VERY
- RECTANGULAR WAVE ACCORDING TO THE PULSESPEED IN THE CURRENT INSTRUMENT.
- (IE. IT CHANGES THE SOUND OF THE INSTRUMENT AND THUS ALTERS THE 'TIMBRE')
- ╘HE ROUTINE GOES BACKWARDS AND FORWARDS BETWEEN THE TWO; AND SWITCHES
- WHEN ONE EXTREMITY IS REACHED. ╔T'S INTERESTING TO NOTE THAT THE CURRENT
- VALUES OF THE PULSE WIDTH ARE ACTUALLY STORED IN THE INSTRUMENT :-)
-
- - ╨ORTAMENTO IS ACHIEVED BY ADDING/SUBTRACTING AN AMOUNT OF FREQUENCY TO
- THE CURRENT FREQUENCY EACH TIME THIS PART OF THE ROUTINE IS CALLED.
-
- - ╘HE INSTRUMENT FX ROUTINES ARE ALSO REALLY EASY TO FIGURE OUT, AS THEY ARE
- WELL COMMENTED. ┬OTH THE DRUMS AND THE SKYDIVE DO A VERY FAST FREQUENCY
- DOWN, SO IT IS THE MOST SIGNIFICANT BYTE OF THE FREQUENCY WHICH IS REDUCED
- .. AND NOT 16-BIT MATHS (MATH?!) ╘HE ARPEGGIO IS ONLY AN OCTAVE ARPEGGIO,
- SO FOR THE FIRST 50TH OF A SECOND, THE CURRENT NOTE IS PLAYED, AND FOR
- THE NEXT 50TH OF A SECOND, CURRENT NOTE+12 IS PLAYED, FOLLOWED BY THE
- CURRENT NOTE AGAIN ETC.
- ( ╔F YOU DON'T KNOW WHAT AN ARPEGGIO IS..IT'S GENERALLY WHEN THE NOTES OF )
- ( A CHORD ARE PLAYED INDIVIDUALLY IN A RAPID SUCCESSION. ╔T PRODUCES A )
- ( 'FULL' SOUND DEPENDING ON THE SPEED OF THE ARPEGGIO. ╔N MOST CASES THE )
- ( NOTE IS CHANGED 50 TIMES PER SECOND, WHICH GIVES A VERY NICE SOUND. ╔F )
- ( YOU HAVE LISTENED TO SOME COMPUTER MUSIC, THEN YOU WILL HAVE DEFINATELY )
- ( LISTENED TO AN ARPEGGIOS ALL THE TIME, EVEN IF YOU DON'T REALIZE IT! )
-
-
- ╞INAL ╘HOUGHTS:
- **************
-
- *┬OUNCE* ╔'M FINALLY NEAR THE END OF THIS ARTICLE! ╔T HAS BEEN ALOT OF WORK
- TO TRY TO EXPLAIN THIS ROUTINE, BUT ╔'M GLAD THAT ╔'VE DONE IT *GRIN* ╔F YOU
- HAVE ANY QUESTIONS THEN PLEASE FEEL FREE TO E-MAIL ME, OR EVEN E-MAIL ├RAIG IF
- IT'S AFTER ┴UGUST 1993 AND ╔'LL MAKE SURE THAT ╔ LEAVE A FORWARDING ADDRESS
- WITH HIM. ┴LSO, PLEASE FEEL FREE TO E-MAIL ME AND TELL ME WHAT YOU THINK OF
- THIS ARTICLE. ╔ WILL ONLY BE BOTHERED WRITING MORE OF THE SAME IF ╔ KNOW THAT
- SOMEONE IS FINDING THEM USEFUL/INTERESTING. ┴LSO E-MAIL ME IF YOU ARE
- INTERESTED IN ┴MIGA OR ╙╘ MUSIC TOO, AS ╔'VE DONE ALOT ON BOTH OF THOSE
- MACHINES.
-
- ╔'M NOT SURE WHETHER ├RAIG WILL BE PUTTING THE ACTUAL SOURCECODE BELOW THIS
- TEXT, OR IN SOME KIND OF ┴PPENDIX. ╔N EITHER CASE, ╔ ╙╚┴╠╠ TAKE ALL LEGAL
- RESPONSIBILTY FOR PUBLISHING ╥OB ╚UBBARD'S ROUTINE. ├RAIG WAS QUITE RELUCTANT
- TO PUBLISH THE ROUTINE IN HIS NET-MAG BECAUSE OF COPYRIGHT REASONS. ┴S A
- POST-GRADUATE LAW STUDENT THAT WILL BE WORKING AS A COMMERCIAL LAWYER
- (ATTOURNEY FOR ┴MERICANS :) SPECIALIZING IN COPYRIGHT/PATENTS FOR COMPUTER
- SOFTWARE/HARDWARE STARTING ┴UGUST THIS YEAR, ╔ DON'T BELIEVE THAT THERE ARE
- ANY PRACTICAL LEGAL CONSEQUENCES FOR ME.
-
- ╔ WOULD HAVE GIVEN AN ARM OR A LEG FOR A COMMENTED ╥OB ╚UBBARD SOURCECODE IN
- THE PAST, SO ╔ HOPE YOU ENJOY THIS VALUABLE OFFERING.
- -----------------------------------------------------------------------------
- ;ROB HUBBARD
- ;MONTY ON THE RUN MUSIC DRIVER
-
- ;THIS PLAYER WAS USED (WITH SMALL MODS)
- ;FOR HIS FIRST APPROX 30 MUSIX
-
- .ORG $8000
- .OBJ MOTR
-
- JMP INITMUSIC
- JMP PLAYMUSIC
- JMP MUSICOFF
-
-
- ;====================================
- ;INIT MUSIC
-
- INITMUSIC =*
-
- LDA #$00 ;MUSIC NUM
- LDY #$00
- ASL
- STA TEMPSTORE
- ASL
- CLC
- ADC TEMPSTORE ;NOW MUSIC NUM*6
- TAX
-
- - LDA SONGS,X ;COPY PTRS TO THIS
- STA CURRTRKHI,Y ;MUSIC'S TRACKS TO
- INX ;CURRENT TRACKS
- INY
- CPY #$06
- BNE -
-
- LDA #$00 ;CLEAR CONTROL REGS
- STA $D404
- STA $D40B
- STA $D412
- STA $D417
-
- LDA #$0F ;FULL VOLUME
- STA $D418
-
- LDA #$40 ;FLAG INIT MUSIC
- STA MSTATUS
-
- RTS
-
-
- ;====================================
- ;MUSIC OFF
-
- MUSICOFF =*
-
- LDA #$C0 ;FLAG MUSIC OFF
- STA MSTATUS
- RTS
-
-
- ;====================================
- ;PLAY MUSIC
-
- PLAYMUSIC =*
-
- INC COUNTER
-
- BIT MSTATUS ;TEST MUSIC STATUS
- BMI MOFF ;$80 AND $C0 IS OFF
- BVC CONTPLAY ;$40 INIT, ELSE PLAY
-
-
- ;==========
- ;INIT THE SONG (MSTATUS $40)
-
- LDA #$00 ;INIT COUNTER
- STA COUNTER
-
- LDX #3-1
- - STA POSOFFSET,X ;INIT POS OFFSETS
- STA PATOFFSET,X ;INIT PAT OFFSETS
- STA LENGTHLEFT,X ;GET NOTE RIGHT AWAY
- STA NOTENUM,X
- DEX
- BPL -
-
- STA MSTATUS ;SIGNAL MUSIC PLAY
- JMP CONTPLAY
-
-
- ;==========
- ;MUSIC IS OFF (MSTATUS $80 OR $C0)
-
- MOFF =*
-
- BVC + ;IF MSTATUS $C0 THEN
- LDA #$00
- STA $D404 ;KILL VOICE 1,2,3
- STA $D40B ;CONTROL REGISTERS
- STA $D412
-
- LDA #$0F ;FULL VOLUME STILL
- STA $D418
-
- LDA #$80 ;FLAG NO NEED TO KILL
- STA MSTATUS ;SOUND NEXT TIME
-
- + JMP MUSICEND ;END
-
-
- ;==========
- ;MUSIC IS PLAYING (MSTATUS OTHERWISE)
-
- CONTPLAY =*
-
- LDX #3-1 ;NUMBER OF CHANELS
-
- DEC SPEED ;CHECK THE SPEED
- BPL MAINLOOP
-
- LDA RESETSPD ;RESET SPEED IF NEEDED
- STA SPEED
-
-
- MAINLOOP =*
-
- LDA REGOFFSETS,X ;SAVE OFFSET TO REGS
- STA TMPREGOFST ;FOR THIS CHANNEL
- TAY
-
-
- ;CHECK WHETHER A NEW NOTE IS NEEDED
-
- LDA SPEED ;IF SPEED NOT RESET
- CMP RESETSPD ;THEN SKIP NOTEWORK
- BEQ CHECKNEWNOTE
- JMP VIBRATO
-
- CHECKNEWNOTE =*
-
- LDA CURRTRKHI,X ;PUT BASE ADDR.W OF
- STA $02 ;THIS TRACK IN $2
- LDA CURRTRKLO,X
- STA $03
-
- DEC LENGTHLEFT,X ;CHECK WHETHER A NEW
- BMI GETNEWNOTE ;NOTE IS NEEDED
-
- JMP SOUNDWORK ;NO NEW NOTE NEEDED
-
-
- ;==========
- ;NOTEWORK
- ;A NEW NOTE IS NEEDED. GET THE PATTERN
- ;NUMBER/CC FROM THIS POSITION
-
- GETNEWNOTE =*
-
- LDY POSOFFSET,X ;GET THE DATA FROM
- LDA ($02),Y ;THE CURRENT POSITION
-
- CMP #$FF ;POS $FF RESTARTS
- BEQ RESTART
-
- CMP #$FE ;POS $FE STOPS MUSIC
- BNE GETNOTEDATA ;ON ALL CHANNELS
- JMP MUSICEND
-
- ;CC OF $FF RESTARTS THIS TRACK FROM THE
- ;FIRST POSITION
-
- RESTART =*
-
- LDA #$00 ;GET NOTE IMMEDIATELY
- STA LENGTHLEFT,X ;AND RESET PAT,POS
- STA POSOFFSET,X
- STA PATOFFSET,X
- JMP GETNEWNOTE
-
-
- ;GET THE NOTE DATA FROM THIS PATTERN
-
- GETNOTEDATA =*
-
- TAY
- LDA PATPTL,Y ;PUT BASE ADDR.W OF
- STA $04 ;THE PATTERN IN $4
- LDA PATPTH,Y
- STA $05
-
- LDA #$00 ;DEFAULT NO PORTAMENTO
- STA PORTAVAL,X
-
- LDY PATOFFSET,X ;GET OFFSET INTO PTN
-
- LDA #$FF ;DEFAULT NO APPEND
- STA APPENDFL
-
- ;1ST BYTE IS THE LENGTH OF THE NOTE 0-31
- ;BIT5 SIGNALS NO RELEASE (SEE SNDWORK)
- ;BIT6 SIGNALS APPENDED NOTE
- ;BIT7 SIGNALS A NEW INSTRUMENT
- ; OR PORTAMENTO COMING UP
-
- LDA ($04),Y ;GET LENGTH OF NOTE
- STA SAVELNTHCC,X
- STA TEMPLNTHCC
- AND #$1F
- STA LENGTHLEFT,X
-
- BIT TEMPLNTHCC ;TEST FOR APPEND
- BVS APPENDNOTE
-
- INC PATOFFSET,X ;PT TO NEXT DATA
-
- LDA TEMPLNTHCC ;2ND BYTE NEEDED?
- BPL GETPITCH
-
- ;2ND BYTE NEEDED AS 1ST BYTE NEGATIVE
- ;2ND BYTE IS THE INSTRUMENT NUMBER(+VE)
- ;OR PORTAMENTO SPEED(-VE)
-
- INY
- LDA ($04),Y ;GET INSTR/PORTAMENTO
- BPL +
-
- STA PORTAVAL,X ;SAVE PORTAMENTO VAL
- JMP ++
-
- + STA INSTRNR,X ;SAVE INSTR NR
-
- + INC PATOFFSET,X
-
- ;3RD BYTE IS THE PITCH OF THE NOTE
- ;GET THE 'BASE FREQUENCY' HERE
-
- GETPITCH =*
-
- INY
- LDA ($04),Y ;GET PITCH OF NOTE
- STA NOTENUM,X
- ASL ;PITCH*2
- TAY
- LDA FREQUENZLO,Y ;SAVE THE APPROPRIATE
- STA TEMPFREQ ;BASE FREQUENCY
- LDA FREQUENZHI,Y
- LDY TMPREGOFST
- STA $D401,Y
- STA SAVEFREQHI,X
- LDA TEMPFREQ
- STA $D400,Y
- STA SAVEFREQLO,X
- JMP +
-
- APPENDNOTE =*
-
- DEC APPENDFL ;CLEVER EH?
-
-
- ;FETCH ALL THE INITIAL VALUES FROM THE
- ;INSTRUMENT DATA STRUCTURE
-
- + LDY TMPREGOFST
- LDA INSTRNR,X ;INSTR NUM
- STX TEMPSTORE
- ASL ;INSTR NUM*8
- ASL
- ASL
- TAX
-
- LDA INSTR+2,X ;GET CONTROL REG VAL
- STA TEMPCTRL
- LDA INSTR+2,X
- AND APPENDFL ;IMPLEMENT APPEND
- STA $D404,Y
-
- LDA INSTR+0,X ;GET PULSE WIDTH LO
- STA $D402,Y
-
- LDA INSTR+1,X ;GET PULSE WIDTH HI
- STA $D403,Y
-
- LDA INSTR+3,X ;GET ATTACK/DECAY
- STA $D405,Y
-
- LDA INSTR+4,X ;GET SUSTAIN/RELEASE
- STA $D406,Y
-
- LDX TEMPSTORE ;SAVE CONTROL REG VAL
- LDA TEMPCTRL
- STA VOICECTRL,X
-
-
- ;4TH BYTE CHECKS FOR THE END OF PATTERN
- ;IF EOP FOUND, INC THE POSITION AND
- ;RESET PATOFFSET FOR NEW PATTERN
-
- INC PATOFFSET,X ;PREVIEW 4TH BYTE
- LDY PATOFFSET,X
- LDA ($04),Y
-
- CMP #$FF ;CHECK FOR EOP
- BNE +
-
- LDA #$00 ;END OF PAT REACHED
- STA PATOFFSET,X ;INC POSITION FOR
- INC POSOFFSET,X ;THE NEXT TIME
-
- + JMP LOOPCONT
-
-
- ;==========
- ;SOUNDWORK
- ;THE INSTRUMENT AND EFFECTS PROCESSING
- ;ROUTINE WHEN NO NEW NOTE WAS NEEDED
-
- SOUNDWORK =*
-
- ;RELEASE ROUTINE
- ;SET OFF A RELEASE WHEN THE LENGTH OF
- ;THE NOTE IS EXCEEDED
- ;BIT4 OF THE 1ST NOTE-BYTE CAN SPECIFY
- ;FOR NO RELEASE
-
- LDY TMPREGOFST
-
- LDA SAVELNTHCC,X ;CHECK FOR NO RELEASE
- AND #$20 ;SPECIFIED
- BNE VIBRATO
-
- LDA LENGTHLEFT,X ;CHECK FOR LENGTH OF
- BNE VIBRATO ;EXCEEDED
-
- LDA VOICECTRL,X ;LENGTH EXCEEDED SO
- AND #$FE ;START THE RELEASE
- STA $D404,Y ;AND KILL ADSR
- LDA #$00
- STA $D405,Y
- STA $D406,Y
-
-
- ;VIBRATO ROUTINE
- ;(DOES ALOT OF WORK)
-
- VIBRATO =*
-
- LDA INSTRNR,X ;INSTR NUM
- ASL
- ASL
- ASL ;INSTR NUM*8
- TAY
- STY INSTNUMBY8 ;SAVE INSTR NUM*8
-
- LDA INSTR+7,Y ;GET INSTR FX BYTE
- STA INSTRFX
-
- LDA INSTR+6,Y ;GET PULSE SPEED
- STA PULSEVALUE
-
- LDA INSTR+5,Y ;GET VIBRATO DEPTH
- STA VIBRDEPTH
- BEQ PULSEWORK ;CHECK FOR NO VIBRATO
-
- LDA COUNTER ;THIS IS CLEVER!!
- AND #7 ;THE COUNTER'S TURNED
- CMP #4 ;INTO AN OSCILLATING
- BCC + ;VALUE (01233210)
- EOR #7
- + STA OSCILATVAL
-
- LDA NOTENUM,X ;GET BASE NOTE
- ASL ;NOTE*2
- TAY ;GET DIFF BTW NOTE
- SEC ;AND NOTE+1 FREQUENCY
- LDA FREQUENZLO+2,Y
- SBC FREQUENZLO,Y
- STA TMPVDIFLO
- LDA FREQUENZHI+2,Y
- SBC FREQUENZHI,Y
-
- - LSR ;DIVIDE DIFFERENCE BY
- ROR TMPVDIFLO ;2 FOR EACH VIBRDEPTH
- DEC VIBRDEPTH
- BPL -
- STA TMPVDIFHI
-
- LDA FREQUENZLO,Y ;SAVE NOTE FREQUENCY
- STA TMPVFRQLO
- LDA FREQUENZHI,Y
- STA TMPVFRQHI
-
- LDA SAVELNTHCC,X ;NO VIBRATO IF NOTE
- AND #$1F ;LENGTH LESS THAN 8
- CMP #8
- BCC +
-
- LDY OSCILATVAL
-
- - DEY ;DEPENDING ON THE OSC
- BMI + ;VALUE, ADD THE VIBR
- CLC ;FREQ THAT MANY TIMES
- LDA TMPVFRQLO ;TO THE BASE FREQ
- ADC TMPVDIFLO
- STA TMPVFRQLO
- LDA TMPVFRQHI
- ADC TMPVDIFHI
- STA TMPVFRQHI
- JMP -
-
- + LDY TMPREGOFST ;SAVE THE FINAL
- LDA TMPVFRQLO ;FREQUENCIES
- STA $D400,Y
- LDA TMPVFRQHI
- STA $D401,Y
-
-
- ;PULSE-WIDTH TIMBRE ROUTINE
- ;DEPENDING ON THE CONTROL/SPEED BYTE IN
- ;THE INSTRUMENT DATASTRUCTURE, THE PULSE
- ;WIDTH IS OF COURSE INC/DECREMENTED TO
- ;PRODUCE TIMBRE
-
- ;STRANGELY THE DELAY VALUE IS ALSO THE
- ;SIZE OF THE INC/DECREMENTS
-
- PULSEWORK =*
-
- LDA PULSEVALUE ;CHECK FOR PULSEWORK
- BEQ PORTAMENTO ;NEEDED THIS INSTR
-
- LDY INSTNUMBY8
- AND #$1F
- DEC PULSEDELAY,X ;PULSEDELAY-1
- BPL PORTAMENTO
-
- STA PULSEDELAY,X ;RESET PULSEDELAY
-
- LDA PULSEVALUE ;RESTRICT PULSE SPEED
- AND #$E0 ;FROM $00-$1F
- STA PULSESPEED
-
- LDA PULSEDIR,X ;PULSEDIR 0 IS UP AND
- BNE PULSEDOWN ;1 IS DOWN
-
- LDA PULSESPEED ;PULSE WIDTH UP
- CLC
- ADC INSTR+0,Y ;ADD THE PULSESPEED
- PHA ;TO THE PULSE WIDTH
- LDA INSTR+1,Y
- ADC #$00
- AND #$0F
- PHA
- CMP #$0E ;GO PULSEDOWN WHEN
- BNE DUMPULSE ;THE PULSE VALUE
- INC PULSEDIR,X ;REACHES MAX ($0EXX)
- JMP DUMPULSE
-
- PULSEDOWN =*
-
- SEC ;PULSE WIDTH DOWN
- LDA INSTR+0,Y
- SBC PULSESPEED ;SUB THE PULSESPEED
- PHA ;FROM THE PULSE WIDTH
- LDA INSTR+1,Y
- SBC #$00
- AND #$0F
- PHA
- CMP #$08 ;GO PULSEUP WHEN
- BNE DUMPULSE ;THE PULSE VALUE
- DEC PULSEDIR,X ;REACHES MIN ($08XX)
-
- DUMPULSE =*
-
- STX TEMPSTORE ;DUMP PULSE WIDTH TO
- LDX TMPREGOFST ;CHIP AND BACK INTO
- PLA ;THE INSTR DATA STR
- STA INSTR+1,Y
- STA $D403,X
- PLA
- STA INSTR+0,Y
- STA $D402,X
- LDX TEMPSTORE
-
-
- ;PORTAMENTO ROUTINE
- ;PORTAMENTO COMES FROM THE SECOND BYTE
- ;IF IT'S A NEGATIVE VALUE
-
- PORTAMENTO =*
-
- LDY TMPREGOFST
- LDA PORTAVAL,X ;CHECK FOR PORTAMENTO
- BEQ DRUMS ;NONE
-
- AND #$7E ;TOAD UNWANTED BITS
- STA TEMPSTORE
-
- LDA PORTAVAL,X ;BIT0 SIGNALS UP/DOWN
- AND #$01
- BEQ PORTUP
-
- SEC ;PORTAMENTO DOWN
- LDA SAVEFREQLO,X ;SUB PORTAVAL FROM
- SBC TEMPSTORE ;CURRENT FREQUENCY
- STA SAVEFREQLO,X
- STA $D400,Y
- LDA SAVEFREQHI,X
- SBC #$00 ;(WORD ARITHMETIC)
- STA SAVEFREQHI,X
- STA $D401,Y
- JMP DRUMS
-
- PORTUP =*
-
- CLC ;PORTAMENTO UP
- LDA SAVEFREQLO,X ;ADD PORTVAL TO
- ADC TEMPSTORE ;CURRENT FREQUENCY
- STA SAVEFREQLO,X
- STA $D400,Y
- LDA SAVEFREQHI,X
- ADC #$00
- STA SAVEFREQHI,X
- STA $D401,Y
-
-
- ;BIT0 INSTRFX ARE THE DRUM ROUTINES
- ;THE ACTUAL DRUM TIMBRE DEPENDS ON THE
- ;CRTL REGISTER VALUE FOR THE INSTRUMENT:
- ;CTRLREG 0 IS ALWAYS NOISE
- ;CTRLREG X IS NOISE FOR 1ST VBL AND X
- ;FROM THEN ON
-
- ;SEE THAT THE DRUM IS MADE BY RAPID HI
- ;TO LOW FREQUENCY SLIDE WITH FAST ATTACK
- ;AND DECAY
-
- DRUMS =*
-
- LDA INSTRFX ;CHECK IF DRUMS
- AND #$01 ;NEEDED THIS INSTR
- BEQ SKYDIVE
-
- LDA SAVEFREQHI,X ;DON'T BOTHER IF FREQ
- BEQ SKYDIVE ;CAN'T GO ANY LOWER
-
- LDA LENGTHLEFT,X ;OR IF THE NOTE HAS
- BEQ SKYDIVE ;FINISHED
-
- LDA SAVELNTHCC,X ;CHECK IF THIS IS THE
- AND #$1F ;FIRST VBL FOR THIS
- SEC ;INSTRUMENT-NOTE
- SBC #$01
- CMP LENGTHLEFT,X
- LDY TMPREGOFST
- BCC FIRSTIME
-
- LDA SAVEFREQHI,X ;NOT THE FIRST TIME
- DEC SAVEFREQHI,X ;SO DEC FREQHI FOR
- STA $D401,Y ;DRUM SOUND
-
- LDA VOICECTRL,X ;IF CTRLREG IS 0 THEN
- AND #$FE ;NOISE IS USED ALWAYS
- BNE DUMPCTRL
-
- FIRSTIME =*
-
- LDA SAVEFREQHI,X ;NOISE IS USED FOR
- STA $D401,Y ;THE FIRST VBL ALSO
- LDA #$80 ;(SET NOISE)
-
- DUMPCTRL =*
-
- STA $D404,Y
-
-
- ;BIT1 INSTRFX IS THE SKYDIVE
- ;A LONG PORTAMENTO-DOWN FROM THE NOTE
- ;TO ZEROFREQ
-
- SKYDIVE =*
-
- LDA INSTRFX ;CHECK IF SKYDIVE
- AND #$02 ;NEEDED THIS INSTR
- BEQ OCTARP
-
- LDA COUNTER ;EVERY 2ND VBL
- AND #$01
- BEQ OCTARP
-
- LDA SAVEFREQHI,X ;CHECK IF SKYDIVE
- BEQ OCTARP ;ALREADY COMPLETE
-
- DEC SAVEFREQHI,X ;DECR AND SAVE THE
- LDY TMPREGOFST ;HIGH BYTE FREQ
- STA $D401,Y
-
-
- ;BIT2 INSTRFX IS AN OCTAVE ARPEGGIO
- ;PRETTY TAME HUH?
-
- OCTARP =*
-
- LDA INSTRFX ;CHECK IF ARPT NEEDED
- AND #$04
- BEQ LOOPCONT
-
- LDA COUNTER ;ONLY 2 ARPT VALUES
- AND #$01
- BEQ +
-
- LDA NOTENUM,X ;ODD, NOTE+12
- CLC
- ADC #$0C
- JMP ++
-
- + LDA NOTENUM,X ;EVEN, NOTE
-
- + ASL ;DUMP THE CORRESPONDING
- TAY ;FREQUENCIES
- LDA FREQUENZLO,Y
- STA TEMPFREQ
- LDA FREQUENZHI,Y
- LDY TMPREGOFST
- STA $D401,Y
- LDA TEMPFREQ
- STA $D400,Y
-
-
- ;==========
- ;END OF DBF LOOP
-
- LOOPCONT =*
-
- DEX ;DBF MAINLOOP
- BMI MUSICEND
- JMP MAINLOOP
-
- MUSICEND =*
-
- RTS
-
-
- ;====================================
- ;FREQUENZ DATA
- ;====================================
-
- FREQUENZLO .BYT $16
- FREQUENZHI .BYT $01
- .BYT $27,$01,$38,$01,$4B,$01
- .BYT $5F,$01,$73,$01,$8A,$01,$A1,$01
- .BYT $BA,$01,$D4,$01,$F0,$01,$0E,$02
- .BYT $2D,$02,$4E,$02,$71,$02,$96,$02
- .BYT $BD,$02,$E7,$02,$13,$03,$42,$03
- .BYT $74,$03,$A9,$03,$E0,$03,$1B,$04
- .BYT $5A,$04,$9B,$04,$E2,$04,$2C,$05
- .BYT $7B,$05,$CE,$05,$27,$06,$85,$06
- .BYT $E8,$06,$51,$07,$C1,$07,$37,$08
- .BYT $B4,$08,$37,$09,$C4,$09,$57,$0A
- .BYT $F5,$0A,$9C,$0B,$4E,$0C,$09,$0D
- .BYT $D0,$0D,$A3,$0E,$82,$0F,$6E,$10
- .BYT $68,$11,$6E,$12,$88,$13,$AF,$14
- .BYT $EB,$15,$39,$17,$9C,$18,$13,$1A
- .BYT $A1,$1B,$46,$1D,$04,$1F,$DC,$20
- .BYT $D0,$22,$DC,$24,$10,$27,$5E,$29
- .BYT $D6,$2B,$72,$2E,$38,$31,$26,$34
- .BYT $42,$37,$8C,$3A,$08,$3E,$B8,$41
- .BYT $A0,$45,$B8,$49,$20,$4E,$BC,$52
- .BYT $AC,$57,$E4,$5C,$70,$62,$4C,$68
- .BYT $84,$6E,$18,$75,$10,$7C,$70,$83
- .BYT $40,$8B,$70,$93,$40,$9C,$78,$A5
- .BYT $58,$AF,$C8,$B9,$E0,$C4,$98,$D0
- .BYT $08,$DD,$30,$EA,$20,$F8,$2E,$FD
-
-
- REGOFFSETS .BYT $00,$07,$0E
- TMPREGOFST .BYT $00
- POSOFFSET .BYT $00,$00,$00
- PATOFFSET .BYT $00,$00,$00
- LENGTHLEFT .BYT $00,$00,$00
- SAVELNTHCC .BYT $00,$00,$00
- VOICECTRL .BYT $00,$00,$00
- NOTENUM .BYT $00,$00,$00
- INSTRNR .BYT $00,$00,$00
- APPENDFL .BYT $00
- TEMPLNTHCC .BYT $00
- TEMPFREQ .BYT $00
- TEMPSTORE .BYT $00
- TEMPCTRL .BYT $00
- VIBRDEPTH .BYT $00
- PULSEVALUE .BYT $00
- TMPVDIFLO .BYT $00
- TMPVDIFHI .BYT $00
- TMPVFRQLO .BYT $00
- TMPVFRQHI .BYT $00
- OSCILATVAL .BYT $00
- PULSEDELAY .BYT $00,$00,$00
- PULSEDIR .BYT $00,$00,$00
- SPEED .BYT $00
- RESETSPD .BYT $01
- INSTNUMBY8 .BYT $00
- MSTATUS .BYT $C0
- SAVEFREQHI .BYT $00,$00,$00
- SAVEFREQLO .BYT $00,$00,$00
- PORTAVAL .BYT $00,$00,$00
- INSTRFX .BYT $00
- PULSESPEED .BYT $00
- COUNTER .BYT $00
- CURRTRKHI .BYT $00,$00,$00
- CURRTRKLO .BYT $00,$00,$00
-
-
- ;====================================
- ;MONTY ON THE RUN MAIN THEME
- ;====================================
-
- SONGS =*
- .BYT <MONTYMAINTR1
- .BYT <MONTYMAINTR2
- .BYT <MONTYMAINTR3
- .BYT >MONTYMAINTR1
- .BYT >MONTYMAINTR2
- .BYT >MONTYMAINTR3
-
-
- ;====================================
- ;POINTERS TO THE PATTERNS
-
- ;LOW POINTERS
- PATPTL =*
- .BYT <PTN00
- .BYT <PTN01
- .BYT <PTN02
- .BYT <PTN03
- .BYT <PTN04
- .BYT <PTN05
- .BYT <PTN06
- .BYT <PTN07
- .BYT <PTN08
- .BYT <PTN09
- .BYT <PTN0A
- .BYT <PTN0B
- .BYT <PTN0C
- .BYT <PTN0D
- .BYT <PTN0E
- .BYT <PTN0F
- .BYT <PTN10
- .BYT <PTN11
- .BYT <PTN12
- .BYT <PTN13
- .BYT <PTN14
- .BYT <PTN15
- .BYT <PTN16
- .BYT <PTN17
- .BYT <PTN18
- .BYT <PTN19
- .BYT <PTN1A
- .BYT <PTN1B
- .BYT <PTN1C
- .BYT <PTN1D
- .BYT <PTN1E
- .BYT <PTN1F
- .BYT <PTN20
- .BYT <PTN21
- .BYT <PTN22
- .BYT <PTN23
- .BYT <PTN24
- .BYT <PTN25
- .BYT <PTN26
- .BYT <PTN27
- .BYT <PTN28
- .BYT <PTN29
- .BYT <PTN2A
- .BYT <PTN2B
- .BYT <PTN2C
- .BYT <PTN2D
- .BYT 0
- .BYT <PTN2F
- .BYT <PTN30
- .BYT <PTN31
- .BYT <PTN32
- .BYT <PTN33
- .BYT <PTN34
- .BYT <PTN35
- .BYT <PTN36
- .BYT <PTN37
- .BYT <PTN38
- .BYT <PTN39
- .BYT <PTN3A
- .BYT <PTN3B
-
- ;HIGH POINTERS
- PATPTH =*
- .BYT >PTN00
- .BYT >PTN01
- .BYT >PTN02
- .BYT >PTN03
- .BYT >PTN04
- .BYT >PTN05
- .BYT >PTN06
- .BYT >PTN07
- .BYT >PTN08
- .BYT >PTN09
- .BYT >PTN0A
- .BYT >PTN0B
- .BYT >PTN0C
- .BYT >PTN0D
- .BYT >PTN0E
- .BYT >PTN0F
- .BYT >PTN10
- .BYT >PTN11
- .BYT >PTN12
- .BYT >PTN13
- .BYT >PTN14
- .BYT >PTN15
- .BYT >PTN16
- .BYT >PTN17
- .BYT >PTN18
- .BYT >PTN19
- .BYT >PTN1A
- .BYT >PTN1B
- .BYT >PTN1C
- .BYT >PTN1D
- .BYT >PTN1E
- .BYT >PTN1F
- .BYT >PTN20
- .BYT >PTN21
- .BYT >PTN22
- .BYT >PTN23
- .BYT >PTN24
- .BYT >PTN25
- .BYT >PTN26
- .BYT >PTN27
- .BYT >PTN28
- .BYT >PTN29
- .BYT >PTN2A
- .BYT >PTN2B
- .BYT >PTN2C
- .BYT >PTN2D
- .BYT 0
- .BYT >PTN2F
- .BYT >PTN30
- .BYT >PTN31
- .BYT >PTN32
- .BYT >PTN33
- .BYT >PTN34
- .BYT >PTN35
- .BYT >PTN36
- .BYT >PTN37
- .BYT >PTN38
- .BYT >PTN39
- .BYT >PTN3A
- .BYT >PTN3B
-
-
- ;====================================
- ;TRACKS
- ;====================================
-
- ;TRACK1
- MONTYMAINTR1 =*
- .BYT $11,$14,$17,$1A,$00,$27,$00,$28
- .BYT $03,$05,$00,$27,$00,$28,$03,$05
- .BYT $07,$3A,$14,$17,$00,$27,$00,$28
- .BYT $2F,$30,$31,$31,$32,$33,$33,$34
- .BYT $34,$34,$34,$34,$34,$34,$34,$35
- .BYT $35,$35,$35,$35,$35,$36,$12,$37
- .BYT $38,$09,$2A,$09,$2B,$09,$0A,$09
- .BYT $2A,$09,$2B,$09,$0A,$0D,$0D,$0F
- .BYT $FF
-
- ;TRACK2
- MONTYMAINTR2 =*
- .BYT $12,$15,$18,$1B,$2D,$39,$39
- .BYT $39,$39,$39,$39,$2C,$39,$39,$39
- .BYT $39,$39,$39,$2C,$39,$39,$39,$01
- .BYT $01,$29,$29,$2C,$15,$18,$39,$39
- .BYT $39,$39,$39,$39,$39,$39,$39,$39
- .BYT $39,$39,$39,$39,$39,$39,$39,$39
- .BYT $39,$39,$39,$39,$39,$39,$39,$39
- .BYT $39,$39,$39,$39,$39,$01,$01,$01
- .BYT $29,$39,$39,$39,$01,$01,$01,$29
- .BYT $39,$39,$39,$39,$FF
-
- ;TRACK3
- MONTYMAINTR3 =*
- .BYT $13,$16,$19
- .BYT $1C,$02,$02,$1D,$1E,$02,$02,$1D
- .BYT $1F,$04,$04,$20,$20,$06,$02,$02
- .BYT $1D,$1E,$02,$02,$1D,$1F,$04,$04
- .BYT $20,$20,$06,$08,$08,$08,$08,$21
- .BYT $21,$21,$21,$22,$22,$22,$23,$22
- .BYT $24,$25,$3B,$26,$26,$26,$26,$26
- .BYT $26,$26,$26,$26,$26,$26,$26,$26
- .BYT $26,$26,$26,$02,$02,$1D,$1E,$02
- .BYT $02,$1D,$1F,$2F,$2F,$2F,$2F,$2F
- .BYT $2F,$2F,$2F,$2F,$2F,$2F,$2F,$2F
- .BYT $0B,$0B,$1D,$1D,$0B,$0B,$1D,$0B
- .BYT $0B,$0B,$0C,$0C,$1D,$1D,$1D,$10
- .BYT $0B,$0B,$1D,$1D,$0B,$0B,$1D,$0B
- .BYT $0B,$0B,$0C,$0C,$1D,$1D,$1D,$10
- .BYT $0B,$1D,$0B,$1D,$0B,$1D,$0B,$1D
- .BYT $0B,$0C,$1D,$0B,$0C,$23,$0B,$0B
- .BYT $FF
-
-
- ;====================================
- ;PATTERNS
- ;====================================
-
- PTN00 =*
- .BYT $83,$00,$37,$01,$3E,$01,$3E,$03
- .BYT $3D,$03,$3E,$03,$43,$03,$3E,$03
- .BYT $3D,$03,$3E,$03,$37,$01,$3E,$01
- .BYT $3E,$03,$3D,$03,$3E,$03,$43,$03
- .BYT $42,$03,$43,$03,$45,$03,$46,$01
- .BYT $48,$01,$46,$03,$45,$03,$43,$03
- .BYT $4B,$01,$4D,$01,$4B,$03,$4A,$03
- .BYT $48,$FF
-
- PTN27 =*
- .BYT $1F,$4A,$FF
-
- PTN28 =*
- .BYT $03,$46,$01,$48,$01,$46,$03,$45
- .BYT $03,$4A,$0F,$43,$FF
-
- PTN03 =*
- .BYT $BF,$06
- .BYT $48,$07,$48,$01,$4B,$01,$4A,$01
- .BYT $4B,$01,$4A,$03,$4B,$03,$4D,$03
- .BYT $4B,$03,$4A,$3F,$48,$07,$48,$01
- .BYT $4B,$01,$4A,$01,$4B,$01,$4A,$03
- .BYT $4B,$03,$4D,$03,$4B,$03,$48,$3F
- .BYT $4C,$07,$4C,$01,$4F,$01,$4E,$01
- .BYT $4F,$01,$4E,$03,$4F,$03,$51,$03
- .BYT $4F,$03,$4E,$3F,$4C,$07,$4C,$01
- .BYT $4F,$01,$4E,$01,$4F,$01,$4E,$03
- .BYT $4F,$03,$51,$03,$4F,$03,$4C,$FF
-
- PTN05 =*
- .BYT $83,$04,$26,$03,$29,$03,$28,$03
- .BYT $29,$03,$26,$03,$35,$03,$34,$03
- .BYT $32,$03,$2D,$03,$30,$03,$2F,$03
- .BYT $30,$03,$2D,$03,$3C,$03,$3B,$03
- .BYT $39,$03,$30,$03,$33,$03,$32,$03
- .BYT $33,$03,$30,$03,$3F,$03,$3E,$03
- .BYT $3C,$03,$46,$03,$45,$03,$43,$03
- .BYT $3A,$03,$39,$03,$37,$03,$2E,$03
- .BYT $2D,$03,$26,$03,$29,$03,$28,$03
- .BYT $29,$03,$26,$03,$35,$03,$34,$03
- .BYT $32,$03,$2D,$03,$30,$03,$2F,$03
- .BYT $30,$03,$2D,$03,$3C,$03,$3B,$03
- .BYT $39,$03,$30,$03,$33,$03,$32,$03
- .BYT $33,$03,$30,$03,$3F,$03,$3E,$03
- .BYT $3C,$03,$34,$03,$37,$03,$36,$03
- .BYT $37,$03,$34,$03,$37,$03,$3A,$03
- .BYT $3D
-
- PTN3A =*
- .BYT $03,$3E,$07,$3E,$07,$3F,$07
- .BYT $3E,$03,$3C,$07,$3E,$57,$FF
-
- PTN07 =*
- .BYT $8B
- .BYT $00,$3A,$01,$3A,$01,$3C,$03,$3D
- .BYT $03,$3F,$03,$3D,$03,$3C,$0B,$3A
- .BYT $03,$39,$07,$3A,$81,$06,$4B,$01
- .BYT $4D,$01,$4E,$01,$4D,$01,$4E,$01
- .BYT $4D,$05,$4B,$81,$00,$3A,$01,$3C
- .BYT $01,$3D,$03,$3F,$03,$3D,$03,$3C
- .BYT $03,$3A,$03,$39,$1B,$3A,$0B,$3B
- .BYT $01,$3B,$01,$3D,$03,$3E,$03,$40
- .BYT $03,$3E,$03,$3D,$0B,$3B,$03,$3A
- .BYT $07,$3B,$81,$06,$4C,$01,$4E,$01
- .BYT $4F,$01,$4E,$01,$4F,$01,$4E,$05
- .BYT $4C,$81,$00,$3B,$01,$3D,$01,$3E
- .BYT $03,$40,$03,$3E,$03,$3D,$03,$3B
- .BYT $03,$3A,$1B,$3B,$8B,$05,$35,$03
- .BYT $33,$07,$32,$03,$30,$03,$2F,$0B
- .BYT $30,$03,$32,$0F,$30,$0B,$35,$03
- .BYT $33,$07,$32,$03,$30,$03,$2F,$1F
- .BYT $30,$8B,$00,$3C,$01,$3C,$01,$3E
- .BYT $03,$3F,$03,$41,$03,$3F,$03,$3E
- .BYT $0B,$3D,$01,$3D,$01,$3F,$03,$40
- .BYT $03,$42,$03,$40,$03,$3F,$03,$3E
- .BYT $01,$3E,$01,$40,$03,$41,$03,$40
- .BYT $03,$3E,$03,$3D,$03,$3E,$03,$3C
- .BYT $03,$3A,$01,$3A,$01,$3C,$03,$3D
- .BYT $03,$3C,$03,$3A,$03,$39,$03,$3A
- .BYT $03,$3C,$FF
-
- PTN09 =*
- .BYT $83,$00,$32,$01,$35,$01,$34,$03
- .BYT $32,$03,$35,$03,$34,$03,$32,$03
- .BYT $35,$01,$34,$01,$32,$03,$32,$03
- .BYT $3A,$03,$39,$03,$3A,$03,$32,$03
- .BYT $3A,$03,$39,$03,$3A,$FF
-
- PTN2A =*
- .BYT $03,$34,$01,$37,$01,$35,$03,$34
- .BYT $03,$37,$03,$35,$03,$34,$03,$37
- .BYT $01,$35,$01,$34,$03,$34,$03,$3A
- .BYT $03,$39,$03,$3A,$03,$34,$03,$3A
- .BYT $03,$39,$03,$3A,$FF
-
- PTN2B =*
- .BYT $03,$39,$03,$38,$03,$39,$03,$3A
- .BYT $03,$39,$03,$37,$03,$35,$03,$34
- .BYT $03,$35,$03,$34,$03,$35,$03,$37
- .BYT $03,$35,$03,$34,$03,$32,$03,$31
- .BYT $FF
-
- PTN0A =*
- .BYT $03
- .BYT $37,$01,$3A,$01,$39,$03,$37,$03
- .BYT $3A,$03,$39,$03,$37,$03,$3A,$01
- .BYT $39,$01,$37,$03,$37,$03,$3E,$03
- .BYT $3D,$03,$3E,$03,$37,$03,$3E,$03
- .BYT $3D,$03,$3E,$03,$3D,$01,$40,$01
- .BYT $3E,$03,$3D,$03,$40,$01,$3E,$01
- .BYT $3D,$03,$40,$03,$3E,$03,$40,$03
- .BYT $40,$01,$43,$01,$41,$03,$40,$03
- .BYT $43,$01,$41,$01,$40,$03,$43,$03
- .BYT $41,$03,$43,$03,$43,$01,$46,$01
- .BYT $45,$03,$43,$03,$46,$01,$45,$01
- .BYT $43,$03,$46,$03,$45,$03,$43,$01
- .BYT $48,$01,$49,$01,$48,$01,$46,$01
- .BYT $45,$01,$46,$01,$45,$01,$43,$01
- .BYT $41,$01,$43,$01,$41,$01,$40,$01
- .BYT $3D,$01,$39,$01,$3B,$01,$3D,$FF
-
- PTN0D =*
- .BYT $01,$3E,$01,$39,$01,$35,$01,$39
- .BYT $01,$3E,$01,$39,$01,$35,$01,$39
- .BYT $03,$3E,$01,$41,$01,$40,$03,$40
- .BYT $01,$3D,$01,$3E,$01,$40,$01,$3D
- .BYT $01,$39,$01,$3D,$01,$40,$01,$3D
- .BYT $01,$39,$01,$3D,$03,$40,$01,$43
- .BYT $01,$41,$03,$41,$01,$3E,$01,$40
- .BYT $01,$41,$01,$3E,$01,$39,$01,$3E
- .BYT $01,$41,$01,$3E,$01,$39,$01,$3E
- .BYT $03,$41,$01,$45,$01,$43,$03,$43
- .BYT $01,$40,$01,$41,$01,$43,$01,$40
- .BYT $01,$3D,$01,$40,$01,$43,$01,$40
- .BYT $01,$3D,$01,$40,$01,$46,$01,$43
- .BYT $01,$45,$01,$46,$01,$44,$01,$43
- .BYT $01,$40,$01,$3D,$FF
-
- PTN0F =*
- .BYT $01,$3E,$01
- .BYT $39,$01,$35,$01,$39,$01,$3E,$01
- .BYT $39,$01,$35,$01,$39,$01,$3E,$01
- .BYT $39,$01,$35,$01,$39,$01,$3E,$01
- .BYT $39,$01,$35,$01,$39,$01,$3E,$01
- .BYT $3A,$01,$37,$01,$3A,$01,$3E,$01
- .BYT $3A,$01,$37,$01,$3A,$01,$3E,$01
- .BYT $3A,$01,$37,$01,$3A,$01,$3E,$01
- .BYT $3A,$01,$37,$01,$3A,$01,$40,$01
- .BYT $3D,$01,$39,$01,$3D,$01,$40,$01
- .BYT $3D,$01,$39,$01,$3D,$01,$40,$01
- .BYT $3D,$01,$39,$01,$3D,$01,$40,$01
- .BYT $3D,$01,$39,$01,$3D,$01,$41,$01
- .BYT $3E,$01,$39,$01,$3E,$01,$41,$01
- .BYT $3E,$01,$39,$01,$3E,$01,$41,$01
- .BYT $3E,$01,$39,$01,$3E,$01,$41,$01
- .BYT $3E,$01,$39,$01,$3E,$01,$43,$01
- .BYT $3E,$01,$3A,$01,$3E,$01,$43,$01
- .BYT $3E,$01,$3A,$01,$3E,$01,$43,$01
- .BYT $3E,$01,$3A,$01,$3E,$01,$43,$01
- .BYT $3E,$01,$3A,$01,$3E,$01,$43,$01
- .BYT $3F,$01,$3C,$01,$3F,$01,$43,$01
- .BYT $3F,$01,$3C,$01,$3F,$01,$43,$01
- .BYT $3F,$01,$3C,$01,$3F,$01,$43,$01
- .BYT $3F,$01,$3C,$01,$3F,$01,$45,$01
- .BYT $42,$01,$3C,$01,$42,$01,$45,$01
- .BYT $42,$01,$3C,$01,$42,$01,$48,$01
- .BYT $45,$01,$42,$01,$45,$01,$4B,$01
- .BYT $48,$01,$45,$01,$48,$01,$4B,$01
- .BYT $4A,$01,$48,$01,$4A,$01,$4B,$01
- .BYT $4A,$01,$48,$01,$4A,$01,$4B,$01
- .BYT $4A,$01,$48,$01,$4A,$01,$4C,$01
- .BYT $4E,$03,$4F,$FF
-
- PTN11 =*
- .BYT $BF,$06,$56,$1F,$57,$1F,$56,$1F
- .BYT $5B,$1F,$56,$1F,$57,$1F,$56,$1F
- .BYT $4F,$FF
-
- PTN12 =*
- .BYT $BF,$0C,$68,$7F,$7F,$7F,$7F,$7F
- .BYT $7F,$7F,$FF
-
- PTN13 =*
- .BYT $BF,$08,$13,$3F,$13,$3F,$13,$3F
- .BYT $13,$3F,$13,$3F,$13,$3F,$13,$1F
- .BYT $13,$FF
-
- PTN14 =*
- .BYT $97,$09,$2E,$03,$2E,$1B,$32,$03
- .BYT $32,$1B,$31,$03,$31,$1F,$34,$43
- .BYT $17,$32,$03,$32,$1B,$35,$03,$35
- .BYT $1B,$34,$03,$34,$0F,$37,$8F,$0A
- .BYT $37,$43,$FF
-
- PTN15 =*
- .BYT $97,$09,$2B,$03,$2B,$1B,$2E,$03
- .BYT $2E,$1B,$2D,$03,$2D,$1F,$30,$43
- .BYT $17,$2E,$03,$2E,$1B,$32,$03,$32
- .BYT $1B,$31,$03,$31,$0F,$34,$8F,$0A
- .BYT $34,$43,$FF
-
- PTN16 =*
- .BYT $0F,$1F,$0F,$1F,$0F,$1F,$0F,$1F
- .BYT $0F,$1F,$0F,$1F,$0F,$1F,$0F,$1F
- .BYT $0F,$1F,$0F,$1F,$0F,$1F,$0F,$1F
- .BYT $0F,$1F,$0F,$1F,$0F,$1F,$0F,$1F
- .BYT $FF
-
- PTN17 =*
- .BYT $97,$09,$33,$03,$33,$1B,$37,$03
- .BYT $37,$1B,$36,$03,$36,$1F,$39,$43
- .BYT $17,$37,$03,$37,$1B,$3A,$03,$3A
- .BYT $1B,$39,$03,$39,$2F,$3C,$21,$3C
- .BYT $21,$3D,$21,$3E,$21,$3F,$21,$40
- .BYT $21,$41,$21,$42,$21,$43,$21,$44
- .BYT $01,$45,$FF
-
- PTN18 =*
- .BYT $97,$09,$30,$03,$30,$1B,$33,$03
- .BYT $33,$1B,$32,$03,$32,$1F,$36,$43
- .BYT $17,$33,$03,$33,$1B,$37,$03,$37
- .BYT $1B,$36,$03,$36,$2F,$39,$21,$39
- .BYT $21,$3A,$21,$3B,$21,$3C,$21,$3D
- .BYT $21,$3E,$21,$3F,$21,$40,$21,$41
- .BYT $01,$42,$FF
-
- PTN19 =*
- .BYT $0F,$1A,$0F,$1A,$0F,$1A,$0F,$1A
- .BYT $0F,$1A,$0F,$1A,$0F,$1A,$0F,$1A
- .BYT $0F,$1A,$0F,$1A,$0F,$1A,$0F,$1A
- .BYT $0F,$1A,$0F,$1A,$0F,$1A,$0F,$1A
- .BYT $FF
-
- PTN1A =*
- .BYT $1F,$46,$BF,$0A,$46,$7F,$7F,$FF
-
- PTN1B =*
- .BYT $1F,$43,$BF,$0A,$43,$7F,$FF
-
- PTN1C =*
- .BYT $83,$02,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1E,$03
- .BYT $1F,$FF
-
- PTN29 =*
- .BYT $8F,$0B,$38,$4F,$FF
-
- PTN2C =*
- .BYT $83,$0E,$32,$07,$32,$07,$2F,$07
- .BYT $2F,$03,$2B,$87,$0B,$46,$83,$0E
- .BYT $2C,$03,$2C,$8F,$0B,$32,$FF
-
- PTN2D =*
- .BYT $43,$83,$0E,$32,$03,$32,$03,$2F
- .BYT $03,$2F,$03,$2C,$87,$0B,$38,$FF
-
- PTN39 =*
- .BYT $83,$01
- .BYT $43,$01,$4F,$01,$5B,$87,$03,$2F
- .BYT $83,$01,$43,$01,$4F,$01,$5B,$87
- .BYT $03,$2F,$83,$01,$43,$01,$4F,$01
- .BYT $5B,$87,$03,$2F,$83,$01,$43,$01
- .BYT $4F,$01,$5B,$87,$03,$2F,$83,$01
- .BYT $43,$01,$4F,$01,$5B,$87,$03,$2F
- .BYT $83,$01,$43,$01,$4F,$01,$5B,$87
- .BYT $03,$2F
-
- PTN01 =*
- .BYT $83,$01,$43,$01,$4F,$01,$5B,$87
- .BYT $03,$2F,$83,$01,$43,$01,$4F,$01
- .BYT $5B,$87,$03,$2F,$FF
-
- PTN02 =*
- .BYT $83,$02,$13,$03,$13,$03,$1F,$03
- .BYT $1F,$03,$13,$03,$13,$03,$1F,$03
- .BYT $1F,$FF
-
- PTN1D =*
- .BYT $03,$15,$03,$15,$03,$1F,$03,$21
- .BYT $03,$15,$03,$15,$03,$1F,$03,$21
- .BYT $FF
-
- PTN1E =*
- .BYT $03,$1A,$03,$1A,$03,$1C,$03,$1C
- .BYT $03,$1D,$03,$1D,$03,$1E,$03,$1E
- .BYT $FF
-
- PTN1F =*
- .BYT $03,$1A,$03,$1A,$03,$24,$03,$26
- .BYT $03,$13,$03,$13,$07,$1F,$FF
-
- PTN04 =*
- .BYT $03,$18,$03,$18,$03,$24,$03,$24
- .BYT $03,$18,$03,$18,$03,$24,$03,$24
- .BYT $03,$20,$03,$20,$03,$2C,$03,$2C
- .BYT $03,$20,$03,$20,$03,$2C,$03,$2C
- .BYT $FF
-
- PTN20 =*
- .BYT $03,$19,$03,$19,$03
- .BYT $25,$03,$25,$03,$19,$03,$19,$03
- .BYT $25,$03,$25,$03,$21,$03,$21,$03
- .BYT $2D,$03,$2D,$03,$21,$03,$21,$03
- .BYT $2D,$03,$2D,$FF
-
- PTN06 =*
- .BYT $03,$1A,$03,$1A
- .BYT $03,$26,$03,$26,$03,$1A,$03,$1A
- .BYT $03,$26,$03,$26,$03,$15,$03,$15
- .BYT $03,$21,$03,$21,$03,$15,$03,$15
- .BYT $03,$21,$03,$21,$03,$18,$03,$18
- .BYT $03,$24,$03,$24,$03,$18,$03,$18
- .BYT $03,$24,$03,$24,$03,$1F,$03,$1F
- .BYT $03,$2B,$03,$2B,$03,$1F,$03,$1F
- .BYT $03,$2B,$03,$2B,$03,$1A,$03,$1A
- .BYT $03,$26,$03,$26,$03,$1A,$03,$1A
- .BYT $03,$26,$03,$26,$03,$15,$03,$15
- .BYT $03,$21,$03,$21,$03,$15,$03,$15
- .BYT $03,$21,$03,$21,$03,$18,$03,$18
- .BYT $03,$24,$03,$24,$03,$18,$03,$18
- .BYT $03,$24,$03,$24,$03,$1C,$03,$1C
- .BYT $03,$28,$03,$28,$03,$1C,$03,$1C
- .BYT $03,$28,$03,$28
-
- PTN3B =*
- .BYT $83,$04,$36,$07
- .BYT $36,$07,$37,$07,$36,$03,$33,$07
- .BYT $32,$57,$FF
-
- PTN08 =*
- .BYT $83,$02,$1B,$03,$1B,$03,$27,$03
- .BYT $27,$03,$1B,$03,$1B,$03,$27,$03
- .BYT $27,$FF
-
- PTN21 =*
- .BYT $03,$1C,$03,$1C,$03,$28,$03,$28
- .BYT $03,$1C,$03,$1C,$03,$28,$03,$28
- .BYT $FF
-
- PTN22 =*
- .BYT $03,$1D,$03,$1D,$03,$29,$03,$29
- .BYT $03,$1D,$03,$1D,$03,$29,$03,$29
- .BYT $FF
-
- PTN23 =*
- .BYT $03,$18,$03,$18,$03,$24,$03,$24
- .BYT $03,$18,$03,$18,$03,$24,$03,$24
- .BYT $FF
-
- PTN24 =*
- .BYT $03,$1E,$03,$1E,$03,$2A,$03,$2A
- .BYT $03,$1E,$03,$1E,$03,$2A,$03,$2A
- .BYT $FF
-
- PTN25 =*
- .BYT $83,$05,$26,$01,$4A,$01,$34,$03
- .BYT $29,$03,$4C,$03,$4A,$03,$31,$03
- .BYT $4A,$03,$24,$03,$22,$01,$46,$01
- .BYT $30,$03,$25,$03,$48,$03,$46,$03
- .BYT $2D,$03,$46,$03,$24,$FF
-
- PTN0B =*
- .BYT $83,$02,$1A,$03,$1A,$03,$26,$03
- .BYT $26,$03,$1A,$03,$1A,$03,$26,$03
- .BYT $26,$FF
-
- PTN0C =*
- .BYT $03,$13,$03,$13,$03,$1D,$03,$1F
- .BYT $03,$13,$03,$13,$03,$1D,$03,$1F
- .BYT $FF
-
- PTN26 =*
- .BYT $87,$02,$1A,$87,$03,$2F,$83,$02
- .BYT $26,$03,$26,$87,$03,$2F,$FF
-
- PTN10 =*
- .BYT $07,$1A,$4F,$47,$FF
-
- PTN0E =*
- .BYT $03,$1F,$03,$1F,$03,$24,$03,$26
- .BYT $07,$13,$47,$FF
-
- PTN30 =*
- .BYT $BF,$0F,$32,$0F,$32,$8F,$90,$30
- .BYT $3F,$32,$13,$32,$03,$32,$03,$35
- .BYT $03,$37,$3F,$37,$0F,$37,$8F,$90
- .BYT $30,$3F,$32,$13,$32,$03,$2D,$03
- .BYT $30,$03,$32,$FF
-
- PTN31 =*
- .BYT $0F,$32
- .BYT $AF,$90,$35,$0F,$37,$A7,$99,$37
- .BYT $07,$35,$3F,$32,$13,$32,$03,$32
- .BYT $A3,$E8,$35,$03,$37,$0F,$35,$AF
- .BYT $90,$37,$0F,$37,$A7,$99,$37,$07
- .BYT $35,$3F,$32,$13,$32,$03,$2D,$A3
- .BYT $E8,$30,$03,$32,$FF
-
- PTN32 =*
- .BYT $07,$32,$03
- .BYT $39,$13,$3C,$A7,$9A,$37,$A7,$9B
- .BYT $38,$07,$37,$03,$35,$03,$32,$03
- .BYT $39,$1B,$3C,$A7,$9A,$37,$A7,$9B
- .BYT $38,$07,$37,$03,$35,$03,$32,$03
- .BYT $39,$03,$3C,$03,$3E,$03,$3C,$07
- .BYT $3E,$03,$3C,$03,$39,$A7,$9A,$37
- .BYT $A7,$9B,$38,$07,$37,$03,$35,$03
- .BYT $32,$AF,$90,$3C,$1F,$3E,$43,$03
- .BYT $3E,$03,$3C,$03,$3E,$FF
-
- PTN33 =*
- .BYT $03,$3E
- .BYT $03,$3E,$A3,$E8,$3C,$03,$3E,$03
- .BYT $3E,$03,$3E,$A3,$E8,$3C,$03,$3E
- .BYT $03,$3E,$03,$3E,$A3,$E8,$3C,$03
- .BYT $3E,$03,$3E,$03,$3E,$A3,$E8,$3C
- .BYT $03,$3E,$AF,$91,$43,$1F,$41,$43
- .BYT $03,$3E,$03,$41,$03,$43,$03,$43
- .BYT $03,$43,$A3,$E8,$41,$03,$43,$03
- .BYT $43,$03,$43,$A3,$E8,$41,$03,$43
- .BYT $03,$45,$03,$48,$A3,$FD,$45,$03
- .BYT $44,$01,$43,$01,$41,$03,$3E,$03
- .BYT $3C,$03,$3E,$2F,$3E,$BF,$98,$3E
- .BYT $43,$03,$3E,$03,$3C,$03,$3E,$FF
-
- PTN34 =*
- .BYT $03,$4A,$03,$4A,$A3,$F8,$48,$03
- .BYT $4A,$03,$4A,$03,$4A,$A3,$F8,$48
- .BYT $03,$4A,$FF
-
- PTN35 =*
- .BYT $01,$51,$01,$54,$01
- .BYT $51,$01,$54,$01,$51,$01,$54,$01
- .BYT $51,$01,$54,$01,$51,$01,$54,$01
- .BYT $51,$01,$54,$01,$51,$01,$54,$01
- .BYT $51,$01,$54,$FF
-
- PTN36 =*
- .BYT $01,$50,$01,$4F
- .BYT $01,$4D,$01,$4A,$01,$4F,$01,$4D
- .BYT $01,$4A,$01,$48,$01,$4A,$01,$48
- .BYT $01,$45,$01,$43,$01,$44,$01,$43
- .BYT $01,$41,$01,$3E,$01,$43,$01,$41
- .BYT $01,$3E,$01,$3C,$01,$3E,$01,$3C
- .BYT $01,$39,$01,$37,$01,$38,$01,$37
- .BYT $01,$35,$01,$32,$01,$37,$01,$35
- .BYT $01,$32,$01,$30,$FF
-
- PTN37 =*
- .BYT $5F,$5F,$5F
- .BYT $47,$83,$0E,$32,$07,$32,$07,$2F
- .BYT $03,$2F,$07,$2F,$97,$0B,$3A,$5F
- .BYT $5F,$47,$8B,$0E,$32,$03,$32,$03
- .BYT $2F,$03,$2F,$47,$97,$0B,$3A,$5F
- .BYT $5F,$47,$83,$0E,$2F,$0B,$2F,$03
- .BYT $2F,$03,$2F,$87,$0B,$30,$17,$3A
- .BYT $5F,$8B,$0E,$32,$0B,$32,$0B,$2F
- .BYT $0B,$2F,$07,$2C,$07,$2C,$FF
-
- PTN38 =*
- .BYT $87
- .BYT $0B,$34,$17,$3A,$5F,$5F,$84,$0E
- .BYT $32,$04,$32,$05,$32,$04,$2F,$04
- .BYT $2F,$05,$2F,$47,$97,$0B,$3A,$5F
- .BYT $5F,$84,$0E,$32,$04,$32,$05,$32
- .BYT $04,$2F,$04,$2F,$05,$2F,$FF
-
- PTN2F =*
- .BYT $03,$1A,$03,$1A,$03
- .BYT $24,$03,$26,$03,$1A,$03,$1A,$03
- .BYT $18,$03,$19,$03,$1A,$03,$1A,$03
- .BYT $24,$03,$26,$03,$1A,$03,$1A,$03
- .BYT $18,$03,$19,$03,$18,$03,$18,$03
- .BYT $22,$03,$24,$03,$18,$03,$18,$03
- .BYT $16,$03,$17,$03,$18,$03,$18,$03
- .BYT $22,$03,$24,$03,$18,$03,$18,$03
- .BYT $16,$03,$17,$03,$13,$03,$13,$03
- .BYT $1D,$03,$1F,$03,$13,$03,$13,$03
- .BYT $1D,$03,$1E,$03,$13,$03,$13,$03
- .BYT $1D,$03,$1F,$03,$13,$03,$13,$03
- .BYT $1D,$03,$1E,$03,$1A,$03,$1A,$03
- .BYT $24,$03,$26,$03,$1A,$03,$1A,$03
- .BYT $18,$03,$19,$03,$1A,$03,$1A,$03
- .BYT $24,$03,$26,$03,$1A,$03,$1A,$03
- .BYT $18,$03,$19,$FF
-
-
- ;====================================
- ;INSTRUMENTS
- ;====================================
-
- INSTR =*
- .BYT $80,$09,$41,$48,$60,$03,$81,$00
- .BYT $00,$08,$81,$02,$08,$00,$00,$01
- .BYT $A0,$02,$41,$09,$80,$00,$00,$00
- .BYT $00,$02,$81,$09,$09,$00,$00,$05
- .BYT $00,$08,$41,$08,$50,$02,$00,$04
- .BYT $00,$01,$41,$3F,$C0,$02,$00,$00
- .BYT $00,$08,$41,$04,$40,$02,$00,$00
- .BYT $00,$08,$41,$09,$00,$02,$00,$00
- .BYT $00,$09,$41,$09,$70,$02,$5F,$04
- .BYT $00,$09,$41,$4A,$69,$02,$81,$00
- .BYT $00,$09,$41,$40,$6F,$00,$81,$02
- .BYT $80,$07,$81,$0A,$0A,$00,$00,$01
- .BYT $00,$09,$41,$3F,$FF,$01,$E7,$02
- .BYT $00,$08,$41,$90,$F0,$01,$E8,$02
- .BYT $00,$08,$41,$06,$0A,$00,$00,$01
- .BYT $00,$09,$41,$19,$70,$02,$A8,$00
- .BYT $00,$02,$41,$09,$90,$02,$00,$00
- .BYT $00,$00,$11,$0A,$FA,$00,$00,$05
- .BYT $00,$08,$41,$37,$40,$02,$00,$00
- .BYT $00,$08,$11,$07,$70,$02,$00,$00
-
- .END
-
- =============================================================================
- ┌╨═3 AND ┌├├╨ ┼NHANCEMENTS FOR ├╨/═ ╨LUS FROM ╙IMEON ├RAN
- BY ╥ANDY ╫INCHESTER (RANDY@MIT.EDU)
-
- ╧PERATING ╙YSTEM ├OMPONENTS
-
- ╘HE ├╨/═ ╨LUS OPERATING SYSTEM CONSISTS OF THREE MODULES. ╘HE ├├╨ (├ONSOLE
- ├OMMAND ╨ROCESSOR), IS THE PART OF ├╨/═ THAT YOU SEE WHEN YOU FIRST BOOT THE
- SYSTEM. ╘HE ├├╨ PRINTS THE ┴> DISK PROMPT, ACCEPTS USER INPUT, AND LOADS
- COMMANDS FROM DISK.
-
- ╘HE ┬─╧╙ (┬ASIC ─ISK ╧PERATING ╙YSTEM) HANDLES THE ├╨/═ FUNCTIONS OF DISK,
- CONSOLE, AND PRINTER INPUT/OUTPUT, AND THE TASKS OF FILE MANAGEMENT.
-
- ╘HE ┬╔╧╙ (┬ASIC ╔NPUT ╧UTPUT ╙YSTEM) DOES THE REAL INPUT/OUTPUT WORK FOR THE
- ┬─╧╙. ╘HE ┬╔╧╙ CONTAINS THE CODE CUSTOMIZED FOR THE ├╨/═ HARDWARE THAT YOU'RE
- USING. ╧N THE ├128, THE ┬╔╧╙ CONTAINS THE ROUTINES FOR DRIVING THE 40 AND 80
- COLUMN SCREENS, USING THE ╥┼╒ AS A ╥┴═ DRIVE, AND READING/WRITING SEVERAL
- DIFFERENT DISK FORMATS ON 1571 AND 1581 DRIVES. ╘HE ┬╔╧╙ CAN BE THOUGHT OF AS
- A COLLECTION OF DEVICE DRIVERS THAT ARE SPECIFIC TO YOUR COMPUTER.
-
-
- ╫HAT'S ╬EW - ┬╔╧╙-╥6
-
- ┬╔╧╙-╥6 (├128 ┬╔╧╙ MODIFIED BY ╥ANDY ╫INCHESTER AND OTHERS) IS THE LATEST OF
- THE MODIFIED VERSIONS OF THE ├128 ├╨/═ ┬╔╧╙. ═OST OF THE CHANGES TO THE ┬╔╧╙
- RESULT IN FASTER PROCESSING SPEED. ╞OR EXAMPLE, ALL THE CODE FOR DRIVING A 40
- COLUMN SCREEN HAS BEEN REMOVED. ┴LMOST EVERYONE USING ├╨/═ IS GOING TO BE
- USING IT IN 80 COLUMNS ANYWAY. ├UTTING THIS CODE TAKES A BIG LOAD OFF THE
- SYSTEM AND INCREASES OVERALL SPEED BY ABOUT 15%. ╙IMILARLY, THE INTERRUPT
- DRIVEN ╥╙232 HAS BEEN SET FROM 300 TO 75 BAUD. ╘HE HIGHER THE BAUD RATE, THE
- MORE PROCESSOR TIME IS REQUIRED TO SERVICE ╥╙232. ╙INCE THE ╥╙232 CODE IS
- ALWAYS RUNNING, DECREASING THE BAUD RATE FREES UP CYCLES THAT THE PROCESSOR
- NEEDS TO SERVICE ╥╙232. ╘HIS DOESN'T AFFECT THE OPERATION OF TERMINAL PROGRAMS
- WHICH EXPLICITLY SET THE BAUD RATE WHEN THEY START UP.
-
- ╧THER FEATURES OF ┬╔╧╙-╥6 INCLUDE A SCREEN DUMP FUNCTION, COMMENTED SOURCE TO
- ASSIST THE PROGRAMMER IN PRODUCING CUSTOMIZED SYSTEMS, AND SUPPORT FOR
- ADDITIONAL DISK FORMATS. ╙OME OF THE NEW DISK FORMATS INCLUDE ├OMMODORE'S
- STANDARD 1581 ├╨/═ FORMAT, ═┴╪╔ 71 (398╦ ON 5.25" DISKS), AND ╟╨ 1581 (796╦ ON
- 3.5" DISKS).
-
- ├128 ├╨/═ PROGRAMMERS WHO WANT TO ADD OR CHANGE OPERATING SYSTEM FEATURES
- SHOULD TRY TO MAKE CHANGES TO THE ┬╔╧╙. ╞OR ONE THING, ┬╔╧╙ SOURCE CODE IS
- AVAILABLE, BUT NOT AVAILABLE FOR THE ┬─╧╙ OR ├├╨. (╙OURCE CODE IS NOT
- AVAILABLE FOR THE ┬─╧╙ AND ├├╨ REPLACEMENTS MENTIONED IN THIS ARTICLE EITHER).
- ┴NOTHER REASON IS THAT THE ┬─╧╙ AND ├├╨ ARE INTENDED TO BE "INVARIABLE"
- OPERATING SYSTEM COMPONENTS - THAT IS, THEY ARE IDENTICAL FOR DIFFERENT
- COMPUTERS THAT RUN ├╨/═ ╨LUS. ┴ STUDY OF THE ┬╔╧╙ SOURCE CODE WILL REVEAL
- SEGMENTS OF CODE THAT CAN BE REMOVED IF THEY AREN'T NEEDED, AND WILL PROVIDE
- HINTS AS TO NEW FEATURES THAT CAN BE ADDED.
-
- ╘HE DISTRIBUTION PACKAGE, ┬╔╧╙-╥6.╠┬╥ INCLUDES DOCUMENTATION, SOURCE CODE,
- UTILITIES, AND SUPPORT FILES. ┬╔╧╙-╥6.╠┬╥ ALSO CONTAINS THE LATEST VERSION OF
- ┌╨═3. [┼D. ╬OTE: ╘HE FILES MENTIONED IN THIS ARTICLE CAN BE FOUND VIA
- ANONYMOUS ╞╘╨ OR VIA THE MAILSERVER THROUGH THE "PSEND" COMMAND.]
-
-
- ┌╨═3 ╞EATURES
-
- ┌╨═3 IS A REPLACEMENT ┬─╧╙ BY ╙IMEON ├RAN. ╙INCE THE ┬─╧╙ IS SUPPOSED TO BE
- "INVARIABLE," WHY WOULD ANYONE WANT TO REPLACE IT? ╘HE ANSWERS TO THAT ARE
- PRETTY TYPICAL - BUG FIXES, SPEED ENHANCEMENTS, AND NEW FEATURES! ┌╨═3
- INTERACTS WITH THE ┬╔╧╙ AND ├├╨ IN MOST OF THE SAME WAYS AS THE STANDARD
- ─IGITAL ╥ESEARCH ┬─╧╙, AND FOR THE MOST PART APPEARS TO BE A CLONE OF THE
- STANDARD ┬─╧╙. ╘HE STANDARD ┬─╧╙ WAS CODED IN 8080 ASSEMBLY TO MAKE IT
- COMPATIBLE WITH MACHINES THAT USE THE OLDER SLOWER 8080 PROCESSOR. ╓ERY FEW
- (IF ANY) ├╨/═ ╨LUS MACHINES USED THE 8080. ┌╨═3 IS CODED IN FASTER, COMPACT ┌80
- ASSEMBLY LANGUAGE, FOR THE ┌80 PROCESSOR THAT IS AT THE HEART OF MOST ├╨/═ ╨LUS
- COMPUTERS (INCLUDING THE ├128).
-
- ╘HE ┌╨═3 DOCUMENTATION DETAILS FIXES TO SEVERAL BUGS THAT HAVE PLAGUED ├╨/═
- ╨LUS SINCE DAY ONE. ┴LTHOUGH THE BUGS SOUND SOMEWHAT OBSCURE, THERE'S NO
- TELLING WHEN ONE MIGHT CAUSE PROBLEMS.
-
- ┌╨═3 IS MUCH FASTER THAN STANDARD ├╨/═ ╨LUS. ╘HE INCREASED SPEED SHOULD BE
- OBVIOUS AFTER USING IT FOR A SHORT TIME.
-
- ╘HE NEW FEATURES OFFERED BY ┌╨═3 ARE REMARKABLE. ╘HREE CLOSELY RELATED
- FEATURES ARE ENHANCED COMMAND LINE EDITING, A HISTORY BUFFER THAT STORES AND
- RECALLS MULTIPLE COMMANDS, AND ┴UTOMATIC ├OMMAND ╨ROMPTING. ╘HESE FEATURES
- WORK IN CONCERT TO PROVIDE A FLEXIBLE AND CONVENIENT COMMAND LINE INTERFACE.
- ├OMMAND LINE EDITING NOW HAS 20 CONTROL KEY FUNCTIONS FOR MOVING OR DELETING BY
- CHARACTERS OR WHOLE WORDS. ╘HE MOST RECENT COMMAND LINES (UP TO 250
- CHARACTERS) ARE STORED IN THE HISTORY BUFFER, AND CAN BE RECALLED AND REUSED,
- OR REEDITED IF NECESSARY. ┴UTOMATIC ├OMMAND ╨ROMPTING IS BEST APPRECIATED IF
- SEEN IN ACTION. ╔T'S SIMILAR TO COMMAND LINE COMPLETION IN ╒NIX, EXCEPT THAT
- IT'S AUTOMATIC, WITH MATCHING RESPONSES COMING DIRECTLY FROM THE HISTORY
- BUFFER. ╔F YOU'VE RECENTLY ENTERED A LONG COMMAND LINE WITH LOTS OF OPTIONS,
- AND NEED TO REUSE IT (OR EDIT IT SLIGHTLY FIRST), TYPING THE FIRST FEW UNIQUE
- CHARACTERS WILL BRING BACK THE ENTIRE COMMAND FROM THE HISTORY BUFFER IF IT'S
- STILL INTACT. ┴UTOMATIC ├OMMAND ╨ROMPTING IS SO RADICAL THAT IT MIGHT TAKE
- SOME GETTING USED TO. ╔F YOU DON'T THINK YOU CAN GET USED TO IT, IT CAN BE SHUT
- OFF.
-
- ╘HE LATEST VERSION OF ┌╨═3, ┌╨═3╬08.┴╥╦, IS INCLUDED INSIDE ┬╔╧╙-╥6.╠┬╥, AND
- CAN ALSO BE FOUND AS A SEPARATE FILE.
-
-
-
- ┌├├╨ ─OCUMENTATION, ╓ERSION 1.0
-
- ╘HE REMAINDER OF THIS ARTICLE WILL DESCRIBE ┌├├╨ AND HOW TO CONFIGURE A SYSTEM
- DISK TO GET A FULLY FUNCTIONAL ┌╨═3/┌├├╨ SYSTEM UP AND RUNNING. ┬╔╧╙-╥6 AND
- ┌╨═3 BOTH COME WITH ENOUGH DOCUMENTATION TO KEEP YOU BUSY FOR HOURS, BUT ┌├├╨
- HAS NEVER BEEN DISTRIBUTED BY ITSELF, BECAUSE UP UNTIL THIS ARTICLE, THERE HAS
- NOT BEEN ANY DOCUMENTATION FOR IT. ═OST OF THE DOCUMENTATION THAT FOLLOWS WAS
- FIGURED OUT THROUGH EXPERIMENTATION AND LATER VERIFIED BY ╙IMEON ├RAN.
-
- ┌├├╨ ╞EATURES
-
- ╘HIS DOCUMENTATION IS PROVIDED TO ASSIST THE USER IN GETTING A ┌├├╨ SYSTEM UP
- AND RUNNING. ╔T IS NOT AN EXHAUSTIVE COURSE ON ┌- ╙YSTEM OR ┌├╨╥. ╘HE
- FOLLOWING LIST DETAILS WHICH ┌├╨╥ FEATURES ARE PROVIDED WITH ┌├├╨, AND WHICH
- ONES AREN'T.
-
- * ┌├╨╥ 3.3 COMPATIBILITY. ┌├├╨ CAN RUN A WIDE RANGE OF UTILITIES AN
- APPLICATIONS CREATED FOR ┌├╨╥ 3.3 AND ┌├╨╥ 3.4.
-
- * ╘├┴╨. ┴ ┌3╘ TERMCAP FILE DESCRIBING TERMINAL CHARACTERISTICS CAN BE
- LOADED INTO THE SYSTEM. ┌-╙YSTEM PROGRAMS MAKE USE OF THE ╘├┴╨ FOR OUTPUT
- TO THE SCREEN - A BIG IMPROVEMENT OVER THE OLD METHOD OF PATCHING
- INDIVIDUAL PROGRAMS WITH TERMINAL CONTROL CODES. ╘├┴╨ FILES ARE LOADED BY
- THE ┌├├╨ ╠╧┴─╙┼╟ COMMAND.
-
- * ╬AMED DIRECTORIES. ╒SER AREAS CAN BE ASSIGNED NAMES. ╒P TO 12 USER
- AREAS CAN BE ASSIGNED NAMES. ╬AMED ─IRECTORY ╥EGISTERS (*.╬─╥ FILES) ARE
- LOADED BY THE ┌├├╨ ╠╧┴─╙┼╟ COMMAND.
-
- * ├OMMAND ╙EARCH ╨ATH. ┌├├╨ WILL SEARCH FOR COMMANDS ALONG A USER DEFINED
- SEARCH PATH. ╒P TO SIX PATH ELEMENTS (DIRECTORIES) CAN BE DEFINED.
-
- * ┼NVIRONMENT BLOCK. ├ONTAINS ╘├┴╨, ╬AMED ─IRECTORY, AND ╨ATH INFORMATION.
- ┴LSO INCLUDES A MAP OF ACTIVE DISK DRIVES AND OTHER SYSTEM INFORMATION.
- ╘HE ENVIRONMENT BLOCK CAN BE VIEWED WITH THE ┌-╙YSTEM ╙╚╧╫ UTILITY.
-
- * ╞LOW CONTROL. ├ONDITIONAL PROCESSING FOR BATCH FILES. ╥ELIES ON
- ┌-╙YSTEM ╔╞.├╧═ FOR SETTING THE FLOW STATE. ╧THER FLOW CONTROL COMMANDS
- (╞╔, ┼╠╙┼, ╪╔╞, ╧╥, ┴╬─) ARE RESIDENT.
-
- * ═ULTIPLE COMMANDS CAN BE ENTERED ON THE COMMAND LINE. ╘HE COMMAND LINE
- BUFFER WILL HOLD UP TO 225 CHARACTERS. ├OMMANDS SHOULD BE SEPARATED BY
- SEMICOLONS.
-
- * ┼XTENDED ├OMMAND ╨ROCESSOR. ╔F A COMMAND IS NOT A BUILT-IN FLOW COMMAND,
- RESIDENT COMMAND, OR LOCATED ON DISK ALONG THE SEARCH PATH, THE COMMAND
- LINE IS PASSED TO AN EXTENDED COMMAND PROCESSOR. ┴ TYPICAL EXTENDED
- COMMAND PROCESSOR IS ┴╥╒╬┌, A SOPHISTICATED BATCH FILE EXECUTOR WITH ALIAS
- FEATURES. ╘O USE A PROGRAM AS AN EXTENDED COMMAND PROCESSOR, RENAME IT TO
- ├═─╥╒╬.├╧═ AND PLACE IT IN THE ╥╧╧╘ DIRECTORY OF YOUR BOOT DISK.
-
- * ┼RROR HANDLER. ╔N THE EVENT THAT THE EXTENDED COMMAND PROCESSOR CAN'T
- HANDLE A COMMAND, CONTROL IS PASSED TO AN ERROR HANDLER. ┼RROR HANDLERS
- GIVE INFORMATION ABOUT THE ERROR (INSTEAD OF THE USELESS ├╨/═ "?" MESSAGE)
- AND ALLOW THE COMMAND LINE TO BE EDITED AND REUSED.
-
- * ╥ESIDENT COMMANDS. ╘HE FOLLOWING COMMANDS ARE BUILT IN:
- ├╠╙ - CLEARS THE SCREEN
- ╬╧╘┼ - TEXT FOLLOWING THE ╬╧╘┼ COMMAND IS TREATED AS A COMMENT.
- ╞╔ - ╞LOW CONTROL: TERMINATE THE CURRENT
- ╔╞ LEVEL ┼╠╙┼ - ╞LOW CONTROL: TOGGLE THE FLOW STATE
- ╪╔╞ - ╞LOW CONTROL: EXIT ALL PENDING ╔╞ LEVELS
- ╧╥ - ╞LOW CONTROL: ╧╥ ╔╞ TESTS TO SET FLOW STATE
- ┴╬─ - ╞LOW CONTROL: ┴╬─ ╔╞ TESTS TO SET FLOW STATE
-
- * ╙HELL STACK. ╒P TO FOUR SHELL LEVELS CAN BE DEFINED. ┌-╙YSTEM PROVIDES
- A CHOICE OF SEVERAL DIFFERENT SHELLS. ┴PPLICATIONS SUCH AS TERMINAL
- PROGRAMS AND WORD PROCESSORS CAN ALSO BE ASSIGNED SHELL STATUS.
-
- * ┌├├╨ USES THE ╠╧┴─╙┼╟ COMMAND FOR DIRECT LOADING OF ╥╙╪ FILES THAT HAVE
- NOT BEEN ╟┼╬├╧═ED. ┼XAMPLE: ╠╧┴─╙┼╟ ╙┴╓┼.╥╙╪ LOADS ╙┴╓┼.╥╙╪.
-
- ╘HERE ARE SOME THINGS THAT ┌3╨LUS WILL DO THAT ┌├├╨ WON'T DO.
-
- - ┌├├╨ DOES NOT SUPPORT A ╞LOW ├OMMAND ╨ACKAGE (╞├╨). ╔T RELIES ON THE
- TRANSIENT ╔╞ COMMAND. ╧THER FLOW COMMANDS (╞╔, ┼╠╙┼, ╪╔╞, ╧╥, ┴╬─) ARE
- RESIDENT IN ┌├├╨.
-
- - ┴ ╥ESIDENT ├OMMAND ╨ACKAGE (╥├╨) IS NOT IMPLEMENTED. ├╠╙ AND ╬╧╘┼ ARE
- RESIDENT IN ┌├├╨. ┴LL OTHER COMMANDS MUST BE LOADED FROM DISK. ╘HIS ISN'T
- AS MUCH OF A HANDICAP AS IT MIGHT SOUND IF YOU HAVE A FAST ╥┴═ DRIVE, SUCH
- AS A ├┬═ 17XX ╥┼╒, ╤UICK ┬ROWN ┬OX, OR ╥┴═╠INK.
-
- - ┌├├╨ CAN NOT LOAD TYPE 4 PROGRAMS (USED WITH ┌├╨╥ 3.4). ╔T LOADS
- STANDARD ├╧═ FILES AT 100╚, AND TYPE 3 PROGRAMS THAT LOAD HIGHER IN MEMORY.
- ═OST TYPE 4 PROGRAMS HAVE TYPE 3 OR ├╧═ EQUIVALENTS.
-
- - ┌├├╨ CAN NOT REEXECUTE LOADED PROGRAMS. ╘HIS TRICK IS USUALLY PERFORMED
- ON ┌-╙YSTEMS WITH A ╟╧ COMMAND THAT JUMPS TO 100╚. ╙INCE ┌├├╨ ALSO LOADS AT
- 100╚, A ╟╧ COMMAND WOULD ONLY RESTART ┌├├╨.
-
-
- ╘HE ╞ILES
-
- ╘HREE FILES ARE INCLUDED IN ┌├├╨.┴╥╦:
-
- ╞ILE NAME ╙IZE ─ESCRIPTION
- ============ ==== ==========================================
- ├├╨ .├╧═ 3K ┌├├╨ REPLACEMENT FOR ├├╨.├╧═
- ╠╧┴─╙┼╟ .├╧═ 3K ╠OADER FOR NAMED DIRECTORIES AND TERMCAPS
- ┌╔╬╙╘┴╠ .┌╨═ 1K ╙EGMENT CONTAINING ENVIRONMENT INFORMATION
-
-
- ╟ETTING ╙TARTED - ╨REPARING A ┬OOT ─ISK
-
- ╞ORMAT A ├OMMODORE ├╨/═ FORMAT 5.25 OR 3.5 INCH DISK. ┌├├╨ MUST BE BOOTED FROM
- DEVICE 8 (├╨/═ DRIVE ┴).
-
- ├OPY THE FILES FROM ┌├├╨.┴╥╦ TO USER AREA 0 OF THE NEWLY FORMATTED DISK.
-
- ├OPY ├╨═+.╙┘╙ TO USER 0 OF THE BOOT DISK. ╘HE ├╨═+.╙┘╙ MUST HAVE BEEN
- GENERATED USING THE ┬─╧╙ SEGMENTS FROM ┌╨═3.
-
- ╠OCATE A COPY OF A ┌-╙YSTEM ALIAS UTILITY. ┴ GOOD ONE IS ╙┴╠╔┴╙16, ALTHOUGH
- OTHERS SHOULD WORK ALSO. ├OPY IT TO USER 0 OF THE BOOT DISK.
-
- ┴T THIS POINT, HIT THE RESET SWITCH AND BOOT THE SYSTEM WITH THE NEW DISK.
- ┴FTER THE SYSTEM BOOTS, YOU WON'T BE ABLE TO DO MUCH WITH IT. ╘HE ONLY
- RESIDENT COMMANDS ARE ├╠╙ AND ╬╧╘┼, AND ┌├├╨ CAN ONLY LOCATE COMMANDS IF THEY
- ARE PREFIXED WITH THE DRIVE AND USER NUMBER.
-
- ╘HE NEXT STEP IS TO CREATE A STARTUP ALIAS. ╫HEN ┌├├╨ BOOTS, IT LOOKS FOR A
- FILE NAMED ╙╘┴╥╘┌╨═.├╧═ AND EXECUTES COMMANDS FROM IT. ╙╘┴╥╘┌╨═.├╧═ IS CREATED
- WITH A ┌├╨╥ ALIAS UTILITY. ╚ERE IS A LISTING OF A ╙╘┴╥╘┌╨═.├╧═ CREATED WITH
- ╙┴╠╔┴╙:
-
- =============================================================
-
- ┴0>╙┴╠╔┴╙ ╙╘┴╥╘┌╨═
-
- 15: ; ╠OGS THE ╥╧╧╘ DIRECTORY (┴15) ON THE
- ; CURRENT DRIVE.
-
- ╤─ ╞/╞ ; ╔NSTALLS ╤UICK ┬ROWN ┬OX RAMDISK DRIVER.
-
- ╠╧┴─╙┼╟ ╬┴═┼╙.╬─╥ ├128-╪┬╥.┌3╘
- ; ╠╧┴─╙┼╟ LOADS THE ╬AMED ─IRECTORY ╥EGISTER
- ; AND ╘├┴╨.
- ; ─IRECTORIES CAN NOW BE REFERRED TO BY
- ; NAME, AS IN THE NEXT COMMAND:
-
- ╙┼╘╨╘╚10 /├ ├╧══┴╬─╙ ╥┼╒ 1581 $$$$ $$0 ╥╧╧╘
- ; ╙┼╘╨╘╚ SETS THE COMMAND SEARCH PATH.
- ; ╘HE /C OPTION FIRST CLEARS ANY EXISTING PATH.
- ; ─IRECTORIES ARE THEN LISTED IN THE
- ; ORDER SEARCHED. ╔N THIS CASE, ├╧══┴╬─╙
- ; IS A 64╦ ╤┬┬ RAMDISK (DRIVE/USER ╞0) WHERE
- ; FREQUENTLY USED COMMANDS ARE STORED. ╥┼╒ IS
- ; A 1750 ╥┼╒ (DRIVE/USER ═0). 1581 IS A 1581
- ; DRIVE, (DRIVE/USER ├15) WHERE SOME 700╦
- ; OF UTILITIES AND APPLICATIONS ARE
- ; LOCATED. $$$$ REFERS TO THE CURRENTLY
- ; LOGGED DRIVE AND USER AREA. $$0 REFERS
- ; TO USER AREA 0 OF THE CURRENT DRIVE.
- ; ╘HE ╥╧╧╘ DIRECTORY IS ON DRIVE ┴, USER
- ; 15, WHERE STARTUP UTILITIES AND SYSTEM
- ; FILES CAN BE FOUND.
-
- 1571 [┴┬ ; ╘HIS SPEEDS UP 1571 DISK DRIVES ┴ AND ┬
- ; BY SHUTTING OFF THE REDUNDANT WRITE VERIFY.
-
- ┴╒╘╧╘╧╟ ╧╬ ; ╘URNS ON KEYBOARD CONTROL OF ┌╨═3 ┴UTO
- ; ├OMMAND ╨ROMPTING. ┴UTO ├OMMAND
- ; ╨ROMPTING IS TOGGLED BY ENTERING ├╘╥╠-╤.
-
- ├╧══┴╬─╙: ; ╠OGS THE COMMANDS DIRECTORY.
-
- ╔╞ ~┼╪╔╙╘ ├╨.* ; ╘EST TO SEE IF COMMANDS ARE LOADED.
- ; ╘HIS LINE READS: "╔F THE ├╨ COMMAND
- ; DOES NOT EXIST . . ." AND SETS THE FLOW
- ; STATE TO TRUE IF THE FILE DOESN'T EXIST.
- ╤─ ╔/╞ ; ". . . THEN INITIALIZE THE ╤┬┬ . . ."
- ├1:├╨ ├1:*.* ╞0:
- ; ". . . COPY ALL OF THE COMMANDS IN
- ; DRIVE/USER ├1 TO THE COMMANDS (╞0)
- ; DIRECTORY . . ."
- ╞╔ ; ". . . END IF."
-
- ╥╧╧╘: ; ╠OG THE ROOT DIRECTORY (┴15).
-
- ├╨ ├:┌╞*.* ═0: ; ├OPY ┌╞╔╠┼╥.├╧═ AND ┌╞╔╠┼╥.├═─ TO THE
- ; ╥┼╒ DIRECTORY (═0).
-
- ╓┼╥╥╧╥ ; ╔NSTALL ╓┼╥╥╧╥ ERROR HANDLER.
-
- ─┴╘┼ ╙ ; ╙ET THE SYSTEM TIME AND DATE.
-
- ┌╞ ; ╔NVOKE ┌╞╔╠┼╥ AS A SHELL.
-
- =============================================================
-
- ╧F COURSE, YOUR ╙╘┴╥╘┌╨═ ALIAS WILL VARY DEPENDING ON THE HARDWARE YOU NEED TO
- SUPPORT, YOUR SOFTWARE PREFERENCES, AND YOUR WORK HABITS. ╘HIS ALIAS IS CLOSE
- TO THE UPWARD SIZE LIMIT THAT ┌├├╨ CAN HANDLE BASED ON THE CAPACITY OF THE
- MULTIPLE COMMAND BUFFER. ┴T THE VERY LEAST, ╔ RECOMMEND AN ALIAS THAT WILL SET
- UP A SEARCH PATH AND LOAD A ╘├┴╨.
-
- ┴CTUALLY, ╔ PUT THE CART BEFORE THE HORSE IN THIS EXAMPLE. ╔F YOU TRY TO
- REBOOT YOUR SYSTEM WITH THE ╠╧┴─╙┼╟ COMMAND AS LISTED, YOU'LL NOTICE THAT YOU
- DON'T HAVE A ╬┴═┼╙.╬─╥ FILE. ╘HERE ISN'T ONE DISTRIBUTED WITH ┌├├╨ EITHER.
- ┌-╙YSTEM UTILITIES WON'T LET YOU EDIT THE ╬─╥ EITHER, SINCE THE BUFFER FOR IT
- HASN'T BEEN CREATED YET. ╘HIS TURNED OUT TO BE A NASTY CHICKEN/EGG SITUATION,
- HOPEFULLY SOLVED BY THE INCLUSION OF A SAMPLE ╬┴═┼╙.╬─╥ FILE CONTAINING SIMPLY
- ┴0:╙┘╙╘┼═ AND ┴15:╥╧╧╘.
-
- ┴T THIS POINT, YOU SHOULD HAVE A MOSTLY FUNCTIONING ┌├├╨ SYSTEM DISK. ╨RESS
- RESET AND BOOT IT UP. ┘OU MIGHT WANT TO CORRECT ANY PROBLEMS WITH IT OR TWEAK
- IT TO PERFECTION BEFORE MOVING ON.
-
-
- ╠IST OF ┌-╙YSTEM ╒TILITIES FOR ┌├├╨
-
- ╙OME OF THE FOLLOWING UTILITIES ARE ESSENTIAL, OTHERS ARE NICE TO HAVE. ╘HE
- VERSION NUMBERS LISTED ARE THE LATEST KNOWN VERSIONS AT THE TIME THAT THIS
- DOCUMENTATION WAS WRITTEN. ╒TILITIES CAN BE FOUND ON ┌╬ODE ┬┬╙S, AND SOME OF
- THEM ARE AVAILABLE ON ╙IMTEL20 OR ITS MIRROR SITES. ╙OME OF THE MORE IMPORTANT
- UTILITIES WILL BE UPLOADED TO CCO.CALTECH.EDU.
-
- ╙┴╠╔┴╙16 - ALREADY MENTIONED IN THE EXAMPLE ABOVE. ╙┴╠╔┴╙ (OR ONE OF
- THE OTHER ┌├╨╥ ALIAS UTILITIES) ARE ESSENTIAL.
-
- ┴╥├╧╨┘ - NOT A ┌├╨╥ UTILITY, BUT ONE OF THE BEST ├╨/═ FILE COPIERS
- EVER.
-
- ╙─138┬ - EXCELLENT ─╔╥ECTORY UTILITY. ╙─ OFFERS MANY DIFFERENT
- TYPES OF SORTS, LIST FORMATS, ETC., DISPLAYS DATE STAMPS, AND SUPPORTS
- OUTPUT TO A FILE.
-
- ═╦─╔╥32 - UTILITY FOR MANIPULATING DIRECTORY NAMES AND ╬AMED
- ─IRECTORY ╥EGISTER (*.╬─╥) FILES.
-
- ┼╥┴╙┼57 - ERASES FILES.
-
- ┌╞╔╠┼╥10 - A FILE MANAGEMENT SHELL THAT CAN LAUNCH APPLICATIONS. ╔T
- IS PROGRAMMABLE IN THAT IT CAN EXECUTE USER DEFINED MACROS FROM A
- FILE. ═ULTIPLE FILES CAN BE "TAGGED" AND OPERATED ON BY OTHER
- PROGRAMS. ┌╞╔╠┼╥ IS AN EXCELLENT PROGRAM, SORT OF A ╟╒╔ DESKTOP
- WITHOUT THE SLOW GRAPHICS.
-
- ├128-╪╟╥ - A LIBRARY OF E╪TENDED ╟╥APHICS TERMCAPS FOR THE ├128. ╘HIS
- FILE IS ESSENTIAL IF YOU WANT TO USE ANY ┌├╨╥ PROGRAMS THAT NEED A
- ╘├┴╨. ╘HESE TERMCAPS ARE THE FIRST FOR THE ├128 THAT IMPLEMENT
- CHARACTER GRAPHICS, STANDOUT MODE, AND CONTROL OF BLINKING REVERSE,
- AND UNDERLINE MODES.
-
- ╙┼╘╨╘╚10 - USED TO SET THE COMMAND SEARCH PATH. ┼SSENTIAL!
-
- ╓┼╥╥╧╥17 - ERROR HANDLER THAT DISPLAYS THE COMMAND LINE FOR
- REEDITING. ╓┼╥╥╧╥17 IS THE ONLY ERROR HANDLER THAT ╔ FOUND THAT WORKS
- WITH ┌├├╨.
-
- ┌┼╪50 - ┌-╙YSTEM ┼╪ECUTIVE IS A POWERFUL BATCH FILE PROCESSOR THAT
- REPLACES THE ├╨/═ ╙╒┬═╔╘ COMMAND.
-
- ╠┬╥╚╠╨22 - ┌-╙YSTEM ╚ELP UTILITY DISPLAYS HELP FILES. ╚ELP FILES CAN
- BE CRUNCHED (*.╚┌╨), AND/OR LOADED FROM A ╚┼╠╨.╠┬╥ LIBRARY.
-
- ┴╥╒╬┌09 - RUNS AN ALIAS SCRIPT FROM A TEXT FILE. ┴╥╒╬┌ IS
- FREQUENTLY USED AS AN EXTENDED COMMAND PROCESSOR. ╘O USE ┴╥╒╬┌ (OR
- ANY OTHER EXECUTABLE UTILITY) AS AN EXTENDED COMMAND PROCESSOR, RENAME
- IT TO ├═─╥╒╬.├╧═.
-
- ╓╠╒102 - ╓IDEO ╠IBRARY ╒TILITY VIEWS OR EXTRACTS FILES FROM
- LIBRARIES. ╓ERSIONS OF ╓╠╒ ABOVE 1.02 DO NOT WORK RELIABLY WITH
- ┌╨═3/┌├├╨.
-
- ┌33╔╞16 - IS THE ╔╞.├╧═ DISCUSSED IN THE SECTION ON FLOW CONTROL.
-
- ╙╚╧╫14 - DISPLAYS AN IMMENSE AMOUNT OF INFORMATION ABOUT YOUR
- ┌-╙YSTEM. ╙╚╧╫ ALSO INCLUDES A MEMORY PATCHING FUNCTION.
-
- ┌├╬╞╟24 - CONFIGURES ┌-╙YSTEM PROGRAM OPTIONS. ═OST ┌-╙YSTEM
- PROGRAMS ARE DISTRIBUTED WITH A CONFIGURATION (*.├╞╟) FILE THAT
- PRODUCES A MENU OF CONFIGURATION OPTIONS WHEN RUN WITH ┌├╬╞╟.
-
- ┌╨17 - ┌-╙YSTEM ╨ATCH UTILITY EDITS FILES, DISK SECTORS, OR
- MEMORY, AND INCLUDES A BUILT-IN ╥╨╬ CALCULATOR AND NUMBER BASE
- CONVERTER.
-
- ┌═┴╬-╬┼╫ - ╘HIS IS A MANUAL DESCRIBING ┌-╙YSTEM FEATURES IN DEPTH.
- ╔T IS BASED ON EARLIER VERSIONS OF ┌-╙YSTEM, AND IS A LITTLE DATED,
- BUT OTHERWISE CONTAINS INFORMATION THAT YOU WON'T FIND ANYWHERE ELSE.
- ╬OT EVERYTHING IN THE MANUAL APPLIES TO OPERATION OF ┌╨═3/┌├├╨, BUT
- WITH THE DOCUMENTATION PRESENTED HERE, YOU SHOULD BE ABLE TO GET A
- GOOD IDEA OF WHAT WORKS AND WHAT DOESN'T.
-
-
- ┌├├╨ ╘ECHNICAL ╬OTES
-
- ┌├├╨ IS A REPLACEMENT ├├╨ THAT IMPLEMENTS ┌├╨╥ 3.3. ╔T LOADS AT 100╚ AND IS
- STORED IN THE BANK 0 ├├╨ BUFFER FOR FAST RELOADING AS DOES THE STANDARD ├├╨.
- ┬Y CONTRAST, ┌3╨LUS LOADS INTO HIGH MEMORY AND CAN BE OVERWRITTEN BY TRANSIENT
- COMMANDS, REQUIRING RELOADING ┌3╨LUS FROM DISK. ┬ECAUSE ┌├├╨ REPLACES THE ├├╨,
- A ┌├├╨ SYSTEM HAS MORE ╘╨┴ (TRANSIENT PROGRAM AREA) THAN A ┌3╨LUS SYSTEM. ┴
- ┌├├╨ SYSTEM ON THE ├128 HAS MORE THAN 57╦ OF ╘╨┴, ALMOST THE SAME AMOUNT AS A
- STANDARD ├128 ├╨/═ SYSTEM.
-
- ╘HIS SHOULD BE ENOUGH INFORMATION TO GET STARTED WITH ┌╨═3/┌├├╨. ╙ET UP A BOOT
- DISK, EXPERIMENT WITH SOME ┌-╙YSTEM UTILITIES, READ ┌═┴╬-╬┼╫, AND GET SOME
- APPLICATIONS RUNNING. ┘OU'LL AGREE THAT ┌╨═3/┌├├╨ BREATHS NEW LIFE INTO ├╨/═.
-
- =============================================================================
- ═ULTI-╘ASKING ON THE ├=128 - ╨ART 1
- BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
-
- ╔. ╔NTRODUCTION / ╨ACKAGE ╧VER-VIEW..
-
- ╘HIS ARTICLE WILL DETAIL THE MULTI-TASKING KERNAL WHICH ╔ HAVE WRITTEN BUTT
- IS STILL IN THE DEBUGGING STAGE . ╘HE DOCUMENTATION IS BEING RELEASED NOW AS
- ├= ╚ACKING HAS BEEN DELAYED FOR A MONTH WHILE THIS ARTICLE AND A FEW OTHERS
- WERE IN THE PROCESS OF BEING SHAPED. ╘HE SOURCE CODE LISTINGS, BINARIES, AND
- A FEW SAMPLE PROGRAMS WILL BE IN THE NEXT ISSUE OF ├= ╚ACKING AS WELL AS
- AVAILABLE ON THE MAILSERVER AND ON ╥. ╦NOP'S ╞╘╨ SITE WHEN THEY ARE
- AVAILABLE..
-
- ╘HE ├OMMODORE 128 DOES NOT SUPPORT ╘╥╒┼ MULTI-TASKING IN THAT THE PROCESSOR
- HANDLES SWAPPING FROM TASK TO TASK. ╥ATHER THE PACKAGE WILL MAKE USE OF THE
- INTERRUPTS OCCURING SIXTY TIMES A SECOND TO DETERMINE WHEN TO SWITCH TASKS..
- ╘HE ├OMMODORE 128 GREATLY SIMPLIFIES THINGS AS IN ADDATION TO THE INTERRUPTS
- IT ALSO HAS THE PROVISION TO RELOCATE ZERO PAGE AND THE STACK PAGE. ╙O THE
- PACKAGE BASICALLY WORKS BY INTERCEPTING THE ╔╥╤ VECTOR, TAKING A LOOK AT THE
- CURRENT JOB, SAVING THE STACK POINTER, FINDING THE NEXT ACTIVE JOB, LOADING
- THE STACK PAGE AND REGISTERS AND RESUMING THE NORMAL ╔╥╤ AS IF NOTHING HAD
- EVER HAPPENED.
-
- ╒NFORTUNATLY ├OMMODORE NEVER THOUGHT OF HAVING MULTIPLE PROGRAMS IN MEMORY
- EXECUTING AT ANY GIVEN TIME. ╚ENCE, PROBLEMS WILL OCCUR WITH FILE ACCESSES,
- WITH MEMORY CONTENTION, AND WITH AN OVER-ALL SLOWDOWN IN SPEED. ╘HE PACKAGE
- WILL DETAIL HOW TO HANDLE DEVICE CONTENTIONS, BUT IT'S RECOMMENDED THAT
- PROGRAMMERS MAKE USE OF THE ├= 128 KERNAL CALL ╠╦╒╨╠┴ $FF59 CONTAINING THE
- LOGICAL FILE NUMBER THEY WISH TO USE IN .┴; IF THE CARRY FLAG IS SET UPON
- RETURN THEN IT IS SAFE TO USE, ELSE FIND ANOTHER ONE AS ANOTHER PROGRAM IS
- USING IT. ╚OWEVER, NOTE THAT IF YOU HAVE MULTIPLE PROGRAMS DOING THIS THEN
- YOU MAY HAVE PROBLEMS WITH ONE GRABBING A LOGICAL FILE NUMBER AFTER THE
- OTHER PROCESS HAS CHECKED FOR IT. ═ULTI-TASKING IS FUN 'EH? ╨ROBLEMS LIKE
- THIS WILL BE EXAMINED WHEN WE GET INTO SEMAPHORES LATER IN THIS ARTICLE..
-
- ├RAIG ┬RUCE'S ─YNAMIC ═EMORY ┴LLOCATION ARTICLE IN THE SECOND ISSUE OF ├=
- ╚ACKING SHOULD PROVIDE A VERY STRONG BASIS FOR A FULL-BLOWN MEMORYY MANAGER.
- ╫ITH MINOR MODIFICATIONS (BASICALLY JUST CHANGING THE INITIAL ALLOCATIONS SO
- THAT THE PACKAGE IS NOT KILLED) IT SHOULD BE ABLE TO WORK. ┴LSO IT WILL NEED
- CHANGES TO MAKE SURE THAT PROCESSES DON'T TRY TO ALLOCATE AT THE SAME TIME.
- ╙O A MEMORY MANAGER IS NOT TOO MUCH OF A PROBLEM. ─ETAILS OF WHAT CHANGES
- WILL BE NECESSARY SHALL BE IN THE NEXT ISSUE.
-
- ╫HAT IS A PROCESS? ╫HAT IS A PROGRAM? ╔'VE BEEN USING THE TERMS ALMOST
- INTER-CHANGEBLY THROUGHOUT THIS ARTICLE AT THIS POINT. ┬ASICALLY ╔'M CALLING
- THEM THE SAME. ┴ PROCESS, OR PROGRAM IS DEFINED AS A PROGRAM WITH IT'S OWN
- EXECUTABLE SECTION, IT'S OWN DATA SECTIONS, AND IT'S OWN STACK AND ZERO PAGE.
- (╬OTE, HOWEVER, THAT THE MULTI-TASKING PACKAGE DOES NOT SUPPORT RELOCATION OF
- THE ZERO PAGE ALTHOUGH THIS IS LIKELY TO CHANGE). ╘HE "KERNAL" OF THE
- MULTI-TASKER IS BASICALLY THAT PART OF THE PACKAGE WHICH GOVERNS WHICH
- PROCESS IS EXECUTED OR SWITCHED TO NEXT. ╙EMAPHORES WILL BE EXAMINED IN
- DETAIL LATER; THEY FUNCTION AS FLAGS FOR PROCESSES TOO KNOW WHEN IT IS SAFE
- TO EXECUTE SOMETHING, AND SERVE AS SIGNALS BETWEENN THEM.
-
- ╞UTURE VERSIONS OF THE PACKAGE, (EVEN THOUGH ╔ KNOW IT DOES NOT EXIST OUT
- SIDE OF MY HOUSE YET), WILL SUPPORT PIPES AND A MORE STRONGLY TYPED KERNAL
- SO THAT PROCESSES MAY BE PRIORITIZED.
-
- ╔╔. ┴ ╠OOK ┴T ═ULTI-╘ASKING
-
- ╘HE INTRODUCTION INTRODUCED SOME BASIC ELEMENTS OF MULTI-TASKING BUT ╔'LL
- REPEAT THEM HERE, DEFINING THEM SO THAT THIS ARTICLE CAN BE CLEAR AS SOME OF
- THE CONCEPTS CAN GET A BIT CONFUSING.
-
- ┬ACKGROUND - ┴ PROCESS IS SAID TO BE IN THE "BACKGR OUND" IF IT IS NOT
- THE FOREGROUND TASK AND MAY OR MAY NOT HAVE INPUT DEVI CES ASSOCIATED
- WITH IT.
-
- ╞OREGROUND - ┴ PROCESS IS SAID TO BE "FOREGROUND" IF IT IS THE MAIN
- ACTIVE PROCESS AND IS HOLDING THE KEYBOARD AND SCREEN DISPLAY CAPTIVE
- (IE: THE USER IS ACTUALLY WORKING WITHIN IT).
-
- ╦ERNAL - ┴ SMALL SECTION OF CODE THAT PERFORMS LOW-LEVAL WORK THAT IS
- NEEDED BY ANY PROGRAMS IN MEMORY..
-
- ═ULTI-╘ASKING - ┼XECUTION OF MORE THAN ONE PROCESS AT ANY GIVEN
- TIME.
-
- ╨RIORITY - ┴ VALUE ASSOCIATED WITH EACH PROCESS THAT DETERMINES HOW
- OFTEN, AND POSSIBLY WHEN A PROCESS IS EXECUTED.
-
- ╨ROCESS - ╘HE SPACE IN MEMORY TAKEN UP BY EXECUTABLE PROGRAM CODE, ANY
- ASSOCIATED DATA, THE STACK AND THE REGISTERS ASSOCIATED AND CURRENTLY IN
- USE BY IT, INCLUDING THE CURRENT ╨├ (PROGRAM COUNTER)..
-
- ╙EMAPHORES - ╓ALUES THAT ARE GLOBALLY ACCESSED BY PROCESSES TO SHARE AND
- COMMUNICATE INFORMATION BETWEEN EACH OTHER AND THE KERNAL.
-
- ╙OME ├╨╒'S HAVE AVAILABLE A MULTI- TASKING MODE (THE 386 AND 486 ARE THE
- MOST FAMALIAR ONES THAT COME TO MIND), Y ET THE 8502 CHIP CONTAINED INSIDE
- THE ├OMMODORE 128 WAS FIRST DESIGNED BEFORE 1985 AND LACKS MULTI-TASKING. ╔T
- WOULD BE NICE IF SUCH A MULTI-TASKING ├╨╒ IN THE 6502 FAMILY DID EXIST BUT
- IT WOULD ALSO CREATE PROBLEMS WITH THE 6502 STYLE ARCHITECTURE AND WOULDD
- PRODUCE SEVERE COMPATIBILITY PROBLEMS.
-
- ╙O HOW IS THE ├=128 SUPPOSED TO DO MULTI-TASKING? ╫ELL, WE'LL "SIMULATE"
- IT..
-
- ┬ASICALLY IF WE HAD TWO PROGRAMS IN MACHINE LANGUAGE:
-
- ╨ROGRAM 1: ╨ROGRAM 2:
- - LDA #65 ; THE "┴" CHARACTER - LDA #64 ; THE "@" CHARACTER
- JSR $FFD2 ; PRINT IT JSR $FFD2 ; PRINT IT
- JMP - JMP --
-
- ┴ND WE WANTED THEM TO MULTI-TASK WE'D EXPECT SOMETHING LIKE THE FOLLOWING:
-
- @┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴@┴┴
-
- ╔T'S UNLIKELY THAT YOU'LL GET THAT IN MANY MULTI-TASKING ENVIRONMENTS,
- EVEN NON-SIMULATED ONES. ╙INCE WE'RE ONLY GOING TO BE SWITCHING TASKS EVERY
- 1/60 OF A SECOND THEN WE'RE MORE LIKELY TO SEE AN OUTPUT SIMILAIR TO THIS:
-
- @@@@@@┴┴┴┴┴┴┴@@@@@@@┴┴┴┴┴┴┴@@@@@@@@┴┴┴┴┴┴┴@@@@@@@┴┴┴┴┴┴┴┴@@@@@@@@┴┴┴┴┴┴@@@@@@@
-
- ╙O THAT IT SEEMS A PROCESS WILL RUN FOR ABOUT 1/60 OF A SECOND BEFOREE
- SWITCHING TO THE NEXT ONE.
-
- ╫E RUN INTO PROBLEMS HOWEVER. ╘HE ╦┼╥╬┴╠ IN THE ├128 THAT CONTAINS MOST
- OFF THE FILE HANDLING, SCREEN MANIPULATIONS, AND KEYBOARD INPUT ROUTINES. ╔T
- WAS NEVER DESIGNED WITH THE IDEA OF MULTI-TASKING IN MIND. ╙O WE'RE GONNA
- HAVE CODE RUNNING IN THE ╦┼╥╬┴╠ IN TWO SPOTS FOR THE TWO DIFFERANT PROCESSES
- AND IT'S MORE THAN LIKELY WE'LL END UP WITH SOMETHING LIKE:
-
- @@@@@@@@<AND THEN A ┬╥╦ OR SOME STRANGE ERROR OR NEVER-NEVER-LAND>>
-
- ╘HERE'S GOT TO BE SOME WAY TO FIX IT - ╘HERE IS - ╔T'S CALLED A SEMAPHORE..
-
- ┴ SEMAPHORE IS A VALUE THAT IS CHECKED BEFORE ACCESS IS GRANTED TO ANOTHER
- GROUP OF MEMORY LOCATIONS. ╘HE SEMAPHORE IS BASICALLY REQUESTED VIA THE
- FOLLOWING:
-
- REQUEST_SEMAPHORE SEI
- LDX SEMAPHORE
- DEX
- BEQ +
- CLI
- - LDY #$FF
- DEY
- BNE -
- + INC SEMAPHORE
- CLI
-
- ╬OW THE REQUEST_SEMAPHORE HAS TO DISABLE INTERRUPTS TO PREVENT ANOTHER TASK
- FROM CHANGING THE SEMAPHORE VALUE BEFORE THIS ROUTINE HAS HAD A CHANCE. ╘HE
- ACTUAL CODE FOR THE REQUEST_SEMAPHORE WILL BE VERY SIMILAIR TO THE ABOVE.
-
- ╒SING A SIMILAIR ROUTINE THAT PERFORMS THE OPPOSITE - SETTING THE SEMAPHORE
- TO A ZERO VALUE WHEN FINISHED WE CAN DICTATE WHAT PROGRAM HAS CONTROL OVER
- WHAT DEVICE OR WHAT MEMORY AREAS.
-
- ╘HE SEMAPHORES WILL BE USED TO GOVERN ACCESS TO THE ╦┼╥╬┴╠ ROUTINES WHICH
- MANIPULATE THE LOCATIONS IN ZERO PAGE ETC, THEY'LL ALSO BE USED TO MANAGE THE
- MEMORY MANAGER WHEN IT IS IMPLEMENTED AS IT'D BE AWKWARD FOR IT TO ALLOCATE
- THE SAME BLOCK OF MEMORY TO TWO OR MORE PROCESSES.
-
- ╔╔╔. ═ULTI-╘ASKING ╞UNCTION ├ALLS (╨ACKAGE ├ALLS)
-
- ╧FF╙ET | ╬AME | ╬OTES
- -------+---------------+--------------------------------------------------
- $00 | ╙ET╒P | .├=0 ╔NIT ╨ACKAGE, .├=1 ╒NINSTALL ╨ACKAGE
- | | (INCLUDING ╦ERNAL RE-DIRECTION).
- $03 | ╙PAWN╨ROCESS | ╧N RETURN: .├=0 PARENT, .├ = 1 CHILD
- $06 | ├HANGE╨RIORITY| .┴ = NEW FOREGROUND PRIORITY, .╪ = NEW BACKGROUND
- $09 | ╦ILL╘HIS╨ROC | ╦ILLS ├ALLING ╨ROCESS (NO RETURN)
- $0C | ╦ILL╧THER╨ROC | ╦ILLS ╨ROCESS # .┴
- $0F | ╥EQUEST╙EMAPH | ╥EQUESTS ╙EMAPHORE #.╪
- $12 | ╥ELEASE╙EMAPH | ╥ELEASES ╙EMAPHORE #.╪
- $14 | ╟ET╨ROC╔NFO | ╥ETURNS ╨ROCESS ╔NFORMATION, ╔NPUT=#┴
- | | OF 0: ╨ROCESS ╔D
- | | OF 1: ╨ROCESS ╞OREGROUND ╨RIORITY
- | | OF 2: ╨ROCESS ┬ACKGROUND ╨RIORITY
- | | OF 3+ ╧THER ╔NFORMATION ╘O ┬E ─ECIDED ╠ATER
- $17 | ╨IPE╔NIT | .┴┘ - ┴DDRESS OF ╨IPE, .╪ = ╙IZE/8
- | | ╥ETURN: .╪ - ╨IPE #
- $1A | ╫RITE╨IPE | .┴┘ - ┴DDRESS OF ╬ULL ╘ERM. ─ATA, .╪ = ╨IPE #
- $1D | ╥EAD╨IPE | .┴┘ - ┴DDRESS TO ╨UT ─ATA .╪=╨IPE #
- $20 | .... | \
- $2E | .... | \ ═ORE ╥OUTINES FOR THE FUTURE.
- -------+---------------+--------------------------------------------------
-
- ╔╓. ┴VAILIBILITY OF THE ╨ACKAGEE
-
- ╘HE PACKAGE SHOULD BE AVAILABLE AT THE TIME OF THE NEXT ISSUE. ┴ FURTHER
- EXAMINATION OF HOW THE ROUTINES WORK SHALL BE EXAMINED ALONG WITH THE SOURCE
- CODE.
-
- ┼RRORS POPPED UP IN DEVELOPING IT AND RATHER THAN DELAY ├= ╚ACKING ANY
- FURTHER ╔ DECIDED TO GO AHEAD AND RELEASE THE ABOVE INFORMATION SO THAT
- INDIVIDUALS CAN START DEVELOPING APPROPRIATE ROUTINES. ╔N ADDITION,
- PLEASE NOTE THAT ╨╔╨┼S _MAY_ OR MAY NOT BE SUPPORTED IN THE NEXT ISSUE.
- ╔ HAVE NOT FULLY MADE UP MY MIND YET ON THEM.
-
- ╓. ╥EFERENCESS
-
- ┬ORN TO ├ODE IN ├, ╚ERBERT ╙CHILDT, ╧SBORNE-═C╟RAW ╚ILL, P.203-252.
-
- ╬OTES FROM ╧PERATING ╙YSTEMS ├OURSE, ╨EMBROKE ╙TATE ╒NIV, ╞ALL '92.
-
- =============================================================================
- ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER/╫╥╔╘┼╥ FOR THE ├128 AND 1571/81.
- BY ├RAIG ┬RUCE (CSBRUCE@NEUMANN.UWATERLOO.CA)
-
- 1. ╔╬╘╥╧─╒├╘╔╧╬
-
- ╘HIS ARTICLE IS A CONTINUATION OF THE ╠ITTLE ╥ED ╥EADER ARTICLE FROM LAST
- ISSUE. ╘HE PROGRAM HAS BEEN EXTENDED TO WRITE ═╙-─╧╙ FILES, IN ADDITION TO
- READING THEM. ╘HE PROGRAM STILL WORKS DRIVE-TO-DRIVE SO YOU'LL STILL NEED TWO
- DISK DRIVES (EITHER PHYSICAL OR LOGICAL) TO USE IT. ╘HE PROGRAM HAS ALSO BEEN
- EXTENDED TO ALLOW ═╙-─╧╙ FILES TO BE DELETED AND TO ALLOW THE COPYING OF
- ├OMMODORE-─╧╙ FILES BETWEEN ├┬═-─╧╙ DISKS (THIS MAKES IT MORE CONVENIENT TO
- USE THE PROGRAM WITH A TEMPORARY LOGICAL DRIVE LIKE ╥┴═─╧╙). ┴LSO, SINCE ╔
- HAVE RECENTLY ACQUIRED A ├═─ ╞─-4000 FLOPPY DISK DRIVE, ╔ KNOW THAT THIS
- PROGRAM WORKS WITH ═╙-─╧╙ DISKS WITH THIS DRIVE (BUT ONLY FOR THE 720╦
- FORMAT).
-
- ╘HE PROGRAM STILL HAS THE SAME ORGANIZATION AS LAST TIME: A MENU-ORIENTED
- USER-INTERFACE PROGRAM WRITTEN IN ┬┴╙╔├ THAT MAKES USE OF A PACKAGE OF ═╙-─╧╙
- DISK ACCESSING ROUTINES WRITTEN IN MACHINE LANGUAGE. ╧H, THIS PROGRAM IS
- ╨UBLIC ─OMAIN ╙OFTWARE, SO FEEL FREE TO DISTRIBUTE AND/OR MANGLE IT AS YOU
- WISH. ╩UST NOTE ANY MANGLINGS ON THE "INITIALIZING" SCREEN SO PEOPLE DON'T
- BLAME ME.
-
- ╘HE PROGRAM RUNS ON EITHER THE 40 OR 80-COLUMN SCREENS, BUT YOU WILL GET
- MUCH BETTER PERFORMANCE FROM THE ┬┴╙╔├ PORTION OF THE PROGRAM BY BEING
- IN 80-COLUMN MODE AND ╞┴╙╘ MODE. ┴ MODIFICATION THAT SOMEONE MIGHT WANT
- TO MAKE WOULD BE TO SPREAD-OUT THE DISPLAY FOR THE 80-COLUMN SCREEN AND ADD
- COLOR TO THE RATHER BLAND DISPLAY.
-
- 2. ╒╙┼╥ ╟╒╔─┼
-
- ╠╧┴─ AND ╥╒╬ THE "LRR.128" ┬┴╙╔├ PROGRAM FILE. ╫HEN THE PROGRAM IS FIRST RUN,
- IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
- LANGUAGE PACKAGE FROM THE "CURRENT" ├OMMODORE ─╧╙ DRIVE (THE CURRENT DRIVE IS
- OBTAINED FROM ╨┼┼╦(186) - THE LAST DEVICE ACCESSED). ╘HE BINARY PACKAGE IS
- LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
- PACKAGE ╔─ FIELD IS IN PLACE.
-
- ╘HE SYSTEM IS DESIGNED TO HAVE TWO FILE SELECTION MENUS: ONE FOR THE ═╙-─╧╙
- DISK DRIVE, AND ONE FOR THE ├OMMODORE-─╧╙ DISK DRIVE (WHICH MAY BE A LOGICAL
- DISK DRIVE). ╘HE IDEA FOR COPYING IS THAT YOU SELECT THE FILES IN ONE OF
- THESE MENUS, AND THEN PROGRAM KNOWS TO COPY THEM TO THE DISK FOR THE OTHER
- MENU. ╘HIS IDEA OF HAVING TWO SELECTION MENUS IS ALSO VERY CONSISTENT WITH
- THE ORIGINAL PROGRAM.
-
- 2.1. ═╙-─╧╙ ═┼╬╒
-
- ╫HEN THE PROGRAM STARTS, THE ═╙-─╧╙ MENU OF THE PROGRAM IS DISPLAYED. ╔T
- LOOKS LIKE:
-
- ═╙-─╧╙ ═╙=10:1581 ├┬═=8 ╞╥┼┼=715000
-
- ╬╒═ ╙ ╘╥╬ ╘┘╨ ╞╔╠┼╬┴═┼ ┼╪╘ ╠┼╬╟╘╚
- --- - --- --- -------- --- ------
- 1 * ┴╙├ ╙┼╤ ╚┴├╦4 ╘╪╘ 120732
- 2 ┬╔╬ ╨╥╟ ╥┴═─╧╙ ╙╞╪ 34923
-
- ─=─╔╥ ═=═╙─┼╓ ╞=├┬═─┼╓ ├=├╧╨┘ ╤=╤╒╔╘
- ╘=╘╧╟╟╠┼ ╥=╥┼═╧╓┼ ╪=├┬═├╨┘ /=═┼╬╒ +-=╨╟
-
- EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<DIRECTORY NOT LOADED>" WILL BE
- DISPLAYED RATHER THAN FILENAMES. ╘HE MENU LOOKS AND OPERATES PRETTY MUCH AS
- IT DID IN THE LAST ISSUE OF ├= ╚ACKING. ╘HE ONLY DIFFERENCES ARE THAT THE
- NUMBER OF BYTES FREE ON THE DRIVE ARE DISPLAYED (WHICH IS USEFUL TO KNOW WHEN
- WRITING FILES) AND THERE ARE SOME MORE COMMANDS.
-
- ╘HE DIRECTORY ("─"), CHANGE MS-DOS DEVICE ("═"), CHANGE COMMODORE FILE DEVICE
- ("╞"), TOGGLE COLUMN CONTENTS ("╘"), COPY MS-DOS FILES TO CBM-DOS DISK ("├"),
- QUIT ("╤"), PAGING ("+" AND "-"), COLUMN CHANGE (╙╨┴├┼ OR ╥┼╘╒╥╬), AND THE
- CURSOR MOVEMENT COMMANDS ALL WORK THE SAME AS BEFORE. ╘HEY ARE ALL STICKS TO
- USE TO FLOG THE BEAST INTO SUBMISSION. ╘HE NEW COMMANDS ARE: "╥" (REMOVE ==
- DELETE), "/" (CHANGE MENU), AND "╪" (COPY ├┬═ FILES == "╪EROX").
-
- ╘HE REMOVE COMMAND IS USED TO DELETE SELECTED FILES FROM THE ═╙-─╧╙ DISK.
- ┴FTER SELECTING THIS OPTION, YOU WILL GET AN ANNOYING "ARE YOU SURE" QUESTION
- AND THE THE SELECTED FILES WILL QUICKLY DISAPPEAR AND THE CHANGES WILL FINALLY
- BE WRITTEN TO DISK. ─ELETING A BATCH OF ═╙-─╧╙ FILES IS MUCH QUICKER THAN
- DELETING ├OMMODORE-─╧╙ FILES SINCE ═╙-─╧╙ DISKS USE A ╞ILE ┴LLOCATION ╘ABLE
- RATHER THAN THE LINKED LIST OF BLOCKS ORGANIZATION THAT ├┬═ USES. ╔N ORDER TO
- MAKE THE ┬┴╙╔├ PROGRAM EXECUTE QUICKER, AFTER DELETING, THE ORIGINAL ORDER OF
- THE FILENAMES IN THE DIRECTORY LISTING WILL BE CHANGED. ┬E FOREWARNED THAT
- THE DELETE OPERATION IS NON-RECOVERABLE.
-
- ╘HE CHANGE MENU COMMAND IS USED TO MOVE BACK AND FORTH BETWEEN THE ├OMMODORE-
- ─╧╙ AND ═╙-─╧╙ MENUS.
-
- 2.2. ├╧══╧─╧╥┼-─╧╙ ═┼╬╒
-
- ╘HE ├OMMODORE-─╧╙ MENU, WHICH DISPLAYS THE NAMES OF THE ├OMMODORE FILES
- SELECTED FOR VARIOUS OPERATIONS, LOOKS AND WORKS PRETTY MUCH THE SAME AS
- THE ═╙-─╧╙ MENU:
-
- ├┬═─╧╙ ═╙=10:1581 ├┬═=8 ╞╥┼┼=3211476
-
- ╬╒═ ╙ ╘╥╬ ╞╔╠┼╬┴═┼ ╘ ╠┼╬╟╘╚
- --- - --- ---------------- - ------
- 1 * ┬╔╬ ╠╥╥-128 ╨ 9876
- 2 ┴╙├ ├╧═-╚┴├╦╔╬╟-005 ╙ 175412
-
- ─=─╔╥ ═=═╙─┼╓ ╞=├┬═─┼╓ ├=├╧╨┘ ╤=╤╒╔╘
- ╘=╘╧╟╟╠┼ ╥=╥┼═╧╓┼ ╪=├┬═├╨┘ /=═┼╬╒ +-=╨╟
-
- ┘OU'LL NOTICE, HOWEVER, THAT THE FILETYPE FIELD ("╘" HERE) IS MOVED AND IS
- UNCHANGABLE. ┴LSO, THE FILE LENGTHS ARE NOT EXACT; THEY ARE REPORTED AS THE
- BLOCK COUNT OF THE FILE MULTIPLIED BY 254. ╘HIS MENU IS NOT MAINTAINED FOR
- FILES BEING COPIED TO THE ├┬═-─╧╙ DISK FROM AN ═╙-─╧╙ DISK. ┘OU'LL
- HAVE TO RE-EXECUTE THE ─IRECTORY INSTRUCTION TO GET AN UPDATED LISTING.
-
- ╘HE "─" (DIRECTORY) COMMAND HAS LOCAL EFFECT WHEN IN THIS MENU. ╘HE
- ├OMMODORE-─╧╙ DIRECTORY WILL BE LOADED FROM THE CURRENT ├┬═ DEVICE NUMBER.
- ╬OTE THAT IN ORDER FOR THIS TO WORK, THE ├┬═ DEVICE MUST BE NUMBER EIGHT
- OR GREATER (A DISK DRIVE). ╧RIGINALLY, THE SUBROUTINE FOR THIS COMMAND WAS
- WRITTEN USING ONLY ╟┼╘#'S FROM THE DISK AND WAS VERY SLOW. ╔T WAS MODIFIED,
- HOWEVER, TO CALL A MACHINE LANGUAGE SUBROUTINE TO READ THE INFORMATION FOR
- A DIRECTORY ENTRY FROM THE DIRECTORY LISTING, AND HENCE THE SUBROUTINE NOW
- OPERATES AT A TOLERABLE SPEED.
-
- ╘HE "├" (COPY) COMMAND ALSO HAS A DIFFERENT MEANING WHEN IN THIS MENU. ╔T
- MEANS TO COPY THE SELECTED ├┬═ FILES TO THE ═╙-─╧╙ DISK. ╙EE DETAILS BELOW.
-
- ╘HE COPY ├┬═ FILES ("╪") COMMAND IS USED TO COPY THE FILES IN THE ├┬═-─╧╙ MENU
- TO ANOTHER ├┬═-─╧╙ DISK UNIT. ╙ELECT THE FILES YOU WANT TO COPY AND THEN
- PRESS ╪. ┘OU WILL THEN BE ASKED WHAT DEVICE NUMBER YOU WANT TO COPY THE FILES
- TO. ╘HE DEVICE CAN BE ANOTHER DISK DRIVE OR ANY OTHER DEVICE (EXCEPT THE
- KEYBOARD). ╒SING DEVICE NUMBER 0 DOES NOT MEAN THE "NULL" DEVICE AS IT DOES
- WITH COPYING ═╙-─╧╙ TO ├┬═. ╔F YOU ARE COPYING TO A DISK DEVICE AND THE FILE
- ALREADY EXISTS, THEN YOU WILL BE ASKED IF YOU WISH TO OVERWRITE THE FILE. ┘OU
- CANNOT COPY TO THE SAME DISK UNIT. ┴LSO, ALL FILES ARE COPIED IN BINARY MODE
- (REGARDLESS OF WHAT TRANSLATION YOU HAVE SELECTED FOR A FILE).
-
- ╘HE COPY ├┬═ FILES COMMAND WAS INCLUDED SINCE ALL OF THE LOW-LEVEL GEAR
- NEEDED TO IMPLEMENT IT (SPECIFICALLY "COMMIE╔N" AND "COMMIE╧UT" BELOW) WAS
- ALSO REQUIRED BY OTHER FUNCTIONS. ╘HIS COMMAND CAN BE VERY CONVENIENT WHEN
- WORKING WITH ╥┴═─╧╙. ╞OR EXAMPLE, IF YOU ONLY HAD A 1571 AS DEVICE 8 BUT YOU
- HAVE A ╥┴═ EXPANDER AND HAVE INSTALLED ╥┴═─╧╙ AS DEVICE 9, THEN YOU WOULD
- COPY ═╙-─╧╙ FILES TO ╥┴═─╧╙ USING THE ═╙-─╧╙ MENU, AND THEN YOU WOULD GO TO
- THE ├OMMODORE-─╧╙ MENU ("/"), READ THE DIRECTORY, SELECT ALL FILES, INSERT AN
- ├OMMODORE-─╧╙ DISKETTE INTO YOUR 1571, AND THEN USE "╪" TO COPY FROM THE
- ╥┴═─╧╙ DEVICE TO THE 1571.
-
- ╘HE REMOVE COMMAND ("╥") DOES NOT WORK FOR THIS DIRECTORY. ┘OU CAN ╙├╥┴╘├╚
- YOUR ├┬═-─╧╙ FILES YOUR DAMN SELF.
-
- 2.3. ├╧╨┘ ├┬═-─╧╙ ╘╧ ═╙-─╧╙
-
- ┬EFORE YOU CAN COPY SELECTED ├┬═-─╧╙ FILES TO AN ═╙-─╧╙ DISK, THE ═╙-─╧╙ DISK
- DIRECTORY MUST BE ALREADY LOADED (FROM THE ═╙-─╧╙ MENU). ╘HIS IS REQUIRED
- SINCE THE DIRECTORY AND ╞┴╘ INFORMATION ARE KEPT IN MEMORY AT ALL TIMES DURING
- THE EXECUTION OF THIS PROGRAM.
-
- ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
- FILE IS DISPLAYED AS IT IS BEING COPIED. ╔F AN ERROR IS ENCOUNTERED ON EITHER
- THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
- AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS). ╨LEASE
- NOTE THAT NOT A WHOLE LOT OF EFFORT WAS PUT INTO ERROR RECOVERY.
-
- ╘O GENERATE AN ═╙-─╧╙ FILENAME FROM AN ├┬═-─╧╙ FILENAME, THE FOLLOWING
- ALGORITHM IS USED. ╘HE FILENAME IS SEARCHED FROM RIGHT TO LEFT FOR THE LAST
- "." CHARACTER. ╔F THERE IS NO "." CHARACTER, THEN THE ENTIRE FILENAME, UP TO
- 11 CHARACTERS, IS USED AS THE ═╙-─╧╙ FILENAME. ├HARACTERS 9 TO 11 WILL BE
- USED AS THE EXTENSION. ╔F THERE IS A "." CHARACTER, THE ALL CHARACTERS BEFORE
- IT, UP TO EIGHT, WILL BE USED AS THE ═╙-─╧╙ FILENAME AND ALL CHARACTERS AFTER
- THE FINAL ".", UP TO THREE, WILL BE USED AS THE ═╙-─╧╙ EXTENSION.
-
- ╘HEN, THE NEWLY GENERATED ═╙-─╧╙ FILENAME IS SCANNED FOR ANY EXTRA "."
- CHARACTERS OR EMBEDDED SPACES. ╔F ANY ARE FOUND, THEY ARE REPLACED BY THE
- UNDERSCORE CHARACTER ("_", WHICH IS THE BACKARROW CHARACTER ON A ├OMMODORE
- DISPLAY). ╞INALLY, ALL TRAILING UNDERSCORES ARE REMOVED FROM THE END OF BOTH
- THE FILENAME AND EXTENSION PORTIONS OF THE ═╙-─╧╙ FILENAME. ┴LSO, ALL
- CHARACTERS ARE CONVERTED TO LOWERCASE ╨┼╘╙├╔╔ (WHICH IS UPPERCASE ┴╙├╔╔) WHEN
- THEY ARE COPIED INTO THE ═╙-─╧╙ FILENAME. ╬OTE THAT IF THE ├OMMODORE FILENAME
- IS NOT IN THE 8/3 FORMAT OF ═╙-─╧╙, THEN SOMETHING IN THE NAME MAY BE LOST.
- ╙OME EXAMPLES OF FILENAME CONVERSION FOLLOW:
-
- ├┬═-─╧╙ ╞╔╠┼╬┴═┼ ═╙-─╧╙ ╞╔╠┼╬┴═┼
- ---------------- ---------------
- "LRR.BIN" "LRR.BIN"
- "LRR.128.BIN" "LRR_128.BIN"
- "HELLO THERE.TEXT" "HELLO_TH.TEX"
- "LONG_FILENAME" "LONG_FIL.ENA"
- "FILE 1..3.S__5" "FILE_1.S"
-
- ╔T WOULD HAVE BEEN TIME-CONSUMING TO HAVE THE PROGRAM SCAN THE ═╙-─╧╙
- DIRECTORY FOR A FILENAME ALREADY EXISTING ON THE DISK, SO ╠╥╥ WILL PUT
- MULTIPLE FILES ON A DISK WITH THE SAME FILENAME WITHOUT COMPLAINING. ╘HIS
- ALSO GETS RID OF THE PROBLEM OF ASKING YOU IF YOU WANT TO OVERWRITE THE OLD
- FILE OR GENERATE A NEW NAME. ╚OWEVER, IN ORDER TO RETRIEVE THE FILE FROM
- DISK ON AN ═╙-─╧╙ MACHINE, YOU WILL PROBABLY HAVE TO USE THE ╥┼╬┴═┼ COMMAND TO
- RENAME THE FIRST VERSIONS OF THE FILE ON THE DISK TO SOMETHING ELSE SO ═╙-─╧╙
- WILL SCAN FURTHER IN THE DIRECTORY FOR THE LAST VERSION OF THE FILE WITH THE
- SAME FILENAME. ╘HERE IS NO RENAME COMMAND IN ╠╥╥ BECAUSE ╔ NEVER THOUGHT OF
- IT IN TIME. ╔T WOULD HAVE BEEN FAIRLY EASY TO PUT IN.
-
- ╘HE DATE GENERATED FOR A NEW ═╙-─╧╙ FILE WILL BE ALL ZEROS. ╙OME SYSTEMS
- INTERPRET THIS AS 12:00 AM, 01-╩AN-80 AND OTHERS DON'T DISPLAY A DATE AT ALL
- FOR THIS VALUE.
-
- ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
- NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
- THINGS BY LOOKING AT THE BLINKING LIGHTS AND LISTENING FOR CLICKS AND GRINDS.
-
- ╙INCE THE ╞┴╘ AND DIRECTORY ARE MAINTAINED IN ╥┴═ DURING THE ENTIRE COPYING
- PROCESS AND ARE ONLY FLUSHED TO DISK AFTER THE ENTIRE BATCH OF FILES ARE
- COPIED, COPYING IS MADE MORE EFFICIENT, SINCE THERE WILL BE NO COSTLY SEEK
- BACK TO TRACK 0 AFTER WRITING EACH FILE (LIKE ═╙-─╧╙ DOES). ╔F YOU HAVE A
- NUMBER OF SMALL FILES TO COPY, THEN THEY WILL BE KNOCKED OFF IN QUICK
- SUCCESSION, FASTER THAN MANY ═╙-─╧╙ MACHINES WILL COPY THEM.
-
- ╘O SIMPLIFY THE IMPLEMENTATION, THE CURRENT TRACK OF DISK BLOCKS FOR WRITING
- IS NOT MAINTAINED LIKE IT IS FOR READING. ┴LSO, A WRITING INTERLEAVE OF 1:1
- IS USED FOR A 1571, WHICH IS NOT OPTIMAL. ╚OWEVER, SINCE WRITING IS SUCH A
- SLOW OPERATION ANYWAY, AND SINCE THE 1571 IS PARTICULARLY BAD BY INSISTING ON
- VERIFYING BLOCKS, NOT MUCH MORE OVERHEAD IS INTRODUCED THAN IS ALREADY
- PRESENT.
-
- ┴N INTERESTING NOTE ABOUT WRITING ═╙-─╧╙ DISKS IS THAT YOU CAN TERMINATE ╠╥╥
- IN THE MIDDLE OF A COPY (WITH ╙╘╧╨+╥┼╙╘╧╥┼) OR IN THE MIDDLE OF COPYING A
- BATCH OF FILES, AND THE ═╙-─╧╙ DISK WILL REMAIN IN A PERFECTLY CONSISTENT
- STATE AFTERWARDS. ╘HE STATE WILL BE AS IF NONE OF THE FILES WERE COPIED. ╘HE
- REASON IS THAT THE CONTROL INFORMATION (THE ╞┴╘ AND DIRECTORY) IS MAINTAINED
- INTERNALLY AND IS FLUSHED ONLY AFTER COPYING IS ALL COMPLETED. ┬UT DON'T
- TERMINATE ╠╥╥ WHILE IT IS FLUSHING THE CONTROL INFORMATION.
-
- ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING TO 1571, 1581, AND ├═─ ╞─-4000
- DISK UNITS WITH ┴╙├ AND ┬╔╬ TRANSLATION MODES. ┴LL FIGURES ARE IN BYTES/
- SECOND, WHICH INCLUDES BOTH READING THE BYTE FROM A ├= DISK AND WRITING IT TO
- THE ═╙-─╧╙ DISK. ╘HE AVERAGE SPEED FOR EITHER THE READ OR WRITE OPERATION
- INDIVIDUALLY WILL BE TWICE THE SPEED GIVEN BELOW. ╘HESE RESULTS WERE OBTAINED
- FROM COPYING A 156,273 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING ╔SSUE #4).
-
- ╞╥╧═ \ ╘╧: ╞─-BIN ╞─-ASC 81-BIN 81-ASC 71-BIN 71-ASC
- --------+ ------ ------ ------ ------ ------ ------
- ╥┴═╠INK | 2,332 2,200 2,332 2,200 1,594 1,559
- ╥┴═─╧╙ | 1,070 1,053 1,604 1,600 1,561 1,510
- ╞─4000 | - - 1,645 1,597 1,499 1,464
- ╩─1581 | 1,662 1,619 - - 1,474 1,440
- ╩─1571 | 1,050 1,024 953 933 - -
-
- ╘HESE FIGURES ARE FOR TRANSFER SPEED ONLY, NOT COUNTING THE COUPLE OF SECONDS
- OF OPENING FILES AND FLUSHING THE DIRECTORY. ╬OTE THAT ALL MY PHYSICAL DRIVES
- ARE ╩IFFY─╧╙-IFIED, SO YOUR PERFORMANCE MAY BE SLOWER. ╔ AM AT A LOSS TO
- EXPLAIN WHY AN ╞─-4000 IS SO MUCH SLOWER THAN A 1581 FOR COPYING FROM A
- ╥┴═─╧╙ FILE, BUT THE SAME SPEED OR BETTER FOR COPYING FROM ANYTHING ELSE.
-
- ╙INCE ╔ DON'T HAVE ACCESS TO AN ACTUAL ═╙-─╧╙ MACHINE, ╔ HAVE NOT TESTED THE
- FILES WRITTEN ONTO AN ═╙-─╧╙ DISK BY ╠╥╥, EXCEPT BY READING THEM BACK WITH ╠╥╥
- AND ┬┬╥. ╔ DO KNOW, HOWEVER, THAT EARLIER ENCARNATIONS OF THIS PROGRAM DID
- WORK FINE WITH ═╙-─╧╙ MACHINES.
-
- 3. ═╙-─╧╙ ╥╧╧╘ ─╔╥┼├╘╧╥┘
-
- ╔T WAS BROUGHT TO MY ATTENTION THAT ╔ MADE A MISTAKE IN THE PERVIOUS ARTICLE.
- ╔ WAS WRONG ABOUT THE OFFSET OF THE ATTRIBUTES FIELD IN A DIRECTORY ENTRY.
- ╘HE LAYOUT SHOULD HAVE BEEN AS FOLLOWS:
-
- ╧╞╞╙┼╘ ╠┼╬ ─┼╙├╥╔╨╘╔╧╬
- ------ --- -----------
- 0..7 8 ╞ILENAME
- 8..10 3 ┼XTENSION
- 11 1 ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
- 12..21 10 <UNUSED>
- 22..25 4 ─ATE
- 26..27 2 ╙TARTING ╞┴╘ ENTRY NUMBER
- 28..31 4 ╞ILE LENGTH IN BYTES
-
- 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
-
- ┴S WAS MENTIONED ABOVE, ╠ITTLE ╥ED ╥EADER IS SPLIT INTO TWO PIECES: A ┬┴╙╔├
- FRONT-END USER INTERFACE PROGRAM AND A PACKAGE OF MACHINE LANGUAGE SUBROUTINES
- FOR DISK ACCESSING. ╘HE ┬┴╙╔├ PROGRAM HANDLES THE MENU, USER INTERACTION, AND
- MOST OF THE ═╙-─╧╙ DIRECTORY SEARCHING/MODIFYING. ╘HE MACHINE LANGUAGE
- PACKAGE HANDLES THE HARDWARE INPUT/OUTPUT, ╞ILE ┴LLOCATION ╘ABLE AND FILE
- STRUCTURE MANIPULATIONS.
-
- ╘HE FILE COPYING PACKAGE IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO
- MEMORY AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY. ╘HE
- PACKAGE IS LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├
- PROGRAM, EVEN IF ╥┴═─╧╙ IS INSTALLED.
-
- ╘HIS SECTION OF THE ARTICLE IS PRESENTED IN ITS ENTIRETY, INCLUDING ALL OF THE
- INFORMATION GIVEN LAST TIME.
-
- 4.1. ╔╬╘┼╥╞┴├┼
-
- ╘HE SUBROUTINE CALL INTERFACE TO THE FILE COPYING PACKAGE IS SUMMARIZED AS
- FOLLOWS:
-
- ┴──╥┼╙╙ ─┼╙├╥╔╨╘╔╧╬
- ------- -----------
- ╨╦ INIT╨ACKAGE SUBROUTINE
- ╨╦+3 MS─IR (LOAD ═╙-─╧╙ DIRECTORY/╞┴╘) SUBROUTINE
- ╨╦+6 MS╥EAD (COPY ═╙-─╧╙ TO ├┬═-─╧╙) SUBROUTINE
- ╨╦+9 MS╫RITE (COPY ├┬═-─╧╙ TO ═╙-─╧╙) SUBROUTINE
- ╨╦+12 MS╞LUSH SUBROUTINE
- ╨╦+15 MS─ELETE SUBROUTINE
- ╨╦+18 MS╞ORMAT SUBROUTINE [NOT IMPLEMENTED]
- ╨╦+21 MS┬YTES╞REE SUBROUTINE
- ╨╦+24 CBM├OPY (COPY ├┬═-─╧╙ TO ├┬═-─╧╙) SUBROUTINE
- ╨╦+27 CBM─IRENT (READ ├┬═-─╧╙ DIRECTORY ENTRY) SUBROUTINE
-
- WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE ($8000).
-
- ╘HE PARAMETER PASSING INTERFACE IS SUMMARIZED AS FOLLOWS:
-
- ┴──╥┼╙╙ ─┼╙├╥╔╨╘╔╧╬
- ------- -----------
- ╨╓ TWO-BYTE PACKAGE IDENTIFICATION NUMBER ($├┬, 132)
- ╨╓+2 ERRNO : ERROR CODE RETURNED
- ╨╓+3 ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
- ╨╓+4 ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
- ╨╓+5 TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
- ╨╓+7 LOW AND MID BYTES OF FILE LENGTH FOR COPYING
- ╨╓+9 POINTER TO ═╙-─╧╙ DIRECTORY ENTRY FOR WRITING
- ╨╓+11 ├┬═-─╧╙ FILE BLOCK COUNT
- ╨╓+13 ├┬═-─╧╙ FILE TYPE ("╙"=SEQ, "╨"=PRG, ETC.)
- ╨╓+14 ├┬═-─╧╙ FILENAME LENGTH
- ╨╓+15 ├┬═-─╧╙ FILENAME CHARACTERS (MAX 16 CHARS)
-
- ╫HERE "╨╓" IS EQUAL TO ╨╦+30. ┴DDITIONAL SUBROUTINE PARAMETERS ARE PASSED IN
- THE PROCESSOR REGISTERS.
-
- ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
- THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
- PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
- HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
- RE-RUNS. ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE OF
- 132.
-
- 4.1.1. ╔╬╔╘_╨┴├╦┴╟┼ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "INIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
- INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
- DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE. ╔T REQUIRES NO
- PARAMETERS.
-
- 4.1.2. ═╙_─╔╥ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS─IR" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT ╙ECTOR
- PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT ═╙-─╧╙
- DEVICE NUMBER. ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE SUBROUTINE
- RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND THE NUMBER
- OF DIRECTORY ENTRIES IN THE .╪ REGISTER. ╔F AN ERROR OCCURS, THEN THE
- SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE IN
- THE "ERRNO" INTERFACE VARIABLE. ╘HE DIRECTORY ENTRY DATA IS IN THE DIRECTORY
- SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙ DISK.
-
- 4.1.3. ═╙_╥┼┴─ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS╥EAD" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
- SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
- OPENED). ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
- DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE. ╘HE STARTING CLUSTER NUMBER
- OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
- THE ╨╓+5 AND ╨╓+7 INTERFACE WORDS. ╘HE TRANSLATION MODE TO USE IS PASSED IN
- THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
- OUTPUT TO IS PASSED IN THE .╪ REGISTER. ╔F AN ERROR OCCURS, THE ROUTINE
- RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
- VARIABLE. ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
-
- ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
- BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
- THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
- TO GET THIS INFORMATION. ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
- FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
- NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
-
- 4.1.4. ═╙_╫╥╔╘┼ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS╫RITE" SUBROUTINE COPIES A SINGLE FILE FROM A SPECIFIED ├┬═-╦ERNAL
- LOGICAL FILE NUMBER TO A ═╙-─╧╙ FILE. ╘HE ═╙-─╧╙ DEVICE NUMBER AND TYPE ARE
- SET ABOVE. ┴ POINTER TO THE ═╙-─╧╙ DIRECTORY ENTRY IN THE BUFFER RETURNED BY
- THE "MS─IR" CALL MUST BE GIVEN IN INTERFACE WORD ╨╓+9 AND THE TRANSLATION MODE
- AND ├┬═ LFN ARE PASSED IN THE .┴ AND .╪ REGISTERS AS IN THE "MS╥EAD" ROUTINE.
- ┴N ERROR RETURN IS GIVEN IN THE USUAL WAY (.├╙, ERRNO). ╧THERWISE, THERE ARE
- NO RETURN VALUES.
-
- ╔T IS THE RESPONSIBILITY OF THE CALLING PROGRAM TO INITIALIZE THE ═╙-─╧╙
- DIRECTORY ENTRY TO ALL ZEROS AND THEN SET THE FILENAME AND SET THE STARTING
- CLUSTER POINTER TO $0╞╞╞. ╘HIS ROUTINE WILL UPDATE THE STARTING CLUSTER AND
- FILE LENGTH FIELDS OF THE DIRECTORY ENTRY WHEN IT FINISHES. ╘HE INTERNAL
- "DIRTY FLAGS" ARE MODIFIED SO THAT THE DIRECTORY AND ╞┴╘ WILL BE FLUSHED ON
- THE NEXT CALL TO "MS╞LUSH".
-
- 4.1.5. ═╙_╞╠╒╙╚ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS╞LUSH" SUBROUTINE TAKES NO INPUT PARAMETERS OTHER THAN THE IMPLICIT
- MS─EVICE AND MS╘YPE. ╔F "DIRTY" (MODIFIED), THE ╞┴╘ WILL BE WRITTEN TO THE
- ═╙-─╧╙ DISK, TO BOTH PHYSICAL REPLICAS OF THE DISK ╞┴╘. ╘HEN, EACH DIRECTORY
- SECTOR THAT IS DIRTY WILL BE WRITTEN TO DISK. ┴FTER FLUSHING, THE INTERNAL
- DIRTY FLAGS WILL BE CLEARED. ┴N ERROR RETURN IS GIVEN IN THE USUAL WAY.
- ╘HERE ARE NO OTHER OUTPUT PARAMETERS. ╔F YOU CALL THIS ROUTINE AND THERE ARE
- NO DIRTY FLAGS SET, THEN IT WILL RETURN IMMEDIATELY, WITHOUT ANY WRITING TO
- DISK.
-
- 4.1.6. ═╙_─┼╠┼╘┼ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS─ELETE" SUBROUTINE WILL DEALLOCATE ALL ╞ILE ┴LLOCATION ╘ABLE ENTRIES
- (AND HENCE, DATA CLUSTERS) ALLOCATED TO A FILE AND MARK THE DIRECTORY ENTRY AS
- BEING DELETED (BY PUTTING AN $┼5 INTO THE FIRST CHARACTER OF THE FILENAME).
- ╘HE FILE IS SPECIFIED BY GIVING THE POINTER TO THE DIRECTORY ENTRY IN
- INTERFACE WORD AT ╨╓+9. ┴FTER DEALLOCATING THE FILE DATA, THE INTERNAL
- "DIRTY" FLAG WILL BE SET FOR THE ╞┴╘ AND THE SECTOR THAT THE DIRECTORY ENTRY
- IS ON, BUT NOTHING WILL BE WRITTEN TO DISK. ╘HERE IS NO ERROR RETURN FROM
- THIS ROUTINE. ╔T IS THE RESPONSIBILITY OF THE CALLING ROUTINE TO EVENTUALLY
- CALL THE "MS╞LUSH" ROUTINE.
-
- 4.1.7. ═╙_╞╧╥═┴╘ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS╞ORMAT" SUBROUTINE IS NOT IMPLEMENTED. ╔T'S INTENDED FUNCTION WAS TO
- FORMAT THE ═╙-─╧╙ DISK AND GENERATE AND WRITE THE BOOT SECTOR, INITIAL ╞┴╘,
- AND INITIAL DIRECTORY ENTRY DATA.
-
- 4.1.8. ═╙_┬┘╘┼╙_╞╥┼┼ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "MS┬YTES╞REE" SUBROUTINE WILL SCAN THE CURRENTLY LOADED ═╙-─╧╙ ╞ILE
- ┴LLOCATION ╘ABLE, COUNT THE NUMBER OF CLUSTERS FREE, AND RETURN THE NUMBER OF
- BYTES FREE FOR FILE STORAGE ON THE DISK. ╘HERE ARE NO INPUT PARAMETERS AND
- THE BYTES FREE ARE RETURNED IN THE .┴┘╪ REGISTERS (.┴=LOW, .┘=MID, .╪=HIGH
- BYTE). ╘HE SUBROUTINE HAS NO ERROR RETURNS AND DOES NOT CHECK IF AN ═╙-─╧╙
- DIRECTORY IS ACTUALLY LOADED.
-
- 4.1.9. ├┬═_├╧╨┘ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "CBM├OPY" SUBROUTINE WILL COPY FROM AN INPUT ├┬═-╦ERNAL LOGICAL FILE
- NUMBER GIVEN IN THE .┴ REGISTER TO AN OUTPUT ├┬═-╦ERNAL LFN GIVEN IN THE .╪
- REGISTER, IN UP TO 1024 BYTE CHUNKS. ╞ILE CONTENTS ARE COPIED EXACTLY (NO
- TRANSLATION). ╘HIS ROUTINE DOES NOT CARE IF THE LFN'S ARE ON THE SAME DEVICE
- OR NOT, BUT THE INPUT DEVICE MUST BE A DISK UNIT (EITHER LOGICAL OR PHYSICAL).
- ┴N ERROR RETURN IS GIVEN IN THE USUAL WAY.
-
- 4.1.10. ├┬═_─╔╥┼╬╘ ╙╒┬╥╧╒╘╔╬┼
-
- ╘HE "CBM─IRENT" SUBROUTINE READS THE NEXT DIRECTORY ENTRY FROM THE ├┬═-╦ERNAL
- LFN GIVEN IN .┴ AND PUTS THE DATA INTO INTERFACE VARIABLES. ╧F COURSE, THE
- LFN IS ASSUMED TO BE OPEN FOR READING A DIRECTORY ("$"). ╘HE BLOCK COUNT IS
- RETURNED IN THE WORD AT ╨╓+11, THE FIRST CHARACTER OF THE FILETYPE IS RETURNED
- AT ╨╓+13, THE NUMBER OF CHARACTERS IN THE FILENAME IS RETURNED IN ╨╓+14, AND
- THE FILENAME CHARACTERS ARE RETURNED IN BYTES ╨╓+15 TO ╨╓+30. ┴N ERROR RETURN
- IS GIVEN IN THE USUAL WAY.
-
- ╘HIS ROUTINE ASSUMES THAT THE FIRST TWO BYTES OF THE DIRECTORY FILE HAVE
- ALREADY BEEN READ. ╘HE FIRST CALL TO THIS ROUTINE WILL RETURN THE NAME OF THE
- DISK. ╘HE END OF A DIRECTORY IS SIGNALLED BY A FILENAME LENGTH OF ZERO. ╔N
- THIS CASE, THE BLOCK COUNT RETURNED WILL BE THE NUMBER OF BLOCKS FREE ON THE
- DISK.
-
- 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
-
- ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING AND
- WRITING PACKAGE. ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY
- THE % SYMBOL. ╘HE % SIGN IS THERE TO ALLOW YOU TO EASILY EXTRACT THE
- ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE (AND ALL OF MY UGLY COMMENTS).
- ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS EXECUTE THE FOLLOWING COMMAND LINE
- (SUBSTITUTE FILENAMES AS APPROPRIATE):
-
- GREP '^%' ╚ACK5 | SED 'S/^% //' | SED 'S/^%//' >LRR.S
-
- % ; ╠ITTLE ╥ED ╥EADER/╫RITER UTILITY PACKAGE BY ├RAIG ┬RUCE, 31-╩AN-92
- % ; ╫RITTEN FOR ├= ╚ACKING ╬ET-═AGAZINE; FOR ├-128, 1571, 1581
- %
-
- ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
- DIRECTIVES. ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
-
- % .ORG $8000
- % .OBJ "LRR.BIN"
- %
- % ;====JUMP TABLE AND PARAMETERS INTERFACE ====
- %
- % JMP INIT╨ACKAGE ;()
- % JMP MS─IR ;( MS─EVICE, MS╘YPE ) : .┴┘=DIR┴DDR, .╪=DIRENT├OUNT
- % JMP MS╥EAD ;( MS─EVICE, MS╘YPE, START├LUSTER, LEN═╠,.┴=TRANS,.╪=CBM╠FN )
- % JMP MS╫RITE ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN )
- % JMP MS╞LUSH ;( MS─EVICE, MS╘YPE )
- % JMP MS─ELETE ;( WRITE─IRENT )
- % JMP MS╞ORMAT ;( MS─EVICE, MS╘YPE )
- % JMP MS┬YTES╞REE ;( ) : .┴┘╪=BYTES╞REE
- % JMP CBM├OPY ;( .┴=IN╠FN, .╪=OUT╠FN )
- % JMP CBM─IRENT ;( .┴=LFN )
- %
- % .BYTE $CB,132 ;IDENTIFICATION (LOCATION PK+30)
-
- ╘HESE INTERFACE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO
- MINIMIZE UNWANTED INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME,
- SUCH AS THE ╥┴═─╧╙ DEVICE DRIVER.
-
- % ERRNO .BUF 1
- % MS─EVICE .BUF 1
- % MS╘YPE .BUF 1 ;$00=1571, $FF=1581
- % START├LUSTER .BUF 2
- % LEN═╠ .BUF 2 ;LENGTH MEDIUM AND LOW BYTES
- % WRITE─IRENT .BUF 2 ;POINTER TO DIRENT
- % CDIR┬LOCKS .BUF 2 ;CBM DIRENT BLOCKS
- % CDIR╘YPE .BUF 1 ;CBM DIRENT FILETYPE
- % CDIR╞LEN .BUF 1 ;CBM DIRENT FILENAME LENGTH
- % CDIR╬AME .BUF 16 ;CBM DIRENT FILENAME
- %
-
- ╘HIS COMMAND IS NOT CURRENTLY IMPLEMENTED. ╔TS STUB APPEARS HERE.
-
- % MS╞ORMAT = *
- % BRK
- %
- % ;====GLOBAL DECLARAIONS====
- %
- % KERNEL╠ISTEN = $FFB1
- % KERNEL╙ECOND = $FF93
- % KERNEL╒NLSN = $FFAE
- % KERNEL┴CPTR = $FFA2
- % KERNEL├IOUT = $FFA8
- % KERNEL╙PINP = $FF47
- % KERNEL├HKIN = $FFC6
- % KERNEL├HKOUT = $FFC9
- % KERNEL├LRCHN = $FFCC
- % KERNEL├HRIN = $FFCF
- % KERNEL├HROUT = $FFD2
- %
- % ST = $90
- % CIA├LOCK = $DD00
- % CIA╞LAGS = $DC0D
- % CIA─ATA = $DC0C
- %
-
- ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR. ╘HEY
- ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
-
- % CLUSTER┬LOCK├OUNT .BUF 1 ;1 OR 2
- % FAT┬LOCKS .BUF 1 ;UP TO 3
- % ROOT─IR┬LOCKS .BUF 1 ;UP TO 8
- % ROOT─IR┼NTRIES .BUF 1 ;UP TO 128
- % TOTAL╙ECTORS .BUF 2 ;UP TO 1440
- % FIRST╞ILE┬LOCK .BUF 1
- % FIRST╥OOT─IR┬LOCK .BUF 1
- % FILE├LUSTER├OUNT .BUF 2
- % LAST╞AT┼NTRY .BUF 2
- %
-
- ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACK CACHE
- FOR READING.
-
- % BUF├YLINDER .BUF 1
- % BUF╙IDE .BUF 1
-
- ╘HESE "DIRTY" FLAGS RECORD WHAT HAS TO BE WRITTEN OUT FOR A FLUSH OPERATION.
-
- % FAT─IRTY .BUF 1
- % DIR─IRTY .BUF 8 ;FLAG FOR EACH DIRECTORY BLOCK
- % FORMAT╨ARMS .BUF 6
- %
-
- ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS. ╘HIS LEVEL INTERFACES WITH THE
- ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
-
- % ;====HARDWARE LEVEL====
- %
-
- ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
- BURST COMMAND BYTE.
-
- % SEND╒0 = * ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
- % PHA
- % LDA #0
- % STA ST
- % LDA MS─EVICE
- % JSR KERNEL╠ISTEN
- % LDA #$6F
- % JSR KERNEL╙ECOND
- % LDA #"U"
- % JSR KERNEL├IOUT
- % BIT ST
- % BMI SEND╒0┼RROR
- % LDA #"0"
- % JSR KERNEL├IOUT
- % PLA
- % JSR KERNEL├IOUT
- % BIT ST
- % BMI SEND╒0┼RROR
- % CLC
- % RTS
- %
- % SEND╒0┼RROR = *
- % LDA #5
- % STA ERRNO
- % SEC
- % RTS
- %
-
- ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
- TRANSFER PROTOCOL.
-
- % TOGGLE├LOCK = *
- % LDA CIA├LOCK
- % EOR #$10
- % STA CIA├LOCK
- % RTS
- %
-
- ╫AIT FOR A BURST BYTE TO ARRIVE IN THE SERIAL DATA REGISTER OF ├╔┴#1 FROM THE
- FAST SERIAL BUS.
-
- % SERIAL╫AIT = *
- % LDA #$08
- % - BIT CIA╞LAGS
- % BEQ -
- % RTS
- %
-
- ╫AIT FOR AND GET A BURST BYTE FROM THE FAST SERIAL BUS, AND SEND THE "─ATA
- ┴CCEPTED" SIGNAL.
-
- % GET┬URST┬YTE = *
- % JSR SERIAL╫AIT
- % LDX CIA─ATA
- % JSR TOGGLE├LOCK
- % TXA
- % RTS
- %
-
- ╙END THE BURST COMMANDS TO "LOG IN" THE ═╙-─╧╙ DISK AND SET THE ╥EAD SECTOR
- INTERLEAVE FACTOR.
-
- % MOUNT─ISK = * ;() : .├╙=ERR
- % LDA #%00011010
- % JSR SEND╒0
- % BCC +
- % RTS
- % + JSR KERNEL╒NLSN
- % BIT ST
- % BMI SEND╒0┼RROR
- % CLC
- % JSR KERNEL╙PINP
- % BIT CIA╞LAGS
- % JSR TOGGLE├LOCK
- % JSR GET┬URST┬YTE
- % STA ERRNO
- % AND #$0F
- % CMP #2
- % BCS MOUNT┼XIT
-
- ╟RAB THE THROW-AWAY PARAMETERS FROM THE MOUNT OPERATION.
-
- % LDY #0
- % - JSR GET┬URST┬YTE
- % STA FORMAT╨ARMS,Y
- % INY
- % CPY #6
- % BCC -
- % CLC
-
- ╙ET THE ╥EAD SECTOR INTERLEAVE TO 1 FOR A 1581 OR 4 FOR A 1571.
-
- % ;** SET INTERLEAVE
- % LDA #%00001000
- % JSR SEND╒0
- % BCC +
- % RTS
- % + LDA #1 ;INTERLEAVE OF 1 FOR 1581
- % BIT MS╘YPE
- % BMI +
- % LDA #4 ;INTERLEAVE OF 4 FOR 1571
- % + JSR KERNEL├IOUT
- % JSR KERNEL╒NLSN
- % MOUNT┼XIT = *
- % RTS
- %
-
- ╥EAD ALL OF THE SECTORS OF A GIVEN TRACK INTO THE TRACK CACHE.
-
- % BUFPTR = 2
- % SECNUM = 4
- %
- % READ╘RACK = * ;( .┴=CYLINDER, .╪=SIDE ) : TRACKBUF, .├╙=ERR
- % PHA
- % TXA
-
- ╟ET THE SIDE AND PUT IT INTO THE COMMAND BYTE. ╥EMEMBER THAT WE HAVE TO FLIP
- THE SIDE BIT FOR A 1581.
-
- % AND #$01
- % ASL
- % ASL
- % ASL
- % ASL
- % BIT MS╘YPE
- % BPL +
- % EOR #$10
- % + JSR SEND╒0
- % PLA
- % BCC +
- % RTS
- % + JSR KERNEL├IOUT ;CYLINDER NUMBER
- % LDA #1 ;START SECTOR NUMBER
- % JSR KERNEL├IOUT
- % LDA #9 ;SECTOR COUNT
- % JSR KERNEL├IOUT
- % JSR KERNEL╒NLSN
-
- ╨REPARE TO RECEIVE THE TRACK DATA.
-
- % SEI
- % CLC
- % JSR KERNEL╙PINP
- % BIT CIA╞LAGS
- % JSR TOGGLE├LOCK
- % LDA #<TRACKBUF
- % LDY #>TRACKBUF
- % STA BUFPTR
- % STY BUFPTR+1
-
- ╟ET THE SECTOR DATA FOR EACH OF THE 9 SECTORS OF THE TRACK.
-
- % LDA #0
- % STA SECNUM
- % - BIT MS╘YPE
- % BMI +
-
- ╔F WE ARE DEALING WITH A 1571, WE HAVE TO SET THE BUFFER POINTER FOR THE NEXT
- SECTOR, TAKING INTO ACCOUNT THE SOFT INTERLEAVE OF 4.
-
- % JSR GET1571┬UF╨TR
- % + JSR READ╙ECTOR
- % BCS TRACK┼XIT
- % INC SECNUM
- % LDA SECNUM
- % CMP #9
- % BCC -
- % CLC
- % TRACK┼XIT = *
- % CLI
- % RTS
- %
-
- ╟ET THE BUFFER POINTER FOR THE NEXT 1571 SECTOR.
-
- % GET1571┬UF╨TR = *
- % LDA #<TRACKBUF
- % STA BUFPTR
- % LDX SECNUM
- % CLC
- % LDA #>TRACKBUF
- % ADC BUFPTR1571,X
- % STA BUFPTR+1
- % RTS
- %
- % BUFPTR1571 = *
- % .BYTE 0,8,16,6,14,4,12,2,10
- %
-
- ╥EAD AN INDIVIDUAL SECTOR INTO MEMORY AT THE SPECIFIED ADDRESS.
-
- % READ╙ECTOR = * ;( BUFPTR ) : .├╙=ERR
-
- ╟ET AND CHECK THE BURST STATUS BYTE FOR ERRORS.
-
- % JSR GET┬URST┬YTE
- % STA ERRNO
- % AND #$0F
- % CMP #2
- % BCC +
- % RTS
- % + LDX #2
- % LDY #0
- %
-
- ╥ECEIVE THE 512 SECTOR DATA BYTES INTO MEMORY.
-
- % READ┬YTE = *
- % LDA #$08
- % - BIT CIA╞LAGS
- % BEQ -
- % LDA CIA├LOCK
- % EOR #$10
- % STA CIA├LOCK
- % LDA CIA─ATA
- % STA (BUFPTR),Y
- % INY
- % BNE READ┬YTE
- % INC BUFPTR+1
- % DEX
- % BNE READ┬YTE
- % RTS
- %
- % OLD├LOCK = 5
- %
-
- ╫RITE AN INDIVIDUAL SECTOR TO DISK, FROM A SPECIFIED MEMORY ADDRESS.
-
- % WRITE╙ECTOR = * ;( BUFPTR, .┴=TRACK, .╪=SIDE, .┘=SECTOR ) : .├╙=ERR
- % PHA
- % STY SECNUM
-
- ╟ET THE SIDE INTO THE BURST COMMAND BYTE
-
- % TXA
- % AND #$01
- % ASL
- % ASL
- % ASL
- % ASL
- % ORA #$02
- % BIT MS╘YPE
- % BPL +
- % EOR #$10
- % + JSR SEND╒0
- % PLA
- % BCC +
- % RTS
-
- ╙END REST OF PARAMETERS FOR BURST COMMAND.
-
- % + JSR KERNEL├IOUT ;TRACK NUMBER
- % LDA SECNUM ;SECTOR NUMBER
- % JSR KERNEL├IOUT
- % LDA #1 ;SECTOR COUNT
- % JSR KERNEL├IOUT
- % JSR KERNEL╒NLSN
- % SEI
- % LDA #$40
- % STA OLD├LOCK
- % SEC
- % JSR KERNEL╙PINP ;SET FOR BURST OUTPUT
- % SEI
- % BIT CIA╞LAGS
- % LDX #2
- % LDY #0
- %
-
- ╫RITE THE 512 BYTES FOR THE SECTOR.
-
- % WRITE┬YTE = *
- % LDA CIA├LOCK
- % CMP CIA├LOCK
- % BNE WRITE┬YTE
- % EOR OLD├LOCK
- % AND #$40
- % BEQ WRITE┬YTE
- % LDA (BUFPTR),Y
- % STA CIA─ATA
- % LDA OLD├LOCK
- % EOR #$40
- % STA OLD├LOCK
- % LDA #8
- % - BIT CIA╞LAGS
- % BEQ -
- % INY
- % BNE WRITE┬YTE
- % INC BUFPTR+1
- % DEX
- % BNE WRITE┬YTE
- %
-
- ╥EAD BACK THE BURST STATUS BYTE TO SEE IF ANYTHING WENT WRONG WITH THE WRITE.
-
- % CLC
- % JSR KERNEL╙PINP
- % BIT CIA╞LAGS
- % JSR TOGGLE├LOCK
- % JSR SERIAL╫AIT
- % LDX CIA─ATA
- % JSR TOGGLE├LOCK
- % TXA
- % STA ERRNO
- % AND #$0F
- % CMP #2
- % CLI
- % RTS
- %
-
- ╘HIS NEXT LEVEL OF ROUTINES DEALS WITH LOGICAL SECTORS AND THE TRACK CACHE
- RATHER THAN WITH HARDWARE.
-
- % ;====LOGICAL SECTOR LEVEL====
- %
-
- ╔NVALIDATE THE TRACK CACHE IF THE ═╙-─╧╙ DRIVE NUMBER IS CHANGED OR IF A NEW
- DISK IS INSERTED. ╘HIS ROUTINE HAS TO ESTABLISH A ╥┴═ CONFIGURATION OF $0┼
- SINCE IT WILL BE CALLED FROM ╥┴═0. ├ONFIGURATION $0┼ GIVES ╥┴═0 FROM $0000 TO
- $┬╞╞╞, ╦ERNAL ╥╧═ FROM $├000 TO $╞╞╞╞, AND THE ╔/╧ SPACE OVER THE ╦ERNAL FROM
- $─000 TO $─╞╞╞. ╘HIS CONFIGURATION IS SET BY ALL APPLICATION INTERFACE
- SUBROUTINES.
-
- % INIT╨ACKAGE = *
- % LDA #$0E
- % STA $FF00
- % LDA #$FF
- % STA BUF├YLINDER
- % STA BUF╙IDE
- % LDX #7
- % - STA DIR─IRTY,X
- % DEX
- % BPL -
- % STA FAT─IRTY
- % CLC
- % RTS
- %
-
- ╠OCATE A SECTOR (BLOCK) IN THE TRACK CACHE, OR READ THE CORRESPONDING PHYSICAL
- TRACK INTO THE TRACK CACHE IF NECESSARY. ╘HIS ROUTINE ACCEPTS THE CYLINDER,
- SIDE, AND SECTOR NUMBERS OF THE BLOCK.
-
- % SECTOR╙AVE = 5
- %
- % READ┬LOCK = * ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
-
- ├HECK IF THE CORRECT TRACK IS IN THE TRACK CACHE.
-
- % CMP BUF├YLINDER
- % BNE READ┬LOCK╨HYSICAL
- % CPX BUF╙IDE
- % BNE READ┬LOCK╨HYSICAL
-
- ╔F SO, THEN LOCATE THE SECTOR'S ADDRESS AND RETURN THAT.
-
- % DEY
- % TYA
- % ASL
- % CLC
- % ADC #>TRACKBUF
- % TAY
- % LDA #<TRACKBUF
- % CLC
- % RTS
- %
-
- ╚ERE, WE HAVE TO READ THE PHYSICAL TRACK INTO THE TRACK CACHE. ╫E SAVE THE
- INPUT PARAMETERS AND CALL THE HARDWARE-LEVEL TRACK-READING ROUTINE.
-
- % READ┬LOCK╨HYSICAL = *
- % STA BUF├YLINDER
- % STX BUF╙IDE
- % STY SECTOR╙AVE
- % JSR READ╘RACK
-
- ├HECK FOR ERRORS.
-
- % BCC READ┬LOCK╨HYSICAL╧K
- % LDA ERRNO
- % AND #$0F
- % CMP #11 ;DISK CHANGE
- % BEQ +
- % SEC
- % RTS
-
- ╔F THE ERROR THAT HAPPENED IS A "─ISK ├HANGE" ERROR, THEN MOUNT THE DISK AND
- TRY TO READ THE PHYSICAL TRACK AGAIN.
-
- % + JSR MOUNT─ISK
- % LDA BUF├YLINDER
- % LDX BUF╙IDE
- % LDY SECTOR╙AVE
- % BCC READ┬LOCK╨HYSICAL
- % RTS
- %
-
- ╚ERE, THE PHYSICAL TRACK HAS BEEN READ INTO THE TRACK CACHE OK, SO WE RECOVER
- THE ORIGINAL INPUT PARAMETERS AND TRY THE TOP OF THE ROUTINE AGAIN.
-
- % READ┬LOCK╨HYSICAL╧K = *
- % LDA BUF├YLINDER
- % LDX BUF╙IDE
- % LDY SECTOR╙AVE
- % JMP READ┬LOCK
- %
-
- ─IVIDE THE GIVEN NUMBER BY 18. ╘HIS IS NEEDED FOR THE CALCULATIONS TO CONVERT
- A LOGICAL SECTOR NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER, SIDE, AND
- SECTOR NUMBERS THAT THE LOWER-LEVEL ROUTINES REQUIRE. ╘HE METHOD OF REPEATED
- SUBTRACTION IS USED. ╘HIS ROUTINE WOULD PROBABLY WORK FASTER IF WE TRIED TO
- REPEATEDLY SUBTRACT 360 (18*20) AT THE TOP, BUT ╔ DIDN'T BOTHER.
-
- % DIVIDE┬Y18 = * ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
- % ;** COULD REPEATEDLY SUBTRACT 360 HERE
- % LDX #$FF
- % - INX
- % SEC
- % SBC #18
- % BCS -
- % DEY
- % BPL -
- % CLC
- % ADC #18
- % INY
- % TAY
- % TXA
- % RTS
- %
-
- ├ONVERT THE GIVEN LOGICAL BLOCK NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER,
- SIDE, AND SECTOR NUMBERS. ╘HIS ROUTINE FOLLOWS THE FORMULAE GIVEN IN THE
- PREVIOUS ARTICLE WITH A FEW SIMPLIFYING TRICKS.
-
- % CONVERT╠OGICAL┬LOCK╬UM = * ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE,.┘=SEC
- % JSR DIVIDE┬Y18
- % LDX #0
- % CPY #9
- % BCC +
- % PHA
- % TYA
- % SBC #9
- % TAY
- % PLA
- % LDX #1
- % + INY
- % RTS
- %
-
- ├OPY A SEQUENTIAL GROUP OF LOGICAL SECTORS INTO MEMORY. ╘HIS ROUTINE IS USED
- BY THE DIRECTORY LOADING ROUTINE TO LOAD THE ╞┴╘ AND ╥OOT ─IRECTORY, AND IS
- USED BY THE CLUSTER READING ROUTINE TO RETRIEVE ALL OF THE BLOCKS OF A
- CLUSTER. ┴FTER THE GIVEN STARTING LOGICAL SECTOR NUMBER IS CONVERTED INTO ITS
- PHYSICAL CYLINDER, SIDE, AND SECTOR EQUIVALENT, THE PHYSICAL VALUES ARE
- INCREMENTED TO GET THE ADDRESS OF SUCCESSIVE SECTORS OF THE GROUP. ╘HIS
- AVOIDS THE OVERHEAD OF THE LOGICAL TO PHYSICAL CONVERSION. ╤UITE A NUMBER OF
- TEMPORARIES ARE NEEDED.
-
- % DEST╨TR = 6
- % CUR├YLINDER = 8
- % CUR╙IDE = 9
- % CUR╙ECTOR = 10
- % BLOCK├OUNTDOWN = 11
- % SOURCE╨TR = 12
- %
- % COPY┬LOCKS = * ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
- % STX BLOCK├OUNTDOWN
- % JSR CONVERT╠OGICAL┬LOCK╬UM
- % STA CUR├YLINDER
- % STX CUR╙IDE
- % STY CUR╙ECTOR
- %
- % COPY┬LOCK╠OOP = *
- % LDA CUR├YLINDER
- % LDX CUR╙IDE
- % LDY CUR╙ECTOR
- % JSR READ┬LOCK
- % BCC +
- % RTS
- % + STA SOURCE╨TR
- % STY SOURCE╨TR+1
- % LDX #2
- % LDY #0
-
- ╚ERE ╔ UNROLL THE COPYING LOOP A LITTLE BIT TO CUT THE OVERHEAD OF THE BRANCH
- INSTRUCTION IN HALF. (┴ CYCLE SAVED... YOU KNOW).
-
- % - LDA (SOURCE╨TR),Y
- % STA (DEST╨TR),Y
- % INY
- % LDA (SOURCE╨TR),Y
- % STA (DEST╨TR),Y
- % INY
- % BNE -
- % INC SOURCE╨TR+1
- % INC DEST╨TR+1
- % DEX
- % BNE -
-
- ╔NCREMENT THE CYLINDER, SIDE, SECTOR VALUES.
-
- % INC CUR╙ECTOR
- % LDA CUR╙ECTOR
- % CMP #10
- % BCC +
- % LDA #1
- % STA CUR╙ECTOR
- % INC CUR╙IDE
- % LDA CUR╙IDE
- % CMP #2
- % BCC +
- % LDA #0
- % STA CUR╙IDE
- % INC CUR├YLINDER
- % + DEC BLOCK├OUNTDOWN
- % BNE COPY┬LOCK╠OOP
- % CLC
- % RTS
- %
-
- ├ONVERT A GIVEN CLUSTER NUMBER INTO THE FIRST CORRESPONDING LOGICAL BLOCK
- NUMBER.
-
- % CONVERT├LUSTER╬UM = * ;( .┴┘=CLUSTER╬UM ) : .┴┘=LOGICAL┬LOCK╬UM
- % SEC
- % SBC #2
- % BCS +
- % DEY
- % + LDX CLUSTER┬LOCK├OUNT
- % CPX #1
- % BEQ +
- % ASL
- % STY 7
- % ROL 7
- % LDY 7
- % + CLC
- % ADC FIRST╞ILE┬LOCK
- % BCC +
- % INY
- % + RTS
- %
-
- ╥EAD A CLUSTER INTO THE ├LUSTER ┬UFFER, GIVEN THE CLUSTER NUMBER. ╘HE CLUSTER
- NUMBER IS CONVERTED TO A LOGICAL SECTOR NUMBER AND THEN THE SECTOR COPYING
- ROUTINE IS CALLED. ╘HE FORMULA GIVEN IN THE PREVIOUS ARTICLE IS USED.
-
- % READ├LUSTER = * ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
- % JSR CONVERT├LUSTER╬UM
- %
- % ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
- % LDX #<CLUSTER┬UF
- % STX 6
- % LDX #>CLUSTER┬UF
- % STX 7
- % LDX CLUSTER┬LOCK├OUNT
- % JMP COPY┬LOCKS
- %
-
- ╫RITE A LOGICAL BLOCK OUT TO DISK. ╘HE REAL PURPOSE OF THIS ROUTINE IS TO
- INVALIDATE THE READ-TRACK CACHE IF THE BLOCK TO BE WRITTEN IS CONTAINED IN
- THE CACHE.
-
- % WRITE╠OGICAL┬LOCK = * ;( .┴┘=LOGICAL┬LOCK╬UMBER, BUFPTR ) : .├╙=ERR
- % JSR CONVERT╠OGICAL┬LOCK╬UM
- % CMP BUF├YLINDER
- % BNE +
- % CPX BUF╙IDE
- % BNE +
- % PHA
- % LDA #$FF
- % STA BUF├YLINDER
- % STA BUF╙IDE
- % PLA
- % + JSR WRITE╙ECTOR
- % RTS
- %
- % WRITE├LUSTER╙AVE .BUF 2
- %
-
- ╫RITE A CLUSTER-FUL OF DATA OUT TO DISK FROM THE CLUSTER BUFFER. ╘HIS ROUTINE
- SIMPLY CALLS THE WRITE LOGICAL BLOCK ROUTINE ONCE OR TWICE, DEPENDING ON THE
- CLUSTER SIZE OF THE DISK INVOLVED.
-
- % WRITE├LUSTER = * ;( .┴┘=CLUSTER╬UMBER, CLUSTER┬UF ) : .├╙=ERR
- % JSR CONVERT├LUSTER╬UM
- % LDX #<CLUSTER┬UF
- % STX BUFPTR
- % LDX #>CLUSTER┬UF
- % STX BUFPTR+1
- % STA WRITE├LUSTER╙AVE
- % STY WRITE├LUSTER╙AVE+1
- % JSR WRITE╠OGICAL┬LOCK
- % BCC +
- % RTS
- % + LDA CLUSTER┬LOCK├OUNT
- % CMP #2
- % BCS +
- % RTS
- % + LDA WRITE├LUSTER╙AVE
- % LDY WRITE├LUSTER╙AVE+1
- % CLC
- % ADC #1
- % BCC +
- % INY
- % + JSR WRITE╠OGICAL┬LOCK
- % RTS
- %
-
- ╘HIS NEXT LEVEL OF ROUTINES DEAL WITH THE DATA STRUCTURES OF THE ═╙-─╧╙ DISK
- FORMAT.
-
- % ;====═╙-─╧╙ FORMAT LEVEL====
- %
- % BOOT┬LOCK = 2
- %
-
- ╥EAD THE DISK FORMAT PARAMETERS, DIRECTORY, AND ╞┴╘ INTO MEMORY.
-
- % MS─IR = * ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
- % LDA #$0E
- % STA $FF00
- %
-
- ╥EAD THE BOOT SECTOR AND EXTRACT THE PARAMETERS.
-
- % ;** GET PARAMETERS FROM BOOT SECTOR
- % LDA #0
- % LDY #0
- % JSR CONVERT╠OGICAL┬LOCK╬UM
- % JSR READ┬LOCK
- % BCC +
- % RTS
- % + STA BOOT┬LOCK
- % STY BOOT┬LOCK+1
- % LDY #13 ;GET CLUSTER SIZE
- % LDA (BOOT┬LOCK),Y
- % STA CLUSTER┬LOCK├OUNT
- % CMP #3
- % BCC +
- %
-
- ╔F A DISK PARAMETER IS FOUND TO EXCEED THE LIMITS OF ╠╥╥, ERROR CODE #60 IS
- RETURNED.
-
- % INVALID╨ARMS = *
- % LDA #60
- % STA ERRNO
- % SEC
- % RTS
- %
- % + LDY #16 ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
- % LDA (BOOT┬LOCK),Y
- % CMP #2
- % BNE INVALID╨ARMS
- % LDY #22 ;GET ╞┴╘ SIZE IN SECTORS
- % LDA (BOOT┬LOCK),Y
- % STA FAT┬LOCKS
- % CMP #4
- % BCS INVALID╨ARMS
- % LDY #17 ;GET DIRECTORY SIZE
- % LDA (BOOT┬LOCK),Y
- % STA ROOT─IR┼NTRIES
- % CMP #129
- % BCS INVALID╨ARMS
- % LSR
- % LSR
- % LSR
- % LSR
- % STA ROOT─IR┬LOCKS
- % LDY #19 ;GET TOTAL SECTOR COUNT
- % LDA (BOOT┬LOCK),Y
- % STA TOTAL╙ECTORS
- % INY
- % LDA (BOOT┬LOCK),Y
- % STA TOTAL╙ECTORS+1
- % LDY #24 ;CHECK SECTORS PER TRACK, MUST BE 9
- % LDA (BOOT┬LOCK),Y
- % CMP #9
- % BNE INVALID╨ARMS
- % LDY #26
- % LDA (BOOT┬LOCK),Y
- % CMP #2 ;CHECK NUMBER OF SIDES, MUST BE 2
- % BNE INVALID╨ARMS
- % LDY #14 ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
- % LDA (BOOT┬LOCK),Y
- % CMP #1
- % BNE INVALID╨ARMS
- %
-
- ├ALCULATE THE DERIVED PARAMETERS.
-
- % ;** GET DERIVED PARAMETERS
- % LDA FAT┬LOCKS ;FIRST ROOT DIRECTORY SECTOR
- % ASL
- % CLC
- % ADC #1
- % STA FIRST╥OOT─IR┬LOCK
- % CLC ;FIRST FILE SECTOR
- % ADC ROOT─IR┬LOCKS
- % STA FIRST╞ILE┬LOCK
- % LDA TOTAL╙ECTORS ;NUMBER OF FILE CLUSTERS
- % LDY TOTAL╙ECTORS+1
- % SEC
- % SBC FIRST╞ILE┬LOCK
- % BCS +
- % DEY
- % + STA FILE├LUSTER├OUNT
- % STY FILE├LUSTER├OUNT+1
- % LDA CLUSTER┬LOCK├OUNT
- % CMP #2
- % BNE +
- % LSR FILE├LUSTER├OUNT+1
- % ROR FILE├LUSTER├OUNT
- % + CLC
- % LDA FILE├LUSTER├OUNT
- % ADC #2
- % STA LAST╞AT┼NTRY
- % LDA FILE├LUSTER├OUNT+1
- % ADC #0
- % STA LAST╞AT┼NTRY+1
- %
- % ;** LOAD ╞┴╘
- % LDA #<FATBUF
- % LDY #>FATBUF
- % STA 6
- % STY 7
- % LDA #1
- % LDY #0
- % LDX FAT┬LOCKS
- % JSR COPY┬LOCKS
- % BCC +
- % RTS
- %
- % ;** LOAD ACTUAL DIRECTORY
- % + LDA #<DIRBUF
- % LDY #>DIRBUF
- % STA 6
- % STY 7
- % LDA FIRST╥OOT─IR┬LOCK
- % LDY #0
- % LDX ROOT─IR┬LOCKS
- % JSR COPY┬LOCKS
- % BCC +
- % RTS
- % + LDA #<DIRBUF
- % LDY #>DIRBUF
- % LDX ROOT─IR┼NTRIES
- % CLC
- % RTS
- %
-
- ╘HIS ROUTINE LOCATES THE GIVEN ╞┴╘ TABLE ENTRY NUMBER AND RETURNS THE VALUE
- STORED IN IT. ╙OME WORK IS NEEDED TO DEAL WITH THE 12-BIT COMPRESSED DATA
- STRUCTURE.
-
- % ENTRY┴DDR = 2
- % ENTRY╫ORK = 4
- % ENTRY┬ITS = 5
- % ENTRY─ATA0 = 6
- % ENTRY─ATA1 = 7
- % ENTRY─ATA2 = 8
- %
- % LOCATE╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER ) : ENTRY┴DDR, ENTRY┬ITS%1
-
- ─IVIDE THE ╞┴╘ ENTRY NUMBER BY TWO AND MULTIPLY BY THREE BECAUSE TWO ╞┴╘
- ENTRIES ARE STORED IN THREE BYTES. ╘HEN ADD THE ╞┴╘ BASE ADDRESS AND WE HAVE
- THE ADDRESS OF THE THREE BYTES THAT CONTAIN THE ╞┴╘ ENTRY WE ARE INTERESTED
- IN. ╔ RETRIEVE THE THREE BYTES INTO ZERO-PAGE MEMORY FOR EASY MANIPULATION.
-
- % STA ENTRY┬ITS
- % ;** DIVIDE BY TWO
- % STY ENTRY┴DDR+1
- % LSR ENTRY┴DDR+1
- % ROR
- %
- % ;** TIMES THREE
- % STA ENTRY╫ORK
- % LDX ENTRY┴DDR+1
- % ASL
- % ROL ENTRY┴DDR+1
- % CLC
- % ADC ENTRY╫ORK
- % STA ENTRY┴DDR
- % TXA
- % ADC ENTRY┴DDR+1
- % STA ENTRY┴DDR+1
- %
- % ;** ADD BASE, GET DATA
- % CLC
- % LDA ENTRY┴DDR
- % ADC #<FATBUF
- % STA ENTRY┴DDR
- % LDA ENTRY┴DDR+1
- % ADC #>FATBUF
- % STA ENTRY┴DDR+1
- % LDY #2
- % - LDA (ENTRY┴DDR),Y
- % STA ENTRY─ATA0,Y
- % DEY
- % BPL -
- % RTS
- %
- % GET╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
- % JSR LOCATE╞AT┼NTRY
- % LDA ENTRY┬ITS
- % AND #1
- % BNE +
- %
-
- ╔F THE ORIGINAL GIVEN ╞┴╘ ENTRY NUMBER IS EVEN, THEN WE WANT THE FIRST 12-BIT
- COMPRESSED FIELD. ╘HE NYBBLES ARE EXTRACTED ACCORDING TO THE DIAGRAM SHOWN
- EARLIER.
-
- % ;** CASE 1: FIRST 12-BIT CLUSTER
- % LDA ENTRY─ATA1
- % AND #$0F
- % TAY
- % LDA ENTRY─ATA0
- % RTS
- %
-
- ╧THERWISE, WE WANT THE SECOND 12-BIT FIELD.
-
- % ;** CASE 2: SECOND 12-BIT CLUSTER
- % + LDA ENTRY─ATA1
- % LDX #4
- % - LSR ENTRY─ATA2
- % ROR
- % DEX
- % BNE -
- % LDY ENTRY─ATA2
- % RTS
- %
- % FAT╓ALUE = 9
- %
-
- ├HANGE THE VALUE IN A ╞┴╘ ENTRY. ╘HIS ROUTINE IS QUITE SIMILAR TO THE GET
- ROUTINE.
-
- % SET╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER, (FAT╓ALUE) )
- % JSR LOCATE╞AT┼NTRY
- % LDA FAT╓ALUE+1
- % AND #$0F
- % STA FAT╓ALUE+1
- % LDA ENTRY┬ITS
- % AND #1
- % BNE +
- %
- % ;** CASE 1: FIRST 12-BIT CLUSTER
- % LDA FAT╓ALUE
- % STA ENTRY─ATA0
- % LDA ENTRY─ATA1
- % AND #$F0
- % ORA FAT╓ALUE+1
- % STA ENTRY─ATA1
- % JMP SET╞AT┼XIT
- %
- % ;** CASE 2: SECOND 12-BIT CLUSTER
- % + LDX #4
- % - ASL FAT╓ALUE
- % ROL FAT╓ALUE+1
- % DEX
- % BNE -
- % LDA FAT╓ALUE+1
- % STA ENTRY─ATA2
- % LDA ENTRY─ATA1
- % AND #$0F
- % ORA FAT╓ALUE
- % STA ENTRY─ATA1
- %
- % SET╞AT┼XIT = *
- % LDY #2
- % - LDA ENTRY─ATA0,Y
- % STA (ENTRY┴DDR),Y
- % DEY
- % BPL -
- % STY FAT─IRTY
- % RTS
- %
-
- ═ARK THE DIRECTORY SECTOR CORRESPONDING TO THE GIVEN DIRECTORY ENTRY AS BEING
- DIRTY SO IT WILL BE WRITTEN OUT TO DISK THE NEXT TIME THE MS╞LUSH ROUTINE IS
- CALLED.
-
- % DIRTY─IRENT = * ;( WRITE─IRENT )
- % SEC
- % LDA WRITE─IRENT
- % SBC #<DIRBUF
- % LDA WRITE─IRENT+1
- % SBC #>DIRBUF
- % LSR
- % AND #$07
- % TAX
- % LDA #$FF
- % STA DIR─IRTY,X
- % RTS
- %
- % DEL├LUSTER = 14
- %
-
- ─ELETE THE ═╙-─╧╙ FILE WHOSE DIRECTORY ENTRY IS GIVEN. ╨UT THE $┼5 INTO
- ITS FILENAME, GET ITS STARTING CLUSTER AND FOLLOW THE CHAIN OF CLUSTERS
- ALLOCATED TO THE FILE IN THE ╞┴╘, MARKING THEM AS UNALLOCATED (VALUE $000)
- AS WE GO. ┼XIT BY MARKING THE DIRECTORY ENTRY AS "DIRTY".
-
- % MS─ELETE = * ;( WRITE─IRENT )
- % LDY #$0E
- % STY $FF00
- % LDA WRITE─IRENT
- % LDY WRITE─IRENT+1
- % STA 2
- % STY 3
- % LDA #$E5
- % LDY #0
- % STA (2),Y
- % LDY #26
- % LDA (2),Y
- % STA DEL├LUSTER
- % INY
- % LDA (2),Y
- % STA DEL├LUSTER+1
- % - LDA DEL├LUSTER+1
- % CMP #5
- % BCC +
- % JMP DIRTY─IRENT
- % + TAY
- % LDA DEL├LUSTER
- % JSR GET╞AT┼NTRY
- % PHA
- % TYA
- % PHA
- % LDA #0
- % STA FAT╓ALUE
- % STA FAT╓ALUE+1
- % LDA DEL├LUSTER
- % LDY DEL├LUSTER+1
- % JSR SET╞AT┼NTRY
- % PLA
- % STA DEL├LUSTER+1
- % PLA
- % STA DEL├LUSTER
- % JMP -
- %
- % FLUSH┬LOCK = 14
- % FLUSH├OUNTDOWN = $60
- % FLUSH╥EPEATS = $61
- % FLUSH─IR╔NDEX = $61
- %
-
- ╫RITE THE ╞┴╘ AND DIRECTORY SECTORS FROM MEMORY TO DISK, IF THEY ARE DIRTY.
-
- % MS╞LUSH = * ;( MS─EVICE, MS╘YPE ) : .├╙=ERROR
- % LDA #$0E
- % STA $FF00
- % LDA FAT─IRTY
- % BEQ FLUSH─IRECTORY
- % LDA #0
- % STA FAT─IRTY
- %
- % ;** FLUSH FAT
-
- ╞LUSH BOTH COPIES OF THE ╞┴╘, IF THERE ARE TWO; OTHERWISE, ONLY FLUSH THE ONE.
-
- % LDA #2
- % STA FLUSH╥EPEATS
- % LDA #1
- % STA FLUSH┬LOCK
- %
- % MASTER╞LUSH = *
- % LDA FAT┬LOCKS
- % STA FLUSH├OUNTDOWN
- % LDA #<FATBUF
- % LDY #>FATBUF
- % STA BUFPTR
- % STY BUFPTR+1
- % - LDA FLUSH┬LOCK
- % LDY #0
- % JSR WRITE╠OGICAL┬LOCK
- % BCC +
- % RTS
- % + INC FLUSH┬LOCK
- % DEC FLUSH├OUNTDOWN
- % BNE -
- % DEC FLUSH╥EPEATS
- % BNE MASTER╞LUSH
- %
- % ;** FLUSH DIRECTORY
- % FLUSH─IRECTORY = *
- % LDA FIRST╥OOT─IR┬LOCK
- % STA FLUSH┬LOCK
- % LDA ROOT─IR┬LOCKS
- % STA FLUSH├OUNTDOWN
- % LDA #0
- % STA FLUSH─IR╔NDEX
- % LDA #<DIRBUF
- % LDY #>DIRBUF
- % STA BUFPTR
- % STY BUFPTR+1
- % - LDX FLUSH─IR╔NDEX
- % LDA DIR─IRTY,X
- % BEQ +
- % LDA #0
- % STA DIR─IRTY,X
- % LDA FLUSH┬LOCK
- % LDY #0
- % JSR WRITE╠OGICAL┬LOCK
- % DEC BUFPTR+1
- % DEC BUFPTR+1
- % + INC FLUSH┬LOCK
- % INC FLUSH─IR╔NDEX
- % INC BUFPTR+1
- % INC BUFPTR+1
- % DEC FLUSH├OUNTDOWN
- % BNE -
- % CLC
- % RTS
- %
- % BF╞AT┼NTRY = 14
- % BF┬LOCKS = $60
- %
-
- ├OUNT THE NUMBER OF FREE ╞┴╘ ENTRIES (VALUE $000) FROM ENTRY 2 UP TO THE
- HIGHEST ╞┴╘ ENTRY AVAILABLE FOR CLUSTER ALLOCATION. ╘HEN MULTIPLY THIS
- BY THE NUMBER OF BYTES PER CLUSTER (EITHER 512 OR 1024).
-
- % MS┬YTES╞REE = * ;( ) : .┴┘╪=FILE┬YTES╞REE
- % LDY #$0E
- % STY $FF00
- % LDA #2
- % LDY #0
- % STA BF╞AT┼NTRY
- % STY BF╞AT┼NTRY+1
- % STY BF┬LOCKS
- % STY BF┬LOCKS+1
- % - LDA BF╞AT┼NTRY
- % LDY BF╞AT┼NTRY+1
- % JSR GET╞AT┼NTRY
- % STY 2
- % ORA 2
- % BNE +
- % INC BF┬LOCKS
- % BNE +
- % INC BF┬LOCKS+1
- % + INC BF╞AT┼NTRY
- % BNE +
- % INC BF╞AT┼NTRY+1
- % + LDA BF╞AT┼NTRY
- % CMP LAST╞AT┼NTRY
- % LDA BF╞AT┼NTRY+1
- % SBC LAST╞AT┼NTRY+1
- % BCC -
- % LDX CLUSTER┬LOCK├OUNT
- % - ASL BF┬LOCKS
- % ROL BF┬LOCKS+1
- % DEX
- % BNE -
- % LDA #0
- % LDY BF┬LOCKS
- % LDX BF┬LOCKS+1
- % RTS
- %
-
- ╘HIS IS THE FILE COPYING LEVEL. ╔T DEALS WITH READING/WRITING THE CLUSTERS OF
- ═╙-─╧╙ FILES AND COPYING THE DATA THEY CONTAIN TO/FROM THE ALREADY-OPEN ├┬═
- ╦ERNAL FILE, POSSIBLY WITH ┴╙├╔╔/╨┼╘╙├╔╔ TRANSLATION.
-
- % ;====FILE COPY LEVEL====
- %
- % TRANS═ODE = 14
- % LFN = 15
- % CBM─ATA╨TR = $60
- % CBM─ATA╠EN = $62
- % CLUSTER = $64
- %
-
- ├OPY THE GIVEN CLUSTER TO THE ├┬═ OUTPUT FILE. ╘HIS ROUTINE FETCHES THE NEXT
- CLUSTER OF THE FILE FOR THE NEXT TIME THIS ROUTINE IS CALLED, AND IF IT HITS
- THE ╬╒╠╠ POINTER OF THE LAST CLUSTER OF A FILE, IT ADJUSTS THE NUMBER OF VALID
- FILE DATA BYTES THE CURRENT CLUSTER CONTAINS TO ╞ILE╠ENGTH % ├LUSTER╠ENGTH
- (SEE NOTE BELOW).
-
- % COPY╞ILE├LUSTER = * ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
-
- ╥EAD THE CLUSTER AND SETUP TO COPY THE WHOLE CLUSTER TO THE ├┬═ FILE.
-
- % LDA CLUSTER
- % LDY CLUSTER+1
- % JSR READ├LUSTER
- % BCC +
- % RTS
- % + LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % LDA #0
- % STA CBM─ATA╠EN
- % LDA CLUSTER┬LOCK├OUNT
- % ASL
- % STA CBM─ATA╠EN+1
- %
-
- ╞ETCH THE NEXT CLUSTER NUMBER OF THE FILE, AND ADJUST THE CLUSTER DATA LENGTH
- FOR THE LAST CLUSTER OF THE FILE.
-
- % ;**GET NEXT CLUSTER
- % LDA CLUSTER
- % LDY CLUSTER+1
- % JSR GET╞AT┼NTRY
- % STA CLUSTER
- % STY CLUSTER+1
- % CPY #$05
- % BCC COPY╞ILE├LUSTER─ATA
- % LDA LEN═╠
- % STA CBM─ATA╠EN
- % LDA #$01
- % LDX CLUSTER┬LOCK├OUNT
- % CPX #1
- % BEQ +
- % LDA #$03
- % + AND LEN═╠+1
-
- ╘HE FOLLOWING THREE LINES WERE ADDED IN A LAST MINUTE PANIC AFTER REALIZING
- THAT IF ╞ILE╠ENGTH % ├LUSTER╙IZE == 0, THEN THE LAST CLUSTER OF THE FILE
- CONTAINS ├LUSTER╙IZE BYTES, NOT ZERO BYTES.
-
- % BNE +
- % LDX LEN═╠
- % BEQ COPY╞ILE├LUSTER─ATA
- % + STA CBM─ATA╠EN+1
- %
- % COPY╞ILE├LUSTER─ATA = *
- % JSR COMMIE╧UT
- % RTS
- %
-
- ├OPY THE FILE DATA IN THE ═╙-─╧╙ CLUSTER BUFFER TO THE ├┬═ OUTPUT FILE.
-
- % CBM─ATA╠IMIT = $66
- %
- % COMMIE╧UT = * ;( CBM─ATA╨TR, CBM─ATA╠EN ) : .├╙=ERR
-
- ╔F THE THE LOGICAL FILE NUMBER TO COPY TO IS 0 ("NULL DEVICE"), THEN DON'T
- BOTHER COPYING ANYTHING.
-
- % LDX LFN
- % BNE +
- % CLC
- % RTS
-
- ╧THERWISE, PREPARE THE LOGICAL FILE NUMBER FOR OUTPUT.
-
- % + JSR KERNEL├HKOUT
- % BCC COMMIE╧UT═ORE
- % STA ERRNO
- % RTS
- %
-
- ╨ROCESS THE CLUSTER DATA IN CHUNKS OF UP TO 255 BYTES OR THE NUMBER OF DATA
- BYTES REMAINING IN THE CLUSTER.
-
- % COMMIE╧UT═ORE = *
- % LDA #255
- % LDX CBM─ATA╠EN+1
- % BNE +
- % LDA CBM─ATA╠EN
- % + STA CBM─ATA╠IMIT
- % LDY #0
- % - LDA (CBM─ATA╨TR),Y
- % BIT TRANS═ODE
- % BPL +
-
- ╔F WE HAVE TO TRANSLATE THE CURRENT ┴╙├╔╔ CHARACTER, LOOK UP THE ╨┼╘╙├╔╔ VALUE
- IN THE TRANSLATION TABLE AND OUTPUT THAT VALUE. ╔F THE TRANSLATION TABLE
- ENTRY VALUE IS $00, THEN DON'T OUTPUT A CHARACTER (FILTER OUT INVALID
- CHARACTER CODES).
-
- % TAX
- % LDA TRANS┬UF,X
- % BEQ COMMIE╬EXT
- % + JSR KERNEL├HROUT
- % COMMIE╬EXT = *
- % INY
- % CPY CBM─ATA╠IMIT
- % BNE -
- %
-
- ╔NCREMENT THE CLUSTER BUFFER POINTER AND DECREMENT THE CLUSTER BUFFER CHARACTER
- COUNT ACCORDING TO THE NUMBER OF BYTES JUST PROCESSED, AND REPEAT THE ABOVE IF
- MORE FILE DATA REMAINS IN THE CURRENT CLUSTER.
-
- % CLC
- % LDA CBM─ATA╨TR
- % ADC CBM─ATA╠IMIT
- % STA CBM─ATA╨TR
- % BCC +
- % INC CBM─ATA╨TR+1
- % + SEC
- % LDA CBM─ATA╠EN
- % SBC CBM─ATA╠IMIT
- % STA CBM─ATA╠EN
- % BCS +
- % DEC CBM─ATA╠EN+1
- % + LDA CBM─ATA╠EN
- % ORA CBM─ATA╠EN+1
- % BNE COMMIE╧UT═ORE
-
- ╔F WE ARE FINISHED WITH THE CLUSTER, THEN CLEAR THE ├┬═ ╦ERNAL OUTPUT CHANNEL.
-
- % JSR KERNEL├LRCHN
- % CLC
- % RTS
- %
-
- ╘HE FILE COPYING MAIN ROUTINE. ╙ET UP FOR THE STARTING CLUSTER, AND CALL
- THE CLUSTER COPYING ROUTINE UNTIL END-OF-FILE IS REACHED. ├HECKS FOR A
- ╬╒╠╠ CLUSTER POINTER IN THE DIRECTORY ENTRY TO HANDLE ZERO-LENGTH FILES.
-
- % MS╥EAD = * ;( CLUSTER, LEN═╠, .┴=TRANS═ODE, .╪=LFN ) : .├╙=ERR
- % LDY #$0E
- % STY $FF00
- % STA TRANS═ODE
- % STX LFN
- % LDA START├LUSTER
- % LDY START├LUSTER+1
- % STA CLUSTER
- % STY CLUSTER+1
- % JMP +
- % - JSR COPY╞ILE├LUSTER
- % BCC +
- % RTS
- % + LDA CLUSTER+1
- % CMP #$05
- % BCC -
- % CLC
- % RTS
- %
- % IN╠FN = $50
- % GENERATE╠F = $51
- % CBM─ATA═AX = $52
- % REACHED┼OF = $54
- % PREV╙T = $55
- %
-
- ╙ET THE TRANSLATION AND INPUT LOGICAL FILE NUMBER AND SET UP FOR READING
- FROM A ├┬═-╦ERNAL INPUT FILE.
-
- % COMMIE╔N╔NIT = * ;( .┴=TRANS═ODE, .╪=IN╠FN )
- % STA TRANS═ODE
- % STX IN╠FN
- % LDA #0
- % STA GENERATE╠F
- % STA REACHED┼OF
- % STA PREV╙T
- % RTS
- %
-
- ╥EAD UP TO "CBM─ATA═AX" BYTES INTO THE SPECIFIED BUFFER FROM THE ESTABLISHED
- ├┬═ LOGICAL FILE NUMBER. ╘HE NUMBER OF BYTES READ IS RETURNED IN
- "CBM─ATA╠EN". ╔F END OF FILE OCCURS, "CBM─ATA╠EN" WILL BE ZERO AND THE .┌
- FLAG WILL BE SET. ╥EGULAR ERROR RETURN.
-
- % COMMIE╔N = * ;( CBM─ATA╨TR++, CBM─ATA═AX ) : CBM─ATA╠EN, .├╙=ERR, .┌=EOF
-
- ┼STABLISH INPUT FILE, OR RETURN IMMEDIATELY IF ALREADY PAST EOF.
-
- % LDA #0
- % STA CBM─ATA╠EN
- % STA CBM─ATA╠EN+1
- % LDX REACHED┼OF
- % BEQ +
- % LDA #0
- % CLC
- % RTS
- % + LDX IN╠FN
- % JSR KERNEL├HKIN
- % BCC COMMIE╔N═ORE
- % STA ERRNO
- % RTS
- %
-
- ╥EAD NEXT CHUNK OF UP TO 255 BYTES INTO INPUT BUFFER.
-
- % COMMIE╔N═ORE = *
- % LDA #255
- % LDX CBM─ATA═AX+1
- % BNE +
- % LDA CBM─ATA═AX
- % + STA CBM─ATA╠IMIT
- % LDY #0
- % - JSR COMMIE╔N┬YTE
- % BCC +
- % RTS
- % + BEQ +
- % STA (CBM─ATA╨TR),Y
- % INY
- % CPY CBM─ATA╠IMIT
- % BNE -
- %
-
- ╨REPARE TO READ ANOTHER CHUNK, OR EXIT.
-
- % + STY CBM─ATA╠IMIT
- % CLC
- % LDA CBM─ATA╨TR
- % ADC CBM─ATA╠IMIT
- % STA CBM─ATA╨TR
- % BCC +
- % INC CBM─ATA╨TR+1
- % + CLC
- % LDA CBM─ATA╠EN
- % ADC CBM─ATA╠IMIT
- % STA CBM─ATA╠EN
- % BCC +
- % INC CBM─ATA╠EN+1
- % + SEC
- % LDA CBM─ATA═AX
- % SBC CBM─ATA╠IMIT
- % STA CBM─ATA═AX
- % BCS +
- % DEC CBM─ATA═AX+1
- % + LDA REACHED┼OF
- % BNE +
- % LDA CBM─ATA═AX
- % ORA CBM─ATA═AX+1
- % BNE COMMIE╔N═ORE
-
- ╙HUT DOWN READING AND EXIT.
-
- % + JSR KERNEL├LRCHN
- % LDA CBM─ATA╠EN
- % ORA CBM─ATA╠EN+1
- % CLC
- % RTS
- %
-
- ╥EAD A SINGLE BYTE FROM THE ├┬═-╦ERNAL INPUT LOGICAL FILE NUMBER. ╘RANSLATE
- CHARACTER INTO ┴╙├╔╔ AND EXPAND ├╥ INTO ├╥+╠╞ IF NECESSARY. ╥ETURN ┼╧╞ IF
- PREVIOUS CHARACTER RETURNED WAS LAST FROM DISK INPUT CHANNEL.
-
- % COMMIE╔N┬YTE = * ;( ) : .┴=CHAR, .├╙=ERR, .┌=EOF, REACHED┼OF
- % ;** CHECK FOR ALREADY PAST EOF
- % LDA REACHED┼OF
- % BEQ +
- % BRK
- % ;** CHECK FOR GENERATED LINEFEED
- % + LDA GENERATE╠F
- % BEQ +
- % LDA #0
- % STA GENERATE╠F
- % LDA #$0A
- % CLC
- % RTS
- % ;** CHECK FOR EOF
- % + LDA PREV╙T
- % AND #$40
- % BEQ +
- % LDA #$FF
- % STA REACHED┼OF
- % LDA #0
- % CLC
- % RTS
- % ;** READ ACTUAL CHARACTER
- % + JSR KERNEL├HRIN
- % LDX ST
- % STX PREV╙T
- % BCC +
- % STA ERRNO
- % JSR KERNEL├LRCHN
- % RTS
- % ;** TRANSLATE IF NECESSARY
- % + BIT TRANS═ODE
- % BPL +
- % TAX
- % LDA TRANS┬UF╘O┴SCII,X
- % BEQ COMMIE╔N┬YTE
-
- ╬OTE HERE THAT THE TRANSLATED CHARACTER IS CHECKED TO SEE IF IT IS A CARRIAGE
- RETURN, RATHER THAN CHECKING THE NON-TRANSLATED CHARACTER, TO SEE IF A
- LINEFEED MUST BE GENERATED NEXT. ╘HUS, YOU COULD DEFINE THAT A ├OMMODORE
- CARRIAGE RETURN BE TRANSLATED INTO A LINEFEED (FOR ╒NIX) AND NO ADDITIONAL
- UNWANTED LINEFEED WOULD BE GENERATED.
-
- % CMP #$0D
- % BNE +
- % STA GENERATE╠F
- % ;** EXIT
- % + LDX #$FF
- % CLC
- % RTS
- %
- % FIRST╞REE╞AT┼NTRY = $5A
- %
-
- ╙EARCH ╞┴╘ FOR A FREE CLUSTER, AND RETURN THE CLUSTER (╞┴╘ ENTRY) NUMBER. ┴
- GLOBAL VARIABLE "FIRST╞REE╞AR┼NTRY" IS MAINTAINED WHICH POINTS TO THE FIRST
- ╞┴╘ ENTRY THAT COULD POSSIBLY BE FREE, TO AVOID WASTING TIME SEARCHING FROM
- THE VERY BEGINNING OF THE ╞┴╘ EVERY TIME. ├LUSTERS ARE ALLOCATED IN
- FIRST-FREE ORDER.
-
- % ALLOCATE╞AT┼NTRY = * ;( ) : .┴┘=FAT┼NTRY, .├╙=ERR
- % - LDA FIRST╞REE╞AT┼NTRY
- % CMP LAST╞AT┼NTRY
- % LDA FIRST╞REE╞AT┼NTRY+1
- % SBC LAST╞AT┼NTRY+1
- % BCC +
- % RTS
- % + LDA FIRST╞REE╞AT┼NTRY
- % LDY FIRST╞REE╞AT┼NTRY+1
- % JSR GET╞AT┼NTRY
- % STY 2
- % ORA 2
- % BNE +
- % LDA FIRST╞REE╞AT┼NTRY
- % LDY FIRST╞REE╞AT┼NTRY+1
- % CLC
- % RTS
- % + INC FIRST╞REE╞AT┼NTRY
- % BNE -
- % INC FIRST╞REE╞AT┼NTRY+1
- % JMP -
- %
- % MS╞ILE╠ENGTH = $5C ;(3 BYTES)
- %
-
- ┴LLOCATE A NEW CLUSTER TO A FILE, LINK IT INTO THE FILE CLUSTER CHAIN, AND
- WRITE THE CLUSTER BUFFER TO DISK IN THAT CLUSTER, ADDING "CBM─ATA╠EN" BYTES
- TO THE FILE.
-
- % MS╫RITE├LUSTER = * ; (*) : .├╙=ERR
- % ;** GET A NEW CLUSTER
- % JSR ALLOCATE╞AT┼NTRY
- % BCC +
- % RTS
- % ;** MAKE PREVIOUS FAT ENTRY POINT TO NEW CLUSTER
- % + STA FAT╓ALUE
- % STY FAT╓ALUE+1
- % LDA CLUSTER
- % ORA CLUSTER+1
- % BEQ +
- % LDA CLUSTER
- % LDY CLUSTER+1
- % LDX FAT╓ALUE
- % STX CLUSTER
- % LDX FAT╓ALUE+1
- % STX CLUSTER+1
- % JSR SET╞AT┼NTRY
- % JMP MS├LUSTER╬EW
-
- ╚ANDLE CASE OF NO PREVIOUS CLUSTER - MAKE DIRECTORY ENTRY POINT TO NEW
- CLUSTER.
-
- % + LDA WRITE─IRENT
- % LDY WRITE─IRENT+1
- % STA 2
- % STY 3
- % LDY #26
- % LDA FAT╓ALUE
- % STA (2),Y
- % STA CLUSTER
- % INY
- % LDA FAT╓ALUE+1
- % STA (2),Y
- % STA CLUSTER+1
- %
- % ;** MAKE NEW FAT ENTRY POINT TO NULL
- % MS├LUSTER╬EW = *
- % LDA #$FF
- % LDY #$0F
- % STA FAT╓ALUE
- % STY FAT╓ALUE+1
- % LDA CLUSTER
- % LDY CLUSTER+1
- % JSR SET╞AT┼NTRY
- % ;** WRITE NEW CLUSTER DATA
- % + LDA CLUSTER
- % LDY CLUSTER+1
- % JSR WRITE├LUSTER
- % BCC +
- % RTS
- % ;** ADD CLUSTER LENGTH TO FILE LENGTH
- % + CLC
- % LDA MS╞ILE╠ENGTH
- % ADC CBM─ATA╠EN
- % STA MS╞ILE╠ENGTH
- % LDA MS╞ILE╠ENGTH+1
- % ADC CBM─ATA╠EN+1
- % STA MS╞ILE╠ENGTH+1
- % BCC +
- % INC MS╞ILE╠ENGTH+2
- % + CLC
- % RTS
- %
-
- ├OPY A ├┬═-╦ERNAL FILE TO AN ═╙-─╧╙ FILE, POSSIBLY WITH TRANSLATION.
-
- % MS╫RITE = * ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN ) :.├╙=ERR
- % LDY #$0E
- % STY $FF00
- % ;** INITIALIZE
-
- ╙ET INPUT FILE TRANSLATION AND LOGICAL FILE NUMBER, INIT CLUSTER, FILE LENGTH,
- ╞┴╘ ALLOCATION FIRST FREE POINTER (TO CLUSTER #2, THE FIRST DATA CLUSTER).
-
- % JSR COMMIE╔N╔NIT
- % LDA #0
- % STA CLUSTER
- % STA CLUSTER+1
- % STA FIRST╞REE╞AT┼NTRY+1
- % STA MS╞ILE╠ENGTH
- % STA MS╞ILE╠ENGTH+1
- % STA MS╞ILE╠ENGTH+2
- % LDA #2
- % STA FIRST╞REE╞AT┼NTRY
- %
- % ;** COPY CLUSTER FROM CBM FILE
- % - LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % LDA CLUSTER┬LOCK├OUNT
- % ASL
- % TAY
- % LDA #0
- % STA CBM─ATA═AX
- % STY CBM─ATA═AX+1
- % JSR COMMIE╔N
- % BCC +
- % RTS
- % + BEQ +
- % JSR MS╫RITE├LUSTER
- % BCC -
- % RTS
- %
- % ;** WRAP UP AFTER WRITING - SET FILE LENGTH, DIRTY FLAG, EXIT.
- % + LDA WRITE─IRENT
- % LDY WRITE─IRENT+1
- % STA 2
- % STY 3
- % LDX #0
- % LDY #28
- % - LDA MS╞ILE╠ENGTH,X
- % STA (2),Y
- % INY
- % INX
- % CPX #3
- % BCC -
- % JSR DIRTY─IRENT
- % CLC
- % RTS
- %
-
- ╘HIS LEVEL DEALS EXCLUSIVELY WITH ├OMMODORE FILES.
-
- % ;===== COMMODORE FILE LEVEL =====
- %
-
- ├OPY FROM AN INPUT DISK LOGICAL FILE NUMBER TO AN OUTPUT LFN, IN UP TO 1024
- BYTE CHUNKS. ╘HIS ROUTINE MAKES USE OF THE EXISTING "COMMIE╔N" AND
- "COMMIE╧UT" ROUTINES. ╬O FILE TRANSLATION IS AVAILABLE; BINARY TRANSLATION IS
- USED FOR BOTH COMMIE╔N AND COMMIE╧UT.
-
- % CBM├OPY = * ;( .┴=IN╠FN, .╪=OUT╠FN )
- % LDY #$0E
- % STY $FF00
- % STX LFN
- % TAX
- % LDA #0
- % JSR COMMIE╔N╔NIT
- % - LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % LDA #<1024
- % LDY #>1024
- % STA CBM─ATA═AX
- % STY CBM─ATA═AX+1
- % JSR COMMIE╔N
- % BCS +
- % BEQ +
- % LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % JSR COMMIE╧UT
- % BCS +
- % JMP -
- % + RTS
- %
-
- ╥EAD A SINGLE DIRECTORY ENTRY FROM THE GIVEN LOGICAL FILE NUMBER, WHICH IS
- ASSUMED TO BE OPEN FOR READING A DIRECTORY ("$"). ╘HE DATA OF THE DIRECTORY
- ENTRY ARE RETURNED IN THE INTERFACE VARIABLES.
-
- % CBM─IRENT = * ;( .┴=LFN )
-
- ╔NITIALIZE.
-
- % LDY #$0E
- % STY $FF00
- % TAX
- % JSR KERNEL├HKIN
- % BCC +
- % CDIR┼RR = *
- % LDA #0
- % STA CDIR╞LEN
- % STA CDIR┬LOCKS
- % STA CDIR┬LOCKS+1
- % RTS
- % ;** GET BLOCK COUNT
- % + JSR CDIR╟ETCH
- % JSR CDIR╟ETCH
- % JSR CDIR╟ETCH
- % STA CDIR┬LOCKS
- % JSR CDIR╟ETCH
- % STA CDIR┬LOCKS+1
- % ;** LOOK FOR FILENAME
- % LDA #0
- % STA CDIR╞LEN
- % - JSR CDIR╟ETCH
- % CMP #34
- % BEQ +
- % CMP #"B"
- % BNE -
- % JSR KERNEL├LRCHN
- % RTS
- % ;** GET FILENAME
- % + LDY #0
- % - JSR CDIR╟ETCH
- % CMP #34
- % BEQ +
- % STA CDIR╬AME,Y
- % INY
- % BNE -
- % + STY CDIR╞LEN
-
- ╠OOK FOR AND GET FILE TYPE.
-
- % - JSR CDIR╟ETCH
- % CMP #" "
- % BEQ -
- % STA CDIR╘YPE
-
- ╙CAN FOR END OF DIRECTORY ENTRY, RETURN.
-
- % - JSR CDIR╟ETCH
- % CMP #0
- % BNE -
- % JSR KERNEL├LRCHN
- % RTS
- %
-
- ╟ET A SINGLE CHARACTER OF THE DIRECTORY ENTRY, WATCHING FOR END OF FILE (WHICH
- WOULD INDICATE ERROR HERE).
-
- % CDIR╟ETCH = *
- % JSR KERNEL├HRIN
- % BCS +
- % BIT ST
- % BVS +
- % RTS
- % + PLA
- % PLA
- % JSR KERNEL├LRCHN
- % JMP CDIR┼RR
- %
- % ;===== DATA =====
- %
-
- ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ┴╙├╔╔ TO ╨┼╘╙├╔╔. ┘OU CAN
- MODIFY IT TO SUIT YOUR NEEDS IF YOU WISH. ╔F YOU CANNOT REASSEMBLE THIS FILE,
- THEN YOU CAN SIFT THROUGH THE BINARY FILE AND LOCATE THE TABLE AND CHANGE IT
- THERE. ┴N ENTRY OF $00 MEANS THE CORRESPONDING ┴╙├╔╔ CHARACTER WILL NOT BE
- TRANSLATED. ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING
- ┴╙├╔╔ CONTROL CHARACTERS INTO ╨┼╘╙├╔╔: ┬ACKSPACE, ╘AB, ╠INEFEED (├╥), AND
- ╞ORMFEED. ╔ ALSO TRANSLATE THE NON-╨┼╘╙├╔╔ CHARACTERS SUCH AS {, |, ~, AND _
- ACCORDING TO WHAT THEY PROBABLY WOULD HAVE BEEN IF ├OMMODORE WASN'T SO
- CONCERNED WITH THE GRAPHICS CHARACTERS.
-
- % TRANS┬UF = *
- % ;0 1 2 3 4 5 6 7 8 9 A B C D E F
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0D,$00,$93,$00,$00,$00 ;0
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
- % .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
- % .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
- % .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
- % .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
- % .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
- % .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;C
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;D
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;F
- %
-
- ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ╨┼╘╙├╔╔ TO ┴╙├╔╔. ┘OU CAN
- MODIFY IT TO SUIT YOUR NEEDS, SIMILAR TO THE ┴╙├╔╔ TO ╨┼╘╙├╔╔ TABLE. ┴N ENTRY
- OF $00 MEANS THE CORRESPONDING ╨┼╘╙├╔╔ CHARACTER WILL NOT BE TRANSLATED.
- ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING ╨┼╘╙├╔╔
- CONTROL CHARACTERS INTO ┴╙├╔╔: ─ELETE (INTO ┬ACKSPACE), ╘AB, ├ARRIAGE ╥ETURN
- (INTO ├╥+╠╞), AND ├LEAR╙CREEN (INTO ╞ORDFEED). ┴PPROPRIATE TRANSLATIONS INTO
- THE ┴╙├╔╔ CHARACTERS {, }, ^, _, ~, \, AND | ARE ALSO SET UP.
-
- % TRANS┬UF╘O┴SCII = *
- % ;0 1 2 3 4 5 6 7 8 9 A B C D E F
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$00,$00,$00,$0D,$00,$00 ;0
- % .BYTE $00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
- % .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
- % .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
- % .BYTE $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;4
- % .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$5B,$5C,$5D,$5E,$5F ;5
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;6
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;7
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
- % .BYTE $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
- % .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F ;D
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7E ;F
- %
- % ;====BSS STORAGE (SIZE=11,264 BYTES)====
- %
-
- ╘HIS IS WHERE THE TRACK CACHE, ETC. ARE STORED. ╘HIS SECTION REQUIRES 11╦ OF
- STORAGE SPACE BUT DOES NOT INCREASE THE LENGTH OF THE BINARY PROGRAM FILE
- SINCE THESE STORAGE AREAS ARE ─┼╞╔╬┼─ RATHER THAN ALLOCATED WITH ".BUF"
- DIRECTIVES. ╘HE ╒NIX TERMINOLOGY FOR THIS TYPE OF UNINITIALIZED DATA IS
- "BSS".
-
- % BSS = *
- % TRACKBUF = BSS
- % CLUSTER┬UF = TRACKBUF+4608
- % FATBUF = CLUSTER┬UF+1024
- % DIRBUF = FATBUF+1536
- % END = DIRBUF+4096
-
- 5. ╒╙┼╥-╔╬╘┼╥╞┴├┼ ╨╥╧╟╥┴═
-
- ╘HIS SECTION PRESENTS THE LISTING OF THE USER-INTERFACE ┬┴╙╔├ PROGRAM. ┘OU
- SHOULD BE AWARE THAT YOU CAN EASILY CHANGE SOME OF THE DEFAULTS TO YOUR OWN
- PREFERENCES IF YOU WISH. ╔N PARTICULAR, YOU MAY WISH TO CHANGE THE "DV" AND
- "DT" VARIABLES IN LINES 25 AND 26. ╘HIS PROGRAM IS NOT LISTED IN THE "%"
- FORMAT THAT THE ASSEMBLER LISTING IS SINCE YOU CAN RECOVER THIS LISTING FROM
- THE UUENCODED BINARY PROGRAM FILE. ╘HE LISTING IS HERE IN ITS ENTIRETY.
-
- 10 PRINT CHR$(147);"LITTLE RED READER 128 VERSION 1.00"
- 11 PRINT : PRINT"BY CRAIG BRUCE 09-FEB-93 FOR C=HACKING" : PRINT
- 12 :
- 20 CD=PEEK(186):IF CD<8 THEN CD=8 : REM ** DEFAULT CBM-DOS DRIVE **
- 25 DV=9:DT=0 : REM ** MS-DOS DRIVE, TYPE (0=1571,255=1581)
- 26 IF DV=CD THEN DV=8:DT=0 : REM ** ALTERNATE MS-DOS DRIVE
- 27 :
- 30 PRINT "INITIALIZING..." : PRINT
- 40 BANK0 : PK=DEC("8000") : PV=PK+30
- 50 IF PEEK(PV+0)=DEC("CB") AND PEEK(PV+1)=132 THEN 60
- 55 PRINT"LOADING MACHINE LANGUAGE ROUTINES..." : BLOAD"LRR.BIN",U(CD)
- 60 POKE PV+3,DV : POKE PV+4,DT : SYS PK
- 70 DIM T,R,B,I,A$,C,DT$,FL$,IL$,X,X$
- 71 CM$="DMFTC+-Q "+CHR$(13)+CHR$(145)+CHR$(17)+CHR$(157)+CHR$(29)+CHR$(19)
- 72 CM$=CM$+CHR$(147)+"/RNX"+CHR$(92)
- 75 DL=-1 : CF=-1 : ME=0 : CA=0 : MA=0
- 80 DIM DI$(1,300),CL(128),SZ(128),DP(128),CN$(300)
- 90 IF DT=255 THEN DT$="1581" :ELSE DT$="1571"
- 100 FL$=CHR$(19)+CHR$(17)+CHR$(17)+CHR$(17)+CHR$(17)
- 110 IL$=FL$:FORI=1TO19:IL$=IL$+CHR$(17):NEXT
- 120 GOTO 500
- 130 :
- 131 REM ** LOAD MS-DOS DIRECTORY **
- 140 PRINT"LOADING MS-DOS DIRECTORY..." : PRINT
- 150 SYS PK : SYS PK+3
- 160 DL=0
- 170 RREG BL,DC,BH,S : E=PEEK(PV+2)
- 180 IF (S AND 1) THEN GOSUB 380 : DL=-1 : RETURN
- 190 PRINT"SCANNING MS-DOS DIRECTORY..." : PRINT
- 200 DB=BL+256*BH
- 205 SYS PK+21 : RREG BL,X,BH : MA=BL+BH*256+X*65536
- 210 IF DC=0 THEN 360
- 220 FOR DP=DB TO DB+32*(DC-1) STEP 32
- 230 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 350
- 240 IF PEEK(DP+11) AND 24 THEN 350
- 250 DL=DL+1
-
- ╠INE 260 SETS THE DEFAULT SELECTION, TRANSLATION, AND FILETYPES FOR ═╙-─╧╙
- FILES. ├HANGE TO YOUR LIKING.
-
- 260 D$=RIGHT$(" "+STR$(DL),3)+" ASC SEQ " : REM ** DEFAULT SEL/TR/FT **
- 270 A$="" : FORI=0TO10 : A$=A$+CHR$(PEEK(DP+I)) : NEXT
- 280 A$=LEFT$(A$,8)+" "+RIGHT$(A$,3)
- 290 PRINT DL; A$
- 300 D$=D$+A$+" "
- 310 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
- 320 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
- 330 DI$(0,DL)=D$+RIGHT$(" "+STR$(SZ),6)
- 335 DP(DL)=DP
- 340 SZ(DL)=SZ
- 350 NEXT DP
- 360 RETURN
- 370 :
- 371 REM ** REPORT MS-DOS DISK ERROR **
- 380 PRINT CHR$(18);"MS-DOS DISK ERROR #";MID$(STR$(E),2);
- 390 PRINT " ($";MID$(HEX$(E),3);"), PRESS KEY.";CHR$(146)
- 400 GETKEY A$ : RETURN
- 410 :
- 411 REM ** SCREEN HEADING **
- 420 PRINT CHR$(147);CHR$(18);
- 421 IF ME=0 THEN PRINT"MS-DOS";:X=MA:ELSE PRINT"CBMDOS";:X=CA
- 422 PRINT CHR$(146);" MS=";MID$(STR$(DV),2);":";DT$;
- 430 PRINT" CBM=";MID$(STR$(CD),2);" FREE=";MID$(STR$(X),2)
- 440 PRINT : RETURN
- 450 :
- 451 REM ** SCREEN FOOTING **
- 460 PRINT IL$;"D=DIR M=MSDEV F=CBMDEV C=COPY Q=QUIT "
- 470 PRINT "T=TOGGLE R=REMOVE X=CBMCPY /=MENU +-=PG";
- 480 RETURN
- 490 :
- 491 REM ** MAIN ROUTINE **
- 500 T=1 : C=0
- 501 R=0
- 510 IF ME=0 THEN MF=DL:MC=2 : ELSE MF=CF:MC=1
- 520 GOSUB 420
- 521 IF ME<>0 THEN 542
- 530 PRINT "NUM S TRN TYP FILENAME EXT LENGTH"
- 540 PRINT "--- - --- --- -------- --- ------"
- 541 GOTO 550
- 542 PRINT "NUM S TRN FILENAME T LENGTH"
- 543 PRINT "--- - --- ---------------- - ------"
- 550 GOSUB 460
- 560 B=T+17 : IF B>MF THEN B=MF
- 570 PRINT FL$;: IF T>MF THEN 590
- 580 FOR I=T TO B : PRINT DI$(ME,I) : NEXT
- 590 IF MF<0 THEN PRINT CHR$(18);"<DIRECTORY NOT LOADED>";CHR$(146)
- 591 IF MF=0 THEN PRINT CHR$(18);"<NO FILES>";CHR$(146)
- 600 IF MF<=0 THEN 660
- 610 PRINT LEFT$(IL$,R+5);CHR$(18);
- 620 ON C+1 GOTO 630,640,650
- 630 PRINT SPC(4);MID$(DI$(ME,T+R),5,3) : GOTO 660
- 640 PRINT SPC(7);MID$(DI$(ME,T+R),8,5) : GOTO 660
- 650 PRINT SPC(12);MID$(DI$(ME,T+R),13,5) : GOTO 660
- 660 GETKEY A$
- 670 I=INSTR(CM$,A$)
- 680 IF MF>0 THEN PRINT LEFT$(IL$,R+5);DI$(ME,T+R)
- 690 IF I=0 THEN 600
- 700 ON I GOTO 760,1050,1110,950,1150,1000,1020,730,860,860,770,790,810,830,850
- 705 ON I-15 GOTO 500,713,1400,713,1500,713
- 710 STOP
- 711 :
- 712 REM ** VARIOUS MENU OPTIONS **
- 713 ME=-(ME=0)
- 714 GOTO500
- 730 PRINT CHR$(147);"HAVE AN AWESOME DAY." : BANK15
- 740 END
- 760 IF ME=1 THEN GOSUB 420 : GOSUB 2500 : GOTO 500
- 765 GOSUB 420 : GOSUB 140 : GOTO 500
- 770 R=R-1 : IF R<0 THEN R=B-T
- 780 GOTO 600
- 790 R=R+1 : IF T+R>B THEN R=0
- 800 GOTO 600
- 810 C=C-1 : IF C<0 THEN C=MC
- 820 GOTO 600
- 830 C=C+1 : IF C>MC THEN C=0
- 840 GOTO 600
- 850 R=0 : C=0 : GOTO 600
- 860 IF MF<=0 THEN 600
- 870 X=T+R : ON C+1 GOSUB 890,910,930
- 880 PRINT LEFT$(IL$,R+5);DI$(ME,X) : GOTO 600
- 890 IF MID$(DI$(ME,X),6,1)=" " THEN X$="*" :ELSE X$=" "
- 900 MID$(DI$(ME,X),6,1)=X$ : RETURN
- 910 IF MID$(DI$(ME,X),9,1)="A" THEN X$="BIN" :ELSE X$="ASC"
- 920 MID$(DI$(ME,X),9,3)=X$ : RETURN
- 930 IF MID$(DI$(ME,X),14,1)="S" THEN X$="PRG" :ELSE X$="SEQ"
- 940 MID$(DI$(ME,X),14,3)=X$ : RETURN
- 950 IF MF<=0 THEN 600
- 960 FOR X=1 TO MF
- 970 ON C+1 GOSUB 890,910,930
- 980 NEXT X
- 990 GOTO 520
- 1000 R=0:IF B=MF THEN T=1 : GOTO 510
- 1010 T=T+18 : GOTO 510
- 1020 IF MF<=0 THEN 660
- 1025 R=0:IF T=1 THEN T=MF-(MF-INT(MF/18)*18)+1 : IF T<=MF THEN 510
- 1030 T=T-18 : IF T<1 THEN T=1
- 1040 GOTO 510
- 1050 PRINT IL$;CHR$(27);"@";
- 1060 INPUT"MS-DOS DEVICE NUMBER (8-30)";DV
- 1061 IF CD=DV THENPRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1060
- 1070 X=71 : INPUT"MS-DOS DEVICE TYPE (71/81)";X
- 1080 IF X=8 OR X=81 OR X=1581 THEN DT=255:DT$="1581" :ELSE DT=0:DT$="1571"
- 1090 POKE PV+3,DV : POKE PV+4,DT : SYS PK : DL=-1 : MA=0
- 1100 GOTO 500
- 1110 PRINT IL$;CHR$(27);"@";
- 1120 INPUT "CBM-DOS DEVICE NUMBER (0-30)";CD
- 1130 IF CD=DV THENPRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1120
- 1140 CF=-1 : CA=0 : GOTO 500
- 1141 :
- 1142 REM ** COPY FILES **
- 1150 IF ME=1 THEN 2000
- 1151 PRINT CHR$(147);"COPY MS-DOS -> CBM-DOS":PRINT:PRINT
- 1160 IF DL<=0 THEN FC=0 : GOTO 1190
- 1170 FC=0 : FOR F=1 TO DL : IF MID$(DI$(0,F),6,1)="*" THEN GOSUB 1200
- 1180 NEXT F
- 1190 PRINT : PRINT"FILES COPIED =";FC;" - PRESS KEY"
- 1191 GETKEY A$ : GOTO 520
- 1200 FC=FC+1
- 1210 X$=MID$(DI$(0,F),19,8)+"."+MID$(DI$(0,F),29,3)
- 1220 CF$="":FORI=1TOLEN(X$):IF MID$(X$,I,1)<>" " THEN CF$=CF$+MID$(X$,I,1)
- 1230 NEXT
- 1231 IF RIGHT$(CF$,1)="." THEN CF$=LEFT$(CF$,LEN(CF$)-1)
- 1232 CF$=CF$+","+MID$(DI$(0,F),14,1)
- 1240 PRINT STR$(FC);". ";CHR$(34);CF$;CHR$(34);TAB(20);SZ(F)"BYTES";
- 1245 PRINT TAB(35);MID$(DI$(0,F),9,3)
- 1250 CL=CL(F) : LB=SZ(F) - INT(SZ(F)/65536)*65536
- 1260 IF CD>=8 THEN DOPEN#1,(CF$+",W"),U(CD) :ELSE IF CD<>0 THEN OPEN 1,CD,7
- 1265 IF CD<8 THEN 1288
- 1270 IF DS<>63 THEN 1288
- 1275 X$="Y" : PRINT "CBM FILE EXISTS; OVERWRITE (Y/N)";
- 1280 CLOSE 1 : INPUT X$ : IF X$="N" THEN FC=FC-1 : RETURN
- 1285 SCRATCH(CF$),U(CD)
- 1286 DOPEN#1,(CF$+",W"),U(CD)
- 1288 IF CD<8 THEN 1320
- 1300 IF DS<20 THEN 1320
- 1310 PRINT CHR$(18)+"CBM DISK ERROR: "+DS$ : FC=FC-1 : CLOSE1 : RETURN
- 1320 POKE PV+6,CL/256 : POKE PV+5,CL-PEEK(PV+6)*256
- 1330 POKE PV+8,LB/256 : POKE PV+7,LB-PEEK(PV+8)*256
- 1340 TR=0 : IF MID$(DI$(0,F),9,1)="A" THEN TR=255
- 1346 X=1 : IF CD=0 THEN X=0
- 1350 SYS PK+6,TR,X
- 1355 RREG X,X,X,S : E=PEEK(PV+2)
- 1356 IF (S AND 1) THEN GOSUB 380 : FC=FC-1
- 1360 IF CD<>0 AND CD<8 THEN CLOSE1
- 1370 IF CD>=8 THEN DCLOSE#1 : IF DS>=20 THEN 1310
- 1380 RETURN
- 1398 :
- 1399 REM ** REMOVE MS-DOS FILE **
- 1400 PRINT CHR$(147);"REMOVE (DELETE) SELECTED MS-DOS FILES:":PRINT
- 1401 IF ME<>0 THEN PRINT"MS-DOS MENU MUST BE SELECTED!" : GOTO2030
- 1402 A$="Y":INPUT"ARE YOU LIKE SURE ABOUT THIS (Y/N)";A$
- 1403 PRINT:IF A$="N" THEN GOTO 520
- 1410 IF DL<=0 THEN FC=0 : GOTO 1440
- 1420 FC=0 : F=1
- 1425 IF MID$(DI$(0,F),6,1)="*" THEN GOSUB 1470 : FC=FC+1 : F=F-1
- 1430 F=F+1 : IF F<=DL THEN 1425
- 1434 PRINT"FLUSHING..."
- 1435 SYS PK+12
- 1440 PRINT : PRINT"FILES REMOVED =";FC;" - PRESS KEY"
- 1445 SYS PK+21 : RREG A,X,Y : MA=A+Y*256+X*65536
- 1450 GETKEY A$ : GOTO 500
- 1470 PRINT"REMOVING ";CHR$(34);MID$(DI$(0,F),19,13);CHR$(34)
- 1490 POKE PV+10,DP(F)/256 : POKE PV+9,DP(F)-PEEK(PV+10)*256
- 1492 SYS PK+15
- 1494 DI$(0,F)=DI$(0,DL):SZ(F)=SZ(DL):DP(F)=DP(DL):CL(F)=CL(DL)
- 1495 DL=DL-1
- 1496 RETURN
- 1498 :
- 1499 REM ** COPY CBM FILES **
- 1500 PRINT CHR$(147);"COPY CBM-DOS TO CBM-DOS:":PRINT
- 1501 IF CF<=0 THEN PRINT"COMMODORE DIRECTORY NOT LOADED" : GOTO 2030
- 1502 X=0 : INPUT"DEVICE NUMBER TO COPY TO";X : PRINT
- 1503 IF X<=0 OR X>=64 THEN PRINT"BAD DEVICE NUMBER!" : GOTO 2030
- 1504 IF X=CD THEN PRINT"CANNOT COPY TO SAME DEVICE" : GOTO 2030
- 1505 FOR F=1 TO CF : IF MID$(DI$(1,F),6,1)<>"*" THEN 1570
- 1506 PRINT DI$(1,F) : OPEN1,CD,2,CN$(F)+",R"
- 1507 IF X<8 THEN OPEN 2,X,7 : GOTO1550
- 1508 CF$=CN$(F)+","+MID$(DI$(1,F),31,1)+",W"
- 1509 OPEN2,X,3,CF$
- 1510 IF DS<>63 THEN 1530
- 1511 CLOSE2
- 1512 X$="Y":INPUT"FILE EXISTS: OVERWRITE (Y/N)";X$ : IF X$="N" THEN 1560
- 1520 SCRATCH(CN$(F)),U(X)
- 1525 OPEN2,X,3,CF$
- 1530 IF DS>20 THEN PRINT CHR$(18);"CBM DOS ERROR: ";DS$ : GOTO1560
- 1550 SYS PK+24,1,2
- 1560 CLOSE1 : CLOSE2
- 1570 NEXT F
- 1580 PRINT : PRINT"FINISHED - PRESS A KEY" : GETKEY A$ : GOTO510
- 1998 :
- 1999 REM ** COPY CBM-DOS TO MS-DOS **
- 2000 PRINT CHR$(147);"COPY CBM-DOS TO MS-DOS:" : PRINT : PRINT
- 2010 IF DL>=0 THEN 2035
- 2020 PRINT"MS-DOS DIRECTORY MUST BE LOADED FIRST"
- 2030 PRINT : PRINT"PRESS ANY KEY" : GETKEY A$ : GOTO 510
- 2035 FC=0
- 2036 FOR F=1 TO CF : IF MID$(DI$(1,F),6,1)<>"*" THEN 2045
- 2040 FC=FC+1 : C$=CN$(F)
- 2041 PRINTMID$(STR$(FC),2);" ";MID$(DI$(1,F),14,16);MID$(DI$(1,F),34);":";
- 2042 GOSUB2050 : PRINT LEFT$(M$,8);".";RIGHT$(M$,3)
- 2043 TR=0 : IF MID$(DI$(1,F),9,1)="A" THEN TR=255
- 2044 GOSUB2100
- 2045 NEXT
- 2046 PRINT"FLUSHING..." : SYS PK+12
- 2047 SYS PK+21 : RREG A,X,Y : MA=A+Y*256+X*65536
- 2048 PRINT: PRINT"FILES COPIED =";FC : GOTO2030
- 2049 :
- 2050 X=INSTR(C$,".") : IF X=0 THEN M$=C$+" " : GOTO2090
- 2055 X=LEN(C$)+1 : DO : X=X-1 : LOOP UNTIL MID$(C$,X,1)="."
- 2060 M$=LEFT$(LEFT$(C$,X-1)+" ",8)
- 2070 X$=MID$(C$,X+1)+" "
- 2080 M$=M$+X$
- 2090 M$=LEFT$(M$,11)
- 2091 FORI=1TO11:X$=CHR$(ASC(MID$(M$,I,1))AND127):IF X$="."ORX$=" " THEN X$="_"
- 2092 MID$(M$,I,1)=X$ : NEXT I
- 2093 I=8 : DO WHILE I>1 AND MID$(M$,I,1)="_" : MID$(M$,I,1)=" " : I=I-1 : LOOP
- 2094 I=11 : DO WHILE I>8 AND MID$(M$,I,1)="_" : MID$(M$,I,1)=" " : I=I-1 : LOOP
- 2098 RETURN
- 2099 :
- 2100 FORI=0TO0
- 2105 FOR DP=DB TO DB+32*(DC-1) STEP 32
- 2110 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 2140
- 2120 NEXT DP
- 2130 PRINT"NO FREE MS-DOS DIRECTORY ENTIRES" : RETURN
- 2140 NEXT I
- 2160 FORI=1TOLEN(M$):POKEDP+I-1,ASC(MID$(M$,I,1)) AND 127:NEXT
- 2170 FORI=11TO31:POKE DP+I,0:NEXT
- 2180 POKEDP+26,255:POKEDP+27,15
- 2190 POKE PV+10,DP/256:POKE PV+9,DP-PEEK(PV+10)*256
- 2200 OPEN1,CD,2,C$
- 2300 SYS PK+9,TR,1 : RREG X,X,X,S
- 2301 CLOSE1
- 2305 IF S AND 1 THEN E=PEEK(PV+2) : GOSUB380 : RETURN
-
- ╠INE 2310 SETS THE DEFAULT ═╙-─╧╙ SELECTION, TRANSLATION, AND FILETYPE AFTER
- COPYING TO ═╙-─╧╙ DISK, BASED ON THE ├┬═-─╧╙ FILETYPE. ├HANGE TO YOUR LIKING.
-
- 2310 X$=" ASC SEQ ":IF TR=0 THEN X$=" BIN PRG "
- 2320 DL=DL+1 : D$=RIGHT$(" "+STR$(DL),3)+X$
- 2330 D$=D$+LEFT$(M$,8)+" "+RIGHT$(M$,3)
- 2340 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
- 2350 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
- 2360 DI$(0,DL)=D$+RIGHT$(" "+STR$(SZ),8)
- 2370 DP(DL)=DP
- 2380 SZ(DL)=SZ
- 2395 RETURN
- 2498 :
- 2499 REM ** LOAD COMMODORE DOS DIRECTORY **
- 2500 PRINT"LOADING COMMODORE DOS DIRECTORY..." : PRINT
- 2501 IF CD<8 THEN PRINT"CBMDOS DEVICE MUST BE >= 8!" : GOTO2030
- 2505 OPEN1,CD,0,"$0":GET#1,A$,A$ : CF=-1 : Q$=CHR$(34)
- 2506 DO
- 2507 SYS PK+27,1 : B=PEEK(PV+11)+256*PEEK(PV+12) : T$=CHR$(PEEK(PV+13))
- 2510 X=PEEK(PV+14)
- 2520 IF X=0 THEN EXIT
- 2530 X$="" : FOR I=PV+15 TO PV+15+X-1 : X$=X$+CHR$(PEEK(I)) : NEXT
- 2575 CF=CF+1
- 2590 IF CF=0 THEN PRINT"DISK="Q$X$Q$ : PRINT : GOTO2650
- 2600 CN$(CF)=X$
- 2610 A$=LEFT$(X$+" ",17)+T$+RIGHT$(" "+STR$(B*254),8)
-
- ╠INES 2620 AND 2625 SET THE DEFAULT ├┬═-─╧╙ SELECTION AND TRANSLATION MODES
- BASED ON THE FILETYPE. ├HANGE TO YOUR LIKING.
-
- 2620 DI$(1,CF)=RIGHT$(" "+STR$(CF),3)+" ASC "+A$
- 2625 IF T$<>"S" THEN MID$(DI$(1,CF),9,3)="BIN"
- 2630 PRINT DI$(1,CF)
- 2650 LOOP
- 2670 CA=B*256 : CLOSE1 : RETURN
-
- 6. ╒╒┼╬├╧─┼─ ╞╔╠┼╙
-
- ╚ERE ARE THE BINARY EXECUTABLES IN UUENCODED FORM. ╘HE ├╥├32S OF THE TWO
- FILES ARE AS FOLLOWS:
-
- CRC32 = 3896271974 FOR "LRR-128"
- CRC32 = 2918283051 FOR "LRR.BIN"
-
- ╘HE "LRR.128" FILE IS THE MAIN ┬┴╙╔├ PROGRAM AND THE "LRR.BIN" FILE CONTAINS
- THE MACHINE LANUGAGE DISK-ACCESSING ROUTINES.
-
- BEGIN 640 LRR-128
- ═`1╨╙'`╚`╞2#'*#$╘-╥─[(─╤)5%1,12!2140@4─5!1$52(#$╥."!615)324].
- ═(#$╬,#`┬`&─<"╨"9(#╚@╞2)"62!#4─%)1╥!"4┼5#12`╨.2╒&14(═.3,@1─]2
- ═($,]2$%#2╘┼.1╥(@.┬"9`&\<#``┌`*╠<%`!#1++"*#$╪-┬─┌┬╥!#1+,╪(*<@
- ═0╘2╥."`┌((\@*┬╚@1$5&055,5"!#0─╘═1$]3($12259%("╚╩`.8<&0!$5╦(┘
- ═.─14╠├`@.┬`@├╥`╩*┬!-4╥╒$3╒,@1%))5─4╠(%194$4@*#`],34╫,2╨╥-34]
- ═,34╪,2─`'!╘:`(╠@1%:╥0╘0@╔╥!$5╦(╪.─14╠├`@.┬"/("╚╩($%,5$523─%4
- ═12!-4╥╒$3╒,@1%))5─4`(┴╘;`#╚`/┴╘>`)─@(─┼.251)04╤)6─┼.1╥╪╬+┬(@
- ═.┬"9`&`=*`#^`├`@.┬!02[+1*"(╪,#`╨(┬─@.┬!05╦)02┌╚╙,`")'3(`┬╥#"
- ═*%!6╩├`╔╠═$╚(─-"(┬─@╦╥#"*%!6╩├$╔╠├$╙,┬"╟(#8╨`,─=-╨"9(─╤/041)
- ═3─<@34%#2$┼.12!,04┘'54%'12!23╒5424┘%4╥╪╬+┬(@.┬#^$2),4┼(╬0─┼.
- ═(┬╤5*$-$*0#╩'3╨`┼╥!05╩╚╙+$16(#╚@┼╥!05╩╚╘+$14(#╚@╟┬!02╨`.'─8`
- ═┴┬!4+%(╠0┬╤)+$$─+$,╠1%0─+$9,)"╤)3"0╠6"╤8)`!('─<`0╘╘─╠┬)$3494
- ═0╥╠═42`┬╩╠<╚,3,╔╩╠<╚,30╒*:╦'*#$╫*:╦'*#$╒-╥╞╩╤╥@╥.2╞╩╤╥@╤.2─`
- ═:!┘(`$--)+)#322╩╤╥@╤-#<╔╩┬(╧4─┘8(╩╦'*#─╥*0"/'─╠`1$╥╥╩╙$@.┬!#
- ═1╦*╦,2`┌($╒%╠├`@.┬!#0;(╨(#╚@34&╥,`#!'┼``┴┬!$220╚,2╨╙,#`╔+$-,
- ═*#$╥."─╠4╒╚╚,3(╪*2╤$4"@╤,├@╔+$-.)"@╙,#`╔`.─>6@"+($14╠├(╒-2"╟
- ═($14)+(┬,34╪,2(@.═4@1%0─╠┬(╤-3<╤(@`/'╓0`1─╨─╠╠<╚,3─╔╩╠<╚,3<╔
- ═╩╠<╚,3<╔╩╠<╚,3<╔╩╠<╚,3<╔`#,?;@!)3"2╥1─╨─.╚%)╠├&─,3─┌24╨─╠─┼,
- ═)*╦'*#$╫*3╩"`#╘?>`")(#4╨,`!#'╪(`.@!┼'╪,`├╥`╩*┬!,3╘%$($╒3+41/
- ═4╥!$25)%0╒1/4┼─@*┬╚`├!^,`)─┬3$]!1$┼.1╥!-4╥╒$3╒,@1$┼214-43╒)9
- ═+┬╪╬(┬`┌()─`╟┴^6`)╪@4$╠@.┬">(%!+╩├,`╔╤^@`$1,╠├``╤1^╩`/╪)($),
- ═+$1#+$)(+%,@.┬!%╠╠(╚4%:╩,┬─`┘╤^╘`(╠@*%,@╦╥`╤*2"╟((╘@,╙@╨(#╚@
- ═1$╥╥╩╙$@.┬".``\@╧@"9(┼-#04┘.24┘'($╒3+41/4╥!$25)%0╒1/4┼─╬+┬╪┬
- ═(#╚@╞0`@(,@`1$*╥0─╥╩,├4╓╦$)(`%`@╙0">(%!+╩├(╤(#╚@_@─@0─╨╠6"╤"
- ═2"`┌($╒!╠─),╩─)(╦#(╒-╩╔8╦#8╒-3,╓`&$@╘@"+($1#╠├`@╔╥`╙-├``@2#<
- ═`($@1%"╥1$(@╔"!$0╩╚╙,╩╨╚1$.╦,2─@╩2`╙,@"┴(.8`┬╥#"*$10*;(╨(+`@
- ═╨┬┴$4"╞╥,├(┘(*<@,╙4╨`+╠@\`"+(,(╚1%"╩,3$╔(*\@,├0@╔╥`╙-3``╤╥#┌
- ═`$1,╠─1,╩├$`"╥$$`40─╠╠─╚(┬`┬╩╠0╚1$╨╔+#,╔╩┬(@("`@($%30╥`@4╘51
- ═("`┬(#╚@├╥`╩*┬!$149!54╤4(%-%3"]44┬]&5"`╩*@`╓(0╪!022╥(┬(@.┬"!
- ═2;(╨╔#$╨(#╚@022╥022╩╤╥├"*$10╩──╔*2`┌(((`4┬$8`4$─╠╠@╚020╠."╞╩
- ═(┬`@(╩╦)*$$─+#,╔`%\┴(@&9($1,.╥!!)`!╤(2╨!1"2╥1"2╩022╩(┬`@(@"2
- ═(38!0╘╨╚1$╨╔╠╠(╚1%"╩,├8╔╩├(╒-╩╙"*$10╩├(╫*0"^(4`!4╒╩╥╨┬┴$4*╚╥
- ═."╞╩,├4╓╦,(╚1%"╩,├─╔╩├8╒-3,╓╦,(╚1%"╩,╙`╔`.$┴2@%$220╚,"╤$3"╞╥
- ═1"2╩╥2@┬("`@("*╩╤"┴36┬─╠-┬─`[╥%/`410*$1,*;)$4`#](50!4╒╚╚1$╨╔
- ═╠┼-:``8┬7@&"($10``╨┬:`&.`!(┬<@$┌`#<┬<╨&/("╚╩(%)%4$]25"!-4╥╒$
- ═3╒,@1$┼32╥!%4┼)/4┬`╩*@!─(╟╨!╞2#'*#$╪*3╠┬35,═1$]3($1)4╘╠@15)2
- ═3╒(@(╥([╥┬├$*$4╔+#(╔.╨"1(╚8!╞2`┬("@─(├╧**-(╚12─╠,╥─[(┬─╠(%!2
- ═15-3($═%62╪┬.\<╚,30╓*0"?(╔`!╚?─@020@.┬".`*4┬╞@$┌`,`┬╞╨&/("╚╩
- ═(%-#4─5%3┬!(14%$24┘'("╚╩`-0┬╔`&9(,<╚,30╫*3╧'*#$╪*3╠``╥.┼`8╠@
- ═346╥,""╟()─┬35,═1$]3(├╠┌6+)-03╦5()─┬0╘)-1$]3(├╠┌6+)#00`╠(┌8!
- ═╞2#'*#$╘-┬─[(┬`@35,](├╧**,0╚1%8╔+#(╔.╥(┌(├═$5"0[`%─├╦@&9(┬`@
- ═0╘)-/2([╥┬├$*$-$*2╨╥*3╠┬("!&4─5%/2([╥┬├$*%@╔+#(╔`&,├╬`&9(#╚@
- ═├@!╔(\(!.@"$(\,!├╥`╩*┬!30╒)%14╪@1─]/5$┼.1╥`╩*@"╪(\╨!╞2!)3"0[
- ═(─0]1$┼2($╘]35-$158@1├╒#0─╒$158@0╙╒#3╒!9(%$]455)5"`@("(`[2/6
- ═`9─@("`@(")4/51/1╘=,12!2/5)%34]612!8/4-"34-062`╧/4╒%3┼4@*╥╘]
- ═4$<┬.╨#╙(^`!├@#┘(^╚!.@`2).╠!├╥`╩*┬!-04┼.(%)/551)3─4@*┬╚`("3╘
- ═`52╥,2`┌($.╥,``╚)/4!4╦(╨`$\─_@&+($╒%╠├`@╔╥!-1╦)$3#╔-0[(╥(#╚@
- ═╒2!-1╦)#1├╔-0[(╤`%──"`*-(#0╥,`!╦)`─"┬╥!-1;.╤,""╟(#4╘,@";)!("
- ═╞2`┬3┼5-("!3("!44─╪@(%194"`@1─┼,14┘!344@($585"`@3$5.1╒1((@#+
- ═)!╨"╞2`┬+2╘═("`═("`═+2╘@("╘═+2`@+2╘═+2╘═+2╘@("╘═+2`@+2╘═+2╘═
- ═(@#5)!╘"┬2`╒-3``!24>`╔─@(─┘532`@4╥`@5%).("!&24╤%3─%-12`@("`@
- ═("`@(%0@($╤%3─=42"(`-24?`╔─@(┬╘═+2`@+2`@+2╘═("`═+2╘═+2╘═+2╘═
- ═+2╘═+2╘═("╘@("╘═+2╘═+2(`/╥4╞`╚╘@-#8╨`%╚┼,`)"╠┼2╩,3<@.┬"+($*╤
- ═348@╔╥!"╠─╒&`',┼.@*9($9,)#╠┌((╠@5+%-1┬"╟(#4┘,`"3)40"@2!)╠┼0@
- ═╔"!"(#╚@╞2!$220╚344╠22─@.┬""`,@┼3@*+($╒&╠╙`@╔╥"9(,<╚,3@╔.╥(\
- ═1$┼214-43╒)9($┘/5"!,3╘%$140^(├╧'*#$╘-┬─`\25/`╚╠@34:╥,""╟()─@
- ═╤╥@╤."─[(├╤.3╥!&24╤%4╙╪┬.\<╚,30╓*0`#)┼@"┬╥!-1╦.╥,""╟(#8╓,``;
- ═)╞("╞2#(*$┼,)"╤2╩├4╔.\<╚,3@╔.╨`╙)╞╨"─2!#╩├$@┬2`╓,╙`╠-├0╨+#8╒
- ═,`!8)╟8"╞2"╞-"─[╥┬┴$220╚344╠5*╔2*2╨╒+#,╔(#╚@┬2`╓-├``?2:``╔─@
- ═╔├<╔.\╚╚1$──*$╒%+%2╩4┬─╠."╨╒*2`┌((─@-├8╨`*0╞┬@*9(*8╤,┬─[╥┬┴$
- ═220╚344╠5*╔2*2╨╤,╥╨╒*2`┌((─@-├8╨`*╪╞┼`*┴^2!!)`"^)╔╪"2;+4*$--
- ═)"╤!)"─`┘":╚`╚╠@34:╤,""╟()─@╥"┴)3"0╠4╩╚╒*3═$220╚344╠5*╔2*0#╘
- ═)╦("┬╥!)╠├`@╔╥`╓,#``/╥>\`╔$@22")(#<╓,"╨╤,#4╨+#$╤,3`╠.34╨+#$╤
- ═-3`╠,3`╨,"╨╤,#(╨+#<╙,"╨╪-├`╠.#8╨+#<╫,"╨╫.3`╠.#$╨+#@╙,"╨╪-3``
- ═9┬?!`╔$@2:╠╤-2")(#4╨,"╨╫,3,╠,30╨,"╨╫,3,╠,34╨,"╨╫,3,`;"?&`╔``
- ═<┬?'`├╚`─╥?(`╚\@*┬╚@5─%224]54╥!-14┘5($]05$┼/3┼,@*┬╚`╚┬?)`─╒%
- ═╠╩╠╚346╥,"─`╩╥?*`╚─╒,#``╒┬?:`╔─@╤╥@╤-#<╔.╥)(059%($%.($%715-/
- ═344@1$%9+┬(@.┬#^`├$╒`-╨╟┘`*````╚^`*+($╒%╠├$@╔╥"-(#0╥,"`┌((╘@
- ═,├4╨,"`┌((─@-3`╨`!╚╚_0*-(#0╥,"`┌((╘@,30╨(#╚@┬2`╒,#``-"@"`╒*╥
- ═4╩╠╤(#╚@┬╥!2╠╙`@╔╥!2╠─*╦5``^*`╨#┬2`╓,#``6"@6`╒*╥4╩╚╤(#╚@┬╥!4
- ═╩┼*╤0┬"╟(%*╥,`!┬*"`#┬2`╓,#``>╥@╩`╘.╥0┌╠╤(#╚@┬╥!#╠╙`@╔╥!#╠─╒#
- ═`(4╚-`.)(#8╨,`">*#╪#0[)#╩├$@.┬"+($.╤34,@╔╥!#╠├``╩"┴(`╪─@-├`╨
- ═`+╪╚4@-2╠├`@.┬!#╠├`@.┬")(#8╨,`#0*%╨#┬╥!-1╦.╥,""╟(#8╨,`#╨*&8#
- ═6+)4╩┼(@.┬"1($.╩,2"-(#@┘,"╨┘,3`╠.3,╨`!,╔<`.9(,@╚24╨─+%*╩-2─[
- ═1$──*$╒%+%@╔(#╚@┬2`╓,#``02┼┌`╪╠@╥┬┴$220╚344╠6"─╠-┬╨╤*;(┬("(@
- ═╔╥!8)+(┬*┬(@.═4@6"2╥(┬`┬`%╘╔┴`/**$1))"┴-12╤8*2╨╓+#$╔╠┼@─(#╚@
- ═├@"/*8╪#┬╥#**$1))"┴-12╤8*2╨┘+#$╔╠┬)!(┬"╟(%@─╠┬)"24╪┬(#╦5(%@─
- ═╠┬)!4╘,┬`*╠╔╞`/**$1))"┴-12╤8*2╨┘+#,╔╠┼@─(#╚@├@#>*:(#┬╥#**$1)
- ═)"┴-12╤8*2╨╤-"╨╤*;(┬4╥(@╔╥!8)+(┬4%)'(┬`┌╒2!8)+(┬4╘51(@#[*:╨#
- ═╥┬┴$220╚344╠6"─╠,30╠,╥╞╥6"0@.┬".``╘╩═@.+($╒&╠[(╨(*<@-├`╨`!╨╩
- ═╨`.!(%┬╥,2"─($╒&`#0╩╥@.1($.╩,2"-(#@┘,"╨┘,3`╠.3,╨`#╨╩╒`."(%@`
- ═1┬╦>`╪─@-3(╨`&,╩┌`-2╠├`┌┬╥!"╠─╒&(*<@5+(╤(#╚@┬2`╒,3``=┬╦╥`╒2╥
- ═5*╚╤."`┌((─@-3$╨`(@╩_`.+($╒&╠[(╨(*<@-├8╨`,`╩`012╠├`┌┬╥!4╠├$@
- ═╔╥!4╠─╒&╩╥┴-1╩╬╒*$╒&╦3$╪*:╨╤."╞╩,2`┌((╠@5+.╥348@╔╥`╒,3``╓2╚&
- ═!%2╥5*╠╤."`┌((╠@5+,╤(*<@5+(╤`.,╩$`2)(#4╤,`#╪*┴╚$╞2!)3"0[╤╥@╥
- ═-╥─[(─`┬.╨`>*╥0$┴2)-4╥╒$3╒,@1$5624-%($┘534)%4┬`╚."╘╙,"─┬.╘16
- ═`&(╦)02+($-$╠─16(*>9(─╒3+41/4╥!!3─0@0╘)-+41/4╥!$159)0╘53($╒5
- ═4╒0@0─4@1$┼&1─5214┘4(2(┌┬3$╨-├``├┬╠╬!%┬╥-╙$@.┬"%(─╒3+41/4╥!$
- ═159)0╘4@5%┼012`@*#<╤+╙@╤*2([6`#/*╙@$┬╥!8╠├@@╠"!8╠├@╤(+`@6+(╤
- ═-3@╤(*<@1%2╥,├4╒.─14)+(┬,34╪,2(@.═4@1%2╥,#╔$5"2╥(├$╒-╙$┬`/\╦
- ═0@27(%!6╩├,╠1%8@.┬"7(%!6╩├0╠1%0@.┬">(%!+(#╚@1$╥╥╩╙$@.┬!-0;(╨
- ═``─╠3`2)(#4╨,``>+%8$╞2!)3"0[╤╥@╥-╥─[(─`┬.╨!&+&`$┴2`┬0╘)-+41/
- ═4╥!$159)0╘4@3┼5-0─52("@╨+3,╨*2([0╘0`┬┬╤╩!(╠@0╘2╥1%8@╔┘─┬35,═
- ═1$]3($%.1"!#0─╘═1$]3($1%5─┼#15,@35535"!"12!$249&15)%3┼0┴(├╩)
- ═,3$╥,`"├+'0$0╘:╥╩╙$@.┬!#0;(╨(#╚@┬2`╒,#``╩2╤╒!#╚`╨"╤╓!(\@*┬╚@
- ═0╘]062!&24╤%4╥`╩*@#2+'╪$┬╥!-1;(╤(*<@,├`╨,`#\+'\$╞2#'*#$╘-╥─[
- ═(─-/4%─@35,═1$]3("╘^($-"32╒$3╒,┬.╔─┌╞0`8+8@$┬╥!$3+.╥,""╟($9#
- ═╠├`@.┬")(#$╤.3``3╥╓2!$9#╠├`@.┬"!($:╥,2"─($1,(#╚@┬╥#**$1))"@╨
- ═+$8╔+#8╠,2╞╥(┬╚┬(*<@├2`╤,├`╨`%<═╟`2"($8`@╥╓╞!)─@.┬"9(─9)3$53
- ═($-/4$┼%1"`](├═&0╙╠┬("╘@4%)%4╒,@2╘59(@"5+:<$╚?─@020@.┬")(#4╥
- ═,`"┴+;`$1─.╥1─.╩,0#.+;╚$6"2╥╥┬┴$220╚,"╤&*2╨╤.2╨╪*:╚┬+┬*╩╥┬┴$
- ═220╚,"╤&*2╨╥.2╨╙*0`)+╠0$0╘8─╠┬(┬.╚%)╠├&─╨╥┴8)"─┌┬╥#**%@─+$─╠
- ═,2╞╙╠2(@(┬"╟($-&)+)#1┬2╩╥┬┴8)"╤)+#$╔``\╬╙@2"`#@╬╙╨2+(,─╚0╘8─
- ═+#$╔╠┬(╬(┬"╟($-&)++(*$-&)"╙#*$-&)"╞╦,2─`62[0!$-&)+)#1┬2╩(┬╨┬
- ═╩╠╚╚1$──*#`╠1┬─╠,30╠,2─`├2[8!)─@╤"┴&0╥─[(┬╪@(├╧'*#,╘*3═#1┬0[
- ═╤╥@╙-"─[╚╙(╨*3═36┬┴&*2)"651%4╥([`*@╬╫029(*,╙-2─[╥┬┴$220╚,"╤&
- ═*2╨┘+#,╔`-<╬╪@1#3+)#3"┴&*2`┌($╤"╠┼-:*$8╔(*╠@═2┴36┬┴&*:╘╓-34╙
- ═-┬╞╠-├4╒,╙8`$2_╠!(╠@0╘2╤╠├@@╔╥#^#2,╤+"┴#1┬2╩(┬╤7(┬─╠52┴#1"─@
- ═.═4@┬╥!#1+.╤,""╟()\@,2╤#1"╨╫`",╧\02+($-$╠╙@@╔╥`╤,├@╪`#<╧]@2+
- ═($13╠[$╓,╥"╟(#$╥.#@`:┬_[!%@─╠┬)9(┬`┌()─@(─-"32!&24╤%($5825-4
- ═4╙╠@3╒9%4┼=2251%("┴9+╘╪╔(├╠`─┬\`!:`@,2`┌((4@6"0@.┬"+(%@─╠┬).
- ═(┬"╟($9#╠─9#╩╙$@.┬".`*,╧!07╥*$-&)"─╠52┴#1"─`╧2\&!?╪-(╙$╠*$-&
- ═)*╚┬+%<┬*2╤5*$-$*0#/+╨@%┬╥!#1+,╪(*<@,3,╥,`#┬+╤0%┬╥!$4[,╥,""╟
- ═(#$╙,├```>!9─@╤╥@╤."╞╩(─-"32!$25-+($524─]2.┬`┬╩─13)"`┌($9#
- ═╠─9#╩╙$@.┬"@,2`┌((╪`0├`╚!9<@4%:╩-┬╤#3*╘╥-38@.┬"7(%!6╩├4╠0╘╥╦
- ═╨┬┴05╩╚╓*:╨╥-38`;#`╥!9<@4%:╩."╤,0╩╘╥-38@.┬"7(%!6╩├<╠3$*╦╨┬┴0
- ═5╩╚╪*:╨╥-38`┼├`\!512╠├`@.┬"+(,╚╚1$──*#`╠1┬─╠.2╨╤*;(┬02(@╔╥!4
- ═4╦(╥-34`╦3!"!5┬╥,2`┌((╠@0╘2╥,""╟(%┬╥,`"],$8%╟┬!02┌╚╓+%12+%@`
- ═╓#!+!?╪)(%@╠6"╤8+%,@.┬!%╠╠(╚4%:╩,┬─`^#!,!8╠@*%,@╦╥`╤*2"╟((╘@
- ═,╙@╨(#╚@1─.╥1─.╦,0`0,5`%┬╥!#1+.╤,""╧($-$╠╙@@╔╥"@,0`╒,5╚%┬╥!#
- ═1+&╥.""╟(/╪/(╙$@.┬"+($13╠;(╥,""╟(#$╙,3``.╙%─!8╪`03%╓!3╚`8#%╫
- ═!8\@*┬╚@4─5-3╒9%($╒3+41/4╥!&24╤%("╚╩`)@╤>`69(,<╚,30╫*3╠┬4─5-
- ═3╒9%("┴$14╤%5$4╔(%-%3$5#5$5$($╒3+41/4╥!&24╤%4╙╚┬.╔─`╙╙%┘!8╠@
- ═346╙╠3`@╔╥"9(─╒3+41/4╥!-14┘5($╒54╒0@0─4@4╘5,14-4140┴(┬`┌((─╥
- ═,#,╨``,╥>@5!)+(┬62(┌┴2)!4─4@64]5($╤)2╘4@4╒5212!!0─]55"!42$┼3
- ═("┴9+╘╪╔(├═!)``:,╟╠%╞3╩+($$─╠┬).(┬"╟((─@-3(╨`#8╥@@6+($1,╠[(╨
- ═(*<@1─.╥,"`┌((─@,30╘,`!%,╚╨%1─.╥,"`┌($:╥,0!┌,╔$%┬╥#**$1))"@╨
- ═+$8╔+#8╠,2╞╥(┬╚┬(*<@├2`╤-#<╨(#╚@1─.╥1─.╩,2`┌($:╥1╩╠╤`)4╥┼@5&
- ═╠─:╩,2`┌((╠@1╦.╥1$╨@╔╥`╤-#(╒`*@╥╞@69(─9,55-(24┘'+┬╪╬(@"╘,╔╠%
- ═╟┬!02┌╚╤,@#┴,╩`%╞2`┌()─┬1─┼,15,@4─5-3╒9%1"`](├═&0╙╠┬("╘@4%)%
- ═4╒,@2╘59(@`-,┌4%╟┬!02┌╚╥,2`┌(/╪)($$╠6"╤9(#╚@34&╥0:╔9╦#(╒-╩╔8
- ═╦#8╒-3,╓`!\╙╩@6┴^2!!)"`┌((─@-3`╨`$╪╙╧@69(┼)%34]624┘'("([╤╥@╙
- ═-"─[╥┬┴$220╚,"╤&*2╨╤.2╨╤,╥─[╤╥@╙-"─`@#/2!9<@4%:╩,3`╠1%`╚1┬╞═
- ═,├4╓(#╚@┼╥!05╩╚┘+$10*$8╔╩\(╚4%:╩,3`╔╦#(╒-@",,]0%╟┬!02┌╚╤-0#*
- ═,]8%1$──*#`╠1┬╞╥1$──*#`╠1$╨╔.┼-:*$8╔╠┼-:*$1,*3╔$4"┴&*;)$4"┴$
- ═3"─┌0╘╨╚1┬╞╥0╘╨╚1$╨╔`-8╙╒╨5$3+)$3*╠╤`-╨╙╓`6.`.(╙╓@4┌`/╘╙╓╨6/
- ═("╚╩($-/4%─@0╘)-($9)3$53("╚╩`"<╘╫`69(,<╚,30╫*3╠┬0╘]062!#0─╘═
- ═1$]3(%1/($-"32╒$3╒,┌(├╩9`&`╘╫06+($-&╠[(╨(*<@╞2)#3╘╒-3╘1/4─4@
- ═1$┼214-43╒)9($┘/5"!,3╘%$140┬(#╚@┬2`╥,#,╨`(╨╘╫@58╠├`@.┬"%(─1%
- ═5─┼#12!.54╒"15(@5$\@0╘]062!43╥([6"`┌()─`╨#3?!8╠@6+.╥,""╨(%┬╤
- ═╠├8╘(*<@╞2)"040@1$5624-%($┘534)%4┬$┬(#╚@┬2`╥,#,╨`/0╘╪`6+(%┬╥
- ═0╘0@╔╥"9(─-!3─┘/5"!#3╒!9(%1/(%-!344@1$5624-%(┬`┌((─@,├`╙,``├
- ═->$%@2!&╠├$@╔"!#1┬`┌((╠@╥┬┴$220╚,2╤&*2╨╓+#$╔╠[$┬*┬(@╔╥`╤-3<╨
- ═`$@╒╪@69($1))"@╤+$8╔(#╚@╟╙$╠0╘0╠,┬╤#3┬0╚1┬╞╩(┬╤2(@!─->,%┬╥!8
- ═╠╙@@╔╥"?(#(╠6"╨╫(#╚@┬3$╒-3``├37─!4-&)+)#3┬0╚1┬╞╩(┬╨┬╩╠╚╚1$──
- ═*#$╠1┬─╠,╙$╠,2╞╩(┬╤7(@"<->4%╟╙(╠6"╨╙+$-&)`"╨->8%┬╥!$4[.╤-├,@
- ═╔╥`╤-3,╨`+<╒┘╨6@,@#╫->@%6"2╥(┼─┬.╚4┬1─┼,12!%6$┼35%,┌($]615)7
- ═4─┼412`╚62].*2([6"0@.┬"+(%@─╠┬).(┬"╟(#$╒-├``"├;╨!?(╚0╘╪─*$8╔
- ═*2╤5*%@╔`!─╓]06?,┬╤8+#,╠0╘8─`$╘╓^@6+($13╠3(╨(*<@╞2#'*#$╪*3╠┬
- ═0╘)-($1/4╥!%4┼)/4├╚@(├═$4╥0@.┬"),34╓,`!=-@╪&╟┬!02┌╚╥-"╨╤+#(`
- ═:388!╩`╤(#╚@╚#(`<38┬!╚(@1@"┬-┬╨&╞2`┌()─┬1─┼.25-(140@+2!04─53
- ═4╥!!($═%62(@.┬"┴^2!!)"`┌((─╒,3``╩#;.!╙╚`╥╙;/!╪\@*┬╚@0╘]062!#
- ═0─╘═1$]3(%1/($╒3+41/4╥`╩*@#┌-═`'╞2#'*#$╘-╥─[(─-/4%─@0╘)-+41/
- ═4╥!43╥!-4╥╒$3╒,┌(┬`┌()─@.┬"9``╘╫╓@>+($1,╠;(╨(*<@,├`╙-0`┌-^0'
- ═╞2)-4╥╒$3╒,@1$┼214-43╒)9($╒54╒0@0─4@3$]!1$5$($9)4┼-4(@!├-^╪'
- ═╞2`┌()─┬4%)%4╒,@04┘9($═%62(@.┬"┴^2!!)"`┌((─@-3$╨`&╨╫\╨=&0[(╨
- ═`)╠╫]`>!($:╥,2"─($-&(#╚@┬╥#**$1))"@╤+$8╔+#8╠,2╞╙╠2(╩(┬"╟(#(╨
- ═-#4`╠╙?╪!╘9#╠─9#╩├$@.┬!#)+)#3┬0╚1┬─`[3?┘!┘╟**,0╚1─,╔+#(╔.╥(@
- ═(├╧**$1))"@╤+$8╔+#$╘+#$╓*3╧**$1))"@╤+$8╔+#,╘*3╠┬.┬([``\╪^@>-
- ═,├`╒,"`┌()─@╥"┴-)"╨╪*3╠┬+┬([╥2┴-)"╨╙*0`┘./╠'5%*╥,"`┌((╠@╥┬┴$
- ═220╚,2╤&*2╨┘+#$╔╠┬)!(┬"╟(%12╠├(╒-0!#./╨'├3(╤,#``23├]!╪(`9├├^
- ═!┘─┬1─╤54╘┴)3─<╬+┬╪┬(#╚@╟┬!02┌╚╤,@"2./\'╟┬!02┌╚╥,2`┌(/╪)($$╠
- ═6"╤9(#╚@34&╥0:╔9╦#(╒-╩╔8╦#8╒-3,╓`+8╪``┬9.┬"9(─9)3$53($-/4$┼%
- ═1"`](├═&0╥`┌((─╥,#,╨`+╨╪`0@┌`/(╪`@┴8╠═0╚0╥0╠(┬╪┬*2`┌((╠@6+(╨
- ═(*<@322╥0╥2╩(┬`@("`@("`@("`@(┬`┌((─╥,#─╨`"`┘!╨┴8╠╠,╚0╥0╔╩├$@
- ═.┬#╦(#╚@6+)8╩╙$@.┬#╠(/╨@╥┬┴#)"╤8+#$╔╠┬(╬(@!!.0╨(322╥╥"├(*$,─
- ═+%┬╦,2╞╩(┬`@("`@("`@(┬╨╪*0!8.18(6"2╥╥┬┴#)"╤8╩├$╔╩┬(@("`┬`&4┘
- ═(`┴-)+)-)*╔8)`!╒.2╚(322╥╥"┴-)"╨╤,2─`╠3─╦"(%)╠├&─,3$┌6"2╥╤╥├&
- ═*,╚╚320╠22╨╤*2╞╧,3(╫*3╩+(%@─╠┬(╬(╦!8)+(┬("(@╔╥!8)+(┬7╥(`╥#─╠
- ═",╚╚320╠22╨╤*;)8)"`┌(((@20`&.┬╘(2;(╪(#╚@┌╥#]($╞╤,2"╧(,╚╚320╠
- ═22╨╤*;(┬7╥(@.┬#**$╘─+$─╠,2╞╥(┬`┬(#╚@2;))╩╙$@.┬#╠`$4┌+@┴)╠├$╤
- ═(#╚@┌╥#]($╞╤.""╧(,╚╚320╠22╨╤*;(┬7╥(@.┬#**$╘─+$─╠,2╞╥(┬`┬(#╚@
- ═2;))╩╙$@.┬#╠`$╠┌,@┬.`%$┌,╨@┌`%╨┌-`┬!2;(╨╔#``?#╚┘"($@1%"╥1$(@
- ═╔"!$0╩╚╙,╩╨╚1$.╦,2─@╩2`╙,@"=.├╪(┬╥#"*$10*;(╨(+`@╨┬┴$4"╞╥,├(┘
- ═(*<@,├$╘,`"╞.─@(@┬!$4`#2.┼((╞2).3╥!&4─5%($╒3+41/4╥!$25)%0╒1/
- ═4┼─@14┘425)%4╥(@.┬".`-╚┌7`┬"($─`!├═╨"(%)╠├&─╨╥┴-)"─┌┼╘10╩─╞╦
- ═,2╙&*,╚╚320╠22╨╤*2─@╦╥`╤,├<┌@@`>.╫╚(@4╞╥,3&─,╙$┌┼╥!$4*╔)+#`┌
- ═@@`╫.╪0(┼╘10╩├(╓+#(╒-3╩71%"╩,├<╠,34`83╬.")<@4%:╩,3`╠1%"═,├4╓
- ═.╔<@4%:╩.2╤$4*╧"*%!6╩├$╨*:╨╥-38`<#╬8")\╤+$-$+#(╠0╥0`├3╧\")╪@
- ═4$╬╩.2╤44┬╨╤(#╚@_@─@6"╤8+%@╠4╨"4._╘(╚#$`═╙╠!"8╠@4╥"╧(#$@╔╥!%
- ═╠╠(╚4%:╩,┬─@.┬"-,╙@╨(#╚@├@#╬.╨8)6"2╥(┬`@("`@05-#("!315$@("(┌
- ═┬╥!44╦(╨(*<@6"2╥(┬`@("`@0─┼.("!04─<@("(`$3╨0"41,╠─1,╩├$@.┬!$
- ═)++)*"(@(╩╦$*$1,*2╨╙*:╔8)``╨/!╚)1"2╥1"2╩╥"┴-)"╨╪*:╚┬("`┬╩╠─╚
- ═320╠,╥─`43╨─"4-,*$1,*;+"*$10╩├(╓*:╚╥-3:╠╨┬┴$4*╚╥-╥─`?3╨╬"5-:
- ═╠╠(╚1%"╩,├@╔╩├(╒-╩╙"*$10╩├(┘*:╚╓-34╙-╩╙"*$10╩├,╨*0"─/#@)1$──
- ═*#`╠1$╨╔╠─0─╩╠─╚(┬`@("`@("`@(╩╦$*%-:*2╨╪*0"╥/$()1%`╚1$╨╔╠─10
- ═`,`\3`┼36┬┴$3"╞╥4╒╚`╤├╤;"8╪`╙#╙""3╚`]3╙#"8\@*┬╚@3$]!1"!#3╘╒-
- ═3╘1/4─4@1$]3($1)4─5#5$]262`╩*@`├/<0)╞2),3╘%$24┘'($-/34╒/1$]2
- ═12!$3╒,@1$┼214-43╒)9+┬╪╬(┬`┌()─`5╙╫%"8╠@0╘2╙.""╟()─┬0╘)-1$]3
- ═($1%5─┼#12!-55-4($)%(#╪](#@┴(┬`┌((─╥,#,╨`(4]╥0╞?,2╤#1"╨╨+"(─
- ═,"(┌╚2,╤+$$─+$$─(#╚@0╘:╥╩╙$@.┬!1)++'*#,╘*0"+/<╚)┌╨#$/<╠)╟┬!0
- ═2┌╚╥-╥╨╤(#╚@0╦+"*%!6╩├$╤*:╚╥-3:╠╨┬┴05╩╚╤,┬─@.┬!4)++'*,(╚4%:╩
- ═,3,╔*0#3/<╪)6++"*%!6╩├$╘*0#┴/=@)┬╥!8╠├`@╔╥#═`!<^╪@┼8)+(┬(┬`┌
- ═(($@2;)05╩╚╤-2"─(%!6╩├$╒╩┼┬╦,2`┌(%@─╠┼@─╩╠<╚╨┬┴)*2─@.┬""`",^
- ═#╨╔#1╦)#1╩╚╤`$╠^'@╩+($-&╠├`@╔╥"9(─1)4╘╠](┼$─6"11)"`┌()─@.┬")
- ═,├8╒,`!:/┬@*0╘╪─*$-&*;)8)`"9/├(*022╥╥"┴8)*╚┬("`@("`@("`@("`@
- ═("`@("`┬+#$╫*:╔4)*╦)*"(@("`@("`@(╩╦$*$*╠,├4╘*2╨╪*0#'/├╨*1$──
- ═*#$╠0╘8╔╠╠─╚(┬`@(╩╦$*$-&*2╨╙*:╚┬("`@("!!4╘,@("*╩020`[├┘!"╚╠@
- ═5"2╙╠2)3(┬"╟(,╚╚1$──*#$╠0╘8╔+#─╠,╥╞╥(─))3┬(`_├┘&"╔─@1$──*#$╠
- ┬0╘8╔``0_6@╦╠`!╚_;@╔#0;)"╦#(╒-┬`┌(*`╤(#╚@├@``````
- `
- END
- BEGIN 640 LRR.BIN
- ═`(!,#(),7(-,┴89,\╪=,,(5,┌(1,/8!,╚╪5,2╪┴,@(├+┴```````````````
- ═````````````````````````````````````````````````````````````
- ═````2*─`┴9"═(8`@╠?^╔;╥"3_┌┼5(*├_))`╨#┌─╨(*├_:""╚_╥20,`(88*─%
- ═├2"`.&"═`-╒)$(╘`╫6"╔""╨-╫/#[8""3@*╪,╫""*@(╔@╩1╚@6╪"0`6`@╦╧\─
- ═─##.&"!'_╥╨-╫""*@"";@(╘@@"─/╥0*╨):``()╬`╞56`╥,`&─/48╩0@@6╪"0
- ═`6"╔`2╨┬@#`"╩00@╩/\@╦╧]@2(╚╔`0╚*"@╚╠(╚`0`──0(%╬`:)`!8""╚_┌─!
- ═(*├_╩0─@╩/\@╦╧]╪&"!'_╥╨-╫""*@*╟╓╚(╩%`╚0#╩0"%!"╨┬@#`#($:!(%┌!
- ═╠`╟╞!*4$╥0╞0┌╤┴88*╟╓┴0*╞!!┬╔┬╟╒5@84#8``($`8.!`╨""┬";@(╘@@"─/
- ═╥0*0`6"┬`╩``╩0@╠#=╙╨^┌╘`╫4─0├0#=╦0╙<─0+(╘.╟╞`\╦0┘&!(┴`2**0$*
- ═"@╚*"0(╠(╚`0`──0(%╬`:)`!8""╚_┌4$(*├_╩0$@╩/\@╦╧]╪╩4"%!3@@1_]╪
- ═+`╫<╚@*@`*╘`╫<╘`╫=#╪104╔0/#╥╠0*-#-╥┼!4┼`┴06╔""╨-╫/#[╥-#=┘@/*
- ═╘-@8($?_+`╫<((╩`().`╦@╙<((╩`┬╚╘@@"─/╥0)88*─.├0#_╩?^-2╚"-2╪"┬
- ═!┘╒-@,╚0^╚╒,@!┴@╙4╩`╘!#╠2╪#0"╪┬8"┴┴╔┬╩┬╔]┴┴@├4╩`├─╬`┴`4@\8"0
- ═&:╘@@"─/╥0╧╨`├┴@(*:`╦4╩`╦─╬`╔`60╓╓"═2╚"╬2╪"─!4╨╞@╩+_┌#├╔$╦#┌
- ═┬!#╫&&─2╥*┬*8"!╠@╩(`╨`╞0"$┬8┌0╞╚:*(!╥&"&"╥!^@╚4(┴@╞$"╩4(╔@╞─
- ═"┬`╞@╔`!8(4,┴`╓┬`╩``╠0╥1!╠┬╤#)$&╥-#╘┘@╫╞!\╦0[>8*╔0╦)"╔`2╩0&%
- ═"╬8)╔0╟)`╔`&╩0"%">8(╤@╧0╬╤┴@..─"╠`&(╦├┌`╪`'╨!╨╩$!╥8'╔`<8;42`
- ═─`'(8"#├@╩+╓┴@:┬╟(8'╦├┌`3)&"('┌"╙4╩`╘`_╠2╪#0"─┬╔_╪╒*@(╒+@&@@
- ═├(%@```@╪╪*┬]╚8"╚╔╥&`╪╘╦@╪╨╠@╥`0@┘`!8*╘^@,─"╠`%@╦2╬#╦"╥#&&─!
- ═─`'((!"#8*─.├0#_╩0"@`"!^@┬`╞@╔`!8(4"┴`.@#;$"├3┌`╥0.0!┌─\├2"`
- ═.&"@$+$"╥0+0\:`6╠0*-/╪#)!+#╞╚!&╤`╚╒!@,╞!╠-═*2─╔*├4"`╚!.╤`╚╒"
- ═@,┬╤`╚╒#@*`8╠0+)"="_╚!╩╤`╠─"╘+>@#╦$"╥0'0╦┌╘_@`╚8:0&-18`8;4"`
- ═├42`╦4*`╦$.`..╒$@+`!┬(╒&@(╤'@*╘^@,─"╘`9.1╪!╬1╚`8╦4:`:0*-2("═
- ═1╪!╔`(╒)@*╟╓╚*"%!╚0'╩0&@`*╪_@""1@╔`!8*╟╓╚*:%!╚0'╦46`╚`"╬0(`@
- ═─8*0`6"╔]╩"╞╦─&`&&"%!80#1@-╩┴02╞`╨╚╞`╤┴┼!(4"┬╞4#┴0,8╔0)╔]╚4"
- ═╔0-╔╚(4#╚`*╤`╔─&`(@0^&`@1(2┼!2─!╘`┬┼!╥─/╩*4&8*4'╚@1&"&╦*╘/╩─
- ═"&`@1(2┼"┬─/┴0╩┼!2─!╘`^┼"84&╔0<╔\`4*┴0=,╤82┬!`8))@╦*╘/╞┼"╚4(
- ═╔0<╔#╨4)┴0>@`╦─&`)$"┬!#╪├$╥`8#┬═)╪#╔]╩╘╚@.╞╞2┬─'╩╩╟_╟4╓`8*`.
- ═├`#_╦2>`╦"┬`┴0*$`┌╟┼╚`"1`╩`:╠0*%#╠┬╤`╚4/╔0_)!9`#3-.$╩*4.('2$
- ═2)┴(╩0"%"84*╔0┌─#╥"2┴&┬%#╓┬%#─╨(┴:─.├0#_╦4╥`\"┌╔`(╒,@*─"┴6&╔
- ═`84.╦3^`┴6"╔]╩"@┴0*$`┌4.╚``@$(.0`6#╞#╠9@╘/#&8=#?╦46`┴0┌═0("%
- ═8*─`┴6&╔]╩"╞┴0*$`┌9┴╧4╓`\!"╔`)╒-@*4.╚``@$(/&`\8#┘@[╞8>8#┘@/&
- ═8-#=&&"@#╚╨`_┌─"╚`"%#╚0/┴&"$8:4.╔`\@=(2$`@4"╘`;╞8-`"┘╞'╞#═`"
- ═┘@^┼#╠╒(@*4/[4╞`─-╬╬/╚`&8"9┴╥═#┘╩0"─8*9┴8*5─╔&4@_╪*0`6"╔]╩"<
- ═┴6"$8:─`┴6*═/╚`*┴6.┼9*1┼('2$┴62$9<`%─!╥═)8"%8╩─!╦├┌`╪`'╨`╩─#
- ═+2:`╘`6╬)8#╨`╚5├(#6&8*8/╘`(88"#)_┘`$├2"`8*╟_╔╞/0`╩5┬┴6:@`+%@
- ═)`╪0!╩╩]]╚├╨`╥#2_\├$9═#╠&*5@96:%8)`"┘╞$╪╔6+┼9╚5┬╠`+&8┌5┬!6/0
- ═╤"#,_╤┴@╚`┌,`/^%#╚8/╦2.`╦"2`┴62$94╥┴┴┬#╩┴9`!8*5┼╥060]!┴@┴0┌&
- ═4*─`┴5&%5(558*─`┴6*%8┌94\`2╔`!┴@╔┼`@╤╧^0!(╘@@&"╔_┌93╘`*┼4╚5╞
- ═╚``@((>0`6#╨!┘%@╥,1╞╘/&$9┴┬┼8&5╞┴6"0`╬9┴&*5┬96:%8╔`"┘╞,╪╔5+┼
- ═9╚52╠`+&4┌54╘`:┼4@53╘+@@╙/^┼8@5├&&"┼5/`!`*51\`┬╔`(51╩0╚88*55
- ═*4#╨"*╟_┴52╔`!┴@(,__╔╔"&59`'├2"`(,╙_8"0.$`╥╩╧?:)\,?)#=`"┴5&┬
- ═_╤┴@╔5╦-2("┼6^╒)@)`!8*5:╔%╠@=(2$`@4"╘`:┼6╩1;&╞6═#<┘┼═,8╪<@
- ═8╪>0`6"%"80*╔60%9?`2╔62─9:8)┴╞2╞"╚9┼()*$3,>'╦2>`╦"┬`┴0*$`┌`:
- ═╔0╞1`╚5─╥*4*─0*%9:╟_╚`^%"80*╔62─92"2┴*5─╔&4@+8.0`6`8╔5╤┼8╚5<
- ═╔5╒┼8╪5=─`+╞7┴┴@╚`┌,`/\@╩8:╔`(5─┴66%6╪5<┴5╓%7╩─"┴5╩╔]╩"<┴6"$
- ═8:╘^@`╩╚╩0"%4╚13(+:&─`%@\`8@├(>0╪&"═)╪"╠*("%`╚0#╚@"@'+5<─0+(
- ═┌.`#─/8@╘╪088*`.├`#_┴@^╩╩0`@╩8:╔]╩"<┴6"$8:─`╚`2%4╚13(+:&╠!+╨
- ═$*╟╓╚)╥%8(1┴(#6&╠`-,6(┴@╚`┌,`/^╩(,;_─`╥╔`(╘╠@(╘╔@(╘╩@&`@┘(@@
- ═┘(@@┘(┬-*8`@┘(┬-*╚"╔`(╘╠@"#─┬,─┬\`├)0═#╒(,╙_8*``(.2(╥2+╨!╔─═
- ═@,├0\╪╨╠@"#─┬,─@\/╞-*╪`@┘(├)`-#┘(,╙_8"#/_[`%))!╨`6!╚:"#,_╘╥+
- ═┬```````````%`─-`),`````````````````````````("$┬(╥0┼)┬<╚*2╚╦
- ═+"╘╬+╙`╤,├,╘-38╫.#─┌.╙╨]/├]`╨<+#╤,7&╤\├)╥╠╧,╙<[/╘-'2╘]35╒═?8
- ═╓=╔;7%╒>7\!!0─-$149'2$┼*2╘╤-3─]045)35%565╒┴96═╧<╫=[?````````
- ═````````````````````````````````````````````````````````````
- ═````````````````````````````````````````````````````````````
- ═```````````````````````````````````````````````````````)````
- ═#0````````@``````````````"`┴(┬,─)28╟*"─╩*╥╨═+┬\╨,3(╙-#4╓-╙@┘
- ═.├╠\/3╪_0&%┬8╓1┼9╞=╚:6╔╦;&╒╬;╫!╤<╟-╘=79╫>'┼┌6╒╤=7┼\`````````
- ═````````````````````````````````````````````````````````````
- ═``````````````````````````````````````````````````````````!@
- ═04)#1$5&1╘┴)2─═,34┘/4%%24╒155┼=865╔[?'╒^?╨``````````````````
- 2``````````````````````!^````
- `
- END
-
- 7. ╘╚┼ ╞╒╘╒╥┼
-
- ╞UTURE IMPROVEMENTS TO THIS PROGRAM WOULD INCLUDE IMPLEMENTATION OF ═╙-─╧╙
- FORMATTING, MORE FILE MANIPLUATION COMMANDS (SUCH AS ╥ENAME), RE-WRITING THE
- USER-INTERFACE ┬┴╙╔├ PROGRAM IN MACHINE LANGUAGE, AND MAKING A FILE BUFFERING
- FACILITY FOR THOSE PEOPLE WITH ONLY ONE DISK DRIVE. ╚OWEVER, ╔ DON'T INTEND
- TO DO MUCH MORE TO THIS PROGRAM. ═Y INTENTIONS ARE TO PUT THIS FUNCTIONALITY
- INTO A DEVICE DRIVER FOR A NEW OPERATING SYSTEM (OR AT LEAST, OPERATING
- ENVIRONMENT) FOR THE ├-128. ┴NYONE ELSE IS FREE TO IMPROVE THIS PROGRAM.
-
- =============================================================================
- ╔N THE ╬EXT ╔SSUE:
-
- ╘╫╧-╦┼┘ ╥╧╠╠╧╓┼╥
-
- ╘HIS ARTICLE WILL EXAMINE HOW A TWO-KEY ROLLOVER MECHANISM WOULD WORK FOR THE
- KEYBOARDS OF THE ├-128 AND 64 AND WILL PRESENT ╦ERNAL-WEDGE IMPLEMENTATIONS
- FOR BOTH MACHINES. ╫EBSTER'S DOESN'T SEEM TO KNOW, SO ╔'LL TELL YOU THAT THIS
- MEANS THAT THE MACHINE WILL ACT SENSIBLY IF YOU ARE HOLDING DOWN ONE KEY AND
- THEN PRESS ANOTHER WITHOUT RELEASING THE FIRST. ╘HIS WILL BE USEFUL TO FAST
- TOUCH TYPERS.
-
- ╘HE ╙ECOND ╥OB ╚UBBARD ═USIC ╥OUTINE
-
- ╔N THIS ARTICLE, THE SECOND ╥OB ╚UBBARD MUSIC ROUTINE WILL BE PRESENTED IN
- THE SAME WAY AS THE FIRST. ╞UTURE ISSUES WILL HOPEFULLY EXAMINE VARIOUS OTHER
- MUSIC ROUTINES INCLUDING VARIOUS ═ARTIN ╟ALWAY, ┬ENN ─AGLISH, ╩EOREN ╘EL,
- AND ═ANAICS OF ╬OISE ROUTINES. ╬OTE: ╒NFORTUNATELY THE AUTHOR COMPLETES
- UNIVERSITY (AND THUS LOSES INTERNET ACCESS) IN ┴UGUST 1993.
-
- ─┘├╨ - ╚ORIZONTAL ╙CROLLING
-
- ─┘├╨ - IS A NAME FOR A HORIZONTAL SCROLLER, WHERE CHARACTERS GO SMOOTHLY
- UP AND DOWN DURING THEIR VOYAGE FROM RIGHT TO LEFT. ╧NE POSSIBILITY IS A
- SCROLL WITH ONLY 8 CHARACTERS - ONE CHARACTER PER SPRITE, BUT A REAL DEMO
- CODER WON'T BE SATISFIED WITH THAT.
-
- ═ULTI-╘ASKING ON THE ├=128 - ╨ART 2
-
- ╘HIS ARTICLE WILL EXAMINE THE ACTUAL CODE THAT MAKES UP THE MULTI-TASKING
- KERNAL IN DETAIL AND INCLUDE SOME EXAMPLE PROGRAMS EXPLAINING IT USE.
-
- ╘HE 1351 ═OUSE ─EMYSTIFIED
-
- ╘HIS ARTICLE WILL EXPLAIN HOW THE 1351 MOUSE WORKS AS WELL AS PROVIDE AN EASY
- TO USE INTERFACE IN MACHINE LANGUAGE FOR BOTH BASIC AND MACHINE LANGUAGE
- PROGRAMMERS.
- ==============================================================================
-
-
-