home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-02-12 | 152.6 KB | 3,621 lines |
- ########
- ##################
- ###### ######
- #####
- ##### #### #### ## ##### #### #### #### #### #### #####
- ##### ## ## #### ## ## ## ### ## #### ## ## ##
- ##### ######## ## ## ## ##### ## ## ## ## ##
- ##### ## ## ######## ## ## ## ### ## ## #### ## ##
- ##### #### #### #### #### ##### #### #### #### #### #### ######
- ##### ##
- ###### ###### ╓OLUME 1, ╔SSUE #4
- ################## ╧CTOBER 5, 1992
- ########
-
- -----------------------------------------------------------------------------
- ┼DITOR'S ╬OTES:
- BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
-
- ═Y APOLOGIES ABOUT THIS ISSUE BEING POSTED LATER THAN WAS MENTIONED IN A
- PREVIEW POST ON COMP.SYS.CBM NEWSGROUP. ─UE TO SOME PROBLEMS WITH CODING,
- SCHOOL AND ═URPHY'S LAW THE ISSUE HAD TO BE DELAYED UNTIL NOW.
-
- ╔ HAVE ASKED THE SYSTEM ADMIN'S AT MY SITE CONCERNING A MAIL-SERVER BUT THEY
- SAID THEY DID NOT HAVE ENOUGH MAN-POWER (GO FIGURE) TO GET SOMEBODY TO RUN IT.
- ╔ WILL BE IMPLEMENTING A MAIL-SERVER SYSTEM IN MY ACCOUNT IN THE NEAR
- FUTURE FOR RETRIEVAL OF PROGRAMS AND BACK-ISSUES. ╔'LL POST DESCRIPTIONS OF
- HOW TO USE IT IT THE NEXT ISSUE OF ├= ╚ACKING AS WELL AS ON THE NEWSGROUP
- COMP.SYS.CBM WHEN ╔ FINISH WRITING IT.
-
- ╔N THIS ISSUE OF ├= ╚ACKING WE ALSO START ON AN AMBITIOUS TASK: ─EVELOPING
- A GAME FOR BOTH THE ├128 AND ├64 MODES THAT INCLUDES ALL OF THE FEATURES
- FOUND IN COMMERCIAL GAMES. ╘AKE A LOOK IN THE ╠EARNING ═╠ ├OLUMN FOR MORE
- INFORMATION.
-
- ┴LSO, ╘HE ARTICLE CONCERNING THE 1351 MOUSE HAS _AGAIN_ BEEN DELAYED DUE
- TO TIME CONSTRAINTS. ╥EST ASSURED THAT IT WILL BE IN THE NEXT ISSUE OF
- ├= ╚ACKING.
-
- ╔F YOU ARE INTERESTED IN HELPING WRITE FOR ├= ╚ACKING PLEASE FEEL FREE TO
- MAIL DUCK@PEMBVAX1.PEMBROKE.EDU (OR DUCK@HANDY.PEMBROKE.EDU). ╫E'RE ALWAYS
- LOOKING FOR NEW AUTHORS ON ALMOST ANY SUBJECT, SOFTWARE OR HARDWARE.
-
- ================================================================================
-
- ┴LSO NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS FTP FROM
- CCOSUN.CALTECH.EDU UNDER PUB/RKNOP/╚┴├╦╔╬╟.═┴╟.
-
- ================================================================================
-
- ╬╧╘╔├┼: ╨ERMISSION IS GRANTED TO RE-DISTRIBUTE THIS "NET-MAGAZINE", IN
- WHOLE, FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL
- AUTHORS FOR PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPERATELY.
-
- *** ┴╒╘╚╧╥╙ ╠╔╙╘┼─ ┬┼╠╧╫ ╥┼╘┴╔╬ ┴╠╠ ╥╔╟╚╘╙ ╘╧ ╘╚┼╔╥ ┴╥╘╔├╠┼╙ ***
-
- ================================================================================
- ╔N THIS ISSUE:
-
- ╠EARNING ═╠ - ╨ART 4
-
- ╔N THE NEXT ISSUE WE'LL EMBARK ON A PROJECT OF MAKING A SPACE INVADERS STYLE
- GAME FOR THE ├=64/128 FROM SCRATCH USING CUSTOM CHARACTERS, INTERRUPT-DRIVEN
- MUSIC, ANIMATION, USING THE JOYSTICK, MOUSE OR KEYBOARD. ╘HE ├64 AND ├128
- VERSIONS WILL BE DEVELOPED CON-CURRENTLY, EACH PROGRAM TAKING ADVANTAGE OF
- THE MACHINE'S CAPABILITIES. ╘HIS IS THE FIRST IN A SERIES - WRITTEN BY
- ├RAIG ╘AYLOR.
-
- ╘HE ─EMO ├ORNER: ╞╠╔ - MORE COLOR TO THE SCREEN
-
- ┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64.
- ╞╠╔ PICTURE CAN HAVE ALL OF THE 16 COLORS IN ONE CHARACTER POSITION.
- ╫HAT THEN IS THIS ╞╠╔ AND HOW IT IS DONE ? ╫RITTEN BY ╨ASI '┴LBERT' ╧JALA.
-
- ╥╙-232 ├ONVERTER
-
- ╘HIS ARTICLE DETAILS PLAN FOR A ╒SER PORT ╘╧ ╥╙232 CONNECTOR USING JUST ╧╬┼
- ╔├ AND 4 CAPACITORS. ╘HE CIRCUIT IS INCLUDED, AND SUGGESTIONS ON ALTERNATIVE
- CHIPS AND PARTS ARE EXAMINED. ╫RITTEN BY ╫ARREN ╘USTIN
-
- ╔NTRODUCTION TO THE ╓╔├-╔╔
-
- ╘HIS ARTICLE EXAMINES THE ╓╔├-╔╔ CHIP IN DETAIL AND PROVIDES AN EXPLANATION
- OF THE VARIOUS REGISTERS ASSOCIATED WITH THE CHIP. ╫RITTEN BY ╨ASI '┴LBERT'
- ╧JALA.
-
- ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
-
- ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
- OF ═╙-─╧╙ DISKS. ╘HIS PROGRAM COPIES FILES FROM DISK TO DISK SO TWO DISK
- DRIVES ARE REQUIRED TO USE IT (OR A "VIRTUAL" DRIVE). ╘HIS SCHEME IMPOSES NO
- LIMIT ON THE MAXIMUM SIZE OF A FILE TO BE TRANSFERRED. ╘HE USER-INTERFACE
- CODE IS WRITTEN IN ┬┴╙╔├ AND PRESENTS A FULL-SCREEN FILE SELECTION MENU. ╘HE
- GRUNT-WORK CODE IS WRITTEN IN ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM
- VELOSITY. ├OMPLETE, EXPLAINED CODE LISITINGS ARE INCLUDED. ┬Y ├RAIG ┬RUCE.
-
- =============================================================================
- ╠EARNING ═ACHINE ╠ANGUAGE - ╨ART 4
- BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
-
- +---------------------------+
- ▄ ╙PACE ╔NVASION - ╨ART 1 ▄
- ▄ ▄
- ▄ ╨ROGRAMMING: ├RAIG ╘AYLOR ▄
- ▄ ╟RAPHICS : ╨ASI ╧JALA ▄
- ▄ ═USIC/╙OUND: ▄
- ▄ ▄
- +---------------------------+
-
- ╔. ╔NTRODUCTION
- ------------
-
- ╔N THIS AND FUTURE ╠EARNING ═ACHINE ╠ANGUAGE'S WE WILL DEVELOP A GAME CALLED
- ╙PACE ╔NVASION. ╘HE GAME WILL BE SIMILAIR TO ╙PACE ╔NDVADERS AND WILL RUN ON
- THE ├OMMODORE 64 OR THE ├OMMODORE 128 IN 80 COLUMNS. ╔T WILL FEATURE ALL THE
- "FEATURES" AND "PARTS" THAT ARE FOUND IN COMMERCIAL GAMES WITH INTERRUPT-
- DRIVEN MUSIC, CUSTOM CHARACTER DEFINITIONS, 100% MACHINE LANGUAGE, MULTI-LEVEL
- GAME PLAY, AND INPUT FROM THE KEYBOARD, JOYSTICK OR MOUSE.
-
- ╬OTE ▄ ╔ AM LOOKING FOR SOMEONE TO HELP AID MUSIC COMPOSITION THAT WILL
- -----+ BE INTRODUCED IN A LATER ISSUE. ╨ROGRAMMING OF THE 6502 IS HELPFUL
- BUT NOT A REQUIREMENT. ╨LEASE EMAIL ME AT DUCK@PEMBVAX1.PEMBROKE.EDU IF
- YOU ARE INTERESTED.
-
- ═ANY THANKS TO ╨ASI ╧JALA FOR HIS WORK WITH THE GRAPHICS IN THIS PROGRAM.
-
- ┴LSO PLEASE NOTE: ╘HIS ENTIRE PROGRAM HAS BEEN ASSEMBLED SUCESSFULLY WITH
- THE ┬UDDY-128 ASSEMBLER FOR BOTH THE ├=128 AND ├=64 VERSION. ─UE TO THE
- LENGTH OF THE SOURCE FILES (OVER 1,500 LINES) ╔'M NOT SURE IF ┬UDDY-64 WILL
- HANDLE IT. ╘HUS IF YOU GET ERRORS DURING ASSEMBLY, ALL ╔ CAN SAY IS: SORRY.
- ╔F THIS IS THE CASE THEN THE NEXT ISSUE WILL HANDLE DIVIDING THE PROGRAM AND
- DATA UP INTO SEGMENTS WHICH CAN THEN EACH BE LOADED SEPERATLY.
-
-
- ╔╔. ═ACHINE ╬OTES
- -------------
-
- ╘HE ├OMMODORE 64 AND 128 PROGRAMS FOR ╙PACE ╔NVASION WILL DIFFER SLIGHTLY,
- MOSTLY IN THE FOLLOWING AREAS:
-
- - CUSTOM CHARACTER DEFINITION
- - MEMORY INITIALIZATION / SETUP
- - SOUND / MUSIC
-
- ┬ECAUSE THE ACTUAL GAME PLAY AND THE CHANGES NESSCESARY BETWEEN THE AREAS
- LISTED ABOVE, WE WILL USE THE ┬UDDY ┴SSEMBLER NOTATION FOR CONDITIONAL
- ASSEMBLY TO ALLOW THE DEVELOPMENT OF ONLY ONE FILE CONTAINING THE SOURCE
- CODE. ╔N ADDITION TO CONDITIONAL ASSEMBLY MOST OF THE ROUTINES WILL BE
- WRITTEN AS ONE WITH JUMPS TO SUBROUTINES CONTAINING THE ├64 OR 128 DIRECT
- CODE AS THE ALGORITHIMS ARE USUALLY THE SAME FOR EACH.
-
- ╔N ADDATION THERE WILL BE SEVERAL SOURCE FILES AND SOME MISCELLANEOUS INCLUDE
- FILES FOR GRAPHICS AND SOUND. ╞OR THOSE OF YOU WHO ARE OR WILL BE CONVERTING
- THE ASSEMBLY SOURCE OVER TO A DIFFERENT ASSEMBLER THE CONDITIONAL
- ASSEMBLY DIRECTIVES .IF (CONDITION) WILL ONLY BE TRUE IF THE CONDITION IS
- NON-ZERO. ╔E: IF THE SYMBOL COMPUTER IS DEFINED AS 128 THEN THE FOLLOWING
- EXAMPLE ILLUSTRATES IT:
-
- COMPUTER = 128
- .IF COMPUTER-64 ; NON-ZERO ANSWER SO THEREFORE
- ; 128 CODE GOES HERE
- .ELSE
- ; 64 CODE GOES HERE
- .IFE ; END THE .IF CONDITION.
-
- ┴LSO NOTE THAT FOR MUCH OF THE PROGRAM WE WILL _NOT_ BE USING THE COMPUTER
- ROUTINES AND INSTEAD BE DEVELOPING OUR OWN.
-
- ╔N ADDITION THE PROGRAM WILL SHOW YOU HOW TO USE ╔╥╤ INTERRUPTS TO SIMPLIFY
- PROGRAMMING. ╫E WILL BE USING THEM TO PLAY MUSIC IN THE BACKGROUND ON THREE
- VOICES (SOUND EFFECTS WILL TEMPORARILY PRE-EMPT THE THIRD VOICE FROM PLAYING).
- ┴LSO ANIMATION OF CHARACTERS WILL BE DONE VIA THE ╔╥╤. ┴ LITTLE BACKGROUND
- ON INTERRUPTS FOR THOSE OF YOU WHO ARE A BIT HAZY ON WHAT THEY ARE OR HAVE
- NEVER SEEN THEM BEFORE (┴LSO TRY TAKING A LOOK AT ╥ASTERS: ╫HAT THEY ARE AND
- HOW TO USE THEM IN ├= ╚ACKING #3 - ╫HILE THIS DOES NOT NECESSARILY COVER
- WHAT WE ARE GOING TO BE USING INTERRUPTS FOR IT DOES DESCRIBE THEM QUITE
- WELL.) ┬ASICALLY THE COMPUTER GENERATES AN INTERRUPT EVERY 1/60TH A SECOND
- FROM A TIMER ON THE COMPUTER (USUALLY FROM THE ├╔┴ CHIP OR THE SCREEN FOR
- THOSE OF YOU WHO ARE CURIOUS). ╘HE COMPUTER WILL SAVE ALL THE REGISTERS, JUMP
- TO A SUBROUTINE - PERFORM THE INSTRUCTIONS THERE (USUALLY UPDATING TIME,
- SCANNING THE KEYBOARD ETC...) AND THEN RECALL ALL THE REGISTERS AND RETURN
- TO THE USER PROGRAM. ╘HIS IS AN INTERRUPT. ┴N ╔╥╤ INTERRUPT DESCRIBES AN
- INTERRUPT THAT WE CAN ALLOW TO BE "TURNED ON" AND "TURNED OFF" - IE: WE
- CAN TEMPORARILY DISABLE IT IF WE HAVE TO. ┴ ╬═╔ INTERRUPT DESCRIBES AN
- INTERRUPT WHICH WE CAN _NOT_ TEMPORARILY DISABLE -- WE WILL NOT BE USING
- ╬═╔ INTERRUPTS IN THIS PROGRAM.
-
-
- ╔╔╔. ╘HE ╨ROCESS
- -----------
-
- ╨ART OF WHAT THIS SERIES OF ARTICLES IS FOCUSED AT IS THE DEVELOPMENT OF BEING
- ABLE TO ANALYZE PROGRAMMING TASKS AND BREAK THEM DOWN INTO SMALLER WORKABLE
- PROBLEMS. ╧NCE THESE PROBLEMS OR SUBROUTINES ARE COMPLETED YOUR ORIGINAL
- PROBLEM IS SOLVED.
-
- ╠ET'S TAKE THIS APPROACH TO ╙PACE ╔NVASION:
-
- ╨ROBLEM ╙TATEMENT: ┬UILD A ╙PACE ╔NVADER PROGRAM CALLED ╙PACE ╔NVASION.
- -----------------
-
- ╒SUALLY, GIVEN A PROBLEM YOU HAVE TO RE-WORK THE PROBLEM STATEMENT TO
- ENCOMPASS ALL OF WHAT YOU WANT. ╠ET'S TRY AGAIN:
-
- ╨ROBLEM ╙TATEMENT: ─EVELOP A ╙PACE ╔NVADER PROGRAM CALLED ╙PACE ╔NVASION
- ----------------- UTILIZING THE 64 OR 128 SCREEN WITH INTERRUPT DRIVEN
- MUSIC / SOUND, AND ALLOWING INPUT FROM THE KEYBOARD,
- JOYSTICK OR MOUSE.
-
- ╚MMM... ╘HE PROBLEM STATEMENT LISTED ABOVE IS BETTER BUT IT HAS NO REAL ORDER;
- WE HAVE NO CLEAR IDEA OF WHERE TO START AND WHAT WE NEED TO DO. ╔T DOES
- HOWEVER TELL US THAT WE HAVE THE FOLLOWING SECTIONS:
-
- - 64 / 128 ╙CREEN ╚ANDLING
- - ═USIC / ╙OUND
- - ╔NPUT ╚ANDLING
- - ╟AME ─RIVER (IMPLIED)
-
- ╠ET'S THINK A BIT MORE ABOUT EACH OF THESE SECTIONS AND WHAT EACH WILL
- INVOLVE:
-
- 128 / 64 ╙CREEN ╚ANDLING: - ╨UTTING CHARACTERS ON SCREEN.
- ------------------------ - ╔NITIALIZING THE ╙CREEN / ╥EGISTERS.
- - ╙ETTING UP THE ├USTOM ├HARACTERS.
- - ╚ANDLING ANY ┴NIMATION.
-
- ═USIC / ╙OUND: - ╙ETTING UP THE ╙OUND ├HIP ╥EGISTERS.
- ------------- - ╨LAYING A NOTE READ FROM ═EMORY.
- - ┼XECUTING A ╙OUND ┼FFECT.
-
- ╔NPUT ╚ANDLING: - ─EVICE ╙ELECTION (KEYBOARD, MOUSE, JOYSTICK).
- -------------- - ╦EYBOARD ╙CANNING.
- - ═OUSE ╙CANNING.
- - ╩OYSTICK ╙CANNING.
-
- ╟AME ─RIVER: - ╘ITLE ╙CREEN.
- ----------- - ╔NITIALIZATION OF ═EMORY.
- - ╠EVEL ╙ETUP.
- - ═OVEMENT OF ┴LIENS.
- - ═OVEMENT OF ═ISSLES.
- - ═OVEMENT OF ╨LAYER.
- - ├OLLISION ├HECKING.
- - ├OLLISION ╚ANDLING.
- - ┼ND OF ╠EVEL.
- - ╙CORE ╒PDATING.
- - ┼ND - ╟AME HANDLING.
- - ╚IGH ╙CORE ╒PDATE.
-
- ╙HREW! ╠ONG LIST 'EH? - ╬OW YOU MAY HAVE THOUGHT OF SOME NOT LISTED ABOVE,
- AND WE MAY HAVE POSSIBLY OVERLOOKED SOME CRUCIAL ROUTINES -- THAT'S FINE --
- THE ABOVE IS JUST INTENDED AS A BUILDING BLOCK - A PLACE TO START CODING FROM.
-
- ╔F WE THINK OF THESE AS SUBROUTINES WE CAN BUILD A SKELETON OUTLINE OF THE
- PROGRAM - YET WE NEED SOME ORDER IN HOW WE CALL THEM. ╧BVIOUSLY WE AREN'T
- GOING TO MOVE THE PLAYER UNTIL WE SCAN THE INPUT AND THAT REQUIRES PRIOR
- DEVICE SELECTION ETC...
-
- ╚MM... ╘AKING ORDER INTO ACCOUNT WE CAN RE-STATE THE PROBLEM AS:
-
- ╨ROBLEM ╙TATEMENT: ─EVELOP A GAME SIMILAIR TO ╙PACE ╔NVADERS CALLED ╙PACE
- ----------------- ╔NVASION BY INITIALIZING MEMORY, THE DISPLAY DEVICE,
- SETTING UP ├USTOM ├HARACTERS, SETTING UP THE ═USIC
- ╥EGISTERS AND DISPLAYING THE TITLE SCREEN. ╞ROM THERE,
- SELECT THE INPUT DEVICE AND AFTER THAT SETUP THE CURRENT
- LEVEL. ╬EXT, WHILE PLAYING MUSIC IN THE BACKGROUND AND
- SCANNING THE INPUT DEVICE, MOVE THE ALIENS, MISSLES AND
- PLAYER CHECKING FOR COLLISIONS AND TAKING APPROPRIATE
- ACTION AS REQUIRED (PLAYER DIES, SCORE INCREASES ETC OR
- WHAT-NOT). ┴FTER EACH LEVEL DISPLAY IF THE PLAYER IS DEAD,
- OR SET-UP FOR THE NEXT LEVEL AND REPEAT. ╫HEN THE GAME HAS
- ENDED UPDATE THE HIGH SCORE IF NECESSARY.
-
- ╘RY SAYING THAT FIVE TIMES REAL FAST! :-) ┬UT THAT PROBLEM STATEMENT IS A
- WHOLE LOT BETTER THAN THE ONE WE HAD AT THE BEGINNING WHICH SIMPLY SAID TO
- DEVELOP A GAME.
-
-
- ╔╓. ╬OT ┴LL ┴T ╧NE ╘IME - ╫HAT ╫E'RE ─OING ╘HIS ╘IME
- ------------------------------------------------
-
- ╬OW THIS PROGRAM IS TOO COMPLEX, (AS SEEN BY THE PROBLEM STATEMENT ABOVE) TO
- HAVE IN ONE ARTICLE SO THIS ISSUE WE'LL CONCENTRATE ON THE BASIC MAIN LOOP
- AND THE INITIALIZATION OF THE ├USTOM ├HARACTERS AND THE TITLE SCREEN.
-
- ╧RIGINALLY, ╔ WAS PLANNING ON UPDATING AND LISTING THE REVISED CODE IN EACH
- ISSUE. ╚OWEVER, DUE TO SPACE LIMITATIONS AND THE ENORMITY OF THE PROGRAM
- CURRENTLY (1,500+ LINES!!) IT WILL BE PLACED FOR ANONYMOUS FTP AT
- CCOSUN.CALTECH.EDU UNDER THE DIRECTORY: PUB/RKNOP/╚┴├╦╔╬╟.═┴╟.
-
-
- ╓. ╘HE ═AIN ╠OOP
- -------------
-
- ╫HAT IS A MAIN LOOP? ┬ASICALLY IT'S WHERE EVERYTHING GETS DONE. ╔T CALLS OTHER
- SUBROUTINES AND KEEPS REPEATING UNTIL CERTAIN CRITERIA ARE MET - USUALLY WHEN
- THE PLAYER REQUESTS TO EXIT THE GAME. ╚OWEVER, INSIDE YOU'LL FIND INNER LOOPS
- FOR LEVEL PLAY ETC.
-
- ╧UR MAIN LOOP FOR THIS PROGRAM WILL BE:
-
- -------------------------------------------------------------------------------
- ;; * ═AIN ╠OOP - ╘HIS SHOULD BE THE LAST SECTION IN THE SOURCE CODE.
- ;
- ; ═AIN ╠OOP
- ;
-
- MAIN'LOOP = *
- JSR MEMORY'SETUP ; ╙ET-╒P MEMORY.
- JSR DISPLAY'SETUP ; " " DISPLAY.
- JSR CHAR'SETUP ; " " CUSTOM CHARACTER DISPLAY.
- JSR MUSIC'SETUP ; " " MUSIC CHIP.
- JSR TITLE'SCREEN ; ─ISPLAY THE TITLE SCREEN.
- JSR SELECT'INPUT ; ╙ELECT ╔NPUT ─EVICE.
-
- LEVEL'LOOP = *
- JSR PLAY'MUSIC ; ╙TART THE MUSIC PLAYING.
- JSR SETUP'LEVEL ; ╙ETUP THE CURRENT LEVEL.
-
- - JSR ALIEN'MOVE ; ═OVE ALIENS
- JSR MISSLE'MOVE ; " MISSLES
- JSR PLAYER'MOVE ; " PLAYER
- JSR CHECK'COLLISION ; ├HECK FOR COLLISIONS
- LDX COLLISION'FLAG ; ├HECK COLLISION FLAG.
- BEQ -
-
- DEX ; ─ECREASE .╪ BY 1 SO IF ╪ WAS 1 THEN
- BEQ PLAYER'DIE ; IT'S NOW 0 SO WE KNOW PLAYER DIED.
- DEX ; ─ECREASE .╪ AGAIN SO IF ╪ WAS 2 THEN
- BEQ ALIEN'DIE'SOUND ; IT'S NOW 0 SO WE MAKE ALIEN DEATH.
- JSR END'LEVEL ; ╔F WE GOT HERE - THAN END OF LEVEL.
- JSR WAIT'NEXT ; ╫AIT FOR NEXT KEYPRESS.
- JSR INCREASE'LEVEL ; INCREASE LEVEL #.
- SEC ; ┴ND GO BACK....
- BCS LEVEL'LOOP
-
- ALIEN'DIE'SOUND = *
- JSR MAKE'ALIEN'SOUND ; MAKE ALIEN SOUND.
- SEC ; SET CARRY
- BCS - ; AND JUMP BACK.
-
- PLAYER'DIE JSR SHOW'PLAYER'DIE ; ╙HOW IT ON-SCREEN.
- LDA LIVES ; ├HECK # OF LIVES.
- BEQ END'OF'GAME ; ╔F 0 THE END-OF-GAME.
- BNE LEVEL'LOOP ; GO BACK AND RE-START LEVEL.
- BRK ; ╔F WE GET HERE - THAN AN ERROR.
-
- END'OF'GAME JSR END'GAME'SCREEN ; ╙HOW END-OF-GAME SCREEN.
- JSR HIGH'SCORE'UPDATE ; ╒PDATE THE HIGH SCORE IF NEED-BE.
- JSR WAIT'NEXT ; ╫AIT FOR NEXT-GAME SELECTION.
- LDA QUIT
- BEQ +
- JSR SETUP'LEVEL'1 ; ╙ET-╒P FIRST LEVEL.
- SEC
- BCS LEVEL'LOOP ; AND START PLAYING IT.
-
- + JMP QUIT'GAME
- ;
- ; ┼ND OF ═AIN ╠OOP
- ;
- -------------------------------------------------------------------------------
-
- ╙OME OF THE ROUTINES LISTED ABOVE WE WILL LATER REPLACE WITH ACTUAL CODE. ╔T'S
- MUCH EASIER TO SEE:
-
- INC LEVEL
-
- THAN TO SEE A
-
- JSR INCREASE'LEVEL
-
- AND TRY TO HUNT DOWN THE CODE. ╔'VE INCLUDED THEM IN FOR NOW SO THAT WE CAN
- HAVE A BETTER IDEA OF WHAT IS GOING ON.
-
- ╔N THE FILE: INVASION.SRC MOST OF THE STATEMENTS ABOVE ARE COMMENTED OUT.
- ╧NCE WE WRITE THE ROUTINES WE'LL UN-COMMENT THEM. ╞OR NOW, THIS SERVES TO
- STILL REMIND US OF THE ROUTINES WE NEED TO WRITE.
-
- ┴LSO THERE ARE A COUPLE OF PROGRAMMING TRICKS THAT ╔ USED IN THE MAIN LOOP
- THAT PROBABLY NEED SOME CLARIFYING.
-
- ╫HEN HANDLING THE COLLISIONS THE .╪ REGISTER IS LOADED WITH THE RESULT OF THE
- COLLISION CHECKING - $00 = NO COLLISIONS, $01 = PLAYER DIED, $02 = ALIEN DIED,
- $03 = END OF LEVEL. ┴NYTIME A LOAD TO A REGISTER IS DONE THE FLAGS ARE
- AUTOMATICALLY SET AS IF YOU HAD COMPARED IT TO 0 - HENCE WE CAN LDX THE
- COLLISION FLAG AND IMMEDIATELY BRANCH IF EQUAL TO ZERO FOR NO COLLISIONS. ╔N
- ADDITION TO THE LOAD ANYTIME THE .╪ OR .┘ REGISTERS ARE INCREMENTED OR
- DECREMENTED AN IMPLICIT COMPARISON TO ZERO IS PERFORMED. ╙O IF THE .╪ REGISTER
- IS 1 PREVIOUSLY, WE DECREMENT IT THEN IT WILL BE ZERO AND OUR ┬┼╤ INSTRUCTION
- WILL BRANCH. ╔F IT'S TWO THEN IT WILL BE ONE AND WE CAN CONTINUE LIKE THIS.
- [╬╧╘┼: ╘ECHNICALLY IT'S NOT A REAL COMPARISON TO ZERO BUT CALLING IT A
- COMPARISON TO ZERO SERVERS OUR PURPOSE HERE. ╘HE ONLY SIGNIFICANT DIFFERENCE
- WOULD BE IN THE EFFECT OF THE CARRY FLAG WHICH IS INSIGNIFICANT IN OUR
- CODE SEGMENT HERE.]
-
- ┴LSO IN SEVERAL LOCATIONS ARE THE TWO INSTRUCTIONS:
-
- SEC
- BCS [LABEL]
-
- ╫HAT THESE ARE DOING ARE SIMPLY PROGRAMMING STYLE - THEY COULD BE SUBSTITUTED
- WITH ╩═╨ [LABEL] - HOWEVER THEY OFFER ADVANTAGES OVER ╩═╨. ╘HEY TAKE UP THE
- A LARGER AMOUNT OF EXECUTION TIME, HOWEVER THEY ARE RELOCATABLE SO ANY MUCKING
- AROUND / MOVING SECTIONS OF CODE DURING DEBUGGING WILL BE LESS LIKELY TO
- CRASH. ╒SING OTHER FLAGS ARE ALSO VALID -- THE USE OF WHICH FLAG (╔ PREFER
- THE CARRY FLAG) IS USUALLY DEPENDENT ON THE PROGRAMMER. ╟EOS DEFINES A
- SIMILAIR MACRO CALLED ┬╥┴ (BRANCH ALWAYS) WHICH IS EQUIVLENT TO:
-
- CLV
- BVC [LABEL]
-
- ╬OTE THAT THE ABOVE IS JUST PROGRAMMING STYLE, HELD OVER FROM MY PROGRAMMING
- IN ASSEMBLY DAYS. ╘HE USE OF ╩═╨ IS PROBABLY PREFERABLE IN TERMS OF
- EXECUTION AND ALSO IN BEING ABLE TO BRANCH MORE THAN 127 BYTES AWAY (THE
- BRANCH INSTRUCTIONS ONLY HAVE A RANGE OF +128/-127).
-
-
- ╓╔. ├USTOM ├HARACTERS
- -----------------
-
- ╙INCE WE'RE WRITING FOR EACH OF THE SEPERATE MODES (64 MODE, 128 MODE) WE HAVE
- TO TAKE A LOOK AT THE DIFFERENCES BETWEEN THE ╓╔├ CHIP (64 MODE) AND THE 8563
- CHIP IN THE 128.
-
- ╘HE ╓IC-├HIP
- ------------
- ╘HE CHARACTER SETS IN THE ╓╔├ CHIP ARE DEFINED AS IN THE EXAMPLE BELOW OF
- THE CHARACTER CODE $00 "@" (ALL REFERENCES ARE TO SCREEN "POKE" CODES - NOT
- PRINT CODES).
-
- .BYT #%00111100 ╘RY HOLDING THE PAGE (OR MOVING AWAY FROM THE
- .BYT #%01100110 SCREEN) AND TAKING A LOOK AT THE PATTERNS THE 1'S
- .BYT #%01101110 AND 0'S MAKE. ┼ACH CHARACTER IS THUS DEFINED AS
- .BYT #%01101110 EIGHT BYTES WHO'S BIT PATTERNS DEFINE IT. ╚AVING A
- .BYT #%01100000 TOTAL OF 256 CHARACTERS AVAILABLE MAKES IT
- .BYT #%01100010 NECCESARY TO SET ASIDE A TOTAL OF 2,048 BYTES.
- .BYT #%00111100
- .BYT #%00000000
-
- ╬OW, INSTEAD OF DESIGNING ALL 256 CHARACTER SETS WE'LL JUST TAKE ADVANTAGE OF
- THE FACT THAT THE LETTERS AND NUMBERS WE WANT WILL ALREADY BE THERE -- WE'LL
- JUST COPY THEM FROM THE ╥╧═ SET INTO ╥┴═, MODIFY SOME OF THE OTHER CHARACTERS
- TO REFLECT WHAT WE WANT AND THEN TELL THE ╓╔├ CHIP TO LOOK AT ╥┴═ TO GET THE
- CHARACTER SET DEFINITIONS.
-
- ╘HERE ARE SOME PROBLEMS WITH COPYING THE 'SYSTEM' CHARACTERS, HOWEVER. ╘HE
- ├OMMODORE 64 USUALLY MASKS OUT THE CHARACTER SET AND TYPICALLY IT IS ONLY
- AVAILABLE TO THE ╓╔├ CHIP SO THAT MORE SPACE CAN BE PRESENT FOR USER PROGRAMS
- AND SUCH. ╔T ALSO TAKES UP THE SECTION OF MEMORY THAT THE ╔/╧ BLOCK IN
- $D000-$DFFF DOES SO THAT SWITCHING IT IN WHILE INTERRUPTS ARE ENABLED IS SURE
- TO RESULT IN A CRASH.
-
- ╫E'RE ALSO GOING TO BE DOING A FEW THINGS THAT YOU MAY NOT EXPECT -- INSTEAD
- OF COPYING ALL 256 CHARACTERS - WE'RE GONNA _JUST_ COPY THE FIRST 128. ╘HIS
- WILL GIVE US ALL OF THE NORMAL CHARACTERS AS THE LAST 128 ARE THE REVERSE-
- VIDEO COUNTERPARTS TO THE FIRST 128 CHARACTERS. ╫E'RE DOING THIS TO CONSERVE
- SPACE AND BECAUSE WE REALLY DON'T NEED THAT MANY CHARACTERS DEFINED.
-
- ┴LSO LOCATION $01 CONTAINS WHAT $D000-$DFFF HOLDS AND WE WILL HAVE TO MODIFY
- BIT 2 TO SWITCH THE CHARACTER ╥╧═ IN. ╚ENCE, THE FOLLOWING PROGRAM CODE IS
- USED TO COPY THE CHARACTER SET:
-
- -------------------------------------------------------------------------------
- COPY'CHARS = * ; MUST BE RUN W/ INTERRUPTS DISABLED
- LDA $01 ; REGISTER 1 = THE CONTROL TO SWITCH IN THE CHAR.
- ; ROM.
- PHA ; SAVE IT AS WE'LL LATER NEED TO STA' IT BACK.
- AND #%11111011 ; ┬IT 2 CONTROLS IT - CLEAR IT TO SWITCH IT IN.
- STA $01 ; AND MAKE IT SO WE CAN READ IT IN.
- LDA #>$3000 ; MOVE CHARS TO $3000
- STA DEST+1
- LDA #>$D800 ; FROM $D800 (START OF CHAR SET) (LOWER-CASE)
- STA SRC+1
- LDY #$00 ; LO-BYTES OF BOTH SRC, DEST = $00.
- STY SRC
- STY DEST
- LDX #$10 ; COPY 2K OF DATA.
- - LDA (SRC),Y ; COPY BYTE.
- STA (DEST),Y
- INY
- BNE - ; CONTINUE UNTIL .┘ = 0.
- INC SRC+1 ; INCREASE SOURCE & DEST BY 256
- INC DEST+1
- DEX ; DECREASE .╪ COUNT.
- BNE - ; IF NON-ZERO THEN CONTINUE COPYING, ELSE
- PLA ; RESTORE VALUE OF $01
- STA $01 ; AND PUT BACK.
- LDA $D018 ; SET ╓╔├-CHIP ADDRESS.
- AND #$F1 ; TO SHOW CHAR SET.
- ORA #$0C
- STA $D018 ; AND FINALLY TELL ╓╔├ WHERE THE CHAR SET IS...
- RTS ; AND RETURN.
- -------------------------------------------------------------------------------
-
- ╬OTE THAT WE STILL NEED TO CHANGE THE ACTUAL CHARACTERS WE'RE GONNA BE USING.
- ╘HAT WILL BE HANDLED IN THE SECTION AFTER NEXT: ├HANGING THE ├HARACTERS AS
- THERE IS A GREAT DEAL OF SIMILARITY BETWEEN THE 128 AND 64 IMPLEMENTATIONS.
-
- ╘HE 8563 ├HIP
- -------------
- ╘HE 8563 80-├OLUMN CHIP USUALLY HAS 16K OR 64K ╥AM ATTATCHED TO THE CHIP
- WHICH THE ├╨╒ DOES NOT HAVE DIRECT CONTROL OVER. ╔T HAS TO DIRECT THE 8563
- TO STORE AND RETRIEVE VALUES TO THAT MEMORY. ╫HAT MAKES CONTROL OVER THAT
- MEMORY ALL THE MORE DIFFICULT IS THE FACT THAT THE 8563 ONLY HAS TWO LINES
- OR ADDRESSES THAT THE ├╨╒ CAN CONTROL.
-
- ╘HE 8563 HAS A CHARACTER SET IN MUCH THE SAME WAY THE ╓╔├ CHIP DOES, SAVE
- ONE EXCEPTION - EACH CHARACTER SET CAN HAVE UP TO 16 LINES. ╬ORMALLY, THE LAST
- EIGHT LINES ARE FILLED WITH $00 AND ARE NOT SHOWN. (╨ROVISIONS CAN BE MADE TO
- HAVE 8X16 CHARACTERS BUT IT IS NOT NEEDED FOR THIS GAME AND THUS, WILL NOT BE
- SHOWN - ╞OR MORE INFORMATION ╙EE ├= ╚ACKING ╔SSUE #2: 8563: ┴N ╔N-─EPTH ╠OOK.)
- ╘HUS THE ALGORITHIM IS SIMILAIR TO THE ├=64 BUT 8 ZERO-BYTES WILL NEED TO BE
- WRITTEN AT THE END OF EVERY EIGHT BYTES READ.
-
- ╚OWEVER, THE 8563 DOES MAKE THINGS EASIER FOR US! - ╫HEN THE COMPUTER IS FIRST
- TURNED ON A COPY OF THE ├HARACTER ╙ET FROM ╥╧═ IS COPIED INTO THE 8563. ╘HE
- 8563 HAS NO ╥╧═ ├HARACTER ╙ET ASSOCIATED WITH IT AND THUS WE ARE ABLE TO JUST
- SIMPLY MODIFY THE CHARACTER SET THAT IS IN THE 8563 MEMORY INSTEAD OF COPYING
- IT OVER. ┬ECAUSE OF THIS NO ROUTINE WILL BE PRESENTED TO COPY A CHARACTER
- SET INTO THE 8563 MEMORY, RATHER THE DISCUSSION OF COPYING INDIVIDUALLY
- DEFINED CHARACTERS WILL TAKE PLACE IN THE NEXT SECTION. ╘HE ├=128 ALSO MAKES
- LIFE EVEN EASIER FOR US AT THE END WHEN WE WILL EXIT THE PROGRAM,
- MODIFYING THE CHARACTER SET BACK TO THE "STANDARD" ├OMMODORE CHARACTER SET
- BY A ROUTINE IN THE ╦┼╥╬┴╠ THAT WILL COPY THE CHARACTERS BACK. ╫E'LL TAKE A
- LOOK AT IT CLOSER WHEN WE WRITE THE EXIT ROUTINE.
-
- ┴LSO NOTE THAT SINCE THE 8563 CHIP SUPPORTS THE 80 COLUMN SCREEN WE WILL
- BE DEFINING TWO CHARACTERS THAT CAN BE PLACED SIDE BY SIDE FOR EACH ALIEN
- SO THAT THE PLAYING FIELD WILL BE SIMILAIR TO THE ├64 VERSION. ╚OWEVER, FOR
- THE TITLE SCREEN WE WILL BE SWITCHING THE 8563 INTO A "40 COLUMN" MODE
- TO MAKE PROGRAMMING EASIER, IN ADDITION TO EXPANDING THE CHARACTER BIT-MAPPED
- LOGO.
-
- ├HANGING THE ├HARACTERS
- -----------------------
- ┴ LOT OF THE TIMES YOU'LL FIND YOURSELF RE-USING SUBROUTINES AND CODE THAT
- YOU HAVE PREVIOUSLY CREATED, GRADUALLY, OVER A PERIOD OF TIME BUILDING UP
- A LIBRARY OF ROUTINES. ╫HEN THINKING THROUGH THE PURPOSE AND INTENT OF THIS
- ROUTINE ╔ THOUGHT ABOUT POSSIBLY BUILDING IT SO IT WOULD READ A TABLE AND
- CHANGE THE CHARACTER SET BASED ON THAT TABLE. ╘HE 64/128 CHARACTER SETS
- WOULD BE THE SAME - THIS ROUTINE WOULD AUTOMATICALLY GENERATE THE EIGHT
- ADDITIONAL BYTES NEEDED BY THE 8563 IF NEED-BE AND IT WOULD CALL THE
- APPROPRIATE STORAGE ROUTINE - STORE TO EITHER THE 8563 OR THE COMPUTER
- MEMORY.
-
- ╬OW YOU MAY BE ASKING WHY WOULD YOU WANT TO STORE TO THE COMPUTER MEMORY
- IN 128 MODE? ╫HY NOT JUST HAVE TWO SEPERATE VERSIONS? - ┘ES - THAT COULD
- BE POSSIBLE BUT ╔'M IMPLEMENTING IT THIS WAY BECAUSE IN THE FUTURE ╔ MAY
- SEE A NEED TO DEFINE CUSTOM CHARACTERS IN 128 MODE FOR THE 40 COLUMN SCREEN.
- ╘HIS WAY ╔ CAN JUST EXTRACT THE ROUTINE, POP IT INTO MY PROGRAM AND ╔'VE GOT
- THAT SECTION OF THE CODE COMPLETE.
-
- ╘HIS IS WHAT ╔ WAS THINKING OF FOR THE DATA TABLE:
-
- .BYT 1 = 8563, 0 = COMP. MEMORY.
- .WORD ADDRESS ; ADDRESS BASE OF CHAR-SET IN COMPUTER OR 8563 MEMORY.
- .BYTE CHAR # ; (TO START)
- .BYTE # OF CHARS TO DEFINE
- .BYTE # OF CHARACTERS TO DEFINE
- .BYTE DATA,DATA,....,DATA8 ; CHARACTER DATA.
- .BYTE DATA,DATA,....,DATA8 ; CHARACTER DATA. ETC....
- . . .
-
- ┼NTRANCE INTO THE ROUTINE WILL CONSIST OF .┴┘ HOLDING THE LOCATION OF THE
- TABLE. ╫E WILL KEEP THE ADDRESS OF THE TABLE AND KEEP INCREMENTING IT AS
- WE GO ALONG IN Z-PAGE LOCATIONS.
-
- -------------------------------------------------------------------------------
- INSTALL'CHAR = *
- STA ZP1 ; SAVE .AY IN TABLE ADDRESS
- STY ZP1+1
- LDY #$00 ; READ COMPUTER MODE.
- JSR GET'BYTE
- STA MODE
- JSR GET'BYTE ; GET ADDRESS BASE.
- STA ADR
- JSR GET'BYTE
- STA ADR+1
- JSR GET'BYTE ; GET NUMBER OF CHARACTERS TO COPY.
- STA NUMB
- JSR GET'BYTE ; GET NEXT CHARACTER #.
- STA WRK ; SAVE IN TEMP. LOCATION.
- LDA #$00
- STA WRK+1
- ASL WRK ; SHIFT LEFT X3 TIMES = *8
- ROL WRK+1
- ASL WRK
- ROL WRK+1
- ASL WRK
- ROL WRK+1
- LDA MODE ; IF FOR 8563 THEN MULTIPLY 1 MORE TIME.
- BEQ +
- ASL WRK
- ROL WRK+1
- + LDA ADR ; ADD CHARACTER ADDRESS IN.
- CLC
- ADC WRK
- STA WRK
- LDA ADR+1
- ADC WRK+1
- STA WRK+1 ; ADDRESS NOW CALCULATED
- JSR SETADRS ; SET ADDRESS IN PROPER CHIP
- LOOP'INSTALL LDX #$08 ; COPY 8 BYTES.
- - JSR GET'BYTE
- JSR WRITEBYTE ; WRITE OUT BYTE.
- DEX
- BNE -
- LDA MODE ; IF 128 THEN FILL OUT 8 MORE $00 BYTES.
- BEQ +
- LDA #$00
- LDX #$08
- - JSR WRITEBYTE
- DEX
- BNE -
- + DEC NUMB
- BNE LOOP'INSTALL
- RTS
- -------------------------------------------------------------------------------
-
- ╫HAT? ╫E HAVE THRE SUBROUTINES : WRITEBYTE, SETADRS, AND GET'BYTE THAT WE
- HAVEN'T EXAMINED YET. ╘HESE ARE GOING TO BE THE ROUTINES THAT ARE DEPENDANT
- ON THE COMPUTER TYPE. ┴LSO, WRITEBYTE WILL REQUIRE THAT .╪┘ NOT BE DISTURBED;
- SETADRS REQUIRES THAT .┘ NOT BE DISTURBED HENCE THE FOLLOWING:
-
- -------------------------------------------------------------------------------
- SETADRS TYA ; SAVE .YX
- PHA
- TXA
- PHA
- LDA MODE ; CHECK COMPUTER TYPE.
- BEQ + ; IF ├=64, THEN JUMP AHEAD.
- LDX #18 ; ╓─├ REGISTER - CURRENT MEMORY ADDRESS HI
- LDA WRK+1 ; GET ADDRESS HI
- JSR WR'VDC
- LDX #19 ; ╓─├ REGISTER - CURRENT MEMORY ADDRESS LO
- LDA WRK ; GET ADDRESS LO
- JSR WR'VDC
- + PLA ; RESTORE .╪┘
- TAX
- PLA
- TAY
- RTS ; AND RETURN.
- -------------------------------------------------------------------------------
-
- ╬OTE THAT WE REALLY DON'T NEED A SETADRS FOR THE ├=64 -- WE CAN JUST INDEX
- OFF (WRK) IN THE WRITEBYTE ROUTINE WHICH FOLLOWS:
-
- -------------------------------------------------------------------------------
- WRITEBYTE STA TEMP ; SAVE AS WE NEED IT LATER.
- TXA ; ╙AVE .╪┘
- PHA
- TYA
- PHA
- LDA MODE ; NOW CHECK COMPUTER TYPE.
- BEQ + ; IF C64 JUMP AHEAD
- LDA TEMP ; RECALL TEMP.
- JSR WR'VRAM
- SEC
- BCS ++ ; JUMP AHEAD
- + LDY #$00 ; ├64 / Y-INDEX = $00
- LDA TEMP ; GET VALUE
- STA (WRK),Y ; STORE
- INC WRK ; NOW INCREASE ADDRESS
- BNE +
- INC WRK+1
- + PLA ; NOW RETURN AFTER RECALLING .╪┘
- TAY
- PLA
- TAX
- RTS ; AND RETURN.
- -------------------------------------------------------------------------------
-
- ╬OTE THAT THE FOLLOWING ROUTINE IS FAIRLY SHORT BUT IT IS CALLED NUMEROUS
- TIMES WITHIN THE ROUTINES THAT USE DATA TABLES SUCH AS INSTALL'CHAR,
- WRITE'TXT AND WRITE'COL.
-
- -------------------------------------------------------------------------------
- GET'BYTE = *
- LDA (ZP1),Y
- INY
- BNE + ; IF ZERO THEN INCREASE ZP1 HI
- INC ZP1+1
- + RTS
- -------------------------------------------------------------------------------
-
- ╬OT BAD 'EH? ┴ QUICK NOTE: ╘HE INSTRUCTIONS: ╨╠┴, ╘┴┘, ╨╠┴, ╘┴╪, ╨╚┴, ETC..
- ARE ROUTINES THAT ╨USH OR ╨ULL (PHA,PLA) THE .┴ ONTO THE STACK. ╘HE ╘┴┘, ╘┴╪,
- ╘╪┴, ╘┘┴ ARE INSTRUCTIONS THAT TRANSFER A REGISTER TO ANOTHER (IE: THE ╘┴┘
- TRANSFERS THE ┴ REGISTER TO .┘, ╘╪┴ TRANSFERS .╪ TO .┴ ETC...) ┬Y USING THE
- COMBINATION OF THESE WITH THE STACK WE CAN SAVE THE REGISTERS AND LATER
- RE-CALL THEM SO THAT THEY ARE THE SAME WHEN WE ENTERED THE ROUTINE. ╘HE
- STACK IS USUALLY A "MYSTERY" ITEM TO NEW PROGRAMMERS OF THE 6502 SERIES.
- ┬ASICALLY IT'S JUST LIKE ANY OTHER STACKS IN THE REAL WORLD - THE LAST ITEM
- THROWN (╔'M NON-PRACTICING PERFECTIONIST SO ╔ THROW STUFF.. ;-) ) OR PUSHED
- ON THE STACK WILL THE FIRST ITEM REMOVED OR PULLED FROM THE STACK. ╞OR
- EXAMPLE ╔'VE GOT A STACK OF BOOKS SITTING NEAR ME :
-
- ═APPING THE ├OMMODORE 128
- 128 ╔NTERNALS
-
- AND ╔'M HOLDING ═APPING THE ├OMMODORE 64 IN MY HANDS. ╔F ╔ PUSH (OR TOSS)
- THE BOOK ONTO THE STACK (AND HOPEFULLY HIT THE STACK INSTEAD OF THE FLOOR)
- ╔'LL HAVE THE FOLLOWING STACK:
-
- ═APPING THE ├OMMODORE 64
- ═APPING THE ├OMMODORE 128
- 128 ╔NTERNALS
-
- AND IT SHOULD BE EASY TO SEE THAT IF ╔ "PULL" THE NEXT BOOK OFF THE STACK
- THAT ╔'LL GET THE ═APPING THE ├OMMODORE 64 BOOK. ╘HE NEXT BOOK TO BE "PULL"ED
- AFTER THAT WOULD BE THE ═APPING THE ├OMMODORE 128 BOOK. ╘HIS IDEA CAN BE
- APPLIED TO THE 6502 STACK -- ╔T WILL KEEP STORING VALUES (UP TO 256) WHEN YOU
- "PUSH" THEM ON (VIA THE ╨╚┴ INSTRUCTION) AND WILL RETRIEVE THE LAST VALUE
- STORED WHEN YOU "PULL" THEM OFF (VIA THE ╨╠┴ INSTRUCTION). ┴NOTHER ╨╠┴
- INSTRUCTION WOULD RETURN THE NEXT VALUE THAT HAD BEEN STORED.
-
- ╘HE ├HARACTER ┬ITMAPS
- ---------------------
-
- ╨ASI ╧JALA IS TO BE CREDITED WITH ALL THE GRAPHICS AND MANY THANKS GO OUT
- TO HIM.
-
- ╘HE GAME LOGO IS MADE UP OF 120 CUSTOM DEFINED CHARACTERS THAT WILL BE
- PRINTED IN THE FOLLOWING MANNER (ON THE 128 SCREEN THEY WILL BE CENTERED).
-
- (IN REVERSE VIDEO)...
-
- ┴┬├─┼╞╟╚ . . . [UP TO 40 CHARACTERS]
- ╔╩╦╠═╬╧╨
- ╤╥╙╘╒╓╫╪
-
- AND EVERYTHING WILL LINE UP.
-
- ╙O THAT IT WILL LOOK LIKE A "MINI-BITMAP". ╫E COULD HAVE USED BITMAP MODE
- AND MADE A VERY NICE LOOKING TITLE SCREEN BUT THAT WOULD HAVE INVOLVED
- SWITCHING AND ALLOCATING MEMORY FOR THE BITMAP, ETC . . . ╧N BOTH THE
- 8563 AND THE ╓╔├ THAT INVOLVES A BIT MORE WORK AND SO CUSTOM CHARACTERS
- WILL BE USED FOR THE TITLE SCREEN. ╘HE REGULAR LETTER AND NUMERIC CHARACTERS
- WILL BE AVAILABLE SO THAT WE CAN DISPLAY CREDITS AND GAME INSTRUCTIONS
- BELOW THE LOGO.
-
- ╬OW - IN THE PROGRAM LISTING WE COULD LIST THEM AS BINARY #'S AND THAT WOULD
- MAKE EDITING THEM VERY EASY BUT WE'RE GONNA USE THEIR DECIMAL REPRESENTATION
- IN THE PROGRAM LISTING.
-
- ╘HE CHARACTERS ARE DEFINED SIMILAIR TO THE LOGO EXCEPT THEY ARE TREATED AS
- SINGLE CHARACTERS. ╔N THE 128 VERSION DUE TO THE 80 COLUMN SCREEN WE ARE
- GOING TO USE TWO CHARACTERS SIDE BY SIDE TO SIMULATE ONE ALIEN SO THAT THE
- PLAYING FIELD WILL BE SIMILAIR TO THE ├64 VERSION. ╔N ADDATION, DURING THE
- MAIN LOOP WE WILL MODIFY THE CHARACTER SETS TO SUPPORT ANIMATION OF THE
- ALIENS. ╔N THE DATA LISTING THERE IS A REFERENCE TO "FRAMES" - FOR EACH OF
- THE ALIENS THERE ARE 8 DIFFERANT FRAMES.
-
- ╧H! - ╘HERE WILL BE MORE CHARACTERS DEFINED IN THE FUTURE. ╥IGHT NOW ╔'M
- MAINLY INTERESTED IN GETTING SOME BASE CHARACTERS DOWN SO YOU CAN SEE HOW
- CUSTOM CHARACTERS ARE IMPLEMENTED. ╫HEN WE START SETTING UP DIFFERENT LEVELS
- AND SUCH WE'LL ADD MORE CHARACTERS THEN. ├URRENTLY THE CUSTOM CHARACTERS
- ARE NOT USED - ONLY THE CHARACTERS FOR THE LOGO. ╞OR THOSE OF YOU WHO ARE
- CURIOUS TRY INSTALLING THE CHARACTERS VIA INSTALL'CHAR AND TAKING A LOOK
- AT THE ALIENS.
-
-
- ╓╔╔. ╘ITLE ╙CREEN
- ------------
-
- ╘HE TITLE SCREEN IS USUALLY A LEAD-IN TO THE ACTUAL GAME AND IT'S AIM IS
- TO TELL THE PLAYER HOW TO PLAY THE GAME, ANY AVAILABLE OPTIONS AND P'HAPS
- PRESENT A NICE GRAPHIC OR TWO TO "WOW" THE USER INTO PLAYING. ╔N ADDATION,
- THE MAIN MUSICAL THEME CAN BE INTRODUCED HERE TO UNIFY THE GAME-PLAYING.
- ╘HE DISCUSSION BELOW DOES NOT TAKE INTO ACCOUNT COLOR BUT REST-ASSURED WE
- WILL BE USING VARYING COLORS IN THE TITLE SCREEN. ╘HE FORMAT FOR THE COLOR
- DATA WILL BE ALMOST IDENTICAL TO THE TITLE SCREEN FORMAT EXCEPT IT WILL
- BE STRUCTURED VIA THE FOLLOWING:
-
- .WORD ADDRESS
- .BYTE NUM_OF_CHARS TO PUT COLOR ($00= END OF DATA)
- .BYTE COLOR_VALUE
-
- ╘HE ROUTINE (COLOR'TEXT) CAN BE FOUND IN THE SOURCE LISTINGS AT THE END OF
- THIS ARTICLE. ┬ECAUSE OF THE SIMILARITY BETWEEN IT AND WRITE'TEXT IT IS
- NOT DISCUSSED IN THIS ARTICLE.
-
- ╘ITLE ╙CREEN ┬ACK╟ROUND
- -----------------------
- ╘HE TITLE SCREEN ╔ ENVISONED AS A BORDERED SCREEN (USING THE NORMAL ├=
- CHARACTER SET - IE: ├= ┴,╙,┌,╪ ON THE KEYBOARD) WITH OUR BITMAP IN THE MIDDLE
- AND UNDER-NEATH IT A SHORT DESCRIPTION OF THE GAME AND GAME-PLAY INSTRUCTIONS.
-
- ╬OW THIS IS MY IDEA OF THE SCREEN LAYOUT (ROUGH DRAWING AS WE'RE NOT USING
- THE ACTUAL SCREEN DIMENSIONS):
-
- +-------------------------------------------------------------+
- ▄ -╠╧╟╧ ----------------------------------------------------- ▄
- ▄ --------------X 3 LINES------------------------------------ ▄
- ▄ ----------------------------------------------------------- ▄
- ▄ ▄
- ▄ ╙PACE ╔NVASION ├64/128 ▄
- ▄ ╨ROGRAMMING : ├RAIG ╘AYLOR ▄
- ▄ ╟RAPHICS : ╨ASI ╧JALA ▄
- ▄ ╙OUND : ???????????? ▄
- ▄ ▄
- ▄ ----------------------------------------------------------- ▄
- ▄ ╘O ╨LAY: ▄
- ▄ ╒SE JOYSTICK IN PORT 2, MOUSE IN PORT 1 OR KEYBOARD: ▄
- ▄ ┴ - ╠EFT, ┌ - ╥IGHT ╙PACE - ╞IRE ▄
- ▄ ╞1 - ╥ESTART ▄
- ▄ ▄
- +-------------------------------------------------------------+
-
- ╘ITLE ╙CREEN ╞ORMATTING
- -----------------------
- ╫E COME INTO A PROBLEM HERE -- THE SCREEN IS SOME 1000 CHARACTERS ON THE ├64,
- AND 2000 CHARACTERS FOR THE ├=128. ╔T WOULD BE EXTREMELY WASTEFUL TO STORE
- THAT MANY CHARACTERS IN MEMORY JUST TO REPRODUCE A TITLE SCREEN - AND MOST OF
- THEM CONSISTING OF SPACES AT THAT!!
-
- ╫HAT WE'LL DO IS TO JUST SPECIFY THE ADDRESS ON SCREEN, THE # OF CHARACTERS
- AND THEN LIST THE CHARACTERS. ╔T WILL BE SIMILAIR TO OUR CUSTOM CHARACTER
- TABLE DRIVER ABOVE BUT WILL BE DIFFERENT ENOUGH THAT A NEW ROUTINE IS
- WARRENTED. ╫E WILL HOWEVER USE THE TWO SUBROUTINES WRITEBYTE AND SETADRS
- THAT WERE DEVELOPED IN THE PREVIOUS ROUTINE. ╘HE DATA WILL LOOK LIKE THE
- FOLLOWING:
-
- .WORD ADDRESS
- .BYTE NUM_OF_CHARS ($00= END OF DATA)
- .ASCII "TEXT"
- .BYTE ADDRESS .... ETC....
-
- AND WE'LL ENTER WITH .┴┘ CONTAINING THE ADDRESS OF THE TABLE.
-
- ╙O BASICALLY WE COME UP WITH THE FOLLOWING:
-
- -------------------------------------------------------------------------------
- WRITE'TXT = *
- STA ZP1 ; SAVE .AY IN TABLE ADDRESS
- STY ZP1+1
- LDY #$00
- LOOP'W'TEXT = *
- JSR GET'BYTE ; SET ADDRESS.
- STA WRK
- JSR GET'BYTE
- STA WRK+1
- JSR GET'BYTE ; GET # OF CHARS TO WRITE OUT.
- CMP #$00
- BEQ + ; IF ZERO THEN EXIT.
- TAX
- JSR SETADRS ; SET ADDRESS TO WRK,WRK+1
- - JSR GET'BYTE
- JSR WRITEBYTE ; WRITE OUT BYTE.
- DEX
- BNE -
- SEC
- BCS LOOP'W'TEXT ; THIS IS AN ABSOLUTE JUMP TO LOOP
- + RTS ; RETURN.
-
- -------------------------------------------------------------------------------
-
- ╘HIS IS SIMILAIR TO OUR PREVIOUS ROUTINE, AND WAS IN FACT COPIED AND MODIFIED
- FROM THE PREVIOUS ROUTINE.
-
-
- ╓╔╔╔. ─EBUGGING
- ---------
-
- ╬OW, NOT ALL PROGRAMS ARE PERFECT, AND DURING THE DEVELOPMENT OF THIS
- PORTION OF THE GAME THERE WERE SEVERAL ERRORS FOUND. ╘RACING AN ERROR IN
- ═ACHINE/┴SSEMBLY-╠ANGUAGE IS LIKE TRYING TO FIND A GRAMMATICAL ERROR IN A
- LANGUAGE YOU DON'T KNOW. ;-) ┬UT SERIOUSLY, THERE ARE SEVERAL WAYS TO TRACK
- DOWN ERRORS IN YOUR CODE.
-
- 1 - ╘RY TRACING IT THROUGH BY HAND PLAYING "╫HAT IF ╔ WERE THE COMPUTER" AND
- FOLLOWING WHAT EACH REGISTER DOES.
-
- 2 - ┴RE YOU SWITCHING THE ╠O╚I ORDER OF VARIABLES? ╔E: IS IT LDA #< OR
- LDA #>??
-
- 3 - ╙ET ┬╥╦ POINTS AND RUN THE PROGRAM / SUBROUTINE WITHIN A MACHINE LANGUAGE
- MONITOR AND MAKE SURE THE REGISTERS / MEMORY LOCATIONS CONTAIN THE VALUES
- THAT THEY SHOULD. ╔F NOT, FIND OUT WHY.
-
- 4 - ╘RY TO SIMPLIFY YOUR CODE IN TERMS OF PROGRAMMING EASE - ═AKE THE
- ASSEMBLER DO THE WORK FOR YOU - IT'S A LOT LESS LIKELY TO MAKE ERRORS
- THAN YOU ARE.
-
- 5 - ╘HINK LOGICALLY!!!
-
- 6 - ├HANGE SOMETHING AT RANDOM AND PRAY.
-
- ╔ CAN'T STRESS NUMBERS 3 AND 5 ENOUGH. ─URING THE WRITING OF THE INSTALL'CHAR
- ROUTINE THERE WERE NUMEROUS BUGS THAT WERE EVENTUALLY TRACKED DOWN BY
- SETTING A ┬╥╦ INSTRUCTION FURTHER ALONG IN THE CODE AND SEEING EXACTLY WHAT
- THE REGISTER / MEMORY LOCATIONS WERE. ┴LSO THE USE OF TEMPORARY LOAD AND
- STORE INSTRUCTIONS INTO "SAFE" REGIONS OF MEMORY HELPED ME MONITOR WHAT SOME
- OF THE VALUES WERE.
-
- ╞OR EXAMPLE, AT ONE POINT ╔ HAD A SECTION OF CODE SIMILAIR TO THE FOLLOWING:
-
- CLC
- LDA VALUE
- ADC DATA
- BNE +
- INC DATA+1
- + [.... ]
-
- ┴ND IT'S PURPOSE WAS TO ADD VALUE TO DATA. ╬OW ╔'VE FOUND SIMPLE ERRORS ARE
- USUALLY FOUND LAST, AFTER COMPLEX ERRORS. ┴ND NOT UNTIL A SET A BREAK POINT
- LIKE:
-
- CLC
- LDA VALUE
- ADC DATA <-----═ISSING ╔NSTRUCTION AFTER HERE-------------+
- BNE + ▄
- INC DATA+1 ▄
- + ┬╥╦ ▄
- [.... ] ▄
- ▄
- DID ╔ ACTUALLY FIGURE OUT THAT ╔ WAS MISSING THE ╙╘┴ ─┴╘┴ INSTRUCTION --+
-
- ╙O, WHEN WRITING, MODIFYING, AND TRYING TO DEBUG CODE TRY TO TAKE YOUR TIME
- AND ISOLATE EVERY POSSIBLE PROBLEM. ┴LSO DON'T BE AFRAID TO STOP THE CODE
- MID-STREAM AS IN THE ABOVE WITH USE OF THE ┬╥╦. ┘OU CAN ALWAYS REMOVE IT
- (AND PROBAHLY SHOULD) IN THE FINAL CODE AND IT SERVES AS A VERY VALUABLE
- DEBUGGING TOOL WITH THE AID OF A MACHINE-LANGUAGE MONITOR.
-
-
- ╔╪. ═EMORY ═AP ├ONSIDERATIONS
- -------------------------
-
- ┬EFORE YOU START A PROGRAM IT'S A GOOD IDEA TO CONSIDER WHERE IN MEMORY YOU
- WILL HAVE EVERYTHING. ╬OW WE'VE ALREADY STARTED SOME OF THE PROGRAM ABOVE
- AND JUST BLINDLY PICKED NUMBERS AT RANDOM IT SEEMED LIKE $3000 FOR THE
- CHARACTER SET FOR THE ├=64 ETC... ╫E DIDN'T - ╔'M INTRODUCING THE ═EMORY
- ═AP ├ONSIDERATIONS HERE TO SHOW THE EXAMPLE OF WHAT IF WE DIDN'T THINK
- ABOUT HOW MEMORY WAS GOING TO BE ORGANIZED.
-
- ╘HE ├=64 ONLY HAS 64K OF MEMORY OF WHICH TYPICALLY THE RANGE $0800-$A000
- IS AVAILABLE AND $C000-$CFFF IS ALSO. ╔F WE HAD BLINDLY PICKED NUMBERS
- ALL OVER THE PLACE TO STORE OUR CODE THEN WE WOULD HAVE A DISORGANIZED
- PROGRAM THAT WOULD MOST LIKELY ACCIDENTALLY USE ONE SUBROUTINES STORAGE
- AS TEMPORARY DATA FOR ANOTHER. ╔T'S LIKE SHOOTING RANDOMLY IN ╠ASER ╘AG
- NOT CHECKING TO SEE IF THERE IS A TARGET THERE OR NOT FIRST... ╘HE END
- RESULT: ├HAOS.
-
- ├URRENTLY WE'RE NOT FOLLOWING THE RULE FOR "TEMPORARY VARIABLES" BUT AS
- WE GRADUALLY FADE OUT OF THE NORMAL ├-64/128 DEFAULT MODE AND WRITE OUR
- OWN ROUTINES / INTERRUPT HANDLERS WE'LL SWITCH THINGS OVER. ┴LSO, ON THE
- ├=128 INSTEAD OF USING ┬ANK 0 WITH THE ╔/╧ BLOCK ENABLED WE'RE CURRENTLY
- USING THE ┬┴╬╦ 15 CONFIGURATION AS THE PROGRAM DOESN'T EXTEND PAST $4000
- YET ($0000-$4000 IS COMMON MEMORY IN THE NORMAL ├=128 CONFIGUARTION).
-
- 64 ├ONSIDERATIONS
- -----------------
- ╘HE 64 WILL HAVE FREE MEMORY IN THE FOLLOWING AREAS: $0800-$A000, AND
- $C000-$CFFF. ╚OWEVER, IF WE DISABLE THE ┬ASIC ╥OM WE CAN HAVE THE WHOLE
- AREA FROM $0800-$CFFF FREE FOR OUR PROGRAM. ┬ECAUSE WE DON'T NEED THE
- ┬ASIC ╥OM WE WILL DO JUST THAT (IN THE LISTING NOW WE CURRENTLY WON'T BUT
- IT WILL BE DONE IN A FUTURE ISSUE). ╘HEREFORE HAVING THE CHARACTER SET
- AT $3000-$5000, THE MUSIC DATA AT $5000-$8000, THE PROGRAM WILL HAVE THE
- AREA FREE FROM $8000-$CFFF. $0800-$3000 WILL BE AVAILABLE IF NEEDED FOR
- ROUTINES WHO NEED TEMPORARY STORAGE.
-
- ╘EMPORARY ╙TORAGE IS GOING TO BE DEFINED AS FOLLOWS. ┼ACH ROUTINE THAT NEEDS
- TEMPORARY STORAGE WILL BE ASSIGNED A "LEVEL" NUMBER. ╘HE LOWER LEVELS WILL
- BE ASSIGNED LEVEL 1 ON UP TO LEVEL 3. ╘HE RANGE $0800-$3000 WILL BE
- BROKEN DOWN INTO THE FOLLOWING SUB-RANGES.
-
- ╠EVEL 1: $0800-$1000
- ╠EVEL 2: $1000-$1800
- ╠EVEL 3: $1800-$3000
-
- ╘HIS WAY WHEN WRITING THE SUB-ROUTINES WE CAN BE ASSURED THAT A SECTION OF
- MEMORY IS NOT OVERWRITTEN BY A SUBROUTINE WE CALL. ╫HEN WE ACTUALLY START
- PROGRAMMING WE'LL DECIDE WHERE IN EACH SUB-RANGE THE ROUTINE WILL HAVE
- ACCESS TO.
-
- 128 ├ONSIDERATIONS
- ------------------
- ╘HE 128 HAS TWO "BANKS" OF 64K EACH. ╬ORMALLY FOR LARGE PROGRAMS WE WOULD
- THINK ABOUT USING BOTH BANKS - (FROM THE IDEA: ╚EY! - ╫E GOT IT, WHY NOT
- FLAUNT IT?) BUT WE WON'T BE USING BOTH BANKS.
-
- ╞REE MEMORY ON THE ├128 TYPICALLY CONSISTS OF THE RANGE $0400-$09FF
- (WHERE WE'LL BE OVERWRITING THE 40 COLUMN SCREEN (WHICH WE'RE GONNA BLANK
- ANYWAY) AND THE ┬ASIC RUN-TIME STACK.) ┴LSO THE AREA FROM $0B00-$0FFF
- IS FREE (OVERWRITING THE TAPE AREA, THE RS-232 BUFFERS,L AND THE SPRITE
- DEFINITION AREA). ┴LSO $1300-$CFFF WILL BE FREE.
-
- ╬OW, THE ├=128 HAS DIFFERENT MEMORY MAPS IT CAN CONFIGURE ITSELF TO -
- ┬ANK 15 IS THE STANDARD MODE UNDER MOST BASIC PROGRAMS AND ALLOWS THE
- PROGRAMMER TO DIRECTLY "SYS" TO CALLS. ╘HE ══╒ (MEMORY MANAGEMENT UNIT -
- THE CHIP THAT DOES EVERYTHING) SEES MEMORY IN A SLIGHTLY DIFFERANT WAY
- THAN FROM BASIC. ╫E'LL COVER IT IN MORE DETAIL WHEN WE EXAMINE THE MEM_INIT
- ROUTINE. ╞OR NOW, WE'RE JUST GONNA SET UP IN THE PROGRAM AND NOT IN THE
- CODING SEGMENTS. ╘HE EXPLANATION OF WHAT WE'RE DOING WILL BE "REVEALED"
- IN A FUTURE ISSUE.
-
- ╫E WILL USE ┬ANK 0 OF MEMORY AND FROM $1300+ WILL BE THE PROGRAM. ╘HE RANGES
- OF $0400-$09FF AND $0B00-$0FFF WILL BE USED IN A SIMILAIR MANNAR AS THE ├64
- RANGES WERE FOR ╘EMPORARY ╙TORAGE. ╫E WILL ALSO HAVE THE ╔/╧ SECTION FROM
- $D000-$DFFF SWAPPED IN. ╘HIS IS NOT A STANDARD "BASIC ┬┴╬╦ #" BUT WHEN WE
- COVER THE INIT'MEMORY ROUTINE WE'LL SEE HOW WE CAN DO THIS. ═USIC DATA
- WILL BE FROM $A000-$D000.
-
-
- ╪. ╠OOKING ╞ORWARD / ┬ACK
- ----------------------
-
- ╚OPEFULLY THROUGH THE LISTING AND THE DISCUSSION OF THE ROUTINES YOU HAVE
- STARTED TO UNDERSTAND THE BASIC CONCEPT OF PROGRAMMING: BREAKING DOWN PROBLEMS
- INTO SMALLER SOLVABLE STEPS. ╘RY LOOKING BACK OVER THE CODE ASKING YOURSELF
- WHY THAT INSTRUCTION IS THERE. ╫HAT WOULD HAPPEN IF YOU SWITCHED THE ORDER?
- ╔S THERE AN EASIER, BETTER WAY TO DO THE SAME THING? ╫HY? ┬ETTER YET, HOW?
- ┼XAMINE THE CODE, MESS WITH IT, MUCK IT UP SO IT DOESN'T WORK AND THEN FIGURE
- OUT EXACTLY WHY. ╘HE ONLY WAY TO LEARN IS BY EXPERIMENTATION. (┬╘╫, MUCK UP
- A _COPY_ OF IT - NOT THE ORIGINAL ... *GRINS*)
-
- ╘AKE A LOOK AT THE DIFFERENT SECTIONS OF CODE AND ANALYZE THEM TO SEE HOW
- THEY DO WHAT THEY DO. ╘AKE A LOOK AT HOW THE CODE WAS ORGANIZED IN TERMS
- OF SIMPLIFICATION. ╘RACE THROUGH EACH SUBROUTINE SO THAT YOU'RE ABLE TO
- KNOW WHAT THE RETURN VALUES WILL BE. ╔N OTHER WORDS: ╙TUDY, ╙TUDY, ╙TUDY!!
- ╔'M IN SCHOOL AND SO ╔ KNOW ╔ JUST USED THE DREADED '╙' WORD BUT THAT'S
- WHAT YOU'RE GOING TO HAVE TO DO IF YOU'RE INTERESTED IN LEARNING 65XX/85XX
- MACHINE LANGUAGE. ╘HE ONLY WAY TO LEARN IT (EASILY) IS TO STUDY OTHER
- PEOPLE'S CODE AND TRY TO UNDERSTAND WHY THEY DID WHAT THEY DID.
-
- ╬EXT TIME WE WILL TAKE A LOOK AT THE INPUT ROUTINES FOR THE MOUSE, JOYSTICK
- AND KEYBOARD SCANNING. ╔N ADDITION WE WILL ALSO ALLOW THE PLAYER TO MOVE
- THE SHIP AROUND ON THE SCREEN TO TEST THE INPUT DRIVERS.
-
- ╔N ADDATION, ╔ AM STILL LOOKING FOR AN INDIVIDUAL TO HELP WITH MUSIC AND
- SOUND COMPOSITION FOR THIS PROGRAM. ┴ KNOWLEDGE OF THE ╙╔─ CHIP AND
- PROGRAMMING IS HELPFUL BUT NOT REQUIRED. ╔F YOU'RE WILLING TO HELP THEN
- PLEASE EMAIL ME AT DUCK@PEMBVAX1.PEMBROKE.EDU
-
-
- ╪╔. ╠ISTINGS
- --------
-
- ┬ECAUSE OF THE ENORMITY OF THE PROGRAM LISTING (SOME 1,500+ LINES) IT WILL
- NOT BE LISTED IN THIS ARTICLE BUT WILL INSTEAD BE AVAILABLE VIA ANONYMOUS
- FTP AT CCOSUN.CALTECH.EDU UNDER PUB/RKNOP/╚┴├╦╔╬╟.═┴╟ AS INVAS1.SFX.
-
- ╞OR THOSE OF YOU ON THE MAILING LIST WHO WOULD LIKE TO RECIEVE IT, A ═AIL-
- ╙ERVER WILL BE SET UP SOON TO HANDLE REQUESTS AND INFORMATION WILL BE
- SENT TO YOU CONCERNING INFORMATION ABOUT USING IT AS SOON AS IT'S COMPLETED.
-
- ╔N THE INVASION1.SFX FILE THERE ARE THE FOLLOWING FILES:
-
- INVASION.SRC - THE MAIN FILE
- GRAPHICS.SRC - HANDLES ALL GRAPHICS ROUTINES
- LOGO.DAT - CUSTOM CHARACTER LOGO
- CHARS64.DAT - ALIEN CUSTOM CHARACTERS FOR ├=64
- CHARS128.DAT - ALIEN CUSTOM CHARACTERS FOR ├=128
- TITLETXT.DAT - TEXT DATA FOR TITLE SCREEN
- TITLECOL.DAT - COLOR DATA FOR TITLE SCREEN
- INVASION-128 - EXECUTABLE VERSION OF ╙PACE ╔NVASION SO FAR FOR ├=128
- INVASION-64 - EXECUTABLE VERSION OF ╙PACE ╔NVASION SO FAR FOR ├=64
-
- ╬OTE: ╞OR THE ├OMMODORE 128 IT'S RECOMMENDED THAT YOU DO A RUN/STOP-RESTORE
- AND THEN A "┬┴╬╦15:╙┘╙7168" TO EXECUTE THE PROGRAM. ╞OR THE ├OMMODORE 64 IT'S
- RECOMMENDED THE BORDER BE CHANGED VIA: "╨╧╦┼53280,0:╨╧╦┼53281,0:╙┘╙ 32768" TO
- RUN THE PROGRAM.
-
- ==============================================================================
- ╘HE ─EMO ├ORNER:
-
- ╞╠╔ - MORE COLOR TO THE SCREEN
- BY ╨ASI '┴LBERT' ╧JALA (PO87553@CS.TUT.FI OR ALBERT@CC.TUT.FI)
- ╫RITTEN ON 16-═AY-91 ╘RANSLATION 01-╩UN-92
-
- (┴LL TIMINGS ARE IN ╨┴╠, ALTHO THE PRINCIPLES WILL APPLY TO ╬╘╙├ TOO)
-
- ┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64. ╧NE 8X8
- PIXEL CHARACTER POSITION MAY ONLY CARRY FOUR DIFFERENT COLORS. ╞╠╔ PICTURE
- CAN HAVE ALL OF THE 16 COLORS IN ONE CHAR POSITION. ╫HAT THEN IS THIS ╞╠╔
- AND HOW IT IS DONE ?
-
- ╔N THE NORMAL MULTICOLOR MODE CAN ONE CHARACTER POSITION (4X8 PIXELS) HAVE
- ONLY FOUR DIFFERENT COLORS AND ONE OF THEM IS THE COMMON BACKGROUND COLOR.
- ├OLOR CODES ARE STORED IN HALF BYTES (NYBBLES) TO THE VIDEO MATRIX MEMORY
- (ANYWHERE VIDEO MATRIX POINTER POINTS AT, NORMALLY $0400) AND TO THE COLOR
- MEMORY ($─800-$─┬╞╞). ╔N MULTICOLOR MODE THE COLOR OF EACH PIXEL IS
- DETERMINED BY TWO BITS IN THE GRAPHICS MEMORY. ┬IT PAIR 11 WILL REFER TO
- COLOR MEMORY, BACKGROUND COLOR IS THE COLOR FOR BIT PAIR 00, AND VIDEO
- MATRIX WILL DEFINE THE COLORS FOR BIT PAIRS 01 AND 10.
-
-
- _╫HAT HAPPENS IN THE ╓╔├ ?_
-
- ╓╔├ (╓IDEO ╔NTERFACE ├ONTROLLER) FETCHES COLOR INFORMATION FROM MEMORY ON
- EACH BAD LINE. ╘HIS WILL STEAL TIME FROM PROCESSOR, BECAUSE ╓╔├ NEEDS TO USE
- PROCESSOR'S BUS CYCLES. ┬AD LINE IS A CURSE IN THE ├64 WORLD. ╞ORTUNATELY
- ╓╔├'S DATA BUS IS 12 BITS WIDE AND SO THE COLOR DATA FETCH FOR EACH CHARACTER
- POSITION WILL TAKE ONLY ONE BUS CYCLE. ├OLOR MEMORY IS PHYSICALLY WIRED TO
- THE ╓╔├ DATABUS LINES ─8-─11.
-
- ╚OW DOES ╓╔├ KNOW WHERE TO FETCH THE GRAPHICAL INFORMATION ? ╙OME OF YOU KNOW
- THE MYSTICAL FORMULAS NEEDED TO MESS WITH THE PIXELS IN THE HIRES SCREEN.
- ╚OW ARE THESE FUNCTIONS OBTAINED ? ┴RE THEY JUST MAGIC ? ╬O, THERE ARE SOME
- INTERNAL COUNTERS IN ╓╔├. ╘HEY ALWAYS POINT TO THE RIGHT PLACE IN GRAFIX
- MEMORY AND THE ADDRESS IS DETERMINED LIKE THIS:
-
- ┴13 ┴12 ┴11 ┴10 ┴9 ┴8 ┴7 ┴6 ┴5 ┴4 ┴3 ┴2 ┴1 ┴0
- ├┬13 ╓├9 ╓├8 ╓├7 ╓├6 ╓├5 ╓├4 ╓├3 ╓├2 ╓├1 ╓├0 ╥├2 ╥├1 ╥├0
-
- ┴DDRESS BITS ┴15 AND ┴14 CHANGE ACCORDING TO THE SELECTED VIDEO BANK.
- ┴DDRESS BIT ┴13 IS ├┬13, WHICH MAY BE FOUND IN ╓╔├ REGISTER $18. ╔T
- SELECTS THE RIGHT SIDE OF THE VIDEO BANK TO BE THE BITMAP MEMORY. ╫ITH
- THESE BITS YOU CAN SET THE BITMAP TO EIGHT DIFFERENT PLACES IN MEMORY.
- ╚OWEVER, SOME OF THEM ARE USELESS BECAUSE OF THE CHARACTER ╥╧═ IMAGES AND
- ZERO PAGE/STACK. ╥EST OF THE BITS COME FROM THE INTERNAL COUNTERS.
-
- ╓├9-╓├0 (╓IDEO ├OUNTER) FORMS THE ADDRESS BITS 12-3. ╘HE COUNTER ROLLS
- THROUGH ALL 1000 CHARACTER POSITIONS, 0-39 ON THE FIRST EIGHT LINES, 40-79
- ON THE SECOND EIGHT LINES AND SO ON. ╘HE LOWEST THREE BITS COME FROM THE ROW
- COUNTER, ╥├2-╥├0. ╘HIS IS ANOTHER ╓╔├ COUNTER AND IT COUNTS THE SCAN LINES
- FROM ZERO TO SEVEN.
-
-
- _┴ SOFTWARE GRAPHICS MODE - ╞╠╔_
-
- ╓╔├ WILL SYSTEMATICALLY GO THROUGH EVERY BYTE IN THE BITMAP MEMORY, BUT HOW
- DOES IT KNOW WHERE AND WHEN TO GET THE COLOR INFORMATION ? ╘HIS IS WHERE
- THE MAIN PRINCIPLE OF ╞╠╔ (╞LEXIBLE ╠INE ╔NTERPRETATION) LIES. ├OLOR DATA
- IS FETCHED (AND THIS MEANS IT IS A BAD LINE), WHEN THE LINE COUNTER MATCHES
- WITH THE VERTICAL SCROLL REGISTER. ╓├9-╓├0 DEFINES WHERE THE COLOR DATA IS
- INSIDE THE VIDEO MATRIX AND COLOR MEMORY.
-
- ╔F WE CHANGE THE VERTICAL SCROLL REGISTER, WE CAN FOOL ╓╔├ TO THINK THAT
- EVERY LINE IS A BAD LINE, SO IT WILL FETCH THE COLOR INFORMATION ON EVERY
- LINE TOO. ┬ECAUSE ╓╔├ WILL FETCH THE COLORS CONTINUOSLY, WE CAN GET
- INDEPENDENT COLORS ON EACH SCAN LINE. ╫E JUST HAVE TO CHANGE COLORS AND ╓╔├
- WILL HANDLE THE REST. ╒NFORTUNATELY THE RESULT IS THE LOSS OF 40 PROCESSOR
- CYCLES PER LINE (SEE THE ═ISSING ├YCLES ARTICLE FOR MORE INFORMATION ABOUT
- ╓╔├ STEALING CYCLES).
-
-
- _─OING IT IN PRACTICE_
-
- ╔N PRACTICE THERE IS NO TIME TO CHANGE COLOR MEMORY, BUT IN MULTICOLOR
- MODE ╓╔├ USES VIDEO MATRIX FOR COLOR INFORMATION TOO. ╫E HAVE JUST ENOUGH
- TIME TO CHANGE THE VIDEO MATRIX POINTER, $─018. ╬OW ╓╔├ WILL SEE A
- DIFFERENT VIDEO MATRIX ON EACH SCAN LINE, DIFFERENT BLOCK OF MEMORY. ╫ITH
- THE FOUR UPPER BITS IN THE REGISTER WE SELECT ONE OF THE 16 VIDEO MEMORIES
- IN THE VIDEO BANK. ╩UST REMEMBER THAT THE REGISTER ALSO SELECTS THE POSITION
- OF THE GRAPHICS MEMORY (BITMAP) INSIDE THE VIDEO BANK.
-
- ┬ECAUSE WE HAVE TO KEEP THE BITMAP IN THE SAME VIDEO BANK, WE ONLY HAVE HALF
- OF THE BANK FREE FOR VIDEO MATRICES. ╞ORTUNATELY, THAT'S ALL WE NEED TO GET
- INDIVIDUAL MULTICOLOR COLORS FOR EACH LINE AND CHARACTER POSITION.
- ╓╔├ WILL FETCH THE COLOR DATA FROM THE EIGHT VIDEO MATRICES AND THEN IT WILL
- ROLL ON TO THE NEXT 40 BYTES. ┴FTER EIGHT LINES AND MATRICES WE WILL SELECT
- THE FIRST VIDEO MATRIX AGAIN. (╙EE PICTURE 1)
-
- ╒SUALLY IT IS NOT NECASSARY TO USE THE WHOLE SCREEN FOR A ╞╠╔ PICTURE,
- ESPECIALLY IF YOU WANT TO HAVE A SCROLLER OR SOME OTHER EFFECTS. ┘OU JUST
- HAVE TO MAKE SURE THAT ╓╔├ IS FOOLABLE IN THE USUAL WAY. ╘HE TIMING IS ALSO
- VERY IMPORTANT, EVEN ONE CYCLE VARIATIONS IN THE ROUTINE ENTRY ARE NOT
- ALLOWED. ╘HERE IS MANY WAYS TO DO THE SYNCHRONIZATION. ╧NE WAY IS TO USE A
- SPRITE, AS IN THE PREVIOUS ARTICLE. (╙EE ├= ╚ACKING, ╓OL. 1, ╔SS. 3, ╘HE
- ─EMO ├ORNER: ═ISSING ├YCLES).
-
-
- _╬OT MUCH TIME_
-
- ┬ECAUSE A BAD LINE WILL STEAL 40 CYCLES, THERE IS ONLY 23 CYCLES LEFT ON
- EACH SCAN LINE. ╔T IS ENOUGH FOR CHANGING THE VIDEO MATRIX AND BACKGROUD
- COLOR. ╘HERE IS NOT A MOMENT TO LOSE, BECAUSE YOU MUST CHANGE THE VERTICAL
- SCROLL REGISTER, VIDEO MATRIX POINTER AND THE BACKGROUND COLOR. ╘HIS IS WHY
- YOU CAN'T HAVE SPRITES IN FRONT OF A ╞╠╔ PICTURE.
-
- ╫ITH ╞╠╔ WE GET TWO SELECTABLE COLORS FOR EACH CHARACTER POSITION AND LINE,
- EACH SCAN LINE CAN HAVE IT'S OWN BACKGROUND COLOR AND EACH CHARACTER POSITION
- STILL HAS ITS OWN CHARACTER COLOR FROM COLOR MEMORY. ╔N THEORY EACH CHARACTER
- POSITION COULD HAVE 25 DIFFERENT COLORS, UNFORTUNATELY ╓╔├ ONLY HAS 16.
-
-
- _┴ LITTLE FEATURE_
-
- ╓╔├ DOES NOT LIKE IT WHEN WE CHANGE THE VERTICAL SCROLL REGISTER ($─011),
- AND IS A BIT ANNOYED. ╔T 'SEES' CODE 255 (LIGHT GRAY) IN VIDEO MATRIX
- AND 9 (BROWN) IN THE COLOR MEMORY INSTEAD OF THE CORRECT VALUES STORED THERE.
- ┴CTUALLY THE COLOR VALUE SEEMS TO BE THE LOWER NYBBLE OF THE DATA BYTE
- CURRENTLY ON THE DATA BUS (ACCESSED BY THE PROCESSOR (╠─┴#=$┴9)).
- ╒NFORTUNATELY THERE IS NO CHANCE TO DO THE REGISTER CHANGE IN THE BORDER
- AND THUS THE THREE LEFTMOST CHARACTER COLUMNS ARE A BIT USELESS, BECAUSE
- THE COLORS ARE FIXED.
-
- ╚OWEVER, THIS DOESN'T MEAN THAT YOU CAN'T USE THOSE THREE COLUMNS. ╞╠╔
- EDITORS MAY NOT SUPPORT THE FIXED COLORS THOUGH, SO IT MAY BE HARD TO USE
- THEM.
-
-
- _╫HAT TO DO WITH ╞╠╔ ?_
-
- ┬ECAUSE ╞╠╔ WILL EAT UP ALL THE AVAILABLE PROCESSOR TIME (NO ├OPPER :-),
- IT IS NOT SUITABLE FOR ANY ACTION-GAMES. ┼ACH ╞╠╔ PICTURE TAKES ABOUT 17 K┬
- OF MEMORY: NOT SO MANY PICTURES FIT ON ONE FLOPPY. ╙O, THE ONLY PLACE FOR ╞╠╔
- IS DEMOS, INTROS, BOARD-TYPE GAMES AND MAYBE A ╟╔╞ VIEWER..
-
- --------------------------------------------------------------------------
- ╨ICTURE 1: ╞ROM WHICH MATRIX ╓╔├ FETCHES THE MULTICOLOR VALUES
-
- _ ___________________________________________________________
- ▄ ... ▄ ═ATRIX0 ▄ ═ATRIX0 ▄ ═ATRIX0 ▄
- ▄ , .▄____3__________▄____4__________▄____5__________▄ ...
- ▄ ╒ .▄ ═ATRIX1 ▄ ═ATRIX1 ▄ ═ATRIX1 ▄
- ▄ S .▄____3__________▄____4__________▄____5__________▄ .
- ▄├HAR E ▄ ═ATRIX2 ▄ ═ATRIX2 ▄ ═ATRIX2 ▄ .
- ▄╠INE L ▄____3__________▄____4__________▄____5__________▄ .
- ▄┌ERO E ▄ ═ATRIX3 ▄ ═ATRIX3 ▄ ═ATRIX3 ▄
- ▄ S ▄____3__________▄____4__________▄____5__________▄
- ▄ S, ▄ ═ATRIX4 ▄ ═ATRIX4 ▄ ═ATRIX4 ▄
- ▄ ▄____3__________▄____4__________▄____5__________▄
- ▄ C ▄ ═ATRIX5 ▄ ═ATRIX5 ▄ ═ATRIX5 ▄
- ▄ O ▄____3__________▄____4__________▄____5__________▄
- ▄ L ▄ ═ATRIX6 ▄ ═ATRIX6 ▄ ═ATRIX6 ▄
- ▄ U ▄____3__________▄____4__________▄____5__________▄
- ▄ M ▄ ═ATRIX7 ▄ ═ATRIX7 ▄ ═ATRIX7 ▄
- ▄_ N ▄____3__________▄____4__________▄____5__________▄
- S ▄ ═ATRIX0 ▄ ═ATRIX0 ▄ ═ATRIX0 ▄
- ▄___43__________▄___44__________▄___45__________▄
- ▄ ═ATRIX1 ▄ ═ATRIX1 ▄ ═ATRIX1 ▄
- ▄___43__________▄___44__________▄___45__________▄
- ▄
- ▄ ...
- ▄ .
- ▄ .
- ▄ .
-
- --------------------------------------------------------------------------
- _┴DDITIONAL READING_
-
- ╔F YOU HAVE AN ┴MIGA YOU MIGHT WANT TO GET YOUR HANDS INTO MY CONVERSION
- PROGRAMS IN ├64╟╞╪1.LHA. ╘HE PACKET ALSO INCLUDES ╞╠╔ VIEWER FOR ╨┴╠ ├64'S
- AND SOME DOCUMENTATION ABOUT THE ╞╠╔ FILE FORMAT. ╔T ALSO HAS THE SAME
- UTILITIES FOR ╦OALA FORMAT PICTURES.
-
- ┴VAILABLE FROM:
- CWAVES.STFX.CA
- NIC.FUNET.FI:/PUB/AMIGA/GRAPHICS/APPLICATIONS/CONVERT
-
-
- ├64╟╞╪.DOC
- ├64╟FX1.0
- ┴ ├64 GRAFIX FORMAT CONVERSION PACKAGE
- )1991,1992 ╨ASI '┴LBERT' ╧JALA
-
- ┼-MAIL: PO87553@CS.TUT.FI
- ALBERT@CC.TUT.FI
-
- ╘HIS PACKAGE CONTAINS PROGRAMS WHICH ARE USED TO CONVERT PORTABLE
- PIXMAP (PPM) FILES TO ├64 GRAPHICS FORMATS (╞╠╔ AND KOALA) UNDER
- ┴MIGA╧╙. ╘HE PACKAGE INCLUDES ├ SOURCE CODES FOR THE PROGRAMS, SO
- IT IS POSSIBLE TO PORT THE PROGRAMS TO ANOTHER ENVIRONMENT. ├64╟╞╪1.1
- INCLUDES ╒NIX-COMPILABLE SOURCES.
-
- ╔N ADDITION TO THIS PACKAGE YOU NEED E.G. ╨┬═╨LUS TO CONVERT ┴MIGA
- ILBM FILES TO PPM FIRST. ┴ND OF COURSE SOME WAY TO TRANSFER FILES
- BETWEEN THE MACHINES.
-
- =============================================================================
- ╥╙-232 ├ONVERTER
- BY ╫ARREN ╘USTIN (WARREN@COL.HP.COM)
-
- ╘HIS ARTICLE PRESENTS A WAY TO INTERFACE FROM THE ├= RS232 HARDWARE
- BEHIND THE USER PORT TO A STANDARD 25PIN FEMALE RS232 CONNECTOR USING ONLY
- ONE ╔├ AND A FEW CAPACITORS. ╔T IS NOT A ╒┴╥╘ OR A ╙╫╔╞╘╠╔╬╦ TYPE INTERFACE
- WHICH TAKE PLACE OF THE INTERNAL ├= RS232 CIRCUITRY, BUT A SIMPLE LEVEL SHIFTING
- INTERFACE THAT USES THE INTERNAL RS232 ROUTINES AND TRANSLATES THE USER PORT
- LEVELS TO RS232 LEVELS. ╘HEREFORE YOU CAN ONLY GET UPTO 2400BAUD/9600BAUD
- (├=64/├=128) WITH THIS DESIGN.
-
- ╘HE "OLD" WAY TO DO THIS WAS TO USED ═├1488 AND ═├1489 PARTS (A LINE
- DRIVER AND LINE RECEIVER), HOWEVER THESE REQUIRED A NEGATIVE SUPPLY TO INTERFACE
- PROPERLY. ╘HE USER PORT ONLY SUPPLIES +5VOLTS, HENCE THIS PRESENTS A PROBLEM.
- ╘HERE HAS BEEN SUCCESS USING THESE PARTS OR DISCRETE TRANSISTORS AND RESISTORS
- SINCE MANY MODEMS ARE SOMEWHAT FRIENDLY AND SEEM TO WORK EVEN THOUGH THE LEVELS
- WERE MARGINAL. ┴LSO, SOME SIGNALS WERE NOT USED, ALLOWING FOR POTENTIAL
- PROBLEMS. ┴NOTHER WAY TO SOLVE THIS PROBLEM WAS TO BUY A $25-30 INTERFACE. ╔F
- YOU CAN FIND THE ╔├ BELOW, YOU HAVE ANOTHER CHOICE THAT IS RELATIVELY
- INEXPENSIVE.
-
- ╘HE ╠╘1133 IS BASICALLY THE ═├1488 AND 1489 PUT TOGETHER INTO ONE PART
- WITH AN INTERNAL CHARGE PUMP SCHEME THAT ALLOWS THE INTERNAL DRIVERS TO OUTPUT
- +5 AND -5 VOLTS TO THE RS232 CONNECTOR. ╔T ALSO HAS ENOUGH DRIVERS AND
- RECEIVERS TO HANDLE ALL OF THE SIGNALS THAT THE ├= USES FOR RS232.
-
- ╙O WITH THIS ╔├, 5 CAPACITORS AND THE TWO CONNECTORS (USER PORT AND
- RS232) YOU CAN BUILD YOUR OWN INTERFACE TO THE STANDARD 25 PIN MODEM CABLE.
-
- ╚ERE ARE THE PLANS FOR AN ╒SER PORT ╘╧ ╥╙232 CONNECTOR USING JUST ╧╬┼ ╔├ AND
- 4 CAPACITORS. ╔T USES A ╠INEAR ╘ECHNOLOGY ╠╘1133 BUFFER THAT HAS 3 ╥╙232
- DRIVERS AND 5 RECEIVERS. ╔T HAS WORKED FOR ME WITH NO PROBLEMS AND TAKES
- A MINIMUM AMOUT OF WIRING TO GET TO WORK. ═Y BOARD IS ONLY THE WIDTH OF
- THE USER PORT AND ABOUT 1.5 INCHES DEEP IN SIZE.
-
- ╨ARTS LIST:
- ----------
- ╠╘1133├╬ PLASTIC DIP OR ╠╘1133├╩ CERAMIC DIP ╥╙232 DRIVER FROM ╠INEAR
- ╘ECHNOLOGIES
-
- (╔T TAKES 27M┴ MAX (17M┴ TYPICAL) SO IS WELL BELOW THE 100M┴
- LIMIT OF THE USER PORT)
-
- ─RIVER ╔N PINS (15,19,21) ╘╘╠/├═╧╙ COMPATIBLE. ╒NUSED INPUTS
- ▄ ▄ ▄ SHOULD BE TIED TO +5V.
- ─RIVER ╧UT PINS (11, 7, 5) ╥╙232 COMPATIBLE. ╙HORT CIRCUIT
- PROTECTED FROM -30V TO +30V.
- ╥ECEIVER ╔N PINS (6, 8, 9, 10,12) ┴CCEPT ╥╙232 LEVELS (+-30V)
- ▄ ▄ ▄ ▄ ▄ AND HAVE 0.4V OF HYSTERESIS TO
- ▄ ▄ ▄ ▄ ▄ PROVIDE NOISE IMMUNITY.
- ╥ECEIVER ╧UT PINS (20,18,17,16,14) ╘╘╠/├═╧╙ OUTPUTS.
-
- ╬╧╘┼: ╠INES ABOVE INDICATE WHICH INPUTS GO WITH WHICH OUTPUTS, AND
- THE PAIRS CAN BE INTERCHANGED FREELY. ╔ CONNECTED THEM AS
- DESCRIBED BELOW BECAUSE THE WIRING WORKED OUT THE BEST FOR ME.
-
- 4 - >= 1U╞ CAPACITORS ╒SED TO GENERATE ╥╙232 VOLTAGES BY A CHARGE PUMP
- TECHNIQUE INSIDE ╔├
- 1 1U╞ CAPACITOR ╘O BYPASS THE 5VOLT SUPPLY FOR NOISE REJECTION.
-
- 1 ╒SER PORT FEMALE CONNECTOR. (╔ JUST DUG THIS UP, ╔'M NOT SURE
- WHERE THESE CAN BE FOUND, ╔ THINK IT IS 0.159" SPACING, 24PIN.
-
- 1 ╥╙232 25PIN FEMALE CONNECTOR. ├AN BE FOUND AT ╥-╙HACK
-
- ╙OME SORT OF .1" SPACING PROTO BOARD
-
- ├ONNECTIONS:
- -----------
-
- ╒SER PORT CONNECTOR (╠OOKING INTO THE ├64 OR ├128)
-
- 1 2 3 4 5 6 7 8 9 10 11 12
- ------------------------------------
- ▄╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪▄
- ------------------------------------
- ┴ ┬ ├ ─ ┼ ╞ ╚ ╩ ╦ ╠ ═ ╬
-
- ╟ROUND & ╨OWER:
- --------------
-
- ╨INS 1, ┴, 12, ╬ TO ╟ROUND OF BOARD.
- ╠╘1133 PIN 2 TO PIN 2 OF ╒SER PORT CONNECTOR (+5 VOLTS)
- 1U╞ CAPACITOR BETWEEN PIN2 AND GROUND (BYPASS CAP)
- ╠╘1133 PIN 13 TO ╟ROUND.
- ╥╙232 CONNECTOR PINS 7 & 1 TO ╟ROUND.
-
- ╠╘1133 CAPACITORS:
- 1U╞ FROM PIN 1 (╓+) TO GROUND (╔F POLARIZED (ELECTROLYTIC) + SIDE TO PIN 1)
- 1U╞ FROM PIN 24 (╓-) TO GROUND (┴S ABOVE BUT + SIDE TO GROUND)
- 1U╞ FROM PIN 3 (├1+) TO PIN 4 (├1-) (┴GAIN IF POLARIZED, + SIDE TO PIN 3)
- 1U╞ FROM PIN 22 (├2+) TO PIN 23 (├2-) (┴GAIN IF POLARIZED, + SIDE TO PIN 22)
-
-
- ├OMMODORE SIDE ╥╙232 SIDE
- ╒SER PORT ╙IGNAL ╨IN OF ╙IGNAL ╨IN OF ╥╙232
- PIN NAME ╠╘1133 DIRECTION ╠╘1133 CONNECTOR
- --------- ------ ------ --------- ------ ---------
- ┬ ╞╠┴╟2 ─IN 20 <-- 6 3
- ├ ╨┬0 ─IN ALSO CONNECT TO ABOVE PIN 20
- ─ ╨┬1 ╥╘╙ 21 --> 5 4
- ┼ ╨┬2 ─╘╥ 19 <-- 7 20
- ╞ ╨┬3 ╥╔ 18 --> 8 22
- ╚ ╨┬4 ─├─ 17 --> 9 8
- ╩ ╨┬5 ╬OT USED
- ╦ ╨┬6 ├╘╙ 16 --> 10 5
- ╠ ╨┬7 ─╙╥ 14 <-- 12 6
- ═ ╨┴2 ─OUT 15 --> 11 2
-
-
- ╘HIS ASSUMES THAT YOU WANT TO CONNECT ALL OF THE COMMUNICATION LINES. ╔ DID
- IT THIS WAY BECAUSE THE ├128 PROGRAMMERS REFERENCE GUIDE HAD ALL OF THE SIGNALS
- ABOVE LISTED. ╔F YOU WANT TO DROP ╥╔ (RING INDICATOR) YOU COULD ALSO USE AN
- ╠╘1134 WHICH HAS 4 DRIVERS AND 4 RECEIVERS.
-
- ╨ARTS ╙UBSTITUTION:
-
- ╘HERE ARE OTHER ╔├'S AVAILABLE WHICH WILL WORK IN THIS APPLICATION.
- ╘HE RS232 BUS LEVELS FOR THE ╠╘ PARTS ARE SPEC'ED AT ▐ +/- 7V TYPICAL, WHILE
- THE ═┴╪╔═ PARTS ARE +/-9V TYPICAL. (┬OTH ARE MIN AT +/- 5V WHICH SHOULD WORK
- IN ALL APPLICATIONS). ╔ THINK THAT AN INTERFACE CAN BE DONE WITH ONLY 3
- LINES, ─IN(╥X), ─OUT(╘X), AND EITHER ─╙╥ OR ├╘╙, SO IF YOU CAN'T GET THE
- ╠╘1133 ONE OF THESE OTHERS MIGHT WORK, ALTHOUGH THE PINOUTS WOULD BE DIFFERENT.
- ╘HE MAX YOU WOULD NEED IS WHAT THE ╠╘1133 SUPPLIES, 3 DRIVERS & 5 RECEIVERS.
-
- ╚ERE IS A DESCRIPTION OF PARTS THAT MIGHT BE SUBSTITUTED:
- (╬OTE, WITH ALL OF THEM YOU SHOULD USE A BYPASS CAP ON THE +5V SUPPLY WHICH
- ╔ HAVE ╬╧╘ INCLUDED IN THE COUNTS BELOW.)
-
- ╥╙232 ╥╙232 # OF ┼╪╘┼╥╬┴╠
- ╬┴═┼ ╨╔╬╙ ─╥╔╓┼╥╙ ╥┼├┼╔╓┼╥╙ ├┴╨╙ ├╧══┼╬╘╙
- -------------------------------------------------------------------------
- ╠INEAR ╘ECHNOLOGY PARTS...
- (╧N THE PARTS WITH SHUTDOWN (╙─), THE PIN MUST BE TIED TO +5 TO OPERATE)
- ╠╘1133 24 3 5 4 ╔N ARTICLE ABOVE
- -------------------------------------------------------------------------
- ╠╘1130 28 5 5 4 ╧VERKILL (╙─P14)
- ╠╘1131 28 5 4 4 2 EX ─R, 1 < ╥CVR
- ╠╘1132 24 5 3 4 2 EX ─R, 2 < ╥CVR
- ╠╘1134 24 4 4 4 1 < ╥CVR
- ╠╘1136 28 4 5 4 1 EX ─R (╙─P14)
- ╠╘1137 28 3 5 4 ╙─P13
- ╠╘1138 28 5 3 4 ╠╘1132 W/╙─P13
-
- ═┴╪╔═ PARTS... (╙OME ALSO HAVE A ╘╘╠ ┼╬_ PIN THAT MUST BE TIED TO 0V TO OPERATE)
- (╧N THESE PARTS, ╙─ MUST BE TIED TO 0V TO OPERATE!)
- ═┴╪232 16 2 2 4 ═AY WORK
- ═┴╪233 20 2 2 0! ╬O EXTERNAL CAPS
- ═┴╪235 24 5 5 0! ╧VERKILL, BUT ╬╧ CAPS,
- ╙─P21, ┼╬_P20
- ═┴╪236 24 4 3 4 1 EX ─R, 2 < ╥CVR,
- ╙─P21, ┼╬_P20
- ═┴╪237 24 5 3 4 2 EX ─╥, 2 < ╥CVR
- ═┴╪238 24 4 4 4 1 EX ─╥, 1 < ╥CVR
-
- ╔N SUMMARY, YOU CAN SEE THERE ARE MANY DIFFERENT PARTS YOU COULD USE,
- ESPECIALLY IF YOU DON'T NEED ALL THE SIGNALS. ╘HE ═┴╪╔═ PARTS SEEM TO
- DO THE JOB IN FEWER PINS AND A LITTLE BETTER TYPICAL DRIVE SPEC AND ╔
- WOULD RECOMMEND THE ═┴╪235 OVERALL SINCE YOU ONLY NEED 1 BYPASS CAP TO
- MAKE IT OPERATE!
-
- =============================================================================
- ╔NTRODUCTION TO THE ╓╔├-╔╔
- BY ╨ASI '┴LBERT' ╧JALA ( ... )
-
- ╘HE ╓IDEO ╔NTERFACE ├ONTROLLER USED IN ├64 HAVE SEVERAL DIFFERENT OPERATING
- MODES AND DIFFERENT GRAPHICAL PRIMITIVES. ┬ASICALLY THERE IS A) CHARACTER
- MODE, B) BITMAP MODE AND C) MOVABLE OBJECTS THAT CAN BE MIXED WITH THE
- OTHER GRAPHICS. ╘HESE PRIMITIVES CAN ALSO BE PUT INTO A MORE COLORFUL MODE,
- BUT YOU LOSE HALF OF THE RESOLUTION IN THAT PROCESS.
-
-
- ╔. ╙TANDARD ├HARACTER ─ISPLAY ═ODE
-
- ╔N THE CHARACTER DISPLAY MODE, ╓╔├ FETCHES CHARACTER POINTERS FROM VIDEO
- MATRIX, WHICH CONSISTS OF 1000 8-BIT BYTES FORMATTED AS 25 ROWS OF 40
- CHARACTERS EACH. ╘HE 8-BIT CHARACTER CODE IMPLIES 256 DIFFERENT CHARACTERS
- SIMULTANEOUSLY ONSCREEN.
-
- ┼ACH CHARACTER CODE CAN HAVE AN UNIQUE IMAGE, WHICH CONSISTS OF 8 BYTES IN
- CHARACTER MEMORY. ╘HE POSITION OF THE CHARACTER MEMORY CAN BE MOVED WITH THE
- CHARACTER BASE POINTER AND THUS IT IS POSSIBLE TO HAVE SEVERAL CHARACTER SETS
- SIMULTANEOSLY IN MEMORY. ╧NE CHARACTER MEMORY IS 2048 BYTES.
-
- ╔N ADDITION TO THE CHARACTER CODE, EACH POSITION IN VIDEO MATRIX HAS AN
- ASSOCIATED COLOR NYBBLE (4 BITS) IN COLOR MEMORY ($─800-$─╞╞╞). ╞OR EACH
- ZERO-BIT IN THE CHARSET THE BACKGROUND COLOR FROM REGISTER $21 IS DISPLAYED,
- THE COLOR-NYBBLE IS USED FOR THE ONE-BIT.
-
-
- ╔╔. ├HARACTER ═ULTICOLOR ═ODE
-
- ╔N CHARACTER MULTICOLOR MODE, COLOR SELECTION IS INCREASED. ┼ACH BYTE IS
- FETCHED FROM THE CHARACTER MEMORY JUST LIKE IN THE STANDARD CHARACTER MODE,
- BUT THEY ARE INTERPRETED DIFFERENTLY. ╔N THIS MODE BYTES ARE DIVIDED INTO
- BIT-PAIRS. ╞OR BIT PAIR "00" THE BACKGROUND COLOR FROM REGISTER $21 IS
- DISPLAYED, BACKGROUND COLOR #1 IS USED FOR BIT PAIR "01" AND BACKGROUND
- COLOR #2 FOR BIT PAIR "10". ╘HE COLOR NYBBLE WILL DEFINE THE COLOR FOR BIT
- PAIR "11".
-
- ╘HE HIGHEST BIT IN THE COLOR MEMORY DEFINES WHETHER THE CHARACTER IS TO BE
- DISPLAYED IN MULTICOLOR ("1") OR IN STANDARD MODE ("0"). ┬ECAUSE OF THIS,
- ONLY COLORS IN THE RANGE FROM 0 TO 7 ARE POSSIBLE FOR BIT PAIR "11". ┴ND SINCE
- TWO BITS ARE REQUIRED TO SPECIFY ONE DOT COLOR, THE CHARACTER IS NOW DISPLAYED
- AS A 4X8 MATRIX INSTEAD OF THE 8X8 MATRIX AND THE SIZE OF THE DOTS ARE DOUBLED
- HORIZONTALLY.
-
-
- ╔╔╔. ┼XTENDED ├OLOR ═ODE
-
- ╘HE EXTENDED COLOR MODE ALLOWS THE SELECTION OF ONE BACKGROUND COLOR FROM FOUR
- POSSIBILITIES FOR EACH CHARACTER POSITION IN THE NORMAL 8X8 RESOLUTION. ╘HE
- CHARACTER IMAGE DATA IS PROCESSED LIKE IN STANDARD CHARACTER MODE, BUT THE
- TWO MOST SIGNIFICANT BITS IN THE CHARACTER CODE (VIDEO MATRIX) ARE USED TO
- SELECT THE RIGHT BACKGROUND COLOR REGISTER. ╧NLY CHARACTER IMAGES FROM 0 TO 63
- ARE ACCESSIBLE, BECAUSE TWO OF THE MOST SIGNIFICANT BITS ARE USED FOR THE
- BACKGROUND COLOR SELECTION.
-
- ┼XTENDED COLOR MODE AND MULTICOLOR MODE SHOULD NOT BE SELECTED SIMULTANEOSLY,
- BECAUSE THIS WILL RESULT A BLACK SCREEN. ╚OWEVER, THIS IS A VERY EASY WAY TO
- HIDE SOMETHING IF NEEDED.
-
-
- ╔╓. ╙TANDARD ┬IT ═AP ═ODE
-
- ╔N BIT MAP MODE, A ONE-TO-ONE CORRESPONDENCE EXISTS BETWEEN EACH DISPLAYED
- DOT AND A MEMORY BIT. ╘HE BIT MAP PROVIDES A RESOLUTION OF 320╚ X 200╓
- INDIVIDUALLY CONTROLLED PIXELS. ╘HE VIDEO MATRIX IS STILL ACCESSED AS IN
- CHARACTER MODE, BUT THE DATA IS INTERPRETED AS COLOR DATA. ╫HEN A BIT IS "0"
- IN THE BIT MAP DATA, THE COLOR FROM THE LOWER NYBBLE IS SELECTED. ╘HE
- HIGHER NYBBLE FROM THE VIDEO MATRIX IS USED FOR THE BIT "1".
-
-
- ╓. ═ULTICOLOR ┬IT ═AP ═ODE
-
- ╔N MULTICOLOR BIT MAP MODE TWO BITS IN THE BIT MAP MEMORY DETERMINE THE COLOR
- OF ONE PIXEL. ╔F THE BIT PAIR IS "11", THE COLOR FOUND FROM THE COLOR MEMORY
- IS USED. ╘HE BACKGROUND COLOR IS USED FOR BIT PAIR "00" AND THE VIDEO MATRIX
- DEFINES THE COLORS FOR BIT PAIRS "01" AND "10". ┴S IT TAKES TWO BITS TO DEFINE
- ONE PIXEL COLOR, THE HORIZAONTAL RESOLUTION IS HALVED TO 160╚ X 200╓.
-
-
- ╓╔. ═OVABLE ╧BJECT ┬LOCKS (═╧┬S)
-
- ╘HE MOVABLE OBJECT BLOCK IS A SPECIAL TYPE OF GRAPHICAL OBJECT WHICH CAN BE
- DISPLAYED INDEPENDENTLY FROM THE OTHER GRAPHICS. ┼ACH ONE OF THE ═╧┬S CAN
- BE MOVED INDEPENDENTLY ANYWHERE IN THE SCREEN. ┼IGHT UNIQUE ═╧┬S CAN BE
- DISPLAYED SIMULATANIOUSLY, EACH DEFINED BY 64 BYTES IN MEMORY WHICH ARE
- DISPLAYED AS A 24 X 21 PIXEL ARRAY.
-
- ┼ACH ═╧┬ CAN BE SELECTIVELY ENABLED (═N┼="1") OR DISABLED (═N┼="0"). ┴ ═╧┬
- IS POSITIONED VIA ITS ╪ AND ┘ POSITION REGISTERS. ╬INE BITS ARE NEEDED TO
- DEFINE THE VERTICAL POSITION AND THE MOST SIGNIFICANT BITS OF ALL ═╧┬S ARE
- STORED IN THE REGISTER $10. ┴S ╪ LOCATIONS 23 TO 347 AND ┘ LOCATIONS 50 TO
- 249 ARE ENTIRELY VISIBLE ON THE SCREEN, ═╧┬S CAN BE SMOOTHLY MOVED TO AN
- OFF-SCREEN POSITION.
-
- ┼ACH ═╧┬ HAS ITS OWN COLOR REGISTER AND A ═╧┬ CAN BE DISPLAYED EITHER IN
- STANDARD OR MULTICOLOR MODE (═N═├="1"). ┴S USUALLY, MULTICOLOR MODE GIVES
- MORE COLORS, BUT HALVES THE HORIZONTAL RESOLUTION. ╔N MULTICOLOR MODE BIT
- PAIR "00" IS TRANSPARENT, THE ═╧┬ COLOR REGISTER DEFINES THE COLOR FOR PAIR
- "10", AND ═╧┬ MULTICOLOR REGISTERS GIVE THE COLORS FOR PAIRS "01" AND "11".
-
- ═╧┬S CAN BE SELECTIVELY EXPANDED IN BOTH DIRECTIONS. ╫HEN ═╧┬ IS EXPANDED,
- THE PIXEL SIZE ALSO EXPANDS AND IT IS STILL DISPLAYED AS 24 X 21 MATRIX
- (12 X 21 IN MULTICOLOR MODE).
-
- ═╧┬ PRIORITIES DEFINE WHETHER A ═╧┬ APPEARS BEHIND OR ON TOP OF THE CHARACTER
- OR BIT MAP GRAPHICS. ┴ "1" IN ═N─╨ MEANS ═╧┬ IS DISPLAYED BEHIND. ═╧┬
- COLLISION REGISTERS MAY BE USED TO DETECT IF A NON-TRANSPARENT DATA OF TWO
- ═╧┬S OR A ═╧┬ AND CHARACTER OR BITMAP FOREGROUND DATA IS COLLIDING.
-
- [┼D'S ╬OTE: ═╧┬'S ARE ╙PRITES. ├OMMODORE INITIALLY REFERRED TO THEM AS ═╧┬'S
- AND STILL DOES IN SOME AREAS.]
-
-
- ╓╔╔. ╧THER FEATURES
-
- ╘HE DISPLAY SCREEN MAY BE BLANKED BY SETTING THE ─┼╬ BIT TO A "0". ╘HE ENTIRE
- SCREEN WILL BE FILLED WITH THE BORDER COLOR AS SET IN REGISTER 32 ($20).
- ╫HEN THE SCREEN IS BLANKED, ╓╔├ WILL NEED ONLY TRANSPARENT MEMORY CYCLES AND
- THE PROCESSOR IS NOT SLOWED DOWN. ╚OWEVER, ═╧┬ DATA IS STILL FETCHED, IF
- THE ═╧┬S ARE NOT ALSO DISABLED.
-
- ╘HE NORMAL DISPLAY CONSISTS OF 25 ROWS OF 40 CHARACTERS EACH. ╘HE DISPLAY
- WINDOW CAN BE REDUCED TO 24 ROWS AND 38 CHARACTERS. ╘HIS HAS NO EFFECT ON HOW
- THE DATA IS INTERPRETED, ONLY THE CHARACTERS NEXT TO THE BORDER ARE COVERED
- BY THE BORDER. ╥╙┼╠ CONTROLS THE NUMBER OF ROWS ("1" FOR 25 ROWS) AND ├╙┼╠
- CONTROLS THE NUMBER OF COLUMNS ("1" FOR 40 COLUMNS).
-
- ╘HE DISPLAY DATA MAY BE SCROLLED UP TO ONE CHARACTER SPACE IN BOTH VERTICAL
- AND HORIZONTAL DIRECTION. ╨OSITION OF THE SCREEN IS SET WITH THE 3 LOWEST
- ORDER (LEAST SIGNIFICANT) BITS IN REGISTERS 22 ($16) AND 17 ($11).
-
- ╠IGHT PEN LATCH IS USED TO CATCH THE POSITION OF THE LIGHT PEN WHEN A PULSE
- IS RECEIVED IN THE ╠╨ PIN. ╘HE VALUE IS LATCHED ONLY ONCE IN A FRAME.
-
- ╘HE RASTER REGISTER IS A DUAL-FUNCTION REGISTER. ┴ READ FROM THE RASTER
- REGISTER RETURNS THE CURRENT RASTER POSITION AND A WRITE TO IT WILL SET THE
- RASTER COMPARE VALUE. ╫HEN THE WRITTEN VALUE AND THE CURRENT RASTER LINE
- MATCHES, A RASTER INTERRUPT IS GENERATED IF ENABLED. ╥ASTER REGISTER HAS ITS
- MOST SIGNIFICANT (9TH) BIT IN REGISTER 17 ($11).
-
- ╘HE INTERRUPT REGISTER SHOWS THE STATUS OF THE FOUR SOURCES OF INTERRUPT.
- ┴ CORRESPONDING BIT WILL BE SET TO "1" WHEN AN INTERRUPT SOURCE HAS GENERATED
- AN INTERRUPT REQUEST. ╘O ENABLE AN INTERRUPT REQUEST TO SET THE /╔╥╤ OUTPUT
- TO ZERO, THE CORRESPONDING ENABLE BIT IN REGISTER 26 ($1A) MUST BE SET TO
- "1". ╘HE INTERRUPT LATCH MAY ONLY BE CLEARED BY WRITING A "1" TO THE
- DESIRED LATCH IN THE INTERRUPT REGISTER.
-
- -----------------------------------------------------------------------------
- ╓╔├ REGISTER MAP (┬ASE ADDRESS $D000)
-
- ┴DDRESS ─┬7 ─┬6 ─┬5 ─┬4 ─┬3 ─┬2 ─┬1 ─┬0 ─ESCRIPTION
- -------------------------------------------------------------------
- 00 $00 ═0╪7 ═0╪6 ═0╪5 ═0╪4 ═0╪3 ═0╪2 ═0╪1 ═0╪0 ═╧┬ 0 ╪-POSITION
- 01 $01 ═0┘7 ═0┘6 ═0┘5 ═0┘4 ═0┘3 ═0┘2 ═0┘1 ═0┘0 ═╧┬ 0 ┘-POSITION
- 02 $02 ═1╪7 ═1╪6 ═1╪5 ═1╪4 ═1╪3 ═1╪2 ═1╪1 ═1╪0 ═╧┬ 1 ╪-POSITION
- 03 $03 ═1┘7 ═1┘6 ═1┘5 ═1┘4 ═1┘3 ═1┘2 ═1┘1 ═1┘0 ═╧┬ 1 ┘-POSITION
- 04 $04 ═2╪7 ═2╪6 ═2╪5 ═2╪4 ═2╪3 ═2╪2 ═2╪1 ═2╪0 ═╧┬ 2 ╪-POSITION
- 05 $05 ═2┘7 ═2┘6 ═2┘5 ═2┘4 ═2┘3 ═2┘2 ═2┘1 ═2┘0 ═╧┬ 2 ┘-POSITION
- 06 $06 ═3╪7 ═3╪6 ═3╪5 ═3╪4 ═3╪3 ═3╪2 ═3╪1 ═3╪0 ═╧┬ 3 ╪-POSITION
- 07 $07 ═3┘7 ═3┘6 ═3┘5 ═3┘4 ═3┘3 ═3┘2 ═3┘1 ═3┘0 ═╧┬ 3 ┘-POSITION
- 08 $08 ═4╪7 ═4╪6 ═4╪5 ═4╪4 ═4╪3 ═4╪2 ═4╪1 ═4╪0 ═╧┬ 4 ╪-POSITION
- 09 $09 ═4┘7 ═4┘6 ═4┘5 ═4┘4 ═4┘3 ═4┘2 ═4┘1 ═4┘0 ═╧┬ 4 ┘-POSITION
- 10 $0A ═5╪7 ═5╪6 ═5╪5 ═5╪4 ═5╪3 ═5╪2 ═5╪1 ═5╪0 ═╧┬ 5 ╪-POSITION
- 11 $0B ═5┘7 ═5┘6 ═5┘5 ═5┘4 ═5┘3 ═5┘2 ═5┘1 ═5┘0 ═╧┬ 5 ┘-POSITION
- 12 $0C ═6╪7 ═6╪6 ═6╪5 ═6╪4 ═6╪3 ═6╪2 ═6╪1 ═6╪0 ═╧┬ 6 ╪-POSITION
- 13 $0D ═6┘7 ═6┘6 ═6┘5 ═6┘4 ═6┘3 ═6┘2 ═6┘1 ═6┘0 ═╧┬ 6 ┘-POSITION
- 14 $0E ═7╪7 ═7╪6 ═7╪5 ═7╪4 ═7╪3 ═7╪2 ═7╪1 ═7╪0 ═╧┬ 7 ╪-POSITION
- 15 $0F ═7┘7 ═7┘6 ═7┘5 ═7┘4 ═7┘3 ═7┘2 ═7┘1 ═7┘0 ═╧┬ 7 ┘-POSITION
- 16 $10 ═7╪8 ═6╪8 ═5╪8 ═4╪8 ═3╪8 ═2╪8 ═1╪8 ═0╪8 ═╙┬ OF ╪-POSITION
-
- 17 $11 ╥├8 ┼├═ ┬══ ─┼╬ ╥╙┼╠ ┘2 ┘1 ┘0 (╙EE TEXT)
- 18 $12 ╥├7 ╥├6 ╥├5 ╥├4 ╥├3 ╥├2 ╥├1 ╥├0 ╥ASTER REGISTER
- 19 $13 ╠╨╪8 ╠╨╪7 ╠╨╪6 ╠╨╪5 ╠╨╪4 ╠╨╪3 ╠╨╪2 ╠╨╪1 ╠IGHT ╨EN ╪
- 20 $14 ╠╨┘7 ╠╨┘6 ╠╨┘5 ╠╨┘4 ╠╨┘3 ╠╨┘2 ╠╨┘1 ╠╨┘0 ╠IGHT ╨EN ┘
- 21 $15 ═7┼ ═6┼ ═5┼ ═4┼ ═3┼ ═2┼ ═1┼ ═0┼ ═╧┬ ┼NABLE
- 22 $16 - - ╥┼╙ ═├═ ├╙┼╠ ╪2 ╪1 ╪0 (╙EE TEXT)
- 23 $17 ═7┘┼ ═6┘┼ ═5┘┼ ═4┘┼ ═3┘┼ ═2┘┼ ═1┘┼ ═0┘┼ ═╧┬ ┘-EXPAND
- 24 $18 ╓═13 ╓═12 ╓═11 ╓═10 ├┬13 ├┬12 ├┬11 - ═EMORY ╨OINTERS
- 25 $19 ╔╥╤ - - - ╔╠╨ ╔══├ ╔═┬├ ╔╥╙╘ ╔NTERRUPT ╥EGISTER
- 26 $1A - - - - ┼╠╨ ┼══├ ┼═┬├ ┼╥╙╘ ┼NABLE ╔NTERRUPT
- 27 $1B ═7─╨ ═6─╨ ═5─╨ ═4─╨ ═3─╨ ═2─╨ ═1─╨ ═0─╨ ═╧┬-─┴╘┴ ╨RIORITY
- 28 $1C ═7═├ ═6═├ ═5═├ ═4═├ ═3═├ ═2═├ ═1═├ ═0═├ ═╧┬ ═ULTICOLOR SELECT
- 29 $1D ═7╪┼ ═6╪┼ ═5╪┼ ═4╪┼ ═3╪┼ ═2╪┼ ═1╪┼ ═0╪┼ ═╧┬ ╪-┼XPAND
- 30 $1E ═7═ ═6═ ═5═ ═4═ ═3═ ═2═ ═1═ ═0═ ═╧┬-═╧┬ ├OLLISION
- 31 $1F ═7─ ═6─ ═5─ ═4─ ═3─ ═2─ ═1─ ═0─ ═╧┬-─┴╘┴ ├OLLISION
-
- 32 $20 - - - - ┼├3 ┼├2 ┼├1 ┼├0 ┼XTERIOR ├OLOR
- 33 $21 - - - - ┬0├3 ┬0├2 ┬0├1 ┬0├0 ┬ACKGROUND #0 ├OLOR
- 34 $22 - - - - ┬1├3 ┬1├2 ┬1├1 ┬1├0 ┬ACKGROUND #1 ├OLOR
- 35 $23 - - - - ┬2├3 ┬2├2 ┬2├1 ┬2├0 ┬ACKGROUND #2 ├OLOR
- 36 $24 - - - - ┬3├3 ┬3├2 ┬3├1 ┬3├0 ┬ACKGROUND #3 ├OLOR
- 37 $25 - - - - ══03 ══02 ══01 ══00 ═╧┬ ═ULTICOLOR #0
- 38 $26 - - - - ══13 ══12 ══11 ══10 ═╧┬ ═ULTICOLOR #1
-
- 39 $27 - - - - ═0├3 ═0├2 ═0├1 ═0├0 ═╧┬ 0 ├OLOR
- 40 $28 - - - - ═1├3 ═1├2 ═1├1 ═1├0 ═╧┬ 1 ├OLOR
- 41 $29 - - - - ═2├3 ═2├2 ═2├1 ═2├0 ═╧┬ 2 ├OLOR
- 42 $2A - - - - ═3├3 ═3├2 ═3├1 ═3├0 ═╧┬ 3 ├OLOR
- 43 $2B - - - - ═4├3 ═4├2 ═4├1 ═4├0 ═╧┬ 4 ├OLOR
- 44 $2C - - - - ═5├3 ═5├2 ═5├1 ═5├0 ═╧┬ 5 ├OLOR
- 45 $2D - - - - ═6├3 ═6├2 ═6├1 ═6├0 ═╧┬ 6 ├OLOR
- 46 $2E - - - - ═7├3 ═7├2 ═7├1 ═7├0 ═╧┬ 7 ├OLOR
-
- ═N╪ = ═╧┬ N ╪ POSITION ═N┘ = ═╧┬ N ┘ POSITION
- ╥├ = ╥ASTER COMPARE REGISTER ┼├═ = ┼XTENDED COLOR MODE
- ═┬┬ = ┬IT MAP MODE ─┼╬ = ─ISPLAY ENABLE
- ╥╙┼╠ = ╥OW SELECT ┘ = ╙CREEN ┘ POSITION
- ╠╨╪ = ╠IGHT PEN ╪ POSITION ╠╨┘ = ╠IGHT PEN ┘ POSITION
- ═N┼ = ═╧┬ N ┼NABLE ╥┼╙ = ┴LWAYS SET TO ZERO!
- ═├═ = ═ULTICOLOR MODE ├╙┼╠ = ├OLUMN SELECT
- ╪ = ╙CREEN ╪ POSITION ═N┘┼ = ═╧┬ N ┘ EXPAND
- ╓═ = ╓IDEO MATRIX POINTER ├┬ = ├HARACTER BASE POINTER
- ═N─╨ = ═╧┬ TO DATA PRIORITY ═N═├ = ═╧┬ N MULTICOLOR SELECT
- ═N╪┼ = ═╧┬ N ╪ EXPAND
-
- =============================================================================
- ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
-
- BY ├RAIG ┬RUCE <CSBRUCE@NEUMANN.UWATERLOO.CA>
-
- 1. ╔╬╘╥╧─╒├╘╔╧╬
-
- ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
- OF ═╙-─╧╙ DISKS. ╘HE PROGRAM COPIES ONLY FROM DRIVE TO DRIVE WITHOUT
- BUFFERING FILE DATA INTERNALLY. ╘HIS IS SIMPLER AND IMPOSES NO LIMITS ON THE
- SIZE OF THE FILES TRANSFERRED, ALTHOUGH IT REQUIRES THE USE OF TWO DISK DRIVES
- (OR A LOGICAL DRIVE). ╘HE USER-INTERFACE CODE IS WRITTEN IN ┬┴╙╔├ AND
- PRESENTS A FULL-SCREEN FILE SELECTION MENU. ╘HE GRUNT-WORK CODE IS WRITTEN IN
- ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM VELOSITY.
-
- ╘HE ┬URST ├OMMAND ╔NSTRUCTION ╙ET OF THE 1571/81 IS USED TO READ THE ═╙-─╧╙
- DISK BLOCKS AND THE STANDARD KERNEL ROUTINES ARE USED FOR OUTPUTTING THE
- DATA. (╔ AM AN OPERATING SYSTEMS SPECIALIST, SO ╔ CALL IT A KERN┼L!) ╘HUS,
- THE ═╙-─╧╙ FILES MUST BE READ FROM A 1571 OR 1581 DISK DRIVE, BUT THE OUTPUT
- DEVICE MAY BE ANY DISK DRIVE TYPE, THE SCREEN OR A PRINTER, OR A VIRTUAL DRIVE
- TYPE SUCH AS ╥┴═╠INK, ╥┴═─RIVE, OR ╥┴═─╧╙ (FOR THE ╥┼╒). ╔T IS INTERESTING TO
- NOTE THAT THE DATA CAN BE READ IN FROM AN ═╙-─╧╙ DISK FASTER THAN IT CAN BE
- WRITTEN OUT TO A 1571, 1581, OR EVEN A ╥┴═─╧╙ FILE. ┴ ╥┴═╠INK CAN SWALLOW THE
- DATA ONLY SLIGHTLY FASTER THAN IT CAN BE READ.
-
- ╠ITTLE ╥ED ╥EADER (╠╥╥) SUPPORTS DOUBLE DENSITY 3.5" DISKS FORMATTED WITH 80
- TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1581 AND 5.25" DOUBLE DENSITY
- DISKS FORMATTED WITH 40 TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1571.
- ┴ LIMIT OF 128 DIRECTORY ENTRIES AND 3 ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) SECTORS IS
- IMPOSED. ╘HERE MUST BE 2 COPIES OF THE ╞┴╘ AND THE CLUSTER SIZE MAY BE 1 OR 2
- SECTORS. ╘HE SECTOR SIZE MUST BE 512 BYTES.
-
- ╧H, ABOUT THE NAME. ╔T IS A PLAY ON THE NAME OF ANOTHER ═╙-─╧╙ FILE COPIER
- AVAILABLE FOR THE ├-128. "╠ITTLE" MEANS THAT IT IS SMALLER IN SCOPE THAN THE
- OTHER PROGRAM, AND "╥ED" IS A DIFFERENT PRIMARY COLOR TO AVOID ANY LEGAL
- COMPLICATIONS. ╔T IS ALSO THE NON-WHITE COLOR OF THE FLAG OF THE COUNTRY OF
- ORIGIN OF THIS PROGRAM (NO, ╔ AM NOT ╩APANESE). ┴LSO, THIS PROGRAM IS ╨UBLIC
- ─OMAIN ╙OFTWARE, AS IS ALL SOFTWARE ╔ DEVELOP FOR 8-BIT ├OMMODORE ├OMPUTERS.
- ╞EEL FREE TO ┼-MAIL ME IF YOU HAVE QUESTIONS OR COMMENTS ABOUT THIS ARTICLE.
-
- 2. ╒╙┼╥ ╟╒╔─┼
-
- ╠╧┴─ AND ╥╒╬ THE "LRR.128" ┬┴╙╔├ PROGRAM FILE. ╫HEN THE PROGRAM IS FIRST RUN,
- IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
- LANGUAGE PACKAGE FROM THE "CURRENT" ├OMMODORE ─╧╙ DRIVE (THE CURRENT DRIVE IS
- OBTAINED FROM ╨┼┼╦(186) - THE LAST DEVICE ACCESSED). ╘HE BINARY PACKAGE IS
- LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
- PACKAGE ╔─ FIELD IS IN PLACE.
-
- 2.1. ═┴╔╬ ╙├╥┼┼╬
-
- ╘HE MAIN SCREEN OF THE PROGRAM IS THEN DISPLAYED. ╘HE MAIN SCREEN OF THE
- PROGRAM WILL LOOK SOMETHING LIKE THIS:
-
- ═╙-─┼╓=9 ═╙-╘┘╨┼=1581 ├┬═-─┼╓=8
-
- ╬╒═ ╙ ╘╥╬ ╘┘╨ ╞╔╠┼╬┴═┼ ┼╪╘ ╠┼╬╟╘╚
- --- - --- --- -------- --- ------
- 1 * ┴╙├ ╙┼╤ ╚┴├╦4 ╘╪╘ 120732
- 2 ┬╔╬ ╨╥╟ ╥┴═─╧╙ ╙╞╪ 34923
-
- ─=─╔╥┼├╘╧╥┘ ═=═╙-─┼╓ ╞=├┬═-─┼╓ ╤=╤╒╔╘
- ╘=╘╧╟╟╠┼-├╧╠╒═╬, ├=├╧╨┘-╞╔╠┼╙, +/- ╨┴╟┼
-
- EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<NO FILES>" WILL BE DISPLAYED
- RATHER THAN FILENAMES. ╘HE "═╙-─┼╓" AND "═╙-╘┘╨┼" FIELDS GIVE THE DEVICE
- NUMBER AND TYPE OF THE DRIVE CONTAINING THE ═╙-─╧╙ DISK TO COPY FROM, AND THE
- "├┬═-─┼╓" GIVES THE DEVICE NUMBER OF THE DRIVE/VIRTUAL DRIVE/CHARACTER DEVICE
- TO COPY FILE DATA TO.
-
- ╔NFORMATION ABOUT ALL ═╙-─╧╙ FILES IN THE ROOT DIRECTORY OF THE ═╙-─╧╙ DISK IS
- DISPLAYED IN COLUMNS BELOW THE DRIVE INFORMATION. "╬╒═" GIVES THE NUMBER OF
- THE ═╙-─╧╙ FILE IN THE DIRECTORY LISTING, AND "╙" INDICATES WHETHER THE FILE
- IS "SELECTED" OR NOT. ╔F THE FILE IS SELECTED, AN ASTERISK (*) IS DISPLAYED;
- OTHERWISE, A BLANK IS DISPLAYED. ╫HEN YOU LATER ENTER ├OPY ═ODE, ONLY THE
- FILES THAT HAVE BEEN "SELECTED" ARE COPIED.
-
- ╘HE "╘╥╬" FIELD INDICATES THE CHARACTER TRANSLATION SCHEME TO BE USED WHEN THE
- FILE IS COPIED. ┴ VALUE OF "┬╔╬" (BINARY) MEANS NO TRANSLATION AND A VALUE OF
- "┴╙├" (ASCII) MEANS THE FILE CHARACTERS ARE TO BE TRANSLATED FROM ═╙-─╧╙ ┴╙├╔╔
- (OR "┴╙├╔╔-├R╠F") TO ╨┼╘╙├╔╔. ╘HE "╘┘╨" FIELD INDICATES THE TYPE OF
- ├OMMODORE-─╧╙ FILE TO CREATE FOR WRITING THE ═╙-─╧╙ FILE CONTENTS INTO. ╘HE
- POSSIBLE VALUES ARE "╙┼╤" (SEQUENTIAL) AND "╨╥╟" (PROGRAM). ╘HE VALUES OF THE
- ╘╥╬ AND ╘┘╨ FILEDS ARE SET INDEPENDENTLY, SO YOU CAN COPY BINARY DATA TO ╙┼╤
- FILES AND ASCII DATA TO ╨╥╟ FILES IF YOU WISH.
-
- ╘HE "╞╔╠┼╬┴═┼" AND "┼╪╘" FIELDS GIVE THE FILENAME AND EXTENSION TYPE OF THE
- ═╙-─╧╙ FILES AND "╠┼╬╟╘╚" GIVES THE EXACT LENGTH OF THE FILES IN BYTES. ╬OTE
- THAT IF YOU PERFORM "┴╙├" TRANSLATION ON A FILE, ITS ╨┼╘╙├╔╔ VERSION WILL HAVE
- A SHORTER LENGTH.
-
- 2.2. ╒╙┼╥ ├╧══┴╬─╙
-
- ╘HE BOTTOM OF THE SCREEN GIVES THE COMMAND SUMMARY. ┴FTER STARTING THE
- PROGRAM, YOU WILL WANT TO SETUP THE ═╙-─╧╙ AND ├┬═-─╧╙ DRIVES WITH THE "═" AND
- "╞" COMMANDS. ╙IMPLY PRESS THE (LETTER) KEY CORRESPONDING TO THE COMMAND
- NAME TO ACTIVATE THE COMMAND. ╨RESSING ═ WILL PROMPT YOU FOR THE ═╙-─╧╙ ─RIVE
- ╬UMBER AND THE ═╙-─╧╙ ─RIVE ╘YPE. ╔N BOTH CASES, TYPE THE NUMBER AND PRESS
- ╥┼╘╒╥╬. (╙ORRY FOR INSULTING ALL NON-NOVICES OUT THERE, BUT ╔ WANT TO BE
- COMPLETE). ╘HE ═╙-─╧╙ DRIVE NUMBER CANNOT BE THE SAME AS THE ├┬═-─╧╙ DRIVE
- NUMBER (SINCE THE PROGRAM COPIES FROM DRIVE-TO-DRIVE WITHOUT INTERNAL
- BUFFERING). ╞OR THE DRIVE TYPE, ENTER AN "8", "81", OR "1581" FOR A 1581
- DRIVE OR ANYTHING ELSE FOR A 1571 DRIVE.
-
- ╨RESSING ╞ WILL PROMPT YOU FOR THE ├┬═-─╧╙ DEVICE NUMBER. ┘OU MAY ENTER A
- NUMBER FROM 0 TO 30, EXCEPT THAT IT MUST NOT BE THE ═╙-─╧╙ DRIVE NUMBER.
- ┼NTER A "1" FOR ├ASSETTE ─RIVE (╟OD FORBID!), A "3" FOR THE SCREEN, A "4" FOR
- THE PRINTER (WITH AN AUTOMATIC SECONDARY ADDRESS OF 7 (LOWERCASE)), ANY NUMBER
- ABOVE 7 FOR A ├OMMODORE DISK DRIVE OR SPECIAL VIRTUAL DRIVE, OR A VALUE OF "0"
- FOR THE SPECIAL "NULL" DRIVE. ┴ ├┬═-─┼╓ VALUE OF 0 WILL CASE THE PROGRAM TO
- READ ═╙-─╧╙ FILES AND DO NOTHING WITH THE OUTPUT. ┘OU CAN USE THIS FEATURE TO
- CHECK OUT THE RAW READING SPEED OF THE PROGRAM.
-
- ┴FTER SETTING UP THE DRIVES, PRESS ─ TO READ IN THE ROOT DIRECTORY OFF THE
- ═╙-─╧╙ DISK. ╘HE DATA WILL COME BLAZING IN FROM THE DISK BUT ┬┴╙╔├ WILL TAKE
- ITS GOOD OLE TIME SIFTING THROUGH IT. ╞ILENAMES ARE DISPLAYED ON THE SCREEN
- AS THEY ARE SCANNED IN. ╘HE PROGRAM WILL (EVENTUALLY) RETURN TO THE MAIN
- SCREEN AND DISPLAY THE FORMATTED FILE INFORMATION. ╧NE NOTE: THE PROCESS OF
- LOGGING IN A 1581 ═╙-─╧╙ DISK TAKES ABOUT 12 SECONDS (ON MY 1581, ANYWAY), SO
- BE PATIENT. ┴N ═╙-─╧╙ DISK WILL HAVE TO BE "LOGGED IN" EVERY TIME YOU CHANGE
- ═╙-─╧╙ DISKS. (─ISKS ARE LOGGED IN AUTOMATICALLY).
-
- ┴ COUPLE OF NOTES ABOUT ACCESSING ═╙-─╧╙ DISKS: DON'T TRY TO ACCESS A DEVICE
- THAT IS NOT PRESENT BECAUSE THE MACHINE LANGUAGE ROUTINES CANNOT HANDLE THIS
- ERROR FOR SOME REASON AND WILL LOCK UP, REQUIRING A ╙╘╧╨+╥┼╙╘╧╥┼. ┴LSO, MAKE
- SURE THAT AN ACTUAL ═╙-─╧╙ DISK IS LOADED INTO THE DRIVE. ╔F YOU ACCIDENTALLY
- PLACE ├OMMODORE-─╧╙ DISK INTO THE ═╙-─╧╙ DRIVE, THE 1581 WILL REPORT AN
- INVALID BOOT PARAMETERS ERROR (#60), BUT A 1571 WILL LOCK UP (SINCE ╔ DON'T
- CHECK THE SECTOR SIZE AND MY BURST ROUTINES ARE EXPECTING 512 BYTES TO COME
- OUT OF A SECTOR WHEREAS ├OMMODORE DISKS HAVE ONLY 256 BYTES PER SECTOR).
-
- ╬OW YOU ARE READY TO PICK WHAT FILES YOU WANT COPIED AND HOW YOU WANT THEM
- COPIED. ┘OU WILL NOTICE THAT A "CURSOR" APPEARS IN THE "╙" COLUMN OF THE
- FIRST FILE. ┘OU MAY MOVE THE CURSOR AROUND WITH THE CURSOR KEYS: ╒╨, ─╧╫╬,
- ╠┼╞╘, ╥╔╟╚╘, ╚╧═┼, AND ├╠╥. ├╠╥ (╙╚╔╞╘-╚╧═┼) WILL MOVE THE CURSOR BACK TO THE
- FIRST FILE ON THE FIRST SCREEN. ┘OU CAN MOVE THE CURSOR AMONG THE SELECT,
- TRANSLATION, AND FILE-TYPE COLUMNS OF ALL THE FILES. ╨RESSING A ╙╨┴├┼ OR A
- ╥┼╘╒╥╬ WILL TOGGLE THE VALUE OF THE FIELD THAT THE CURSOR IS ON. ╘O TOGGLE
- ALL OF THE VALUES OF THE "CURSOR" COLUMN (INCLUDING FILES ON ALL OTHER
- SCREENS), PRESS ╘. ┘OU WILL NOTICE THAT MOVING THE CURSOR AROUND AND TOGGLING
- FIELDS IS A BIT SLUGGISH, ESPECIALLY IF YOU ARE IN ╙LOW MODE ON THE 40-COLUMN
- SCREEN. ─ID ╔ MENTION THAT THIS PROGRAM WILL RUN ON EITHER THE 40 OR
- 80-COLUMN SCREEN? ╘OGGLING AN ENTIRE COLUMN CAN TAKE A COUPLE OF SECONDS.
-
- ╔F THERE ARE MORE THAN 18 ═╙-─╧╙ FILES, YOU CAN PRESS THE "+" AND "-" KEYS TO
- MOVE AMONG ALL OF THE SCREENS OF FILES. ╘HE CURSOR MOVEMENT KEYS WILL WRAP
- AROUND ON THE CURRENT SCREEN. "+" IS PAGE FORWARD, AND "-" IS PAGE BACKWARD.
- ╘HE SCREENS WRAP AROUND TOO.
-
- ┴FTER YOU HAVE SELECTED ALL OF THE FILES YOU WANT TO COPY AND THEIR TRANSLATION
- AND FILE-TYPE FIELDS HAVE BEEN SET, PRESS THE ├ KEY TO GO INTO ├OPY ═ODE (NEXT
- SECTION). ┴FTER COPYING, YOU ARE RETURNED TO THE MAIN SCREEN WITH ALL OF THE
- FIELD SETTINGS STILL INTACT. ╘O EXIT FROM THE PROGRAM, PRESS ╤.
-
- 2.3. ├╧╨┘ ═╧─┼
-
- ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
- FILE IS DISPLAYED AS IT IS BEING COPIED. ╔F AN ERROR IS ENCOUNTERED ON EITHER
- THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
- AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS).
-
- ╘O GENERATE A ├┬═-─╧╙ FILENAME FROM AN ═╙-─╧╙ FILENAME, THE EIGHT FILENAME
- CHARACTERS ARE TAKEN (INCLUDING SPACES) AND A DOT (.) AND THE THREE CHARACTERS
- OF THE EXTENSION ARE APPENDED. ╘HEN, ALL SPACES ARE REMOVED, AND IF THE NAME
- ENDS WITH A DOT (.) CHARACTER, THEN THAT DOT CHARACTER IS REMOVED AS WELL. ╔
- THINK THIS IS FAIRLY REASONABLE.
-
- ╔F THERE ALREADY IS A FILE WITH THE SAME FILENAME ON THE ├┬═-─╧╙ DISK, THEN
- YOU WILL BE PROMPTED IF YOU WANT TO OVERWRITE THE FILE OR NOT. ┼NTERING AN
- "N" WILL ABORT THE COPYING OF THAT FILE AND GO ON TO THE NEXT FILE, AND
- ENTERING A "Y" (OR ANYTHING ELSE) WILL CAUSE THE ├┬═-─╧╙ FILE TO BE
- "SCRATCHED" AND THEN RE-WRITTEN.
-
- ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
- NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
- THINGS BY LOOKING AT DAS BLINKIN LICHTES AND LISTENING FOR CLICKS AND GRINDS.
- ┘OU WILL PROBABLY BE SURPRISED BY THE ═╙-─╧╙ FILE READING SPEED (╔ MEAN IN A
- GOOD WAY). ╘HE DISK DATA IS READ IN WHOLE TRACKS AND CACHED IN MEMORY AND THE
- DIRECTORY INFORMATION AND THE ╞┴╘ ARE RETAINED IN MEMORY AS WELL. ╘HE RESULT
- IS THAT MINIMAL TIME IS SPENT READING DISK DATA, AND NO COSTLY SEEKS ARE
- REQUIRED FOR OPENING A NEW ═╙-─╧╙ FILE. ┴ RESULT IS THAT SMALL FILES ARE
- COPIED ONE AFTER ANOTHER VERY QUICKLY. ┘OU WILL HAVE TO WAIT, HOWEVER, ON THE
- RELATIVELY SLOW STANDARD KERNEL/├OMMODORE-─╧╙ FILE WRITING.
-
- ┴ FEW CHANGES HAD TO BE MADE TO THE PROGRAM TO ACCOMODATE THE ╥┴═─╧╙ PROGRAM.
- ╥┴═─╧╙ USES MEMORY FROM $2300 TO $3╞╞╞ OF ╥┴═0, WHICH IS NOT REALLY A GOOD
- PLACE FOR A DEVICE DRIVER, AND IT USES SOME OF THE ZERO-PAGE LOCATIONS THAT ╔
- WANTED TO USE. ┬UT, DIFFICULTIES WERE OVERCOME. ╘HE IMPORTANCE OF ╥┴═─╧╙
- COMPATIBILITY IS THAT IF YOU ONLY HAVE ONE DISK DRIVE BUT YOU HAVE AN ╥┼╒, YOU
- CAN USE ╥┴═─╧╙ TO STORE THE ═╙-─╧╙ FILES TEMPORARILY. ╔F YOU ONLY HAVE ONE
- DISK DRIVE AND NO ╥┼╒, YOU ARE ╙╧╠ (╧UT OF ╠UCK) UNLESS YOU CAN GET A
- ╥AM─ISK-TYPE PROGRAM FOR AN UNEXPANDED 128. ╘HE ╥┴═─╧╙ PROGRAM IS AVAILABLE
- FROM ╞╘╨ SITE "CCOSUN.CALTECH.EDU" IN FILE "/PUB/RKNOP/UTIL128/RAMDOSII.SFX".
- ╧NE NOTE ╔ FOUND OUT ABOUT ╥┴═─╧╙: YOU CANNOT USE A
-
- ─╧╨┼╬#1,(├╞$),╒(├─),╫
-
- WITH IT LIKE YOU ARE SUPPOSED TO BE ABLE TO; YOU HAVE TO USE A
-
- ─╧╨┼╬#1,(├╞$+",╫"),╒(├─)
-
- ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING FROM 1571S AND 1581S WITH ┴╙├
- AND ┬╔╬ TRANSLATION MODES. ┴LL FIGURES ARE IN BYTES/SECOND. ╘HESE RESULTS
- WERE OBTAINED FROM COPYING A 127,280 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING
- ╔SSUE #3).
-
- ╞╥╧═ \ ╘╧: "NULL" ╥┴═╠INK ╥┴═─╧╙ ╩─1581 ╩─1571
- -------+ ------ ------- ------ ------ ------
- 81-BIN ▄ 5772 3441 2146 N/A 644
- 81-ASC ▄ 5772 3434 2164 N/A 661
- 71-BIN ▄ 4323 2991 1949 1821 N/A
- 71-ASC ▄ 4323 2982 1962 1847 N/A
-
- ╘HE "NULL" DEVICE IS THAT "0" ├┬═-─╧╙ DEVICE NUMBER, AND A COUPLE OF ENTRIES
- ARE "N/A" SINCE ╔ ONLY HAVE ONE 1571 AND ONE 1581. ╬OTE THAT MY 71 AND 81 ARE
- ╩IFFY─╧╙-IFIED, SO THE PERFORMANCE OF A STOCK 71/81 WILL BE POORER. ╩IFFY─╧╙
- GIVES ABOUT A 2X PERFORMANCE IMPROVEMENT FOR THE STANDARD FILE ACCESSING CALLS
- (OPEN, CLOSE, CHRIN, CHROUT). ╥┴═─╧╙ DOESN'T SEEM TO BE AS SNAPPY AS YOU
- MIGHT THINK.
-
- ╘HE "NULL" FIGURES ARE QUITE IMPRESSIVE, BUT THE RAW SECTOR READING SPEED
- WITHOUT THE OVERHEAD OF MUCKING AROUND WITH FILE ORGANIZATION IS 6700
- BYTES/SEC FOR A 1581 AND 4600 ┬/S FOR A 71. ╘HE REASON THAT THE 1571 OPERATES
- SO QUICKLY IS THAT ╔ USE A SECTOR INTERLEAVE OF 4 (WHICH IS OPTIMAL) FOR
- READING THE TRACKS. ╔ THINK THAT OTHER ═╙-─╧╙ FILE COPIER PROGRAM USES AN
- INTERLEAVE OF 1 (WHICH IS NOT OPTIMAL). ╔ LOSE SOME OF THE RAW PERFORMANCE
- BECAUSE ╔ COPY THE FILE DATA INTERNALLY ONCE BEFORE OUTPUTTING IT (TO SIMPLIFY
- SOME OF THE CODE).
-
- ╔N A COUPLE OF PLACES YOU WILL NOTICE THAT ┴╙├ TRANSLATION GIVES SLIGHTLY
- BETTER OR SLIGHTLY WORSE PERFORMANCE THAN ┬╔╬. ╘HIS IS BECAUSE ALTHOUGH
- SLIGHTLY MORE WORK IS REQUIRED TO TRANSLATE THE CHARACTERS, SLIGHTLY FEWER
- CHARACTERS WILL HAVE TO BE WRITTEN TO THE ├┬═-─╧╙ FILE, SINCE ╨┼╘╙├╔╔ USES
- ONLY ├╥ WHERE ═╙-─╧╙ ┴╙├╔╔ USES ├╥ AND ╠╞ TO REPRESENT END-OF-LINE.
- ╘RANSLATION IS DONE BY USING A TABLE (THAT YOU CAN CHANGE IF YOU WISH). ═ANY
- ENTRIES IN THIS TABLE CONTAIN A VALUE OF ZERO, WHICH MEANS THAT NO CHARACTER
- WILL BE OUTPUT ON TRANSLATION. ═OST OF THE CONTROL CHARACTERS AND ALL OF THE
- CHARACTERS OF VALUE 128 (0X80) OR GREATER ARE THROWN AWAY ON BEING
- TRANSLATED. ╘HE TABLE IS SET UP SO THAT ├╥ CHARACTERS ARE THROWN AWAY AND THE
- ╠╞ CHARACTER IS TRANSLATED TO A ├┬═-─╧╙ ├╥ CHARACTER. ╘HUS, BOTH ═╙-─╧╙ ┴╙├╔╔
- FILES AND ╒╬╔╪ ┴╙├╔╔ FILES CAN BE TRANSLATED CORRECTLY.
-
- 2. ┬╒╥╙╘ ├╧══┴╬─╙
-
- ╘HREE BURST COMMANDS FROM THE 1571/81 DISK DRIVE ┬URST ├OMMAND ╔NSTRUCTION ╙ET
- ARE REQUIRED TO ALLOW THIS PROGRAM TO READ THE ═╙-─╧╙ DISKS: ╤UERY ─ISK
- ╞ORMAT, ╙ECTOR ╔NTERLEAVE, AND ╥EAD. ╘HE GRUNGY DETAILS ABOUT ISSUING BURST
- COMMANDS AND BURST MODE HANDSHAKING ARE COVERED IN ├= ╚ACKING ╔SSUE #3. ╘HE
- ╤UERY ─ISK ╞ORMAT COMMAND IS USED TO "LOG IN" THE ═╙-─╧╙ DISK. ╘HE ╔NQUIRE
- ─ISK BURST COMMAND CANNOT BE USED WITH AN ═╙-─╧╙ DISK ON THE 1581 FOR SOME
- UNKNOWN REASON. ╔ FOUND THIS OUT THE HARD WAY. ╘HE ╤UERY ─ISK ╞ORMAT COMMAND
- HAS THE FOLLOWING FORMAT:
-
- ┬┘╘┼ \ BIT: 7 6 5 4 3 2 1 0 ▄ ╓ALUE
- -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
- 0 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ "╒"
- 1 ▄ 0 ▄ 0 ▄ 1 ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ "0"
- 2 ▄ ╞ ▄ ╪ ▄ ╪ ▄ ╙ ▄ 1 ▄ 0 ▄ 1 ▄ ╬ ▄ 10
- -------+--------------------------------------------------+-------
-
- WHERE THE ╞, ╙, AND ╬ BITS HAVE A VALUE OF 0 FOR OUR PURPOSES. ┴ RESPONSE OF
- A BURST STATUS BYTE AND SIX OTHER THROW-AWAY BYTES IS GIVEN FROM THE DRIVE.
- ╘HIS COMMAND TAKES QUITE A LONG TIME TO EXECUTE ON MY 1581 BUT WORKS QUITE
- QUICKLY ON MY 1571. ┘OU ONLY HAVE TO LOG IN A DISK WHENEVER YOU CHANGE
- DISKS.
-
- ╘HE ╙ECTOR ╔NTERLEAVE COMMAND IS USED TO SET A SOFT INTERLEAVE FOR THE ╥EAD
- COMMAND. ╔ USE AN INTERLEAVE OF 1 FOR THE 1581 AND AN INTERLEAVE OF 4 FOR THE
- 1571. ╘HIS MEANS THAT THE ═╙-─╧╙ SECTORS WILL COME FROM 1571 TO THE COMPUTER
- IN THE FOLLOWING ORDER: 1, 5, 9, 4, 8, 3, 7, 2, 6 (THERE ARE 9 SECTORS PER
- TRACK ON AN ═╙-─╧╙ DISK (BOTH 3.5" AND 5.25"), NUMBERED FROM 1 TO 9). ╠╥╥
- HANDLES THE DATA COMING IN IN THIS ORDER, AND IN STRAIGHT ORDER FROM THE
- 1581. ╘HE ╙ECTOR ╔NTERLEAVE COMMAND HAS THE FOLLOWING FORMAT, WHERE THE ╫ AND
- ╬ BITS ARE 0 FOR US:
-
- ┬┘╘┼ \ BIT: 7 6 5 4 3 2 1 0 ▄ ╓ALUE
- -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
- 0 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ "╒"
- 1 ▄ 0 ▄ 0 ▄ 1 ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ "0"
- 2 ▄ ╫ ▄ ╪ ▄ ╪ ▄ 0 ▄ 1 ▄ 0 ▄ 0 ▄ ╬ ▄ 8
- 3 ▄ <INTERLEAVE> ▄ 1 OR 4
- -------+--------------------------------------------------+-------
-
- ╘HE ╥EAD COMMAND IS USED TO TRANSFER THE NINE SECTORS OF A TRACK TO THE
- COMPUTER IN THE ORDER SPECIFIED BY THE INTERLEAVE. ╘HE FORMAT IS:
-
- ┬┘╘┼ \ BIT: 7 6 5 4 3 2 1 0 ▄ ╓ALUE
- -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
- 0 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ "╒"
- 1 ▄ 0 ▄ 0 ▄ 1 ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ "0"
- 2 ▄ ╘/╠ ▄ ┼ ▄ ┬/╪ ▄ ╙ ▄ 0 ▄ 0 ▄ 0 ▄ ╬ ▄ 0 OR 16
- 3 ▄ <TRACK> ▄ ???
- 4 ▄ <SECTOR> ▄ 1
- 5 ▄ <NUMBER OF SECTORS> ▄ 9
- -------+--------------------------------------------------+-------
-
- ╘HERE ARE A COUPLE OF DIFFERENCES BETWEEN THE 1571 AND 1581 VERSIONS OF THIS
- COMMAND. ═OST IMPORTANT, THE ╙ BIT (╙IDE OF DISK TO USE) HAS THE OPPOSITE
- MEANING ON THE TWO DRIVES. ╘HERE'S NO GOOD REASON THAT ╔ KNOW OF FOR THIS
- INCONSISTENCY. ╘HIS IS THE REASON THAT ╠╥╥ NEEDS TO KNOW WHAT TYPE OF ═╙-─╧╙
- DRIVE IT IS DEALING WITH (PLUS INTERLEAVING).
-
- ╘HE READ COMMAND RETURNS THE FOLLOWING DATA USING BURST MODE HANDSHAKING:
-
- +-------------------+
- 0 ▄ ┬URST ╙TATUS ┬YTE ▄
- +-------------------+
- 1 ▄ ▄
- ... + 512 ─ATA ┬YTES ▄
- 512 ▄ ▄
- +-------------------+
-
- FOR EACH SECTOR TRANSFERRED. ╔F THE ┬URST ╙TATUS ┬YTE INDICATES AN ERROR,
- THEN THE DATA IS NOT TRANSFERRED AND NONE OF THE FOLLOWING SECTORS ARE
- EITHER. ╔F THE STATUS BYTE GIVES A "─ISK ├HANGED" ERROR, THEN YOU HAVE TO LOG
- IN THE DISK WITH THE ╤UERY ─ISK ╞ORMAT COMMAND BEFORE READ WILL WORK
- PROPERLY. ╘HIS IS ACTUALLY A GOOD FEATURE SINCE IT LETS YOU KNOW ABOUT A DISK
- CHANGE SO YOU CAN UPDATE ANY DATA STRUCTURES YOU MAY HAVE. ╠╥╥ SIMPLY RE-LOGS
- IN THE DISK WITHOUT UPDATING ANY DATA STRUCTURES AND RE-TRIES THE FAILED READ
- OPERATION.
-
- 3. ═╙-─╧╙ ─╔╙╦ ╞╧╥═┴╘
-
- ┴N ═╙-─╧╙ DISK IS SEPARATED INTO 4 DIFFERENT PARTS: THE ┬OOT ╙ECTOR, THE
- ╞┴╘(S), THE ╥OOT ─IRECTORY, AND THE ╞ILE ─ATA ╙ECTORS. ╘HE LOGICAL SECTORS
- (BLOCKS) OF A DISK ARE NUMBERED FROM 0 TO SOME MAXIMUM NUMBER (1439 FOR A
- 3.5", 719 FOR A 5.25" ── DISK). ╘HE PHYSICAL LAYOUT AND THE LOGICAL SECTOR
- NUMBERS TYPICALLY USED BY A 3.5" DISK ARE SHOWN HERE:
-
- +-------------------+
- 0 ▄ ┬OOT ╙ECTOR ▄
- +-------------------+
- 1..3 ▄ ╞┴╘ COPY #1 ▄
- +-------------------+
- 4..6 ▄ ╞┴╘ COPY #2 ▄
- +-------------------+
- 7..14 ▄ ╥OOT ─IRECTORY ▄
- +-------------------+
- 15 ▄ ▄
- ... ▄ ╞ILE ─ATA ╙ECTORS ▄
- 1439 ▄ ▄
- +-------------------+
-
- 3.1. ╘╚┼ ┬╧╧╘ ╙┼├╘╧╥
-
- ╘HE ┬OOT ╙ECTOR IS ALWAYS AT LOGICAL SECTOR NUMBER 0. ╔T CONTAINS SOME
- IMPORTANT INFORMATION ABOUT THE FORMAT OF THE DISK AND IT ALSO CONTAINS CODE
- TO BOOT AN ═╙-─╧╙ MACHINE FROM. ╫E AREN'T CONCERNED WITH THE BOOTSTRAPPING
- CODE, BUT THE IMPORTANT VALUES WE NEED TO OBTAIN FROM THE BOOT SECTOR ARE:
-
- ┴┬┬╥ ╧╞╞╙┼╘ 1571 1581 ─┼╙├╥╔╨╘╔╧╬
- ---- ------ ---- ---- -----------
- ├╙ 13 2 2 ├LUSTER SIZE IN SECTORS
- ╬┬ 14 1 1 ╬UMBER OF BOOT SECTORS
- ╬╞ 16 2 2 ╬UMBER OF ╞┴╘S
- ╞╠ 23 2 3 ╞┴╘ SIZE IN SECTORS
- ─┼ 17 112 112 ╬UMBER OF ROOT DIRECTORY ENTRIES
- ╘╙ 19,20 720 1440 ╘OTAL ╬UMBER OF SECTORS
- ╬╙ 24 9 9 ╬UMBER OF SECTORS PER TRACK
- ╬╚ 26 2 2 ╬UMBER OF SIDES
-
- ╘HE 1571 AND 1581 COLUMNS GIVE THE TYPICAL VALUES OF THESE PARAMETERS FOR
- 5.25" AND 3.5" DISKS. ╘HE ╧╞╞╙┼╘ IS THE ADDRESS OF THE PARAMETER WITHIN THE
- BOOT SECTOR. ╘HE TOTAL NUMBER OF SECTORS IS GIVEN IN LOW-BYTE, HIGH-BYTE
- ORDER (SINCE THE 80X86 FAMILY IS LITTLE-ENDIAN LIKE THE 6502 FAMILY). ╞ROM
- THE ABOVE PARAMETERS, WE CAN DERIVE THE FOLLOWING IMPORTANT PARAMETERS:
-
- ┴┬┬╥ ╞╧╥═╒╠┴ 1571 1581 ─┼╙├╥╔╨╘╔╧╬
- ---- ------- ---- ---- -----------
- ╞1 ╬┬+╬╞*╞╠ 5 7 ╞IRST ROOT DIRECTORY SECTOR
- ╞╙ ╬┬+╬╞*╞╠+─┼ 12 14 ╞IRST FILE DATA SECTOR NUMBER
- ╬├ (╘╙-╞╙)/├╙ 354 713 ╘OTAL NUMBER OF FILE CLUSTERS
-
- ╠╥╥ IMPOSES A NUMBER OF LIMITS ON THESE PARAMETERS AND WILL ERROR-OUT IF YOU
- TRY TO USE A DISK THAT IS OUTSIDE OF ╠╥╥'S LIMITS.
-
- 3.2. ├╚┼╫╔╬╟ ╘╚┼ ╞┴╘
-
- ═╙-─╧╙ DISKS USE A DATA STRUCTURE CALLED A ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) TO
- RECORD WHICH CLUSTERS BELONG TO WHICH FILE IN WHAT ORDER AND WHICH BLOCKS ARE
- FREE. ┴ CLUSTER IS A SET OF CONTIGUOUS SECTORS WHICH ARE ALLOCATED TO FILES
- AS A GROUP. ╠╥╥ HANDLES CLUSTER SIZES OF 1 AND 2 SECTORS, GIVING A LOGICAL
- FILE BLOCK SIZE OF 512 OR 1024 BYTES. ╘YPICALLY, A CLUSTER SIZE OF 2 SECTORS
- IS USED.
-
- ╘HE ╞┴╘ IS AN ARRAY OF 12-BIT NUMBERS, WITH AN ENTRY CORRESPONDING TO EACH
- CLUSTER THAT CAN BE ALLOCATED TO FILES. ╞┴╘ ENTRIES 0 AND 1 ARE RESERVED. ╔F
- A ╞┴╘ ENTRY CONTAINS A VALUE OF $000, THEN THE CORRESPONDING CLUSTER IS FREE
- AND CAN BE ALLOCATED TO A FILE; OTHERWISE, THE CLUSTER IS ALLOCATED AND THE
- ╞┴╘ ENTRY CONTAINS THE NUMBER OF THE ╬┼╪╘ ╞┴╘ ENTRY THAT BELONGS TO THE FILE.
- ╘HUS, ═╙-─╧╙ FILES ARE STORED IN A SINGLY-LINKED LIST OF CLUSTERS LIKE
- ├OMMODORE-─╧╙ FILES ARE, EXCEPT THAT THE LINKS ARE NOT IN THE DATA SECTORS BUT
- RATHER ARE IN THE ╞┴╘. ╘HE POINTER TO THE FIRST ╞┴╘ ENTRY FOR A FILE IS GIVEN
- IN THE FILE'S DIRECTORY ENTRY.
-
- ┴ SPECIAL ╬╒╠╠/╬╔╠ POINTER VALUE OF $╞╞╞ IS USED TO INDICATE THE END OF THE
- CHAIN OF CLUSTERS ALLOCATED TO A FILE. ╘HIS VALUE IS STORED IN THE ╞┴╘ ENTRY
- OF THE LAST CLUSTER ALLOCATED TO A FILE (OF COURSE). ├ONSIDER THE FOLLOWING
- EXAMPLE ╞┴╘:
-
- ┼╬╘╥┘ ╓┴╠╒┼
- ----- -----
- $000 $╞╞╞
- $001 $╞╞╞
- $002 ▄----$003 <------─IRECTORY ┼NTRY
- $003 +--> $005----+
- $004 $000 ▄
- $005 $╞╞╞ <--+
-
- ┼NTRIES 0 AND 1 ARE INSIGNIFICANT SINCE THEY ARE RESERVED. ╙AY THAT A FILE
- STARTS AT ╞┴╘ ENTRY #2. ╘HEN, IT CONSISTS OF THE FOLLOWING CHAIN OF CLUSTERS:
- 2, 3, AND 5. ├LUSTER #4 IS FREE. ├LUSTERS CAN BE ALLOCATED TO A FILE IN
- RANDOM ORDER, BUT IF THEY ARE ALLOCATED CONTIGUOUSLY IN FORWARD ORDER, THEN
- THE FILE WILL BE ABLE TO BE READ FASTER. ╘HE ╞┴╘ IS SUCH AN IMPORTANT DATA
- STRUCTURE THAT TYPICALLY TWO COPIES ARE KEPT ON THE DISK INCASE ONE OF THEM
- SHOULD BECOME CORRUPTED.
-
- ╘HE ═╙-─╧╙ DESIGNERS WERE A LITTLE SNEAKY IN STORING THE 12-BIT ╞┴╘ ENTRIES -
- THEY USED ONLY 12 REAL BITS PER ENTRY. ╔E., THEY STORE TWO ╞┴╘ ENTRIES IN
- THREE BYTES, WHERE THE TWO ENTRIES SHARE THE TWO NYBBLES OF THE MIDDLE BYTE.
- ╘HE FOLLOWING DIAGRAM SHOWS HOW THE NYBBLES 1 (HIGH), 2 (MID), AND 3 (LOW) ARE
- STORED INTO ╞┴╘ ENTRIES ┴ AND ┬:
-
- ┬┘╘┼: 0 1 2
- +---+---+ +---+---+ +---+---+
- ┼╬╘╥┘: ▄ ┴ ▄ ┴ ▄ ▄ ┬ ▄ ┴ ▄ ▄ ┬ ▄ ┬ ▄
- ╬┘┬┬╠┼: ▄ 2 ▄ 3 ▄ ▄ 3 ▄ 1 ▄ ▄ 1 ▄ 2 ▄
- +---+---+ +---+---+ +---+---+
-
- ┴NYWAY, LET'S JUST SAY IT'S A BIT TRICKY TO EXTRACT THE 12-BIT VALUES FROM
- THIS COMPRESSED DATA STRUCTURE. ╧N TOP OF THAT, ╔ DON'T THINK THERE IS ANY
- SAVING IN DISK SPACE RESULTING FROM COMPRESSING THIS STRUCTURE; THEY MIGHT AS
- WELL HAVE JUST USED A 16-BIT ╞┴╘ (LIKE THEY DO NOWADAYS ON LARGER DISKS).
-
- 3.3. ╘╚┼ ╥╧╧╘ ─╔╥┼├╘╧╥┘
-
- ╘HE ROOT DIRECTORY HAS A FIXED SIZE, ALTHOUGH ╔ DON'T THINK THAT
- SUBDIRECTORIES DO. ╠╥╥ CANNOT ACCESS SUBDIRECTORIES. ┼ACH 512-BYTE SECTOR OF
- THE ROOT DIRECTORY CONTAINS SIXTEEN 32-BYTE DIRECTORY ENTRIES. ╧NE DIRECTORY
- ENTRY IS REQUIRED FOR EACH FILE STORED ON THE DISK. ┴ DIRECTORY ENTRY HAS THE
- FOLLOWING STRUCTURE:
-
- ╧╞╞╙┼╘ ╠┼╬ ─┼╙├╥╔╨╘╔╧╬
- ------ --- -----------
- 0..7 8 ╞ILENAME
- 8..10 3 ┼XTENSION
- 11 1 <UNUSED?>
- 12 1 ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
- 13..21 9 <UNUSED>
- 22..25 4 ─ATE
- 26..27 2 ╙TARTING ╞┴╘ ENTRY NUMBER
- 28..31 4 ╞ILE LENGTH IN BYTES
-
- ╘HE FILENAME AND EXTENSION ARE STORED WITH TRAILING PADDING SPACES. ╔F A
- DIRECTORY ENTRY IS UNUSED OR DELETED, THEN THE FIRST CHARACTER OF THE FILENAME
- IS EITHER A $00 OR A $┼5 (229). ╘HIS IS WHY YOU HAVE TO PROVIDE THE FIRST
- CHARACTER OF A FILENAME IF YOU ARE UNDELETING A FILE ON AN ═╙-─╧╙ MACHINE.
- ╬OTE THAT THERE IS ENOUGH UNUSED SPACE THAT ═ICROSOFT OR ╔┬═ COULD HAVE
- DITCHED THE ANNOYING 8+3 CHARACTER FILENAME FORMAT.
-
- ╘HE ATTRIBUTES BITS TELL WHETHER THE DIRECTORY ENTRY IS FOR A REGULAR FILE, A
- SUBDIRECTORY, A DISK VOLUME NAME (IN WHICH CASE THERE IS NO FILE DATA), AND A
- COUPLE OF OTHER THINGS ╔ CAN'T REMEMBER. ╔'M NOT SURE ABOUT THE EXACT
- POSITION OR FORMAT OF THE DATE, BUT ╠╥╥ DOESN'T USE IT ANYWAY. ╘HE STARTING
- ╞┴╘ ENTRY NUMBER AND THE FILE LENGTH ARE STORED IN LOWER-BYTE-FIRST ORDER.
-
- 3.4. ╘╚┼ ╞╔╠┼ ─┴╘┴ ╙╨┴├┼
-
- ╘HE RAMAINDER OF THE DISK SPACE IS USED FOR STORING FILE DATA IN CLUSTERS OF 1
- OR 2 SECTORS EACH. ╟IVEN A CLUSTER NUMBER (WHICH IS ALSO THE ╞┴╘ ENTRY
- NUMBER), THE FOLLOWING FORMULA IS USED TO CALCULATE THE STARTING LOGICAL
- SECTOR NUMBER OF THE CLUSTER:
-
- (├LUSTER╬UMBER - 2) * ├LUSTER╙IZE╔N┬LOCKS + ╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER
-
- WHERE "╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER" IS THE "╞╙" PARAMETER DERIVED
- EARLIER. ╘HE FOLLOWING CONSECUTIVE LOGICAL SECTOR NUMBERS UP TO THE NUMBER OF
- SECTORS PER CLUSTER FORM THE REST OF THE CLUSTER. ╬OTE THAT A SINGLE CLUSTER
- CAN SPAN SECTORS FROM ONE SIDE OF THE DISK TO ANOTHER OR FROM ONE TRACK TO
- ANOTHER. ╫E PERFORM THE "(├LUSTER╬UMBER - 2)" PORTION OF THE CALCULATION
- SINCE THE FIRST TWO ╞┴╘ ENTRIES ARE RESERVED.
-
- ╙INCE THE ╥EAD BURST COMMAND OF THE 1571/81 WANTS THE SIDE, TRACK, AND SECTOR
- NUMBER OF A SECTOR RATHER THAN ITS LOGICAL NUMBER, WE ALSO NEED FORMULAE FOR
- THESE CONVERSIONS:
-
- ╘RACK = ╠OGICAL╙ECTOR╬UMBER / 18
- ╙ECTOR = ╠OGICAL╙ECTOR╬UMBER % 9 + 1
- ╙IDE = (╠OGICAL╙ECTOR╬UMBER / 9) % 2
-
- ╘HESE FORMULAE ARE MORE PROBLEMATIC THAN THE PREVIOUS ONE SINCE THEY REQUIRE
- DIVISION BY 9 AND 18. ╠╥╥ USES THE METHOD OF REPEATED SUBTRACTION TO PERFROM
- THE NECESSARY DIVISION (ONLY ONE DIVISION IS NECESSARY). ╘HE ABOVE FORMULAE
- IMPLY THAT SEQUENTIAL LOGICAL SECTORS ARE STORED ON THE TOP OF THE DISK
- FIRST AND THEN THE BOTTOM OF THE DISK OF THE SAME TRACK, AND THEN ON THE TOP
- OF THE NEXT TRACK, ETC. ╘HIS IS A GOOD SECTOR NUMBERING SCHEME (UNLIKE THE
- ├┬═-─╧╙ SCHEME FOR 1571 SECTORS) SINCE IT IS FASTER TO SWITCH SIDES OF THE
- DISK THAN IT IS TO SWITCH TRACKS, SO YOU CAN READ THE DISK FASTER.
-
- ╧H YEAH, THE WAY THAT YOU KNOW HOW MANY FILE DATA BYTES ARE IN THE LAST
- CLUSTER OF A FILE CHAIN (THE CLUSTER WITH THE ╬╒╠╠ ╞┴╘ ENTRY) IS TO TAKE THE
- FILE LENGTH FROM THE DIRECTORY ENTRY AND "MOD" (THE ├ LANGUAGE % OPERATOR) IT
- WITH THE CLUSTER SIZE. ╧NE SPECIAL CASE IS IF THIS CALCULATION RESULTS IN A
- ZERO, THEN THE LAST CLUSTER IS COMPLETELY FULL (RATHER THAN COMPLETELY EMPTY
- AS THE CALCULATION WOULD SUGGEST). ╘HIS CALCULATION IS EASILY DONE IN
- MACHINE LANGUAGE WITH AN ┴╬─ OPERATION SINCE THE CLUSTER SIZE IS ALWAYS A
- POWER OF TWO.
-
- 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
-
- ╘HIS SECTION DISCUSSES THE INTERFACE TO AND IMPLEMENTATION OF THE ═╙-─╧╙ FILE
- COPYING PACKAGE. ╔T IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO MEMORY
- AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY. ╘HE PACKAGE IS
- LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├ PROGRAM,
- EVEN IF ╥┴═─╧╙ IS INSTALLED.
-
- 4.1. ╔╬╘┼╥╞┴├┼
-
- ╘HE SUBROUTINE CALL AND PARAMETER PASSING INTERFACE TO THE FILE COPYING
- PACKAGE IS SUMMARIZED AS FOLLOWS:
-
- ┴──╥┼╙╙ ─┼╙├╥╔╨╘╔╧╬
- ------- -----------
- ╨╦ ╔NIT╨ACKAGE SUBROUTINE
- ╨╦+3 ╠OAD─IRECTORY SUBROUTINE
- ╨╦+6 ├OPY╞ILE SUBROUTINE
- ╨╦+9 TWO-BYTE PACKAGE IDENTIFICATION NUMBER
- ╨╦+15 ERRNO : ERROR CODE RETURNED
- ╨╦+16 ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
- ╨╦+17 ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
- ╨╦+18 TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
- ╨╦+20 LOW AND MID BYTES OF FILE LENGTH FOR COPYING
-
- WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE. ┴DDITIONAL SUBROUTINE
- PARAMETERS ARE PASSED IN THE PROCESSOR REGISTERS.
-
- ╘HE "╔NIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
- INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
- DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE. ╔T REQUIRES NO
- PARAMETERS.
-
- ╘HE "╠OAD─IRECTORY" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT
- ╙ECTOR PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT
- ═╙-─╧╙ DEVICE NUMBER. ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE
- SUBROUTINE RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND
- THE NUMBER OF DIRECTORY ENTRIES IN THE .╪ REGISTER. ╔F AN ERROR OCCURS, THEN
- THE SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE
- IN THE "ERRNO" INTERFACE VARIABLE. ╘HE DIRECTORY ENTRY DATA IS IN THE
- DIRECTORY SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙
- DISK.
-
- ╘HE "├OPY╞ILE" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
- SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
- OPENED). ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
- DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE. ╘HE STARTING CLUSTER NUMBER
- OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
- THE ╨╦+18 AND ╨╦+20 INTERFACE WORDS. ╘HE TRANSLATION MODE TO USE IS PASSED IN
- THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
- OUTPUT TO IS PASSED IN THE .╪ REGISTER. ╔F AN ERROR OCCURS, THE ROUTINE
- RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
- VARIABLE. ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
-
- ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
- BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
- THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
- TO GET THIS INFORMATION. ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
- FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
- NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
-
- ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
- THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
- PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
- HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
- RE-RUNS. ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE
- OF 131.
-
- 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
-
- ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING
- PACKAGE. ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY A FEW
- SPECIAL CHARACTERS AND THE LINE NUMBER. ╘HE SPECIAL CHARACTERS ARE THERE TO
- ALLOW YOU TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE
- (AND ALL OF MY UGLY COMMENTS). ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS
- EXECUTE THE FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
-
- GREP '^\.%...\!' ╚ACK4 ▄ SED 'S/^.%...\!..//' ▄ SED 'S/.%...\!//' >LRR.S
-
- ┘OU'LL NOTICE THAT THE INITIAL COMMENT LINES HERE WERE AN AFTERTHOUGHT.
-
- .%000! ;╠ITTLE ╥ED ╥EADER ═╙-─╧╙ FILE COPIER PROGRAM
- .%000! ;WRITTEN 92/10/03 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
- .%000!
-
- ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
- DIRECTIVES. ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
-
- .%001! .ORG $8000
- .%002! .OBJ "@:LRR.BIN"
- .%003!
- .%004! ;====JUMP TABLE AND PARAMETERS INTERFACE ====
- .%005!
- .%006! JMP INIT╨ACKAGE
- .%007! JMP LOAD─IRECTORY
- .%008! JMP COPY╞ILE
- .%009!
- .%010! .BYTE $CB,131 ;IDENTIFICATION
- .%011! .BYTE 0,0,0,0
- .%012!
-
- ╘HESE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO MINIMIZE UNWANTED
- INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME, SUCH AS THE ╥┴═─╧╙
- DEVICE DRIVER.
-
- .%013! ERRNO .BUF 1 ;(LOCATION PK+15)
- .%014! SOURCE─EVICE .BUF 1
- .%015! SOURCE╘YPE .BUF 1 ;$00=1571, $FF=1581
- .%016! START├LUSTER .BUF 2
- .%017! LEN═╠ .BUF 2 ;LENGTH MEDIUM AND LOW BYTES
- .%018!
- .%019! ;====GLOBAL DECLARAIONS====
- .%020!
- .%021! KERNEL╠ISTEN = $FFB1
- .%022! KERNEL╙ECOND = $FF93
- .%023! KERNEL╒NLSN = $FFAE
- .%024! KERNEL┴CPTR = $FFA2
- .%025! KERNEL├IOUT = $FFA8
- .%026! KERNEL╙PINP = $FF47
- .%027! KERNEL├HKOUT = $FFC9
- .%028! KERNEL├LRCHN = $FFCC
- .%029! KERNEL├HROUT = $FFD2
- .%030!
- .%031! ST = $D0
- .%032! CIA├LOCK = $DD00
- .%033! CIA╞LAGS = $DC0D
- .%034! CIA─ATA = $DC0C
- .%035!
-
- ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR. ╘HEY
- ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
-
- .%036! CLUSTER┬LOCK├OUNT .BUF 1 ;1 OR 2
- .%037! FAT┬LOCKS .BUF 1 ;UP TO 3
- .%038! ROOT─IR┬LOCKS .BUF 1 ;UP TO 8
- .%039! ROOT─IR┼NTRIES .BUF 1 ;UP TO 128
- .%040! TOTAL╙ECTORS .BUF 2 ;UP TO 1440
- .%041! FIRST╞ILE┬LOCK .BUF 1
- .%042! FIRST╥OOT─IR┬LOCK .BUF 1
- .%043! FILE├LUSTER├OUNT .BUF 2
- .%044!
-
- ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACH CACHE.
-
- .%045! BUF├YLINDER .BUF 1
- .%046! BUF╙IDE .BUF 1
- .%047! FORMAT╨ARMS .BUF 6
- .%048!
-
- ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS. ╘HIS LEVEL INTERFACES WITH THE
- ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
-
- .%049! ;====HARDWARE LEVEL====
- .%050!
-
- ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
- BURST COMMAND BYTE.
-
- .%051! SEND╒0 = * ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
- .%052! PHA
- .%053! LDA #0
- .%054! STA ST
- .%055! LDA SOURCE─EVICE
- .%056! JSR KERNEL╠ISTEN
- .%057! LDA #$6F
- .%058! JSR KERNEL╙ECOND
- .%059! LDA #"U"
- .%060! JSR KERNEL├IOUT
- .%061! BIT ST
- .%062! BMI SEND╒0┼RROR
- .%063! LDA #"0"
- .%064! JSR KERNEL├IOUT
- .%065! PLA
- .%066! JSR KERNEL├IOUT
- .%067! BIT ST
- .%068! BMI SEND╒0┼RROR
- .%069! CLC
- .%070! RTS
- .%071!
- .%072! SEND╒0┼RROR = *
- .%073! LDA #5
- .%074! STA ERRNO
- .%075! SEC
- .%076! RTS
- .%077!
-
- ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
- TRANSFER PROTOCOL.
-
- .%078! TOGGLE├LOCK = *
- .%079! LDA CIA├LOCK
- .%080! EOR #$10
- .%081! STA CIA├LOCK
- .%082! RTS
- .%083!
-
- ╫AIT FOR A BURST BYTE TO ARRIVE IN THE SERIAL DATA REGISTER OF ├╔┴#1 FROM THE
- FAST SERIAL BUS.
-
- .%084! SERIAL╫AIT = *
- .%085! LDA #$08
- .%086! - BIT CIA╞LAGS
- .%087! BEQ -
- .%088! RTS
- .%089!
-
- ╫AIT FOR AND GET A BURST BYTE FROM THE FAST SERIAL BUS, AND SEND THE "─ATA
- ┴CCEPTED" SIGNAL.
-
- .%090! GET┬URST┬YTE = *
- .%091! JSR SERIAL╫AIT
- .%092! LDX CIA─ATA
- .%093! JSR TOGGLE├LOCK
- .%094! TXA
- .%095! RTS
- .%096!
-
- ╙END THE BURST COMMANDS TO "LOG IN" THE ═╙-─╧╙ DISK AND SET THE ╥EAD SECTOR
- INTERLEAVE FACTOR.
-
- .%097! MOUNT─ISK = * ;() : .├╙=ERR
- .%098! LDA #%00011010
- .%099! JSR SEND╒0
- .%100! BCC +
- .%101! RTS
- .%102! + JSR KERNEL╒NLSN
- .%103! BIT ST
- .%104! BMI SEND╒0┼RROR
- .%105! CLC
- .%106! JSR KERNEL╙PINP
- .%107! BIT CIA╞LAGS
- .%108! JSR TOGGLE├LOCK
- .%109! JSR GET┬URST┬YTE
- .%110! STA ERRNO
- .%111! AND #$0F
- .%112! CMP #2
- .%113! BCS MOUNT┼XIT
-
- ╟RAB THE THROW-AWAY PARAMETERS FROM THE MOUNT OPERATION.
-
- .%114! LDY #0
- .%115! - JSR GET┬URST┬YTE
- .%116! STA FORMAT╨ARMS,Y
- .%117! INY
- .%118! CPY #6
- .%119! BCC -
- .%120! CLC
-
- ╙ET THE SECTOR INTERLEAVE TO 1 FOR A 1581 OR 4 FOR A 1571.
-
- .%121! ;** SET INTERLEAVE
- .%122! LDA #%00001000
- .%123! JSR SEND╒0
- .%124! BCC +
- .%125! RTS
- .%126! + LDA #1 ;INTERLEAVE OF 1 FOR 1581
- .%127! BIT SOURCE╘YPE
- .%128! BMI +
- .%129! LDA #4 ;INTERLEAVE OF 4 FOR 1571
- .%130! + JSR KERNEL├IOUT
- .%131! JSR KERNEL╒NLSN
- .%132! MOUNT┼XIT = *
- .%133! RTS
- .%134!
-
- ╥EAD ALL OF THE SECTORS OF A GIVEN TRACK INTO THE TRACK CACHE.
-
- .%135! BUFPTR = 2
- .%136! SECNUM = 4
- .%137!
- .%138! READ╘RACK = * ;( .┴=CYLINDER, .╪=SIDE ) : TRACKBUF, .├╙=ERR
- .%139! PHA
- .%140! TXA
-
- ╟ET THE SIDE AND PUT IT INTO THE COMMAND BYTE. ╥EMEMBER THAT WE HAVE TO FLIP
- THE SIDE BIT FOR A 1581.
-
- .%141! AND #$01
- .%142! ASL
- .%143! ASL
- .%144! ASL
- .%145! ASL
- .%146! BIT SOURCE╘YPE
- .%147! BPL +
- .%148! EOR #$10
- .%149! + JSR SEND╒0
- .%150! BCC +
- .%151! RTS
- .%152! + PLA ;CYLINDER NUMBER
- .%153! JSR KERNEL├IOUT
- .%154! LDA #1 ;START SECTOR NUMBER
- .%155! JSR KERNEL├IOUT
- .%156! LDA #9 ;SECTOR COUNT
- .%157! JSR KERNEL├IOUT
- .%158! JSR KERNEL╒NLSN
-
- ╨REPARE TO RECEIVE THE TRACK DATA.
-
- .%159! SEI
- .%160! CLC
- .%161! JSR KERNEL╙PINP
- .%162! BIT CIA╞LAGS
- .%163! JSR TOGGLE├LOCK
- .%164! LDA #<TRACKBUF
- .%165! LDY #>TRACKBUF
- .%166! STA BUFPTR
- .%167! STY BUFPTR+1
-
- ╟ET THE SECTOR DATA FOR EACH OF THE 9 SECTORS OF THE TRACK.
-
- .%168! LDA #0
- .%169! STA SECNUM
- .%170! - BIT SOURCE╘YPE
- .%171! BMI +
-
- ╔F WE ARE DEALING WITH A 1571, WE HAVE TO SET THE BUFFER POINTER FOR THE NEXT
- SECTOR, TAKING INTO ACCOUNT THE SOFT INTERLEAVE OF 4.
-
- .%172! JSR GET1571┬UF╨TR
- .%173! + JSR READ╙ECTOR
- .%174! BCS TRACK┼XIT
- .%175! INC SECNUM
- .%176! LDA SECNUM
- .%177! CMP #9
- .%178! BCC -
- .%179! CLC
- .%180! TRACK┼XIT = *
- .%181! CLI
- .%182! RTS
- .%183!
-
- ╟ET THE BUFFER POINTER FOR THE NEXT 1571 SECTOR.
-
- .%184! GET1571┬UF╨TR = *
- .%185! LDA #<TRACKBUF
- .%186! STA BUFPTR
- .%187! LDX SECNUM
- .%188! CLC
- .%189! LDA #>TRACKBUF
- .%190! ADC BUFPTR1571,X
- .%191! STA BUFPTR+1
- .%192! RTS
- .%193!
- .%194! BUFPTR1571 = *
- .%195! .BYTE 0,8,16,6,14,4,12,2,10
- .%196!
-
- ╥EAD AN INDIVIDUAL SECTOR INTO MEMORY AT THE SPECIFIED ADDRESS.
-
- .%197! READ╙ECTOR = * ;( BUFPTR ) : .├╙=ERR
-
- ╟ET AND CHECK THE BURST STATUS BYTE FOR ERRORS.
-
- .%198! JSR GET┬URST┬YTE
- .%199! STA ERRNO
- .%200! AND #$0F
- .%201! CMP #2
- .%202! BCC +
- .%203! RTS
- .%204! + LDX #2
- .%205! LDY #0
- .%206!
-
- ╥ECEIVE THE 512 SECTOR DATA BYTES INTO MEMORY.
-
- .%207! READ┬YTE = *
- .%208! LDA #$08
- .%209! - BIT CIA╞LAGS
- .%210! BEQ -
- .%211! LDA CIA├LOCK
- .%212! EOR #$10
- .%213! STA CIA├LOCK
- .%214! LDA CIA─ATA
- .%215! STA (BUFPTR),Y
- .%216! INY
- .%217! BNE READ┬YTE
- .%218! INC BUFPTR+1
- .%219! DEX
- .%220! BNE READ┬YTE
- .%221! RTS
- .%222!
-
- ╘HIS NEXT LEVEL OF ROUTINES DEALS WITH LOGICAL SECTORS AND THE TRACK CACHE
- RATHER THAN WITH HARDWARE.
-
- .%223! ;====LOGICAL SECTOR LEVEL====
- .%224!
-
- ╔NVALIDATE THE TRACK CACHE IF THE ═╙-─╧╙ DRIVE NUMBER IS CHANGED OR IF A NEW
- DISK IS INSERTED. ╘HIS ROUTINE HAS TO ESTABLISH A ╥┴═ CONFIGURATION OF $0┼
- SINCE IT WILL BE CALLED FROM ╥┴═0. ├ONFIGURATION $0┼ GIVES ╥┴═0 FROM $0000 TO
- $┬╞╞╞, ╦ERNAL ╥╧═ FROM $├000 TO $╞╞╞╞, AND THE ╔/╧ SPACE OVER THE ╦ERNAL FROM
- $─000 TO $─╞╞╞. ╘HIS CONFIGURATION IS SET BY ALL APPLICATION INTERFACE
- SUBROUTINES.
-
- .%225! INIT╨ACKAGE = *
- .%226! LDA #$0E
- .%227! STA $FF00
- .%228! LDA #$FF
- .%229! STA BUF├YLINDER
- .%230! STA BUF╙IDE
- .%231! CLC
- .%232! RTS
- .%233!
-
- ╠OCATE A SECTOR (BLOCK) IN THE TRACK CACHE, OR READ THE CORRESPONDING PHYSICAL
- TRACK INTO THE TRACK CACHE IF NECESSARY. ╘HIS ROUTINE ACCEPTS THE CYLINDER,
- SIDE, AND SECTOR NUMBERS OF THE BLOCK.
-
- .%234! SECTOR╙AVE = 5
- .%235!
- .%236! READ┬LOCK = * ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
-
- ├HECK IF THE CORRECT TRACK IS IN THE TRACK CACHE.
-
- .%237! CMP BUF├YLINDER
- .%238! BNE READ┬LOCK╨HYSICAL
- .%239! CPX BUF╙IDE
- .%240! BNE READ┬LOCK╨HYSICAL
-
- ╔F SO, THEN LOCATE THE SECTOR'S ADDRESS AND RETURN THAT.
-
- .%241! DEY
- .%242! TYA
- .%243! ASL
- .%244! CLC
- .%245! ADC #>TRACKBUF
- .%246! TAY
- .%247! LDA #<TRACKBUF
- .%248! CLC
- .%249! RTS
- .%250!
-
- ╚ERE, WE HAVE TO READ THE PHYSICAL TRACK INTO THE TRACK CACHE. ╫E SAVE THE
- INPUT PARAMETERS AND CALL THE HARDWARE-LEVEL TRACK-READING ROUTINE.
-
- .%251! READ┬LOCK╨HYSICAL = *
- .%252! STA BUF├YLINDER
- .%253! STX BUF╙IDE
- .%254! STY SECTOR╙AVE
- .%255! JSR READ╘RACK
-
- ├HECK FOR ERRORS.
-
- .%256! BCC READ┬LOCK╨HYSICAL╧K
- .%257! LDA ERRNO
- .%258! AND #$0F
- .%259! CMP #11 ;DISK CHANGE
- .%260! BEQ +
- .%261! SEC
- .%262! RTS
-
- ╔F THE ERROR THAT HAPPENED IS A "─ISK ├HANGE" ERROR, THEN MOUNT THE DISK AND
- TRY TO READ THE PHYSICAL TRACK AGAIN.
-
- .%263! + JSR MOUNT─ISK
- .%264! LDA BUF├YLINDER
- .%265! LDX BUF╙IDE
- .%266! LDY SECTOR╙AVE
- .%267! BCC READ┬LOCK╨HYSICAL
- .%268! RTS
- .%269!
-
- ╚ERE, THE PHYSICAL TRACK HAS BEEN READ INTO THE TRACK CACHE OK, SO WE RECOVER
- THE ORIGINAL INPUT PARAMETERS AND TRY THE TOP OF THE ROUTINE AGAIN.
-
- .%270! READ┬LOCK╨HYSICAL╧K = *
- .%271! LDA BUF├YLINDER
- .%272! LDX BUF╙IDE
- .%273! LDY SECTOR╙AVE
- .%274! JMP READ┬LOCK
- .%275!
-
- ─IVIDE THE GIVEN NUMBER BY 18. ╘HIS IS NEEDED FOR THE CALCULATIONS TO CONVERT
- A LOGICAL SECTOR NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER, SIDE, AND
- SECTOR NUMBERS THAT THE LOWER-LEVEL ROUTINES REQUIRE. ╘HE METHOD OF REPEATED
- SUBTRACTION IS USED. ╘HIS ROUTINE WOULD PROBABLY WORK FASTER IF WE TRIED TO
- REPEATEDLY SUBTRACT 360 (18*20) AT THE TOP, BUT ╔ DIDN'T BOTHER.
-
- .%276! DIVIDE┬Y18 = * ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
- .%277! ;** COULD REPEATEDLY SUBTRACT 360 HERE
- .%278! LDX #$FF
- .%279! - INX
- .%280! SEC
- .%281! SBC #18
- .%282! BCS -
- .%283! DEY
- .%284! BPL -
- .%285! CLC
- .%286! ADC #18
- .%287! INY
- .%288! TAY
- .%289! TXA
- .%290! RTS
- .%291!
-
- ├ONVERT THE GIVEN LOGICAL BLOCK NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER,
- SIDE, AND SECTOR NUMBERS. ╘HIS ROUTINE FOLLOWS THE FORMULAE GIVEN EARLIER
- WITH A FEW SIMPLIFYING TRICKS.
-
- .%292! CONVERT╠OGICAL┬LOCK╬UM = * ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE, .┘=SEC
- .%293! JSR DIVIDE┬Y18
- .%294! LDX #0
- .%295! CPY #9
- .%296! BCC +
- .%297! PHA
- .%298! TYA
- .%299! SBC #9
- .%300! TAY
- .%301! PLA
- .%302! LDX #1
- .%303! + INY
- .%304! RTS
- .%305!
-
- ├OPY A SEQUENTIAL GROUP OF LOGICAL SECTORS INTO MEMORY. ╘HIS ROUTINE IS USED
- BY THE DIRECTORY LOADING ROUTINE TO LOAD THE ╞┴╘ AND ╥OOT ─IRECTORY, AND IS
- USED BY THE CLUSTER READING ROUTINE TO RETRIEVE ALL OF THE BLOCKS OF A
- CLUSTER. ┴FTER THE GIVEN STARTING LOGICAL SECTOR NUMBER IS CONVERTED INTO ITS
- PHYSICAL CYLINDER, SIDE, AND SECTOR EQUIVALENT, THE PHYSICAL VALUES ARE
- INCREMENTED TO GET THE ADDRESS OF SUCCESSIVE SECTORS OF THE GROUP. ╘HIS
- AVOIDS THE OVERHEAD OF THE LOGICAL TO PHYSICAL CONVERSION. ╤UITE A NUMBER OF
- TEMPORARIES ARE NEEDED.
-
- .%306! DEST╨TR = 6
- .%307! CUR├YLINDER = 8
- .%308! CUR╙IDE = 9
- .%309! CUR╙ECTOR = 10
- .%310! BLOCK├OUNTDOWN = 11
- .%311! SOURCE╨TR = 12
- .%312!
- .%313! COPY┬LOCKS = * ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
- .%314! STX BLOCK├OUNTDOWN
- .%315! JSR CONVERT╠OGICAL┬LOCK╬UM
- .%316! STA CUR├YLINDER
- .%317! STX CUR╙IDE
- .%318! STY CUR╙ECTOR
- .%319!
- .%320! COPY┬LOCK╠OOP = *
- .%321! LDA CUR├YLINDER
- .%322! LDX CUR╙IDE
- .%323! LDY CUR╙ECTOR
- .%324! JSR READ┬LOCK
- .%325! BCC +
- .%326! RTS
- .%327! + STA SOURCE╨TR
- .%328! STY SOURCE╨TR+1
- .%329! LDX #2
- .%330! LDY #0
-
- ╚ERE ╔ UNROLL THE COPYING LOOP A LITTLE BIT TO CUT THE OVERHEAD OF THE BRANCH
- INSTRUCTION IN HALF. (┴ CYCLE SAVED... YOU KNOW).
-
- .%331! - LDA (SOURCE╨TR),Y
- .%332! STA (DEST╨TR),Y
- .%333! INY
- .%334! LDA (SOURCE╨TR),Y
- .%335! STA (DEST╨TR),Y
- .%336! INY
- .%337! BNE -
- .%338! INC SOURCE╨TR+1
- .%339! INC DEST╨TR+1
- .%340! DEX
- .%341! BNE -
-
- ╔NCREMENT THE CYLINDER, SIDE, SECTOR VALUES.
-
- .%342! INC CUR╙ECTOR
- .%343! LDA CUR╙ECTOR
- .%344! CMP #10
- .%345! BCC +
- .%346! LDA #1
- .%347! STA CUR╙ECTOR
- .%348! INC CUR╙IDE
- .%349! LDA CUR╙IDE
- .%350! CMP #2
- .%351! BCC +
- .%352! LDA #0
- .%353! STA CUR╙IDE
- .%354! INC CUR├YLINDER
- .%355! + DEC BLOCK├OUNTDOWN
- .%356! BNE COPY┬LOCK╠OOP
- .%357! CLC
- .%358! RTS
- .%359!
-
- ╥EAD A CLUSTER INTO THE ├LUSTER ┬UFFER, GIVEN THE CLUSTER NUMBER. ╘HE CLUSTER
- NUMBER IS CONVERTED TO A LOGICAL SECTOR NUMBER AND THEN THE SECTOR COPYING
- ROUTINE IS CALLED. ╘HE FORMULA GIVEN EARLIER IS USED FOR THE CONVERSION.
-
- .%360! READ├LUSTER = * ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
- .%361! ;** CONVERT CLUSTER NUMBER TO LOGICAL BLOCK NUMBER
- .%362! SEC
- .%363! SBC #2
- .%364! BCS +
- .%365! DEY
- .%366! + LDX CLUSTER┬LOCK├OUNT
- .%367! CPX #1
- .%368! BEQ +
- .%369! ASL
- .%370! STY 7
- .%371! ROL 7
- .%372! LDY 7
- .%373! + CLC
- .%374! ADC FIRST╞ILE┬LOCK
- .%375! BCC +
- .%376! INY
- .%377!
- .%378! ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
- .%379! + LDX #<CLUSTER┬UF
- .%380! STX 6
- .%381! LDX #>CLUSTER┬UF
- .%382! STX 7
- .%383! LDX CLUSTER┬LOCK├OUNT
- .%384! JMP COPY┬LOCKS
- .%385!
-
- ╘HIS NEXT LEVEL OF ROUTINES DEAL WITH THE DATA STRUCTURES OF THE ═╙-─╧╙ DISK
- FORMAT.
-
- .%386! ;====═╙-─╧╙ FORMAT LEVEL====
- .%387!
- .%388! BOOT┬LOCK = 2
- .%389!
-
- ╥EAD THE DISK FORMAT PARAMETERS, DIRECTORY, AND ╞┴╘ INTO MEMORY.
-
- .%390! LOAD─IRECTORY = * ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
- .%391! LDA #$0E
- .%392! STA $FF00
- .%393!
-
- ╥EAD THE BOOT SECTOR AND EXTRACT THE PARAMETERS.
-
- .%394! ;** GET PARAMETERS FROM BOOT SECTOR
- .%395! LDA #0
- .%396! LDY #0
- .%397! JSR CONVERT╠OGICAL┬LOCK╬UM
- .%398! JSR READ┬LOCK
- .%399! BCC +
- .%400! RTS
- .%401! + STA BOOT┬LOCK
- .%402! STY BOOT┬LOCK+1
- .%403! LDY #13 ;GET CLUSTER SIZE
- .%404! LDA (BOOT┬LOCK),Y
- .%405! STA CLUSTER┬LOCK├OUNT
- .%406! CMP #3
- .%407! BCC +
- .%408!
-
- ╔F A DISK PARAMETER IS FOUND TO EXCEED THE LIMITS OF ╠╥╥, ERROR CODE #60 IS
- RETURNED.
-
- .%409! INVALID╨ARMS = *
- .%410! LDA #60
- .%411! STA ERRNO
- .%412! SEC
- .%413! RTS
- .%414!
- .%415! + LDY #16 ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
- .%416! LDA (BOOT┬LOCK),Y
- .%417! CMP #2
- .%418! BNE INVALID╨ARMS
- .%419! LDY #22 ;GET ╞┴╘ SIZE IN SECTORS
- .%420! LDA (BOOT┬LOCK),Y
- .%421! STA FAT┬LOCKS
- .%422! CMP #4
- .%423! BCS INVALID╨ARMS
- .%424! LDY #17 ;GET DIRECTORY SIZE
- .%425! LDA (BOOT┬LOCK),Y
- .%426! STA ROOT─IR┼NTRIES
- .%427! CMP #129
- .%428! BCS INVALID╨ARMS
- .%429! LSR
- .%430! LSR
- .%431! LSR
- .%432! LSR
- .%433! STA ROOT─IR┬LOCKS
- .%434! LDY #19 ;GET TOTAL SECTOR COUNT
- .%435! LDA (BOOT┬LOCK),Y
- .%436! STA TOTAL╙ECTORS
- .%437! INY
- .%438! LDA (BOOT┬LOCK),Y
- .%439! STA TOTAL╙ECTORS+1
- .%440! LDY #24 ;CHECK SECTORS PER TRACK, MUST BE 9
- .%441! LDA (BOOT┬LOCK),Y
- .%442! CMP #9
- .%443! BNE INVALID╨ARMS
- .%444! LDY #26
- .%445! LDA (BOOT┬LOCK),Y
- .%446! CMP #2 ;CHECK NUMBER OF SIDES, MUST BE 2
- .%447! BNE INVALID╨ARMS
- .%448! LDY #14 ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
- .%449! LDA (BOOT┬LOCK),Y
- .%450! CMP #1
- .%451! BNE INVALID╨ARMS
- .%452!
-
- ├ALCULATE THE DERIVED PARAMETERS.
-
- .%453! ;** GET DERIVED PARAMETERS
- .%454! LDA FAT┬LOCKS ;FIRST ROOT DIRECTORY SECTOR
- .%455! ASL
- .%456! CLC
- .%457! ADC #1
- .%458! STA FIRST╥OOT─IR┬LOCK
- .%459! CLC ;FIRST FILE SECTOR
- .%460! ADC ROOT─IR┬LOCKS
- .%461! STA FIRST╞ILE┬LOCK
- .%462! LDA TOTAL╙ECTORS ;NUMBER OF FILE CLUSTERS
- .%463! LDY TOTAL╙ECTORS+1
- .%464! SEC
- .%465! SBC FIRST╞ILE┬LOCK
- .%466! BCS +
- .%467! DEY
- .%468! + STA FILE├LUSTER├OUNT
- .%469! STY FILE├LUSTER├OUNT+1
- .%470! LDA CLUSTER┬LOCK├OUNT
- .%471! CMP #2
- .%472! BNE +
- .%473! LSR FILE├LUSTER├OUNT+1
- .%474! ROR FILE├LUSTER├OUNT
- .%475!
-
- ╟EE, ╔ HAVE MORE COMMENTS EMBEDDED IN THE CODE THAN ╔ DID LAST ISSUE.
-
- .%476! ;** LOAD ╞┴╘
- .%477! + LDA #<FATBUF
- .%478! LDY #>FATBUF
- .%479! STA 6
- .%480! STY 7
- .%481! LDA #1
- .%482! LDY #0
- .%483! LDX FAT┬LOCKS
- .%484! JSR COPY┬LOCKS
- .%485! BCC +
- .%486! RTS
- .%487!
- .%488! ;** LOAD ACTUAL DIRECTORY
- .%489! + LDA #<DIRBUF
- .%490! LDY #>DIRBUF
- .%491! STA 6
- .%492! STY 7
- .%493! LDA FIRST╥OOT─IR┬LOCK
- .%494! LDY #0
- .%495! LDX ROOT─IR┬LOCKS
- .%496! JSR COPY┬LOCKS
- .%497! BCC +
- .%498! RTS
- .%499! + LDA #<DIRBUF
- .%500! LDY #>DIRBUF
- .%501! LDX ROOT─IR┼NTRIES
- .%502! CLC
- .%503! RTS
- .%504!
-
- ╘HIS ROUTINE LOCATES THE GIVEN ╞┴╘ TABLE ENTRY NUMBER AND RETURNS THE VALUE
- STORED IN IT. ╙OME WORK IS NEEDED TO DEAL WITH THE 12-BIT COMPRESSED DATA
- STRUCTURE.
-
- .%505! ENTRY┴DDR = 2
- .%506! ENTRY╫ORK = 4
- .%507! ENTRY┬ITS = 5
- .%508! ENTRY─ATA0 = 6
- .%509! ENTRY─ATA1 = 7
- .%510! ENTRY─ATA2 = 8
- .%511!
- .%512! GET╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
- .%513! STA ENTRY┬ITS
-
- ─IVIDE THE ╞┴╘ ENTRY NUMBER BY TWO AND MULTIPLY BY THREE BECAUSE TWO ╞┴╘
- ENTRIES ARE STORED IN THREE BYTES. ╘HEN ADD THE ╞┴╘ BASE ADDRESS AND WE HAVE
- THE ADDRESS OF THE THREE BYTES THAT CONTAIN THE ╞┴╘ ENTRY WE ARE INTERESTED
- IN. ╔ RETRIEVE THE THREE BYTES INTO ZERO-PAGE MEMORY FOR EASY MANIPULATION.
-
- .%514! ;** DIVIDE BY TWO
- .%515! STY ENTRY┴DDR+1
- .%516! LSR ENTRY┴DDR+1
- .%517! ROR
- .%518!
- .%519! ;** TIMES THREE
- .%520! STA ENTRY╫ORK
- .%521! LDX ENTRY┴DDR+1
- .%522! ASL
- .%523! ROL ENTRY┴DDR+1
- .%524! CLC
- .%525! ADC ENTRY╫ORK
- .%526! STA ENTRY┴DDR
- .%527! TXA
- .%528! ADC ENTRY┴DDR+1
- .%529! STA ENTRY┴DDR+1
- .%530!
- .%531! ;** ADD BASE, GET DATA
- .%532! CLC
- .%533! LDA ENTRY┴DDR
- .%534! ADC #<FATBUF
- .%535! STA ENTRY┴DDR
- .%536! LDA ENTRY┴DDR+1
- .%537! ADC #>FATBUF
- .%538! STA ENTRY┴DDR+1
- .%539! LDY #2
- .%540! - LDA (ENTRY┴DDR),Y
- .%541! STA ENTRY─ATA0,Y
- .%542! DEY
- .%543! BPL -
- .%544! LDA ENTRY┬ITS
- .%545! AND #1
- .%546! BNE +
- .%547!
-
- ╔F THE ORIGINAL GIVEN ╞┴╘ ENTRY NUMBER IS EVEN, THEN WE WANT THE FIRST 12-BIT
- COMPRESSED FIELD. ╘HE NYBBLES ARE EXTRACTED ACCORDING TO THE DIAGRAM SHOWN
- EARLIER.
-
- .%548! ;** CASE 1: FIRST 12-BIT CLUSTER
- .%549! LDA ENTRY─ATA1
- .%550! AND #$0F
- .%551! TAY
- .%552! LDA ENTRY─ATA0
- .%553! RTS
- .%554!
-
- ╧THERWISE, WE WANT THE SECOND 12-BIT FIELD.
-
- .%555! ;** CASE 2: SECOND 12-BIT CLUSTER
- .%556! + LDA ENTRY─ATA1
- .%557! LDX #4
- .%558! - LSR ENTRY─ATA2
- .%559! ROR
- .%560! DEX
- .%561! BNE -
- .%562! LDY ENTRY─ATA2
- .%563! RTS
- .%564!
-
- ╞INALLY, THIS IS THE FILE COPYING LEVEL. ╔T DEALS WITH READING THE CLUSTERS
- OF ═╙-─╧╙ FILES AND COPYING THE DATA THEY CONTAIN TO THE ALREADY-OPEN ├┬═
- ╦ERNAL FILE, POSSIBLY WITH ┴╙├╔╔-TO-╨┼╘╙├╔╔ TRANSLATION.
-
- .%565! ;====FILE COPY LEVEL====
- .%566!
- .%567! TRANS═ODE = 14
- .%568! LFN = 15
- .%569! CBM─ATA╨TR = $60
- .%570! CBM─ATA╠EN = $62
- .%571! CLUSTER = $64
- .%572!
-
- ├OPY THE GIVEN CLUSTER TO THE ├┬═ OUTPUT FILE. ╘HIS ROUTINE FETCHES THE NEXT
- CLUSTER OF THE FILE FOR THE NEXT TIME THIS ROUTINE IS CALLED, AND IF IT HITS
- THE ╬╒╠╠ POINTER OF THE LAST CLUSTER OF A FILE, IT ADJUSTS THE NUMBER OF VALID
- FILE DATA BYTES THE CURRENT CLUSTER CONTAINS TO ╞ILE╠ENGTH % ├LUSTER╠ENGTH
- (SEE NOTE BELOW).
-
- .%573! COPY╞ILE├LUSTER = * ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
-
- ╥EAD THE CLUSTER AND SETUP TO COPY THE WHOLE CLUSTER TO THE ├┬═ FILE.
-
- .%574! LDA CLUSTER
- .%575! LDY CLUSTER+1
- .%576! JSR READ├LUSTER
- .%577! BCC +
- .%578! RTS
- .%579! + LDA #<CLUSTER┬UF
- .%580! LDY #>CLUSTER┬UF
- .%581! STA CBM─ATA╨TR
- .%582! STY CBM─ATA╨TR+1
- .%583! LDA #0
- .%584! STA CBM─ATA╠EN
- .%585! LDA CLUSTER┬LOCK├OUNT
- .%586! ASL
- .%587! STA CBM─ATA╠EN+1
- .%588!
-
- ╞ETCH THE NEXT CLUSTER NUMBER OF THE FILE, AND ADJUST THE CLUSTER DATA LENGTH
- FOR THE LAST CLUSTER OF THE FILE.
-
- .%589! ;**GET NEXT CLUSTER
- .%590! LDA CLUSTER
- .%591! LDY CLUSTER+1
- .%592! JSR GET╞AT┼NTRY
- .%593! STA CLUSTER
- .%594! STY CLUSTER+1
- .%595! CMP #$FF
- .%596! BNE COPY╞ILE├LUSTER─ATA
- .%597! CPY #$0F
- .%598! BNE COPY╞ILE├LUSTER─ATA
- .%599! LDA LEN═╠
- .%600! STA CBM─ATA╠EN
- .%601! LDA #$01
- .%602! LDX CLUSTER┬LOCK├OUNT
- .%603! CPX #1
- .%604! BEQ +
- .%605! LDA #$03
- .%606! + AND LEN═╠+1
-
- ╘HE FOLLOWING THREE LINES WERE ADDED IN A LAST MINUTE PANIC AFTER REALIZING
- THAT IF ╞ILE╠ENGTH % ├LUSTER╙IZE == 0, THEN THE LAST CLUSTER OF THE FILE
- CONTAINS ├LUSTER╙IZE BYTES, NOT ZERO BYTES.
-
- .%000! BNE +
- .%000! LDX LEN═╠
- .%000! BEQ COPY╞ILE├LUSTER─ATA
- .%607! + STA CBM─ATA╠EN+1
- .%608!
- .%609! COPY╞ILE├LUSTER─ATA = *
- .%610! JSR COMMIE╧UT
- .%611! RTS
- .%612!
-
- ├OPY THE FILE DATA IN THE ═╙-─╧╙ CLUSTER BUFFER TO THE ├┬═ OUTPUT FILE.
-
- .%613! CBM─ATA╠IMIT = $66
- .%614!
- .%615! COMMIE╧UT = * ;( CBM─ATA╨TR, CBM─ATA╠EN ) : .├╙=ERR
-
- ╔F THE THE LOGICAL FILE NUMBER TO COPY TO IS 0 ("NULL DEVICE"), THEN DON'T
- BOTHER COPYING ANYTHING.
-
- .%616! LDX LFN
- .%617! BNE +
- .%618! CLC
- .%619! RTS
-
- ╧THERWISE, PREPARE THE LOGICAL FILE NUMBER FOR OUTPUT.
-
- .%620! + JSR KERNEL├HKOUT
- .%621! BCC COMMIE╧UT═ORE
- .%622! STA ERRNO
- .%623! RTS
- .%624!
- .%625! COMMIE╧UT═ORE = *
-
- ╨ROCESS THE CLUSTER DATA IN CHUNKS OF UP TO 255 BYTES OR THE NUMBER OF DATA
- BYTES REMAINING IN THE CLUSTER.
-
- .%626! LDA #255
- .%627! LDX CBM─ATA╠EN+1
- .%628! BNE +
- .%629! LDA CBM─ATA╠EN
- .%630! + STA CBM─ATA╠IMIT
- .%631! LDY #0
- .%632! - LDA (CBM─ATA╨TR),Y
- .%633! BIT TRANS═ODE
- .%634! BPL +
-
- ╔F WE HAVE TO TRANSLATE THE CURRENT ┴╙├╔╔ CHARACTER, LOOK UP THE ╨┼╘╙├╔╔ VALUE
- IN THE TRANSLATION TABLE AND OUTPUT THAT VALUE. ╔F THE TRANSLATION TABLE
- ENTRY VALUE IS $00, THEN DON'T OUTPUT A CHARACTER (FILTER OUT INVALID
- CHARACTER CODES).
-
- .%635! TAX
- .%636! LDA TRANS┬UF,X
- .%637! BEQ COMMIE╬EXT
- .%638! + JSR KERNEL├HROUT
- .%639! COMMIE╬EXT = *
- .%640! INY
- .%641! CPY CBM─ATA╠IMIT
- .%642! BNE -
- .%643!
-
- ╔NCREMENT THE CLUSTER BUFFER POINTER AND DECREMENT THE CLUSTER BUFFER CHARACTER
- COUNT ACCORDING TO THE NUMBER OF BYTES JUST PROCESSED, AND REPEAT THE ABOVE IF
- MORE FILE DATA REMAINS IN THE CURRENT CLUSTER.
-
- .%644! CLC
- .%645! LDA CBM─ATA╨TR
- .%646! ADC CBM─ATA╠IMIT
- .%647! STA CBM─ATA╨TR
- .%648! BCC +
- .%649! INC CBM─ATA╨TR+1
- .%650! + SEC
- .%651! LDA CBM─ATA╠EN
- .%652! SBC CBM─ATA╠IMIT
- .%653! STA CBM─ATA╠EN
- .%654! BCS +
- .%655! DEC CBM─ATA╠EN+1
- .%656! + LDA CBM─ATA╠EN
- .%657! ORA CBM─ATA╠EN+1
- .%658! BNE COMMIE╧UT═ORE
-
- ╔F WE ARE FINISHED WITH THE CLUSTER, THEN CLEAR THE ├┬═ ╦ERNAL OUTPUT CHANNEL.
-
- .%659! JSR KERNEL├LRCHN
- .%660! CLC
- .%661! RTS
- .%662!
-
- ╘HE FILE COPYING MAIN ROUTINE. ╙ET UP FOR THE STARTING CLUSTER, AND CALL
- THE CLUSTER COPYING ROUTINE UNTIL END-OF-FILE IS REACHED. ├HECKS FOR A
- ╬╒╠╠ CLUSTER POINTER IN THE DIRECTORY ENTRY TO HANDLE ZERO-LENGTH FILES.
-
- .%663! COPY╞ILE = * ;( START├LUSTER, LEN═╠, .┴=TRANS═ODE, .╪=LFN ) : .├╙=ERR
- .%664! LDY #$0E
- .%665! STY $FF00
- .%666! STA TRANS═ODE
- .%667! STX LFN
- .%668! LDA START├LUSTER
- .%669! LDY START├LUSTER+1
- .%670! STA CLUSTER
- .%671! STY CLUSTER+1
- .%672! JMP +
- .%673! - JSR COPY╞ILE├LUSTER
- .%674! BCC +
- .%675! RTS
- .%676! + LDA CLUSTER
- .%677! CMP #$FF
- .%678! BNE -
- .%679! LDA CLUSTER+1
- .%680! CMP #$0F
- .%681! BNE -
- .%682! CLC
- .%683! RTS
- .%684!
-
- ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ┴╙├╔╔ TO ╨┼╘╙├╔╔. ┘OU CAN
- MODIFY IT TO SUIT YOUR NEEDS IF YOU WISH. ╔F YOU CANNOT REASSEMBLE THIS FILE,
- THEN YOU CAN SIFT THROUGH THE BINARY FILE AND LOCATE THE TABEL AND CHANGE IT
- THERE. ┴N ENTRY OF $00 MEANS THE CORRESPONDING ┴╙├╔╔ CHARACTER WILL NOT BE
- TRANSLATED. ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING
- ┴╙├╔╔ CONTROL CHARACTERS INTO ╨┼╘╙├╔╔: ┬ACKSPACE, ╘AB, ╠INEFEED (├╥), AND
- ╞ORMFEED. ╔ ALSO TRANSLATE THE NON-╨┼╘╙├╔╔ CHARACTERS SUCH AS █, ▄, ▐, AND _
- ACCORDING TO WHAT THEY PROBABLY WOULD HAVE BEEN IF ├OMMODORE WASN'T SO
- CONCERNED WITH THE GRAPHICS CHARACTERS.
-
- .%685! TRANS┬UF = *
- .%686! ;0 1 2 3 4 5 6 7 8 9 A B C D E F
- .%687! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0D,$00,$93,$00,$00,$00 ;0
- .%688! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
- .%689! .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
- .%690! .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
- .%691! .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
- .%692! .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
- .%693! .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
- .%694! .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
- .%695! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
- .%696! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
- .%697! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
- .%698! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
- .%699! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;C
- .%700! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;D
- .%701! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
- .%702! .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;F
- .%703!
-
- ╘HIS IS WHERE THE TRACK CACHE, ETC. ARE STORED. ╘HIS SECTION REQUIRES 11╦ OF
- STORAGE SPACE BUT DOES NOT INCREASE THE LENGTH OF THE BINARY PROGRAM FILE
- SINCE THESE STORAGE AREAS ARE ─┼╞╔╬┼─ RATHER THAN ALLOCATED WITH ".BUF"
- DIRECTIVES. ╘HE ╒NIX TERMINOLOGY FOR THIS TYPE OF UNINITIALIZED DATA IS "BSS".
-
- .%704! ;====BSS STORAGE====
- .%705!
- .%706! BSS = *
- .%707! TRACKBUF = BSS
- .%708! CLUSTER┬UF = TRACKBUF+4608
- .%709! FATBUF = CLUSTER┬UF+1024
- .%710! DIRBUF = FATBUF+1536
- .%711! END = DIRBUF+4096
-
- 5. ╒╙┼╥-╔╬╘┼╥╞┴├┼ ╨╥╧╟╥┴═
-
- ╘HIS SECTION PRESENTS THE LISTING OF THE USER-INTERFACE ┬┴╙╔├ PROGRAM. ┘OU
- SHOULD BE AWARE THAT YOU CAN EASILY CHANGE SOME OF THE DEFAULTS TO YOUR OWN
- PREFERENCES IF YOU WISH. ╘HIS PROGRAM IS NOT LISTED IN THE ".%NNN!" FORMAT
- THAT THE ASSEMBLER LISTING IS SINCE YOU CAN RECOVER THIS LISTING FROM THE
- UUENCODED BINARY PROGRAM FILE. ╘HIS PROGRAM SHOULD BE A LITTLE EASIER TO
- FOLLOW THAN THE ASSEMBLER LISTING SINCE ┬┴╙╔├ IS A SELF-COMMENTING LANGUAGE. :-)
-
- 10 REM LITTLE RED READER, BY CRAIG BRUCE, 30-SEP-92, FOR C= HACKING NETMAG
- 11 :
-
- ╘HESE LINES SET UP THE DEFAULT ├┬═-─╧╙ AND ═╙-─╧╙ DEVICE NUMBERS, TAKING CARE
- TO DISALLOW THEM TO BE THE SAME DEVICE. ┘OU CAN CHANGE THIS TO YOUR OWN DRIVE
- CONFIGURATION.
-
- 20 CD=PEEK(186) : REM ** DEFAULT CBM-DOS DRIVE **
- 25 DV=9:DT=0 : REM ** MS-DOS DRIVE, TYPE (0=1571,255=1581)
- 26 IF DV=CD THEN DV=8:DT=0 : REM ** ALTERNATE MS-DOS DRIVE
- 27 :
- 30 PRINT CHR$(147);"INITIALIZING..." : PRINT
- 40 BANK0 : PK=DEC("8000")
- 50 IF PEEK(PK+9)=DEC("CB") AND PEEK(PK+10)=131 THEN 60
- 55 PRINT"LOADING MACHINE LANGUAGE ROUTINES..." : BLOAD"LRR.BIN",U(CD)
- 60 POKE PK+16,DV : POKE PK+17,DT : SYS PK
-
- ╔ "DIM" THE FOLLOWING VARIABLES BEFORE THE ARRAYS TO AVOID THE OVERHEAD OF
- PUSHING THE ARRAYS AROUND WHEN CREATING NEW SCALAR VARIABLES.
-
- 70 DIM T,R,B,I,A$,C,DT$,FL$,IL$,X,X$
- 80 DIM DI$(128),CL(128),SZ(128)
- 90 IF DT=255 THEN DT$="1581" :ELSE DT$="1571"
- 100 FL$=CHR$(19)+CHR$(17)+CHR$(17)+CHR$(17)+CHR$(17)
- 110 IL$=FL$:FORI=1TO19:IL$=IL$+CHR$(17):NEXT
- 120 GOTO 500
- 130 :
- 131 REM ** LOAD MS-DOS DIRECTORY **
- 140 PRINT"LOADING DIRECTORY..." : PRINT
- 150 SYS PK : SYS PK+3
- 160 DL=0
-
- ╘HE "RREG" INSTRUCTION RETURNS THE RETURN VALUES OF THE .┴, .╪, .┘, AND .╙
- REGISTERS FROM THE LAST "SYS" CALL. ╔ CHECK THE 1-BIT OF THE .╙ REGISTER
- (THE ├ARRY FLAG) FOR ERROR RETURNS.
-
- 170 RREG BL,DC,BH,S : E=PEEK(PK+15)
- 180 IF (S AND 1) THEN GOSUB 380 : RETURN
- 190 PRINT"SCANNING DIRECTORY..." : PRINT
- 200 DB=BL+256*BH
- 210 IF DC=0 THEN 360
- 220 FOR DP=DB TO DB+32*(DC-1) STEP 32
- 230 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 350
- 240 IF PEEK(DP+12) AND 24 THEN 350
- 250 DL=DL+1
-
- ╘HIS NEXT LINE IS WHERE ╔ SET THE DEFAULT SELECTION STATUS, TRANSLATION TYPE,
- AND ├┬═ FILE TYPE FOR THE ═╙-─╧╙ FILES. ┘OU CAN CHANGE THESE DEFAULTS SIMPLY
- BY OVERTYPING THE STRING IN ( ▄ ▄▄▄ ▄▄▄ ) THE "╓" LOCATIONS.
- ╓ ╓╓╓ ╓╓╓
- 260 D$=RIGHT$(" "+STR$(DL),3)+" ASC SEQ " : REM ** DEFAULT SEL/TR/FT **
- 270 A$="" : FORI=0TO10 : A$=A$+CHR$(PEEK(DP+I)) : NEXT
- 280 A$=LEFT$(A$,8)+" "+RIGHT$(A$,3)
- 290 PRINT DL; A$
- 300 D$=D$+A$+" "
- 310 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
- 320 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
- 330 DI$(DL)=D$+RIGHT$(" "+STR$(SZ),6)
- 340 SZ(DL)=SZ
- 350 NEXT DP
- 360 RETURN
- 370 :
- 371 REM ** REPORT MS-DOS DISK ERROR **
- 380 PRINT CHR$(18);"MS-DOS DISK ERROR #";MID$(STR$(E),2);
- 390 PRINT " ($";MID$(HEX$(E),3);"), PRESS KEY.";CHR$(146)
- 400 GETKEY A$ : RETURN
- 410 :
- 411 REM ** SCREEN HEADING **
- 420 PRINTCHR$(147);"MS-DEV=";MID$(STR$(DV),2);" MS-TYPE=";DT$;
- 430 PRINT" CBM-DEV=";MID$(STR$(CD),2):PRINT
- 440 RETURN
- 450 :
- 451 REM ** SCREEN FOOTING **
- 460 PRINT IL$;"D=DIRECTORY M=MS-DEV F=CBM-DEV Q=QUIT"
- 470 PRINT"T=TOGGLE-COLUMN, C=COPY-FILES, +/- PAGE";
- 480 RETURN
- 490 :
- 491 REM ** MAIN ROUTINE **
- 500 T=1 : C=0
- 510 R=0
- 520 GOSUB 420
- 530 PRINT "NUM S TRN TYP FILENAME EXT LENGTH"
- 540 PRINT "--- - --- --- -------- --- ------"
- 550 GOSUB 460
- 560 B=T+17 : IF B>DL THEN B=DL
- 570 PRINT FL$;: IF T>DL THEN 590
- 580 FOR I=T TO B : PRINT DI$(I) : NEXT
- 590 IF DL=0 THEN PRINT CHR$(18);"<NO FILES>";CHR$(146)
- 600 IF DL=0 THEN 660
- 610 PRINT LEFT$(IL$,R+5);CHR$(18);
- 620 ON C+1 GOTO 630,640,650
- 630 PRINT SPC(4);MID$(DI$(T+R),5,3) : GOTO 660
- 640 PRINT SPC(7);MID$(DI$(T+R),8,5) : GOTO 660
- 650 PRINT SPC(12);MID$(DI$(T+R),13,5) : GOTO 660
- 660 GETKEY A$
-
- ╧H SHI^╚OOT. ╔ SCREWED UP THE FOLLOWING LINE IN THE STRING AFTER THE
- "+CHR$(13)+" PART. ┘OU'LL NOTICE THAT ╔ HAVE AVOIDED PUTTING CURSOR CONTROL
- CHARACTERS INTO THE STRINGS EVERYWHERE ELSE, BUT ╔ FORGOT TO DO THAT HERE.
- ╘HE "█STUFF▌" SHOULD BE ├URSOR╒P, ├URSOR─OWN, ├URSOR╠EFT, ├URSOR╥IGHT,
- ├URSOR╚OME, AND ├URSOR├╠╥ CONTROL CHARACTERS, RESPECTIVELY. ╘HESE CHARACTERS
- GIVE THE INDEX FOR THE "ON" STATEMENT BELOW.
-
- 670 I=INSTR("DMFTC+-Q "+CHR$(13)+"█STUFF▌",A$)
- 680 PRINT LEFT$(IL$,R+5);DI$(T+R)
- 690 IF I=0 THEN 600
- 700 ONIGOTO760,1050,1110,950,1150,1000,1020,730,860,860,770,790,810,830,850,500
- 710 STOP
- 720 :
- 721 REM ** VARIOUS MENU OPTIONS **
- 730 PRINT CHR$(147);"HAVE AN AWESOME DAY."
- 740 END
- 760 GOSUB 420 : GOSUB 140 : GOTO 500
- 770 R=R-1 : IF R<0 THEN R=B-T
- 780 GOTO 600
- 790 R=R+1 : IF T+R>B THEN R=0
- 800 GOTO 600
- 810 C=C-1 : IF C<0 THEN C=2
- 820 GOTO 600
- 830 C=C+1 : IF C>2 THEN C=0
- 840 GOTO 600
- 850 R=0 : C=0 : GOTO 600
- 860 IF DL=0 THEN 600
- 870 X=T+R : ON C+1 GOSUB 890,910,930
- 880 PRINT LEFT$(IL$,R+5);DI$(X) : GOTO 600
- 890 IF MID$(DI$(X),6,1)=" " THEN X$="*" :ELSE X$=" "
- 900 MID$(DI$(X),6,1)=X$ : RETURN
- 910 IF MID$(DI$(X),9,1)="A" THEN X$="BIN" :ELSE X$="ASC"
- 920 MID$(DI$(X),9,3)=X$ : RETURN
- 930 IF MID$(DI$(X),14,1)="S" THEN X$="PRG" :ELSE X$="SEQ"
- 940 MID$(DI$(X),14,3)=X$ : RETURN
- 950 IF DL=0 THEN 600
- 960 FOR X=1 TO DL
- 970 ON C+1 GOSUB 890,910,930
- 980 NEXT X
- 990 GOTO 520
- 1000 IF B=DL THEN T=1 : GOTO 510
- 1010 T=T+18 : GOTO 510
- 1020 IF T=1 THEN T=DL-(DL-INT(DL/18)*18)+1 : GOTO 510
- 1030 T=T-18 : IF T<1 THEN T=1
- 1040 GOTO 510
- 1050 PRINT IL$;CHR$(27);"@";
- 1060 INPUT"MS-DOS DEVICE NUMBER (8-30)";DV
- 1061 IF CD=DV THEN PRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1060
- 1070 INPUT"MS-DOS DEVICE TYPE (71/81)";X
- 1080 IF X=8 OR X=81 OR X=1581 THEN DT=255:DT$="1581" :ELSE DT=0:DT$="1571"
- 1090 POKE PK+16,DV : POKE PK+17,DT : SYS PK
- 1100 GOTO 520
- 1110 PRINT IL$;CHR$(27);"@";
- 1120 INPUT "CBM-DOS DEVICE NUMBER (0-30)";CD
- 1130 IF CD=DV THEN PRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1120
- 1140 GOTO 520
- 1141 :
- 1142 REM ** COPY FILES **
- 1150 PRINT CHR$(147);"COPY FILES":PRINT:PRINT
- 1160 IF DL=0 THEN FC=0 : GOTO 1190
- 1170 FC=0 : FOR F=1 TO DL : IF MID$(DI$(F),6,1)="*" THEN GOSUB 1200
- 1180 NEXT F
- 1190 PRINT : PRINT"FILES COPIED =";FC;" - PRESS KEY"
- 1191 GETKEY A$ : GOTO 520
- 1200 FC=FC+1
- 1210 X$=MID$(DI$(F),19,8)+"."+MID$(DI$(F),29,3)
- 1220 CF$="":FORI=1TOLEN(X$):IF MID$(X$,I,1)<>" " THEN CF$=CF$+MID$(X$,I,1)
- 1230 NEXT
- 1231 IF RIGHT$(CF$,1)="." THEN CF$=LEFT$(CF$,LEN(CF$)-1)
- 1232 CF$=CF$+","+MID$(DI$(F),14,1)
- 1240 PRINT STR$(FC);". ";CHR$(34);CF$;CHR$(34);TAB(20);SZ(F)"BYTES";
- 1245 PRINT TAB(35);MID$(DI$(F),9,3)
- 1250 CL=CL(F) : LB=SZ(F) - INT(SZ(F)/65536)*65536
-
- ╔ HAD TO USE A ─╧╨┼╬ STATEMENT HERE FOR DISK FILES BECAUSE THE REGULAR ╧╨┼╬
- STATMENT DOES NOT REDIRECT THE ─╙ AND ─╙$ PSEUDO-VARIABLES. ┘OU'LL NOTICE
- THAT THE NON-DISK ╧╨┼╬ STATMENT BELOW HAS A SECONDARY ADDRESS OF 7. ╘HIS IS
- TO PUT THE PRINTER INTO LOWERCASE MODE IF YOU ARE OUTPUTTING DIRECTLY TO IT.
- ┘OU CAN REPLACE THIS WITH A 5 (OR WHATEVER) IF YOU HAVE A SPECIAL INTERFACE
- TO AN ╔┬═-COMPATIBLE PRINTER AND YOU WANT TO PRINT DIRECTLY IN ┴╙├╔╔. ╔N THIS
- CASE, YOU WOULD SELECT THE "┬╔╬" TRANSLATION MODE FOR THE FILE YOU ARE ROUTING
- DIRECTLY TO THE PRINTER.
-
- 1260 IF CD>=8 THEN DOPEN#1,(CF$+",W"),U(CD) :ELSE IF CD<>0 THEN OPEN 1,CD,7
- 1265 IF CD<8 THEN 1288
- 1270 IF DS<>63 THEN 1288
- 1275 X$="Y" : PRINT "FILE EXISTS; OVERWRITE (Y/N)";
- 1280 CLOSE 1 : INPUT X$ : IF X$="N" THEN FC=FC-1 : RETURN
- 1285 SCRATCH(CF$),U(CD)
- 1286 DOPEN#1,(CF$+",W"),U(CD)
- 1288 IF CD<8 THEN 1320
- 1300 IF DS<20 THEN 1320
- 1310 PRINT CHR$(18)+"CBM DISK ERROR: "+DS$ : FC=FC-1 : CLOSE1 : RETURN
- 1320 POKE PK+19,CL/256 : POKE PK+18,CL-PEEK(PK+19)*256
- 1330 POKE PK+21,LB/256 : POKE PK+20,LB-PEEK(PK+21)*256
- 1340 TR=0 : IF MID$(DI$(F),9,1)="A" THEN TR=255
- 1346 X=1 : IF CD=0 THEN X=0
- 1350 SYS PK+6,TR,X
- 1355 RREG X,X,X,S : E=PEEK(PK+15)
- 1356 IF (S AND 1) THEN GOSUB 380 : FC=FC-1
- 1360 IF CD<>0 AND CD<8 THEN CLOSE1
- 1370 IF CD>=8 THEN DCLOSE#1 : IF DS>=20 THEN 1310
- 1380 RETURN
-
- 6. ╒╒┼╬├╧─┼─ ╞╔╠┼╙
-
- ╚ERE ARE THE BINARY EXECUTABLES IN UUENCODED FORM. ╘HE ├╥├32S OF THE TWO
- FILES ARE AS FOLLOWS:
-
- "LRR.128" 1106058594
- "LRR.BIN" 460671650
-
- ╘HE "LRR.128" FILE IS THE MAIN ┬┴╙╔├ PROGRAM AND THE "LRR.BIN" FILE CONTAINS
- THE MACHINE LANUGAGE DISK-ACCESSING ROUTINES.
-
- BEGIN 640 LRR.128
- ═└1╤+'└╚└├╥!,25143$4@4─5$(%)%041%4┬╨@0┼─@0╒)!24<@0┼)50╘4╠(#,╨
- ═+5-%4"╘┘,┬╨@1─]2($,]($┴!0╘═)3─<@3─5434%'└%$<"╨└┌└(└<%└!#1++"
- ═*#$╪-┬─@(#╚@├╥└╩*┬!$149!54╤4($-"32╒$3╒,@1%))5─4@*┬╚└╧!╨9└$16
- ═╠├─┌1%2╥,"└@.┬└@├╥└╩*┬!-4╥╒$3╒,@1%))5─4╠(%194$4@*#└],34╫,2╨╥
- ═-34],34╪,2─└\┴╨:└(╠@1%:╥0╘0@╔╥!$5╦(╪.─14╠├└@.┬"/("╚╩($%,5$52
- ═3─%412!-4╥╒$3╒,@1%))5─4└^!╨;└#╚└&╤╘>└)─@╤╥@╤-#<╔.╥))3─┼424%,
- ═25╔)3─<╬+┬╪┬(#╚@╞0└╥'2@└_@(╨(#╚@4$╬╥╘2@┬.#└╨,"(╔└%╨=,@"+(,(╚
- ═4$╬╩.2╞╥╘2@┬0╘(┬*2"╧(,(╚4$╬╩,3└╔╠├$╙,2"╟(#8╨└)╨=-╨"9(─╤/041)
- ═3─<@34%#2$┼.12!,04┘'54%'12!23╒5424┘%4╥╪╬+┬(@.┬#^$2),4┼(╬0─┼.
- ═(┬╤5*$-$*0"_'3╨└┼╥!02┌╚╤-┬╤$5┬└┌()<@4$╬╩,3<╠1%0@.┬">(%!+└.,=
- ═1@"&(%0╠4┬╤"+$─╠020╠0╥╤$5"0╠1─╨─+$┼,)"╤8+%@─└└(>4└"&($1))"@╤
- ═,├@╔+$-,*#$╥."─╠4╒╚╚,3(╪*0└╩'┼╚└┬╥!$5+(╥-34@╔╥!$5"2╥(├$╒.#$┬
- ═(#╦5($14)+(┬,34╫,2(└4!┘─└$9,)++'*#$┘*:╦'*#$╫*:╦'*#$╫*:╦'*#$╫
- ═*:╦'*#$╫*0!╘'╞╪└24╨─╠─9,)#╩!2;(╤╔#$┘.─┼,)+))3"2╩╤╥@╤-╥─┌@@!^
- ═'╟@└┬2└╒,#└└┴!┌"└#╚└╔┴┌#└(\@*┬╚@3$]!1"!-4╥╒$3╒,@1$┼214-43╒)9
- ═("╚╩└,8>├└"9(─╤/041)3─<@1$┼214-43╒)9+┬╪╬(┬└┌()─└╓!┌6└)╪@4$╠@
- ═.┬">(%!+╩├,└╪1┌@└$1,╠├└└└!^╩└/╪)($),+$1#+$)(+%,@.┬!%╠╠(╚4$╬╩
- ═,34╔└!╚?═└"+("┴3(*\@,2─@╔╥"-(#,╪,"└┌((╪└.╤^^└)─┬4╘-!3─┘)3─<@
- ═1$┼214-43╒)9+┬╪╬(┬└┌()─└3!_(└$1"╠─),╩├(╒-╩╤"2└!='](└┬╥!$0[(╨
- ═(*<@,╙8╨└'╘?╫└"!($10╠─1"(*0@1$*╩,╙*╠*$1#╩╙$╔(*─@,╙(└╟1_╞└(╠@
- ═╨┬┴$4"╞╥,""╨(,(╚1%└╔╠├(╥.2"╟(#,╒,└"╫'_└└┬╥#"*$10╩├$╥*2"╧(#(╘
- ═(*<@,╙4╨└,,?^@!$3+)$3*╚╤└└<@!└%$)++)*"(@(╩╦$*$1,*2╨╙*:╚┬("└@
- ═("!!4╘,@(%-%42└@(┬└┌((\@*┬╚@1$5&055,5"!314╨╧5%(╧1┼0@*┬╚└,┬└.
- ═└4$─╠┬(┬(#╚@@4╞╥,*0╤,"└┌($$─╠─$─╩╠<╚╨┬┴$4*╔)*2─@.┬""└$╪@&└%!
- ═)++(*$$─+#@╔╩┬(@("*╩╥2┴!)"╨╙*0!;("(!╞2!$3#╠@020└;2└╠└40─╠─0─
- ═╩─$─╩┬(@("(└├┬└╓└4-,*$1,*;+"*$10╩├(╓*:╚╥-3:╠╨┬┴$4*╚╥-╥─└╬┬!└
- ═└5-:╠╠(╚1%"╩,├@╔╩├(╒-╩╙"*$10╩├(┘*:╚╓-34╙-╩╙"*$10╩├,╨*0#;($╚!
- ═1$──*$1,*;)$)*╦)*"(@("└@(╩╦$*%-:*2╨╓*0#╔(%0!4╒╚╚1$╨╔╠┼-:└/(@
- ═7@&"($10└/@@:└&.└/╪@<@$┌└",┴<╨&/("╚╩(%)%4$]25"!-4╥╒$3╒,@1$┼3
- ═2╥!%4┼)/4┬└╩*@!0(7╨!╞2#'*#$╪*3╠┬35,═1$]3($1)4╘╠@15)23╒(@(╥([
- ═╥┬├$*$4╔+#(╔.╨!](88!╞2└┬("@─(├╧**-(╚12─╠,╥─[(┬─╠(%!215-3($═%
- ═62╪┬.\<╚,30╓*0"+(9└!╚?─@020@.┬".└)$┴╞@$┌└*╨┴╞╨&/("╚╩(%-#4─5%
- ═3┬!(14%$24┘'("╚╩└.$┴╔└&9╤╥@╤-#<╔.╥)-4╥╒$158](├╧**,0╚1%8╔+#(╔
- ═.╥(@("└@35,═5%┼013╘┬.╘14)#╠└└┬*╬└9─┬("└@($-"32╒$158](├╧**,0╚
- ═0╘0╔+#(╔.╔─└""*╪└8╪└#┬+"└3╚└*2+#└8\@*┬╚@4╘-2145.($9/3╒1)3─<@
- ═*┬╚└72+,└9─@24╨─.╥)$/41)4─5#5$]262└@33╒-4╥╒$158@($8]0╘)-+41%
- ═5┬!1/5%5250┬└(╘┬╒@&9(┼0]5$]'1╘╤%+4-/3%5-3┬╨@0╙╒#3╒!9+49)3$53
- ═+"└╦+╥╘@4$%'12([└),┬╪└&.└)─┬┌@$┌└+(┬┌╨&/("╚╩($╒!24╪@4─]55$┼.
- ═12└╩*@#└(╧0!5+(╤(#╚@0[(╨└,@┬_@%2╠├└└╘┬((└╚╘@-#(╨└└(├$@*9(").
- ═54╘@(%,@(%123┬└@5%┼0("!&24╤%3─%-12└@15┴4("!,14┘'5$@┬└#(├'└*9
- ═("(═+2╘@("╘@("╘═+2└@+2╘═("└═+2╘═+2╘═+2└@+2╘═("└═+2╘═+2╘┬└#╨├
- ═)@*-(#0╓,└!7(╙└"0╦)4╩├$╫(#╚@┬╥!"╠41,(*<@0╦)$3└!╨(╙╚"╞2!&3"0[
- ═.┬"+(%2╤1$╨@╔╥└╒.3└└├2-$└╚$@2;)4(*0@0┬└┌()─@1$──*$─╔(#╚@@@"╓
- ═(╘╪"┬╥!$3+(╨(*<@╞2#'*#$╪*3╠┬/$┘/($9)3$53/┬([╤╥@╤-#8╔└,<├6└*+
- ═($1,╠├└@╔╥└╓-├└└╫╥-┬└╔─@╥"┴)3"0╠4╩╚╒*3╧'*#$╪*3╠└]╥-╠└╔$@0┌╚╤
- ═((─@-├,╨+#8╘,"╨╓-3└└&21╓└╔─@╔├0╔.\╚╚1$──*%2╩4┬─╠-2╨╙*2└┌((─@
- ═-├8╨└#╠─@└*9(*8╫*3╧**$1))"┴4╩┼(╔+#@╠-2─@.┬")(#8╓,└!?)(╚"╞2"╞
- ═,3(╔.\╚╚1$──*%2╩4┬─╠,3,╠-2─@.┬")(#8╓,└!╔))0"╚?─@020└─"2>└─╞╥
- ═╒"@┬1$╒&5$,╦+5$@(╩╦'*#$╙*:╚┬─1&='1.3(┬╤!)"─└╩┬2╚└╔─@╥"┴)3"0╠
- ═4╩╚╒*3═$220╚5*╔2*0"┌)+("┬╥!)╠├└@╔╥└╓,#└└!┬6\└╔%)┬3<╓,"╨╤,#4╨
- ═+#$╤,3└╠.34╨+#$╤-3└╠,3└╨,"╨╤,#(╨+#<╙,"╨╪-├└╠.#8╨+#<╫,"╨╫.3└╠
- ═.#$╨+#@╙,"╨╪-3└╠-3└╨└└╨┼╤@*0└!(┼╘└(┌└#,┼╘0*/("╚╩(%9!4─┼/55,@
- ═345.52!/4%1)3╘┘3("╚╩└%<┼╓@*9(,<╚,30╫*3╠┬2$%612!!3┬!!5╘533╘╒%
- ═($1!62╪┬└%╘┼┘└*└└'<┼^└*-(#0╥,"└┌((╘@,30╨(#╚@┬2└╒,#└└─24"└╒*╥
- ═4╩╠╤(#╚@┬╥!2╠╙└@╔╥!2╠─*╦5└";)0╨#┬2└╓,#└└═246└╒*╥4╩╚╤(#╚@┬╥!4
- ═╩┼*╤0┬"╟(%*╥,└"_)2└#┬2└╓,#└└╒╥4╩└╘.╥0┌╠╤(#╚@┬╥!#╠╙└@╔╥!#╠├(└
- ═╪24╘└╪─@-├└╨└/─┼/@-#╠─.╩,2└┌((╠@0[$╥(*<@0[(╨└└,╞2└.)(#8╨,└└9
- ═)┼(#4╦(╨(#╚@0[(╨(#╚@┬2└╓,#└└*┬9<└╪╠@1$╥╥,""╟(#8╨,└!*)╞8#6+)4
- ═╩┼(@.┬"1($.╩,2"-(#@┘,"╨┘,3└╠.3,╨└&╚╞<└.9(,@╚24╨─+%*╩-2─[1$──
- ═*%@╔(#╚@┬2└╓,#└└┼29┌└╪╠@╥┬┴$220╚6"─╠-┬╨╤*;(┬("(@╔╥!8)+(┬*┬(@
- ═.═4@6"2╥(┬└┬└*╪╞┴└/**$1))"┴8*2╨╓+#$╔╠┼@─(#╚@├@#=)╚╪#┬╥#**$1)
- ═)"┴8*2╨┘+#$╔╠┬)!(┬"╟(%@─╠┬)"24╪┬(#╦5(%@─╠┬)!4╘,┬└/8╞╞└/**$1)
- ═)"┴8*2╨┘+#,╔╠┼@─(#╚@├@└╞)┌(#┬╥#**$1))"┴8*2╨╤-"╨╤*;(┬4╥(@╔╥!8
- ═)+(┬4%)'(┬└┌╒2!8)+(┬4╘51(@!└)┌╨#╥┬┴$220╚6"─╠,30╠,╥╞╥6"0@.┬".
- ═└%$╟═@.+($1,╠├└@╔╥└╓,#└└8"?└└╪$@6+(╤(*0@1$╨└>"?*└┘$@0┌╚╤((╘@
- ═.#─╨+#─╤,"╨┘,╙└└@"?4└╪(@6└"*)]╪#┬2└╒,├└└╚╥?╚└╪╠@0╦)$3""╟(%2╥
- ═,2└┌((─@-3$╨└+8╟\@-4╠┼2╩,3@@.┬")(#4╤,└#┬)_╨#┬╥!4╠├$@╔╥!4╠─1,
- ═╩╥┴$3*╬╒*$1,╦3$╪*:╨╤."╞╩,2└┌((─@-3$╨└/╠╟!@14╠┼2╦,3@@.┬"+(%2╙
- ═,2"╟(%2╥,0└%*!└$┬2└╒,3└└&┬@:!)─@24╨─.\<╚,├<╔.╥)└(├╠└0"@─!(4┬
- ═35,═1$]3($1%5─┼#12!.54╒"15(@*#@═,╙└╔(├═$5@"%*"4$┬╥!#1+)$5┬"╟
- ═()─┬35,═1$]3($%.1"!#0─╘═1$]3($1%5─┼#15,@35535"!"12!$249&15)%
- ═3┼0┴(├╩),3└╓,└"╩*"╪$┴2)-4╥╒$3╒,@1$5624-%(%194$4@("@╫,2\╪,2─┬
- ═.╒@└┌╥@╪!(╠@6+(╪(+└@6+(╪,2"╨(%┬╥,34╪,2"╟($14╠├(╒-3╔$5"2╥(├$╒
- ═.#$┬(#╦5($14╠├└┌1%0─╠┬(╤-3<╤(@└.*4($┼╥!02┌╚╤-┬╤$5┬└┌()<@4$╬╩
- ═,3<╠1%0@.┬">(%!+└!@╔3└2)(#4╥,└└═*58$╞2!)3"0[╤╥@╥-╥─[(─└┬.╨!5
- ═*6└$┴2└┬0╘)-+41/4╥!$159)0╘4@3┼5-0─52("@╨+3,╨*2([0╘0└╞┬┼╩!(╠@
- ═0╘2╥1%8@╔╥"9(─╒3+41/4╥!!3─0@0╘)-+41/4╥!$159)0╘53($╒54╒0@0─4@
- ═1$┼&1─5214┘4(2(┌┬3$╤,├└└╔"┼╘!(─@-3(╨└*╚╔=00┌└,$╔=@2/("╚╩($-/
- ═4%─@1─┼,15,@*┬╚└╫╥┼^!)─@╤╥@╤-#<╔.╥)#3╒!9($9)3$53(├╩9.╔─└^┬╞(
- ═!(╠@1$╥╥,""╟($9#╠├└@.┬")(#$╤.3└└+╥╩2!$9#╠├└@.┬"!($:╥,2"─($1,
- ═(#╚@┬╥#**$1))"┴&*2╨╓+#$╔╠┬(╩(┬"╟((╘@,3(╨,└└╫*╔╨$@┬!&└&,╩╔@29
- ═(#╚@╞2)&24╤%4╥!#3╒!)140@/2([1─,[(┬└═(%!215-3($═%62(└=2╩╟!*'┘
- ═($$─(#╚@┬2└╒,├└└@2╩╨!$9#╠─9#╩├$└╩┬╩┌!%@─╠╠╚╚1$──*$8╔+#$┘+#@╔
- ═╩┬(╬(╩╦**$1))"┴&*2╨╥.2╨╙*0#┼*╠0$0╘8─╠┬(┬.╚%)╠├&─╨╥┴8)"─┌┬╥#*
- ═*%@─+$─╠,2╞╙╠2(@(┬"╟($-&)+)#1┬2╩╥┬┴8)"╤)+#$╔└.╠╩╙@2"└!0╦╙╨2+
- ═(,─╚0╘8─+#$╔╠┬(╬(┬"╟($-&)++(*$-&)"╙#*$-&)"╞╦,2─└,╥╧0!$-&)+)#
- ═1┬2╩(┬╨┬╩╠╚╚1$──*$8╔+#$╘+#$╔└&<╦╓└29(,0╚1─,╔.╥(╬("([╤╥@╙-"─[
- ═0╘8─.\<╚,╙0╔.┌,╥,"─[4╒╚╚1┬─┬0┼┼415,┬.╨"└*]╘$╞2"├,╙4╔.\╚╚1$──
- ═*$8╔+#─╠,╥─└╦╥╧┬!$-,╠─-,*$8╔(#╚@3$*╥4╒╚╚1┬─@╩╥"╒*%-:*$8╔╦38╒
- ═-3,╓*:╨╓-34╙-@#╔*^╨$┬╥!#1+&╥.""╟(/╪-(╙$╠*$-&)*╚┬+%<┬*2╤5*$-$
- ═*2└┌╒2"+($-$╠[$╨(*<@╟╥└╤+$-$+#<└^╥╧╤!(╠@0╘2╙.""╟(#$╥.#@└#╥╙╓
- ═!(╠@1%.╙╠38╙(*<@,3(╪.└└^+/╠$6"2╥(┼─┬(#╚@╞2└┬1─┼,12!%6$┼35%,[
- ═($]615)74─┼412└╚62].*2([└&8╠└└6@(#$@.┬"%(%@─(#╚@┬╥!8)+(┬3┬(@
- ═╔╥!&0[)&0┌╠╤(#╚@├@!╫+└4%\┬┴#1┬0╔+%4╚0╘0╔└)$╠!@7^#2,╤+"┴#1┬2╩
- ═(┬╤7(┬─╠52┴#1"─└╚╥╨(!8╠@0╘2╙.""╟(#$╙,├└└═┬╨4!8╠@1%.╙,├└@╔╥└╤
- ═,╙(╨└.╨╠'@69(,<╚,3@╔╩┬)#0─╘@1$┼32╥!%4┼)/4├╚@(╩╔$4╥0@.┬!&0[)&
- ═0┌╠╤(#╚@╚#$@.┬".└!─═*└67(%!+╩├$┘+$-,╦3(╒-┬└┌()<@4$╬╩,3@╠0╘╥╦
- ═╨┬┴02┌╚╤.2╞╠,├4╓└$8═,@67(%!+╩├(╤+$╤"╦3(╒-┬└┌()<@4$╬╩,├└╠3$*╦
- ═╨┬┴02┌╚╥,2╞╠,├4╓└&╪═/└544╦(╨(#╚@┬╥#**$1))"┴&*2╨┘+#$╔╠┬)!(┬"╟
- ═(%12╠├(╒-0"%+4(%6+(╤(#╚@┬╥!#1+(╨(*<@6+(╨└)4═1@6>(%!+╩├8╠5%(╠
- ═6└"╤+4╠%_@─@6"╤8+%@╠4╥└┌($6╥╨┬┴02┌╚╤-2─└╘2╒,!8╠@*%,@╦╥└╤*2"╟
- ═((╘@,╙@╨(#╚@1─.╥1─.╦,0#╔+5└%┬╥!#1+.╤,""╧($-$╠╙@@╔╥"@,0└.+┼╚%
- ╔┬╥!#1+&╥.""╟(/╪/(╙$@.┬"+($13╠;(╥,""╟(#$╙,3└└%"┘─!8╪└└└└└
- └
- END
-
- BEGIN 640 LRR.BIN
- ═└(!,68%,3╚),#╚3+@╨└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└2*─└
- ═┴="═$(└@╠?^╔;╥"3_┌┼5(*├_)-└╨#┌─╨(*├_:""╚_╥30,└(88*─%├0^└.&"═
- ═└-╒)$(╘└╫6"╔""╨-╫/#[8"!@@*╪,╫"!7@(╔@╩1╚@*("0└6└@╦╧\─╘##.&"!'
- ═_╥╨-╫"!7@"!╚@(╘/@"─/╥0*╨):└└(&┬└╞2*└╥,└&─/48╩0@@*("0└6"╔└2╨1
- ═@#└"╩00@╩/\@╦╧]@2(╚╔└0╚*"@╚╠$8└0└──0("┬└─└%@:""╚_┌─!(*├_╩0─@
- ═╩/\@╦╧]╪&"!'_╥╨-╫"!7@*─╪╚(6%└╚0#╩0"%!"╨1@#└#(!.!("╬!╠└╟╞!*4$
- ═╥0╞0┌╤┴88*─╪┴0*╞!!┬╔┴7╘┬@84#8└└($└8.!└╨""┬!╚@(╘/@"─/╥0*0└6"┬
- ═└╩└└╩0@╠#=╙╨^┌╘└╫4─0├0#=╦0╙<─0+(╘.╟╞└\╦0┘&"╔#╚╘└_┌╟_├2"└├2&└
- ═&-((#0$.╨┴@-└+┬)@*&&╞%╩*─╪&&"-((".(8"$!2"^@)└9╦0^└*0_)"_└"
- ═.&└@<╪"═(("╬(8"─!9#;8*╘@@*╪┴@*0%3&┬!╚╧_╚..─2╠/╩($/<8:1+(╩(╔@
- ═(*┌!╚@#└"9└(2)├╔":┴╚╚@'(8(8+(,"!┴0┬&"80*╔0┬╞":0*(&┬!─└%@┴0╥$
- ═#:("╚└"╤#)$&╥+$,─0;(╘/3╞#>8'╥═#═┘@╩┼"╠─*─!*╔└84*┘@╞┼"<─"─└:╔
- ═└(4)┘@├&"]"[&&└╪┌0*╨└8┬╬%╚#@└?└'"╚0')@>─!╤┴═'("0└<┬┬.(8&╚╔>&
- ═!┌╪6@$╙3@:─.├0#_╩0"@└"#└@2!╚@9└!8(4"┴└.@#;$"├1:└╥0.0!┌─\├0^└
- ═.&"@$+$"╥0+0\:└6╠0*-%╪#)!+#╞╚!&╤└╚╘9@,╞!╠-═*2─╔*├1┬└╚!.╤└╚╘:
- ═@,┬╤└╚╘;@*└8╠0+)"="_╚!╩╤└╠─"╘+>@#╦$"╥0'0╦┌╘7@└╚8:0&-'8└8;1┬└
- ═├1╥└╦1╩└╦!╬└..╘<@+└!┬(╘>@(╨?@*╘6@,─"╘└9.'╪!╬'╚"╔.*";┴0:$!┌─!
- ═╚└"╬%╪└@╘╪&0└6"╔.*"┴┴0:$!┌╘=@*└└╦┴┬└(-.!─└%@╩3┬@╚:╪9@!┴@┴06$
- ═└╘8#:╚4$╔@,*)@,8902%└╚╔┼└╪4#&*4":3┬%└╩4#:9╬%└┌└"╠0*9!@"($/┬┼
- ═!2─!╘└┬┼!╥─/╩*4&8*4'╚@1&"&╦*╘/╩─"&"┼9*1┼("6"─└%@╩3┬@┼╪5@┴&&╔
- ═└(5┬╦1:└"╚5├╔62─92└┼@╪5─┴&7)_]└@╨└_0'*╘4@(5┬╩0&╬%╚#@└?└"╩0,═
- ═%8#0!:╪4@/└"┴6,@╧╚-@╔@_0└┴┴@(,╟_─└2-#╪!@╩?^╞8]└"╔6*%9╩└└╠6└─
- ═#┴└&╩╦╘╪┴/└#(-+_╥,1╞╘.╨8╔6!┼9╚5@─└+╞83┬┼8╬5╞┴6*╨└╠9├╔6(%8]#$
- ═(,╙_&&"@#╚╨└_╪4.┴@^═$╚"╠$╪"%9(1┼3"╩$(&^#─└%@╔63)_]#╘╔67)#]#╬
- ═&&└└└└└└└└└└└!0)#0"3└└└└└└└└└└└└└└└└└└└└└└└└└"└┴(┬,─)28╟*"─╩
- ═*╥╨═+┬\╨,3(╙-#4╓-╙@┘.├╠\/3╪_0,'"╨\3%╤╠?(╥<╦+╙,╫.╙]#1╘═/4╒=;7
- ═╓-╟:6╒╤=7┼_└04)#1$5&1╘┴)2─═,34┘/4%%24╒155┼=865╦;╫-╫>╫╨└└└└└└
- ═└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└
- ═└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└
- ┴└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└
- └
- END
-
- 7. ┬╔┬╠╔╧╟╥┴╨╚┘
-
- ╘HE FOLLOWING WORKS WERE CONSULTED IN CREATING THIS ARTICLE:
-
- [1] ╩IM ┬UTTERFIELD, "╩IM ┬UTTERFIELD'S ├OMPLETE ├128 ═EMORY ═AP",
- _╘HE_╘RANSACTOR_, ╓OLUME 7, ╔SSUE 01, ╩ULY 1986 (┴ ═UST!).
-
- [2] ├OMMODORE ┬USINESS ═ACHINES, _├OMMODORE_1571_─ISK_─RIVE_╒SER'S_╟UIDE_,
- ├┬═, 1985.
-
- [3] ╙OME PROGRAM CALLED "MSDOS-TO-128" INCLUDED WITH "CS-DOS" BY
- ═. ╟-SOMETHING. ╧RIGINALLY PUBLISHED IN ├╧═╨╒╘┼!'S ╟AZZETTE, ╔ THINK.
-
- [4] ├OMMODORE ┬USINESS ═ACHINES, _├OMMODORE_128_╨ROGRAMMER'S_╥EFERENCE_╟UIDE_,
- ┬ANTAM ┬OOKS, 1986.
-
- [5] _╘HE_╘RANSACTOR_, ╓OLUME 4, ╔SSUE 05 ("╘HE ╥EFERENCE ╔SSUE"), ═AY 1983.
-
- =============================================================================
- ╬EXT ╔SSUE:
-
- ╠EARNING ═ACHINE ╠ANGUAGE - ╨ART 5
-
- ╘HE ╙╨┴├┼ ╔╬╓┴╙╔╧╬ IS CONTINUED WITH THE DESIGN AND IMPLEMENTATION OF THE
- PLAYER AND ALIEN ANIMATION ALONG WITH A LOOK AT DEVICE SCANNING FOR THE
- 1351 MOUSE, JOYSTICK AND KEYBOARD.
-
- ╘HE 1351 ═OUSE ─EMYSTIFIED
-
- ╞INALLY! - ┴FTER 2 DELAYS, THIS ARTICLE WILL EXPLAIN HOW THE 1351 MOUSE
- WORKS AS WELL AS PROVIDE A EASY TO USE INTERFACE IN MACHINE LANGUAGE FOR
- BOTH BASIC AND MACHINE LANGUAGE PROGRAMMERS. ┴N EXAMPLE PROGRAM WILL BE
- GIVEN TO ILLUSTRATE BOTH THE 1351 MOUSE AND THE MULTI-TASKING SYSTEM.
-
- ═ULTI-TASKING ON THE ├=128
-
- ┴ RUDIMENTARY MULTI-TASKING SYSTEM WILL BE IMPLEMENTED FOR TASKS TO RUN
- CON-CURRENTLY WITH EACH OTHER. ╫HILE INTENDED FOR MACHINE LANGUAGE PROGRAMMERS
- SOME DISCUSSION OF HOW TO USE THIS WITHIN BASIC WILL BE GIVEN SO THAT MORE THAN
- ONE BASIC / ML PROGRAM CAN BE RUN AT A TIME. ┴N EXAMPLE PROGRAM WILL BE GIVEN TO
- ILLUSTRATE BOTH THE 1351 MOUSE AND THE MULTI-TASKING SYSTEM.
-
- ╙TRETCHING SPRITES
-
- ┘OU MIGHT HAVE HEARD THAT IT IS POSSIBLE TO EXPAND SPRITES TO MORE THAN TWICE
- THEIR ORIGINAL SIZE. ┬UT THERE IS NO NEED TO EXPAND ALL OF THEM EQUALLY. ╘HIS
- ARTICLE WILL EXAMINE ON HOW TO EXPAND THEM 2,3 OR MORE MULTIPLES OF THEIR
- ORIGINAL SIZE.
-
- ╠╔╘╘╠┼ ╥┼─ ╫╥╔╘┼╥: ═╙-─╧╙ FILE WRITER FOR THE 128 AND 1571/81 DRIVES.
-
- ╘HIS ARTICLE WILL EXTEND THE ╠ITTLE ╥ED ╥EADER PROGRAM TO BE ABLE TO WRITE
- ├OMMODORE-─╧╙ FILES TO AN ═╙-─╧╙ DISK.
- =============================================================================
-