%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%H(HbQS TAKE TIME OUT FROM THE
SERIES ON THE BASICS OF KRACKING TO
DISCUSS A PROBLEM COMMON TO MANY
SOPHISTICATED GAMES AND PROGRAMS - WHAT
TO DO WITH DISK ACCESS?  IN THE CASE
OF CYCLOD, WE FOUND THAT THE AMOUNT OF
REAL DATA READ IN FROM THE TRACK WAS
ONLY 18 BYTES PER LEVEL, AND IT WAS
EASY TO INCLUDE ALL LEVELS IN MEMORY AT
ALL TIMES.  IN WAY OUT, WE COPPED OUT
AND MADE THE GAME COPYA, SINCE THERE
WAS NO ROOM IN MEMORY AND MANY
FULL-TRACK DISK ACCESSES. THAT WAS FINE
FOR A FULL DISK, SINCE MAIL IS USUALLY
PREFERRED OVER TRANSMITTING 400-500
SECTORS AT 300 BAUD (SNORE!!!!!).  A
GAME LIKE TYPE ATTACK, HOWEVER, IS
NEITHER A FULL DISK NOR FULL MEMORY,
AND OTHER OPTIONS PRESENT THEMSELVES
FOR CONVENIENCE IN STORING AND SHARING
THE PROGRAM.

     TYPE ATTACK IS A NEW TYPING TUTOR
FROM OUR OLD FRIEND SIRIUS. THE "GAME"
IS VERY EFFECTIVE IN TEACHING YOU TO
TOUCH-TYPE, SINCE YOU ARE FORCED BY THE
ARCADE-STYLE GRAPHICS TO KEEP YOUR EYES
ON THE SCREEN WHILE INCREASING YOUR
TYPING SKILLS.  THE PROGRAM INCLUDES 40
PREDEFINED LESSONS, AND ALLOWS YOU TO
DEFINE THE LETTERS AND WORDS FOR AN
ADDITIONAL 60 LESSONS.  EACH OF THE
"LESSONS" IS 256 BYTES LONG AND
CONSISTS EXCLUSIVELY OF ASCII
CHARACTERS.  THIS GAME COULD BE EASILY
MADE INTO A COPYA VERSION, EFFECTIVELY
USING UP A WHOLE DISK SIDE, OR WE CAN
GET A LITTLE DARING AND TRY SOMETHING
COMPLETELY NEW.  IF IT WORKS, WE CAN
COMPRESS THE ENTIRE PROGRAM INTO TWO
FILES TOTALLING LESS THAN 200 SECTORS,
AND (MORE OR LESS IMPORTANT DEPENDING
ON YOUR POINT OF VIEW), WE GET TO LEARN
HOW TO CREATE A TEXT FILE FROM SCRATCH
AND CALL IT FROM WITHIN A STRICTLY
BINARY PROGRAM WITHOUT RESORTING TO THE
"CHR$(4)" EMBEDDED BASIC DOS COMMANDS.

     THE PRIMARY DISK PROTECTION IS
ALMOST EXACTLY THE SAME AS WAY OUT:
NORMAL SIRIUS "ONE-SECTOR TRACKS"
ENCODED IN A 4+4 NIBBLIZING SCHEME, AND
PREFACED WITH AD DA DD.  THE SAME
NIBBLE COUNT ROUTINES FOR TRACKS 21 AND
22 ARE USED, AND ZERO PAGE WAS ABLE TO
REMOVE THEM EASILY BY FOLLOWING THE
INSTRUCTIONS IN THE WAY OUT FILE.

     LOCATIONS OF PROGRAM MODULES IN
MEMORY IS QUITE DIFFERENT, SO LET'S MAP
THE DISK AND NORMAL RUNNING MEMORY:

  T/S#   CONTENTS         DESTINATION
  ----   --------         -----------

  0/0    PRELOADER         0800-0895
  0/REST LOADER            0800-0DFF
  1/ALL  MAIN PROGRAM      4000-4BFF
  2       "     "          4C00-57FF
  3       "     "          5800-63FF
  4       "     "          6400-6FFF
  5      LESSON FILES      1000-1BFF
  6       "     "            "   "
  7       "     "            "   "
  8       "     "            "   "
  9       "     "            "   "
  A       "     "            "   "
  B       "     "            "   "
  C       "     "            "   "
  D       "     "            "   "


     AFTER THE PROGRAM HAS LOADED,
MEMORY IS ALLOCATED AS FOLLOWS:

  LOCATION     CONTENTS
  --------     --------

 0800-0DFF  READ,WRITE, & NIBBLE CNTS
 1000-1BFF  CURRENT LESSON TRACK
 2000-3FFF  HI-RES DISPLAY (SEE BELOW)
 4000-6FFF  MAIN PROGRAM
 7100-71FF  CURRENT LESSON
 7400-7FFF  TEMP BUFFER FOR TRACK WRITE

     WHEN YOU BOOT, THE PRELOADER IS
READ INTO 800-895, THEN MOVED TO
2000-2095 TO ALLOW OVERLAYING THE MAIN
LOADER IN PAGE 8.  THE REST OF TRACK
ZERO IS READ INTO 0800-0DFF, AND
PROGRAM EXECUTION BEGINS AT 9CD.  AS
USUAL, ALL ACTIVE TRACKS ARE READ INTO
THEIR RESPECTIVE LOCATIONS ("CHECKING
YOUR APPLE"), THE NIBBLE COUNTS ARE
PERFORMED ON TRACKS 21 AND 22, AND THE
ACTUAL PROGRAM IS STARTED AT LOCATION
4000.

     THE 101 LESSONS ARE STORED 12 TO A
TRACK ON TRACKS 5-D (LESSON 0 IS THE
DEMO).  WHEN A LESSON IS REQUESTED, ITS
TRACK NUMBER IS COMPUTED AND THE ENTIRE
TRACK IS READ INTO 1000-1BFF. THE RIGHT
256-BYTE PAGE IS CALCULATED, RELOCATED
TO 7100-71FF, AND THEN TO 6AA3-6BA2 FOR
THE ACTUAL TYPING.  LESSONS CAN ALSO BE
USER-DEFINED, IN WHICH CASE THE TRACK
IS READ IN, THE PAGE CORRESPONDING TO
THE LESSON IS LOADED WITH YOUR KEYBOARD
INPUT, THE LAST BYTE CHANGED FROM 0 TO
FF TO INDICATE A DEFINED LESSON, AND
THE ENTIRE TRACK IS WRITTEN BACK TO THE
DISK.

     (AS AN INTERESTING ASIDE, IF YOU
EVER WANTED TO PLAY WITH A FAST DISK
READ/WRITE SYSTEM, OR WANT TO AVOID THE
AGONY OF THE NIBBLE ALTERATION SCHEME
DESCRIBED IN THE WAY OUT FILE, YOU NOW
CAN.  IF YOU RESET AN ORIGINAL OR
DENIBBLIZED VERSION, ALL THE READ AND
WRITE ROUTINES ARE CONTAINED IN
800-DFF:

   ST. LOC'N     ROUTINE
   ---------     -------

      9A8        START THE DRIVE
      A51        READ A TRACK
      B01        WRITE A TRACK
      BD8        SEEK TRACK # IN ACC/2
      D7F        WIPE, BEEP AND REBOOT)

     AS MENTIONED, THERE ARE SEVERAL
WAYS TO ATTACK A PROGRAM LIKE THIS.  IN
ADDITION TO THE "STANDARD" CONVERSION
TO COPYA, WE COULD BREAK OUT THE MAIN
PROGRAM INTO A BINARY FILE, THEN CREATE
NINE ADDITIONAL LESSON FILES
CORRESPONDING TO THE LESSON TRACKS AND
CALL EACH ONE AS THE PRESENT PROGRAM
DOES.  THIS IS INELEGANT, THOUGH, AND
DOESN'T REALLY STRETCH THE IMAGINATION.
SINCE THE PROGRAM IS SHORT ENOUGH TO
ALLOW DOS TO BE RESIDENT, MY PREFERENCE
WAS TO CREATE A RANDOM-ACCESS TEXT FILE
CONSISTING OF 101 RECORDS, EACH WITH A
LENGTH OF 256 BYTES. THAT WAY, ONLY ONE
SECTOR NEEDS TO BE READ OR WRITTEN FOR
EACH LESSON, AND WE GET TO PLAY WITH
THE DOS FILE MANAGER CALLS FROM A
BINARY PROGRAM. THIS IS NOT FOR THE
FAINT OF HEART OR SHORT OF ATTENTION
SPAN, SINCE THERE ARE A MYRIAD DETAILS
TO GET EXACTLY RIGHT, BUT YOU'LL LEARN
ENOUGH IF YOU CAN STICK WITH IT TO MAKE
IT WORTH THE EFFORT.

     THE ACTUAL KRACKING PROCESS
FOLLOWS:  BOOT THE DISK AND RESET WHEN
THE FIRST HI-RES SCREEN APPEARS (NOTE
THAT THIS SCREEN, AS ALL OTHERS IN
THIS GAME, IS CONSTRUCTED THROUGH A
TEXT GENERATOR AND NOT READ IN. THIS IS
IMPORTANT, SINCE IT MEANS THAT 1.) WE
CAN PACK THE PROGRAM MORE COMPACTLY,
AND 2.) WE CAN PLASTER OUR TRADEMARK,
LOGO, AND/OR "NOM DE KRACK" ALL OVER
THE SCREEN, THUS SATISFYING THE INNER
URGE WE ALL HAVE TO CARVE OUR INITIALS
IN TODAY'S HIGH-TECHNOLOGY APPLE TREE).
THE LOADER IS NOW RESIDENT AT 800-DFF,
AND CAN BE EASILY ACCESSED FOR THE REST
OF OUR SKULLDUGGERY. THE USUAL SIRIUS
TRACK DESTINATION LIST IS AT LOCATIONS
AC4-AD1, AND CONTAINS THE STARTING PAGE
AT WHICH EACH TRACK ALWAYS LOADS. LOAD
ALL THE LESSONS INTO A CONVENIENT AREA
OF MEMORY BY MAKING THE FOLLOWING
CHANGES IN MEMORY:

            AC9:20
            ACA:30
            ACB:40
            ACC:50
            AD1:60
            A4E:60

RESET THE DISK READ HEAD TO TRACK 0 BY
BOOTING ANY OLD DISKETTE AND RESETTING
-->DURING<-- THE CLACKETY-CLACK. START
THE DISK SPINNING BY TYPING C0E9, THEN
TYPE 9CDG. THIS WILL READ IN ALL THE
TRACKS INCLUDING THE LESSON TRACKS INTO
THE MODIFIED LOCATIONS.  THE PREDEFINED
LESSONS ARE NOW LOCATED FROM 2000 TO
53FF, AND LESSON 100 (THE HIGH SCORES)
IS AT 6400-64FF.  BOOT AN EMPTY 48K
DOS SLAVE DISKETTE, AND SAVE THE
LESSONS FOR SAFETY WITH "BSAVE
BLESSONS, A$2000,L$4500". CREATE THIS
SHORT (BUT SLOW) BASIC PROGRAM:

   10 D$ = CHR$(4):GOTO 25
   15 A$="":FOR X=1 TO 255:A$=A$ +
      CHR$(PEEK(P*256+X)):NEXT X:RETURN
   25 Z=1:FOR N=0 TO 39
   30 I=INT(N/12):L=N-I*12:P=L+16+16*I
      REM CALCULATE MEMORY PAGE FOR THE
      LESSON
   40 GOSUB 15:GOSUB 100: NEXT N:REM DO
      DEFINED LESSONS
   45 A$="": FOR A=1 TO 255:A$=A$+"?":
      NEXT A: REM THESE ARE THE
      UNDEFINED LESSONS
   50 Z=0:FOR N=40 TO 99:GOSUB 100:
      NEXT N:REM A BLANK LESSON ENDS
      WITH ZERO
   65 P=100:N=100:GOSUB 15:GOSUB 100:
      REM DO LESSON 100 (HISCORES)
   70 END
   99 REM WRITE A SINGLE LESSON RECORD
  100 PRINT D$;"OPEN LESSONS,L256":
  110 PRINT D$;"WRITE LESSONS, R";N:
  120 PRINT A$;:PRINT Z: PRINT D$;
      "CLOSE LESSONS": Q=FRE(0): RETURN

AND RUN IT WHILE YOU GO HAVE A
SANDWICH. (THE EXPERIENCED BASIC
PROGRAMMERS OUT THERE WILL BE TEMPTED
TO CREATE A STRING ARRAY, BUT DON'T DO
IT! THERE'S NOT ENOUGH ROOM IN MEMORY
FOR THE LESSONS AND THAT MANY STRINGS
AT ONCE). THE PURPOSE OF THE PROGRAM IS
TO CREATE A RANDOM-ACCESS TEXT FILE
NAMED "LESSONS", AND TO RETRIEVE FROM
MEMORY AND STUFF INTO RECORDS OF THE
FILE THE ORIGINAL CONTENTS OF THE
LESSON TRACKS ON THE DISK. NOTE THAT
THE LAST CHARACTER HAS TO BE ENTERED
SEPARATELY TO KEEP THE LENGTH OF THE
STRING WITHIN THE LEGAL LIMIT OF 255
CHARACTERS.

     IF YOU HATE BASIC, THERE'S ANOTHER
WAY (REMEMBER KRAKOWICZ'S SECOND LAW OF
KRACKING: THERE'S ALWAYS ANOTHER WAY!).
DEFINE A RANDOM-ACCESS FILE EITHER BY A
SINGLE LINE BASIC PROGRAM OR BY
INSERTING THE NAME AND FILE TYPE IN THE
CATALOG WITH THE INSPECTOR. MANUALLY
CREATE A TRACK AND SECTOR LIST AT THE
SECTOR YOU SELECTED IN THE CATALOG
ENTRY, CONSISTING OF 101 ADJACENT
ASCENDING SECTORS. STUFF THIS ONTO THE
DISK WITH THE INSPECTOR, AND THEN
MODIFY THE VTOC MAP IN T11, SECTOR 0 TO
REFLECT THE FILE DISK USAGE. STUFF THE
LESSON PAGES FOR LESSONS 0-39 AND 100
INTO THE CORRESPONDING SECTORS, AND
CREATE A SINGLE PAGE CONSISTING OF 255
FF'S WITH A SINGLE ZERO AT THE END TO
INDICATE AN UNDEFINED LESSON.  STORE
THIS PAGE IN ALL THE SECTORS FROM
40-99.  THIS PROCEDURE IS EQUALLY AS
EFFECTIVE AS THE BASIC PROGRAM ABOVE IN
CREATING THE 101-SECTOR RANDOM-ACCESS
TEXT FILE, AND GIVES YOU THAT INNER
GLOW WHICH ALWAYS FOLLOWS SUCCESSFUL
MANUAL LABOR.

     THE STARTING LOCATION IS CLEARLY
DEFINED AS 4000 BY THE JMP 4000
INSTRUCTION AT A4E, AND TO BREAK OUT
THE MAIN PROGRAM IN PRISTINE FORM, YOU
SHOULD CHANGE THAT TO 4C 59 FF TO HALT
BEFORE THE SCORES AND THE DEMO LESSON
ARE READ IN.  SAVE ZERO PAGE (I'LL
IGNORE WHAT YOU'RE THINKING) WITH YOUR
TRUSTY MODIFIED F8 ROM, BUT YOU WON'T
NEED ANYTHING ELSE THAT WAS IN 100 TO
7FF. MOVE THE ZERO PAGE UP TO 3F00
(REMEMBER, THE HI-RES PAGE DOESN'T NEED
TO BE SAVED), AND SAVE THE BODY OF THE
PROGRAM AS A BINARY FILE FROM 3F00 TO
71FF. DON'T WORRY ABOUT THE READ AND
WRITE ROUTINES BETWEEN 800 AND DFF,
WE'RE GOING TO DO IT ALL WITH DOS FILE
MANAGER CALLS (WE HOPE!).

     THE MISSING LINK HERE IS A SET OF
PROCEDURES FOR READING AND WRITING TO
THE DOS TEXT FILE RECORDS DIRECTLY FROM
A BINARY PROGRAM. A GOOD DEAL OF THE
NECESSARY INFORMATION IS AVAILABLE IN
"BENEATH APPLE DOS", PP. 6-7 THRU 6-15,
AND IN AN ARTICLE IN THE NOVEMBER, 1982
ISSUE OF WAYNE (MY FAVORITE ASSHOLE)
GREEN'S MICROCOMPUTING (PP. 102-112)
WHICH PLAGIARIZES THE MATERIAL IN
B.A.D. VERY NICELY (AS DOES MUCH OF
WHAT FOLLOWS).  WHAT NEITHER SOURCE
TELLS YOU, IS EXACTLY WHERE THE VARIOUS
BUFFERS AND WORKAREAS ARE AND IN
EXACTLY WHAT ORDER THE VARIOUS ROUTINES
SHOULD BE CALLED TO MAKE THEM WORK.

     TIME OUT FOR A NOTE OF
UNCHARACTERISTIC HONESTY - WHEN BASIC
IS NOT INVOKED (SOUNDS A LITTLE LIKE
CONJURING UP DEMONS, DOESN'T IT?), IT'S
STILL POSSIBLE TO DUMP A NORMAL
CONTROL-D TYPE DOS COMMAND INTO THE
KEYBOARD BUFFER AND TRICK DOS INTO
EXECUTING IT, BUT THERE ARE SOME
OBSCURE PREREQUISITES FOR THAT
PROCEDURE TO WORK (A FUTURE GAME WILL
PERHAPS CRY OUT FOR THIS TREATMENT AND
WE'LL DEAL WITH IT THEN). BESIDES,
LEARNING A LITTLE ABOUT THE DOS FILE
MANAGER IS GOOD FOR ALL OF US.

     THE NERVE CENTER FOR ALL THE DISK
FILE OPERATIONS IS CALLED THE FILE
MANAGER PARAMETER LIST, AND IS LOCATED
IN EVERYBODY'S 48K MACHINE AT B5BB TO
B5CC.  BY CONFIGURING A FEW BYTES IN
THIS AREA CORRECTLY AND MAKING A SINGLE
SUBROUTINE CALL, WE CAN PERFORM ALL THE
OPERATIONS LISTED BELOW JUST AS WE DO
ROUTINELY THROUGH BASIC COMMANDS. WE'LL
ONLY LIST THE CODES WHICH RELATE TO
OPEN, CLOSE, READ, AND WRITE, BUT MOST
OF THE OTHERS ARE EVEN SIMPLER AND CAN
BE EASILY DONE BY ANALOGY. EACH OF THE
PARAMETERS LISTED HAS ITS OWN RULES,
AND YOU'LL PROBABLY WANT TO MAKE YOUR
OWN LIST THAT'S ORGANIZED THE WAY YOU
LIKE IT.

     YOU'LL FIND THAT WHILE MANY OF THE
CALLS ARE SPECIFIC TO TEXT FILES, THE
READ AND WRITE CALLS ARE THE SAME ONES
USED FOR BINARY AND BASIC PROGRAMS.

=======================================

 LOC'N  DESCRIPTION  CONTENTS
 -----  -----------  --------

 B5BB   CALL TYPE    00 = NOP
                     01 = OPEN
                     02 = CLOSE
                     03 = READ
                     04 = WRITE
                     05 = DELETE
                     06 = CATALOG
                     07 = LOCK
                     08 = UNLOCK
                     09 = RENAME
                     0A = POSITION
                     0B = INIT(CAREFUL)
                     0C = VERIFY

  B5BC  SUB-CALL     00 = NOP
         TYPE        01 = READ OR WRITE
         (USED ONLY        ONE BYTE
          FOR READ   02 = READ OR WRITE
          OR WRITE         A RANGE OF
          CALLS)           BYTES
                     03 = POSITION,
                           THEN READ/
                           WRITE 1 BYTE
                     04 = POSITION,
                           THEN READ/
                           WRITE RANGE

  B5BD-
   B5C4 SPECIFIC     SEE TABLES BELOW
         CALL
         PARAMETERS

  B5C5  ERROR CODE   00 = NO ERRORS
         RETURNED    01 = UNUSED
         AFTER A     02 = BAD CALL TYPE
         CALL        03 = BAD SUB-CALL
                     04 = DISK WRITE
                           PROTECTED
                     05 = END OF DATA
                     06 = FILE NOT
                           FOUND
                     07 = VOL# MISMATCH
                     08 = "I/O ERROR"
                     09 = DISK FULL
                     0A = FILE LOCKED

  B5C6  NOT USED

  B5C7- WORKAREA     00   NORMALLY
   B5C8  BUFFER      98    (NOTE 1)
         ADDRESS

  B5C9- TRACK/SEC-   00   NORMALLY
   B5CA  TOR LIST    97    (NOTE 2)
         ADDRESS

  B5CB- DATA BUFFER  00   NORMALLY
   B5CC  ADDRESS     96    (NOTE 3)

=======================================

NOTES:

1.  THIS IS THE STARTING ADDRESS OF A
45-BYTE TABLE (9800-9844 OR WHEREVER
ELSE YOU WANT IT) WHERE THE FILE
MANAGER STASHES INFORMATION IT MAY NEED
FOR THE NEXT CALL.

2.  STARTING ADDRESS OF A 256-BYTE
BUFFER (9700-97FF) WHERE THE FILE
MANAGER STORES THE TRACK AND SECTOR
LIST FOR THE FILE CURRENTLY BEING
ACCESSED.

3.  STARTING ADDRESS OF A 256- BYTE
BUFFER WHERE DATA ARE DUMPED
TEMPORARILY DURING A SECTOR READ,
BEFORE BEING STORED IN THE FINAL PAGE.


     IN THE NEXT (AND LAST) TABLE, THE
CONTENTS OF LOCATIONS B5BD-B5C4 ARE
LISTED FOR EACH OF THE FOUR CALL TYPES
(ANY LOCATIONS NOT LISTED ARE "DON'T
CARE" FOR THAT CALL TYPE).

"OPEN" CALL  (B5BB=01)
---------------------

  B5BD-  LO/HI NUMBER FOR RECORD
   B5BE  LENGTH IN A RANDOM-ACCESS FILE
  B5BF   DISK VOLUME #; 00=TAKE ANY VOL
  B5C0   DRIVE NUMBER; USUALLY 01
  B5C1   SLOT NUMBER; USUALLY 06
  B5C2   FILE TYPE (ONLY WHEN OPENING A
         NEW FILE):

            00 = TEXT
            01 = INTEGER BASIC
            02 = APPLESOFT BASIC
            04 = BINARY
            08 = RELOCATABLE 'R'
            10 = 'S' FILE
            20 = 'A' FILE:NOT APPLESOFT
            40 = 'B' FILE:NOT BINARY

  BC53-  LO/HI ADDRESS OF A 30-CHAR
   BC54  FILE NAME BUFFER, USUALLY
         2D 98 FOR BUFFER AT 982D-984B

"CLOSE" CALL  (B5BB=02)
-----------------------

  B5BD-  THERE ARE NO PARAMETERS FOR
   B5C4   THE CLOSE CALL

"READ" CALL  (B5BB=03)
----------------------

  B5BD-  LO/HI RECORD NUMBER: RANDOM-
   B5BE  TEXT FILE ONLY (B5BC = 3 OR 4)
  B5BF-  LO/HI BYTE OFFSET INTO THE
   B5C0  RECORD: RANDOM (B5BC = 3 OR 4)
  B5C1-  LO/HI NUMBER OF BYTES TO READ
   B5C2  (B5BC = 2 OR 4)
  B5C3-  LO/HI ADDRESS WHERE YOU WANT
   B5C4  THE DATA TO WIND UP(B5BC=2OR4)

"WRITE" CALL (B5BB = 04)
------------------------

  B5BD-  LO/HI RECORD # (B5BC = 3 OR 4)
   B5BE
  B5BF-  LO/HI BYTE OFFSET  "   "   "
   B5C0
  B5C1-  LO/HI NUMBER ONE LESS THAN THE
   B5C2  NUMBER OF BYTES TO BE WRITTEN-
         NOTICE THE DIFFERENCE FROM THE
         READ CALL! (B5BC = 2 OR 4)
  B5C3-  LO/HI ADDRESS WHERE DATA TO BE
   B5C4  WRITTEN ARE STORED(B5BC=2OR4)
  B5C5   SINGLE BYTE TO BE WRITTEN IF
         B5BC= 01 OR 03

---------------------------------------

     GRANTED, THERE ARE A LOT OF
VARIABLES HERE, BUT A FEW SIMPLE
SUBROUTINES WILL TAKE CARE OF ALMOST
ALL CASES (THE COMPUTERS WERE SUPPOSED
TO WORK FOR US, RIGHT?). THE LISTING
BELOW CONTAINS EVERYTHING REQUIRED TO
DO THE OPEN/CLOSE/READ/WRITE CALLS FOR
256-BYTE RECORDS IN THE "LESSONS" FILE
FOR TYPE ATTACK. NOTE THAT IT CAN BE
REASSEMBLED WITH ANY "ORG" VALUE.

***************************************
*                                     *
*   BINARY DOS FILE MANAGER SUBS      *
*   FOR 48K, SLOT 6, DRIVE 1 SYSTEM   *
*                                     *
***************************************
*                                     *
*    =>=>=>DON'T FORGET TO            *
*          PUT THE FILE               *
*          NAME AT $982D<=<=<=        *
*                                     *
***************************************
      PARM   EQU $B5BB ;FILE MANAGER
                       PARAMETER LIST
      FILMGR EQU $AAFD ;FILE MANAGER
                       EXTERNAL ENTRY

             ORG $900
***************************************
*                                     *
*     COMMON IS USED BY ALL TYPES:    *
*     OPEN, READ, WRITE AND CLOSE     *
*                                     *
***************************************
     COMMON: LDA #0 ;SET UP WORK AREA,
             STA PARM+$C ;TRACK/SECTOR
 BUFFER,
             STA PARM+$E ;AND DATA
 BUFFER LOCATIONS
             STA PARM+$10 ;IN THE FIRST
 BUFFER
             LDA #$98
             STA PARM+$D
             LDA #$97
             STA PARM+$F
             LDA #$96
             STA PARM+$11
             RTS
***************************************
*                                     *
*     THIS IS THE COMMON SETUP FOR    *
*     THE READ AND WRITE CALLS        *
*                                     *
***************************************
     READRI: LDA #4     ;POSITION TO
 THE RECORD
             STA PARM+1 ;NUMBER, READ
 A RANGE OF BYTES
             LDA #$64 ;THIS IS THE
 LESSON (RECORD) #
             STA PARM+2
             LDA #0
             STA PARM+3 ;HIGH BYTE
 REC.# = 00
             STA PARM+4 ;NO BYTE OFFSET
             STA PARM+5
             STA PARM+8 ;DATA BUFFER
 AT $1000
             LDA #$10
             STA PARM+9
             RTS
***************************************
*                                     *
*     THIS IS THE OPEN FILE CALL      *
*                                     *
***************************************
       OPEN: LDA #1 ;CALL TYPE
 #1=OPEN
             STA PARM
             STA PARM+3 ;EACH RECORD =
 100 BYTES
             STA PARM+5 ;DRIVE # IS 1
             LDA #0 ;RECORD LENGTH=
 $100 BYTES
             STA PARM+2
             STA PARM+4 ;VOL# WILD CARD
             STA PARM+7 ;FILE TYPE #0 =
 TEXT
             LDA #$06 ;SLOT #6
             STA PARM+6
             LDA #$2D ;FILE NAME
             STA PARM+8 ;BUFFER LOC'N
             LDA #$98
             STA PARM+9 ; IS $982D
             JMP FILMGR ; FILE MANAGER
 EXTERNAL ENTRY POINT
***************************************
*                                     *
*     THIS IS THE READ CALL           *
*                                     *
***************************************
       READ: LDA #$03 ;CALL TYPE#3=READ
             STA PARM
             LDA #$00 ;SET UP FOR
 $100-BYTE READ
             STA PARM+6
             LDA #$01
             STA PARM+7
             JMP FILMGR ; WAKE UP THE
 OLD FART
***************************************
*                                     *
*     AND THIS IS WRITE               *
*                                     *
***************************************
      WRITE: LDA #$04 ;CALL TYPE #4=
 WRITE
             STA PARM
             LDA #$FF ;THE WRITE CALL
             STA PARM+6 ;NEEDS ONE
 LESS THAN
             LDA #$00 ;THE ACTUAL #
 OF BYTES
             STA PARM+7
             JMP FILMGR ;AND RING THE
 BUZZER
***************************************
*                                     *
*     AND FINALLY, CLOSE:             *
*                                     *
***************************************
      CLOSE: LDA #$02 ;MUST FOLLOW
 WRITE W/CLOSE
             STA PARM
             JMP FILMGR ;PUT HIM BACK
 TO SLEEP

=======================================

     THE SEQUENCE OF CALLING THESE
SUBROUTINES IS:
                      CODE IF ORG=$0900
                      -----------------
  OPEN:  JSR COMMON   20 00 09
         JSR OPEN     20 39 09
         RTS          60

  READ:  JSR COMMON   20 00 09
         JSR READRI   20 1B 09
         JSR READ     20 61 09
         RTS          60

  WRITE: JSR COMMON   20 00 09
         JSR READRI   20 1B 09
         JSR WRITE    20 73 09
         RTS          60

  CLOSE: JSR COMMON   20 00 09
         JSR CLOSE    20 85 09
         RTS          60

     AFTER YOU GET FAMILIAR WITH WHAT
THESE ROUTINES DO, YOU CAN PULL SOME
SIMPLIFYING TRICKS, SUCH AS INCLUDING
THE "COMMON" CALL IN THE OTHER
ROUTINES, SINCE ITS ALWAYS CALLED, AND
USING 'JMP READ' INSTEAD OF 'JSR READ,
RTS'.

     IN ADDITION TO THESE CALLS, YOU
MUST DEPOSIT THE FILE NAME (COMPLETE
WITH SPACES OUT TO 30 CHARACTERS), IN
THE NAME BUFFER AT 982D-984B OR
WHEREVER ELSE IT'S SPECIFIED.  A
ROUTINE TO DO THIS IS:

     NAMEPUT: LDY #$1E
     LETTER:  LDA NAME,Y
              STA 982D,Y
              DEY
              BNE LETTER
              RTS
     NAME:    ASCII "LESSONS
                                     "
              (4C 45 53 53 4F 4E 53 A0
               A0 A0 A0 A0 A0 A0 A0 A0
               A0 A0 A0 A0 A0 A0 A0 A0
               A0 A0 A0 A0 A0 A0)

     HAVING DONE THIS, YOU CAN NOW READ
AND WRITE TO ANY DESIRED RECORD OF THE
RANDOM-ACCESS FILE BY DEPOSITING THE
RECORD NUMBER IN THE LOCATION THAT
TRANSFERS IT TO THE FILE MANAGER ($9C1
IF ORG=$900), AND MAKING THE
APPROPRIATE CALLS. THE READ ROUTINES
ARE USED IN A COMMON SENSE MANNER,
(OPEN, THEN READ), BUT "WRITE" WILL
GIVE YOU SOME GRIEF IF YOU AREN'T
FAMILIAR WITH THE DRILL: TO WRITE A
FILE RECORD YOU MUST OPEN IT, WRITE IT,
AND CLOSE IT. ALTHOUGH IT SOUNDS
STRANGE, THE WRITE CALL ONLY CHANGES
THE CONTENTS OF THE BUFFER LOCATIONS IN
RAM, AND THE ACTUAL WRITING TO DISK OF
THE MODIFIED RECORD IS DONE BY THE
CLOSE COMMAND. YOU MUST, THEN, ALWAYS
DO OPEN, WRITE, AND CLOSE CALLS TO PUT
THE RECORD ON DISK.

     NOW, GETTING BACK TO THE PROBLEM
AT HAND, WE ARE IN A POSITION TO USE
THESE CALLS ON THE TYPE ATTACK LESSONS
FILE.  SINCE WE NO LONGER NEED THE
READ/WRITE ROUTINES AT 800-DFF OR THE
ORIGINAL BUFFER AREA AT 1000-1BFF, WE
HAVE ALL THE ROOM IN THE WORLD.  WE CAN
PUT THE FILE MANAGER CALL SUBROUTINES
ON PAGE 9 OF MEMORY, AND USE THE CALLS
TO READ AND WRITE FREELY TO THE TEXT
FILE ON THE DISK. THE CALLS IN THE
ORIGINAL PROGRAM WERE JSR 800 TO READ,
AND JSR 803 TO WRITE.  SINCE THE LESSON
NUMBER IS LOADED INTO THE ACCUMULATOR
BEFORE THE CALL IS MADE, IT CAN BE
CONVENIENTLY STORED IN THE LESSON
NUMBER LOCATION IN OUR SUBROUTINES BY
PREFACING THE 'COMMON' CALL WITH 'STA
9C1'.

     YOU CAN NOW MAKE THE PROGRAM VERY
SMALL (I RAN OUT OF TIME AND PATIENCE
BEFORE I SQUISHED MY VERSION DOWN)
BY PACKING EVERYTHING TOGETHER FOR
SAVING.  A SUGGESTED ARRANGEMENT IS:

  MAIN PROGRAM............4000-6FFF
  0-FF RELOCATION.........3F00-3FFF
  READ, WRITE SUBS........3E00-3EFF
  (RELOCATE TO............0900-09FF)
  SET UP HIRES, MOVE
  MEMORY, & START GAME....3D00-3DFF

IT LOOKS LIKE THE BINARY FILE CAN BE
ABOUT 51 SECTORS, BUT THE TEXT FILE
MUST BE 101 SECTORS. BEAR IN MIND THAT
CALLING SIMPLE APPLESOFT AND BINARY
PROGRAMS THROUGH THE FILE MANAGER IS
CONSIDERABLY EASIER THAN THIS EXAMPLE
OFRANDOM-ACCESS TEXT FILES.  IN A
FUTURE EPISODE, WE WILL ILLUSTRATE SUCH
A CALL WITH THE HIGH-SCORES FILE IN THE
SPY'S DEMISE KRACK.  IN THE MEANTIME,
FOR HOMEWORK, LOOK AT ANOTHER EXAMPLE
OF MULTIPLE APPLESOFT FILE CALLING
(ALTHOUGH NOT THROUGH THE FILE
MANAGER)BY INTERRUPTING THE ARCADE
MACHINE FROM THE MAIN MENU AND STUDYING
THE CODEFROM 7800-79FF.




SORRY, NO MORE FOR THIS CALL!


=====================================
                                                                                                                                                                                            