home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / HACKING4.LZH / issue4
Encoding:
Text File  |  1990-02-12  |  152.6 KB  |  3,621 lines

  1.                    ########
  2.              ##################
  3.          ######            ######
  4.       #####
  5.     #####  ####  ####      ##       #####   ####  ####  ####  ####  ####   #####
  6.   #####    ##    ##      ####     ##   ##   ##  ###     ##    ####  ##   ##   ##
  7.  #####    ########     ##  ##    ##        #####       ##    ## ## ##   ##
  8. #####    ##    ##    ########   ##   ##   ##  ###     ##    ##  ####   ##   ##
  9. #####  ####  ####  ####  ####   #####   ####  ####  ####  ####  ####   ######
  10. #####                                                                     ##
  11.  ######            ######        ╓OLUME 1, ╔SSUE #4
  12.    ##################             ╧CTOBER 5, 1992
  13.        ########
  14.  
  15. -----------------------------------------------------------------------------
  16. ┼DITOR'S ╬OTES:
  17. BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
  18.  
  19.   ═Y APOLOGIES ABOUT THIS ISSUE BEING POSTED LATER THAN WAS MENTIONED IN A
  20.   PREVIEW POST ON COMP.SYS.CBM NEWSGROUP. ─UE TO SOME PROBLEMS WITH CODING,
  21.   SCHOOL AND ═URPHY'S LAW THE ISSUE HAD TO BE DELAYED UNTIL NOW.
  22.  
  23.   ╔ HAVE ASKED THE SYSTEM ADMIN'S AT MY SITE CONCERNING A MAIL-SERVER BUT THEY
  24.   SAID THEY DID NOT HAVE ENOUGH MAN-POWER (GO FIGURE) TO GET SOMEBODY TO RUN IT.
  25.   ╔ WILL BE IMPLEMENTING A MAIL-SERVER SYSTEM IN MY ACCOUNT IN THE NEAR
  26.   FUTURE FOR RETRIEVAL OF PROGRAMS AND BACK-ISSUES. ╔'LL POST DESCRIPTIONS OF
  27.   HOW TO USE IT IT THE NEXT ISSUE OF ├= ╚ACKING AS WELL AS ON THE NEWSGROUP
  28.   COMP.SYS.CBM WHEN ╔ FINISH WRITING IT.
  29.  
  30.   ╔N THIS ISSUE OF ├= ╚ACKING WE ALSO START ON AN AMBITIOUS TASK: ─EVELOPING
  31.   A GAME FOR BOTH THE ├128 AND ├64 MODES THAT INCLUDES ALL OF THE FEATURES
  32.   FOUND IN COMMERCIAL GAMES. ╘AKE A LOOK IN THE ╠EARNING ═╠ ├OLUMN FOR MORE
  33.   INFORMATION.
  34.  
  35.   ┴LSO, ╘HE ARTICLE CONCERNING THE 1351 MOUSE HAS _AGAIN_ BEEN DELAYED DUE
  36.   TO TIME CONSTRAINTS. ╥EST ASSURED THAT IT WILL BE IN THE NEXT ISSUE OF
  37.   ├= ╚ACKING.
  38.  
  39.   ╔F YOU ARE INTERESTED IN HELPING WRITE FOR ├= ╚ACKING PLEASE FEEL FREE TO
  40.   MAIL DUCK@PEMBVAX1.PEMBROKE.EDU (OR DUCK@HANDY.PEMBROKE.EDU). ╫E'RE ALWAYS
  41.   LOOKING FOR NEW AUTHORS ON ALMOST ANY SUBJECT, SOFTWARE OR HARDWARE.
  42.  
  43. ================================================================================
  44.  
  45.   ┴LSO NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS FTP FROM
  46.   CCOSUN.CALTECH.EDU UNDER PUB/RKNOP/╚┴├╦╔╬╟.═┴╟.
  47.  
  48. ================================================================================
  49.  
  50.   ╬╧╘╔├┼: ╨ERMISSION IS GRANTED TO RE-DISTRIBUTE THIS "NET-MAGAZINE", IN 
  51.   WHOLE, FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL 
  52.   AUTHORS FOR PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPERATELY.
  53.  
  54.      *** ┴╒╘╚╧╥╙ ╠╔╙╘┼─ ┬┼╠╧╫ ╥┼╘┴╔╬ ┴╠╠ ╥╔╟╚╘╙ ╘╧ ╘╚┼╔╥ ┴╥╘╔├╠┼╙ ***
  55.  
  56. ================================================================================
  57. ╔N THIS ISSUE:
  58.  
  59. ╠EARNING ═╠ - ╨ART 4
  60.  
  61.   ╔N THE NEXT ISSUE WE'LL EMBARK ON A PROJECT OF MAKING A SPACE INVADERS STYLE
  62. GAME FOR THE ├=64/128 FROM SCRATCH USING CUSTOM CHARACTERS, INTERRUPT-DRIVEN
  63. MUSIC, ANIMATION, USING THE JOYSTICK, MOUSE OR KEYBOARD. ╘HE ├64 AND ├128 
  64. VERSIONS WILL BE DEVELOPED CON-CURRENTLY, EACH PROGRAM TAKING ADVANTAGE OF 
  65. THE MACHINE'S CAPABILITIES. ╘HIS IS THE FIRST IN A SERIES - WRITTEN BY 
  66. ├RAIG ╘AYLOR.
  67.  
  68. ╘HE ─EMO ├ORNER: ╞╠╔ - MORE COLOR TO THE SCREEN
  69.  
  70. ┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64.
  71. ╞╠╔ PICTURE CAN HAVE ALL OF THE 16 COLORS IN ONE CHARACTER POSITION.
  72. ╫HAT THEN IS THIS ╞╠╔ AND HOW IT IS DONE ? ╫RITTEN BY ╨ASI '┴LBERT' ╧JALA.
  73.  
  74. ╥╙-232 ├ONVERTER
  75.  
  76.   ╘HIS ARTICLE DETAILS PLAN FOR A ╒SER PORT ╘╧ ╥╙232 CONNECTOR USING JUST ╧╬┼
  77. ╔├ AND 4 CAPACITORS. ╘HE CIRCUIT IS INCLUDED, AND SUGGESTIONS ON ALTERNATIVE
  78. CHIPS AND PARTS ARE EXAMINED.  ╫RITTEN BY ╫ARREN ╘USTIN
  79.  
  80. ╔NTRODUCTION TO THE ╓╔├-╔╔
  81.  
  82.   ╘HIS ARTICLE EXAMINES THE ╓╔├-╔╔ CHIP IN DETAIL AND PROVIDES AN EXPLANATION
  83. OF THE VARIOUS REGISTERS ASSOCIATED WITH THE CHIP. ╫RITTEN BY ╨ASI '┴LBERT'
  84. ╧JALA.
  85.  
  86. ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
  87.  
  88. ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
  89. OF ═╙-─╧╙ DISKS.  ╘HIS PROGRAM COPIES FILES FROM DISK TO DISK SO TWO DISK
  90. DRIVES ARE REQUIRED TO USE IT (OR A "VIRTUAL" DRIVE).  ╘HIS SCHEME IMPOSES NO
  91. LIMIT ON THE MAXIMUM SIZE OF A FILE TO BE TRANSFERRED.  ╘HE USER-INTERFACE
  92. CODE IS WRITTEN IN ┬┴╙╔├ AND PRESENTS A FULL-SCREEN FILE SELECTION MENU.  ╘HE
  93. GRUNT-WORK CODE IS WRITTEN IN ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM
  94. VELOSITY.  ├OMPLETE, EXPLAINED CODE LISITINGS ARE INCLUDED.  ┬Y ├RAIG ┬RUCE.
  95.  
  96. =============================================================================
  97. ╠EARNING ═ACHINE ╠ANGUAGE - ╨ART 4
  98. BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
  99.  
  100.                      +---------------------------+
  101.                      ▄ ╙PACE ╔NVASION - ╨ART 1   ▄
  102.                      ▄                           ▄
  103.                      ▄ ╨ROGRAMMING: ├RAIG ╘AYLOR ▄
  104.                      ▄ ╟RAPHICS   : ╨ASI ╧JALA   ▄
  105.                      ▄ ═USIC/╙OUND:              ▄
  106.                      ▄                           ▄
  107.                      +---------------------------+
  108.  
  109. ╔. ╔NTRODUCTION
  110.    ------------
  111.  
  112.   ╔N THIS AND FUTURE ╠EARNING ═ACHINE ╠ANGUAGE'S WE WILL DEVELOP A GAME CALLED
  113.   ╙PACE ╔NVASION. ╘HE GAME WILL BE SIMILAIR TO ╙PACE ╔NDVADERS AND WILL RUN ON
  114.   THE ├OMMODORE 64 OR THE ├OMMODORE 128 IN 80 COLUMNS. ╔T WILL FEATURE ALL THE
  115.   "FEATURES" AND "PARTS" THAT ARE FOUND IN COMMERCIAL GAMES WITH INTERRUPT-
  116.   DRIVEN MUSIC, CUSTOM CHARACTER DEFINITIONS, 100% MACHINE LANGUAGE, MULTI-LEVEL
  117.   GAME PLAY, AND INPUT FROM THE KEYBOARD, JOYSTICK OR MOUSE.
  118.  
  119.   ╬OTE ▄ ╔ AM LOOKING FOR SOMEONE TO HELP AID MUSIC COMPOSITION THAT WILL
  120.   -----+ BE INTRODUCED IN A LATER ISSUE. ╨ROGRAMMING OF THE 6502 IS HELPFUL
  121.   BUT NOT A REQUIREMENT. ╨LEASE EMAIL ME AT DUCK@PEMBVAX1.PEMBROKE.EDU IF
  122.   YOU ARE INTERESTED.
  123.  
  124.   ═ANY THANKS TO ╨ASI ╧JALA FOR HIS WORK WITH THE GRAPHICS IN THIS PROGRAM.
  125.  
  126.   ┴LSO PLEASE NOTE: ╘HIS ENTIRE PROGRAM HAS BEEN ASSEMBLED SUCESSFULLY WITH 
  127.   THE ┬UDDY-128 ASSEMBLER FOR BOTH THE ├=128 AND ├=64 VERSION. ─UE TO THE
  128.   LENGTH OF THE SOURCE FILES (OVER 1,500 LINES) ╔'M NOT SURE IF ┬UDDY-64 WILL
  129.   HANDLE IT. ╘HUS IF YOU GET ERRORS DURING ASSEMBLY, ALL ╔ CAN SAY IS: SORRY.
  130.   ╔F THIS IS THE CASE THEN THE NEXT ISSUE WILL HANDLE DIVIDING THE PROGRAM AND
  131.   DATA UP INTO SEGMENTS WHICH CAN THEN EACH BE LOADED SEPERATLY.
  132.  
  133.  
  134. ╔╔. ═ACHINE ╬OTES
  135.     -------------
  136.  
  137.   ╘HE ├OMMODORE 64 AND 128 PROGRAMS FOR ╙PACE ╔NVASION WILL DIFFER SLIGHTLY,
  138.   MOSTLY IN THE FOLLOWING AREAS:
  139.  
  140.        - CUSTOM CHARACTER DEFINITION
  141.        - MEMORY INITIALIZATION / SETUP
  142.        - SOUND / MUSIC
  143.  
  144.   ┬ECAUSE THE ACTUAL GAME PLAY AND THE CHANGES NESSCESARY BETWEEN THE AREAS 
  145.   LISTED ABOVE, WE WILL USE THE ┬UDDY ┴SSEMBLER NOTATION FOR CONDITIONAL 
  146.   ASSEMBLY TO ALLOW THE DEVELOPMENT OF ONLY ONE FILE CONTAINING THE SOURCE
  147.   CODE. ╔N ADDITION TO CONDITIONAL ASSEMBLY MOST OF THE ROUTINES WILL BE
  148.   WRITTEN AS ONE WITH JUMPS TO SUBROUTINES CONTAINING THE ├64 OR 128 DIRECT
  149.   CODE AS THE ALGORITHIMS ARE USUALLY THE SAME FOR EACH.
  150.  
  151.   ╔N ADDATION THERE WILL BE SEVERAL SOURCE FILES AND SOME MISCELLANEOUS INCLUDE
  152.   FILES FOR GRAPHICS AND SOUND. ╞OR THOSE OF YOU WHO ARE OR WILL BE CONVERTING
  153.   THE ASSEMBLY SOURCE OVER TO A DIFFERENT ASSEMBLER THE CONDITIONAL 
  154.   ASSEMBLY DIRECTIVES .IF (CONDITION) WILL ONLY BE TRUE IF THE CONDITION IS
  155.   NON-ZERO. ╔E: IF THE SYMBOL COMPUTER IS DEFINED AS 128 THEN THE FOLLOWING
  156.   EXAMPLE ILLUSTRATES IT:
  157.  
  158.        COMPUTER = 128
  159.        .IF COMPUTER-64         ; NON-ZERO ANSWER SO THEREFORE
  160.        ; 128 CODE GOES HERE
  161.        .ELSE
  162.        ; 64 CODE GOES HERE
  163.        .IFE                    ; END THE .IF CONDITION.
  164.  
  165.   ┴LSO NOTE THAT FOR MUCH OF THE PROGRAM WE WILL _NOT_ BE USING THE COMPUTER
  166.   ROUTINES AND INSTEAD BE DEVELOPING OUR OWN.
  167.  
  168.   ╔N ADDITION THE PROGRAM WILL SHOW YOU HOW TO USE ╔╥╤ INTERRUPTS TO SIMPLIFY
  169.   PROGRAMMING. ╫E WILL BE USING THEM TO PLAY MUSIC IN THE BACKGROUND ON THREE
  170.   VOICES (SOUND EFFECTS WILL TEMPORARILY PRE-EMPT THE THIRD VOICE FROM PLAYING).
  171.   ┴LSO ANIMATION OF CHARACTERS WILL BE DONE VIA THE ╔╥╤. ┴ LITTLE BACKGROUND
  172.   ON INTERRUPTS FOR THOSE OF YOU WHO ARE A BIT HAZY ON WHAT THEY ARE OR HAVE
  173.   NEVER SEEN THEM BEFORE (┴LSO TRY TAKING A LOOK AT ╥ASTERS: ╫HAT THEY ARE AND
  174.   HOW TO USE THEM IN ├= ╚ACKING #3 - ╫HILE THIS DOES NOT NECESSARILY COVER
  175.   WHAT WE ARE GOING TO BE USING INTERRUPTS FOR IT DOES DESCRIBE THEM QUITE 
  176.   WELL.) ┬ASICALLY THE COMPUTER GENERATES AN INTERRUPT EVERY 1/60TH A SECOND
  177.   FROM A TIMER ON THE COMPUTER (USUALLY FROM THE ├╔┴ CHIP OR THE SCREEN FOR 
  178.   THOSE OF YOU WHO ARE CURIOUS). ╘HE COMPUTER WILL SAVE ALL THE REGISTERS, JUMP
  179.   TO A SUBROUTINE - PERFORM THE INSTRUCTIONS THERE (USUALLY UPDATING TIME,
  180.   SCANNING THE KEYBOARD ETC...) AND THEN RECALL ALL THE REGISTERS AND RETURN
  181.   TO THE USER PROGRAM. ╘HIS IS AN INTERRUPT. ┴N ╔╥╤ INTERRUPT DESCRIBES AN
  182.   INTERRUPT THAT WE CAN ALLOW TO BE "TURNED ON" AND "TURNED OFF" - IE: WE
  183.   CAN TEMPORARILY DISABLE IT IF WE HAVE TO. ┴ ╬═╔ INTERRUPT DESCRIBES AN
  184.   INTERRUPT WHICH WE CAN _NOT_ TEMPORARILY DISABLE -- WE WILL NOT BE USING
  185.   ╬═╔ INTERRUPTS IN THIS PROGRAM.
  186.  
  187.   
  188. ╔╔╔. ╘HE ╨ROCESS
  189.      -----------
  190.  
  191.   ╨ART OF WHAT THIS SERIES OF ARTICLES IS FOCUSED AT IS THE DEVELOPMENT OF BEING
  192.   ABLE TO ANALYZE PROGRAMMING TASKS AND BREAK THEM DOWN INTO SMALLER WORKABLE
  193.   PROBLEMS. ╧NCE THESE PROBLEMS OR SUBROUTINES ARE COMPLETED YOUR ORIGINAL
  194.   PROBLEM IS SOLVED.
  195.  
  196.   ╠ET'S TAKE THIS APPROACH TO ╙PACE ╔NVASION:
  197.  
  198.   ╨ROBLEM ╙TATEMENT: ┬UILD A ╙PACE ╔NVADER PROGRAM CALLED ╙PACE ╔NVASION.
  199.   -----------------
  200.  
  201.   ╒SUALLY, GIVEN A PROBLEM YOU HAVE TO RE-WORK THE PROBLEM STATEMENT TO 
  202.   ENCOMPASS ALL OF WHAT YOU WANT. ╠ET'S TRY AGAIN:
  203.  
  204.   ╨ROBLEM ╙TATEMENT: ─EVELOP A ╙PACE ╔NVADER PROGRAM CALLED ╙PACE ╔NVASION
  205.   -----------------  UTILIZING THE 64 OR 128 SCREEN WITH INTERRUPT DRIVEN
  206.                      MUSIC / SOUND, AND ALLOWING INPUT FROM THE KEYBOARD, 
  207.                      JOYSTICK OR MOUSE.
  208.  
  209.   ╚MMM... ╘HE PROBLEM STATEMENT LISTED ABOVE IS BETTER BUT IT HAS NO REAL ORDER;
  210.   WE HAVE NO CLEAR IDEA OF WHERE TO START AND WHAT WE NEED TO DO. ╔T DOES 
  211.   HOWEVER TELL US THAT WE HAVE THE FOLLOWING SECTIONS:
  212.  
  213.        - 64 / 128 ╙CREEN ╚ANDLING
  214.        - ═USIC / ╙OUND
  215.        - ╔NPUT ╚ANDLING
  216.        - ╟AME ─RIVER (IMPLIED)
  217.  
  218.   ╠ET'S THINK A BIT MORE ABOUT EACH OF THESE SECTIONS AND WHAT EACH WILL
  219.   INVOLVE:
  220.  
  221.   128 / 64 ╙CREEN ╚ANDLING:      - ╨UTTING CHARACTERS ON SCREEN.
  222.   ------------------------       - ╔NITIALIZING THE ╙CREEN / ╥EGISTERS.
  223.                                  - ╙ETTING UP THE ├USTOM ├HARACTERS.
  224.                                  - ╚ANDLING ANY ┴NIMATION.
  225.  
  226.   ═USIC / ╙OUND:                 - ╙ETTING UP THE ╙OUND ├HIP ╥EGISTERS.
  227.   -------------                  - ╨LAYING A NOTE READ FROM ═EMORY.
  228.                                  - ┼XECUTING A ╙OUND ┼FFECT.
  229.  
  230.   ╔NPUT ╚ANDLING:                - ─EVICE ╙ELECTION (KEYBOARD, MOUSE, JOYSTICK).
  231.   --------------                 - ╦EYBOARD ╙CANNING.
  232.                                  - ═OUSE ╙CANNING.
  233.                                  - ╩OYSTICK ╙CANNING.
  234.  
  235.   ╟AME ─RIVER:                   - ╘ITLE ╙CREEN.
  236.   -----------                    - ╔NITIALIZATION OF ═EMORY.
  237.                                  - ╠EVEL ╙ETUP.
  238.                                  - ═OVEMENT OF ┴LIENS.
  239.                                  - ═OVEMENT OF ═ISSLES.
  240.                                  - ═OVEMENT OF ╨LAYER.
  241.                                  - ├OLLISION ├HECKING.
  242.                                  - ├OLLISION ╚ANDLING.
  243.                                  - ┼ND OF ╠EVEL.
  244.                                  - ╙CORE ╒PDATING.
  245.                                  - ┼ND - ╟AME HANDLING.
  246.                                  - ╚IGH ╙CORE ╒PDATE.
  247.  
  248.   ╙HREW! ╠ONG LIST 'EH? - ╬OW YOU MAY HAVE THOUGHT OF SOME NOT LISTED ABOVE,
  249.   AND WE MAY HAVE POSSIBLY OVERLOOKED SOME CRUCIAL ROUTINES -- THAT'S FINE --
  250.   THE ABOVE IS JUST INTENDED AS A BUILDING BLOCK - A PLACE TO START CODING FROM.
  251.  
  252.   ╔F WE THINK OF THESE AS SUBROUTINES WE CAN BUILD A SKELETON OUTLINE OF THE 
  253.   PROGRAM - YET WE NEED SOME ORDER IN HOW WE CALL THEM. ╧BVIOUSLY WE AREN'T
  254.   GOING TO MOVE THE PLAYER UNTIL WE SCAN THE INPUT AND THAT REQUIRES PRIOR 
  255.   DEVICE SELECTION ETC... 
  256.  
  257.   ╚MM... ╘AKING ORDER INTO ACCOUNT WE CAN RE-STATE THE PROBLEM AS:
  258.  
  259.   ╨ROBLEM ╙TATEMENT: ─EVELOP A GAME SIMILAIR TO ╙PACE ╔NVADERS CALLED ╙PACE
  260.   -----------------  ╔NVASION BY INITIALIZING MEMORY, THE DISPLAY DEVICE,
  261.                      SETTING UP ├USTOM ├HARACTERS, SETTING UP THE ═USIC
  262.                      ╥EGISTERS AND DISPLAYING THE TITLE SCREEN. ╞ROM THERE,
  263.                      SELECT THE INPUT DEVICE AND AFTER THAT SETUP THE CURRENT
  264.                      LEVEL. ╬EXT, WHILE PLAYING MUSIC IN THE BACKGROUND AND
  265.                      SCANNING THE INPUT DEVICE, MOVE THE ALIENS, MISSLES AND
  266.                      PLAYER CHECKING FOR COLLISIONS AND TAKING APPROPRIATE
  267.                      ACTION AS REQUIRED (PLAYER DIES, SCORE INCREASES ETC OR
  268.                      WHAT-NOT). ┴FTER EACH LEVEL DISPLAY IF THE PLAYER IS DEAD,
  269.                      OR SET-UP FOR THE NEXT LEVEL AND REPEAT. ╫HEN THE GAME HAS
  270.                      ENDED UPDATE THE HIGH SCORE IF NECESSARY.
  271.  
  272.   ╘RY SAYING THAT FIVE TIMES REAL FAST! :-) ┬UT THAT PROBLEM STATEMENT IS A
  273.   WHOLE LOT BETTER THAN THE ONE WE HAD AT THE BEGINNING WHICH SIMPLY SAID TO 
  274.   DEVELOP A GAME.
  275.  
  276.  
  277. ╔╓. ╬OT ┴LL ┴T ╧NE ╘IME - ╫HAT ╫E'RE ─OING ╘HIS ╘IME
  278.     ------------------------------------------------
  279.  
  280.   ╬OW THIS PROGRAM IS TOO COMPLEX, (AS SEEN BY THE PROBLEM STATEMENT ABOVE) TO
  281.   HAVE IN ONE ARTICLE SO THIS ISSUE WE'LL CONCENTRATE ON THE BASIC MAIN LOOP
  282.   AND THE INITIALIZATION OF THE ├USTOM ├HARACTERS AND THE TITLE SCREEN. 
  283.  
  284.   ╧RIGINALLY, ╔ WAS PLANNING ON UPDATING AND LISTING THE REVISED CODE IN EACH
  285.   ISSUE. ╚OWEVER, DUE TO SPACE LIMITATIONS AND THE ENORMITY OF THE PROGRAM 
  286.   CURRENTLY (1,500+ LINES!!) IT WILL BE PLACED FOR ANONYMOUS FTP AT 
  287.   CCOSUN.CALTECH.EDU UNDER THE DIRECTORY: PUB/RKNOP/╚┴├╦╔╬╟.═┴╟.
  288.  
  289.  
  290. ╓. ╘HE ═AIN ╠OOP
  291.    -------------
  292.  
  293.   ╫HAT IS A MAIN LOOP? ┬ASICALLY IT'S WHERE EVERYTHING GETS DONE. ╔T CALLS OTHER
  294.   SUBROUTINES AND KEEPS REPEATING UNTIL CERTAIN CRITERIA ARE MET - USUALLY WHEN
  295.   THE PLAYER REQUESTS TO EXIT THE GAME. ╚OWEVER, INSIDE YOU'LL FIND INNER LOOPS
  296.   FOR LEVEL PLAY ETC. 
  297.  
  298.   ╧UR MAIN LOOP FOR THIS PROGRAM WILL BE:
  299.  
  300. -------------------------------------------------------------------------------
  301. ;; * ═AIN ╠OOP - ╘HIS SHOULD BE THE LAST SECTION IN THE SOURCE CODE.
  302. ;
  303. ; ═AIN ╠OOP
  304. ;
  305.  
  306. MAIN'LOOP = *
  307.                JSR MEMORY'SETUP        ; ╙ET-╒P MEMORY.
  308.                JSR DISPLAY'SETUP       ;  "  "  DISPLAY.
  309.                JSR CHAR'SETUP          ;  "  "  CUSTOM CHARACTER DISPLAY.
  310.                JSR MUSIC'SETUP         ;  "  "  MUSIC CHIP.
  311.                JSR TITLE'SCREEN        ; ─ISPLAY THE TITLE SCREEN.
  312.                JSR SELECT'INPUT        ; ╙ELECT ╔NPUT ─EVICE.
  313.  
  314. LEVEL'LOOP = *
  315.                JSR PLAY'MUSIC          ; ╙TART THE MUSIC PLAYING.
  316.                JSR SETUP'LEVEL         ; ╙ETUP THE CURRENT LEVEL.
  317.  
  318.              - JSR ALIEN'MOVE          ; ═OVE ALIENS
  319.                JSR MISSLE'MOVE         ;  "   MISSLES
  320.                JSR PLAYER'MOVE         ;  "   PLAYER
  321.                JSR CHECK'COLLISION     ; ├HECK FOR COLLISIONS
  322.                LDX COLLISION'FLAG      ; ├HECK COLLISION FLAG.
  323.                BEQ -
  324.  
  325.                DEX                     ; ─ECREASE .╪ BY 1 SO IF ╪ WAS 1 THEN
  326.                BEQ PLAYER'DIE          ;    IT'S NOW 0 SO WE KNOW PLAYER DIED.
  327.                DEX                     ; ─ECREASE .╪ AGAIN SO IF ╪ WAS 2 THEN
  328.                BEQ ALIEN'DIE'SOUND     ;    IT'S NOW 0 SO WE MAKE ALIEN DEATH.
  329.                JSR END'LEVEL           ; ╔F WE GOT HERE - THAN END OF LEVEL.
  330.                JSR WAIT'NEXT           ; ╫AIT FOR NEXT KEYPRESS.
  331.                JSR INCREASE'LEVEL      ; INCREASE LEVEL #.
  332.                SEC                     ; ┴ND GO BACK....
  333.                BCS LEVEL'LOOP             
  334.  
  335. ALIEN'DIE'SOUND = *
  336.                JSR MAKE'ALIEN'SOUND    ; MAKE ALIEN SOUND.
  337.                SEC                     ; SET CARRY 
  338.                BCS -                   ; AND JUMP BACK.
  339.  
  340. PLAYER'DIE     JSR SHOW'PLAYER'DIE     ; ╙HOW IT ON-SCREEN.
  341.                LDA LIVES               ; ├HECK # OF LIVES.
  342.                BEQ END'OF'GAME         ; ╔F 0 THE END-OF-GAME.
  343.                BNE LEVEL'LOOP          ; GO BACK AND RE-START LEVEL.
  344.                BRK                     ; ╔F WE GET HERE - THAN AN ERROR.
  345.  
  346. END'OF'GAME    JSR END'GAME'SCREEN     ; ╙HOW END-OF-GAME SCREEN.
  347.                JSR HIGH'SCORE'UPDATE   ; ╒PDATE THE HIGH SCORE IF NEED-BE.
  348.                JSR WAIT'NEXT           ; ╫AIT FOR NEXT-GAME SELECTION.
  349.                LDA QUIT
  350.                BEQ +
  351.                JSR SETUP'LEVEL'1       ; ╙ET-╒P FIRST LEVEL.
  352.                SEC
  353.                BCS LEVEL'LOOP          ; AND START PLAYING IT.
  354.  
  355.              + JMP QUIT'GAME
  356. ;
  357. ; ┼ND OF ═AIN ╠OOP
  358. ;
  359. -------------------------------------------------------------------------------
  360.  
  361.   ╙OME OF THE ROUTINES LISTED ABOVE WE WILL LATER REPLACE WITH ACTUAL CODE. ╔T'S
  362.   MUCH EASIER TO SEE:
  363.  
  364.                INC LEVEL 
  365.  
  366.   THAN TO SEE A 
  367.  
  368.                JSR INCREASE'LEVEL
  369.  
  370.   AND TRY TO HUNT DOWN THE CODE. ╔'VE INCLUDED THEM IN FOR NOW SO THAT WE CAN
  371.   HAVE A BETTER IDEA OF WHAT IS GOING ON.
  372.  
  373.   ╔N THE FILE: INVASION.SRC MOST OF THE STATEMENTS ABOVE ARE COMMENTED OUT. 
  374.   ╧NCE WE WRITE THE ROUTINES WE'LL UN-COMMENT THEM. ╞OR NOW, THIS SERVES TO
  375.   STILL REMIND US OF THE ROUTINES WE NEED TO WRITE.
  376.  
  377.   ┴LSO THERE ARE A COUPLE OF PROGRAMMING TRICKS THAT ╔ USED IN THE MAIN LOOP 
  378.   THAT PROBABLY NEED SOME CLARIFYING.
  379.  
  380.   ╫HEN HANDLING THE COLLISIONS THE .╪ REGISTER IS LOADED WITH THE RESULT OF THE
  381.   COLLISION CHECKING - $00 = NO COLLISIONS, $01 = PLAYER DIED, $02 = ALIEN DIED,
  382.   $03 = END OF LEVEL. ┴NYTIME A LOAD TO A REGISTER IS DONE THE FLAGS ARE 
  383.   AUTOMATICALLY SET AS IF YOU HAD COMPARED IT TO 0 - HENCE WE CAN LDX THE 
  384.   COLLISION FLAG AND IMMEDIATELY BRANCH IF EQUAL TO ZERO FOR NO COLLISIONS. ╔N
  385.   ADDITION TO THE LOAD ANYTIME THE .╪ OR .┘ REGISTERS ARE INCREMENTED OR 
  386.   DECREMENTED AN IMPLICIT COMPARISON TO ZERO IS PERFORMED. ╙O IF THE .╪ REGISTER
  387.   IS 1 PREVIOUSLY, WE DECREMENT IT THEN IT WILL BE ZERO AND OUR ┬┼╤ INSTRUCTION
  388.   WILL BRANCH. ╔F IT'S TWO THEN IT WILL BE ONE AND WE CAN CONTINUE LIKE THIS.
  389.     [╬╧╘┼: ╘ECHNICALLY IT'S NOT A REAL COMPARISON TO ZERO BUT CALLING IT A
  390.     COMPARISON TO ZERO SERVERS OUR PURPOSE HERE. ╘HE ONLY SIGNIFICANT DIFFERENCE
  391.     WOULD BE IN THE EFFECT OF THE CARRY FLAG WHICH IS INSIGNIFICANT IN OUR 
  392.     CODE SEGMENT HERE.]
  393.  
  394.   ┴LSO IN SEVERAL LOCATIONS ARE THE TWO INSTRUCTIONS:
  395.  
  396.                SEC
  397.                BCS [LABEL]
  398.  
  399.   ╫HAT THESE ARE DOING ARE SIMPLY PROGRAMMING STYLE - THEY COULD BE SUBSTITUTED
  400.   WITH ╩═╨ [LABEL] - HOWEVER THEY OFFER ADVANTAGES OVER ╩═╨.  ╘HEY TAKE UP THE
  401.   A LARGER AMOUNT OF EXECUTION TIME, HOWEVER THEY ARE RELOCATABLE SO ANY MUCKING
  402.   AROUND / MOVING SECTIONS OF CODE DURING DEBUGGING WILL BE LESS LIKELY TO
  403.   CRASH. ╒SING OTHER FLAGS ARE ALSO VALID -- THE USE OF WHICH FLAG (╔ PREFER
  404.   THE CARRY FLAG) IS USUALLY DEPENDENT ON THE PROGRAMMER. ╟EOS DEFINES A
  405.   SIMILAIR MACRO CALLED ┬╥┴ (BRANCH ALWAYS) WHICH IS EQUIVLENT TO:
  406.  
  407.                CLV
  408.                BVC [LABEL]
  409.   
  410.   ╬OTE THAT THE ABOVE IS JUST PROGRAMMING STYLE, HELD OVER FROM MY PROGRAMMING
  411.   IN ASSEMBLY DAYS. ╘HE USE OF ╩═╨ IS PROBABLY PREFERABLE IN TERMS OF 
  412.   EXECUTION AND ALSO IN BEING ABLE TO BRANCH MORE THAN 127 BYTES AWAY (THE 
  413.   BRANCH INSTRUCTIONS ONLY HAVE A RANGE OF +128/-127).
  414.  
  415.  
  416. ╓╔. ├USTOM ├HARACTERS
  417.     -----------------
  418.  
  419.   ╙INCE WE'RE WRITING FOR EACH OF THE SEPERATE MODES (64 MODE, 128 MODE) WE HAVE
  420.   TO TAKE A LOOK AT THE DIFFERENCES BETWEEN THE ╓╔├ CHIP (64 MODE) AND THE 8563
  421.   CHIP IN THE 128.  
  422.  
  423.   ╘HE ╓IC-├HIP
  424.   ------------
  425.   ╘HE CHARACTER SETS IN THE ╓╔├ CHIP ARE DEFINED AS IN THE EXAMPLE BELOW OF 
  426.   THE CHARACTER CODE $00 "@" (ALL REFERENCES ARE TO SCREEN "POKE" CODES - NOT
  427.   PRINT CODES).
  428.  
  429.          .BYT #%00111100    ╘RY HOLDING THE PAGE (OR MOVING AWAY FROM THE
  430.          .BYT #%01100110    SCREEN) AND TAKING A LOOK AT THE PATTERNS THE 1'S
  431.          .BYT #%01101110    AND 0'S MAKE. ┼ACH CHARACTER IS THUS DEFINED AS 
  432.          .BYT #%01101110    EIGHT BYTES WHO'S BIT PATTERNS DEFINE IT.  ╚AVING A
  433.          .BYT #%01100000    TOTAL OF 256 CHARACTERS AVAILABLE MAKES IT
  434.          .BYT #%01100010    NECCESARY TO SET ASIDE A TOTAL OF 2,048 BYTES. 
  435.          .BYT #%00111100
  436.          .BYT #%00000000
  437.  
  438.   ╬OW, INSTEAD OF DESIGNING ALL 256 CHARACTER SETS WE'LL JUST TAKE ADVANTAGE OF
  439.   THE FACT THAT THE LETTERS AND NUMBERS WE WANT WILL ALREADY BE THERE -- WE'LL
  440.   JUST COPY THEM FROM THE ╥╧═ SET INTO ╥┴═, MODIFY SOME OF THE OTHER CHARACTERS
  441.   TO REFLECT WHAT WE WANT AND THEN TELL THE ╓╔├ CHIP TO LOOK AT ╥┴═ TO GET THE
  442.   CHARACTER SET DEFINITIONS.
  443.  
  444.   ╘HERE ARE SOME PROBLEMS WITH COPYING THE 'SYSTEM' CHARACTERS, HOWEVER. ╘HE
  445.   ├OMMODORE 64 USUALLY MASKS OUT THE CHARACTER SET AND TYPICALLY IT IS ONLY
  446.   AVAILABLE TO THE ╓╔├ CHIP SO THAT MORE SPACE CAN BE PRESENT FOR USER PROGRAMS
  447.   AND SUCH.  ╔T ALSO TAKES UP THE SECTION OF MEMORY THAT THE ╔/╧ BLOCK IN 
  448.   $D000-$DFFF DOES SO THAT SWITCHING IT IN WHILE INTERRUPTS ARE ENABLED IS SURE
  449.   TO RESULT IN A CRASH. 
  450.  
  451.   ╫E'RE ALSO GOING TO BE DOING A FEW THINGS THAT YOU MAY NOT EXPECT -- INSTEAD
  452.   OF COPYING ALL 256 CHARACTERS - WE'RE GONNA _JUST_ COPY THE FIRST 128. ╘HIS
  453.   WILL GIVE US ALL OF THE NORMAL CHARACTERS AS THE LAST 128 ARE THE REVERSE-
  454.   VIDEO COUNTERPARTS TO THE FIRST 128 CHARACTERS. ╫E'RE DOING THIS TO CONSERVE
  455.   SPACE AND BECAUSE WE REALLY DON'T NEED THAT MANY CHARACTERS DEFINED.
  456.  
  457.   ┴LSO LOCATION $01 CONTAINS WHAT $D000-$DFFF HOLDS AND WE WILL HAVE TO MODIFY
  458.   BIT 2 TO SWITCH THE CHARACTER ╥╧═ IN. ╚ENCE, THE FOLLOWING PROGRAM CODE IS
  459.   USED TO COPY THE CHARACTER SET:
  460.  
  461. -------------------------------------------------------------------------------
  462. COPY'CHARS = *                 ; MUST BE RUN W/ INTERRUPTS DISABLED
  463.                LDA $01         ; REGISTER 1 = THE CONTROL TO SWITCH IN THE CHAR.
  464.                                ; ROM.
  465.                PHA             ; SAVE IT AS WE'LL LATER NEED TO STA' IT BACK.
  466.                AND #%11111011  ; ┬IT 2 CONTROLS IT - CLEAR IT TO SWITCH IT IN.
  467.                STA $01         ; AND MAKE IT SO WE CAN READ IT IN.
  468.                LDA #>$3000     ; MOVE CHARS TO $3000
  469.                STA DEST+1
  470.                LDA #>$D800     ; FROM $D800 (START OF CHAR SET) (LOWER-CASE)
  471.                STA SRC+1
  472.                LDY #$00        ; LO-BYTES OF BOTH SRC, DEST = $00.
  473.                STY SRC
  474.                STY DEST
  475.                LDX #$10        ; COPY 2K OF DATA.
  476.              - LDA (SRC),Y     ; COPY BYTE.
  477.                STA (DEST),Y
  478.                INY
  479.                BNE -           ; CONTINUE UNTIL .┘ = 0.
  480.                INC SRC+1       ; INCREASE SOURCE & DEST BY 256
  481.                INC DEST+1
  482.                DEX             ; DECREASE .╪ COUNT.
  483.                BNE -           ; IF NON-ZERO THEN CONTINUE COPYING, ELSE
  484.                PLA             ; RESTORE VALUE OF $01 
  485.                STA $01         ; AND PUT BACK.
  486.                LDA $D018       ; SET ╓╔├-CHIP ADDRESS.
  487.                AND #$F1        ; TO SHOW CHAR SET.
  488.                ORA #$0C       
  489.                STA $D018       ; AND FINALLY TELL ╓╔├ WHERE THE CHAR SET IS...
  490.                RTS             ; AND RETURN.
  491. -------------------------------------------------------------------------------
  492.   
  493.   ╬OTE THAT WE STILL NEED TO CHANGE THE ACTUAL CHARACTERS WE'RE GONNA BE USING.
  494.   ╘HAT WILL BE HANDLED IN THE SECTION AFTER NEXT: ├HANGING THE ├HARACTERS AS 
  495.   THERE IS A GREAT DEAL OF SIMILARITY BETWEEN THE 128 AND 64 IMPLEMENTATIONS.
  496.  
  497.   ╘HE 8563 ├HIP
  498.   -------------
  499.   ╘HE 8563 80-├OLUMN CHIP USUALLY HAS 16K OR 64K ╥AM ATTATCHED TO THE CHIP 
  500.   WHICH THE ├╨╒ DOES NOT HAVE DIRECT CONTROL OVER. ╔T HAS TO DIRECT THE 8563 
  501.   TO STORE AND RETRIEVE VALUES TO THAT MEMORY. ╫HAT MAKES CONTROL OVER THAT 
  502.   MEMORY ALL THE MORE DIFFICULT IS THE FACT THAT THE 8563 ONLY HAS TWO LINES
  503.   OR ADDRESSES THAT THE ├╨╒ CAN CONTROL.  
  504.  
  505.   ╘HE 8563 HAS A CHARACTER SET IN MUCH THE SAME WAY THE ╓╔├ CHIP DOES, SAVE
  506.   ONE EXCEPTION - EACH CHARACTER SET CAN HAVE UP TO 16 LINES. ╬ORMALLY, THE LAST
  507.   EIGHT LINES ARE FILLED WITH $00 AND ARE NOT SHOWN. (╨ROVISIONS CAN BE MADE TO
  508.   HAVE 8X16 CHARACTERS BUT IT IS NOT NEEDED FOR THIS GAME AND THUS, WILL NOT BE
  509.   SHOWN - ╞OR MORE INFORMATION ╙EE ├= ╚ACKING ╔SSUE #2: 8563: ┴N ╔N-─EPTH ╠OOK.)
  510.   ╘HUS THE ALGORITHIM IS SIMILAIR TO THE ├=64 BUT 8 ZERO-BYTES WILL NEED TO BE
  511.   WRITTEN AT THE END OF EVERY EIGHT BYTES READ.
  512.  
  513.   ╚OWEVER, THE 8563 DOES MAKE THINGS EASIER FOR US! - ╫HEN THE COMPUTER IS FIRST
  514.   TURNED ON A COPY OF THE ├HARACTER ╙ET FROM ╥╧═ IS COPIED INTO THE 8563. ╘HE
  515.   8563 HAS NO ╥╧═ ├HARACTER ╙ET ASSOCIATED WITH IT AND THUS WE ARE ABLE TO JUST
  516.   SIMPLY MODIFY THE CHARACTER SET THAT IS IN THE 8563 MEMORY INSTEAD OF COPYING
  517.   IT OVER.  ┬ECAUSE OF THIS NO ROUTINE WILL BE PRESENTED TO COPY A CHARACTER
  518.   SET INTO THE 8563 MEMORY, RATHER THE DISCUSSION OF COPYING INDIVIDUALLY 
  519.   DEFINED CHARACTERS WILL TAKE PLACE IN THE NEXT SECTION. ╘HE ├=128 ALSO MAKES
  520.   LIFE EVEN EASIER FOR US AT THE END WHEN WE WILL EXIT THE PROGRAM, 
  521.   MODIFYING THE CHARACTER SET BACK TO THE "STANDARD" ├OMMODORE CHARACTER SET
  522.   BY A ROUTINE IN THE ╦┼╥╬┴╠ THAT WILL COPY THE CHARACTERS BACK. ╫E'LL TAKE A
  523.   LOOK AT IT CLOSER WHEN WE WRITE THE EXIT ROUTINE.
  524.  
  525.   ┴LSO NOTE THAT SINCE THE 8563 CHIP SUPPORTS THE 80 COLUMN SCREEN WE WILL
  526.   BE DEFINING TWO CHARACTERS THAT CAN BE PLACED SIDE BY SIDE FOR EACH ALIEN
  527.   SO THAT THE PLAYING FIELD WILL BE SIMILAIR TO THE ├64 VERSION. ╚OWEVER, FOR
  528.   THE TITLE SCREEN WE WILL BE SWITCHING THE 8563 INTO A "40 COLUMN" MODE
  529.   TO MAKE PROGRAMMING EASIER, IN ADDITION TO EXPANDING THE CHARACTER BIT-MAPPED
  530.   LOGO.
  531.   
  532.   ├HANGING THE ├HARACTERS
  533.   -----------------------
  534.   ┴ LOT OF THE TIMES YOU'LL FIND YOURSELF RE-USING SUBROUTINES AND CODE THAT
  535.   YOU HAVE PREVIOUSLY CREATED, GRADUALLY, OVER A PERIOD OF TIME BUILDING UP
  536.   A LIBRARY OF ROUTINES. ╫HEN THINKING THROUGH THE PURPOSE AND INTENT OF THIS
  537.   ROUTINE ╔ THOUGHT ABOUT POSSIBLY BUILDING IT SO IT WOULD READ A TABLE AND
  538.   CHANGE THE CHARACTER SET BASED ON THAT TABLE. ╘HE 64/128 CHARACTER SETS
  539.   WOULD BE THE SAME - THIS ROUTINE WOULD AUTOMATICALLY GENERATE THE EIGHT 
  540.   ADDITIONAL BYTES NEEDED BY THE 8563 IF NEED-BE AND IT WOULD CALL THE 
  541.   APPROPRIATE STORAGE ROUTINE - STORE TO EITHER THE 8563 OR THE COMPUTER
  542.   MEMORY. 
  543.  
  544.   ╬OW YOU MAY BE ASKING WHY WOULD YOU WANT TO STORE TO THE COMPUTER MEMORY
  545.   IN 128 MODE? ╫HY NOT JUST HAVE TWO SEPERATE VERSIONS? - ┘ES - THAT COULD
  546.   BE POSSIBLE BUT ╔'M IMPLEMENTING IT THIS WAY BECAUSE IN THE FUTURE ╔ MAY
  547.   SEE A NEED TO DEFINE CUSTOM CHARACTERS IN 128 MODE FOR THE 40 COLUMN SCREEN.
  548.   ╘HIS WAY ╔ CAN JUST EXTRACT THE ROUTINE, POP IT INTO MY PROGRAM AND ╔'VE GOT
  549.   THAT SECTION OF THE CODE COMPLETE. 
  550.  
  551.   ╘HIS IS WHAT ╔ WAS THINKING OF FOR THE DATA TABLE:
  552.  
  553.       .BYT 1 = 8563, 0 = COMP. MEMORY.
  554.       .WORD ADDRESS ; ADDRESS BASE OF CHAR-SET IN COMPUTER OR 8563 MEMORY.
  555.       .BYTE CHAR #  ; (TO START)
  556.       .BYTE # OF CHARS TO DEFINE
  557.       .BYTE # OF CHARACTERS TO DEFINE
  558.       .BYTE DATA,DATA,....,DATA8 ; CHARACTER DATA.
  559.       .BYTE DATA,DATA,....,DATA8 ; CHARACTER DATA. ETC....
  560.       . . .
  561.    
  562.   ┼NTRANCE INTO THE ROUTINE WILL CONSIST OF .┴┘ HOLDING THE LOCATION OF THE 
  563.   TABLE.  ╫E WILL KEEP THE ADDRESS OF THE TABLE AND KEEP INCREMENTING IT AS
  564.   WE GO ALONG IN Z-PAGE LOCATIONS.
  565.  
  566. -------------------------------------------------------------------------------
  567.        INSTALL'CHAR = *
  568.                STA ZP1                 ; SAVE .AY IN TABLE ADDRESS
  569.                STY ZP1+1
  570.                LDY #$00                ; READ COMPUTER MODE.
  571.                JSR GET'BYTE
  572.                STA MODE
  573.                JSR GET'BYTE            ; GET ADDRESS BASE.
  574.                STA ADR
  575.                JSR GET'BYTE
  576.                STA ADR+1
  577.                JSR GET'BYTE            ; GET NUMBER OF CHARACTERS TO COPY.
  578.                STA NUMB            
  579.                JSR GET'BYTE            ; GET NEXT CHARACTER #.  
  580.                STA WRK                 ; SAVE IN TEMP. LOCATION.
  581.                LDA #$00
  582.                STA WRK+1
  583.                ASL WRK                 ; SHIFT LEFT X3 TIMES = *8
  584.                ROL WRK+1
  585.                ASL WRK
  586.                ROL WRK+1
  587.                ASL WRK
  588.                ROL WRK+1
  589.                LDA MODE                ; IF FOR 8563 THEN MULTIPLY 1 MORE TIME.
  590.                BEQ +      
  591.                ASL WRK
  592.                ROL WRK+1
  593.              + LDA ADR                 ; ADD CHARACTER ADDRESS IN.
  594.                CLC
  595.                ADC WRK
  596.                STA WRK
  597.                LDA ADR+1
  598.                ADC WRK+1
  599.                STA WRK+1               ; ADDRESS NOW CALCULATED
  600.                JSR SETADRS             ; SET ADDRESS IN PROPER CHIP
  601.   LOOP'INSTALL LDX #$08                ; COPY 8 BYTES.
  602.              - JSR GET'BYTE
  603.                JSR WRITEBYTE           ; WRITE OUT BYTE.
  604.                DEX
  605.                BNE -
  606.                LDA MODE                ; IF 128 THEN FILL OUT 8 MORE $00 BYTES.
  607.                BEQ +
  608.                LDA #$00
  609.                LDX #$08
  610.              - JSR WRITEBYTE
  611.                DEX
  612.                BNE -
  613.              + DEC NUMB
  614.                BNE LOOP'INSTALL
  615.                RTS       
  616. -------------------------------------------------------------------------------
  617.  
  618.   ╫HAT? ╫E HAVE THRE SUBROUTINES : WRITEBYTE, SETADRS, AND GET'BYTE THAT WE
  619.   HAVEN'T EXAMINED YET. ╘HESE ARE GOING TO BE THE ROUTINES THAT ARE DEPENDANT
  620.   ON THE COMPUTER TYPE. ┴LSO, WRITEBYTE WILL REQUIRE THAT .╪┘ NOT BE DISTURBED;
  621.   SETADRS REQUIRES THAT .┘ NOT BE DISTURBED HENCE THE FOLLOWING:
  622.  
  623. -------------------------------------------------------------------------------
  624.        SETADRS TYA             ; SAVE .YX
  625.                PHA
  626.                TXA
  627.                PHA
  628.                LDA MODE        ; CHECK COMPUTER TYPE.
  629.                BEQ +           ; IF ├=64, THEN JUMP AHEAD.
  630.                LDX #18         ; ╓─├ REGISTER - CURRENT MEMORY ADDRESS HI
  631.                LDA WRK+1       ; GET ADDRESS HI
  632.                JSR WR'VDC
  633.                LDX #19         ; ╓─├ REGISTER - CURRENT MEMORY ADDRESS LO
  634.                LDA WRK         ; GET ADDRESS LO
  635.                JSR WR'VDC
  636.              + PLA             ; RESTORE .╪┘
  637.                TAX
  638.                PLA
  639.                TAY
  640.                RTS             ; AND RETURN.
  641. -------------------------------------------------------------------------------
  642.   
  643.   ╬OTE THAT WE REALLY DON'T NEED A SETADRS FOR THE ├=64 -- WE CAN JUST INDEX 
  644.   OFF (WRK) IN THE WRITEBYTE ROUTINE WHICH FOLLOWS:
  645.  
  646. -------------------------------------------------------------------------------
  647.   WRITEBYTE    STA TEMP        ; SAVE AS WE NEED IT LATER.
  648.                TXA             ; ╙AVE .╪┘
  649.                PHA
  650.                TYA
  651.                PHA
  652.                LDA MODE        ; NOW CHECK COMPUTER TYPE.
  653.                BEQ +           ; IF C64 JUMP AHEAD
  654.                LDA TEMP        ; RECALL TEMP.
  655.                JSR WR'VRAM 
  656.                SEC
  657.                BCS ++          ; JUMP AHEAD
  658.              + LDY #$00        ; ├64 / Y-INDEX = $00
  659.                LDA TEMP        ; GET VALUE
  660.                STA (WRK),Y     ; STORE
  661.                INC WRK         ; NOW INCREASE ADDRESS
  662.                BNE +
  663.                INC WRK+1
  664.              + PLA             ; NOW RETURN AFTER RECALLING .╪┘
  665.                TAY
  666.                PLA
  667.                TAX
  668.                RTS             ; AND RETURN.
  669. -------------------------------------------------------------------------------
  670.  
  671.   ╬OTE THAT THE FOLLOWING ROUTINE IS FAIRLY SHORT BUT IT IS CALLED NUMEROUS
  672.   TIMES WITHIN THE ROUTINES THAT USE DATA TABLES SUCH AS INSTALL'CHAR, 
  673.   WRITE'TXT AND WRITE'COL. 
  674.  
  675. -------------------------------------------------------------------------------
  676.   GET'BYTE = *
  677.                LDA (ZP1),Y
  678.                INY
  679.                BNE +           ; IF ZERO THEN INCREASE ZP1 HI
  680.                INC ZP1+1
  681.              + RTS
  682. -------------------------------------------------------------------------------
  683.  
  684.   ╬OT BAD 'EH?  ┴ QUICK NOTE: ╘HE INSTRUCTIONS: ╨╠┴, ╘┴┘, ╨╠┴, ╘┴╪, ╨╚┴, ETC.. 
  685.   ARE ROUTINES THAT ╨USH OR ╨ULL (PHA,PLA) THE .┴ ONTO THE STACK. ╘HE ╘┴┘, ╘┴╪,
  686.   ╘╪┴, ╘┘┴ ARE INSTRUCTIONS THAT TRANSFER A REGISTER TO ANOTHER (IE: THE ╘┴┘
  687.   TRANSFERS THE ┴ REGISTER TO .┘, ╘╪┴ TRANSFERS .╪ TO .┴ ETC...) ┬Y USING THE
  688.   COMBINATION OF THESE WITH THE STACK WE CAN SAVE THE REGISTERS AND LATER
  689.   RE-CALL THEM SO THAT THEY ARE THE SAME WHEN WE ENTERED THE ROUTINE. ╘HE
  690.   STACK IS USUALLY A "MYSTERY" ITEM TO NEW PROGRAMMERS OF THE 6502 SERIES. 
  691.   ┬ASICALLY IT'S JUST LIKE ANY OTHER STACKS IN THE REAL WORLD - THE LAST ITEM
  692.   THROWN (╔'M NON-PRACTICING PERFECTIONIST SO ╔ THROW STUFF.. ;-) ) OR PUSHED
  693.   ON THE STACK WILL THE FIRST ITEM REMOVED OR PULLED FROM THE STACK. ╞OR 
  694.   EXAMPLE ╔'VE GOT A STACK OF BOOKS SITTING NEAR ME :
  695.  
  696.                ═APPING THE ├OMMODORE 128
  697.                128 ╔NTERNALS
  698.  
  699.   AND ╔'M HOLDING ═APPING THE ├OMMODORE 64 IN MY HANDS. ╔F ╔ PUSH (OR TOSS)
  700.   THE BOOK ONTO THE STACK (AND HOPEFULLY HIT THE STACK INSTEAD OF THE FLOOR)
  701.   ╔'LL HAVE THE FOLLOWING STACK:
  702.  
  703.                ═APPING THE ├OMMODORE 64
  704.                ═APPING THE ├OMMODORE 128
  705.                128 ╔NTERNALS
  706.  
  707.   AND IT SHOULD BE EASY TO SEE THAT IF ╔ "PULL" THE NEXT BOOK OFF THE STACK
  708.   THAT ╔'LL GET THE ═APPING THE ├OMMODORE 64 BOOK. ╘HE NEXT BOOK TO BE "PULL"ED
  709.   AFTER THAT WOULD BE THE ═APPING THE ├OMMODORE 128 BOOK. ╘HIS IDEA CAN BE
  710.   APPLIED TO THE 6502 STACK -- ╔T WILL KEEP STORING VALUES (UP TO 256) WHEN YOU
  711.   "PUSH" THEM ON (VIA THE ╨╚┴ INSTRUCTION) AND WILL RETRIEVE THE LAST VALUE
  712.   STORED WHEN YOU "PULL" THEM OFF (VIA THE ╨╠┴ INSTRUCTION). ┴NOTHER ╨╠┴
  713.   INSTRUCTION WOULD RETURN THE NEXT VALUE THAT HAD BEEN STORED.
  714.  
  715.   ╘HE ├HARACTER ┬ITMAPS
  716.   ---------------------
  717.  
  718.   ╨ASI ╧JALA IS TO BE CREDITED WITH ALL THE GRAPHICS AND MANY THANKS GO OUT
  719.   TO HIM.
  720.  
  721.   ╘HE GAME LOGO IS MADE UP OF 120 CUSTOM DEFINED CHARACTERS THAT WILL BE 
  722.   PRINTED IN THE FOLLOWING MANNER (ON THE 128 SCREEN THEY WILL BE CENTERED).
  723.  
  724.   (IN REVERSE VIDEO)...
  725.  
  726.            ┴┬├─┼╞╟╚ . . . [UP TO 40 CHARACTERS]
  727.            ╔╩╦╠═╬╧╨
  728.            ╤╥╙╘╒╓╫╪    
  729.  
  730.   AND EVERYTHING WILL LINE UP.
  731.  
  732.   ╙O THAT IT WILL LOOK LIKE A "MINI-BITMAP".  ╫E COULD HAVE USED BITMAP MODE
  733.   AND MADE A VERY NICE LOOKING TITLE SCREEN BUT THAT WOULD HAVE INVOLVED 
  734.   SWITCHING AND ALLOCATING MEMORY FOR THE BITMAP, ETC . . . ╧N BOTH THE
  735.   8563 AND THE ╓╔├ THAT INVOLVES A BIT MORE WORK AND SO CUSTOM CHARACTERS
  736.   WILL BE USED FOR THE TITLE SCREEN. ╘HE REGULAR LETTER AND NUMERIC CHARACTERS
  737.   WILL BE AVAILABLE SO THAT WE CAN DISPLAY CREDITS AND GAME INSTRUCTIONS
  738.   BELOW THE LOGO.
  739.  
  740.   ╬OW - IN THE PROGRAM LISTING WE COULD LIST THEM AS BINARY #'S AND THAT WOULD
  741.   MAKE EDITING THEM VERY EASY BUT WE'RE GONNA USE THEIR DECIMAL REPRESENTATION
  742.   IN THE PROGRAM LISTING.
  743.  
  744.   ╘HE CHARACTERS ARE DEFINED SIMILAIR TO THE LOGO EXCEPT THEY ARE TREATED AS
  745.   SINGLE CHARACTERS. ╔N THE 128 VERSION DUE TO THE 80 COLUMN SCREEN WE ARE
  746.   GOING TO USE TWO CHARACTERS SIDE BY SIDE TO SIMULATE ONE ALIEN SO THAT THE
  747.   PLAYING FIELD WILL BE SIMILAIR TO THE ├64 VERSION. ╔N ADDATION, DURING THE
  748.   MAIN LOOP WE WILL MODIFY THE CHARACTER SETS TO SUPPORT ANIMATION OF THE 
  749.   ALIENS. ╔N THE DATA LISTING THERE IS A REFERENCE TO "FRAMES" - FOR EACH OF
  750.   THE ALIENS THERE ARE 8 DIFFERANT FRAMES.
  751.  
  752.   ╧H! - ╘HERE WILL BE MORE CHARACTERS DEFINED IN THE FUTURE. ╥IGHT NOW ╔'M 
  753.   MAINLY INTERESTED IN GETTING SOME BASE CHARACTERS DOWN SO YOU CAN SEE HOW
  754.   CUSTOM CHARACTERS ARE IMPLEMENTED.  ╫HEN WE START SETTING UP DIFFERENT LEVELS
  755.   AND SUCH WE'LL ADD MORE CHARACTERS THEN. ├URRENTLY THE CUSTOM CHARACTERS
  756.   ARE NOT USED - ONLY THE CHARACTERS FOR THE LOGO. ╞OR THOSE OF YOU WHO ARE
  757.   CURIOUS TRY INSTALLING THE CHARACTERS VIA INSTALL'CHAR AND TAKING A LOOK
  758.   AT THE ALIENS.
  759.  
  760.  
  761. ╓╔╔. ╘ITLE ╙CREEN
  762.      ------------
  763.  
  764.   ╘HE TITLE SCREEN IS USUALLY A LEAD-IN TO THE ACTUAL GAME AND IT'S AIM IS
  765.   TO TELL THE PLAYER HOW TO PLAY THE GAME, ANY AVAILABLE OPTIONS AND P'HAPS
  766.   PRESENT A NICE GRAPHIC OR TWO TO "WOW" THE USER INTO PLAYING. ╔N ADDATION,
  767.   THE MAIN MUSICAL THEME CAN BE INTRODUCED HERE TO UNIFY THE GAME-PLAYING.
  768.   ╘HE DISCUSSION BELOW DOES NOT TAKE INTO ACCOUNT COLOR BUT REST-ASSURED WE
  769.   WILL BE USING VARYING COLORS IN THE TITLE SCREEN. ╘HE FORMAT FOR THE COLOR
  770.   DATA WILL BE ALMOST IDENTICAL TO THE TITLE SCREEN FORMAT EXCEPT IT WILL
  771.   BE STRUCTURED VIA THE FOLLOWING:
  772.  
  773.        .WORD ADDRESS
  774.        .BYTE NUM_OF_CHARS TO PUT COLOR ($00= END OF DATA)
  775.        .BYTE COLOR_VALUE
  776.  
  777.   ╘HE ROUTINE (COLOR'TEXT) CAN BE FOUND IN THE SOURCE LISTINGS AT THE END OF
  778.   THIS ARTICLE. ┬ECAUSE OF THE SIMILARITY BETWEEN IT AND WRITE'TEXT IT IS
  779.   NOT DISCUSSED IN THIS ARTICLE.
  780.  
  781.   ╘ITLE ╙CREEN ┬ACK╟ROUND
  782.   -----------------------
  783.   ╘HE TITLE SCREEN ╔ ENVISONED AS A BORDERED SCREEN (USING THE NORMAL ├= 
  784.   CHARACTER SET - IE: ├= ┴,╙,┌,╪ ON THE KEYBOARD) WITH OUR BITMAP IN THE MIDDLE
  785.   AND UNDER-NEATH IT A SHORT DESCRIPTION OF THE GAME AND GAME-PLAY INSTRUCTIONS.
  786.  
  787.   ╬OW THIS IS MY IDEA OF THE SCREEN LAYOUT (ROUGH DRAWING AS WE'RE NOT USING
  788.   THE ACTUAL SCREEN DIMENSIONS):
  789.  
  790.      +-------------------------------------------------------------+
  791.      ▄ -╠╧╟╧ ----------------------------------------------------- ▄
  792.      ▄ --------------X 3 LINES------------------------------------ ▄
  793.      ▄ ----------------------------------------------------------- ▄
  794.      ▄                                                             ▄
  795.      ▄                   ╙PACE ╔NVASION ├64/128                    ▄
  796.      ▄                     ╨ROGRAMMING : ├RAIG ╘AYLOR              ▄
  797.      ▄                     ╟RAPHICS    : ╨ASI ╧JALA                ▄
  798.      ▄                     ╙OUND       : ????????????              ▄
  799.      ▄                                                             ▄
  800.      ▄ ----------------------------------------------------------- ▄
  801.      ▄ ╘O ╨LAY:                                                    ▄
  802.      ▄    ╒SE JOYSTICK IN PORT 2, MOUSE IN PORT 1 OR KEYBOARD:     ▄
  803.      ▄            ┴ - ╠EFT, ┌ - ╥IGHT   ╙PACE - ╞IRE               ▄
  804.      ▄              ╞1 - ╥ESTART                                   ▄
  805.      ▄                                                             ▄
  806.      +-------------------------------------------------------------+
  807.  
  808.   ╘ITLE ╙CREEN ╞ORMATTING
  809.   -----------------------
  810.   ╫E COME INTO A PROBLEM HERE -- THE SCREEN IS SOME 1000 CHARACTERS ON THE ├64,
  811.   AND 2000 CHARACTERS FOR THE ├=128.  ╔T WOULD BE EXTREMELY WASTEFUL TO STORE
  812.   THAT MANY CHARACTERS IN MEMORY JUST TO REPRODUCE A TITLE SCREEN - AND MOST OF
  813.   THEM CONSISTING OF SPACES AT THAT!!  
  814.  
  815.   ╫HAT WE'LL DO IS TO JUST SPECIFY THE ADDRESS ON SCREEN, THE # OF CHARACTERS
  816.   AND THEN LIST THE CHARACTERS. ╔T WILL BE SIMILAIR TO OUR CUSTOM CHARACTER
  817.   TABLE DRIVER ABOVE BUT WILL BE DIFFERENT ENOUGH THAT A NEW ROUTINE IS 
  818.   WARRENTED. ╫E WILL HOWEVER USE THE TWO SUBROUTINES WRITEBYTE AND SETADRS
  819.   THAT WERE DEVELOPED IN THE PREVIOUS ROUTINE. ╘HE DATA WILL LOOK LIKE THE
  820.   FOLLOWING:
  821.  
  822.        .WORD ADDRESS
  823.        .BYTE NUM_OF_CHARS ($00= END OF DATA)
  824.        .ASCII "TEXT"
  825.        .BYTE ADDRESS .... ETC.... 
  826.  
  827.   AND WE'LL ENTER WITH .┴┘ CONTAINING THE ADDRESS OF THE TABLE.
  828.  
  829.   ╙O BASICALLY WE COME UP WITH THE FOLLOWING:
  830.  
  831. -------------------------------------------------------------------------------
  832.        WRITE'TXT = *
  833.                STA ZP1         ; SAVE .AY IN TABLE ADDRESS
  834.                STY ZP1+1
  835.                LDY #$00
  836.    LOOP'W'TEXT = *
  837.                JSR GET'BYTE   ; SET ADDRESS.
  838.                STA WRK
  839.                JSR GET'BYTE
  840.                STA WRK+1
  841.                JSR GET'BYTE    ; GET # OF CHARS TO WRITE OUT.
  842.                CMP #$00
  843.                BEQ +           ; IF ZERO THEN EXIT.
  844.                TAX
  845.                JSR SETADRS     ; SET ADDRESS TO WRK,WRK+1
  846.              - JSR GET'BYTE
  847.                JSR WRITEBYTE   ; WRITE OUT BYTE.
  848.                DEX
  849.                BNE -
  850.                SEC
  851.                BCS LOOP'W'TEXT ; THIS IS AN ABSOLUTE JUMP TO LOOP 
  852.              + RTS             ; RETURN.
  853.  
  854. -------------------------------------------------------------------------------
  855.  
  856.   ╘HIS IS SIMILAIR TO OUR PREVIOUS ROUTINE, AND WAS IN FACT COPIED AND MODIFIED 
  857.   FROM THE PREVIOUS ROUTINE. 
  858.  
  859.  
  860. ╓╔╔╔. ─EBUGGING
  861.       ---------
  862.  
  863.   ╬OW, NOT ALL PROGRAMS ARE PERFECT, AND DURING THE DEVELOPMENT OF THIS 
  864.   PORTION OF THE GAME THERE WERE SEVERAL ERRORS FOUND. ╘RACING AN ERROR IN
  865.   ═ACHINE/┴SSEMBLY-╠ANGUAGE IS LIKE TRYING TO FIND A GRAMMATICAL ERROR IN A
  866.   LANGUAGE YOU DON'T KNOW. ;-) ┬UT SERIOUSLY, THERE ARE SEVERAL WAYS TO TRACK
  867.   DOWN ERRORS IN YOUR CODE.
  868.  
  869.   1 - ╘RY TRACING IT THROUGH BY HAND PLAYING "╫HAT IF ╔ WERE THE COMPUTER" AND
  870.       FOLLOWING WHAT EACH REGISTER DOES.
  871.  
  872.   2 - ┴RE YOU SWITCHING THE ╠O╚I ORDER OF VARIABLES? ╔E: IS IT LDA #< OR 
  873.       LDA #>?? 
  874.  
  875.   3 - ╙ET ┬╥╦ POINTS AND RUN THE PROGRAM / SUBROUTINE WITHIN A MACHINE LANGUAGE
  876.       MONITOR AND MAKE SURE THE REGISTERS / MEMORY LOCATIONS CONTAIN THE VALUES
  877.       THAT THEY SHOULD. ╔F NOT, FIND OUT WHY.
  878.  
  879.   4 - ╘RY TO SIMPLIFY YOUR CODE IN TERMS OF PROGRAMMING EASE - ═AKE THE 
  880.       ASSEMBLER DO THE WORK FOR YOU - IT'S A LOT LESS LIKELY TO MAKE ERRORS 
  881.       THAN YOU ARE.
  882.   
  883.   5 - ╘HINK LOGICALLY!!!
  884.   
  885.   6 - ├HANGE SOMETHING AT RANDOM AND PRAY.
  886.  
  887.   ╔ CAN'T STRESS NUMBERS 3 AND 5 ENOUGH. ─URING THE WRITING OF THE INSTALL'CHAR 
  888.   ROUTINE THERE WERE NUMEROUS BUGS THAT WERE EVENTUALLY TRACKED DOWN BY 
  889.   SETTING A ┬╥╦ INSTRUCTION FURTHER ALONG IN THE CODE AND SEEING EXACTLY WHAT
  890.   THE REGISTER / MEMORY LOCATIONS WERE. ┴LSO THE USE OF TEMPORARY LOAD AND
  891.   STORE INSTRUCTIONS INTO "SAFE" REGIONS OF MEMORY HELPED ME MONITOR WHAT SOME
  892.   OF THE VALUES WERE.
  893.  
  894.   ╞OR EXAMPLE, AT ONE POINT ╔ HAD A SECTION OF CODE SIMILAIR TO THE FOLLOWING:
  895.  
  896.              CLC
  897.              LDA VALUE
  898.              ADC DATA
  899.              BNE +
  900.              INC DATA+1
  901.            + [.... ]
  902.  
  903.   ┴ND IT'S PURPOSE WAS TO ADD VALUE TO DATA. ╬OW ╔'VE FOUND SIMPLE ERRORS ARE
  904.   USUALLY FOUND LAST, AFTER COMPLEX ERRORS. ┴ND NOT UNTIL A SET A BREAK POINT
  905.   LIKE:
  906.  
  907.              CLC
  908.              LDA VALUE
  909.              ADC DATA    <-----═ISSING ╔NSTRUCTION AFTER HERE-------------+
  910.              BNE +                                                        ▄
  911.              INC DATA+1                                                   ▄
  912.            + ┬╥╦                                                          ▄
  913.              [.... ]                                                      ▄   
  914.                                                                           ▄
  915.   DID ╔ ACTUALLY FIGURE OUT THAT ╔ WAS MISSING THE ╙╘┴ ─┴╘┴ INSTRUCTION --+
  916.  
  917.   ╙O, WHEN WRITING, MODIFYING, AND TRYING TO DEBUG CODE TRY TO TAKE YOUR TIME
  918.   AND ISOLATE EVERY POSSIBLE PROBLEM. ┴LSO DON'T BE AFRAID TO STOP THE CODE
  919.   MID-STREAM AS IN THE ABOVE WITH USE OF THE ┬╥╦. ┘OU CAN ALWAYS REMOVE IT
  920.   (AND PROBAHLY SHOULD) IN THE FINAL CODE AND IT SERVES AS A VERY VALUABLE 
  921.   DEBUGGING TOOL WITH THE AID OF A MACHINE-LANGUAGE MONITOR.
  922.  
  923.   
  924. ╔╪. ═EMORY ═AP ├ONSIDERATIONS
  925.     -------------------------
  926.  
  927.   ┬EFORE YOU START A PROGRAM IT'S A GOOD IDEA TO CONSIDER WHERE IN MEMORY YOU
  928.   WILL HAVE EVERYTHING. ╬OW WE'VE ALREADY STARTED SOME OF THE PROGRAM ABOVE
  929.   AND JUST BLINDLY PICKED NUMBERS AT RANDOM IT SEEMED LIKE $3000 FOR THE 
  930.   CHARACTER SET FOR THE ├=64 ETC... ╫E DIDN'T - ╔'M INTRODUCING THE ═EMORY
  931.   ═AP ├ONSIDERATIONS HERE TO SHOW THE EXAMPLE OF WHAT IF WE DIDN'T THINK
  932.   ABOUT HOW MEMORY WAS GOING TO BE ORGANIZED.
  933.  
  934.   ╘HE ├=64 ONLY HAS 64K OF MEMORY OF WHICH TYPICALLY THE RANGE $0800-$A000
  935.   IS AVAILABLE AND $C000-$CFFF IS ALSO.  ╔F WE HAD BLINDLY PICKED NUMBERS
  936.   ALL OVER THE PLACE TO STORE OUR CODE THEN WE WOULD HAVE A DISORGANIZED
  937.   PROGRAM THAT WOULD MOST LIKELY ACCIDENTALLY USE ONE SUBROUTINES STORAGE
  938.   AS TEMPORARY DATA FOR ANOTHER. ╔T'S LIKE SHOOTING RANDOMLY IN ╠ASER ╘AG
  939.   NOT CHECKING TO SEE IF THERE IS A TARGET THERE OR NOT FIRST... ╘HE END
  940.   RESULT: ├HAOS.
  941.  
  942.   ├URRENTLY WE'RE NOT FOLLOWING THE RULE FOR "TEMPORARY VARIABLES" BUT AS
  943.   WE GRADUALLY FADE OUT OF THE NORMAL ├-64/128 DEFAULT MODE AND WRITE OUR
  944.   OWN ROUTINES / INTERRUPT HANDLERS WE'LL SWITCH THINGS OVER. ┴LSO, ON THE
  945.   ├=128 INSTEAD OF USING ┬ANK 0 WITH THE ╔/╧ BLOCK ENABLED WE'RE CURRENTLY
  946.   USING THE ┬┴╬╦ 15 CONFIGURATION AS THE PROGRAM DOESN'T EXTEND PAST $4000
  947.   YET ($0000-$4000 IS COMMON MEMORY IN THE NORMAL ├=128 CONFIGUARTION).
  948.  
  949.   64 ├ONSIDERATIONS
  950.   -----------------
  951.   ╘HE 64 WILL HAVE FREE MEMORY IN THE FOLLOWING AREAS: $0800-$A000, AND
  952.   $C000-$CFFF. ╚OWEVER, IF WE DISABLE THE ┬ASIC ╥OM WE CAN HAVE THE WHOLE
  953.   AREA FROM $0800-$CFFF FREE FOR OUR PROGRAM. ┬ECAUSE WE DON'T NEED THE
  954.   ┬ASIC ╥OM WE WILL DO JUST THAT (IN THE LISTING NOW WE CURRENTLY WON'T BUT 
  955.   IT WILL BE DONE IN A FUTURE ISSUE). ╘HEREFORE HAVING THE CHARACTER SET
  956.   AT $3000-$5000, THE MUSIC DATA AT $5000-$8000, THE PROGRAM WILL HAVE THE
  957.   AREA FREE FROM $8000-$CFFF. $0800-$3000 WILL BE AVAILABLE IF NEEDED FOR
  958.   ROUTINES WHO NEED TEMPORARY STORAGE. 
  959.  
  960.   ╘EMPORARY ╙TORAGE IS GOING TO BE DEFINED AS FOLLOWS. ┼ACH ROUTINE THAT NEEDS
  961.   TEMPORARY STORAGE WILL BE ASSIGNED A "LEVEL" NUMBER. ╘HE LOWER LEVELS WILL
  962.   BE ASSIGNED LEVEL 1 ON UP TO LEVEL 3. ╘HE RANGE $0800-$3000 WILL BE 
  963.   BROKEN DOWN INTO THE FOLLOWING SUB-RANGES.
  964.  
  965.        ╠EVEL 1: $0800-$1000
  966.        ╠EVEL 2: $1000-$1800
  967.        ╠EVEL 3: $1800-$3000
  968.   
  969.   ╘HIS WAY WHEN WRITING THE SUB-ROUTINES WE CAN BE ASSURED THAT A SECTION OF
  970.   MEMORY IS NOT OVERWRITTEN BY A SUBROUTINE WE CALL. ╫HEN WE ACTUALLY START
  971.   PROGRAMMING WE'LL DECIDE WHERE IN EACH SUB-RANGE THE ROUTINE WILL HAVE 
  972.   ACCESS TO.
  973.  
  974.   128 ├ONSIDERATIONS
  975.   ------------------
  976.   ╘HE 128 HAS TWO "BANKS" OF 64K EACH. ╬ORMALLY FOR LARGE PROGRAMS WE WOULD 
  977.   THINK ABOUT USING BOTH BANKS - (FROM THE IDEA: ╚EY! - ╫E GOT IT, WHY NOT
  978.   FLAUNT IT?) BUT WE WON'T BE USING BOTH BANKS.
  979.  
  980.   ╞REE MEMORY ON THE ├128 TYPICALLY CONSISTS OF THE RANGE $0400-$09FF
  981.   (WHERE WE'LL BE OVERWRITING THE 40 COLUMN SCREEN (WHICH WE'RE GONNA BLANK
  982.   ANYWAY) AND THE ┬ASIC RUN-TIME STACK.) ┴LSO THE AREA FROM $0B00-$0FFF
  983.   IS FREE (OVERWRITING THE TAPE AREA, THE RS-232 BUFFERS,L AND THE SPRITE
  984.   DEFINITION AREA). ┴LSO $1300-$CFFF WILL BE FREE. 
  985.  
  986.   ╬OW, THE ├=128 HAS DIFFERENT MEMORY MAPS IT CAN CONFIGURE ITSELF TO - 
  987.   ┬ANK 15 IS THE STANDARD MODE UNDER MOST BASIC PROGRAMS AND ALLOWS THE
  988.   PROGRAMMER TO DIRECTLY "SYS" TO CALLS. ╘HE ══╒ (MEMORY MANAGEMENT UNIT -
  989.   THE CHIP THAT DOES EVERYTHING) SEES MEMORY IN A SLIGHTLY DIFFERANT WAY
  990.   THAN FROM BASIC. ╫E'LL COVER IT IN MORE DETAIL WHEN WE EXAMINE THE MEM_INIT
  991.   ROUTINE. ╞OR NOW, WE'RE JUST GONNA SET UP IN THE PROGRAM AND NOT IN THE
  992.   CODING SEGMENTS. ╘HE EXPLANATION OF WHAT WE'RE DOING WILL BE "REVEALED"
  993.   IN A FUTURE ISSUE. 
  994.  
  995.   ╫E WILL USE ┬ANK 0 OF MEMORY AND FROM $1300+ WILL BE THE PROGRAM. ╘HE RANGES
  996.   OF $0400-$09FF AND $0B00-$0FFF WILL BE USED IN A SIMILAIR MANNAR AS THE ├64
  997.   RANGES WERE FOR ╘EMPORARY ╙TORAGE. ╫E WILL ALSO HAVE THE ╔/╧ SECTION FROM
  998.   $D000-$DFFF SWAPPED IN. ╘HIS IS NOT A STANDARD "BASIC ┬┴╬╦ #" BUT WHEN WE
  999.   COVER THE INIT'MEMORY ROUTINE WE'LL SEE HOW WE CAN DO THIS. ═USIC DATA
  1000.   WILL BE FROM $A000-$D000. 
  1001.   
  1002.  
  1003. ╪.  ╠OOKING ╞ORWARD / ┬ACK
  1004.     ----------------------
  1005.  
  1006.   ╚OPEFULLY THROUGH THE LISTING AND THE DISCUSSION OF THE ROUTINES YOU HAVE
  1007.   STARTED TO UNDERSTAND THE BASIC CONCEPT OF PROGRAMMING: BREAKING DOWN PROBLEMS
  1008.   INTO SMALLER SOLVABLE STEPS. ╘RY LOOKING BACK OVER THE CODE ASKING YOURSELF
  1009.   WHY THAT INSTRUCTION IS THERE. ╫HAT WOULD HAPPEN IF YOU SWITCHED THE ORDER?
  1010.   ╔S THERE AN EASIER, BETTER WAY TO DO THE SAME THING? ╫HY? ┬ETTER YET, HOW?
  1011.   ┼XAMINE THE CODE, MESS WITH IT, MUCK IT UP SO IT DOESN'T WORK AND THEN FIGURE
  1012.   OUT EXACTLY WHY. ╘HE ONLY WAY TO LEARN IS BY EXPERIMENTATION. (┬╘╫, MUCK UP
  1013.   A _COPY_ OF IT - NOT THE ORIGINAL ... *GRINS*)
  1014.  
  1015.   ╘AKE A LOOK AT THE DIFFERENT SECTIONS OF CODE AND ANALYZE THEM TO SEE HOW
  1016.   THEY DO WHAT THEY DO. ╘AKE A LOOK AT HOW THE CODE WAS ORGANIZED IN TERMS
  1017.   OF SIMPLIFICATION. ╘RACE THROUGH EACH SUBROUTINE SO THAT YOU'RE ABLE TO 
  1018.   KNOW WHAT THE RETURN VALUES WILL BE. ╔N OTHER WORDS: ╙TUDY, ╙TUDY, ╙TUDY!!
  1019.   ╔'M IN SCHOOL AND SO ╔ KNOW ╔ JUST USED THE DREADED '╙' WORD BUT THAT'S 
  1020.   WHAT YOU'RE GOING TO HAVE TO DO IF YOU'RE INTERESTED IN LEARNING 65XX/85XX
  1021.   MACHINE LANGUAGE. ╘HE ONLY WAY TO LEARN IT (EASILY) IS TO STUDY OTHER 
  1022.   PEOPLE'S CODE AND TRY TO UNDERSTAND WHY THEY DID WHAT THEY DID.
  1023.  
  1024.   ╬EXT TIME WE WILL TAKE A LOOK AT THE INPUT ROUTINES FOR THE MOUSE, JOYSTICK
  1025.   AND KEYBOARD SCANNING. ╔N ADDITION WE WILL ALSO ALLOW THE PLAYER TO MOVE
  1026.   THE SHIP AROUND ON THE SCREEN TO TEST THE INPUT DRIVERS. 
  1027.  
  1028.   ╔N ADDATION, ╔ AM STILL LOOKING FOR AN INDIVIDUAL TO HELP WITH MUSIC AND
  1029.   SOUND COMPOSITION FOR THIS PROGRAM. ┴ KNOWLEDGE OF THE ╙╔─ CHIP AND 
  1030.   PROGRAMMING IS HELPFUL BUT NOT REQUIRED. ╔F YOU'RE WILLING TO HELP THEN
  1031.   PLEASE EMAIL ME AT DUCK@PEMBVAX1.PEMBROKE.EDU
  1032.  
  1033.  
  1034. ╪╔. ╠ISTINGS
  1035.     --------
  1036.  
  1037.   ┬ECAUSE OF THE ENORMITY OF THE PROGRAM LISTING (SOME 1,500+ LINES) IT WILL 
  1038.   NOT BE LISTED IN THIS ARTICLE BUT WILL INSTEAD BE AVAILABLE VIA ANONYMOUS
  1039.   FTP AT CCOSUN.CALTECH.EDU UNDER PUB/RKNOP/╚┴├╦╔╬╟.═┴╟ AS INVAS1.SFX. 
  1040.  
  1041.   ╞OR THOSE OF YOU ON THE MAILING LIST WHO WOULD LIKE TO RECIEVE IT, A ═AIL-
  1042.   ╙ERVER WILL BE SET UP SOON TO HANDLE REQUESTS AND INFORMATION WILL BE
  1043.   SENT TO YOU CONCERNING INFORMATION ABOUT USING IT AS SOON AS IT'S COMPLETED.
  1044.  
  1045.   ╔N THE INVASION1.SFX FILE THERE ARE THE FOLLOWING FILES:
  1046.  
  1047.        INVASION.SRC - THE MAIN FILE
  1048.        GRAPHICS.SRC - HANDLES ALL GRAPHICS ROUTINES
  1049.        LOGO.DAT     - CUSTOM CHARACTER LOGO
  1050.        CHARS64.DAT  - ALIEN CUSTOM CHARACTERS FOR ├=64
  1051.        CHARS128.DAT - ALIEN CUSTOM CHARACTERS FOR ├=128
  1052.        TITLETXT.DAT - TEXT DATA FOR TITLE SCREEN
  1053.        TITLECOL.DAT - COLOR DATA FOR TITLE SCREEN
  1054.        INVASION-128 - EXECUTABLE VERSION OF ╙PACE ╔NVASION SO FAR FOR ├=128
  1055.        INVASION-64  - EXECUTABLE VERSION OF ╙PACE ╔NVASION SO FAR FOR ├=64
  1056.  
  1057.   ╬OTE: ╞OR THE ├OMMODORE 128 IT'S RECOMMENDED THAT YOU DO A RUN/STOP-RESTORE
  1058.   AND THEN A "┬┴╬╦15:╙┘╙7168" TO EXECUTE THE PROGRAM. ╞OR THE ├OMMODORE 64 IT'S
  1059.   RECOMMENDED THE BORDER BE CHANGED VIA: "╨╧╦┼53280,0:╨╧╦┼53281,0:╙┘╙ 32768" TO
  1060.   RUN THE PROGRAM.
  1061.  
  1062. ==============================================================================
  1063. ╘HE ─EMO ├ORNER:
  1064.  
  1065. ╞╠╔ - MORE COLOR TO THE SCREEN   
  1066. BY ╨ASI '┴LBERT' ╧JALA (PO87553@CS.TUT.FI OR ALBERT@CC.TUT.FI)
  1067.                         ╫RITTEN ON 16-═AY-91   ╘RANSLATION 01-╩UN-92
  1068.     
  1069. (┴LL TIMINGS ARE IN ╨┴╠, ALTHO THE PRINCIPLES WILL APPLY TO ╬╘╙├ TOO)
  1070.  
  1071. ┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64. ╧NE 8X8
  1072. PIXEL CHARACTER POSITION MAY ONLY CARRY FOUR DIFFERENT COLORS.  ╞╠╔ PICTURE
  1073. CAN HAVE ALL OF THE 16 COLORS IN ONE CHAR POSITION.  ╫HAT THEN IS THIS ╞╠╔
  1074. AND HOW IT IS DONE ?
  1075.  
  1076. ╔N THE NORMAL MULTICOLOR MODE CAN ONE CHARACTER POSITION (4X8 PIXELS) HAVE
  1077. ONLY FOUR DIFFERENT COLORS AND ONE OF THEM IS THE COMMON BACKGROUND COLOR.
  1078. ├OLOR CODES ARE STORED IN HALF BYTES (NYBBLES) TO THE VIDEO MATRIX MEMORY
  1079. (ANYWHERE VIDEO MATRIX POINTER POINTS AT, NORMALLY $0400) AND TO THE COLOR
  1080. MEMORY ($─800-$─┬╞╞). ╔N MULTICOLOR MODE THE COLOR OF EACH PIXEL IS
  1081. DETERMINED BY TWO BITS IN THE GRAPHICS MEMORY. ┬IT PAIR 11 WILL REFER TO
  1082. COLOR MEMORY, BACKGROUND COLOR IS THE COLOR FOR BIT PAIR 00, AND VIDEO
  1083. MATRIX WILL DEFINE THE COLORS FOR BIT PAIRS 01 AND 10.
  1084.  
  1085.  
  1086. _╫HAT HAPPENS IN THE ╓╔├ ?_
  1087.  
  1088. ╓╔├ (╓IDEO ╔NTERFACE ├ONTROLLER) FETCHES COLOR INFORMATION FROM MEMORY ON
  1089. EACH BAD LINE. ╘HIS WILL STEAL TIME FROM PROCESSOR, BECAUSE ╓╔├ NEEDS TO USE
  1090. PROCESSOR'S BUS CYCLES. ┬AD LINE IS A CURSE IN THE ├64 WORLD. ╞ORTUNATELY
  1091. ╓╔├'S DATA BUS IS 12 BITS WIDE AND SO THE COLOR DATA FETCH FOR EACH CHARACTER
  1092. POSITION WILL TAKE ONLY ONE BUS CYCLE. ├OLOR MEMORY IS PHYSICALLY WIRED TO
  1093. THE ╓╔├ DATABUS LINES ─8-─11.
  1094.  
  1095. ╚OW DOES ╓╔├ KNOW WHERE TO FETCH THE GRAPHICAL INFORMATION ? ╙OME OF YOU KNOW
  1096. THE MYSTICAL FORMULAS NEEDED TO MESS WITH THE PIXELS IN THE HIRES SCREEN.
  1097. ╚OW ARE THESE FUNCTIONS OBTAINED ? ┴RE THEY JUST MAGIC ? ╬O, THERE ARE SOME
  1098. INTERNAL COUNTERS IN ╓╔├. ╘HEY ALWAYS POINT TO THE RIGHT PLACE IN GRAFIX
  1099. MEMORY AND THE ADDRESS IS DETERMINED LIKE THIS:
  1100.  
  1101. ┴13  ┴12 ┴11 ┴10 ┴9  ┴8  ┴7  ┴6  ┴5  ┴4  ┴3  ┴2  ┴1  ┴0
  1102. ├┬13 ╓├9 ╓├8 ╓├7 ╓├6 ╓├5 ╓├4 ╓├3 ╓├2 ╓├1 ╓├0 ╥├2 ╥├1 ╥├0
  1103.  
  1104. ┴DDRESS BITS ┴15 AND ┴14 CHANGE ACCORDING TO THE SELECTED VIDEO BANK.
  1105. ┴DDRESS BIT ┴13 IS ├┬13, WHICH MAY BE FOUND IN ╓╔├ REGISTER $18. ╔T
  1106. SELECTS THE RIGHT SIDE OF THE VIDEO BANK TO BE THE BITMAP MEMORY. ╫ITH
  1107. THESE BITS YOU CAN SET THE BITMAP TO EIGHT DIFFERENT PLACES IN MEMORY.
  1108. ╚OWEVER, SOME OF THEM ARE USELESS BECAUSE OF THE CHARACTER ╥╧═ IMAGES AND
  1109. ZERO PAGE/STACK. ╥EST OF THE BITS COME FROM THE INTERNAL COUNTERS.
  1110.  
  1111. ╓├9-╓├0 (╓IDEO ├OUNTER) FORMS THE ADDRESS BITS 12-3. ╘HE COUNTER ROLLS
  1112. THROUGH ALL 1000 CHARACTER POSITIONS, 0-39 ON THE FIRST EIGHT LINES, 40-79
  1113. ON THE SECOND EIGHT LINES AND SO ON. ╘HE LOWEST THREE BITS COME FROM THE ROW
  1114. COUNTER, ╥├2-╥├0. ╘HIS IS ANOTHER ╓╔├ COUNTER AND IT COUNTS THE SCAN LINES
  1115. FROM ZERO TO SEVEN.
  1116.  
  1117.  
  1118. _┴ SOFTWARE GRAPHICS MODE - ╞╠╔_
  1119.  
  1120. ╓╔├ WILL SYSTEMATICALLY GO THROUGH EVERY BYTE IN THE BITMAP MEMORY, BUT HOW
  1121. DOES IT KNOW WHERE AND WHEN TO GET THE COLOR INFORMATION ? ╘HIS IS WHERE
  1122. THE MAIN PRINCIPLE OF ╞╠╔ (╞LEXIBLE ╠INE ╔NTERPRETATION) LIES. ├OLOR DATA
  1123. IS FETCHED (AND THIS MEANS IT IS A BAD LINE), WHEN THE LINE COUNTER MATCHES
  1124. WITH THE VERTICAL SCROLL REGISTER. ╓├9-╓├0 DEFINES WHERE THE COLOR DATA IS
  1125. INSIDE THE VIDEO MATRIX AND COLOR MEMORY.
  1126.  
  1127. ╔F WE CHANGE THE VERTICAL SCROLL REGISTER, WE CAN FOOL ╓╔├ TO THINK THAT
  1128. EVERY LINE IS A BAD LINE, SO IT WILL FETCH THE COLOR INFORMATION ON EVERY
  1129. LINE TOO. ┬ECAUSE ╓╔├ WILL FETCH THE COLORS CONTINUOSLY, WE CAN GET
  1130. INDEPENDENT COLORS ON EACH SCAN LINE. ╫E JUST HAVE TO CHANGE COLORS AND ╓╔├
  1131. WILL HANDLE THE REST. ╒NFORTUNATELY THE RESULT IS THE LOSS OF 40 PROCESSOR
  1132. CYCLES PER LINE (SEE THE ═ISSING ├YCLES ARTICLE FOR MORE INFORMATION ABOUT
  1133. ╓╔├ STEALING CYCLES).
  1134.  
  1135.  
  1136. _─OING IT IN PRACTICE_
  1137.  
  1138. ╔N PRACTICE THERE IS NO TIME TO CHANGE COLOR MEMORY, BUT IN MULTICOLOR
  1139. MODE ╓╔├ USES VIDEO MATRIX FOR COLOR INFORMATION TOO. ╫E HAVE JUST ENOUGH
  1140. TIME TO CHANGE THE VIDEO MATRIX POINTER, $─018. ╬OW ╓╔├ WILL SEE A
  1141. DIFFERENT VIDEO MATRIX ON EACH SCAN LINE, DIFFERENT BLOCK OF MEMORY. ╫ITH
  1142. THE FOUR UPPER BITS IN THE REGISTER WE SELECT ONE OF THE 16 VIDEO MEMORIES
  1143. IN THE VIDEO BANK. ╩UST REMEMBER THAT THE REGISTER ALSO SELECTS THE POSITION
  1144. OF THE GRAPHICS MEMORY (BITMAP) INSIDE THE VIDEO BANK.
  1145.  
  1146. ┬ECAUSE WE HAVE TO KEEP THE BITMAP IN THE SAME VIDEO BANK, WE ONLY HAVE HALF
  1147. OF THE BANK FREE FOR VIDEO MATRICES. ╞ORTUNATELY, THAT'S ALL WE NEED TO GET
  1148. INDIVIDUAL MULTICOLOR COLORS FOR EACH LINE AND CHARACTER POSITION.
  1149. ╓╔├ WILL FETCH THE COLOR DATA FROM THE EIGHT VIDEO MATRICES AND THEN IT WILL
  1150. ROLL ON TO THE NEXT 40 BYTES. ┴FTER EIGHT LINES AND MATRICES WE WILL SELECT
  1151. THE FIRST VIDEO MATRIX AGAIN. (╙EE PICTURE 1)
  1152.  
  1153. ╒SUALLY IT IS NOT NECASSARY TO USE THE WHOLE SCREEN FOR A ╞╠╔ PICTURE,
  1154. ESPECIALLY IF YOU WANT TO HAVE A SCROLLER OR SOME OTHER EFFECTS. ┘OU JUST
  1155. HAVE TO MAKE SURE THAT ╓╔├ IS FOOLABLE IN THE USUAL WAY. ╘HE TIMING IS ALSO
  1156. VERY IMPORTANT, EVEN ONE CYCLE VARIATIONS IN THE ROUTINE ENTRY ARE NOT
  1157. ALLOWED. ╘HERE IS MANY WAYS TO DO THE SYNCHRONIZATION. ╧NE WAY IS TO USE A
  1158. SPRITE, AS IN THE PREVIOUS ARTICLE. (╙EE ├= ╚ACKING, ╓OL. 1, ╔SS. 3, ╘HE
  1159. ─EMO ├ORNER: ═ISSING ├YCLES).
  1160.  
  1161.  
  1162. _╬OT MUCH TIME_
  1163.  
  1164. ┬ECAUSE A BAD LINE WILL STEAL 40 CYCLES, THERE IS ONLY 23 CYCLES LEFT ON
  1165. EACH SCAN LINE. ╔T IS ENOUGH FOR CHANGING THE VIDEO MATRIX AND BACKGROUD
  1166. COLOR. ╘HERE IS NOT A MOMENT TO LOSE, BECAUSE YOU MUST CHANGE THE VERTICAL
  1167. SCROLL REGISTER, VIDEO MATRIX POINTER AND THE BACKGROUND COLOR. ╘HIS IS WHY
  1168. YOU CAN'T HAVE SPRITES IN FRONT OF A ╞╠╔ PICTURE.
  1169.  
  1170. ╫ITH ╞╠╔ WE GET TWO SELECTABLE COLORS FOR EACH CHARACTER POSITION AND LINE,
  1171. EACH SCAN LINE CAN HAVE IT'S OWN BACKGROUND COLOR AND EACH CHARACTER POSITION
  1172. STILL HAS ITS OWN CHARACTER COLOR FROM COLOR MEMORY. ╔N THEORY EACH CHARACTER
  1173. POSITION COULD HAVE 25 DIFFERENT COLORS, UNFORTUNATELY ╓╔├ ONLY HAS 16.
  1174.  
  1175.  
  1176. _┴ LITTLE FEATURE_
  1177.  
  1178. ╓╔├ DOES NOT LIKE IT WHEN WE CHANGE THE VERTICAL SCROLL REGISTER ($─011),
  1179. AND IS A BIT ANNOYED. ╔T 'SEES' CODE 255 (LIGHT GRAY) IN VIDEO MATRIX
  1180. AND 9 (BROWN) IN THE COLOR MEMORY INSTEAD OF THE CORRECT VALUES STORED THERE.
  1181. ┴CTUALLY THE COLOR VALUE SEEMS TO BE THE LOWER NYBBLE OF THE DATA BYTE
  1182. CURRENTLY ON THE DATA BUS (ACCESSED BY THE PROCESSOR (╠─┴#=$┴9)).
  1183. ╒NFORTUNATELY THERE IS NO CHANCE TO DO THE REGISTER CHANGE IN THE BORDER
  1184. AND THUS THE THREE LEFTMOST CHARACTER COLUMNS ARE A BIT USELESS, BECAUSE
  1185. THE COLORS ARE FIXED.
  1186.  
  1187. ╚OWEVER, THIS DOESN'T MEAN THAT YOU CAN'T USE THOSE THREE COLUMNS. ╞╠╔
  1188. EDITORS MAY NOT SUPPORT THE FIXED COLORS THOUGH, SO IT MAY BE HARD TO USE
  1189. THEM.
  1190.  
  1191.  
  1192. _╫HAT TO DO WITH ╞╠╔ ?_
  1193.  
  1194. ┬ECAUSE ╞╠╔ WILL EAT UP ALL THE AVAILABLE PROCESSOR TIME (NO ├OPPER :-),
  1195. IT IS NOT SUITABLE FOR ANY ACTION-GAMES. ┼ACH ╞╠╔ PICTURE TAKES ABOUT 17 K┬
  1196. OF MEMORY: NOT SO MANY PICTURES FIT ON ONE FLOPPY. ╙O, THE ONLY PLACE FOR ╞╠╔
  1197. IS DEMOS, INTROS, BOARD-TYPE GAMES AND MAYBE A ╟╔╞ VIEWER..
  1198.  
  1199. --------------------------------------------------------------------------
  1200. ╨ICTURE 1: ╞ROM WHICH MATRIX ╓╔├ FETCHES THE MULTICOLOR VALUES
  1201.  
  1202.  _          ___________________________________________________________
  1203. ▄      ... ▄ ═ATRIX0       ▄ ═ATRIX0       ▄ ═ATRIX0       ▄
  1204. ▄      ,  .▄____3__________▄____4__________▄____5__________▄  ...
  1205. ▄       ╒ .▄ ═ATRIX1       ▄ ═ATRIX1       ▄ ═ATRIX1       ▄
  1206. ▄       S .▄____3__________▄____4__________▄____5__________▄ .
  1207. ▄├HAR   E  ▄ ═ATRIX2       ▄ ═ATRIX2       ▄ ═ATRIX2       ▄ .
  1208. ▄╠INE   L  ▄____3__________▄____4__________▄____5__________▄ .
  1209. ▄┌ERO   E  ▄ ═ATRIX3       ▄ ═ATRIX3       ▄ ═ATRIX3       ▄
  1210. ▄       S  ▄____3__________▄____4__________▄____5__________▄
  1211. ▄       S, ▄ ═ATRIX4       ▄ ═ATRIX4       ▄ ═ATRIX4       ▄
  1212. ▄          ▄____3__________▄____4__________▄____5__________▄
  1213. ▄       C  ▄ ═ATRIX5       ▄ ═ATRIX5       ▄ ═ATRIX5       ▄
  1214. ▄       O  ▄____3__________▄____4__________▄____5__________▄
  1215. ▄       L  ▄ ═ATRIX6       ▄ ═ATRIX6       ▄ ═ATRIX6       ▄
  1216. ▄       U  ▄____3__________▄____4__________▄____5__________▄
  1217. ▄       M  ▄ ═ATRIX7       ▄ ═ATRIX7       ▄ ═ATRIX7       ▄
  1218. ▄_      N  ▄____3__________▄____4__________▄____5__________▄
  1219.         S  ▄ ═ATRIX0       ▄ ═ATRIX0       ▄ ═ATRIX0       ▄
  1220.            ▄___43__________▄___44__________▄___45__________▄
  1221.            ▄ ═ATRIX1       ▄ ═ATRIX1       ▄ ═ATRIX1       ▄
  1222.            ▄___43__________▄___44__________▄___45__________▄
  1223.            ▄
  1224.            ▄   ...
  1225.            ▄ .
  1226.            ▄ .
  1227.            ▄ .
  1228.  
  1229. --------------------------------------------------------------------------
  1230. _┴DDITIONAL READING_
  1231.  
  1232. ╔F YOU HAVE AN ┴MIGA YOU MIGHT WANT TO GET YOUR HANDS INTO MY CONVERSION
  1233. PROGRAMS IN ├64╟╞╪1.LHA. ╘HE PACKET ALSO INCLUDES ╞╠╔ VIEWER FOR ╨┴╠ ├64'S
  1234. AND SOME DOCUMENTATION ABOUT THE ╞╠╔ FILE FORMAT. ╔T ALSO HAS THE SAME
  1235. UTILITIES FOR ╦OALA FORMAT PICTURES.
  1236.  
  1237. ┴VAILABLE FROM:
  1238. CWAVES.STFX.CA
  1239. NIC.FUNET.FI:/PUB/AMIGA/GRAPHICS/APPLICATIONS/CONVERT
  1240.  
  1241.  
  1242. ├64╟╞╪.DOC
  1243.                         ├64╟FX1.0
  1244.            ┴ ├64 GRAFIX FORMAT CONVERSION PACKAGE
  1245.            )1991,1992  ╨ASI '┴LBERT' ╧JALA
  1246.  
  1247.            ┼-MAIL: PO87553@CS.TUT.FI
  1248.                    ALBERT@CC.TUT.FI
  1249.  
  1250. ╘HIS PACKAGE CONTAINS PROGRAMS WHICH ARE USED TO CONVERT PORTABLE
  1251. PIXMAP (PPM) FILES TO ├64 GRAPHICS FORMATS (╞╠╔ AND KOALA) UNDER
  1252. ┴MIGA╧╙. ╘HE PACKAGE INCLUDES ├ SOURCE CODES FOR THE PROGRAMS, SO
  1253. IT IS POSSIBLE TO PORT THE PROGRAMS TO ANOTHER ENVIRONMENT. ├64╟╞╪1.1
  1254. INCLUDES ╒NIX-COMPILABLE SOURCES.
  1255.  
  1256. ╔N ADDITION TO THIS PACKAGE YOU NEED E.G. ╨┬═╨LUS TO CONVERT ┴MIGA
  1257. ILBM FILES TO PPM FIRST. ┴ND OF COURSE SOME WAY TO TRANSFER FILES
  1258. BETWEEN THE MACHINES.
  1259.  
  1260. =============================================================================
  1261. ╥╙-232 ├ONVERTER
  1262. BY ╫ARREN ╘USTIN (WARREN@COL.HP.COM)
  1263.  
  1264.   ╘HIS ARTICLE PRESENTS A WAY TO INTERFACE FROM THE ├= RS232 HARDWARE
  1265. BEHIND THE USER PORT TO A STANDARD 25PIN FEMALE RS232 CONNECTOR USING ONLY
  1266. ONE ╔├ AND A FEW CAPACITORS.  ╔T IS NOT A ╒┴╥╘ OR A ╙╫╔╞╘╠╔╬╦ TYPE INTERFACE
  1267. WHICH TAKE PLACE OF THE INTERNAL ├= RS232 CIRCUITRY, BUT A SIMPLE LEVEL SHIFTING
  1268. INTERFACE THAT USES THE INTERNAL RS232 ROUTINES AND TRANSLATES THE USER PORT
  1269. LEVELS TO RS232 LEVELS.  ╘HEREFORE YOU CAN ONLY GET UPTO 2400BAUD/9600BAUD
  1270. (├=64/├=128) WITH THIS DESIGN.
  1271.  
  1272.   ╘HE "OLD" WAY TO DO THIS WAS TO USED ═├1488 AND ═├1489 PARTS (A LINE
  1273. DRIVER AND LINE RECEIVER), HOWEVER THESE REQUIRED A NEGATIVE SUPPLY TO INTERFACE
  1274. PROPERLY.  ╘HE USER PORT ONLY SUPPLIES +5VOLTS, HENCE THIS PRESENTS A PROBLEM.
  1275. ╘HERE HAS BEEN SUCCESS USING THESE PARTS OR DISCRETE TRANSISTORS AND RESISTORS
  1276. SINCE MANY MODEMS ARE SOMEWHAT FRIENDLY AND SEEM TO WORK EVEN THOUGH THE LEVELS
  1277. WERE MARGINAL.  ┴LSO, SOME SIGNALS WERE NOT USED, ALLOWING FOR POTENTIAL
  1278. PROBLEMS.  ┴NOTHER WAY TO SOLVE THIS PROBLEM WAS TO BUY A $25-30 INTERFACE.  ╔F
  1279. YOU CAN FIND THE ╔├ BELOW, YOU HAVE ANOTHER CHOICE THAT IS RELATIVELY
  1280. INEXPENSIVE.
  1281.  
  1282.    ╘HE ╠╘1133 IS BASICALLY THE ═├1488 AND 1489 PUT TOGETHER INTO ONE PART
  1283. WITH AN INTERNAL CHARGE PUMP SCHEME THAT ALLOWS THE INTERNAL DRIVERS TO OUTPUT
  1284. +5 AND -5 VOLTS TO THE RS232 CONNECTOR.  ╔T ALSO HAS ENOUGH DRIVERS AND
  1285. RECEIVERS TO HANDLE ALL OF THE SIGNALS THAT THE ├= USES FOR RS232.
  1286.  
  1287.    ╙O WITH THIS ╔├, 5 CAPACITORS AND THE TWO CONNECTORS (USER PORT AND
  1288. RS232) YOU CAN BUILD YOUR OWN INTERFACE TO THE STANDARD 25 PIN MODEM CABLE.
  1289.  
  1290.    ╚ERE ARE THE PLANS FOR AN ╒SER PORT ╘╧ ╥╙232 CONNECTOR USING JUST ╧╬┼ ╔├ AND
  1291. 4 CAPACITORS.  ╔T USES A ╠INEAR ╘ECHNOLOGY ╠╘1133 BUFFER THAT HAS 3 ╥╙232
  1292. DRIVERS AND 5 RECEIVERS.  ╔T HAS WORKED FOR ME WITH NO PROBLEMS AND TAKES
  1293. A MINIMUM AMOUT OF WIRING TO GET TO WORK.  ═Y BOARD IS ONLY THE WIDTH OF
  1294. THE USER PORT AND ABOUT 1.5 INCHES DEEP IN SIZE.
  1295.  
  1296. ╨ARTS LIST:
  1297. ----------
  1298.      ╠╘1133├╬ PLASTIC DIP OR ╠╘1133├╩ CERAMIC DIP ╥╙232 DRIVER FROM ╠INEAR
  1299.         ╘ECHNOLOGIES
  1300.  
  1301.         (╔T TAKES 27M┴ MAX (17M┴ TYPICAL) SO IS WELL BELOW THE 100M┴ 
  1302.          LIMIT OF THE USER PORT)
  1303.  
  1304.          ─RIVER ╔N PINS  (15,19,21)  ╘╘╠/├═╧╙ COMPATIBLE.  ╒NUSED INPUTS
  1305.                            ▄  ▄  ▄   SHOULD BE TIED TO +5V.
  1306.          ─RIVER ╧UT PINS (11, 7, 5)  ╥╙232 COMPATIBLE.  ╙HORT CIRCUIT 
  1307.                                      PROTECTED FROM -30V TO +30V.
  1308.          ╥ECEIVER ╔N PINS  (6, 8, 9, 10,12)  ┴CCEPT ╥╙232 LEVELS (+-30V)
  1309.                             ▄  ▄  ▄   ▄  ▄   AND HAVE 0.4V OF HYSTERESIS TO
  1310.                             ▄  ▄  ▄   ▄  ▄   PROVIDE NOISE IMMUNITY.
  1311.          ╥ECEIVER ╧UT PINS (20,18,17,16,14)  ╘╘╠/├═╧╙ OUTPUTS.
  1312.  
  1313.          ╬╧╘┼: ╠INES ABOVE INDICATE WHICH INPUTS GO WITH WHICH OUTPUTS, AND
  1314.                THE PAIRS CAN BE INTERCHANGED FREELY.  ╔ CONNECTED THEM AS
  1315.                DESCRIBED BELOW BECAUSE THE WIRING WORKED OUT THE BEST FOR ME. 
  1316.  
  1317.      4 - >= 1U╞ CAPACITORS   ╒SED TO GENERATE ╥╙232 VOLTAGES BY A CHARGE PUMP
  1318.                              TECHNIQUE INSIDE ╔├
  1319.      1   1U╞ CAPACITOR  ╘O BYPASS THE 5VOLT SUPPLY FOR NOISE REJECTION.
  1320.  
  1321.      1   ╒SER PORT FEMALE CONNECTOR.  (╔ JUST DUG THIS UP, ╔'M NOT SURE 
  1322.          WHERE THESE CAN BE FOUND, ╔ THINK IT IS 0.159" SPACING, 24PIN.
  1323.  
  1324.      1   ╥╙232 25PIN FEMALE CONNECTOR.  ├AN BE FOUND AT ╥-╙HACK
  1325.         
  1326.      ╙OME SORT OF .1" SPACING PROTO BOARD
  1327.  
  1328. ├ONNECTIONS:
  1329. -----------
  1330.  
  1331.   ╒SER PORT CONNECTOR (╠OOKING INTO THE ├64 OR ├128)
  1332.  
  1333.          1  2  3  4  5  6  7  8  9 10 11 12
  1334.         ------------------------------------
  1335.         ▄╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪▄
  1336.         ------------------------------------
  1337.          ┴  ┬  ├  ─  ┼  ╞  ╚  ╩  ╦  ╠  ═  ╬
  1338.  
  1339. ╟ROUND & ╨OWER:
  1340. --------------
  1341.  
  1342.   ╨INS 1, ┴, 12, ╬ TO ╟ROUND OF BOARD.
  1343.   ╠╘1133 PIN 2 TO PIN 2 OF ╒SER PORT CONNECTOR (+5 VOLTS)
  1344.   1U╞ CAPACITOR BETWEEN PIN2 AND GROUND (BYPASS CAP)
  1345.   ╠╘1133 PIN 13 TO ╟ROUND.
  1346.   ╥╙232 CONNECTOR PINS 7 & 1 TO ╟ROUND.
  1347.  
  1348. ╠╘1133 CAPACITORS:
  1349.   1U╞ FROM PIN 1 (╓+) TO GROUND  (╔F POLARIZED (ELECTROLYTIC) + SIDE TO PIN 1)
  1350.   1U╞ FROM PIN 24 (╓-) TO GROUND (┴S ABOVE BUT + SIDE TO GROUND)
  1351.   1U╞ FROM PIN 3 (├1+) TO PIN 4 (├1-) (┴GAIN IF POLARIZED, + SIDE TO PIN 3)
  1352.   1U╞ FROM PIN 22 (├2+) TO PIN 23 (├2-) (┴GAIN IF POLARIZED, + SIDE TO PIN 22)
  1353.     
  1354.  
  1355.     ├OMMODORE SIDE                                       ╥╙232 SIDE
  1356.   ╒SER PORT    ╙IGNAL    ╨IN OF       ╙IGNAL        ╨IN OF       ╥╙232
  1357.   PIN          NAME      ╠╘1133      DIRECTION      ╠╘1133       CONNECTOR
  1358.   ---------    ------    ------      ---------      ------       ---------
  1359.    ┬  ╞╠┴╟2     ─IN        20         <--             6              3
  1360.    ├   ╨┬0      ─IN     ALSO CONNECT TO ABOVE PIN 20
  1361.    ─   ╨┬1      ╥╘╙        21             -->         5              4
  1362.    ┼   ╨┬2      ─╘╥        19         <--             7              20
  1363.    ╞   ╨┬3      ╥╔         18             -->         8              22
  1364.    ╚   ╨┬4      ─├─        17             -->         9              8
  1365.    ╩   ╨┬5      ╬OT USED
  1366.    ╦   ╨┬6      ├╘╙        16             -->         10             5
  1367.    ╠   ╨┬7      ─╙╥        14         <--             12             6
  1368.    ═   ╨┴2      ─OUT       15             -->         11             2
  1369.  
  1370.  
  1371. ╘HIS ASSUMES THAT YOU WANT TO CONNECT ALL OF THE COMMUNICATION LINES.  ╔ DID
  1372. IT THIS WAY BECAUSE THE ├128 PROGRAMMERS REFERENCE GUIDE HAD ALL OF THE SIGNALS
  1373. ABOVE LISTED.  ╔F YOU WANT TO DROP ╥╔ (RING INDICATOR) YOU COULD ALSO USE AN
  1374. ╠╘1134 WHICH HAS 4 DRIVERS AND 4 RECEIVERS.
  1375.  
  1376. ╨ARTS ╙UBSTITUTION:
  1377.  
  1378.    ╘HERE ARE OTHER ╔├'S AVAILABLE WHICH WILL WORK IN THIS APPLICATION.
  1379. ╘HE RS232 BUS LEVELS FOR THE ╠╘ PARTS ARE SPEC'ED AT ▐ +/- 7V TYPICAL, WHILE
  1380. THE ═┴╪╔═ PARTS ARE +/-9V TYPICAL.  (┬OTH ARE MIN AT +/- 5V WHICH SHOULD WORK
  1381. IN ALL APPLICATIONS).  ╔ THINK THAT AN INTERFACE CAN BE DONE WITH ONLY 3
  1382. LINES, ─IN(╥X), ─OUT(╘X), AND EITHER ─╙╥ OR ├╘╙, SO IF YOU CAN'T GET THE
  1383. ╠╘1133 ONE OF THESE OTHERS MIGHT WORK, ALTHOUGH THE PINOUTS WOULD BE DIFFERENT.
  1384. ╘HE MAX YOU WOULD NEED IS WHAT THE ╠╘1133 SUPPLIES, 3 DRIVERS & 5 RECEIVERS.
  1385.  
  1386. ╚ERE IS A DESCRIPTION OF PARTS THAT MIGHT BE SUBSTITUTED:
  1387. (╬OTE, WITH ALL OF THEM YOU SHOULD USE A BYPASS CAP ON THE +5V SUPPLY WHICH
  1388.  ╔ HAVE ╬╧╘ INCLUDED IN THE COUNTS BELOW.)
  1389.  
  1390.                  ╥╙232     ╥╙232    # OF ┼╪╘┼╥╬┴╠
  1391. ╬┴═┼     ╨╔╬╙   ─╥╔╓┼╥╙  ╥┼├┼╔╓┼╥╙       ├┴╨╙       ├╧══┼╬╘╙
  1392. -------------------------------------------------------------------------
  1393. ╠INEAR ╘ECHNOLOGY PARTS...
  1394. (╧N THE PARTS WITH SHUTDOWN (╙─), THE PIN MUST BE TIED TO +5 TO OPERATE)
  1395. ╠╘1133    24       3         5             4        ╔N ARTICLE ABOVE
  1396. -------------------------------------------------------------------------
  1397. ╠╘1130    28       5         5             4        ╧VERKILL (╙─P14)
  1398. ╠╘1131    28       5         4             4        2 EX ─R, 1 < ╥CVR
  1399. ╠╘1132    24       5         3             4        2 EX ─R, 2 < ╥CVR
  1400. ╠╘1134    24       4         4             4        1 < ╥CVR
  1401. ╠╘1136    28       4         5             4        1 EX ─R  (╙─P14)
  1402. ╠╘1137    28       3         5             4        ╙─P13
  1403. ╠╘1138    28       5         3             4        ╠╘1132 W/╙─P13
  1404.  
  1405. ═┴╪╔═ PARTS... (╙OME ALSO HAVE A ╘╘╠ ┼╬_ PIN THAT MUST BE TIED TO 0V TO OPERATE)
  1406.                (╧N THESE PARTS, ╙─ MUST BE TIED TO 0V TO OPERATE!)
  1407. ═┴╪232    16       2         2             4        ═AY WORK
  1408. ═┴╪233    20       2         2             0!       ╬O EXTERNAL CAPS
  1409. ═┴╪235    24       5         5             0!       ╧VERKILL, BUT ╬╧ CAPS,
  1410.                                                     ╙─P21, ┼╬_P20
  1411. ═┴╪236    24       4         3             4        1 EX ─R, 2 < ╥CVR,
  1412.                                                     ╙─P21, ┼╬_P20
  1413. ═┴╪237    24       5         3             4        2 EX ─╥, 2 < ╥CVR
  1414. ═┴╪238    24       4         4             4        1 EX ─╥, 1 < ╥CVR
  1415.  
  1416.   ╔N SUMMARY, YOU CAN SEE THERE ARE MANY DIFFERENT PARTS YOU COULD USE,
  1417. ESPECIALLY IF YOU DON'T NEED ALL THE SIGNALS.  ╘HE ═┴╪╔═ PARTS SEEM TO
  1418. DO THE JOB IN FEWER PINS AND A LITTLE BETTER TYPICAL DRIVE SPEC AND ╔
  1419. WOULD RECOMMEND THE ═┴╪235 OVERALL SINCE YOU ONLY NEED 1 BYPASS CAP TO
  1420. MAKE IT OPERATE!
  1421.  
  1422. =============================================================================
  1423. ╔NTRODUCTION TO THE ╓╔├-╔╔
  1424. BY ╨ASI '┴LBERT' ╧JALA ( ... )
  1425.  
  1426. ╘HE ╓IDEO ╔NTERFACE ├ONTROLLER USED IN ├64 HAVE SEVERAL DIFFERENT OPERATING
  1427. MODES AND DIFFERENT GRAPHICAL PRIMITIVES. ┬ASICALLY THERE IS A) CHARACTER
  1428. MODE, B) BITMAP MODE AND C) MOVABLE OBJECTS THAT CAN BE MIXED WITH THE
  1429. OTHER GRAPHICS. ╘HESE PRIMITIVES CAN ALSO BE PUT INTO A MORE COLORFUL MODE,
  1430. BUT YOU LOSE HALF OF THE RESOLUTION IN THAT PROCESS.
  1431.  
  1432.  
  1433. ╔. ╙TANDARD ├HARACTER ─ISPLAY ═ODE
  1434.  
  1435. ╔N THE CHARACTER DISPLAY MODE, ╓╔├ FETCHES CHARACTER POINTERS FROM VIDEO
  1436. MATRIX, WHICH CONSISTS OF 1000 8-BIT BYTES FORMATTED AS 25 ROWS OF 40
  1437. CHARACTERS EACH. ╘HE 8-BIT CHARACTER CODE IMPLIES 256 DIFFERENT CHARACTERS
  1438. SIMULTANEOUSLY ONSCREEN.
  1439.  
  1440. ┼ACH CHARACTER CODE CAN HAVE AN UNIQUE IMAGE, WHICH CONSISTS OF 8 BYTES IN
  1441. CHARACTER MEMORY. ╘HE POSITION OF THE CHARACTER MEMORY CAN BE MOVED WITH THE
  1442. CHARACTER BASE POINTER AND THUS IT IS POSSIBLE TO HAVE SEVERAL CHARACTER SETS
  1443. SIMULTANEOSLY IN MEMORY. ╧NE CHARACTER MEMORY IS 2048 BYTES.
  1444.  
  1445. ╔N ADDITION TO THE CHARACTER CODE, EACH POSITION IN VIDEO MATRIX HAS AN
  1446. ASSOCIATED COLOR NYBBLE (4 BITS) IN COLOR MEMORY ($─800-$─╞╞╞). ╞OR EACH
  1447. ZERO-BIT IN THE CHARSET THE BACKGROUND COLOR FROM REGISTER $21 IS DISPLAYED,
  1448. THE COLOR-NYBBLE IS USED FOR THE ONE-BIT.
  1449.  
  1450.  
  1451. ╔╔. ├HARACTER ═ULTICOLOR ═ODE
  1452.  
  1453. ╔N CHARACTER MULTICOLOR MODE, COLOR SELECTION IS INCREASED. ┼ACH BYTE IS
  1454. FETCHED FROM THE CHARACTER MEMORY JUST LIKE IN THE STANDARD CHARACTER MODE,
  1455. BUT THEY ARE INTERPRETED DIFFERENTLY. ╔N THIS MODE BYTES ARE DIVIDED INTO
  1456. BIT-PAIRS. ╞OR BIT PAIR "00" THE BACKGROUND COLOR FROM REGISTER $21 IS
  1457. DISPLAYED, BACKGROUND COLOR #1 IS USED FOR BIT PAIR "01" AND BACKGROUND
  1458. COLOR #2 FOR BIT PAIR "10". ╘HE COLOR NYBBLE WILL DEFINE THE COLOR FOR BIT
  1459. PAIR "11".
  1460.  
  1461. ╘HE HIGHEST BIT IN THE COLOR MEMORY DEFINES WHETHER THE CHARACTER IS TO BE
  1462. DISPLAYED IN MULTICOLOR ("1") OR IN STANDARD MODE ("0"). ┬ECAUSE OF THIS,
  1463. ONLY COLORS IN THE RANGE FROM 0 TO 7 ARE POSSIBLE FOR BIT PAIR "11". ┴ND SINCE
  1464. TWO BITS ARE REQUIRED TO SPECIFY ONE DOT COLOR, THE CHARACTER IS NOW DISPLAYED
  1465. AS A 4X8 MATRIX INSTEAD OF THE 8X8 MATRIX AND THE SIZE OF THE DOTS ARE DOUBLED
  1466. HORIZONTALLY.
  1467.  
  1468.  
  1469. ╔╔╔. ┼XTENDED ├OLOR ═ODE
  1470.  
  1471. ╘HE EXTENDED COLOR MODE ALLOWS THE SELECTION OF ONE BACKGROUND COLOR FROM FOUR
  1472. POSSIBILITIES FOR EACH CHARACTER POSITION IN THE NORMAL 8X8 RESOLUTION. ╘HE
  1473. CHARACTER IMAGE DATA IS PROCESSED LIKE IN STANDARD CHARACTER MODE, BUT THE
  1474. TWO MOST SIGNIFICANT BITS IN THE CHARACTER CODE (VIDEO MATRIX) ARE USED TO
  1475. SELECT THE RIGHT BACKGROUND COLOR REGISTER. ╧NLY CHARACTER IMAGES FROM 0 TO 63
  1476. ARE ACCESSIBLE, BECAUSE TWO OF THE MOST SIGNIFICANT BITS ARE USED FOR THE
  1477. BACKGROUND COLOR SELECTION.
  1478.  
  1479. ┼XTENDED COLOR MODE AND MULTICOLOR MODE SHOULD NOT BE SELECTED SIMULTANEOSLY,
  1480. BECAUSE THIS WILL RESULT A BLACK SCREEN. ╚OWEVER, THIS IS A VERY EASY WAY TO
  1481. HIDE SOMETHING IF NEEDED.
  1482.  
  1483.  
  1484. ╔╓. ╙TANDARD ┬IT ═AP ═ODE
  1485.  
  1486. ╔N BIT MAP MODE, A ONE-TO-ONE CORRESPONDENCE EXISTS BETWEEN EACH DISPLAYED
  1487. DOT AND A MEMORY BIT. ╘HE BIT MAP PROVIDES A RESOLUTION OF 320╚ X 200╓
  1488. INDIVIDUALLY CONTROLLED PIXELS. ╘HE VIDEO MATRIX IS STILL ACCESSED AS IN
  1489. CHARACTER MODE, BUT THE DATA IS INTERPRETED AS COLOR DATA. ╫HEN A BIT IS "0"
  1490. IN THE BIT MAP DATA, THE COLOR FROM THE LOWER NYBBLE IS SELECTED. ╘HE
  1491. HIGHER NYBBLE FROM THE VIDEO MATRIX IS USED FOR THE BIT "1".
  1492.  
  1493.  
  1494. ╓. ═ULTICOLOR ┬IT ═AP ═ODE
  1495.  
  1496. ╔N MULTICOLOR BIT MAP MODE TWO BITS IN THE BIT MAP MEMORY DETERMINE THE COLOR
  1497. OF ONE PIXEL. ╔F THE BIT PAIR IS "11", THE COLOR FOUND FROM THE COLOR MEMORY
  1498. IS USED. ╘HE BACKGROUND COLOR IS USED FOR BIT PAIR "00" AND THE VIDEO MATRIX
  1499. DEFINES THE COLORS FOR BIT PAIRS "01" AND "10". ┴S IT TAKES TWO BITS TO DEFINE
  1500. ONE PIXEL COLOR, THE HORIZAONTAL RESOLUTION IS HALVED TO 160╚ X 200╓.
  1501.  
  1502.  
  1503. ╓╔. ═OVABLE ╧BJECT ┬LOCKS (═╧┬S)
  1504.  
  1505. ╘HE MOVABLE OBJECT BLOCK IS A SPECIAL TYPE OF GRAPHICAL OBJECT WHICH CAN BE
  1506. DISPLAYED INDEPENDENTLY FROM THE OTHER GRAPHICS. ┼ACH ONE OF THE ═╧┬S CAN
  1507. BE MOVED INDEPENDENTLY ANYWHERE IN THE SCREEN. ┼IGHT UNIQUE ═╧┬S CAN BE
  1508. DISPLAYED SIMULATANIOUSLY, EACH DEFINED BY 64 BYTES IN MEMORY WHICH ARE
  1509. DISPLAYED AS A 24 X 21 PIXEL ARRAY.
  1510.  
  1511. ┼ACH ═╧┬ CAN BE SELECTIVELY ENABLED (═N┼="1") OR DISABLED (═N┼="0"). ┴ ═╧┬
  1512. IS POSITIONED VIA ITS ╪ AND ┘ POSITION REGISTERS. ╬INE BITS ARE NEEDED TO
  1513. DEFINE THE VERTICAL POSITION AND THE MOST SIGNIFICANT BITS OF ALL ═╧┬S ARE
  1514. STORED IN THE REGISTER $10. ┴S ╪ LOCATIONS 23 TO 347 AND ┘ LOCATIONS 50 TO
  1515. 249 ARE ENTIRELY VISIBLE ON THE SCREEN, ═╧┬S CAN BE SMOOTHLY MOVED TO AN
  1516. OFF-SCREEN POSITION.
  1517.  
  1518. ┼ACH ═╧┬ HAS ITS OWN COLOR REGISTER AND A ═╧┬ CAN BE DISPLAYED EITHER IN
  1519. STANDARD OR MULTICOLOR MODE (═N═├="1"). ┴S USUALLY, MULTICOLOR MODE GIVES
  1520. MORE COLORS, BUT HALVES THE HORIZONTAL RESOLUTION. ╔N MULTICOLOR MODE BIT
  1521. PAIR "00" IS TRANSPARENT, THE ═╧┬ COLOR REGISTER DEFINES THE COLOR FOR PAIR
  1522. "10", AND ═╧┬ MULTICOLOR REGISTERS GIVE THE COLORS FOR PAIRS "01" AND "11".
  1523.  
  1524. ═╧┬S CAN BE SELECTIVELY EXPANDED IN BOTH DIRECTIONS. ╫HEN ═╧┬ IS EXPANDED,
  1525. THE PIXEL SIZE ALSO EXPANDS AND IT IS STILL DISPLAYED AS 24 X 21 MATRIX
  1526. (12 X 21 IN MULTICOLOR MODE).
  1527.  
  1528. ═╧┬ PRIORITIES DEFINE WHETHER A ═╧┬ APPEARS BEHIND OR ON TOP OF THE CHARACTER
  1529. OR BIT MAP GRAPHICS. ┴ "1" IN ═N─╨ MEANS ═╧┬ IS DISPLAYED BEHIND. ═╧┬
  1530. COLLISION REGISTERS MAY BE USED TO DETECT IF A NON-TRANSPARENT DATA OF TWO
  1531. ═╧┬S OR A ═╧┬ AND CHARACTER OR BITMAP FOREGROUND DATA IS COLLIDING.
  1532.  
  1533. [┼D'S ╬OTE: ═╧┬'S ARE ╙PRITES. ├OMMODORE INITIALLY REFERRED TO THEM AS ═╧┬'S
  1534. AND STILL DOES IN SOME AREAS.]
  1535.  
  1536.  
  1537. ╓╔╔. ╧THER FEATURES
  1538.  
  1539. ╘HE DISPLAY SCREEN MAY BE BLANKED BY SETTING THE ─┼╬ BIT TO A "0". ╘HE ENTIRE
  1540. SCREEN WILL BE FILLED WITH THE BORDER COLOR AS SET IN REGISTER 32 ($20).
  1541. ╫HEN THE SCREEN IS BLANKED, ╓╔├ WILL NEED ONLY TRANSPARENT MEMORY CYCLES AND
  1542. THE PROCESSOR IS NOT SLOWED DOWN. ╚OWEVER, ═╧┬ DATA IS STILL FETCHED, IF
  1543. THE ═╧┬S ARE NOT ALSO DISABLED.
  1544.  
  1545. ╘HE NORMAL DISPLAY CONSISTS OF 25 ROWS OF 40 CHARACTERS EACH. ╘HE DISPLAY
  1546. WINDOW CAN BE REDUCED TO 24 ROWS AND 38 CHARACTERS. ╘HIS HAS NO EFFECT ON HOW
  1547. THE DATA IS INTERPRETED, ONLY THE CHARACTERS NEXT TO THE BORDER ARE COVERED
  1548. BY THE BORDER. ╥╙┼╠ CONTROLS THE NUMBER OF ROWS ("1" FOR 25 ROWS) AND ├╙┼╠
  1549. CONTROLS THE NUMBER OF COLUMNS ("1" FOR 40 COLUMNS).
  1550.  
  1551. ╘HE DISPLAY DATA MAY BE SCROLLED UP TO ONE CHARACTER SPACE IN BOTH VERTICAL
  1552. AND HORIZONTAL DIRECTION. ╨OSITION OF THE SCREEN IS SET WITH THE 3 LOWEST
  1553. ORDER (LEAST SIGNIFICANT) BITS IN REGISTERS 22 ($16) AND 17 ($11).
  1554.  
  1555. ╠IGHT PEN LATCH IS USED TO CATCH THE POSITION OF THE LIGHT PEN WHEN A PULSE
  1556. IS RECEIVED IN THE ╠╨ PIN. ╘HE VALUE IS LATCHED ONLY ONCE IN A FRAME.
  1557.  
  1558. ╘HE RASTER REGISTER IS A DUAL-FUNCTION REGISTER. ┴ READ FROM THE RASTER
  1559. REGISTER RETURNS THE CURRENT RASTER POSITION AND A WRITE TO IT WILL SET THE
  1560. RASTER COMPARE VALUE. ╫HEN THE WRITTEN VALUE AND THE CURRENT RASTER LINE
  1561. MATCHES, A RASTER INTERRUPT IS GENERATED IF ENABLED. ╥ASTER REGISTER HAS ITS
  1562. MOST SIGNIFICANT (9TH) BIT IN REGISTER 17 ($11).
  1563.  
  1564. ╘HE INTERRUPT REGISTER SHOWS THE STATUS OF THE FOUR SOURCES OF INTERRUPT.
  1565. ┴ CORRESPONDING BIT WILL BE SET TO "1" WHEN AN INTERRUPT SOURCE HAS GENERATED
  1566. AN INTERRUPT REQUEST. ╘O ENABLE AN INTERRUPT REQUEST TO SET THE /╔╥╤ OUTPUT
  1567. TO ZERO, THE CORRESPONDING ENABLE BIT IN REGISTER 26 ($1A) MUST BE SET TO
  1568. "1". ╘HE INTERRUPT LATCH MAY ONLY BE CLEARED BY WRITING A "1" TO THE
  1569. DESIRED LATCH IN THE INTERRUPT REGISTER.
  1570.  
  1571. -----------------------------------------------------------------------------
  1572. ╓╔├ REGISTER MAP (┬ASE ADDRESS $D000)
  1573.  
  1574. ┴DDRESS ─┬7   ─┬6   ─┬5   ─┬4   ─┬3   ─┬2   ─┬1   ─┬0   ─ESCRIPTION
  1575. -------------------------------------------------------------------
  1576. 00 $00  ═0╪7  ═0╪6  ═0╪5  ═0╪4  ═0╪3  ═0╪2  ═0╪1  ═0╪0  ═╧┬ 0 ╪-POSITION
  1577. 01 $01  ═0┘7  ═0┘6  ═0┘5  ═0┘4  ═0┘3  ═0┘2  ═0┘1  ═0┘0  ═╧┬ 0 ┘-POSITION
  1578. 02 $02  ═1╪7  ═1╪6  ═1╪5  ═1╪4  ═1╪3  ═1╪2  ═1╪1  ═1╪0  ═╧┬ 1 ╪-POSITION
  1579. 03 $03  ═1┘7  ═1┘6  ═1┘5  ═1┘4  ═1┘3  ═1┘2  ═1┘1  ═1┘0  ═╧┬ 1 ┘-POSITION
  1580. 04 $04  ═2╪7  ═2╪6  ═2╪5  ═2╪4  ═2╪3  ═2╪2  ═2╪1  ═2╪0  ═╧┬ 2 ╪-POSITION
  1581. 05 $05  ═2┘7  ═2┘6  ═2┘5  ═2┘4  ═2┘3  ═2┘2  ═2┘1  ═2┘0  ═╧┬ 2 ┘-POSITION
  1582. 06 $06  ═3╪7  ═3╪6  ═3╪5  ═3╪4  ═3╪3  ═3╪2  ═3╪1  ═3╪0  ═╧┬ 3 ╪-POSITION
  1583. 07 $07  ═3┘7  ═3┘6  ═3┘5  ═3┘4  ═3┘3  ═3┘2  ═3┘1  ═3┘0  ═╧┬ 3 ┘-POSITION
  1584. 08 $08  ═4╪7  ═4╪6  ═4╪5  ═4╪4  ═4╪3  ═4╪2  ═4╪1  ═4╪0  ═╧┬ 4 ╪-POSITION
  1585. 09 $09  ═4┘7  ═4┘6  ═4┘5  ═4┘4  ═4┘3  ═4┘2  ═4┘1  ═4┘0  ═╧┬ 4 ┘-POSITION
  1586. 10 $0A  ═5╪7  ═5╪6  ═5╪5  ═5╪4  ═5╪3  ═5╪2  ═5╪1  ═5╪0  ═╧┬ 5 ╪-POSITION
  1587. 11 $0B  ═5┘7  ═5┘6  ═5┘5  ═5┘4  ═5┘3  ═5┘2  ═5┘1  ═5┘0  ═╧┬ 5 ┘-POSITION
  1588. 12 $0C  ═6╪7  ═6╪6  ═6╪5  ═6╪4  ═6╪3  ═6╪2  ═6╪1  ═6╪0  ═╧┬ 6 ╪-POSITION
  1589. 13 $0D  ═6┘7  ═6┘6  ═6┘5  ═6┘4  ═6┘3  ═6┘2  ═6┘1  ═6┘0  ═╧┬ 6 ┘-POSITION
  1590. 14 $0E  ═7╪7  ═7╪6  ═7╪5  ═7╪4  ═7╪3  ═7╪2  ═7╪1  ═7╪0  ═╧┬ 7 ╪-POSITION
  1591. 15 $0F  ═7┘7  ═7┘6  ═7┘5  ═7┘4  ═7┘3  ═7┘2  ═7┘1  ═7┘0  ═╧┬ 7 ┘-POSITION
  1592. 16 $10  ═7╪8  ═6╪8  ═5╪8  ═4╪8  ═3╪8  ═2╪8  ═1╪8  ═0╪8  ═╙┬ OF ╪-POSITION
  1593.  
  1594. 17 $11  ╥├8   ┼├═   ┬══   ─┼╬   ╥╙┼╠  ┘2    ┘1    ┘0    (╙EE TEXT)
  1595. 18 $12  ╥├7   ╥├6   ╥├5   ╥├4   ╥├3   ╥├2   ╥├1   ╥├0   ╥ASTER REGISTER
  1596. 19 $13  ╠╨╪8  ╠╨╪7  ╠╨╪6  ╠╨╪5  ╠╨╪4  ╠╨╪3  ╠╨╪2  ╠╨╪1  ╠IGHT ╨EN ╪
  1597. 20 $14  ╠╨┘7  ╠╨┘6  ╠╨┘5  ╠╨┘4  ╠╨┘3  ╠╨┘2  ╠╨┘1  ╠╨┘0  ╠IGHT ╨EN ┘
  1598. 21 $15  ═7┼   ═6┼   ═5┼   ═4┼   ═3┼   ═2┼   ═1┼   ═0┼   ═╧┬ ┼NABLE
  1599. 22 $16  -     -     ╥┼╙   ═├═   ├╙┼╠  ╪2    ╪1    ╪0    (╙EE TEXT)
  1600. 23 $17  ═7┘┼  ═6┘┼  ═5┘┼  ═4┘┼  ═3┘┼  ═2┘┼  ═1┘┼  ═0┘┼  ═╧┬ ┘-EXPAND
  1601. 24 $18  ╓═13  ╓═12  ╓═11  ╓═10  ├┬13  ├┬12  ├┬11  -     ═EMORY ╨OINTERS
  1602. 25 $19  ╔╥╤   -     -     -     ╔╠╨   ╔══├  ╔═┬├  ╔╥╙╘  ╔NTERRUPT ╥EGISTER
  1603. 26 $1A  -     -     -     -     ┼╠╨   ┼══├  ┼═┬├  ┼╥╙╘  ┼NABLE ╔NTERRUPT
  1604. 27 $1B  ═7─╨  ═6─╨  ═5─╨  ═4─╨  ═3─╨  ═2─╨  ═1─╨  ═0─╨  ═╧┬-─┴╘┴ ╨RIORITY
  1605. 28 $1C  ═7═├  ═6═├  ═5═├  ═4═├  ═3═├  ═2═├  ═1═├  ═0═├  ═╧┬ ═ULTICOLOR SELECT
  1606. 29 $1D  ═7╪┼  ═6╪┼  ═5╪┼  ═4╪┼  ═3╪┼  ═2╪┼  ═1╪┼  ═0╪┼  ═╧┬ ╪-┼XPAND
  1607. 30 $1E  ═7═   ═6═   ═5═   ═4═   ═3═   ═2═   ═1═   ═0═   ═╧┬-═╧┬  ├OLLISION
  1608. 31 $1F  ═7─   ═6─   ═5─   ═4─   ═3─   ═2─   ═1─   ═0─   ═╧┬-─┴╘┴ ├OLLISION
  1609.  
  1610. 32 $20  -     -     -     -     ┼├3   ┼├2   ┼├1   ┼├0   ┼XTERIOR ├OLOR
  1611. 33 $21  -     -     -     -     ┬0├3  ┬0├2  ┬0├1  ┬0├0  ┬ACKGROUND #0 ├OLOR
  1612. 34 $22  -     -     -     -     ┬1├3  ┬1├2  ┬1├1  ┬1├0  ┬ACKGROUND #1 ├OLOR
  1613. 35 $23  -     -     -     -     ┬2├3  ┬2├2  ┬2├1  ┬2├0  ┬ACKGROUND #2 ├OLOR
  1614. 36 $24  -     -     -     -     ┬3├3  ┬3├2  ┬3├1  ┬3├0  ┬ACKGROUND #3 ├OLOR
  1615. 37 $25  -     -     -     -     ══03  ══02  ══01  ══00  ═╧┬ ═ULTICOLOR #0
  1616. 38 $26  -     -     -     -     ══13  ══12  ══11  ══10  ═╧┬ ═ULTICOLOR #1
  1617.  
  1618. 39 $27  -     -     -     -     ═0├3  ═0├2  ═0├1  ═0├0  ═╧┬ 0 ├OLOR
  1619. 40 $28  -     -     -     -     ═1├3  ═1├2  ═1├1  ═1├0  ═╧┬ 1 ├OLOR
  1620. 41 $29  -     -     -     -     ═2├3  ═2├2  ═2├1  ═2├0  ═╧┬ 2 ├OLOR
  1621. 42 $2A  -     -     -     -     ═3├3  ═3├2  ═3├1  ═3├0  ═╧┬ 3 ├OLOR
  1622. 43 $2B  -     -     -     -     ═4├3  ═4├2  ═4├1  ═4├0  ═╧┬ 4 ├OLOR
  1623. 44 $2C  -     -     -     -     ═5├3  ═5├2  ═5├1  ═5├0  ═╧┬ 5 ├OLOR
  1624. 45 $2D  -     -     -     -     ═6├3  ═6├2  ═6├1  ═6├0  ═╧┬ 6 ├OLOR
  1625. 46 $2E  -     -     -     -     ═7├3  ═7├2  ═7├1  ═7├0  ═╧┬ 7 ├OLOR
  1626.  
  1627. ═N╪  = ═╧┬ N ╪ POSITION         ═N┘  = ═╧┬ N ┘ POSITION
  1628. ╥├   = ╥ASTER COMPARE REGISTER  ┼├═  = ┼XTENDED COLOR MODE
  1629. ═┬┬  = ┬IT MAP MODE             ─┼╬  = ─ISPLAY ENABLE
  1630. ╥╙┼╠ = ╥OW SELECT               ┘    = ╙CREEN ┘ POSITION
  1631. ╠╨╪  = ╠IGHT PEN ╪ POSITION     ╠╨┘  = ╠IGHT PEN ┘ POSITION
  1632. ═N┼  = ═╧┬ N ┼NABLE             ╥┼╙  = ┴LWAYS SET TO ZERO!
  1633. ═├═  = ═ULTICOLOR MODE          ├╙┼╠ = ├OLUMN SELECT
  1634. ╪    = ╙CREEN ╪ POSITION        ═N┘┼ = ═╧┬ N ┘ EXPAND
  1635. ╓═   = ╓IDEO MATRIX POINTER     ├┬   = ├HARACTER BASE POINTER
  1636. ═N─╨ = ═╧┬ TO DATA PRIORITY     ═N═├ = ═╧┬ N MULTICOLOR SELECT
  1637. ═N╪┼ = ═╧┬ N ╪ EXPAND
  1638.  
  1639. =============================================================================
  1640. ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
  1641.  
  1642. BY ├RAIG ┬RUCE  <CSBRUCE@NEUMANN.UWATERLOO.CA>
  1643.  
  1644. 1. ╔╬╘╥╧─╒├╘╔╧╬
  1645.  
  1646. ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
  1647. OF ═╙-─╧╙ DISKS.  ╘HE PROGRAM COPIES ONLY FROM DRIVE TO DRIVE WITHOUT
  1648. BUFFERING FILE DATA INTERNALLY.  ╘HIS IS SIMPLER AND IMPOSES NO LIMITS ON THE
  1649. SIZE OF THE FILES TRANSFERRED, ALTHOUGH IT REQUIRES THE USE OF TWO DISK DRIVES
  1650. (OR A LOGICAL DRIVE).  ╘HE USER-INTERFACE CODE IS WRITTEN IN ┬┴╙╔├ AND
  1651. PRESENTS A FULL-SCREEN FILE SELECTION MENU.  ╘HE GRUNT-WORK CODE IS WRITTEN IN
  1652. ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM VELOSITY.
  1653.  
  1654. ╘HE ┬URST ├OMMAND ╔NSTRUCTION ╙ET OF THE 1571/81 IS USED TO READ THE ═╙-─╧╙
  1655. DISK BLOCKS AND THE STANDARD KERNEL ROUTINES ARE USED FOR OUTPUTTING THE
  1656. DATA.  (╔ AM AN OPERATING SYSTEMS SPECIALIST, SO ╔ CALL IT A KERN┼L!)  ╘HUS,
  1657. THE ═╙-─╧╙ FILES MUST BE READ FROM A 1571 OR 1581 DISK DRIVE, BUT THE OUTPUT
  1658. DEVICE MAY BE ANY DISK DRIVE TYPE, THE SCREEN OR A PRINTER, OR A VIRTUAL DRIVE
  1659. TYPE SUCH AS ╥┴═╠INK, ╥┴═─RIVE, OR ╥┴═─╧╙ (FOR THE ╥┼╒).  ╔T IS INTERESTING TO
  1660. NOTE THAT THE DATA CAN BE READ IN FROM AN ═╙-─╧╙ DISK FASTER THAN IT CAN BE
  1661. WRITTEN OUT TO A 1571, 1581, OR EVEN A ╥┴═─╧╙ FILE.  ┴ ╥┴═╠INK CAN SWALLOW THE
  1662. DATA ONLY SLIGHTLY FASTER THAN IT CAN BE READ.
  1663.  
  1664. ╠ITTLE ╥ED ╥EADER (╠╥╥) SUPPORTS DOUBLE DENSITY 3.5" DISKS FORMATTED WITH 80
  1665. TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1581 AND 5.25" DOUBLE DENSITY
  1666. DISKS FORMATTED WITH 40 TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1571.
  1667. ┴ LIMIT OF 128 DIRECTORY ENTRIES AND 3 ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) SECTORS IS
  1668. IMPOSED.  ╘HERE MUST BE 2 COPIES OF THE ╞┴╘ AND THE CLUSTER SIZE MAY BE 1 OR 2
  1669. SECTORS.  ╘HE SECTOR SIZE MUST BE 512 BYTES.
  1670.  
  1671. ╧H, ABOUT THE NAME.  ╔T IS A PLAY ON THE NAME OF ANOTHER ═╙-─╧╙ FILE COPIER
  1672. AVAILABLE FOR THE ├-128.  "╠ITTLE" MEANS THAT IT IS SMALLER IN SCOPE THAN THE
  1673. OTHER PROGRAM, AND "╥ED" IS A DIFFERENT PRIMARY COLOR TO AVOID ANY LEGAL
  1674. COMPLICATIONS.  ╔T IS ALSO THE NON-WHITE COLOR OF THE FLAG OF THE COUNTRY OF
  1675. ORIGIN OF THIS PROGRAM (NO, ╔ AM NOT ╩APANESE).  ┴LSO, THIS PROGRAM IS ╨UBLIC
  1676. ─OMAIN ╙OFTWARE, AS IS ALL SOFTWARE ╔ DEVELOP FOR 8-BIT ├OMMODORE ├OMPUTERS.
  1677. ╞EEL FREE TO ┼-MAIL ME IF YOU HAVE QUESTIONS OR COMMENTS ABOUT THIS ARTICLE.
  1678.  
  1679. 2. ╒╙┼╥ ╟╒╔─┼
  1680.  
  1681. ╠╧┴─ AND ╥╒╬ THE "LRR.128" ┬┴╙╔├ PROGRAM FILE.  ╫HEN THE PROGRAM IS FIRST RUN,
  1682. IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
  1683. LANGUAGE PACKAGE FROM THE "CURRENT" ├OMMODORE ─╧╙ DRIVE (THE CURRENT DRIVE IS
  1684. OBTAINED FROM ╨┼┼╦(186) - THE LAST DEVICE ACCESSED).  ╘HE BINARY PACKAGE IS
  1685. LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
  1686. PACKAGE ╔─ FIELD IS IN PLACE.
  1687.  
  1688. 2.1. ═┴╔╬ ╙├╥┼┼╬
  1689.  
  1690. ╘HE MAIN SCREEN OF THE PROGRAM IS THEN DISPLAYED.  ╘HE MAIN SCREEN OF THE
  1691. PROGRAM WILL LOOK SOMETHING LIKE THIS:
  1692.  
  1693.    ═╙-─┼╓=9    ═╙-╘┘╨┼=1581    ├┬═-─┼╓=8
  1694.  
  1695.    ╬╒═  ╙  ╘╥╬  ╘┘╨  ╞╔╠┼╬┴═┼  ┼╪╘  ╠┼╬╟╘╚
  1696.    ---  -  ---  ---  --------  ---  ------
  1697.      1  *  ┴╙├  ╙┼╤  ╚┴├╦4     ╘╪╘  120732
  1698.      2     ┬╔╬  ╨╥╟  ╥┴═─╧╙    ╙╞╪   34923
  1699.  
  1700.    ─=─╔╥┼├╘╧╥┘  ═=═╙-─┼╓  ╞=├┬═-─┼╓ ╤=╤╒╔╘
  1701.    ╘=╘╧╟╟╠┼-├╧╠╒═╬, ├=├╧╨┘-╞╔╠┼╙, +/- ╨┴╟┼
  1702.  
  1703. EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<NO FILES>" WILL BE DISPLAYED
  1704. RATHER THAN FILENAMES.  ╘HE "═╙-─┼╓" AND "═╙-╘┘╨┼" FIELDS GIVE THE DEVICE
  1705. NUMBER AND TYPE OF THE DRIVE CONTAINING THE ═╙-─╧╙ DISK TO COPY FROM, AND THE
  1706. "├┬═-─┼╓" GIVES THE DEVICE NUMBER OF THE DRIVE/VIRTUAL DRIVE/CHARACTER DEVICE
  1707. TO COPY FILE DATA TO.
  1708.  
  1709. ╔NFORMATION ABOUT ALL ═╙-─╧╙ FILES IN THE ROOT DIRECTORY OF THE ═╙-─╧╙ DISK IS
  1710. DISPLAYED IN COLUMNS BELOW THE DRIVE INFORMATION.  "╬╒═" GIVES THE NUMBER OF
  1711. THE ═╙-─╧╙ FILE IN THE DIRECTORY LISTING, AND "╙" INDICATES WHETHER THE FILE
  1712. IS "SELECTED" OR NOT.  ╔F THE FILE IS SELECTED, AN ASTERISK (*) IS DISPLAYED;
  1713. OTHERWISE, A BLANK IS DISPLAYED.  ╫HEN YOU LATER ENTER ├OPY ═ODE, ONLY THE
  1714. FILES THAT HAVE BEEN "SELECTED" ARE COPIED.
  1715.  
  1716. ╘HE "╘╥╬" FIELD INDICATES THE CHARACTER TRANSLATION SCHEME TO BE USED WHEN THE
  1717. FILE IS COPIED.  ┴ VALUE OF "┬╔╬" (BINARY) MEANS NO TRANSLATION AND A VALUE OF
  1718. "┴╙├" (ASCII) MEANS THE FILE CHARACTERS ARE TO BE TRANSLATED FROM ═╙-─╧╙ ┴╙├╔╔
  1719. (OR "┴╙├╔╔-├R╠F") TO ╨┼╘╙├╔╔.  ╘HE "╘┘╨" FIELD INDICATES THE TYPE OF
  1720. ├OMMODORE-─╧╙ FILE TO CREATE FOR WRITING THE ═╙-─╧╙ FILE CONTENTS INTO.  ╘HE
  1721. POSSIBLE VALUES ARE "╙┼╤" (SEQUENTIAL) AND "╨╥╟" (PROGRAM).  ╘HE VALUES OF THE
  1722. ╘╥╬ AND ╘┘╨ FILEDS ARE SET INDEPENDENTLY, SO YOU CAN COPY BINARY DATA TO ╙┼╤
  1723. FILES AND ASCII DATA TO ╨╥╟ FILES IF YOU WISH.
  1724.  
  1725. ╘HE "╞╔╠┼╬┴═┼" AND "┼╪╘" FIELDS GIVE THE FILENAME AND EXTENSION TYPE OF THE
  1726. ═╙-─╧╙ FILES AND "╠┼╬╟╘╚" GIVES THE EXACT LENGTH OF THE FILES IN BYTES.  ╬OTE
  1727. THAT IF YOU PERFORM "┴╙├" TRANSLATION ON A FILE, ITS ╨┼╘╙├╔╔ VERSION WILL HAVE
  1728. A SHORTER LENGTH.
  1729.  
  1730. 2.2. ╒╙┼╥ ├╧══┴╬─╙
  1731.  
  1732. ╘HE BOTTOM OF THE SCREEN GIVES THE COMMAND SUMMARY.  ┴FTER STARTING THE
  1733. PROGRAM, YOU WILL WANT TO SETUP THE ═╙-─╧╙ AND ├┬═-─╧╙ DRIVES WITH THE "═" AND
  1734. "╞" COMMANDS.  ╙IMPLY PRESS THE (LETTER) KEY CORRESPONDING TO THE COMMAND
  1735. NAME TO ACTIVATE THE COMMAND.  ╨RESSING ═ WILL PROMPT YOU FOR THE ═╙-─╧╙ ─RIVE
  1736. ╬UMBER AND THE ═╙-─╧╙ ─RIVE ╘YPE.  ╔N BOTH CASES, TYPE THE NUMBER AND PRESS
  1737. ╥┼╘╒╥╬.  (╙ORRY FOR INSULTING ALL NON-NOVICES OUT THERE, BUT ╔ WANT TO BE
  1738. COMPLETE).  ╘HE ═╙-─╧╙ DRIVE NUMBER CANNOT BE THE SAME AS THE ├┬═-─╧╙ DRIVE
  1739. NUMBER (SINCE THE PROGRAM COPIES FROM DRIVE-TO-DRIVE WITHOUT INTERNAL
  1740. BUFFERING).  ╞OR THE DRIVE TYPE, ENTER AN "8", "81", OR "1581" FOR A 1581
  1741. DRIVE OR ANYTHING ELSE FOR A 1571 DRIVE.
  1742.  
  1743. ╨RESSING ╞ WILL PROMPT YOU FOR THE ├┬═-─╧╙ DEVICE NUMBER.  ┘OU MAY ENTER A
  1744. NUMBER FROM 0 TO 30, EXCEPT THAT IT MUST NOT BE THE ═╙-─╧╙ DRIVE NUMBER.
  1745. ┼NTER A "1" FOR ├ASSETTE ─RIVE (╟OD FORBID!), A "3" FOR THE SCREEN, A "4" FOR
  1746. THE PRINTER (WITH AN AUTOMATIC SECONDARY ADDRESS OF 7 (LOWERCASE)), ANY NUMBER
  1747. ABOVE 7 FOR A ├OMMODORE DISK DRIVE OR SPECIAL VIRTUAL DRIVE, OR A VALUE OF "0"
  1748. FOR THE SPECIAL "NULL" DRIVE.  ┴ ├┬═-─┼╓ VALUE OF 0 WILL CASE THE PROGRAM TO
  1749. READ ═╙-─╧╙ FILES AND DO NOTHING WITH THE OUTPUT.  ┘OU CAN USE THIS FEATURE TO
  1750. CHECK OUT THE RAW READING SPEED OF THE PROGRAM.
  1751.  
  1752. ┴FTER SETTING UP THE DRIVES, PRESS ─ TO READ IN THE ROOT DIRECTORY OFF THE
  1753. ═╙-─╧╙ DISK.  ╘HE DATA WILL COME BLAZING IN FROM THE DISK BUT ┬┴╙╔├ WILL TAKE
  1754. ITS GOOD OLE TIME SIFTING THROUGH IT.  ╞ILENAMES ARE DISPLAYED ON THE SCREEN
  1755. AS THEY ARE SCANNED IN.  ╘HE PROGRAM WILL (EVENTUALLY) RETURN TO THE MAIN
  1756. SCREEN AND DISPLAY THE FORMATTED FILE INFORMATION.  ╧NE NOTE: THE PROCESS OF
  1757. LOGGING IN A 1581 ═╙-─╧╙ DISK TAKES ABOUT 12 SECONDS (ON MY 1581, ANYWAY), SO
  1758. BE PATIENT.  ┴N ═╙-─╧╙ DISK WILL HAVE TO BE "LOGGED IN" EVERY TIME YOU CHANGE
  1759. ═╙-─╧╙ DISKS.  (─ISKS ARE LOGGED IN AUTOMATICALLY).
  1760.  
  1761. ┴ COUPLE OF NOTES ABOUT ACCESSING ═╙-─╧╙ DISKS: DON'T TRY TO ACCESS A DEVICE
  1762. THAT IS NOT PRESENT BECAUSE THE MACHINE LANGUAGE ROUTINES CANNOT HANDLE THIS
  1763. ERROR FOR SOME REASON AND WILL LOCK UP, REQUIRING A ╙╘╧╨+╥┼╙╘╧╥┼.  ┴LSO, MAKE
  1764. SURE THAT AN ACTUAL ═╙-─╧╙ DISK IS LOADED INTO THE DRIVE.  ╔F YOU ACCIDENTALLY
  1765. PLACE ├OMMODORE-─╧╙ DISK INTO THE ═╙-─╧╙ DRIVE, THE 1581 WILL REPORT AN
  1766. INVALID BOOT PARAMETERS ERROR (#60), BUT A 1571 WILL LOCK UP (SINCE ╔ DON'T
  1767. CHECK THE SECTOR SIZE AND MY BURST ROUTINES ARE EXPECTING 512 BYTES TO COME
  1768. OUT OF A SECTOR WHEREAS ├OMMODORE DISKS HAVE ONLY 256 BYTES PER SECTOR).
  1769.  
  1770. ╬OW YOU ARE READY TO PICK WHAT FILES YOU WANT COPIED AND HOW YOU WANT THEM
  1771. COPIED.  ┘OU WILL NOTICE THAT A "CURSOR" APPEARS IN THE "╙" COLUMN OF THE
  1772. FIRST FILE.  ┘OU MAY MOVE THE CURSOR AROUND WITH THE CURSOR KEYS: ╒╨, ─╧╫╬,
  1773. ╠┼╞╘, ╥╔╟╚╘, ╚╧═┼, AND ├╠╥.  ├╠╥ (╙╚╔╞╘-╚╧═┼) WILL MOVE THE CURSOR BACK TO THE
  1774. FIRST FILE ON THE FIRST SCREEN.  ┘OU CAN MOVE THE CURSOR AMONG THE SELECT,
  1775. TRANSLATION, AND FILE-TYPE COLUMNS OF ALL THE FILES.  ╨RESSING A ╙╨┴├┼ OR A
  1776. ╥┼╘╒╥╬ WILL TOGGLE THE VALUE OF THE FIELD THAT THE CURSOR IS ON.  ╘O TOGGLE
  1777. ALL OF THE VALUES OF THE "CURSOR" COLUMN (INCLUDING FILES ON ALL OTHER
  1778. SCREENS), PRESS ╘.  ┘OU WILL NOTICE THAT MOVING THE CURSOR AROUND AND TOGGLING
  1779. FIELDS IS A BIT SLUGGISH, ESPECIALLY IF YOU ARE IN ╙LOW MODE ON THE 40-COLUMN
  1780. SCREEN.  ─ID ╔ MENTION THAT THIS PROGRAM WILL RUN ON EITHER THE 40 OR
  1781. 80-COLUMN SCREEN?  ╘OGGLING AN ENTIRE COLUMN CAN TAKE A COUPLE OF SECONDS.
  1782.  
  1783. ╔F THERE ARE MORE THAN 18 ═╙-─╧╙ FILES, YOU CAN PRESS THE "+" AND "-" KEYS TO
  1784. MOVE AMONG ALL OF THE SCREENS OF FILES.  ╘HE CURSOR MOVEMENT KEYS WILL WRAP
  1785. AROUND ON THE CURRENT SCREEN.  "+" IS PAGE FORWARD, AND "-" IS PAGE BACKWARD.
  1786. ╘HE SCREENS WRAP AROUND TOO.
  1787.  
  1788. ┴FTER YOU HAVE SELECTED ALL OF THE FILES YOU WANT TO COPY AND THEIR TRANSLATION
  1789. AND FILE-TYPE FIELDS HAVE BEEN SET, PRESS THE ├ KEY TO GO INTO ├OPY ═ODE (NEXT
  1790. SECTION).  ┴FTER COPYING, YOU ARE RETURNED TO THE MAIN SCREEN WITH ALL OF THE
  1791. FIELD SETTINGS STILL INTACT.  ╘O EXIT FROM THE PROGRAM, PRESS ╤.
  1792.  
  1793. 2.3. ├╧╨┘ ═╧─┼
  1794.  
  1795. ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
  1796. FILE IS DISPLAYED AS IT IS BEING COPIED.  ╔F AN ERROR IS ENCOUNTERED ON EITHER
  1797. THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
  1798. AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS).
  1799.  
  1800. ╘O GENERATE A ├┬═-─╧╙ FILENAME FROM AN ═╙-─╧╙ FILENAME, THE EIGHT FILENAME
  1801. CHARACTERS ARE TAKEN (INCLUDING SPACES) AND A DOT (.) AND THE THREE CHARACTERS
  1802. OF THE EXTENSION ARE APPENDED.  ╘HEN, ALL SPACES ARE REMOVED, AND IF THE NAME
  1803. ENDS WITH A DOT (.) CHARACTER, THEN THAT DOT CHARACTER IS REMOVED AS WELL.  ╔
  1804. THINK THIS IS FAIRLY REASONABLE.
  1805.  
  1806. ╔F THERE ALREADY IS A FILE WITH THE SAME FILENAME ON THE ├┬═-─╧╙ DISK, THEN
  1807. YOU WILL BE PROMPTED IF YOU WANT TO OVERWRITE THE FILE OR NOT.  ┼NTERING AN
  1808. "N" WILL ABORT THE COPYING OF THAT FILE AND GO ON TO THE NEXT FILE, AND
  1809. ENTERING A "Y" (OR ANYTHING ELSE) WILL CAUSE THE ├┬═-─╧╙ FILE TO BE
  1810. "SCRATCHED" AND THEN RE-WRITTEN.
  1811.  
  1812. ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
  1813. NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
  1814. THINGS BY LOOKING AT DAS BLINKIN LICHTES AND LISTENING FOR CLICKS AND GRINDS.
  1815. ┘OU WILL PROBABLY BE SURPRISED BY THE ═╙-─╧╙ FILE READING SPEED (╔ MEAN IN A
  1816. GOOD WAY).  ╘HE DISK DATA IS READ IN WHOLE TRACKS AND CACHED IN MEMORY AND THE
  1817. DIRECTORY INFORMATION AND THE ╞┴╘ ARE RETAINED IN MEMORY AS WELL.  ╘HE RESULT
  1818. IS THAT MINIMAL TIME IS SPENT READING DISK DATA, AND NO COSTLY SEEKS ARE
  1819. REQUIRED FOR OPENING A NEW ═╙-─╧╙ FILE.  ┴ RESULT IS THAT SMALL FILES ARE
  1820. COPIED ONE AFTER ANOTHER VERY QUICKLY.  ┘OU WILL HAVE TO WAIT, HOWEVER, ON THE
  1821. RELATIVELY SLOW STANDARD KERNEL/├OMMODORE-─╧╙ FILE WRITING.
  1822.  
  1823. ┴ FEW CHANGES HAD TO BE MADE TO THE PROGRAM TO ACCOMODATE THE ╥┴═─╧╙ PROGRAM.
  1824. ╥┴═─╧╙ USES MEMORY FROM $2300 TO $3╞╞╞ OF ╥┴═0, WHICH IS NOT REALLY A GOOD
  1825. PLACE FOR A DEVICE DRIVER, AND IT USES SOME OF THE ZERO-PAGE LOCATIONS THAT ╔
  1826. WANTED TO USE.  ┬UT, DIFFICULTIES WERE OVERCOME.  ╘HE IMPORTANCE OF ╥┴═─╧╙
  1827. COMPATIBILITY IS THAT IF YOU ONLY HAVE ONE DISK DRIVE BUT YOU HAVE AN ╥┼╒, YOU
  1828. CAN USE ╥┴═─╧╙ TO STORE THE ═╙-─╧╙ FILES TEMPORARILY.  ╔F YOU ONLY HAVE ONE
  1829. DISK DRIVE AND NO ╥┼╒, YOU ARE ╙╧╠ (╧UT OF ╠UCK) UNLESS YOU CAN GET A
  1830. ╥AM─ISK-TYPE PROGRAM FOR AN UNEXPANDED 128.  ╘HE ╥┴═─╧╙ PROGRAM IS AVAILABLE
  1831. FROM ╞╘╨ SITE "CCOSUN.CALTECH.EDU" IN FILE "/PUB/RKNOP/UTIL128/RAMDOSII.SFX".
  1832. ╧NE NOTE ╔ FOUND OUT ABOUT ╥┴═─╧╙: YOU CANNOT USE A
  1833.  
  1834. ─╧╨┼╬#1,(├╞$),╒(├─),╫
  1835.  
  1836. WITH IT LIKE YOU ARE SUPPOSED TO BE ABLE TO; YOU HAVE TO USE A
  1837.  
  1838. ─╧╨┼╬#1,(├╞$+",╫"),╒(├─)
  1839.  
  1840. ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING FROM 1571S AND 1581S WITH ┴╙├
  1841. AND ┬╔╬ TRANSLATION MODES.  ┴LL FIGURES ARE IN BYTES/SECOND.  ╘HESE RESULTS
  1842. WERE OBTAINED FROM COPYING A 127,280 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING
  1843. ╔SSUE #3).
  1844.  
  1845.    ╞╥╧═  \ ╘╧: "NULL"     ╥┴═╠INK     ╥┴═─╧╙     ╩─1581     ╩─1571
  1846.    -------+    ------     -------     ------     ------     ------
  1847.    81-BIN ▄      5772        3441       2146        N/A        644
  1848.    81-ASC ▄      5772        3434       2164        N/A        661
  1849.    71-BIN ▄      4323        2991       1949       1821        N/A
  1850.    71-ASC ▄      4323        2982       1962       1847        N/A
  1851.  
  1852. ╘HE "NULL" DEVICE IS THAT "0" ├┬═-─╧╙ DEVICE NUMBER, AND A COUPLE OF ENTRIES
  1853. ARE "N/A" SINCE ╔ ONLY HAVE ONE 1571 AND ONE 1581.  ╬OTE THAT MY 71 AND 81 ARE
  1854. ╩IFFY─╧╙-IFIED, SO THE PERFORMANCE OF A STOCK 71/81 WILL BE POORER.  ╩IFFY─╧╙
  1855. GIVES ABOUT A 2X PERFORMANCE IMPROVEMENT FOR THE STANDARD FILE ACCESSING CALLS
  1856. (OPEN, CLOSE, CHRIN, CHROUT).  ╥┴═─╧╙ DOESN'T SEEM TO BE AS SNAPPY AS YOU
  1857. MIGHT THINK.
  1858.  
  1859. ╘HE "NULL" FIGURES ARE QUITE IMPRESSIVE, BUT THE RAW SECTOR READING SPEED
  1860. WITHOUT THE OVERHEAD OF MUCKING AROUND WITH FILE ORGANIZATION IS 6700
  1861. BYTES/SEC FOR A 1581 AND 4600 ┬/S FOR A 71.  ╘HE REASON THAT THE 1571 OPERATES
  1862. SO QUICKLY IS THAT ╔ USE A SECTOR INTERLEAVE OF 4 (WHICH IS OPTIMAL) FOR
  1863. READING THE TRACKS.  ╔ THINK THAT OTHER ═╙-─╧╙ FILE COPIER PROGRAM USES AN
  1864. INTERLEAVE OF 1 (WHICH IS NOT OPTIMAL).  ╔ LOSE SOME OF THE RAW PERFORMANCE
  1865. BECAUSE ╔ COPY THE FILE DATA INTERNALLY ONCE BEFORE OUTPUTTING IT (TO SIMPLIFY
  1866. SOME OF THE CODE).
  1867.  
  1868. ╔N A COUPLE OF PLACES YOU WILL NOTICE THAT ┴╙├ TRANSLATION GIVES SLIGHTLY
  1869. BETTER OR SLIGHTLY WORSE PERFORMANCE THAN ┬╔╬.  ╘HIS IS BECAUSE ALTHOUGH
  1870. SLIGHTLY MORE WORK IS REQUIRED TO TRANSLATE THE CHARACTERS, SLIGHTLY FEWER
  1871. CHARACTERS WILL HAVE TO BE WRITTEN TO THE ├┬═-─╧╙ FILE, SINCE ╨┼╘╙├╔╔ USES
  1872. ONLY ├╥ WHERE ═╙-─╧╙ ┴╙├╔╔ USES ├╥ AND ╠╞ TO REPRESENT END-OF-LINE.
  1873. ╘RANSLATION IS DONE BY USING A TABLE (THAT YOU CAN CHANGE IF YOU WISH).  ═ANY
  1874. ENTRIES IN THIS TABLE CONTAIN A VALUE OF ZERO, WHICH MEANS THAT NO CHARACTER
  1875. WILL BE OUTPUT ON TRANSLATION.  ═OST OF THE CONTROL CHARACTERS AND ALL OF THE
  1876. CHARACTERS OF VALUE 128 (0X80) OR GREATER ARE THROWN AWAY ON BEING
  1877. TRANSLATED.  ╘HE TABLE IS SET UP SO THAT ├╥ CHARACTERS ARE THROWN AWAY AND THE
  1878. ╠╞ CHARACTER IS TRANSLATED TO A ├┬═-─╧╙ ├╥ CHARACTER.  ╘HUS, BOTH ═╙-─╧╙ ┴╙├╔╔
  1879. FILES AND ╒╬╔╪ ┴╙├╔╔ FILES CAN BE TRANSLATED CORRECTLY.
  1880.  
  1881. 2. ┬╒╥╙╘ ├╧══┴╬─╙
  1882.  
  1883. ╘HREE BURST COMMANDS FROM THE 1571/81 DISK DRIVE ┬URST ├OMMAND ╔NSTRUCTION ╙ET
  1884. ARE REQUIRED TO ALLOW THIS PROGRAM TO READ THE ═╙-─╧╙ DISKS: ╤UERY ─ISK
  1885. ╞ORMAT, ╙ECTOR ╔NTERLEAVE, AND ╥EAD.  ╘HE GRUNGY DETAILS ABOUT ISSUING BURST
  1886. COMMANDS AND BURST MODE HANDSHAKING ARE COVERED IN ├= ╚ACKING ╔SSUE #3.  ╘HE
  1887. ╤UERY ─ISK ╞ORMAT COMMAND IS USED TO "LOG IN" THE ═╙-─╧╙ DISK.  ╘HE ╔NQUIRE
  1888. ─ISK BURST COMMAND CANNOT BE USED WITH AN ═╙-─╧╙ DISK ON THE 1581 FOR SOME
  1889. UNKNOWN REASON.  ╔ FOUND THIS OUT THE HARD WAY.  ╘HE ╤UERY ─ISK ╞ORMAT COMMAND
  1890. HAS THE FOLLOWING FORMAT:
  1891.  
  1892.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  1893.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  1894.      0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  1895.      1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  1896.      2    ▄     ╞  ▄  ╪  ▄  ╪  ▄  ╙  ▄  1  ▄  0  ▄  1  ▄  ╬  ▄  10
  1897.    -------+--------------------------------------------------+-------
  1898.  
  1899. WHERE THE ╞, ╙, AND ╬ BITS HAVE A VALUE OF 0 FOR OUR PURPOSES.  ┴ RESPONSE OF
  1900. A BURST STATUS BYTE AND SIX OTHER THROW-AWAY BYTES IS GIVEN FROM THE DRIVE.
  1901. ╘HIS COMMAND TAKES QUITE A LONG TIME TO EXECUTE ON MY 1581 BUT WORKS QUITE
  1902. QUICKLY ON MY 1571.  ┘OU ONLY HAVE TO LOG IN A DISK WHENEVER YOU CHANGE
  1903. DISKS.
  1904.  
  1905. ╘HE ╙ECTOR ╔NTERLEAVE COMMAND IS USED TO SET A SOFT INTERLEAVE FOR THE ╥EAD
  1906. COMMAND.  ╔ USE AN INTERLEAVE OF 1 FOR THE 1581 AND AN INTERLEAVE OF 4 FOR THE
  1907. 1571.  ╘HIS MEANS THAT THE ═╙-─╧╙ SECTORS WILL COME FROM 1571 TO THE COMPUTER
  1908. IN THE FOLLOWING ORDER: 1, 5, 9, 4, 8, 3, 7, 2, 6 (THERE ARE 9 SECTORS PER
  1909. TRACK ON AN ═╙-─╧╙ DISK (BOTH 3.5" AND 5.25"), NUMBERED FROM 1 TO 9).  ╠╥╥
  1910. HANDLES THE DATA COMING IN IN THIS ORDER, AND IN STRAIGHT ORDER FROM THE
  1911. 1581.  ╘HE ╙ECTOR ╔NTERLEAVE COMMAND HAS THE FOLLOWING FORMAT, WHERE THE ╫ AND
  1912. ╬ BITS ARE 0 FOR US:
  1913.  
  1914.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  1915.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  1916.      0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  1917.      1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  1918.      2    ▄     ╫  ▄  ╪  ▄  ╪  ▄  0  ▄  1  ▄  0  ▄  0  ▄  ╬  ▄   8
  1919.      3    ▄                   <INTERLEAVE>                   ▄ 1 OR 4
  1920.    -------+--------------------------------------------------+-------
  1921.  
  1922. ╘HE ╥EAD COMMAND IS USED TO TRANSFER THE NINE SECTORS OF A TRACK TO THE
  1923. COMPUTER IN THE ORDER SPECIFIED BY THE INTERLEAVE.  ╘HE FORMAT IS:
  1924.  
  1925.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  1926.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  1927.      0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  1928.      1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  1929.      2    ▄    ╘/╠ ▄  ┼  ▄ ┬/╪ ▄  ╙  ▄  0  ▄  0  ▄  0  ▄  ╬  ▄ 0 OR 16
  1930.      3    ▄                      <TRACK>                     ▄  ???
  1931.      4    ▄                      <SECTOR>                    ▄   1
  1932.      5    ▄                <NUMBER OF SECTORS>               ▄   9
  1933.    -------+--------------------------------------------------+-------
  1934.  
  1935. ╘HERE ARE A COUPLE OF DIFFERENCES BETWEEN THE 1571 AND 1581 VERSIONS OF THIS
  1936. COMMAND.  ═OST IMPORTANT, THE ╙ BIT (╙IDE OF DISK TO USE) HAS THE OPPOSITE
  1937. MEANING ON THE TWO DRIVES.  ╘HERE'S NO GOOD REASON THAT ╔ KNOW OF FOR THIS
  1938. INCONSISTENCY.  ╘HIS IS THE REASON THAT ╠╥╥ NEEDS TO KNOW WHAT TYPE OF ═╙-─╧╙
  1939. DRIVE IT IS DEALING WITH (PLUS INTERLEAVING).
  1940.  
  1941. ╘HE READ COMMAND RETURNS THE FOLLOWING DATA USING BURST MODE HANDSHAKING:
  1942.  
  1943.        +-------------------+
  1944.      0 ▄ ┬URST ╙TATUS ┬YTE ▄
  1945.        +-------------------+
  1946.      1 ▄                   ▄
  1947.    ... +  512 ─ATA ┬YTES   ▄
  1948.    512 ▄                   ▄
  1949.        +-------------------+
  1950.  
  1951. FOR EACH SECTOR TRANSFERRED.  ╔F THE ┬URST ╙TATUS ┬YTE INDICATES AN ERROR,
  1952. THEN THE DATA IS NOT TRANSFERRED AND NONE OF THE FOLLOWING SECTORS ARE
  1953. EITHER.  ╔F THE STATUS BYTE GIVES A "─ISK ├HANGED" ERROR, THEN YOU HAVE TO LOG
  1954. IN THE DISK WITH THE ╤UERY ─ISK ╞ORMAT COMMAND BEFORE READ WILL WORK
  1955. PROPERLY.  ╘HIS IS ACTUALLY A GOOD FEATURE SINCE IT LETS YOU KNOW ABOUT A DISK
  1956. CHANGE SO YOU CAN UPDATE ANY DATA STRUCTURES YOU MAY HAVE.  ╠╥╥ SIMPLY RE-LOGS
  1957. IN THE DISK WITHOUT UPDATING ANY DATA STRUCTURES AND RE-TRIES THE FAILED READ
  1958. OPERATION.
  1959.  
  1960. 3. ═╙-─╧╙ ─╔╙╦ ╞╧╥═┴╘
  1961.  
  1962. ┴N ═╙-─╧╙ DISK IS SEPARATED INTO 4 DIFFERENT PARTS: THE ┬OOT ╙ECTOR, THE
  1963. ╞┴╘(S), THE ╥OOT ─IRECTORY, AND THE ╞ILE ─ATA ╙ECTORS.  ╘HE LOGICAL SECTORS
  1964. (BLOCKS) OF A DISK ARE NUMBERED FROM 0 TO SOME MAXIMUM NUMBER (1439 FOR A
  1965. 3.5", 719 FOR A 5.25" ── DISK).  ╘HE PHYSICAL LAYOUT AND THE LOGICAL SECTOR
  1966. NUMBERS TYPICALLY USED BY A 3.5" DISK ARE SHOWN HERE:
  1967.  
  1968.          +-------------------+
  1969.        0 ▄    ┬OOT ╙ECTOR    ▄
  1970.          +-------------------+
  1971.     1..3 ▄    ╞┴╘ COPY #1    ▄
  1972.          +-------------------+
  1973.     4..6 ▄    ╞┴╘ COPY #2    ▄
  1974.          +-------------------+
  1975.    7..14 ▄  ╥OOT ─IRECTORY   ▄
  1976.          +-------------------+
  1977.       15 ▄                   ▄
  1978.      ... ▄ ╞ILE ─ATA ╙ECTORS ▄
  1979.     1439 ▄                   ▄
  1980.          +-------------------+
  1981.  
  1982. 3.1. ╘╚┼ ┬╧╧╘ ╙┼├╘╧╥
  1983.  
  1984. ╘HE ┬OOT ╙ECTOR IS ALWAYS AT LOGICAL SECTOR NUMBER 0.  ╔T CONTAINS SOME
  1985. IMPORTANT INFORMATION ABOUT THE FORMAT OF THE DISK AND IT ALSO CONTAINS CODE
  1986. TO BOOT AN ═╙-─╧╙ MACHINE FROM.  ╫E AREN'T CONCERNED WITH THE BOOTSTRAPPING
  1987. CODE, BUT THE IMPORTANT VALUES WE NEED TO OBTAIN FROM THE BOOT SECTOR ARE:
  1988.  
  1989.    ┴┬┬╥     ╧╞╞╙┼╘     1571     1581     ─┼╙├╥╔╨╘╔╧╬
  1990.    ----     ------     ----     ----     -----------
  1991.     ├╙        13          2        2     ├LUSTER SIZE IN SECTORS
  1992.     ╬┬        14          1        1     ╬UMBER OF BOOT SECTORS
  1993.     ╬╞        16          2        2     ╬UMBER OF ╞┴╘S
  1994.     ╞╠        23          2        3     ╞┴╘ SIZE IN SECTORS
  1995.     ─┼        17        112      112     ╬UMBER OF ROOT DIRECTORY ENTRIES
  1996.     ╘╙       19,20      720     1440     ╘OTAL ╬UMBER OF SECTORS
  1997.     ╬╙        24          9        9     ╬UMBER OF SECTORS PER TRACK
  1998.     ╬╚        26          2        2     ╬UMBER OF SIDES
  1999.  
  2000. ╘HE 1571 AND 1581 COLUMNS GIVE THE TYPICAL VALUES OF THESE PARAMETERS FOR
  2001. 5.25" AND 3.5" DISKS.  ╘HE ╧╞╞╙┼╘ IS THE ADDRESS OF THE PARAMETER WITHIN THE
  2002. BOOT SECTOR.  ╘HE TOTAL NUMBER OF SECTORS IS GIVEN IN LOW-BYTE, HIGH-BYTE
  2003. ORDER (SINCE THE 80X86 FAMILY IS LITTLE-ENDIAN LIKE THE 6502 FAMILY).  ╞ROM
  2004. THE ABOVE PARAMETERS, WE CAN DERIVE THE FOLLOWING IMPORTANT PARAMETERS:
  2005.  
  2006.    ┴┬┬╥     ╞╧╥═╒╠┴       1571     1581     ─┼╙├╥╔╨╘╔╧╬
  2007.    ----      -------      ----     ----     -----------
  2008.     ╞1      ╬┬+╬╞*╞╠         5        7     ╞IRST ROOT DIRECTORY SECTOR
  2009.     ╞╙     ╬┬+╬╞*╞╠+─┼      12       14     ╞IRST FILE DATA SECTOR NUMBER
  2010.     ╬├     (╘╙-╞╙)/├╙      354      713     ╘OTAL NUMBER OF FILE CLUSTERS
  2011.  
  2012. ╠╥╥ IMPOSES A NUMBER OF LIMITS ON THESE PARAMETERS AND WILL ERROR-OUT IF YOU
  2013. TRY TO USE A DISK THAT IS OUTSIDE OF ╠╥╥'S LIMITS.
  2014.  
  2015. 3.2. ├╚┼╫╔╬╟ ╘╚┼ ╞┴╘
  2016.  
  2017. ═╙-─╧╙ DISKS USE A DATA STRUCTURE CALLED A ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) TO
  2018. RECORD WHICH CLUSTERS BELONG TO WHICH FILE IN WHAT ORDER AND WHICH BLOCKS ARE
  2019. FREE.  ┴ CLUSTER IS A SET OF CONTIGUOUS SECTORS WHICH ARE ALLOCATED TO FILES
  2020. AS A GROUP.  ╠╥╥ HANDLES CLUSTER SIZES OF 1 AND 2 SECTORS, GIVING A LOGICAL
  2021. FILE BLOCK SIZE OF 512 OR 1024 BYTES.  ╘YPICALLY, A CLUSTER SIZE OF 2 SECTORS
  2022. IS USED.
  2023.  
  2024. ╘HE ╞┴╘ IS AN ARRAY OF 12-BIT NUMBERS, WITH AN ENTRY CORRESPONDING TO EACH
  2025. CLUSTER THAT CAN BE ALLOCATED TO FILES.  ╞┴╘ ENTRIES 0 AND 1 ARE RESERVED.  ╔F
  2026. A ╞┴╘ ENTRY CONTAINS A VALUE OF $000, THEN THE CORRESPONDING CLUSTER IS FREE
  2027. AND CAN BE ALLOCATED TO A FILE; OTHERWISE, THE CLUSTER IS ALLOCATED AND THE
  2028. ╞┴╘ ENTRY CONTAINS THE NUMBER OF THE ╬┼╪╘ ╞┴╘ ENTRY THAT BELONGS TO THE FILE.
  2029. ╘HUS, ═╙-─╧╙ FILES ARE STORED IN A SINGLY-LINKED LIST OF CLUSTERS LIKE
  2030. ├OMMODORE-─╧╙ FILES ARE, EXCEPT THAT THE LINKS ARE NOT IN THE DATA SECTORS BUT
  2031. RATHER ARE IN THE ╞┴╘.  ╘HE POINTER TO THE FIRST ╞┴╘ ENTRY FOR A FILE IS GIVEN
  2032. IN THE FILE'S DIRECTORY ENTRY.
  2033.  
  2034. ┴ SPECIAL ╬╒╠╠/╬╔╠ POINTER VALUE OF $╞╞╞ IS USED TO INDICATE THE END OF THE
  2035. CHAIN OF CLUSTERS ALLOCATED TO A FILE.  ╘HIS VALUE IS STORED IN THE ╞┴╘ ENTRY
  2036. OF THE LAST CLUSTER ALLOCATED TO A FILE (OF COURSE).  ├ONSIDER THE FOLLOWING
  2037. EXAMPLE ╞┴╘:
  2038.  
  2039.    ┼╬╘╥┘       ╓┴╠╒┼
  2040.    -----       -----
  2041.     $000        $╞╞╞
  2042.     $001        $╞╞╞
  2043.     $002   ▄----$003 <------─IRECTORY ┼NTRY
  2044.     $003   +--> $005----+
  2045.     $004        $000    ▄
  2046.     $005        $╞╞╞ <--+
  2047.  
  2048. ┼NTRIES 0 AND 1 ARE INSIGNIFICANT SINCE THEY ARE RESERVED.  ╙AY THAT A FILE
  2049. STARTS AT ╞┴╘ ENTRY #2.  ╘HEN, IT CONSISTS OF THE FOLLOWING CHAIN OF CLUSTERS:
  2050. 2, 3, AND 5.  ├LUSTER #4 IS FREE.  ├LUSTERS CAN BE ALLOCATED TO A FILE IN
  2051. RANDOM ORDER, BUT IF THEY ARE ALLOCATED CONTIGUOUSLY IN FORWARD ORDER, THEN
  2052. THE FILE WILL BE ABLE TO BE READ FASTER.  ╘HE ╞┴╘ IS SUCH AN IMPORTANT DATA
  2053. STRUCTURE THAT TYPICALLY TWO COPIES ARE KEPT ON THE DISK INCASE ONE OF THEM
  2054. SHOULD BECOME CORRUPTED.
  2055.  
  2056. ╘HE ═╙-─╧╙ DESIGNERS WERE A LITTLE SNEAKY IN STORING THE 12-BIT ╞┴╘ ENTRIES -
  2057. THEY USED ONLY 12 REAL BITS PER ENTRY.  ╔E., THEY STORE TWO ╞┴╘ ENTRIES IN
  2058. THREE BYTES, WHERE THE TWO ENTRIES SHARE THE TWO NYBBLES OF THE MIDDLE BYTE.
  2059. ╘HE FOLLOWING DIAGRAM SHOWS HOW THE NYBBLES 1 (HIGH), 2 (MID), AND 3 (LOW) ARE
  2060. STORED INTO ╞┴╘ ENTRIES ┴ AND ┬:
  2061.  
  2062.      ┬┘╘┼:       0            1            2
  2063.              +---+---+    +---+---+    +---+---+
  2064.     ┼╬╘╥┘:   ▄ ┴ ▄ ┴ ▄    ▄ ┬ ▄ ┴ ▄    ▄ ┬ ▄ ┬ ▄
  2065.    ╬┘┬┬╠┼:   ▄ 2 ▄ 3 ▄    ▄ 3 ▄ 1 ▄    ▄ 1 ▄ 2 ▄
  2066.              +---+---+    +---+---+    +---+---+
  2067.  
  2068. ┴NYWAY, LET'S JUST SAY IT'S A BIT TRICKY TO EXTRACT THE 12-BIT VALUES FROM
  2069. THIS COMPRESSED DATA STRUCTURE.  ╧N TOP OF THAT, ╔ DON'T THINK THERE IS ANY
  2070. SAVING IN DISK SPACE RESULTING FROM COMPRESSING THIS STRUCTURE; THEY MIGHT AS
  2071. WELL HAVE JUST USED A 16-BIT ╞┴╘ (LIKE THEY DO NOWADAYS ON LARGER DISKS).
  2072.  
  2073. 3.3. ╘╚┼ ╥╧╧╘ ─╔╥┼├╘╧╥┘
  2074.  
  2075. ╘HE ROOT DIRECTORY HAS A FIXED SIZE, ALTHOUGH ╔ DON'T THINK THAT
  2076. SUBDIRECTORIES DO.  ╠╥╥ CANNOT ACCESS SUBDIRECTORIES.  ┼ACH 512-BYTE SECTOR OF
  2077. THE ROOT DIRECTORY CONTAINS SIXTEEN 32-BYTE DIRECTORY ENTRIES.  ╧NE DIRECTORY
  2078. ENTRY IS REQUIRED FOR EACH FILE STORED ON THE DISK.  ┴ DIRECTORY ENTRY HAS THE
  2079. FOLLOWING STRUCTURE:
  2080.  
  2081.    ╧╞╞╙┼╘     ╠┼╬     ─┼╙├╥╔╨╘╔╧╬
  2082.    ------     ---     -----------
  2083.      0..7       8     ╞ILENAME
  2084.     8..10       3     ┼XTENSION
  2085.        11       1     <UNUSED?>
  2086.        12       1     ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
  2087.    13..21       9     <UNUSED>
  2088.    22..25       4     ─ATE
  2089.    26..27       2     ╙TARTING ╞┴╘ ENTRY NUMBER
  2090.    28..31       4     ╞ILE LENGTH IN BYTES
  2091.  
  2092. ╘HE FILENAME AND EXTENSION ARE STORED WITH TRAILING PADDING SPACES.  ╔F A
  2093. DIRECTORY ENTRY IS UNUSED OR DELETED, THEN THE FIRST CHARACTER OF THE FILENAME
  2094. IS EITHER A $00 OR A $┼5 (229).  ╘HIS IS WHY YOU HAVE TO PROVIDE THE FIRST
  2095. CHARACTER OF A FILENAME IF YOU ARE UNDELETING A FILE ON AN ═╙-─╧╙ MACHINE.
  2096. ╬OTE THAT THERE IS ENOUGH UNUSED SPACE THAT ═ICROSOFT OR ╔┬═ COULD HAVE
  2097. DITCHED THE ANNOYING 8+3 CHARACTER FILENAME FORMAT.
  2098.  
  2099. ╘HE ATTRIBUTES BITS TELL WHETHER THE DIRECTORY ENTRY IS FOR A REGULAR FILE, A
  2100. SUBDIRECTORY, A DISK VOLUME NAME (IN WHICH CASE THERE IS NO FILE DATA), AND A
  2101. COUPLE OF OTHER THINGS ╔ CAN'T REMEMBER.  ╔'M NOT SURE ABOUT THE EXACT
  2102. POSITION OR FORMAT OF THE DATE, BUT ╠╥╥ DOESN'T USE IT ANYWAY.  ╘HE STARTING
  2103. ╞┴╘ ENTRY NUMBER AND THE FILE LENGTH ARE STORED IN LOWER-BYTE-FIRST ORDER.
  2104.  
  2105. 3.4. ╘╚┼ ╞╔╠┼ ─┴╘┴ ╙╨┴├┼
  2106.  
  2107. ╘HE RAMAINDER OF THE DISK SPACE IS USED FOR STORING FILE DATA IN CLUSTERS OF 1
  2108. OR 2 SECTORS EACH.  ╟IVEN A CLUSTER NUMBER (WHICH IS ALSO THE ╞┴╘ ENTRY
  2109. NUMBER), THE FOLLOWING FORMULA IS USED TO CALCULATE THE STARTING LOGICAL
  2110. SECTOR NUMBER OF THE CLUSTER:
  2111.  
  2112. (├LUSTER╬UMBER - 2) * ├LUSTER╙IZE╔N┬LOCKS + ╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER
  2113.  
  2114. WHERE "╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER" IS THE "╞╙" PARAMETER DERIVED
  2115. EARLIER.  ╘HE FOLLOWING CONSECUTIVE LOGICAL SECTOR NUMBERS UP TO THE NUMBER OF
  2116. SECTORS PER CLUSTER FORM THE REST OF THE CLUSTER.  ╬OTE THAT A SINGLE CLUSTER
  2117. CAN SPAN SECTORS FROM ONE SIDE OF THE DISK TO ANOTHER OR FROM ONE TRACK TO
  2118. ANOTHER.  ╫E PERFORM THE "(├LUSTER╬UMBER - 2)" PORTION OF THE CALCULATION
  2119. SINCE THE FIRST TWO ╞┴╘ ENTRIES ARE RESERVED.
  2120.  
  2121. ╙INCE THE ╥EAD BURST COMMAND OF THE 1571/81 WANTS THE SIDE, TRACK, AND SECTOR
  2122. NUMBER OF A SECTOR RATHER THAN ITS LOGICAL NUMBER, WE ALSO NEED FORMULAE FOR
  2123. THESE CONVERSIONS:
  2124.  
  2125.    ╘RACK  = ╠OGICAL╙ECTOR╬UMBER / 18
  2126.    ╙ECTOR = ╠OGICAL╙ECTOR╬UMBER % 9 + 1
  2127.    ╙IDE   = (╠OGICAL╙ECTOR╬UMBER / 9) % 2
  2128.  
  2129. ╘HESE FORMULAE ARE MORE PROBLEMATIC THAN THE PREVIOUS ONE SINCE THEY REQUIRE
  2130. DIVISION BY 9 AND 18.  ╠╥╥ USES THE METHOD OF REPEATED SUBTRACTION TO PERFROM
  2131. THE NECESSARY DIVISION (ONLY ONE DIVISION IS NECESSARY).  ╘HE ABOVE FORMULAE
  2132. IMPLY THAT SEQUENTIAL LOGICAL SECTORS ARE STORED ON THE TOP OF THE DISK
  2133. FIRST AND THEN THE BOTTOM OF THE DISK OF THE SAME TRACK, AND THEN ON THE TOP
  2134. OF THE NEXT TRACK, ETC.  ╘HIS IS A GOOD SECTOR NUMBERING SCHEME (UNLIKE THE
  2135. ├┬═-─╧╙ SCHEME FOR 1571 SECTORS) SINCE IT IS FASTER TO SWITCH SIDES OF THE
  2136. DISK THAN IT IS TO SWITCH TRACKS, SO YOU CAN READ THE DISK FASTER.
  2137.  
  2138. ╧H YEAH, THE WAY THAT YOU KNOW HOW MANY FILE DATA BYTES ARE IN THE LAST
  2139. CLUSTER OF A FILE CHAIN (THE CLUSTER WITH THE ╬╒╠╠ ╞┴╘ ENTRY) IS TO TAKE THE
  2140. FILE LENGTH FROM THE DIRECTORY ENTRY AND "MOD" (THE ├ LANGUAGE % OPERATOR) IT
  2141. WITH THE CLUSTER SIZE.  ╧NE SPECIAL CASE IS IF THIS CALCULATION RESULTS IN A
  2142. ZERO, THEN THE LAST CLUSTER IS COMPLETELY FULL (RATHER THAN COMPLETELY EMPTY
  2143. AS THE CALCULATION WOULD SUGGEST).  ╘HIS CALCULATION IS EASILY DONE IN
  2144. MACHINE LANGUAGE WITH AN ┴╬─ OPERATION SINCE THE CLUSTER SIZE IS ALWAYS A
  2145. POWER OF TWO.
  2146.  
  2147. 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
  2148.  
  2149. ╘HIS SECTION DISCUSSES THE INTERFACE TO AND IMPLEMENTATION OF THE ═╙-─╧╙ FILE
  2150. COPYING PACKAGE.  ╔T IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO MEMORY
  2151. AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY.  ╘HE PACKAGE IS
  2152. LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├ PROGRAM,
  2153. EVEN IF ╥┴═─╧╙ IS INSTALLED.
  2154.  
  2155. 4.1. ╔╬╘┼╥╞┴├┼
  2156.  
  2157. ╘HE SUBROUTINE CALL AND PARAMETER PASSING INTERFACE TO THE FILE COPYING
  2158. PACKAGE IS SUMMARIZED AS FOLLOWS:
  2159.  
  2160.    ┴──╥┼╙╙     ─┼╙├╥╔╨╘╔╧╬
  2161.    -------     -----------
  2162.    ╨╦          ╔NIT╨ACKAGE SUBROUTINE
  2163.    ╨╦+3        ╠OAD─IRECTORY SUBROUTINE
  2164.    ╨╦+6        ├OPY╞ILE SUBROUTINE
  2165.    ╨╦+9        TWO-BYTE PACKAGE IDENTIFICATION NUMBER
  2166.    ╨╦+15       ERRNO : ERROR CODE RETURNED
  2167.    ╨╦+16       ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
  2168.    ╨╦+17       ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
  2169.    ╨╦+18       TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
  2170.    ╨╦+20       LOW AND MID BYTES OF FILE LENGTH FOR COPYING
  2171.  
  2172. WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE.  ┴DDITIONAL SUBROUTINE
  2173. PARAMETERS ARE PASSED IN THE PROCESSOR REGISTERS.
  2174.  
  2175. ╘HE "╔NIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
  2176. INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
  2177. DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE.  ╔T REQUIRES NO
  2178. PARAMETERS.
  2179.  
  2180. ╘HE "╠OAD─IRECTORY" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT
  2181. ╙ECTOR PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT
  2182. ═╙-─╧╙ DEVICE NUMBER.  ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE
  2183. SUBROUTINE RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND
  2184. THE NUMBER OF DIRECTORY ENTRIES IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THEN
  2185. THE SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE
  2186. IN THE "ERRNO" INTERFACE VARIABLE.  ╘HE DIRECTORY ENTRY DATA IS IN THE
  2187. DIRECTORY SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙
  2188. DISK.
  2189.  
  2190. ╘HE "├OPY╞ILE" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
  2191. SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
  2192. OPENED).  ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
  2193. DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE.  ╘HE STARTING CLUSTER NUMBER
  2194. OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
  2195. THE ╨╦+18 AND ╨╦+20 INTERFACE WORDS.  ╘HE TRANSLATION MODE TO USE IS PASSED IN
  2196. THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
  2197. OUTPUT TO IS PASSED IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THE ROUTINE
  2198. RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
  2199. VARIABLE.  ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
  2200.  
  2201. ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
  2202. BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
  2203. THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
  2204. TO GET THIS INFORMATION.  ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
  2205. FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
  2206. NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
  2207.  
  2208. ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
  2209. THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
  2210. PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
  2211. HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
  2212. RE-RUNS.  ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE
  2213. OF 131.
  2214.  
  2215. 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
  2216.  
  2217. ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING
  2218. PACKAGE.  ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY A FEW
  2219. SPECIAL CHARACTERS AND THE LINE NUMBER.  ╘HE SPECIAL CHARACTERS ARE THERE TO
  2220. ALLOW YOU TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE
  2221. (AND ALL OF MY UGLY COMMENTS).  ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS
  2222. EXECUTE THE FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
  2223.  
  2224. GREP '^\.%...\!' ╚ACK4 ▄ SED 'S/^.%...\!..//' ▄ SED 'S/.%...\!//' >LRR.S
  2225.  
  2226. ┘OU'LL NOTICE THAT THE INITIAL COMMENT LINES HERE WERE AN AFTERTHOUGHT.
  2227.  
  2228. .%000!  ;╠ITTLE ╥ED ╥EADER ═╙-─╧╙ FILE COPIER PROGRAM
  2229. .%000!  ;WRITTEN 92/10/03 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
  2230. .%000!
  2231.  
  2232. ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
  2233. DIRECTIVES.  ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
  2234.  
  2235. .%001!  .ORG $8000
  2236. .%002!  .OBJ "@:LRR.BIN"
  2237. .%003!
  2238. .%004!  ;====JUMP TABLE AND PARAMETERS INTERFACE ====
  2239. .%005!
  2240. .%006!  JMP INIT╨ACKAGE
  2241. .%007!  JMP LOAD─IRECTORY
  2242. .%008!  JMP COPY╞ILE
  2243. .%009!
  2244. .%010!  .BYTE $CB,131   ;IDENTIFICATION
  2245. .%011!  .BYTE 0,0,0,0
  2246. .%012!
  2247.  
  2248. ╘HESE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO MINIMIZE UNWANTED
  2249. INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME, SUCH AS THE ╥┴═─╧╙
  2250. DEVICE DRIVER.
  2251.  
  2252. .%013!  ERRNO           .BUF 1    ;(LOCATION PK+15)
  2253. .%014!  SOURCE─EVICE    .BUF 1
  2254. .%015!  SOURCE╘YPE      .BUF 1    ;$00=1571, $FF=1581
  2255. .%016!  START├LUSTER    .BUF 2
  2256. .%017!  LEN═╠           .BUF 2    ;LENGTH MEDIUM AND LOW BYTES
  2257. .%018!
  2258. .%019!  ;====GLOBAL DECLARAIONS====
  2259. .%020!
  2260. .%021!  KERNEL╠ISTEN = $FFB1
  2261. .%022!  KERNEL╙ECOND = $FF93
  2262. .%023!  KERNEL╒NLSN  = $FFAE
  2263. .%024!  KERNEL┴CPTR  = $FFA2
  2264. .%025!  KERNEL├IOUT  = $FFA8
  2265. .%026!  KERNEL╙PINP  = $FF47
  2266. .%027!  KERNEL├HKOUT = $FFC9
  2267. .%028!  KERNEL├LRCHN = $FFCC
  2268. .%029!  KERNEL├HROUT = $FFD2
  2269. .%030!
  2270. .%031!  ST = $D0
  2271. .%032!  CIA├LOCK = $DD00
  2272. .%033!  CIA╞LAGS = $DC0D
  2273. .%034!  CIA─ATA  = $DC0C
  2274. .%035!
  2275.  
  2276. ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR.  ╘HEY
  2277. ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
  2278.  
  2279. .%036!  CLUSTER┬LOCK├OUNT .BUF 1        ;1 OR 2
  2280. .%037!  FAT┬LOCKS         .BUF 1        ;UP TO 3
  2281. .%038!  ROOT─IR┬LOCKS     .BUF 1        ;UP TO 8
  2282. .%039!  ROOT─IR┼NTRIES    .BUF 1        ;UP TO 128
  2283. .%040!  TOTAL╙ECTORS      .BUF 2        ;UP TO 1440
  2284. .%041!  FIRST╞ILE┬LOCK    .BUF 1
  2285. .%042!  FIRST╥OOT─IR┬LOCK .BUF 1
  2286. .%043!  FILE├LUSTER├OUNT  .BUF 2
  2287. .%044!
  2288.  
  2289. ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACH CACHE.
  2290.  
  2291. .%045!  BUF├YLINDER     .BUF 1
  2292. .%046!  BUF╙IDE         .BUF 1
  2293. .%047!  FORMAT╨ARMS     .BUF 6
  2294. .%048!
  2295.  
  2296. ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS.  ╘HIS LEVEL INTERFACES WITH THE
  2297. ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
  2298.  
  2299. .%049!  ;====HARDWARE LEVEL====
  2300. .%050!
  2301.  
  2302. ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
  2303. BURST COMMAND BYTE.
  2304.  
  2305. .%051!  SEND╒0 = *  ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
  2306. .%052!     PHA
  2307. .%053!     LDA #0
  2308. .%054!     STA ST
  2309. .%055!     LDA SOURCE─EVICE
  2310. .%056!     JSR KERNEL╠ISTEN
  2311. .%057!     LDA #$6F
  2312. .%058!     JSR KERNEL╙ECOND
  2313. .%059!     LDA #"U"
  2314. .%060!     JSR KERNEL├IOUT
  2315. .%061!     BIT ST
  2316. .%062!     BMI SEND╒0┼RROR
  2317. .%063!     LDA #"0"
  2318. .%064!     JSR KERNEL├IOUT
  2319. .%065!     PLA
  2320. .%066!     JSR KERNEL├IOUT
  2321. .%067!     BIT ST
  2322. .%068!     BMI SEND╒0┼RROR
  2323. .%069!     CLC
  2324. .%070!     RTS
  2325. .%071!
  2326. .%072!     SEND╒0┼RROR = *
  2327. .%073!     LDA #5
  2328. .%074!     STA ERRNO
  2329. .%075!     SEC
  2330. .%076!     RTS
  2331. .%077!
  2332.  
  2333. ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
  2334. TRANSFER PROTOCOL.
  2335.  
  2336. .%078!  TOGGLE├LOCK = *
  2337. .%079!     LDA CIA├LOCK
  2338. .%080!     EOR #$10
  2339. .%081!     STA CIA├LOCK
  2340. .%082!     RTS
  2341. .%083!
  2342.  
  2343. ╫AIT FOR A BURST BYTE TO ARRIVE IN THE SERIAL DATA REGISTER OF ├╔┴#1 FROM THE
  2344. FAST SERIAL BUS.
  2345.  
  2346. .%084!  SERIAL╫AIT = *
  2347. .%085!     LDA #$08
  2348. .%086!  -  BIT CIA╞LAGS
  2349. .%087!     BEQ -
  2350. .%088!     RTS
  2351. .%089!
  2352.  
  2353. ╫AIT FOR AND GET A BURST BYTE FROM THE FAST SERIAL BUS, AND SEND THE "─ATA
  2354. ┴CCEPTED" SIGNAL.
  2355.  
  2356. .%090!  GET┬URST┬YTE = *
  2357. .%091!     JSR SERIAL╫AIT
  2358. .%092!     LDX CIA─ATA
  2359. .%093!     JSR TOGGLE├LOCK
  2360. .%094!     TXA
  2361. .%095!     RTS
  2362. .%096!
  2363.  
  2364. ╙END THE BURST COMMANDS TO "LOG IN" THE ═╙-─╧╙ DISK AND SET THE ╥EAD SECTOR
  2365. INTERLEAVE FACTOR.
  2366.  
  2367. .%097!  MOUNT─ISK = *  ;() : .├╙=ERR
  2368. .%098!     LDA #%00011010
  2369. .%099!     JSR SEND╒0
  2370. .%100!     BCC +
  2371. .%101!     RTS
  2372. .%102!  +  JSR KERNEL╒NLSN
  2373. .%103!     BIT ST
  2374. .%104!     BMI SEND╒0┼RROR
  2375. .%105!     CLC
  2376. .%106!     JSR KERNEL╙PINP
  2377. .%107!     BIT CIA╞LAGS
  2378. .%108!     JSR TOGGLE├LOCK
  2379. .%109!     JSR GET┬URST┬YTE
  2380. .%110!     STA ERRNO
  2381. .%111!     AND #$0F
  2382. .%112!     CMP #2
  2383. .%113!     BCS MOUNT┼XIT
  2384.  
  2385. ╟RAB THE THROW-AWAY PARAMETERS FROM THE MOUNT OPERATION.
  2386.  
  2387. .%114!     LDY #0
  2388. .%115!  -  JSR GET┬URST┬YTE
  2389. .%116!     STA FORMAT╨ARMS,Y
  2390. .%117!     INY
  2391. .%118!     CPY #6
  2392. .%119!     BCC -
  2393. .%120!     CLC
  2394.  
  2395. ╙ET THE SECTOR INTERLEAVE TO 1 FOR A 1581 OR 4 FOR A 1571.
  2396.  
  2397. .%121!     ;** SET INTERLEAVE
  2398. .%122!     LDA #%00001000
  2399. .%123!     JSR SEND╒0
  2400. .%124!     BCC +
  2401. .%125!     RTS
  2402. .%126!  +  LDA #1            ;INTERLEAVE OF 1 FOR 1581
  2403. .%127!     BIT SOURCE╘YPE
  2404. .%128!     BMI +
  2405. .%129!     LDA #4            ;INTERLEAVE OF 4 FOR 1571
  2406. .%130!  +  JSR KERNEL├IOUT
  2407. .%131!     JSR KERNEL╒NLSN
  2408. .%132!     MOUNT┼XIT = *
  2409. .%133!     RTS
  2410. .%134!
  2411.  
  2412. ╥EAD ALL OF THE SECTORS OF A GIVEN TRACK INTO THE TRACK CACHE.
  2413.  
  2414. .%135!  BUFPTR = 2
  2415. .%136!  SECNUM = 4
  2416. .%137!
  2417. .%138!  READ╘RACK = *  ;( .┴=CYLINDER, .╪=SIDE ) : TRACKBUF, .├╙=ERR
  2418. .%139!     PHA
  2419. .%140!     TXA
  2420.  
  2421. ╟ET THE SIDE AND PUT IT INTO THE COMMAND BYTE.  ╥EMEMBER THAT WE HAVE TO FLIP
  2422. THE SIDE BIT FOR A 1581.
  2423.  
  2424. .%141!     AND #$01
  2425. .%142!     ASL
  2426. .%143!     ASL
  2427. .%144!     ASL
  2428. .%145!     ASL
  2429. .%146!     BIT SOURCE╘YPE
  2430. .%147!     BPL +
  2431. .%148!     EOR #$10
  2432. .%149!  +  JSR SEND╒0
  2433. .%150!     BCC +
  2434. .%151!     RTS
  2435. .%152!  +  PLA                  ;CYLINDER NUMBER
  2436. .%153!     JSR KERNEL├IOUT
  2437. .%154!     LDA #1               ;START SECTOR NUMBER
  2438. .%155!     JSR KERNEL├IOUT
  2439. .%156!     LDA #9               ;SECTOR COUNT
  2440. .%157!     JSR KERNEL├IOUT
  2441. .%158!     JSR KERNEL╒NLSN
  2442.  
  2443. ╨REPARE TO RECEIVE THE TRACK DATA.
  2444.  
  2445. .%159!     SEI
  2446. .%160!     CLC
  2447. .%161!     JSR KERNEL╙PINP
  2448. .%162!     BIT CIA╞LAGS
  2449. .%163!     JSR TOGGLE├LOCK
  2450. .%164!     LDA #<TRACKBUF
  2451. .%165!     LDY #>TRACKBUF
  2452. .%166!     STA BUFPTR
  2453. .%167!     STY BUFPTR+1
  2454.  
  2455. ╟ET THE SECTOR DATA FOR EACH OF THE 9 SECTORS OF THE TRACK.
  2456.  
  2457. .%168!     LDA #0
  2458. .%169!     STA SECNUM
  2459. .%170!  -  BIT SOURCE╘YPE
  2460. .%171!     BMI +
  2461.  
  2462. ╔F WE ARE DEALING WITH A 1571, WE HAVE TO SET THE BUFFER POINTER FOR THE NEXT
  2463. SECTOR, TAKING INTO ACCOUNT THE SOFT INTERLEAVE OF 4.
  2464.  
  2465. .%172!     JSR GET1571┬UF╨TR
  2466. .%173!  +  JSR READ╙ECTOR
  2467. .%174!     BCS TRACK┼XIT
  2468. .%175!     INC SECNUM
  2469. .%176!     LDA SECNUM
  2470. .%177!     CMP #9
  2471. .%178!     BCC -
  2472. .%179!     CLC
  2473. .%180!     TRACK┼XIT = *
  2474. .%181!     CLI
  2475. .%182!     RTS
  2476. .%183!
  2477.  
  2478. ╟ET THE BUFFER POINTER FOR THE NEXT 1571 SECTOR.
  2479.  
  2480. .%184!  GET1571┬UF╨TR = *
  2481. .%185!     LDA #<TRACKBUF
  2482. .%186!     STA BUFPTR
  2483. .%187!     LDX SECNUM
  2484. .%188!     CLC
  2485. .%189!     LDA #>TRACKBUF
  2486. .%190!     ADC BUFPTR1571,X
  2487. .%191!     STA BUFPTR+1
  2488. .%192!     RTS
  2489. .%193!
  2490. .%194!  BUFPTR1571 = *
  2491. .%195!     .BYTE 0,8,16,6,14,4,12,2,10
  2492. .%196!
  2493.  
  2494. ╥EAD AN INDIVIDUAL SECTOR INTO MEMORY AT THE SPECIFIED ADDRESS.
  2495.  
  2496. .%197!  READ╙ECTOR = *  ;( BUFPTR ) : .├╙=ERR
  2497.  
  2498. ╟ET AND CHECK THE BURST STATUS BYTE FOR ERRORS.
  2499.  
  2500. .%198!     JSR GET┬URST┬YTE
  2501. .%199!     STA ERRNO
  2502. .%200!     AND #$0F
  2503. .%201!     CMP #2
  2504. .%202!     BCC +
  2505. .%203!     RTS
  2506. .%204!  +  LDX #2
  2507. .%205!     LDY #0
  2508. .%206!
  2509.  
  2510. ╥ECEIVE THE 512 SECTOR DATA BYTES INTO MEMORY.
  2511.  
  2512. .%207!     READ┬YTE = *
  2513. .%208!     LDA #$08
  2514. .%209!  -  BIT CIA╞LAGS
  2515. .%210!     BEQ -
  2516. .%211!     LDA CIA├LOCK
  2517. .%212!     EOR #$10
  2518. .%213!     STA CIA├LOCK
  2519. .%214!     LDA CIA─ATA
  2520. .%215!     STA (BUFPTR),Y
  2521. .%216!     INY
  2522. .%217!     BNE READ┬YTE
  2523. .%218!     INC BUFPTR+1
  2524. .%219!     DEX
  2525. .%220!     BNE READ┬YTE
  2526. .%221!     RTS
  2527. .%222!
  2528.  
  2529. ╘HIS NEXT LEVEL OF ROUTINES DEALS WITH LOGICAL SECTORS AND THE TRACK CACHE
  2530. RATHER THAN WITH HARDWARE.
  2531.  
  2532. .%223!  ;====LOGICAL SECTOR LEVEL====
  2533. .%224!
  2534.  
  2535. ╔NVALIDATE THE TRACK CACHE IF THE ═╙-─╧╙ DRIVE NUMBER IS CHANGED OR IF A NEW
  2536. DISK IS INSERTED.  ╘HIS ROUTINE HAS TO ESTABLISH A ╥┴═ CONFIGURATION OF $0┼
  2537. SINCE IT WILL BE CALLED FROM ╥┴═0.  ├ONFIGURATION $0┼ GIVES ╥┴═0 FROM $0000 TO
  2538. $┬╞╞╞, ╦ERNAL ╥╧═ FROM $├000 TO $╞╞╞╞, AND THE ╔/╧ SPACE OVER THE ╦ERNAL FROM
  2539. $─000 TO $─╞╞╞.  ╘HIS CONFIGURATION IS SET BY ALL APPLICATION INTERFACE
  2540. SUBROUTINES.
  2541.  
  2542. .%225!  INIT╨ACKAGE = *
  2543. .%226!     LDA #$0E
  2544. .%227!     STA $FF00
  2545. .%228!     LDA #$FF
  2546. .%229!     STA BUF├YLINDER
  2547. .%230!     STA BUF╙IDE
  2548. .%231!     CLC
  2549. .%232!     RTS
  2550. .%233!
  2551.  
  2552. ╠OCATE A SECTOR (BLOCK) IN THE TRACK CACHE, OR READ THE CORRESPONDING PHYSICAL
  2553. TRACK INTO THE TRACK CACHE IF NECESSARY.  ╘HIS ROUTINE ACCEPTS THE CYLINDER,
  2554. SIDE, AND SECTOR NUMBERS OF THE BLOCK.
  2555.  
  2556. .%234!  SECTOR╙AVE = 5
  2557. .%235!
  2558. .%236!  READ┬LOCK = *  ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
  2559.  
  2560. ├HECK IF THE CORRECT TRACK IS IN THE TRACK CACHE.
  2561.  
  2562. .%237!     CMP BUF├YLINDER
  2563. .%238!     BNE READ┬LOCK╨HYSICAL
  2564. .%239!     CPX BUF╙IDE
  2565. .%240!     BNE READ┬LOCK╨HYSICAL
  2566.  
  2567. ╔F SO, THEN LOCATE THE SECTOR'S ADDRESS AND RETURN THAT.
  2568.  
  2569. .%241!     DEY
  2570. .%242!     TYA
  2571. .%243!     ASL
  2572. .%244!     CLC
  2573. .%245!     ADC #>TRACKBUF
  2574. .%246!     TAY
  2575. .%247!     LDA #<TRACKBUF
  2576. .%248!     CLC
  2577. .%249!     RTS
  2578. .%250!
  2579.  
  2580. ╚ERE, WE HAVE TO READ THE PHYSICAL TRACK INTO THE TRACK CACHE.  ╫E SAVE THE
  2581. INPUT PARAMETERS AND CALL THE HARDWARE-LEVEL TRACK-READING ROUTINE.
  2582.  
  2583. .%251!     READ┬LOCK╨HYSICAL = *
  2584. .%252!     STA BUF├YLINDER
  2585. .%253!     STX BUF╙IDE
  2586. .%254!     STY SECTOR╙AVE
  2587. .%255!     JSR READ╘RACK
  2588.  
  2589. ├HECK FOR ERRORS.
  2590.  
  2591. .%256!     BCC READ┬LOCK╨HYSICAL╧K
  2592. .%257!     LDA ERRNO
  2593. .%258!     AND #$0F
  2594. .%259!     CMP #11    ;DISK CHANGE
  2595. .%260!     BEQ +
  2596. .%261!     SEC
  2597. .%262!     RTS
  2598.  
  2599. ╔F THE ERROR THAT HAPPENED IS A "─ISK ├HANGE" ERROR, THEN MOUNT THE DISK AND
  2600. TRY TO READ THE PHYSICAL TRACK AGAIN.
  2601.  
  2602. .%263!  +  JSR MOUNT─ISK
  2603. .%264!     LDA BUF├YLINDER
  2604. .%265!     LDX BUF╙IDE
  2605. .%266!     LDY SECTOR╙AVE
  2606. .%267!     BCC READ┬LOCK╨HYSICAL
  2607. .%268!     RTS
  2608. .%269!
  2609.  
  2610. ╚ERE, THE PHYSICAL TRACK HAS BEEN READ INTO THE TRACK CACHE OK, SO WE RECOVER
  2611. THE ORIGINAL INPUT PARAMETERS AND TRY THE TOP OF THE ROUTINE AGAIN.
  2612.  
  2613. .%270!     READ┬LOCK╨HYSICAL╧K = *
  2614. .%271!     LDA BUF├YLINDER
  2615. .%272!     LDX BUF╙IDE
  2616. .%273!     LDY SECTOR╙AVE
  2617. .%274!     JMP READ┬LOCK
  2618. .%275!
  2619.  
  2620. ─IVIDE THE GIVEN NUMBER BY 18.  ╘HIS IS NEEDED FOR THE CALCULATIONS TO CONVERT
  2621. A LOGICAL SECTOR NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER, SIDE, AND
  2622. SECTOR NUMBERS THAT THE LOWER-LEVEL ROUTINES REQUIRE.  ╘HE METHOD OF REPEATED
  2623. SUBTRACTION IS USED.  ╘HIS ROUTINE WOULD PROBABLY WORK FASTER IF WE TRIED TO
  2624. REPEATEDLY SUBTRACT 360 (18*20) AT THE TOP, BUT ╔ DIDN'T BOTHER.
  2625.  
  2626. .%276!  DIVIDE┬Y18 = *  ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
  2627. .%277!     ;** COULD REPEATEDLY SUBTRACT 360 HERE
  2628. .%278!     LDX #$FF
  2629. .%279!  -  INX
  2630. .%280!     SEC
  2631. .%281!     SBC #18
  2632. .%282!     BCS -
  2633. .%283!     DEY
  2634. .%284!     BPL -
  2635. .%285!     CLC
  2636. .%286!     ADC #18
  2637. .%287!     INY
  2638. .%288!     TAY
  2639. .%289!     TXA
  2640. .%290!     RTS
  2641. .%291!
  2642.  
  2643. ├ONVERT THE GIVEN LOGICAL BLOCK NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER,
  2644. SIDE, AND SECTOR NUMBERS.  ╘HIS ROUTINE FOLLOWS THE FORMULAE GIVEN EARLIER
  2645. WITH A FEW SIMPLIFYING TRICKS.
  2646.  
  2647. .%292!  CONVERT╠OGICAL┬LOCK╬UM = *  ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE, .┘=SEC
  2648. .%293!     JSR DIVIDE┬Y18
  2649. .%294!     LDX #0
  2650. .%295!     CPY #9
  2651. .%296!     BCC +
  2652. .%297!     PHA
  2653. .%298!     TYA
  2654. .%299!     SBC #9
  2655. .%300!     TAY
  2656. .%301!     PLA
  2657. .%302!     LDX #1
  2658. .%303!  +  INY
  2659. .%304!     RTS
  2660. .%305!
  2661.  
  2662. ├OPY A SEQUENTIAL GROUP OF LOGICAL SECTORS INTO MEMORY.  ╘HIS ROUTINE IS USED
  2663. BY THE DIRECTORY LOADING ROUTINE TO LOAD THE ╞┴╘ AND ╥OOT ─IRECTORY, AND IS
  2664. USED BY THE CLUSTER READING ROUTINE TO RETRIEVE ALL OF THE BLOCKS OF A
  2665. CLUSTER.  ┴FTER THE GIVEN STARTING LOGICAL SECTOR NUMBER IS CONVERTED INTO ITS
  2666. PHYSICAL CYLINDER, SIDE, AND SECTOR EQUIVALENT, THE PHYSICAL VALUES ARE
  2667. INCREMENTED TO GET THE ADDRESS OF SUCCESSIVE SECTORS OF THE GROUP.  ╘HIS
  2668. AVOIDS THE OVERHEAD OF THE LOGICAL TO PHYSICAL CONVERSION.  ╤UITE A NUMBER OF
  2669. TEMPORARIES ARE NEEDED.
  2670.  
  2671. .%306!  DEST╨TR = 6
  2672. .%307!  CUR├YLINDER = 8
  2673. .%308!  CUR╙IDE = 9
  2674. .%309!  CUR╙ECTOR = 10
  2675. .%310!  BLOCK├OUNTDOWN = 11
  2676. .%311!  SOURCE╨TR = 12
  2677. .%312!
  2678. .%313!  COPY┬LOCKS = *  ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
  2679. .%314!     STX BLOCK├OUNTDOWN
  2680. .%315!     JSR CONVERT╠OGICAL┬LOCK╬UM
  2681. .%316!     STA CUR├YLINDER
  2682. .%317!     STX CUR╙IDE
  2683. .%318!     STY CUR╙ECTOR
  2684. .%319!
  2685. .%320!     COPY┬LOCK╠OOP = *
  2686. .%321!     LDA CUR├YLINDER
  2687. .%322!     LDX CUR╙IDE
  2688. .%323!     LDY CUR╙ECTOR
  2689. .%324!     JSR READ┬LOCK
  2690. .%325!     BCC +
  2691. .%326!     RTS
  2692. .%327!  +  STA SOURCE╨TR
  2693. .%328!     STY SOURCE╨TR+1
  2694. .%329!     LDX #2
  2695. .%330!     LDY #0
  2696.  
  2697. ╚ERE ╔ UNROLL THE COPYING LOOP A LITTLE BIT TO CUT THE OVERHEAD OF THE BRANCH
  2698. INSTRUCTION IN HALF.  (┴ CYCLE SAVED... YOU KNOW).
  2699.  
  2700. .%331!  -  LDA (SOURCE╨TR),Y
  2701. .%332!     STA (DEST╨TR),Y
  2702. .%333!     INY
  2703. .%334!     LDA (SOURCE╨TR),Y
  2704. .%335!     STA (DEST╨TR),Y
  2705. .%336!     INY
  2706. .%337!     BNE -
  2707. .%338!     INC SOURCE╨TR+1
  2708. .%339!     INC DEST╨TR+1
  2709. .%340!     DEX
  2710. .%341!     BNE -
  2711.  
  2712. ╔NCREMENT THE CYLINDER, SIDE, SECTOR VALUES.
  2713.  
  2714. .%342!     INC CUR╙ECTOR
  2715. .%343!     LDA CUR╙ECTOR
  2716. .%344!     CMP #10
  2717. .%345!     BCC +
  2718. .%346!     LDA #1
  2719. .%347!     STA CUR╙ECTOR
  2720. .%348!     INC CUR╙IDE
  2721. .%349!     LDA CUR╙IDE
  2722. .%350!     CMP #2
  2723. .%351!     BCC +
  2724. .%352!     LDA #0
  2725. .%353!     STA CUR╙IDE
  2726. .%354!     INC CUR├YLINDER
  2727. .%355!  +  DEC BLOCK├OUNTDOWN
  2728. .%356!     BNE COPY┬LOCK╠OOP
  2729. .%357!     CLC
  2730. .%358!     RTS
  2731. .%359!
  2732.  
  2733. ╥EAD A CLUSTER INTO THE ├LUSTER ┬UFFER, GIVEN THE CLUSTER NUMBER.  ╘HE CLUSTER
  2734. NUMBER IS CONVERTED TO A LOGICAL SECTOR NUMBER AND THEN THE SECTOR COPYING
  2735. ROUTINE IS CALLED.  ╘HE FORMULA GIVEN EARLIER IS USED FOR THE CONVERSION.
  2736.  
  2737. .%360!  READ├LUSTER = *  ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
  2738. .%361!     ;** CONVERT CLUSTER NUMBER TO LOGICAL BLOCK NUMBER
  2739. .%362!     SEC
  2740. .%363!     SBC #2
  2741. .%364!     BCS +
  2742. .%365!     DEY
  2743. .%366!  +  LDX CLUSTER┬LOCK├OUNT
  2744. .%367!     CPX #1
  2745. .%368!     BEQ +
  2746. .%369!     ASL
  2747. .%370!     STY 7
  2748. .%371!     ROL 7
  2749. .%372!     LDY 7
  2750. .%373!  +  CLC
  2751. .%374!     ADC FIRST╞ILE┬LOCK
  2752. .%375!     BCC +
  2753. .%376!     INY
  2754. .%377!
  2755. .%378!     ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
  2756. .%379!  +  LDX #<CLUSTER┬UF
  2757. .%380!     STX 6
  2758. .%381!     LDX #>CLUSTER┬UF
  2759. .%382!     STX 7
  2760. .%383!     LDX CLUSTER┬LOCK├OUNT
  2761. .%384!     JMP COPY┬LOCKS
  2762. .%385!
  2763.  
  2764. ╘HIS NEXT LEVEL OF ROUTINES DEAL WITH THE DATA STRUCTURES OF THE ═╙-─╧╙ DISK
  2765. FORMAT.
  2766.  
  2767. .%386!  ;====═╙-─╧╙ FORMAT LEVEL====
  2768. .%387!
  2769. .%388!  BOOT┬LOCK = 2
  2770. .%389!
  2771.  
  2772. ╥EAD THE DISK FORMAT PARAMETERS, DIRECTORY, AND ╞┴╘ INTO MEMORY.
  2773.  
  2774. .%390!  LOAD─IRECTORY = *  ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
  2775. .%391!     LDA #$0E
  2776. .%392!     STA $FF00
  2777. .%393!
  2778.  
  2779. ╥EAD THE BOOT SECTOR AND EXTRACT THE PARAMETERS.
  2780.  
  2781. .%394!     ;** GET PARAMETERS FROM BOOT SECTOR
  2782. .%395!     LDA #0
  2783. .%396!     LDY #0
  2784. .%397!     JSR CONVERT╠OGICAL┬LOCK╬UM
  2785. .%398!     JSR READ┬LOCK
  2786. .%399!     BCC +
  2787. .%400!     RTS
  2788. .%401!  +  STA BOOT┬LOCK
  2789. .%402!     STY BOOT┬LOCK+1
  2790. .%403!     LDY #13              ;GET CLUSTER SIZE
  2791. .%404!     LDA (BOOT┬LOCK),Y
  2792. .%405!     STA CLUSTER┬LOCK├OUNT
  2793. .%406!     CMP #3
  2794. .%407!     BCC +
  2795. .%408!
  2796.  
  2797. ╔F A DISK PARAMETER IS FOUND TO EXCEED THE LIMITS OF ╠╥╥, ERROR CODE #60 IS
  2798. RETURNED.
  2799.  
  2800. .%409!     INVALID╨ARMS = *
  2801. .%410!     LDA #60
  2802. .%411!     STA ERRNO
  2803. .%412!     SEC
  2804. .%413!     RTS
  2805. .%414!
  2806. .%415!  +  LDY #16              ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
  2807. .%416!     LDA (BOOT┬LOCK),Y
  2808. .%417!     CMP #2
  2809. .%418!     BNE INVALID╨ARMS
  2810. .%419!     LDY #22              ;GET ╞┴╘ SIZE IN SECTORS
  2811. .%420!     LDA (BOOT┬LOCK),Y
  2812. .%421!     STA FAT┬LOCKS
  2813. .%422!     CMP #4
  2814. .%423!     BCS INVALID╨ARMS
  2815. .%424!     LDY #17              ;GET DIRECTORY SIZE
  2816. .%425!     LDA (BOOT┬LOCK),Y
  2817. .%426!     STA ROOT─IR┼NTRIES
  2818. .%427!     CMP #129
  2819. .%428!     BCS INVALID╨ARMS
  2820. .%429!     LSR
  2821. .%430!     LSR
  2822. .%431!     LSR
  2823. .%432!     LSR
  2824. .%433!     STA ROOT─IR┬LOCKS
  2825. .%434!     LDY #19              ;GET TOTAL SECTOR COUNT
  2826. .%435!     LDA (BOOT┬LOCK),Y
  2827. .%436!     STA TOTAL╙ECTORS
  2828. .%437!     INY
  2829. .%438!     LDA (BOOT┬LOCK),Y
  2830. .%439!     STA TOTAL╙ECTORS+1
  2831. .%440!     LDY #24              ;CHECK SECTORS PER TRACK, MUST BE 9
  2832. .%441!     LDA (BOOT┬LOCK),Y
  2833. .%442!     CMP #9
  2834. .%443!     BNE INVALID╨ARMS
  2835. .%444!     LDY #26
  2836. .%445!     LDA (BOOT┬LOCK),Y
  2837. .%446!     CMP #2               ;CHECK NUMBER OF SIDES, MUST BE 2
  2838. .%447!     BNE INVALID╨ARMS
  2839. .%448!     LDY #14              ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
  2840. .%449!     LDA (BOOT┬LOCK),Y
  2841. .%450!     CMP #1
  2842. .%451!     BNE INVALID╨ARMS
  2843. .%452!
  2844.  
  2845. ├ALCULATE THE DERIVED PARAMETERS.
  2846.  
  2847. .%453!     ;** GET DERIVED PARAMETERS
  2848. .%454!     LDA FAT┬LOCKS        ;FIRST ROOT DIRECTORY SECTOR
  2849. .%455!     ASL
  2850. .%456!     CLC
  2851. .%457!     ADC #1
  2852. .%458!     STA FIRST╥OOT─IR┬LOCK
  2853. .%459!     CLC                  ;FIRST FILE SECTOR
  2854. .%460!     ADC ROOT─IR┬LOCKS
  2855. .%461!     STA FIRST╞ILE┬LOCK
  2856. .%462!     LDA TOTAL╙ECTORS     ;NUMBER OF FILE CLUSTERS
  2857. .%463!     LDY TOTAL╙ECTORS+1
  2858. .%464!     SEC
  2859. .%465!     SBC FIRST╞ILE┬LOCK
  2860. .%466!     BCS +
  2861. .%467!     DEY
  2862. .%468!  +  STA FILE├LUSTER├OUNT
  2863. .%469!     STY FILE├LUSTER├OUNT+1
  2864. .%470!     LDA CLUSTER┬LOCK├OUNT
  2865. .%471!     CMP #2
  2866. .%472!     BNE +
  2867. .%473!     LSR FILE├LUSTER├OUNT+1
  2868. .%474!     ROR FILE├LUSTER├OUNT
  2869. .%475!
  2870.  
  2871. ╟EE, ╔ HAVE MORE COMMENTS EMBEDDED IN THE CODE THAN ╔ DID LAST ISSUE.
  2872.  
  2873. .%476!     ;** LOAD ╞┴╘
  2874. .%477!  +  LDA #<FATBUF
  2875. .%478!     LDY #>FATBUF
  2876. .%479!     STA 6
  2877. .%480!     STY 7
  2878. .%481!     LDA #1
  2879. .%482!     LDY #0
  2880. .%483!     LDX FAT┬LOCKS
  2881. .%484!     JSR COPY┬LOCKS
  2882. .%485!     BCC +
  2883. .%486!     RTS
  2884. .%487!
  2885. .%488!     ;** LOAD ACTUAL DIRECTORY
  2886. .%489!  +  LDA #<DIRBUF
  2887. .%490!     LDY #>DIRBUF
  2888. .%491!     STA 6
  2889. .%492!     STY 7
  2890. .%493!     LDA FIRST╥OOT─IR┬LOCK
  2891. .%494!     LDY #0
  2892. .%495!     LDX ROOT─IR┬LOCKS
  2893. .%496!     JSR COPY┬LOCKS
  2894. .%497!     BCC +
  2895. .%498!     RTS
  2896. .%499!  +  LDA #<DIRBUF
  2897. .%500!     LDY #>DIRBUF
  2898. .%501!     LDX ROOT─IR┼NTRIES
  2899. .%502!     CLC
  2900. .%503!     RTS
  2901. .%504!
  2902.  
  2903. ╘HIS ROUTINE LOCATES THE GIVEN ╞┴╘ TABLE ENTRY NUMBER AND RETURNS THE VALUE
  2904. STORED IN IT.  ╙OME WORK IS NEEDED TO DEAL WITH THE 12-BIT COMPRESSED DATA
  2905. STRUCTURE.
  2906.  
  2907. .%505!  ENTRY┴DDR = 2
  2908. .%506!  ENTRY╫ORK = 4
  2909. .%507!  ENTRY┬ITS = 5
  2910. .%508!  ENTRY─ATA0 = 6
  2911. .%509!  ENTRY─ATA1 = 7
  2912. .%510!  ENTRY─ATA2 = 8
  2913. .%511!
  2914. .%512!  GET╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
  2915. .%513!     STA ENTRY┬ITS
  2916.  
  2917. ─IVIDE THE ╞┴╘ ENTRY NUMBER BY TWO AND MULTIPLY BY THREE BECAUSE TWO ╞┴╘
  2918. ENTRIES ARE STORED IN THREE BYTES.  ╘HEN ADD THE ╞┴╘ BASE ADDRESS AND WE HAVE
  2919. THE ADDRESS OF THE THREE BYTES THAT CONTAIN THE ╞┴╘ ENTRY WE ARE INTERESTED
  2920. IN.  ╔ RETRIEVE THE THREE BYTES INTO ZERO-PAGE MEMORY FOR EASY MANIPULATION.
  2921.  
  2922. .%514!     ;** DIVIDE BY TWO
  2923. .%515!     STY ENTRY┴DDR+1
  2924. .%516!     LSR ENTRY┴DDR+1
  2925. .%517!     ROR
  2926. .%518!
  2927. .%519!     ;** TIMES THREE
  2928. .%520!     STA ENTRY╫ORK
  2929. .%521!     LDX ENTRY┴DDR+1
  2930. .%522!     ASL
  2931. .%523!     ROL ENTRY┴DDR+1
  2932. .%524!     CLC
  2933. .%525!     ADC ENTRY╫ORK
  2934. .%526!     STA ENTRY┴DDR
  2935. .%527!     TXA
  2936. .%528!     ADC ENTRY┴DDR+1
  2937. .%529!     STA ENTRY┴DDR+1
  2938. .%530!
  2939. .%531!     ;** ADD BASE, GET DATA
  2940. .%532!     CLC
  2941. .%533!     LDA ENTRY┴DDR
  2942. .%534!     ADC #<FATBUF
  2943. .%535!     STA ENTRY┴DDR
  2944. .%536!     LDA ENTRY┴DDR+1
  2945. .%537!     ADC #>FATBUF
  2946. .%538!     STA ENTRY┴DDR+1
  2947. .%539!     LDY #2
  2948. .%540!  -  LDA (ENTRY┴DDR),Y
  2949. .%541!     STA ENTRY─ATA0,Y
  2950. .%542!     DEY
  2951. .%543!     BPL -
  2952. .%544!     LDA ENTRY┬ITS
  2953. .%545!     AND #1
  2954. .%546!     BNE +
  2955. .%547!
  2956.  
  2957. ╔F THE ORIGINAL GIVEN ╞┴╘ ENTRY NUMBER IS EVEN, THEN WE WANT THE FIRST 12-BIT
  2958. COMPRESSED FIELD.  ╘HE NYBBLES ARE EXTRACTED ACCORDING TO THE DIAGRAM SHOWN
  2959. EARLIER.
  2960.  
  2961. .%548!     ;** CASE 1: FIRST 12-BIT CLUSTER
  2962. .%549!     LDA ENTRY─ATA1
  2963. .%550!     AND #$0F
  2964. .%551!     TAY
  2965. .%552!     LDA ENTRY─ATA0
  2966. .%553!     RTS
  2967. .%554!
  2968.  
  2969. ╧THERWISE, WE WANT THE SECOND 12-BIT FIELD.
  2970.  
  2971. .%555!     ;** CASE 2: SECOND 12-BIT CLUSTER
  2972. .%556!  +  LDA ENTRY─ATA1
  2973. .%557!     LDX #4
  2974. .%558!  -  LSR ENTRY─ATA2
  2975. .%559!     ROR
  2976. .%560!     DEX
  2977. .%561!     BNE -
  2978. .%562!     LDY ENTRY─ATA2
  2979. .%563!     RTS
  2980. .%564!
  2981.  
  2982. ╞INALLY, THIS IS THE FILE COPYING LEVEL.  ╔T DEALS WITH READING THE CLUSTERS
  2983. OF ═╙-─╧╙ FILES AND COPYING THE DATA THEY CONTAIN TO THE ALREADY-OPEN ├┬═
  2984. ╦ERNAL FILE, POSSIBLY WITH ┴╙├╔╔-TO-╨┼╘╙├╔╔ TRANSLATION.
  2985.  
  2986. .%565!  ;====FILE COPY LEVEL====
  2987. .%566!
  2988. .%567!  TRANS═ODE = 14
  2989. .%568!  LFN = 15
  2990. .%569!  CBM─ATA╨TR = $60
  2991. .%570!  CBM─ATA╠EN = $62
  2992. .%571!  CLUSTER = $64
  2993. .%572!
  2994.  
  2995. ├OPY THE GIVEN CLUSTER TO THE ├┬═ OUTPUT FILE.  ╘HIS ROUTINE FETCHES THE NEXT
  2996. CLUSTER OF THE FILE FOR THE NEXT TIME THIS ROUTINE IS CALLED, AND IF IT HITS
  2997. THE ╬╒╠╠ POINTER OF THE LAST CLUSTER OF A FILE, IT ADJUSTS THE NUMBER OF VALID
  2998. FILE DATA BYTES THE CURRENT CLUSTER CONTAINS TO ╞ILE╠ENGTH % ├LUSTER╠ENGTH
  2999. (SEE NOTE BELOW).
  3000.  
  3001. .%573!  COPY╞ILE├LUSTER = *  ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
  3002.  
  3003. ╥EAD THE CLUSTER AND SETUP TO COPY THE WHOLE CLUSTER TO THE ├┬═ FILE.
  3004.  
  3005. .%574!     LDA CLUSTER
  3006. .%575!     LDY CLUSTER+1
  3007. .%576!     JSR READ├LUSTER
  3008. .%577!     BCC +
  3009. .%578!     RTS
  3010. .%579!  +  LDA #<CLUSTER┬UF
  3011. .%580!     LDY #>CLUSTER┬UF
  3012. .%581!     STA CBM─ATA╨TR
  3013. .%582!     STY CBM─ATA╨TR+1
  3014. .%583!     LDA #0
  3015. .%584!     STA CBM─ATA╠EN
  3016. .%585!     LDA CLUSTER┬LOCK├OUNT
  3017. .%586!     ASL
  3018. .%587!     STA CBM─ATA╠EN+1
  3019. .%588!
  3020.  
  3021. ╞ETCH THE NEXT CLUSTER NUMBER OF THE FILE, AND ADJUST THE CLUSTER DATA LENGTH
  3022. FOR THE LAST CLUSTER OF THE FILE.
  3023.  
  3024. .%589!     ;**GET NEXT CLUSTER
  3025. .%590!     LDA CLUSTER
  3026. .%591!     LDY CLUSTER+1
  3027. .%592!     JSR GET╞AT┼NTRY
  3028. .%593!     STA CLUSTER
  3029. .%594!     STY CLUSTER+1
  3030. .%595!     CMP #$FF
  3031. .%596!     BNE COPY╞ILE├LUSTER─ATA
  3032. .%597!     CPY #$0F
  3033. .%598!     BNE COPY╞ILE├LUSTER─ATA
  3034. .%599!     LDA LEN═╠
  3035. .%600!     STA CBM─ATA╠EN
  3036. .%601!     LDA #$01
  3037. .%602!     LDX CLUSTER┬LOCK├OUNT
  3038. .%603!     CPX #1
  3039. .%604!     BEQ +
  3040. .%605!     LDA #$03
  3041. .%606!  +  AND LEN═╠+1
  3042.  
  3043. ╘HE FOLLOWING THREE LINES WERE ADDED IN A LAST MINUTE PANIC AFTER REALIZING
  3044. THAT IF ╞ILE╠ENGTH % ├LUSTER╙IZE == 0, THEN THE LAST CLUSTER OF THE FILE
  3045. CONTAINS ├LUSTER╙IZE BYTES, NOT ZERO BYTES.
  3046.  
  3047. .%000!     BNE +
  3048. .%000!     LDX LEN═╠
  3049. .%000!     BEQ COPY╞ILE├LUSTER─ATA
  3050. .%607!  +  STA CBM─ATA╠EN+1
  3051. .%608!
  3052. .%609!     COPY╞ILE├LUSTER─ATA = *
  3053. .%610!     JSR COMMIE╧UT
  3054. .%611!     RTS
  3055. .%612!
  3056.  
  3057. ├OPY THE FILE DATA IN THE ═╙-─╧╙ CLUSTER BUFFER TO THE ├┬═ OUTPUT FILE.
  3058.  
  3059. .%613!  CBM─ATA╠IMIT = $66
  3060. .%614!
  3061. .%615!  COMMIE╧UT = *  ;( CBM─ATA╨TR, CBM─ATA╠EN ) : .├╙=ERR
  3062.  
  3063. ╔F THE THE LOGICAL FILE NUMBER TO COPY TO IS 0 ("NULL DEVICE"), THEN DON'T
  3064. BOTHER COPYING ANYTHING.
  3065.  
  3066. .%616!     LDX LFN
  3067. .%617!     BNE +
  3068. .%618!     CLC
  3069. .%619!     RTS
  3070.  
  3071. ╧THERWISE, PREPARE THE LOGICAL FILE NUMBER FOR OUTPUT.
  3072.  
  3073. .%620!  +  JSR KERNEL├HKOUT
  3074. .%621!     BCC COMMIE╧UT═ORE
  3075. .%622!     STA ERRNO
  3076. .%623!     RTS
  3077. .%624!
  3078. .%625!     COMMIE╧UT═ORE = *
  3079.  
  3080. ╨ROCESS THE CLUSTER DATA IN CHUNKS OF UP TO 255 BYTES OR THE NUMBER OF DATA
  3081. BYTES REMAINING IN THE CLUSTER.
  3082.  
  3083. .%626!     LDA #255
  3084. .%627!     LDX CBM─ATA╠EN+1
  3085. .%628!     BNE +
  3086. .%629!     LDA CBM─ATA╠EN
  3087. .%630!  +  STA CBM─ATA╠IMIT
  3088. .%631!     LDY #0
  3089. .%632!  -  LDA (CBM─ATA╨TR),Y
  3090. .%633!     BIT TRANS═ODE
  3091. .%634!     BPL +
  3092.  
  3093. ╔F WE HAVE TO TRANSLATE THE CURRENT ┴╙├╔╔ CHARACTER, LOOK UP THE ╨┼╘╙├╔╔ VALUE
  3094. IN THE TRANSLATION TABLE AND OUTPUT THAT VALUE.  ╔F THE TRANSLATION TABLE
  3095. ENTRY VALUE IS $00, THEN DON'T OUTPUT A CHARACTER (FILTER OUT INVALID
  3096. CHARACTER CODES).
  3097.  
  3098. .%635!     TAX
  3099. .%636!     LDA TRANS┬UF,X
  3100. .%637!     BEQ COMMIE╬EXT
  3101. .%638!  +  JSR KERNEL├HROUT
  3102. .%639!     COMMIE╬EXT = *
  3103. .%640!     INY
  3104. .%641!     CPY CBM─ATA╠IMIT
  3105. .%642!     BNE -
  3106. .%643!
  3107.  
  3108. ╔NCREMENT THE CLUSTER BUFFER POINTER AND DECREMENT THE CLUSTER BUFFER CHARACTER
  3109. COUNT ACCORDING TO THE NUMBER OF BYTES JUST PROCESSED, AND REPEAT THE ABOVE IF
  3110. MORE FILE DATA REMAINS IN THE CURRENT CLUSTER.
  3111.  
  3112. .%644!     CLC
  3113. .%645!     LDA CBM─ATA╨TR
  3114. .%646!     ADC CBM─ATA╠IMIT
  3115. .%647!     STA CBM─ATA╨TR
  3116. .%648!     BCC +
  3117. .%649!     INC CBM─ATA╨TR+1
  3118. .%650!  +  SEC
  3119. .%651!     LDA CBM─ATA╠EN
  3120. .%652!     SBC CBM─ATA╠IMIT
  3121. .%653!     STA CBM─ATA╠EN
  3122. .%654!     BCS +
  3123. .%655!     DEC CBM─ATA╠EN+1
  3124. .%656!  +  LDA CBM─ATA╠EN
  3125. .%657!     ORA CBM─ATA╠EN+1
  3126. .%658!     BNE COMMIE╧UT═ORE
  3127.  
  3128. ╔F WE ARE FINISHED WITH THE CLUSTER, THEN CLEAR THE ├┬═ ╦ERNAL OUTPUT CHANNEL.
  3129.  
  3130. .%659!     JSR KERNEL├LRCHN
  3131. .%660!     CLC
  3132. .%661!     RTS
  3133. .%662!
  3134.  
  3135. ╘HE FILE COPYING MAIN ROUTINE.  ╙ET UP FOR THE STARTING CLUSTER, AND CALL
  3136. THE CLUSTER COPYING ROUTINE UNTIL END-OF-FILE IS REACHED.  ├HECKS FOR A
  3137. ╬╒╠╠ CLUSTER POINTER IN THE DIRECTORY ENTRY TO HANDLE ZERO-LENGTH FILES.
  3138.  
  3139. .%663!  COPY╞ILE = *  ;( START├LUSTER, LEN═╠, .┴=TRANS═ODE, .╪=LFN ) : .├╙=ERR
  3140. .%664!     LDY #$0E
  3141. .%665!     STY $FF00
  3142. .%666!     STA TRANS═ODE
  3143. .%667!     STX LFN
  3144. .%668!     LDA START├LUSTER
  3145. .%669!     LDY START├LUSTER+1
  3146. .%670!     STA CLUSTER
  3147. .%671!     STY CLUSTER+1
  3148. .%672!     JMP +
  3149. .%673!  -  JSR COPY╞ILE├LUSTER
  3150. .%674!     BCC +
  3151. .%675!     RTS
  3152. .%676!  +  LDA CLUSTER
  3153. .%677!     CMP #$FF
  3154. .%678!     BNE -
  3155. .%679!     LDA CLUSTER+1
  3156. .%680!     CMP #$0F
  3157. .%681!     BNE -
  3158. .%682!     CLC
  3159. .%683!     RTS
  3160. .%684!
  3161.  
  3162. ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ┴╙├╔╔ TO ╨┼╘╙├╔╔.  ┘OU CAN
  3163. MODIFY IT TO SUIT YOUR NEEDS IF YOU WISH.  ╔F YOU CANNOT REASSEMBLE THIS FILE,
  3164. THEN YOU CAN SIFT THROUGH THE BINARY FILE AND LOCATE THE TABEL AND CHANGE IT
  3165. THERE.  ┴N ENTRY OF $00 MEANS THE CORRESPONDING ┴╙├╔╔ CHARACTER WILL NOT BE
  3166. TRANSLATED.  ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING
  3167. ┴╙├╔╔ CONTROL CHARACTERS INTO ╨┼╘╙├╔╔: ┬ACKSPACE, ╘AB, ╠INEFEED (├╥), AND
  3168. ╞ORMFEED.  ╔ ALSO TRANSLATE THE NON-╨┼╘╙├╔╔ CHARACTERS SUCH AS █, ▄, ▐, AND _
  3169. ACCORDING TO WHAT THEY PROBABLY WOULD HAVE BEEN IF ├OMMODORE WASN'T SO
  3170. CONCERNED WITH THE GRAPHICS CHARACTERS.
  3171.  
  3172. .%685!  TRANS┬UF = *
  3173. .%686!         ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  3174. .%687!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0D,$00,$93,$00,$00,$00 ;0
  3175. .%688!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
  3176. .%689!  .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  3177. .%690!  .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  3178. .%691!  .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
  3179. .%692!  .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
  3180. .%693!  .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
  3181. .%694!  .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
  3182. .%695!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
  3183. .%696!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
  3184. .%697!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
  3185. .%698!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
  3186. .%699!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;C
  3187. .%700!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;D
  3188. .%701!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
  3189. .%702!  .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;F
  3190. .%703!
  3191.  
  3192. ╘HIS IS WHERE THE TRACK CACHE, ETC. ARE STORED.  ╘HIS SECTION REQUIRES 11╦ OF
  3193. STORAGE SPACE BUT DOES NOT INCREASE THE LENGTH OF THE BINARY PROGRAM FILE
  3194. SINCE THESE STORAGE AREAS ARE ─┼╞╔╬┼─ RATHER THAN ALLOCATED WITH ".BUF"
  3195. DIRECTIVES.  ╘HE ╒NIX TERMINOLOGY FOR THIS TYPE OF UNINITIALIZED DATA IS "BSS".
  3196.  
  3197. .%704!  ;====BSS STORAGE====
  3198. .%705!
  3199. .%706!  BSS = *
  3200. .%707!  TRACKBUF   = BSS
  3201. .%708!  CLUSTER┬UF = TRACKBUF+4608
  3202. .%709!  FATBUF     = CLUSTER┬UF+1024
  3203. .%710!  DIRBUF     = FATBUF+1536
  3204. .%711!  END        = DIRBUF+4096
  3205.  
  3206. 5. ╒╙┼╥-╔╬╘┼╥╞┴├┼ ╨╥╧╟╥┴═
  3207.  
  3208. ╘HIS SECTION PRESENTS THE LISTING OF THE USER-INTERFACE ┬┴╙╔├ PROGRAM.  ┘OU
  3209. SHOULD BE AWARE THAT YOU CAN EASILY CHANGE SOME OF THE DEFAULTS TO YOUR OWN
  3210. PREFERENCES IF YOU WISH.  ╘HIS PROGRAM IS NOT LISTED IN THE ".%NNN!" FORMAT
  3211. THAT THE ASSEMBLER LISTING IS SINCE YOU CAN RECOVER THIS LISTING FROM THE
  3212. UUENCODED BINARY PROGRAM FILE.  ╘HIS PROGRAM SHOULD BE A LITTLE EASIER TO
  3213. FOLLOW THAN THE ASSEMBLER LISTING SINCE ┬┴╙╔├ IS A SELF-COMMENTING LANGUAGE. :-)
  3214.  
  3215. 10 REM LITTLE RED READER, BY CRAIG BRUCE, 30-SEP-92, FOR C= HACKING NETMAG
  3216. 11 :
  3217.  
  3218. ╘HESE LINES SET UP THE DEFAULT ├┬═-─╧╙ AND ═╙-─╧╙ DEVICE NUMBERS, TAKING CARE
  3219. TO DISALLOW THEM TO BE THE SAME DEVICE.  ┘OU CAN CHANGE THIS TO YOUR OWN DRIVE
  3220. CONFIGURATION.
  3221.  
  3222. 20 CD=PEEK(186)  : REM ** DEFAULT CBM-DOS DRIVE **
  3223. 25 DV=9:DT=0  :  REM ** MS-DOS DRIVE, TYPE (0=1571,255=1581)
  3224. 26 IF DV=CD THEN DV=8:DT=0 : REM ** ALTERNATE MS-DOS DRIVE
  3225. 27 :
  3226. 30 PRINT CHR$(147);"INITIALIZING..." : PRINT
  3227. 40 BANK0 : PK=DEC("8000")
  3228. 50 IF PEEK(PK+9)=DEC("CB") AND PEEK(PK+10)=131 THEN 60
  3229. 55 PRINT"LOADING MACHINE LANGUAGE ROUTINES..." : BLOAD"LRR.BIN",U(CD)
  3230. 60 POKE PK+16,DV : POKE PK+17,DT : SYS PK
  3231.  
  3232. ╔ "DIM" THE FOLLOWING VARIABLES BEFORE THE ARRAYS TO AVOID THE OVERHEAD OF
  3233. PUSHING THE ARRAYS AROUND WHEN CREATING NEW SCALAR VARIABLES.
  3234.  
  3235. 70 DIM T,R,B,I,A$,C,DT$,FL$,IL$,X,X$
  3236. 80 DIM DI$(128),CL(128),SZ(128)
  3237. 90 IF DT=255 THEN DT$="1581" :ELSE DT$="1571"
  3238. 100 FL$=CHR$(19)+CHR$(17)+CHR$(17)+CHR$(17)+CHR$(17)
  3239. 110 IL$=FL$:FORI=1TO19:IL$=IL$+CHR$(17):NEXT
  3240. 120 GOTO 500
  3241. 130 :
  3242. 131 REM ** LOAD MS-DOS DIRECTORY **
  3243. 140 PRINT"LOADING DIRECTORY..." : PRINT
  3244. 150 SYS PK : SYS PK+3
  3245. 160 DL=0
  3246.  
  3247. ╘HE "RREG" INSTRUCTION RETURNS THE RETURN VALUES OF THE .┴, .╪, .┘, AND .╙
  3248. REGISTERS FROM THE LAST "SYS" CALL.  ╔ CHECK THE 1-BIT OF THE .╙ REGISTER
  3249. (THE ├ARRY FLAG) FOR ERROR RETURNS.
  3250.  
  3251. 170 RREG BL,DC,BH,S : E=PEEK(PK+15)
  3252. 180 IF (S AND 1) THEN GOSUB 380 : RETURN
  3253. 190 PRINT"SCANNING DIRECTORY..." : PRINT
  3254. 200 DB=BL+256*BH
  3255. 210 IF DC=0 THEN 360
  3256. 220 FOR DP=DB TO DB+32*(DC-1) STEP 32
  3257. 230 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 350
  3258. 240 IF PEEK(DP+12) AND 24 THEN 350
  3259. 250 DL=DL+1
  3260.  
  3261. ╘HIS NEXT LINE IS WHERE ╔ SET THE DEFAULT SELECTION STATUS, TRANSLATION TYPE,
  3262. AND ├┬═ FILE TYPE FOR THE ═╙-─╧╙ FILES.  ┘OU CAN CHANGE THESE DEFAULTS SIMPLY
  3263. BY OVERTYPING THE STRING IN   (  ▄  ▄▄▄  ▄▄▄  ) THE "╓" LOCATIONS.
  3264.                                  ╓  ╓╓╓  ╓╓╓
  3265. 260 D$=RIGHT$(" "+STR$(DL),3)+"     ASC  SEQ  " : REM ** DEFAULT SEL/TR/FT **
  3266. 270 A$="" : FORI=0TO10 : A$=A$+CHR$(PEEK(DP+I)) : NEXT
  3267. 280 A$=LEFT$(A$,8)+"  "+RIGHT$(A$,3)
  3268. 290 PRINT DL; A$
  3269. 300 D$=D$+A$+"  "
  3270. 310 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
  3271. 320 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
  3272. 330 DI$(DL)=D$+RIGHT$("    "+STR$(SZ),6)
  3273. 340 SZ(DL)=SZ
  3274. 350 NEXT DP
  3275. 360 RETURN
  3276. 370 :
  3277. 371 REM ** REPORT MS-DOS DISK ERROR **
  3278. 380 PRINT CHR$(18);"MS-DOS DISK ERROR #";MID$(STR$(E),2);
  3279. 390 PRINT " ($";MID$(HEX$(E),3);"), PRESS KEY.";CHR$(146)
  3280. 400 GETKEY A$ : RETURN
  3281. 410 :
  3282. 411 REM ** SCREEN HEADING **
  3283. 420 PRINTCHR$(147);"MS-DEV=";MID$(STR$(DV),2);"    MS-TYPE=";DT$;
  3284. 430 PRINT"    CBM-DEV=";MID$(STR$(CD),2):PRINT
  3285. 440 RETURN
  3286. 450 :
  3287. 451 REM ** SCREEN FOOTING **
  3288. 460 PRINT IL$;"D=DIRECTORY  M=MS-DEV  F=CBM-DEV Q=QUIT"
  3289. 470 PRINT"T=TOGGLE-COLUMN, C=COPY-FILES, +/- PAGE";
  3290. 480 RETURN
  3291. 490 :
  3292. 491 REM ** MAIN ROUTINE **
  3293. 500 T=1 : C=0
  3294. 510 R=0
  3295. 520 GOSUB 420
  3296. 530 PRINT "NUM  S  TRN  TYP  FILENAME  EXT  LENGTH"
  3297. 540 PRINT "---  -  ---  ---  --------  ---  ------"
  3298. 550 GOSUB 460
  3299. 560 B=T+17 : IF B>DL THEN B=DL
  3300. 570 PRINT FL$;: IF T>DL THEN 590
  3301. 580 FOR I=T TO B : PRINT DI$(I) : NEXT
  3302. 590 IF DL=0 THEN PRINT CHR$(18);"<NO FILES>";CHR$(146)
  3303. 600 IF DL=0 THEN 660
  3304. 610 PRINT LEFT$(IL$,R+5);CHR$(18);
  3305. 620 ON C+1 GOTO 630,640,650
  3306. 630 PRINT SPC(4);MID$(DI$(T+R),5,3) : GOTO 660
  3307. 640 PRINT SPC(7);MID$(DI$(T+R),8,5) : GOTO 660
  3308. 650 PRINT SPC(12);MID$(DI$(T+R),13,5) : GOTO 660
  3309. 660 GETKEY A$
  3310.  
  3311. ╧H SHI^╚OOT.  ╔ SCREWED UP THE FOLLOWING LINE IN THE STRING AFTER THE
  3312. "+CHR$(13)+" PART.  ┘OU'LL NOTICE THAT ╔ HAVE AVOIDED PUTTING CURSOR CONTROL
  3313. CHARACTERS INTO THE STRINGS EVERYWHERE ELSE, BUT ╔ FORGOT TO DO THAT HERE.
  3314. ╘HE "█STUFF▌" SHOULD BE ├URSOR╒P, ├URSOR─OWN, ├URSOR╠EFT, ├URSOR╥IGHT,
  3315. ├URSOR╚OME, AND ├URSOR├╠╥ CONTROL CHARACTERS, RESPECTIVELY.  ╘HESE CHARACTERS
  3316. GIVE THE INDEX FOR THE "ON" STATEMENT BELOW.
  3317.  
  3318. 670 I=INSTR("DMFTC+-Q "+CHR$(13)+"█STUFF▌",A$)
  3319. 680 PRINT LEFT$(IL$,R+5);DI$(T+R)
  3320. 690 IF I=0 THEN 600
  3321. 700 ONIGOTO760,1050,1110,950,1150,1000,1020,730,860,860,770,790,810,830,850,500
  3322. 710 STOP
  3323. 720 :
  3324. 721 REM ** VARIOUS MENU OPTIONS **
  3325. 730 PRINT CHR$(147);"HAVE AN AWESOME DAY."
  3326. 740 END
  3327. 760 GOSUB 420 : GOSUB 140 : GOTO 500
  3328. 770 R=R-1 : IF R<0 THEN R=B-T
  3329. 780 GOTO 600
  3330. 790 R=R+1 : IF T+R>B THEN R=0
  3331. 800 GOTO 600
  3332. 810 C=C-1 : IF C<0 THEN C=2
  3333. 820 GOTO 600
  3334. 830 C=C+1 : IF C>2 THEN C=0
  3335. 840 GOTO 600
  3336. 850 R=0 : C=0 : GOTO 600
  3337. 860 IF DL=0 THEN 600
  3338. 870 X=T+R : ON C+1 GOSUB 890,910,930
  3339. 880 PRINT LEFT$(IL$,R+5);DI$(X) : GOTO 600
  3340. 890 IF MID$(DI$(X),6,1)=" " THEN X$="*" :ELSE X$=" "
  3341. 900 MID$(DI$(X),6,1)=X$ : RETURN
  3342. 910 IF MID$(DI$(X),9,1)="A" THEN X$="BIN" :ELSE X$="ASC"
  3343. 920 MID$(DI$(X),9,3)=X$ : RETURN
  3344. 930 IF MID$(DI$(X),14,1)="S" THEN X$="PRG" :ELSE X$="SEQ"
  3345. 940 MID$(DI$(X),14,3)=X$ : RETURN
  3346. 950 IF DL=0 THEN 600
  3347. 960 FOR X=1 TO DL
  3348. 970 ON C+1 GOSUB 890,910,930
  3349. 980 NEXT X
  3350. 990 GOTO 520
  3351. 1000 IF B=DL THEN T=1 : GOTO 510
  3352. 1010 T=T+18 : GOTO 510
  3353. 1020 IF T=1 THEN T=DL-(DL-INT(DL/18)*18)+1 : GOTO 510
  3354. 1030 T=T-18 : IF T<1 THEN T=1
  3355. 1040 GOTO 510
  3356. 1050 PRINT IL$;CHR$(27);"@";
  3357. 1060 INPUT"MS-DOS DEVICE NUMBER (8-30)";DV
  3358. 1061 IF CD=DV THEN PRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1060
  3359. 1070 INPUT"MS-DOS DEVICE TYPE  (71/81)";X
  3360. 1080 IF X=8 OR X=81 OR X=1581 THEN DT=255:DT$="1581" :ELSE DT=0:DT$="1571"
  3361. 1090 POKE PK+16,DV : POKE PK+17,DT : SYS PK
  3362. 1100 GOTO 520
  3363. 1110 PRINT IL$;CHR$(27);"@";
  3364. 1120 INPUT "CBM-DOS DEVICE NUMBER (0-30)";CD
  3365. 1130 IF CD=DV THEN PRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1120
  3366. 1140 GOTO 520
  3367. 1141 :
  3368. 1142 REM ** COPY FILES **
  3369. 1150 PRINT CHR$(147);"COPY FILES":PRINT:PRINT
  3370. 1160 IF DL=0 THEN FC=0 : GOTO 1190
  3371. 1170 FC=0 : FOR F=1 TO DL : IF MID$(DI$(F),6,1)="*" THEN GOSUB 1200
  3372. 1180 NEXT F
  3373. 1190 PRINT : PRINT"FILES COPIED =";FC;" - PRESS KEY"
  3374. 1191 GETKEY A$ : GOTO 520
  3375. 1200 FC=FC+1
  3376. 1210 X$=MID$(DI$(F),19,8)+"."+MID$(DI$(F),29,3)
  3377. 1220 CF$="":FORI=1TOLEN(X$):IF MID$(X$,I,1)<>" " THEN CF$=CF$+MID$(X$,I,1)
  3378. 1230 NEXT
  3379. 1231 IF RIGHT$(CF$,1)="." THEN CF$=LEFT$(CF$,LEN(CF$)-1)
  3380. 1232 CF$=CF$+","+MID$(DI$(F),14,1)
  3381. 1240 PRINT STR$(FC);". ";CHR$(34);CF$;CHR$(34);TAB(20);SZ(F)"BYTES";
  3382. 1245 PRINT TAB(35);MID$(DI$(F),9,3)
  3383. 1250 CL=CL(F) : LB=SZ(F) - INT(SZ(F)/65536)*65536
  3384.  
  3385. ╔ HAD TO USE A ─╧╨┼╬ STATEMENT HERE FOR DISK FILES BECAUSE THE REGULAR ╧╨┼╬
  3386. STATMENT DOES NOT REDIRECT THE ─╙ AND ─╙$ PSEUDO-VARIABLES.  ┘OU'LL NOTICE
  3387. THAT THE NON-DISK ╧╨┼╬ STATMENT BELOW HAS A SECONDARY ADDRESS OF 7.  ╘HIS IS
  3388. TO PUT THE PRINTER INTO LOWERCASE MODE IF YOU ARE OUTPUTTING DIRECTLY TO IT.
  3389. ┘OU CAN REPLACE THIS WITH A 5 (OR WHATEVER) IF YOU HAVE A SPECIAL INTERFACE
  3390. TO AN ╔┬═-COMPATIBLE PRINTER AND YOU WANT TO PRINT DIRECTLY IN ┴╙├╔╔.  ╔N THIS
  3391. CASE, YOU WOULD SELECT THE "┬╔╬" TRANSLATION MODE FOR THE FILE YOU ARE ROUTING
  3392. DIRECTLY TO THE PRINTER.
  3393.  
  3394. 1260 IF CD>=8 THEN DOPEN#1,(CF$+",W"),U(CD) :ELSE IF CD<>0 THEN OPEN 1,CD,7
  3395. 1265 IF CD<8 THEN 1288
  3396. 1270 IF DS<>63 THEN 1288
  3397. 1275 X$="Y" : PRINT "FILE EXISTS; OVERWRITE (Y/N)";
  3398. 1280 CLOSE 1 : INPUT X$ : IF X$="N" THEN FC=FC-1 : RETURN
  3399. 1285 SCRATCH(CF$),U(CD)
  3400. 1286 DOPEN#1,(CF$+",W"),U(CD)
  3401. 1288 IF CD<8 THEN 1320
  3402. 1300 IF DS<20 THEN 1320
  3403. 1310 PRINT CHR$(18)+"CBM DISK ERROR: "+DS$ : FC=FC-1 : CLOSE1 : RETURN
  3404. 1320 POKE PK+19,CL/256 : POKE PK+18,CL-PEEK(PK+19)*256
  3405. 1330 POKE PK+21,LB/256 : POKE PK+20,LB-PEEK(PK+21)*256
  3406. 1340 TR=0 : IF MID$(DI$(F),9,1)="A" THEN TR=255
  3407. 1346 X=1 : IF CD=0 THEN X=0
  3408. 1350 SYS PK+6,TR,X
  3409. 1355 RREG X,X,X,S : E=PEEK(PK+15)
  3410. 1356 IF (S AND 1) THEN GOSUB 380 : FC=FC-1
  3411. 1360 IF CD<>0 AND CD<8 THEN CLOSE1
  3412. 1370 IF CD>=8 THEN DCLOSE#1 : IF DS>=20 THEN 1310
  3413. 1380 RETURN
  3414.  
  3415. 6. ╒╒┼╬├╧─┼─ ╞╔╠┼╙
  3416.  
  3417. ╚ERE ARE THE BINARY EXECUTABLES IN UUENCODED FORM.  ╘HE ├╥├32S OF THE TWO
  3418. FILES ARE AS FOLLOWS:
  3419.  
  3420.    "LRR.128"    1106058594
  3421.    "LRR.BIN"     460671650
  3422.  
  3423. ╘HE "LRR.128" FILE IS THE MAIN ┬┴╙╔├ PROGRAM AND THE "LRR.BIN" FILE CONTAINS
  3424. THE MACHINE LANUGAGE DISK-ACCESSING ROUTINES.
  3425.  
  3426. BEGIN 640 LRR.128
  3427. ═└1╤+'└╚└├╥!,25143$4@4─5$(%)%041%4┬╨@0┼─@0╒)!24<@0┼)50╘4╠(#,╨
  3428. ═+5-%4"╘┘,┬╨@1─]2($,]($┴!0╘═)3─<@3─5434%'└%$<"╨└┌└(└<%└!#1++"
  3429. ═*#$╪-┬─@(#╚@├╥└╩*┬!$149!54╤4($-"32╒$3╒,@1%))5─4@*┬╚└╧!╨9└$16
  3430. ═╠├─┌1%2╥,"└@.┬└@├╥└╩*┬!-4╥╒$3╒,@1%))5─4╠(%194$4@*#└],34╫,2╨╥
  3431. ═-34],34╪,2─└\┴╨:└(╠@1%:╥0╘0@╔╥!$5╦(╪.─14╠├└@.┬"/("╚╩($%,5$52
  3432. ═3─%412!-4╥╒$3╒,@1%))5─4└^!╨;└#╚└&╤╘>└)─@╤╥@╤-#<╔.╥))3─┼424%,
  3433. ═25╔)3─<╬+┬╪┬(#╚@╞0└╥'2@└_@(╨(#╚@4$╬╥╘2@┬.#└╨,"(╔└%╨=,@"+(,(╚
  3434. ═4$╬╩.2╞╥╘2@┬0╘(┬*2"╧(,(╚4$╬╩,3└╔╠├$╙,2"╟(#8╨└)╨=-╨"9(─╤/041)
  3435. ═3─<@34%#2$┼.12!,04┘'54%'12!23╒5424┘%4╥╪╬+┬(@.┬#^$2),4┼(╬0─┼.
  3436. ═(┬╤5*$-$*0"_'3╨└┼╥!02┌╚╤-┬╤$5┬└┌()<@4$╬╩,3<╠1%0@.┬">(%!+└.,=
  3437. ═1@"&(%0╠4┬╤"+$─╠020╠0╥╤$5"0╠1─╨─+$┼,)"╤8+%@─└└(>4└"&($1))"@╤
  3438. ═,├@╔+$-,*#$╥."─╠4╒╚╚,3(╪*0└╩'┼╚└┬╥!$5+(╥-34@╔╥!$5"2╥(├$╒.#$┬
  3439. ═(#╦5($14)+(┬,34╫,2(└4!┘─└$9,)++'*#$┘*:╦'*#$╫*:╦'*#$╫*:╦'*#$╫
  3440. ═*:╦'*#$╫*0!╘'╞╪└24╨─╠─9,)#╩!2;(╤╔#$┘.─┼,)+))3"2╩╤╥@╤-╥─┌@@!^
  3441. ═'╟@└┬2└╒,#└└┴!┌"└#╚└╔┴┌#└(\@*┬╚@3$]!1"!-4╥╒$3╒,@1$┼214-43╒)9
  3442. ═("╚╩└,8>├└"9(─╤/041)3─<@1$┼214-43╒)9+┬╪╬(┬└┌()─└╓!┌6└)╪@4$╠@
  3443. ═.┬">(%!+╩├,└╪1┌@└$1,╠├└└└!^╩└/╪)($),+$1#+$)(+%,@.┬!%╠╠(╚4$╬╩
  3444. ═,34╔└!╚?═└"+("┴3(*\@,2─@╔╥"-(#,╪,"└┌((╪└.╤^^└)─┬4╘-!3─┘)3─<@
  3445. ═1$┼214-43╒)9+┬╪╬(┬└┌()─└3!_(└$1"╠─),╩├(╒-╩╤"2└!='](└┬╥!$0[(╨
  3446. ═(*<@,╙8╨└'╘?╫└"!($10╠─1"(*0@1$*╩,╙*╠*$1#╩╙$╔(*─@,╙(└╟1_╞└(╠@
  3447. ═╨┬┴$4"╞╥,""╨(,(╚1%└╔╠├(╥.2"╟(#,╒,└"╫'_└└┬╥#"*$10╩├$╥*2"╧(#(╘
  3448. ═(*<@,╙4╨└,,?^@!$3+)$3*╚╤└└<@!└%$)++)*"(@(╩╦$*$1,*2╨╙*:╚┬("└@
  3449. ═("!!4╘,@(%-%42└@(┬└┌((\@*┬╚@1$5&055,5"!314╨╧5%(╧1┼0@*┬╚└,┬└.
  3450. ═└4$─╠┬(┬(#╚@@4╞╥,*0╤,"└┌($$─╠─$─╩╠<╚╨┬┴$4*╔)*2─@.┬""└$╪@&└%!
  3451. ═)++(*$$─+#@╔╩┬(@("*╩╥2┴!)"╨╙*0!;("(!╞2!$3#╠@020└;2└╠└40─╠─0─
  3452. ═╩─$─╩┬(@("(└├┬└╓└4-,*$1,*;+"*$10╩├(╓*:╚╥-3:╠╨┬┴$4*╚╥-╥─└╬┬!└
  3453. ═└5-:╠╠(╚1%"╩,├@╔╩├(╒-╩╙"*$10╩├(┘*:╚╓-34╙-╩╙"*$10╩├,╨*0#;($╚!
  3454. ═1$──*$1,*;)$)*╦)*"(@("└@(╩╦$*%-:*2╨╓*0#╔(%0!4╒╚╚1$╨╔╠┼-:└/(@
  3455. ═7@&"($10└/@@:└&.└/╪@<@$┌└",┴<╨&/("╚╩(%)%4$]25"!-4╥╒$3╒,@1$┼3
  3456. ═2╥!%4┼)/4┬└╩*@!0(7╨!╞2#'*#$╪*3╠┬35,═1$]3($1)4╘╠@15)23╒(@(╥([
  3457. ═╥┬├$*$4╔+#(╔.╨!](88!╞2└┬("@─(├╧**-(╚12─╠,╥─[(┬─╠(%!215-3($═%
  3458. ═62╪┬.\<╚,30╓*0"+(9└!╚?─@020@.┬".└)$┴╞@$┌└*╨┴╞╨&/("╚╩(%-#4─5%
  3459. ═3┬!(14%$24┘'("╚╩└.$┴╔└&9╤╥@╤-#<╔.╥)-4╥╒$158](├╧**,0╚1%8╔+#(╔
  3460. ═.╥(@("└@35,═5%┼013╘┬.╘14)#╠└└┬*╬└9─┬("└@($-"32╒$158](├╧**,0╚
  3461. ═0╘0╔+#(╔.╔─└""*╪└8╪└#┬+"└3╚└*2+#└8\@*┬╚@4╘-2145.($9/3╒1)3─<@
  3462. ═*┬╚└72+,└9─@24╨─.╥)$/41)4─5#5$]262└@33╒-4╥╒$158@($8]0╘)-+41%
  3463. ═5┬!1/5%5250┬└(╘┬╒@&9(┼0]5$]'1╘╤%+4-/3%5-3┬╨@0╙╒#3╒!9+49)3$53
  3464. ═+"└╦+╥╘@4$%'12([└),┬╪└&.└)─┬┌@$┌└+(┬┌╨&/("╚╩($╒!24╪@4─]55$┼.
  3465. ═12└╩*@#└(╧0!5+(╤(#╚@0[(╨└,@┬_@%2╠├└└╘┬((└╚╘@-#(╨└└(├$@*9(").
  3466. ═54╘@(%,@(%123┬└@5%┼0("!&24╤%3─%-12└@15┴4("!,14┘'5$@┬└#(├'└*9
  3467. ═("(═+2╘@("╘@("╘═+2└@+2╘═("└═+2╘═+2╘═+2└@+2╘═("└═+2╘═+2╘┬└#╨├
  3468. ═)@*-(#0╓,└!7(╙└"0╦)4╩├$╫(#╚@┬╥!"╠41,(*<@0╦)$3└!╨(╙╚"╞2!&3"0[
  3469. ═.┬"+(%2╤1$╨@╔╥└╒.3└└├2-$└╚$@2;)4(*0@0┬└┌()─@1$──*$─╔(#╚@@@"╓
  3470. ═(╘╪"┬╥!$3+(╨(*<@╞2#'*#$╪*3╠┬/$┘/($9)3$53/┬([╤╥@╤-#8╔└,<├6└*+
  3471. ═($1,╠├└@╔╥└╓-├└└╫╥-┬└╔─@╥"┴)3"0╠4╩╚╒*3╧'*#$╪*3╠└]╥-╠└╔$@0┌╚╤
  3472. ═((─@-├,╨+#8╘,"╨╓-3└└&21╓└╔─@╔├0╔.\╚╚1$──*%2╩4┬─╠-2╨╙*2└┌((─@
  3473. ═-├8╨└#╠─@└*9(*8╫*3╧**$1))"┴4╩┼(╔+#@╠-2─@.┬")(#8╓,└!?)(╚"╞2"╞
  3474. ═,3(╔.\╚╚1$──*%2╩4┬─╠,3,╠-2─@.┬")(#8╓,└!╔))0"╚?─@020└─"2>└─╞╥
  3475. ═╒"@┬1$╒&5$,╦+5$@(╩╦'*#$╙*:╚┬─1&='1.3(┬╤!)"─└╩┬2╚└╔─@╥"┴)3"0╠
  3476. ═4╩╚╒*3═$220╚5*╔2*0"┌)+("┬╥!)╠├└@╔╥└╓,#└└!┬6\└╔%)┬3<╓,"╨╤,#4╨
  3477. ═+#$╤,3└╠.34╨+#$╤-3└╠,3└╨,"╨╤,#(╨+#<╙,"╨╪-├└╠.#8╨+#<╫,"╨╫.3└╠
  3478. ═.#$╨+#@╙,"╨╪-3└╠-3└╨└└╨┼╤@*0└!(┼╘└(┌└#,┼╘0*/("╚╩(%9!4─┼/55,@
  3479. ═345.52!/4%1)3╘┘3("╚╩└%<┼╓@*9(,<╚,30╫*3╠┬2$%612!!3┬!!5╘533╘╒%
  3480. ═($1!62╪┬└%╘┼┘└*└└'<┼^└*-(#0╥,"└┌((╘@,30╨(#╚@┬2└╒,#└└─24"└╒*╥
  3481. ═4╩╠╤(#╚@┬╥!2╠╙└@╔╥!2╠─*╦5└";)0╨#┬2└╓,#└└═246└╒*╥4╩╚╤(#╚@┬╥!4
  3482. ═╩┼*╤0┬"╟(%*╥,└"_)2└#┬2└╓,#└└╒╥4╩└╘.╥0┌╠╤(#╚@┬╥!#╠╙└@╔╥!#╠├(└
  3483. ═╪24╘└╪─@-├└╨└/─┼/@-#╠─.╩,2└┌((╠@0[$╥(*<@0[(╨└└,╞2└.)(#8╨,└└9
  3484. ═)┼(#4╦(╨(#╚@0[(╨(#╚@┬2└╓,#└└*┬9<└╪╠@1$╥╥,""╟(#8╨,└!*)╞8#6+)4
  3485. ═╩┼(@.┬"1($.╩,2"-(#@┘,"╨┘,3└╠.3,╨└&╚╞<└.9(,@╚24╨─+%*╩-2─[1$──
  3486. ═*%@╔(#╚@┬2└╓,#└└┼29┌└╪╠@╥┬┴$220╚6"─╠-┬╨╤*;(┬("(@╔╥!8)+(┬*┬(@
  3487. ═.═4@6"2╥(┬└┬└*╪╞┴└/**$1))"┴8*2╨╓+#$╔╠┼@─(#╚@├@#=)╚╪#┬╥#**$1)
  3488. ═)"┴8*2╨┘+#$╔╠┬)!(┬"╟(%@─╠┬)"24╪┬(#╦5(%@─╠┬)!4╘,┬└/8╞╞└/**$1)
  3489. ═)"┴8*2╨┘+#,╔╠┼@─(#╚@├@└╞)┌(#┬╥#**$1))"┴8*2╨╤-"╨╤*;(┬4╥(@╔╥!8
  3490. ═)+(┬4%)'(┬└┌╒2!8)+(┬4╘51(@!└)┌╨#╥┬┴$220╚6"─╠,30╠,╥╞╥6"0@.┬".
  3491. ═└%$╟═@.+($1,╠├└@╔╥└╓,#└└8"?└└╪$@6+(╤(*0@1$╨└>"?*└┘$@0┌╚╤((╘@
  3492. ═.#─╨+#─╤,"╨┘,╙└└@"?4└╪(@6└"*)]╪#┬2└╒,├└└╚╥?╚└╪╠@0╦)$3""╟(%2╥
  3493. ═,2└┌((─@-3$╨└+8╟\@-4╠┼2╩,3@@.┬")(#4╤,└#┬)_╨#┬╥!4╠├$@╔╥!4╠─1,
  3494. ═╩╥┴$3*╬╒*$1,╦3$╪*:╨╤."╞╩,2└┌((─@-3$╨└/╠╟!@14╠┼2╦,3@@.┬"+(%2╙
  3495. ═,2"╟(%2╥,0└%*!└$┬2└╒,3└└&┬@:!)─@24╨─.\<╚,├<╔.╥)└(├╠└0"@─!(4┬
  3496. ═35,═1$]3($1%5─┼#12!.54╒"15(@*#@═,╙└╔(├═$5@"%*"4$┬╥!#1+)$5┬"╟
  3497. ═()─┬35,═1$]3($%.1"!#0─╘═1$]3($1%5─┼#15,@35535"!"12!$249&15)%
  3498. ═3┼0┴(├╩),3└╓,└"╩*"╪$┴2)-4╥╒$3╒,@1$5624-%(%194$4@("@╫,2\╪,2─┬
  3499. ═.╒@└┌╥@╪!(╠@6+(╪(+└@6+(╪,2"╨(%┬╥,34╪,2"╟($14╠├(╒-3╔$5"2╥(├$╒
  3500. ═.#$┬(#╦5($14╠├└┌1%0─╠┬(╤-3<╤(@└.*4($┼╥!02┌╚╤-┬╤$5┬└┌()<@4$╬╩
  3501. ═,3<╠1%0@.┬">(%!+└!@╔3└2)(#4╥,└└═*58$╞2!)3"0[╤╥@╥-╥─[(─└┬.╨!5
  3502. ═*6└$┴2└┬0╘)-+41/4╥!$159)0╘4@3┼5-0─52("@╨+3,╨*2([0╘0└╞┬┼╩!(╠@
  3503. ═0╘2╥1%8@╔╥"9(─╒3+41/4╥!!3─0@0╘)-+41/4╥!$159)0╘53($╒54╒0@0─4@
  3504. ═1$┼&1─5214┘4(2(┌┬3$╤,├└└╔"┼╘!(─@-3(╨└*╚╔=00┌└,$╔=@2/("╚╩($-/
  3505. ═4%─@1─┼,15,@*┬╚└╫╥┼^!)─@╤╥@╤-#<╔.╥)#3╒!9($9)3$53(├╩9.╔─└^┬╞(
  3506. ═!(╠@1$╥╥,""╟($9#╠├└@.┬")(#$╤.3└└+╥╩2!$9#╠├└@.┬"!($:╥,2"─($1,
  3507. ═(#╚@┬╥#**$1))"┴&*2╨╓+#$╔╠┬(╩(┬"╟((╘@,3(╨,└└╫*╔╨$@┬!&└&,╩╔@29
  3508. ═(#╚@╞2)&24╤%4╥!#3╒!)140@/2([1─,[(┬└═(%!215-3($═%62(└=2╩╟!*'┘
  3509. ═($$─(#╚@┬2└╒,├└└@2╩╨!$9#╠─9#╩├$└╩┬╩┌!%@─╠╠╚╚1$──*$8╔+#$┘+#@╔
  3510. ═╩┬(╬(╩╦**$1))"┴&*2╨╥.2╨╙*0#┼*╠0$0╘8─╠┬(┬.╚%)╠├&─╨╥┴8)"─┌┬╥#*
  3511. ═*%@─+$─╠,2╞╙╠2(@(┬"╟($-&)+)#1┬2╩╥┬┴8)"╤)+#$╔└.╠╩╙@2"└!0╦╙╨2+
  3512. ═(,─╚0╘8─+#$╔╠┬(╬(┬"╟($-&)++(*$-&)"╙#*$-&)"╞╦,2─└,╥╧0!$-&)+)#
  3513. ═1┬2╩(┬╨┬╩╠╚╚1$──*$8╔+#$╘+#$╔└&<╦╓└29(,0╚1─,╔.╥(╬("([╤╥@╙-"─[
  3514. ═0╘8─.\<╚,╙0╔.┌,╥,"─[4╒╚╚1┬─┬0┼┼415,┬.╨"└*]╘$╞2"├,╙4╔.\╚╚1$──
  3515. ═*$8╔+#─╠,╥─└╦╥╧┬!$-,╠─-,*$8╔(#╚@3$*╥4╒╚╚1┬─@╩╥"╒*%-:*$8╔╦38╒
  3516. ═-3,╓*:╨╓-34╙-@#╔*^╨$┬╥!#1+&╥.""╟(/╪-(╙$╠*$-&)*╚┬+%<┬*2╤5*$-$
  3517. ═*2└┌╒2"+($-$╠[$╨(*<@╟╥└╤+$-$+#<└^╥╧╤!(╠@0╘2╙.""╟(#$╥.#@└#╥╙╓
  3518. ═!(╠@1%.╙╠38╙(*<@,3(╪.└└^+/╠$6"2╥(┼─┬(#╚@╞2└┬1─┼,12!%6$┼35%,[
  3519. ═($]615)74─┼412└╚62].*2([└&8╠└└6@(#$@.┬"%(%@─(#╚@┬╥!8)+(┬3┬(@
  3520. ═╔╥!&0[)&0┌╠╤(#╚@├@!╫+└4%\┬┴#1┬0╔+%4╚0╘0╔└)$╠!@7^#2,╤+"┴#1┬2╩
  3521. ═(┬╤7(┬─╠52┴#1"─└╚╥╨(!8╠@0╘2╙.""╟(#$╙,├└└═┬╨4!8╠@1%.╙,├└@╔╥└╤
  3522. ═,╙(╨└.╨╠'@69(,<╚,3@╔╩┬)#0─╘@1$┼32╥!%4┼)/4├╚@(╩╔$4╥0@.┬!&0[)&
  3523. ═0┌╠╤(#╚@╚#$@.┬".└!─═*└67(%!+╩├$┘+$-,╦3(╒-┬└┌()<@4$╬╩,3@╠0╘╥╦
  3524. ═╨┬┴02┌╚╤.2╞╠,├4╓└$8═,@67(%!+╩├(╤+$╤"╦3(╒-┬└┌()<@4$╬╩,├└╠3$*╦
  3525. ═╨┬┴02┌╚╥,2╞╠,├4╓└&╪═/└544╦(╨(#╚@┬╥#**$1))"┴&*2╨┘+#$╔╠┬)!(┬"╟
  3526. ═(%12╠├(╒-0"%+4(%6+(╤(#╚@┬╥!#1+(╨(*<@6+(╨└)4═1@6>(%!+╩├8╠5%(╠
  3527. ═6└"╤+4╠%_@─@6"╤8+%@╠4╥└┌($6╥╨┬┴02┌╚╤-2─└╘2╒,!8╠@*%,@╦╥└╤*2"╟
  3528. ═((╘@,╙@╨(#╚@1─.╥1─.╦,0#╔+5└%┬╥!#1+.╤,""╧($-$╠╙@@╔╥"@,0└.+┼╚%
  3529. ╔┬╥!#1+&╥.""╟(/╪/(╙$@.┬"+($13╠;(╥,""╟(#$╙,3└└%"┘─!8╪└└└└└
  3530. END
  3531.  
  3532. BEGIN 640 LRR.BIN
  3533. ═└(!,68%,3╚),#╚3+@╨└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└2*─└
  3534. ═┴="═$(└@╠?^╔;╥"3_┌┼5(*├_)-└╨#┌─╨(*├_:""╚_╥30,└(88*─%├0^└.&"═
  3535. ═└-╒)$(╘└╫6"╔""╨-╫/#[8"!@@*╪,╫"!7@(╔@╩1╚@*("0└6└@╦╧\─╘##.&"!'
  3536. ═_╥╨-╫"!7@"!╚@(╘/@"─/╥0*╨):└└(&┬└╞2*└╥,└&─/48╩0@@*("0└6"╔└2╨1
  3537. ═@#└"╩00@╩/\@╦╧]@2(╚╔└0╚*"@╚╠$8└0└──0("┬└─└%@:""╚_┌─!(*├_╩0─@
  3538. ═╩/\@╦╧]╪&"!'_╥╨-╫"!7@*─╪╚(6%└╚0#╩0"%!"╨1@#└#(!.!("╬!╠└╟╞!*4$
  3539. ═╥0╞0┌╤┴88*─╪┴0*╞!!┬╔┴7╘┬@84#8└└($└8.!└╨""┬!╚@(╘/@"─/╥0*0└6"┬
  3540. ═└╩└└╩0@╠#=╙╨^┌╘└╫4─0├0#=╦0╙<─0+(╘.╟╞└\╦0┘&"╔#╚╘└_┌╟_├2"└├2&└
  3541. ═&&#-((#0$.╨┴@-└+┬)@*&&╞%╩*─╪&&"-((".(8"$!2"^@)└9╦0^└*0_)"_└"
  3542. ═.&└@<╪"═(("╬(8"─!9#;8*╘@@*╪┴@*0%3&┬!╚╧_╚..─2╠/╩($/<8:1+(╩(╔@
  3543. ═(*┌!╚@#└"9└(2)├╔":┴╚╚@'(8(8+(,"!┴0┬&"80*╔0┬╞":0*(&┬!─└%@┴0╥$
  3544. ═#:("╚└"╤#)$&╥+$,─0;(╘/3╞#>8'╥═#═┘@╩┼"╠─*─!*╔└84*┘@╞┼"<─"─└:╔
  3545. ═└(4)┘@├&"]"[&&└╪┌0*╨└8┬╬%╚#@└?└'"╚0')@>─!╤┴═'("0└<┬┬.(8&╚╔>&
  3546. ═!┌╪6@$╙3@:─.├0#_╩0"@└"#└@2!╚@9└!8(4"┴└.@#;$"├1:└╥0.0!┌─\├0^└
  3547. ═.&"@$+$"╥0+0\:└6╠0*-%╪#)!+#╞╚!&╤└╚╘9@,╞!╠-═*2─╔*├1┬└╚!.╤└╚╘:
  3548. ═@,┬╤└╚╘;@*└8╠0+)"="_╚!╩╤└╠─"╘+>@#╦$"╥0'0╦┌╘7@└╚8:0&-'8└8;1┬└
  3549. ═├1╥└╦1╩└╦!╬└..╘<@+└!┬(╘>@(╨?@*╘6@,─"╘└9.'╪!╬'╚"╔.*";┴0:$!┌─!
  3550. ═╚└"╬%╪└@╘╪&0└6"╔.*"┴┴0:$!┌╘=@*└└╦┴┬└(-.!─└%@╩3┬@╚:╪9@!┴@┴06$
  3551. ═└╘8#:╚4$╔@,*)@,8902%└╚╔┼└╪4#&*4":3┬%└╩4#:9╬%└┌└"╠0*9!@"($/┬┼
  3552. ═!2─!╘└┬┼!╥─/╩*4&8*4'╚@1&"&╦*╘/╩─"&"┼9*1┼("6"─└%@╩3┬@┼╪5@┴&&╔
  3553. ═└(5┬╦1:└"╚5├╔62─92└┼@╪5─┴&7)_]└@╨└_0'*╘4@(5┬╩0&╬%╚#@└?└"╩0,═
  3554. ═%8#0!:╪4@/└"┴6,@╧╚-@╔@_0└┴┴@(,╟_─└2-#╪!@╩?^╞8]└"╔6*%9╩└└╠6└─
  3555. ═#┴└&╩╦╘╪┴/└#(-+_╥,1╞╘.╨8╔6!┼9╚5@─└+╞83┬┼8╬5╞┴6*╨└╠9├╔6(%8]#$
  3556. ═(,╙_&&"@#╚╨└_╪4.┴@^═$╚"╠$╪"%9(1┼3"╩$(&^#─└%@╔63)_]#╘╔67)#]#╬
  3557. ═&&└└└└└└└└└└└!0)#0"3└└└└└└└└└└└└└└└└└└└└└└└└└"└┴(┬,─)28╟*"─╩
  3558. ═*╥╨═+┬\╨,3(╙-#4╓-╙@┘.├╠\/3╪_0,'"╨\3%╤╠?(╥<╦+╙,╫.╙]#1╘═/4╒=;7
  3559. ═╓-╟:6╒╤=7┼_└04)#1$5&1╘┴)2─═,34┘/4%%24╒155┼=865╦;╫-╫>╫╨└└└└└└
  3560. ═└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└
  3561. ═└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└
  3562. ┴└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└
  3563. END
  3564.  
  3565. 7. ┬╔┬╠╔╧╟╥┴╨╚┘
  3566.  
  3567. ╘HE FOLLOWING WORKS WERE CONSULTED IN CREATING THIS ARTICLE:
  3568.  
  3569. [1] ╩IM ┬UTTERFIELD, "╩IM ┬UTTERFIELD'S ├OMPLETE ├128 ═EMORY ═AP",
  3570.     _╘HE_╘RANSACTOR_, ╓OLUME 7, ╔SSUE 01, ╩ULY 1986 (┴ ═UST!).
  3571.  
  3572. [2] ├OMMODORE ┬USINESS ═ACHINES, _├OMMODORE_1571_─ISK_─RIVE_╒SER'S_╟UIDE_,
  3573.     ├┬═, 1985.
  3574.  
  3575. [3] ╙OME PROGRAM CALLED "MSDOS-TO-128" INCLUDED WITH "CS-DOS" BY
  3576.     ═. ╟-SOMETHING.  ╧RIGINALLY PUBLISHED IN ├╧═╨╒╘┼!'S ╟AZZETTE, ╔ THINK.
  3577.  
  3578. [4] ├OMMODORE ┬USINESS ═ACHINES, _├OMMODORE_128_╨ROGRAMMER'S_╥EFERENCE_╟UIDE_,
  3579.     ┬ANTAM ┬OOKS, 1986.
  3580.  
  3581. [5] _╘HE_╘RANSACTOR_, ╓OLUME 4, ╔SSUE 05 ("╘HE ╥EFERENCE ╔SSUE"), ═AY 1983.
  3582.  
  3583. =============================================================================
  3584. ╬EXT ╔SSUE:       
  3585.  
  3586. ╠EARNING ═ACHINE ╠ANGUAGE - ╨ART 5
  3587.  
  3588. ╘HE ╙╨┴├┼ ╔╬╓┴╙╔╧╬ IS CONTINUED WITH THE DESIGN AND IMPLEMENTATION OF THE
  3589. PLAYER AND ALIEN ANIMATION ALONG WITH A LOOK AT DEVICE SCANNING FOR THE 
  3590. 1351 MOUSE, JOYSTICK AND KEYBOARD.
  3591.  
  3592. ╘HE 1351 ═OUSE ─EMYSTIFIED
  3593.  
  3594. ╞INALLY! - ┴FTER 2 DELAYS, THIS ARTICLE WILL EXPLAIN HOW THE 1351 MOUSE
  3595. WORKS AS WELL AS PROVIDE A EASY TO USE INTERFACE IN MACHINE LANGUAGE FOR
  3596. BOTH BASIC AND MACHINE LANGUAGE PROGRAMMERS.  ┴N EXAMPLE PROGRAM WILL BE
  3597. GIVEN TO ILLUSTRATE BOTH THE 1351 MOUSE AND THE MULTI-TASKING SYSTEM.
  3598.  
  3599. ═ULTI-TASKING ON THE ├=128
  3600.  
  3601. ┴ RUDIMENTARY MULTI-TASKING SYSTEM WILL BE IMPLEMENTED FOR TASKS TO RUN
  3602. CON-CURRENTLY WITH EACH OTHER. ╫HILE INTENDED FOR MACHINE LANGUAGE PROGRAMMERS
  3603. SOME DISCUSSION OF HOW TO USE THIS WITHIN BASIC WILL BE GIVEN SO THAT MORE THAN
  3604. ONE BASIC / ML PROGRAM CAN BE RUN AT A TIME. ┴N EXAMPLE PROGRAM WILL BE GIVEN TO
  3605. ILLUSTRATE BOTH THE 1351 MOUSE AND THE MULTI-TASKING SYSTEM.
  3606.  
  3607. ╙TRETCHING SPRITES
  3608.  
  3609. ┘OU MIGHT HAVE HEARD THAT IT IS POSSIBLE TO EXPAND SPRITES TO MORE THAN TWICE
  3610. THEIR ORIGINAL SIZE. ┬UT THERE IS NO NEED TO EXPAND ALL OF THEM EQUALLY. ╘HIS
  3611. ARTICLE WILL EXAMINE ON HOW TO EXPAND THEM 2,3 OR MORE MULTIPLES OF THEIR 
  3612. ORIGINAL SIZE.
  3613.  
  3614. ╠╔╘╘╠┼ ╥┼─ ╫╥╔╘┼╥: ═╙-─╧╙ FILE WRITER FOR THE 128 AND 1571/81 DRIVES.
  3615.  
  3616. ╘HIS ARTICLE WILL EXTEND THE ╠ITTLE ╥ED ╥EADER PROGRAM TO BE ABLE TO WRITE
  3617. ├OMMODORE-─╧╙ FILES TO AN ═╙-─╧╙ DISK.
  3618. =============================================================================
  3619.