%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%H(HbQS 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! =====================================