textfiles/apple/ANATOMY/t.dos.a233.a50f.txt

871 lines
26 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

*======================================
* THE MON AND NOMON COMMAND HANDLERS.
*======================================
* NOTE: THE MON & NOMON COMMANDS AND
* THEIR ALPHABETIC ARGUMENTS (C,I,O)
* ARE FIRST DETECTED VIA COMMAND
* PARSING. CIOCUMUL IS TESTED AT THE
* DSPLYCHR ($9F9F) PORTION OF THE VIDEO
* PARSING ROUTINE TO SEE IF A CHAR
* SHOULD BE SENT TO THE SCREEN OR
* NOT. IT IS EASY TO BECOME CONFUSED
* OVER THE DISTINCTION BETWEEN
* CIOCUMUL AND MONPRSD. THE FORMER
* REPRESENTS THE CUMMULATIVE UPDATED
* RECORD OF THE C, I, O ARGUMENTS
* WHEREAS THE LATER DESCRIBES THE
* MOST RECENT ADDITIONS OF THE
* C, I, O ARGUMENTS PRESENT IN THE
* TABLE OF PARSED VALUES.
* THE ALPHABETIC ARUMENTS (C, I, O)
* ARE REPRESENTED BY THE FOLLOWING
* SPECIFIC BITS:
* C = $40 = %01000000
* I = $20 = %00100000
* O = $10 = %00010000
* COMBINATION OF ARGUMENTS ARE SIMPLY
* DESCRIBED BY THE APPROPRIATE BIT
* SETTINGS: EX. CIO = $70 = $01110000
CMDMON LDA CIOCUMUL ;GET PREV CUMMULATIVE RECORD AND
ORA MONPRSD ;MERGE WITH THE LATEST PARSED VAL
STA CIOCUMUL ;TO UPDATE CUMMULATIVE RECORD.
RTS ;RTN 2 THE CALLER OF THE MON CMD.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
CMDNOMON BIT MONPRSD ;TEST BIT6 IN PARSED TBL TO SEE IF
;"NOMON C" IS SELECTED.
BVC CLRMON ;BRANCH IF "C" NOT INCLUDED.
JSR CRVIADOS ;"C" WAS INCLUDED, SO PRT <CR>
;CAUSE CMD (BUT NOT <CR>) WAS
;ALREADY PRINTED.
CLRMON LDA #%01110000 ;SHUT OFF BITS IN PARSED TABLE
EOR MONPRSD ;THAT CORRESPOND 2 THE ALPHABETIC
;ARGUMENTS ISSUED WITH NOMON CMD.
AND CIOCUMUL ;NOW MAKE SURE THAT THOSE BITS
STA CIOCUMUL ;ARE OFF IN CUMMULATIVE RECORD.
RTS ;RTN TO CALLER OF THE NOMON CMD.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*==================================
* THE MAXFILES COMMAND HANDLER.
*==================================
* THE MAXFILES COMMAND IS USED TO
* DEFINE THE # OF FILES THAT MAY
* BE OPENED AT ONE TIME (IE. 1-16).
* A DEFAULT VALUE OF 3 IS USED FOR
* COLDSTARTS (IE, WHEN THE DISK IS
* BOOTED) OR WHEN THE FP OR INT
* COMMANDS ARE ISSUED. THIS VALUE
* CAN BE CHANGED BY ALTERING THE
* CONTENTS OF $AAB1. (THE MAXFILES
* CMD CAN BE TRICKED INTO BUILDING
* ITS BUFFERS AT A LOWER LOCATION
* IN ORDER TO CREATE A SANCTUARY
* WHERE CUSTOM MACHINE LANGUAGE
* ROUTINES CAN'T BE OVERWRITTEN BY
* BASIC. SEE FORMATTED DIS'MBLY
* OF MAXFILES CMD FOR DETAILS.)
CMDMXFIL LDA #0 ;SHUT OFF THE EXEC FLG.
STA EXECFLAG
LDA A5L ;GET ARGUMENT ISSUED WITH CMD AND
PHA ;SAVE IT ON THE STK.
;NOTE: ARGUMENT WAS PREVIOUSLY
;SCREENED TO INSURE THAT IS IS
;BTWN 1 AND 16 ($A0AA - $A0C7).
JSR CLOSEALL ;CLOSE ALL OPEN FILES.
PLA ;RETRIEVE ARGUEMENT ISSUED WITH
STA MXFILVAL ;CMD & STORE IT IN THE MAIN
;VARIABLES TABLE.
JMP BILDBUFS ;GO BUILD MXFILVAL # OF DOS BUFS.
;RTNS 2 CALLER OF MAXFILES CMD.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*=================================
* THE DELETE COMMAND HANDLER.
*=================================
CMDELETE LDA #5 ;OPCODE FOR DELETE.
JSR HNDLCMD1 ;CLOSE THE FILE & RLEASE ITS BUF.
;REASSIGN A DOS BUF TO THE FILE.
;CHNG FILE DESCRP IN DIR SEC BUF.
;WRITE UPDATED DIR SEC BUF 2 DSK.
;FREE UP DATA & T/S LIST SECTORS.
;WRITE UPDATED VTOC TO DISK.
JSR GETBUFF ;FIND REASSIGNED DOS BUF.
LDY #0 ;FREE UP DOS BUF OF FILE BY
TYA ;STORING A $00 IN 1RST BYTE OF
STA (A3L),Y ;THE DOS FILE NAME BUFFER.
RTS ;EXIT 2 CALLER OF THE DELETE CMD.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*==================================
* THE LOCK AND UNLOCK CMD HANDLERS.
*==================================
CMDLOCK LDA #7 ;LOCK OPCODE.
BNE LOKUNLOK ;ALWAYS.
CMDUNLOK LDA #8 ;UNLOCK OPCODE.
*---------------------------------
* ROUTINE COMMON TO LOCK, UNLOCK
* AND VERIFY COMMAND HANDLERS.
*---------------------------------
LOKUNLOK JSR HNDLCMD1 ;CALL PART OF THE MAIN COMMAND
;HANDLER ROUTINE TO LOCK, UNLOCK
;OR VERIFY THE FILE.
JMP CMDCLOSE ;EXIT COMMAND VIA CLOSE.
;RTN 2 THE CALLER OF THE COMMAND.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*=================================
* THE VERIFY COMMAND HANDLER.
*=================================
CMDVERFY LDA #12 ;VERIFY OPCODE.
BNE LOKUNLOK ;GO CALL THE CMD HNDLR TO VERIFY
;FILE & THEN EXIT VIA CLOSE CMD.
*=================================
* THE RENAME COMMAND HANDLER.
*=================================
CMDRENAM LDA ADRSFNBF ;COPY ADR OF SECONDARY FILENAME 2
STA RENAMBUF ;RENAME BUF IN FM PARAMETER LIST.
LDA ADRSFNBF+1
STA RENAMBUF+1
LDA #9 ;RENAME OPCODE.
STA TEMPBYT
JSR CLOSIFOP ;CLOSE FILE IF IT IS ALREADY OPEN
;AND THEN DO THE RENAME FUNCTION:
; -COPY NEW FILE NAME 2 DIRECTORY
; SECTOR BUFFER & THEN WRITE THE
; UPDATED DIREC SEC BACK 2 DISK.
JMP CMDCLOSE ;EXIT RENAME CMD VIA CLOSE CMD.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*=================================
* THE APPEND COMMAND HANDLER.
*=================================
CMDAPPND JSR CMDOPEN ;GO OPEN THE FILE TO BE APPENDED.
READ2END JSR RDTXTBYT ;GO READ A TEXT FILE BYTE. (USE
;THE READ FUNCTION AND READ-ONE-
;BYTE SUBFUNCTION.)
BNE READ2END ;TAKE BRANCH IF DEALING WITH A
;VALID (IE. NON-ZERO) DATA BYTE.
;HAVEN'T ENCOUNTERED AN END-OF-
;FILE MARKER ($00) YET,SO GO BACK
;TO READ THE REST OF THE FILE.
JMP CKAPFLG ;FOUND END OF FILE,SO NOW GO BACK
;UP THE FILE POINTER IF NECESSARY
;AND EVENTUALLY EXIT THE APPEND
;CMD HANDLER VIA RSETPTRS ($B6B3)
;AND FMEXIT ($B386). NOTE THAT
;RSETPTRS RESETS THE SAVED STACK
;POINTER (STKSAV, $B39B) SO WE
;EVENTUALLY RETURN TO THE CALLER
;OF THE APPEND COMMAND. EXECUTION
;OFTEN RETURNS TO AFTRCMD ($A17D)
;LOCATED IN THE COMMAND PARSING
;AND PROCESSING ROUTINES.
*=================================
* THE OPEN COMMAND HANDLER.
*=================================
CMDOPEN LDA #0 ;CODE FOR TEXT FILE.
JMP OPNCKTYP ;GO OPEN THE FILE & CHK ITS TYPE.
;RTN 2 THE CALLER OF THE OPEN CMD
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;ASSOCIATED WITH THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*====================================
* COMMON FILE MANAGER CMD HNDLR CODE.
*====================================
HNDLCMD LDA #1 ;OPEN OPCODE.
HNDLCMD1 STA TEMPBYT ;STORE OPCODE IN TEMPBYT.
LDA LENPRSD ;GET L-PARAMETER FROM PARSED TBL.
BNE SAVLENFM ;CHECK IF A NON-ZERO L-PARM WAS
;ISSUED WITH THE COMMAND.
LDA LENPRSD+1
BNE SAVLENFM
LDA #1 ;LNGTH WAS 0 SO MAKE IT 1 INSTEAD
STA LENPRSD
SAVLENFM LDA LENPRSD ;PUT LENGTH IN FM PARAMETER LIST.
STA RECLENFM ;NOTE: RECORD LENGTH = 1 FOR
LDA LENPRSD+1 ;SEQUENTIAL FILES, ELSE PARSED
STA RECLENFM+1 ;LENGTH FOR RANDOM ACCESS FILES.
*----------------------------------
* CLOSE FILE IF IT IS ALREADY OPEN.
*----------------------------------
CLOSIFOP JSR CMDCLOSE ;CLOSE IF ALREADY OPEN.
LDA A5L+1 ;A5L/H POINTS AT HIGHEST NUMBERED
;(LOWEST IN MEMORY) FREE DOS BUF.
BNE SAVFNPTR ;BRANCH IF FOUND A FREE BUFFER.
JMP NOBUFERR ;COULDN'T LOCATE A FREE BUFFER SO
;GO ISSUE OUT OF BUF'S MSG.
SAVFNPTR STA A3L+1 ;RESET A3L/H TO POINT AT DOS BUF
LDA A5L ;THAT WILL USE 4 FILENAME FIELD.
STA A3L
JSR CPYPFN ;REASSIGN A DOS BUFFER 2 THE FILE
;WE WANT TO OPEN.
JSR BUFS2PRM ;GET ADDR'S OF THE VARIOUS DOS
;BUFFERS FROM THE CHAIN BUFFER &
;PUT THEM IN THE FM PARM LIST.
JSR CPY2PARM ;PUT VOL, DRV, SLOT & ADDR OF THE
;PRIMARY FILENAME BUFFER IN THE
;FM PARAMETER LIST.
LDA TEMPBYT ;GET OPCODE BACK FROM TEMPBYT AND
STA OPCODEFM ;STICK IT IN THE FM PARM LIST.
JMP FMDRIVER ;USE FILE MANAGER TO DO FUNCTION.
*=================================
* THE CLOSE COMMAND HANDLER.
*=================================
CMDCLOSE LDA PRIMFNBF ;GET 1RST CHR FRM PRMRY NAME BUF.
CMP #" " ;DON'T ALLOW LEADING SPACES.
BEQ CLOSEALL ;LEADING SPC = SIGNAL 2 CLOSE ALL
;FILES. (A CLOSE CMD WAS ISSUED
;WITH NO ACCOMPANYING FILE NAME.)
JSR GETBUFF ;LOCATE A DOS BUFFER WITH SAME
;NAME, ELSE LOCATE A FREE BUFFER.
EVENTXIT BCS CLOSERTS ;EVENTUALLY EXIT VIA THIS ROUTE!!
JSR CLOSEONE ;MATCHING FILENAME WAS FOUND SO
;GO CLOSE THAT FILE.
JMP CMDCLOSE ;GO BACK TO POINT A5L/H AT A FREE
;DOS BUFFER & EXIT VIA EVENTXIT
;($A2F4) AND CLOSERTS ($A330).
*---------------------------------
* CLOSE A SPECIFIC FILE
* (& FREE ITS BUFFER).
*---------------------------------
CLOSEONE JSR CKEXCBUF ;CHK IF CURRENT FILENAME BUFFER
;BELONGS TO AN EXEC FILE.
BNE FREEBUFF ;BRANCH IF NOT EXECING FROM THIS
;PARTICULAR FILE. NOTE, ALWAYS
;TAKE BRANCH IF CLOSEONE ($A2FC)
;IS ACCESSED VIA CLOSEALL ($A316)
LDA #0 ;CLOSING AN EXEC FILE SO SHUT OFF
STA EXECFLAG ;THE EXEC FLAG. NOTE:THIS INSTRUC
;IS NEVER CARRIED OUT IF ACCESSED
;VIA CLOSEALL. (AN ACTIVE EXEC
;FILE WAS ALREADY DETECTED AND
;SKIPPED BY THE "BEQ CHKNXBUF"
;INSTRUCTION AT $A323.)
FREEBUFF LDY #0 ;FREE UP DOS BUF BY POKING A $00
TYA ;IN 1RST BYT OF DOS FILENAME BUF.
STA (A3L),Y
JSR BUFS2PRM ;GET ADDR'S OF THE VARIOUS DOS
;BUFS FROM THE CHAIN BUF & PUT
;THEM IN THE FM PARAMETER LIST.
LDA #2 ;PUT OPCODE FOR CLOSE FUNCTION
STA OPCODEFM ;IN THE FM PARAMETER LIST.
JMP FMDRIVER ;GO TO THE FILE MANAGER DRIVER TO
;DO THE CLOSE FUNCTION.
*---------------------------------------
* CLOSE ALL FILES (EXCEPT AN EXEC FILE).
* ENTER CLOSEALL WHEN IT IS ACCESSED VIA
* A DIRECT CALL OR IF THE FIRST CHAR IN
* THE PRIMAY FILENAME FIELD WAS A SPACE.
*---------------------------------------
CLOSEALL JSR GETFNBF1 ;PUT ADR OF 1RST DOS FILENAME BUF
;(LOCATED IN CHAIN OF DOS BUFS)
;IN THE A3L/H POINTER.
BNE CKIFEXEC ;ALWAYS.
CHKNXBUF JSR GETNXBUF ;GET ADR OF NEXT DOS FILENAME BUF
;FROM DOS CHAIN POINTERS BUFFER
;(OFFSET 37 & 36 BYTES FROM 1RST
;CHR OF PRESENT DOS FILENAME BUF)
BEQ CLOSERTS ;LNK ZEROED OUT -ALL FILES CLOSED
;(EXIT CLOSEALL VIA THIS ROUTE.)
CKIFEXEC JSR CKEXCBUF ;CHK IF CURRENT DOS FILENAME BUF
;BELONGS TO TO AN EXEC FILE.
BEQ CHKNXBUF ;EXEC ACTIVE SO DON'T CLOSE ITS
;BUFFER OUT OR WILL END UP
;IN NEVER-NEVER LAND. AFTER ALL,
;DON'T WANT TO CLOSE BUFFER IF WE
;ARE USING IT 2 EXEC (IE. WOULD
;BE LIKE BURYING SELVES ALIVE)!!
JSR GETFNBY1 ;GET 1RST BYTE IN DOS NAME BUF.
BEQ CHKNXBUF ;THIS FILE IS ALREADY CLOSED SO
;GO BACK TO CLOSE REST OF FILES.
JSR CLOSEONE ;FILE WAS OPEN SO GO CLOSE IT.
JMP CLOSEALL ;GO TO CLOSERTS VIA CLOSEALL!!!
CLOSERTS RTS ;EXIT TO CALLER OF THE CLOSE CMD.
;(OFTEN EXITS TO AFTRCMD ($A17D)
;LOCATED IN THE COMMAND PARSING &
;PROCESSING ROUTINES.)
*=================================
* THE BSAVE COMMAND HANDLER.
*=================================
CMDBSAVE LDA #%00001001 ;TEST BITS0 & 3 OF CUMLOPTN 2 SEE
AND CUMLOPTN ;IF A(DDR) & L(ENGTH) PARAMETERS
CMP #%00001001 ;WERE ISSUED WITH THE BSAVE CMD.
BEQ DOBSAV ;BOTH A- & L-PARMS PRESENT.
JMP CKIFCTRL ;GOT A SYNTAX ERROR.
DOBSAV LDA #4 ;CODE FOR BINARY FILE.
JSR OPNCKTYP ;CLOSE (IF NECESSARY) & THEN OPN.
LDA ADRPRSD+1 ;PREPARE TO WRITE ADDR TO DISK.
LDY ADRPRSD
JSR WRADRLEN ;CALL WRITE-ONE-BYTE SUBFUNCTION
;TWICE TO PUT A(DDR)-PARAMETER IN
;DATA SEC BUF. (NOTE: LEN2RDWR IS
;USED AS A TEMPORAY BUFFER FOR
;FOR DATA TRANSFER.)
LDA LENPRSD+1 ;PREPARE TO WRITE FILE LENGTH.
LDY LENPRSD
JSR WRADRLEN ;CALL WRITE-ONE-BYTE SUFUNCTION 2
;WRITE LENGTH AS THE 3RD & 4TH
;BYTES IN THE DATA SEC BUF.
;(LATER BUF WRITTEN AS 1RST SEC
;OF FILE. LEN2RDWR IS AGAIN USED
;AS A TEMP BUF 4 DATA TRANSFER.)
* NOW PREPARE TO WRITE THE REST
* OF THE BINARY FILE TO THE DISK.
LDA ADRPRSD+1 ;PUT ADDR OF SOURCE BUFFER IN
LDY ADRPRSD ;THE FM PARAMETER LIST.
JMP RDWRANGE ;GO TO WRITE-RANGE ROUTINE TO
;WRITE REST OF FILE TO THE DISK.
;(FILE IS ALSO VERIFIED AND THEN
;EXITED VIA THE CLOSE COMMAND.)
;EXECUTION EVENTUALLY RETURNS TO
;THE CALLER OF THE BSAVE COMMAND.
;OFTEN, RETURNS 2 AFTRCMD ($A17D)
;LOCATED IN THE CMD PARSING AND
;PROCESSING ROUTINES.
*=================================
* BLOAD COMMAND HANDLER
*=================================
CMDBLOAD JSR HNDLCMD ;CALL THE FM COMMAND HANDLER TO
;OPEN THE FILE.
* COMPARE FILE TYPE WANTED
* WITH FILE TYPE FOUND.
LDA #$7F ;STRIP LOCK BIT FROM FILE TYPE
AND FILTYPFM ;FOUND (VIA OPEN FUNCTION).
CMP #4 ;WAS FILE FOUND A BINARY FILE?
BEQ ADR4BLOD ;YES.
JMP TYPMISM ;NO - GO ISSUE FILE-MISMATCH MSG.
* REDUNDANT CODE! CLOSE (IF NECESSARY)
* AND THEN OPEN THE FILE AGAIN.
ADR4BLOD LDA #4 ;CODE FOR BINARY FILE.
JSR OPNCKTYP ;CLOSE & REOPEN FILE.
JSR RDADRLEN ;READ THE BLOAD ADR FROM THE DISK
;INTO LEN2RDWR.
TAX ;X=LOW BYTE OF BLOAD ADR FRM DSK
LDA CUMLOPTN ;CHK CUMLOPTN TO SEE IF AN A(DDR)
AND #%00000001 ;WAS ISSUED WITH THE BLOAD CMD.
BNE LEN4BLOD ;YES -SO IGNORE ADR READ FROM DSK
; & USE THE ACTUAL PARSED
; A-PARAMETER INSTEAD.
STX ADRPRSD ;STORE ADR READ FRM DSK IN PARSED
STY ADRPRSD+1 ;TABLE. (THIS WAY CAN ALWAYS USE
;VAL IN TABLE FOR BLOAD ADR.)
LEN4BLOD JSR RDADRLEN ;READ THE BLOAD LENGTH OFF DSK.
;(PUT RESULTS IN LEN2RDWR.)
LDX ADRPRSD ;SET (X)/(Y) = EITHER ORIG PARSED
LDY ADRPRSD+1 ;A-PARM ADR OR BLOAD ADR FRM DSK.
JMP LODINTFP ;GO READ THE REST OF THE FILE IN.
;EXITS VIA THE CLOSE COMMAND.
;RETURNS TO CALLER OF THE BLOAD
;CMD. (IF BLOAD CMD NOT CALLED BY
;BRUN, THEN OFTEN RTNS TO AFTRCMD
;($A17D) LOCATED IN THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*=================================
* BRUN COMMAND HANDLER
*=================================
CMDBRUN JSR CMDBLOAD ;BLOAD THE PRGM.
JSR INITIOHK ;POINT THE I/O HOOKS AT DOS.
;NOTE: THIS CAN CREATE SOME
;EXOTIC BUGS IF THE BRUNED PRGM
;PRINTS ANY INFO OR IF "MON" IS
;ACTIVE. SEE FORMATTED DIS'MBLY
;OF BRUN CMD FOR EXPLANATION.)
JMP (ADRPRSD) ;BEGIN EXECUTION OF BINARY PRGM.
;EXECUTION NORMALLY RETURNS TO
;AFTRCMD ($A17D) LOCATED IN THE
;CMD PARSING AND PROCESSING
;ROUTINES. ALSO NOTE THAT
;THE COMPUTER MAY HANG ON CERTAIN
;OCCASSIONS. (SEE THE FORMATTED
;DISASSEMBLY OF THE BRUN CMD FOR
;EXPLANATION.)
*=================================
* SAVE COMMAND HANDLER
*=================================
CMDSAVE LDA ACTBSFLG ;CHK WHICH BASIC IS ACTIVE.
BEQ SAVINTGR ;BRANCH IF USING INTEGER.
;INT=$00, A(ROM)=$40, A(RAM)=$80.
LDA PROTFLG ;IF PROTECTION FLAG IS ON (IE. IS
;NEGATIVE), THEN ALL APPLESOFT
;CMDS CAUSE RUN & DOS'S SAVE CMD
;CAUSES A PHONY PROGRAM-TOO-LARGE
;MESSAGE TO BE GENERATED.
BPL SAVAPSFT ;BRANCH IF PROTECTION FLG IS OFF.
JMP TOOLARGE ;PROTECTED!!! - SPIT OUT PHONY
;PROGRAM-TOO-LARGE MESSAGE & XIT.
*---------------------------------
* SAVE AN APPLESOFT FILE
*---------------------------------
SAVAPSFT LDA #2 ;CODE FOR APPLESOFT FILE.
JSR OPNCKTYP ;GO OPEN THE NAMED FILE & CHECK
;ITS TYPE.
SEC ;CALC THE LNGTH OF THE PRGM SO WE
LDA PRGEND ;CAN WRITE IT AS 1RST TWO BYTES:
SBC TXTTAB ; LENGTH = PRGEND - TXTTAB
TAY
LDA PRGEND+1
SBC TXTTAB+1
JSR WRADRLEN ;WRITE THE LENGTH OF THE FP FILE
;BY USING THE WRITE-ONE-BYTE
;SUBFUNCTION TWICE.
* PREPARE TO WRITE REST OF FILE.
LDA TXTTAB+1 ;PRGM START = START OF OUTPUT BUF
LDY TXTTAB
JMP RDWRANGE ;GO TO THE WRITE-RANGE-OF-BYTES
;ROUTINE 2 WRITE THE REST OF FILE
;AND THEN VERIFY IT.
;AFTER VERIFICATION, THE SAVE CMD
;IS EXITED VIA THE CLOSE CMD.
;EXECUTION THEN RETURNS TO CALLER
;OF THE SAVE CMD. (OFTEN RTNS TO
;AFTRCMD ($A17D) LOCATED IN THE
;DOS CMD PARSING AND PROCESSING
;ROUTINES.)
*---------------------------------
* SAVE AN INTEGER FILE
*---------------------------------
SAVINTGR LDA #1 ;CODE FOR INTEGER FILE.
JSR OPNCKTYP ;GO OPEN THE INTEGER FILE.
SEC ;CALC LENGTH OF FILE.
LDA HIMEM
SBC INTPGMST
TAY
LDA HIMEM+1
SBC INTPGMST+1
JSR WRADRLEN ;WRITE LNGTH 2 DSK BY CALLING THE
;WRITE-ONE-BYTE SUBFUNCTION TWICE
LDA INTPGMST+1
LDY INTPGMST
JMP RDWRANGE ;WRITE THE REST OF FILE TO DSK.
*=================================
* OPEN NAMED FILE & CHECK ITS TYPE
*=================================
OPNCKTYP STA FILTYPFM ;PUT CODE FOR FILE TYPE IN THE
PHA ;FM PARAMETER LIST & SAVE ON STK.
;($00=TXT, $01=INT, $02=FP,
;$04=BIN, $08=S-TYPE, $10=RELOC,
;$20=A-TYPE AND $40=B-TYPE.)
JSR HNDLCMD ;USE THE FM CMD HANDLER TO OPEN.
PLA ;PULL THE FILE TYPE CODE FRM STK.
JMP CHKFTYPE ;GO CHK IF TYPE WNTD = TYPE FOUND
*============================================
* WRITE TWO BYTES.
*--------------------------------------------
* CODE WHICH WRITES ADDRESS AND LENGTH VALUES
* TO THE DATA SECTOR BUFFER. (LATER, THE
* DATA SEC BUF IS WRITTEN TO THE DISK.)
* CALLS WRITE-ONE-BYTE SUBFUNCTION TWICE.
* NOTE THAT LEN2RDWR IS USED AS A TEMPORARY
* BUFFER FOR DATA TRANSFER AS SHOWN BELOW:
* - LOW BYTE OF ADR OR LENGTH --> LEN2RDWR
* --> ONEIOBUF --> DATA SECTOR BUFFER.
* - HI BYTE OF ADR OR LENGTH --> LEN2RDWR+1
* --> ONEIOBUF --> DATA SECTOR BUFFER.
*============================================
WRADRLEN STY LEN2RDWR ;PUT LOW BYTE IN FM PARM LIST IN
;CASE THIS IS A L-PARM & WE NEED
;IT AS A COUNTER WHEN LATER WRITE
;RANGE OF BYTES TO DISK.
STY ONEIOBUF ;PUT BYTE TO WRITE IN PARM LIST.
STA LEN2RDWR+1 ;PUT HI BYTE IN FM PARM LIST IN
;CASE THIS IS A L-PARM & WE NEED
;IT AS COUNTER WHEN LATER WRITE
;RANGE OF BYTES TO DISK.
LDA #4 ;PUT WRITE OPCODE IN FM PARM LIST
STA OPCODEFM
LDA #1 ;PUT ONE-BYTE SUBCODE IN PARM LST
STA SUBCODFM
JSR FMDRIVER ;CALL FM DRV TO WRITE 1RST BYTE.
LDA LEN2RDWR+1 ;PUT HI BYTE TO WRITE IN PARM LST
STA ONEIOBUF
JMP FMDRIVER ;GO WRITE HI BYTE TO FILE.
*=================================
* READ/WRITE A RANGE OF BYTES
*=================================
RDWRANGE STY CURIOBUF ;PUT ADR OF OUTPUT BUF IN PRM LST
STA CURIOBUF+1
LDA #2 ;SET SUBCODE FOR RANGE OF BYTES.
JMP VRFYRWNG ;GO CALL THE FILE MANAGER TO WRITE
;DATA TO THE DISK. NEXT VERIFY
;THE INFO & CLOSE THE FILE.
*=================================
* CALL FM DRIVER & THEN CLOSE FILE
*=================================
CLOSEFM JSR FMDRIVER ;CALL THE FM DRIVER 2 READ/WRITE.
JMP CMDCLOSE ;GO CLOSE THE FILE.
*========================================
* GO ISSUE A FILE-TYPE-MISMATCH ERROR MSG
*========================================
TOTYPMIS JMP TYPMISM ;GO HANDLE MISMATCH ERROR.
*=================================
* LOAD COMMAND HANDLER
*=================================
CMDLOAD JSR CLOSEALL ;CLOSE ALL FILES (EXCEPT ACTIVE
;EXEC FILE).
OPENLOAD JSR HNDLCMD ;GO OPEN THE FILE.
LDA #%00100011 ;SET BITS IN (A) TO RESTRICT LOAD
;CMD 2 APLSFT ($02), INTGR ($01)
;OR A-TYPE ($20) FILES.
AND FILTYPFM ;TYPE FOUND (VIA OPEN FUNCTION).
BEQ TOTYPMIS ;ERR -NOT ONE OF THE ABOVE TYPES.
;GO ISSUE TYPE-MISMATCH ERR MSG.
STA FILTYPFM ;SAVE TYPE WANTED IN FM PARM LIST
LDA ACTBSFLG ;CHK WHICH LANG IS ACTIVE:
; INT=$00, FP=$40, A(RAM)=$80)
BEQ LODINTGR ;BRANCH IF USING INTEGER.
LDA #2 ;CODE FOR APPLESOFT (FP).
JSR SELCTBSC ;CHK IF TYPE WANTED IS APPLESOFT.
JSR RDADRLEN ;READ LENGTH OF THE FP PRGM FROM
;THE 1RST 2 BYTES OF THE FILE.
* CHK TO SEE IF THERE IS ENOUGH ROOM
* BETWEEN PRGM START POS'N & MEMSIZ
* TO ACCOMODATE FILE.
CLC ;ADD LNGTH OF FILE 2 START OF PGM
ADC TXTTAB ;(NORMALLY, $801).
TAX ;SAVE LOW BYTE OF PRGEND IN (X).
TYA ;RETRIEVE HI BYTE OF LEN FROM (Y)
ADC TXTTAB+1
CMP MEMSIZ+1
BCS TOTOOLRG ;BRANCH IF NOT ENOUGH ROOM.
;(GO ISSUE PRGM-TOO-LARGE MSG.)
* PRGM IS SHORT ENOUGH TO BE
* ACCOMODATED IN FREE MEMORY SPACE.
*
* SET ZERO-PAGE POINTERS.
STA PRGEND+1 ;SET END OF PRGM POINTER.
STA VARTAB+1 ;SET START OF VARIABLE SPACE.
STX PRGEND ;PRGEND: VAL IN TXTTAB + LENGTH.
STX VARTAB ;VARTAB: VAL IN TXTTAB + LENGTH.
LDX TXTTAB
LDY TXTTAB+1
JSR LODINTFP ;DESIGNATE WHERE IN FREE MEMORY 2
;LOAD PRGM & THEN GO LOAD IT.
JSR INITIOHK ;POINT THE I/O HOOKS AT DOS.
JMP (RLOCNTRY) ;NORMALLY PTS TO SETLINKS ($D4F2)
;ROUTINE IN BASIC WHICH SETS
;IMPORTANT Z-PAGE POINTERS,
;CLEARS OUT VARIABLES, RESETS STK
;PTR & THEN ADJUSTS LINKS IN EACH
;PROGRAM LINE.
;EVENTUALLY, EXECUTION FLOWS INTO
;BSC'S WRMSTART (RESTART, $D43C).
;IF THE LOAD CMD WAS CALLED VIA
;THE RUN CMD, EXECUTION BRANCHES
;BACK 2 THE RUNFPINT ($A4DC) PART
;OF THE RUN CMD (AFTER ADJUSTING
;THE STACK).
;IF LOAD WAS NOT CALLED FROM RUN,
;THEN THE THE RESTART ($D43C)
;PORTION OF BASIC EVENTUALLY
;REQUESTS FURTHER PRGM OR KEYBRD
;INPUT & ANOTHER CMD IS PARSED.
*---------------------------------
* LOAD AN INTEGER PROGRAM
*---------------------------------
LODINTGR LDA #1 ;CODE 4 INTEGER BASIC FILE TYPE.
JSR SELCTBSC ;CHK IF INTEGER BASIC IS ACTIVE.
;IF NOT, SWTCH FROM FP 2 INTEGER.
JSR RDADRLEN ;READ 1RST 2 BYTES OF FILE TO GET
;LENGTH OF PRGM TO LOAD.
SEC ;CALC START OF PRGRM.
LDA HIMEM ;(HIMEM - LENADRBF.)
SBC LENADRBF
TAX
LDA HIMEM+1
SBC LENADRBF+1
BCC TOTOOLRG ;LENGTH > HIMEM SO ISSUE ERR MSG.
TAY
CPY LOMEM+1 ;CHK IF PRGM < = LOMEM.
BCC TOTOOLRG ;START OF PRGM TOO LOW, SO GO
BEQ TOTOOLRG ;ISSUE PRGM-TOO-LARGE ERROR MSG.
STY INTPGMST+1 ;SET START-OF-PRGM POINTER.
STX INTPGMST
*=================================
* GO DO THE ACTUAL LOAD.
* (COMMON LOAD ROUT'N FOR
* FP OR INTEGER LOAD CMDS.)
*=================================
LODINTFP STX CURIOBUF ;DESIGNATE LOAD ADDR AS I/O BUF
STY CURIOBUF+1 ;IN THE FM PARAMETER LIST.
JMP CLOSEFM ;USE FILE MANAGER TO LOAD PRGM.
*=================================
* COMMON CODE USED TO READ THE
* BLOAD ADDRESS, BLOAD LENGTH
* OR LOAD LENGTH FROM THE DISK.
*=================================
RDADRLEN LDA ADLENADR ;GET ADR OF TWO-BYTE INPUT BUFFER
STA CURIOBUF ;(LENADRBF, $AA60) FRM RELOCATBL
LDA ADLENADR+1 ;CONSTANTS TBL & DESIGNATE IT AS
STA CURIOBUF+1 ;THE I/O BUF IN THE FM PARM LIST.
LDA #0 ;PUT LENGTH TO READ = 2 BYTES IN
STA LEN2RDWR+1 ;THE FM PARM LIST.
LDA #2
STA LEN2RDWR
LDA #3 ;PUT READ OPCODE IN FM PARM LIST.
STA OPCODEFM
LDA #2 ;INDICATE WANT 2 READ RNG OF BYTS
STA SUBCODFM
JSR FMDRIVER ;GO READ IN THE ADDR (OR LENGTH).
LDA LENADRBF+1 ;GET HI BYTE OF ADR (OR LENGTH)
;JUST READ FROM DISK.
STA LEN2RDWR+1 ;PUT VAL JUST RD IN PARM LIST IN
;CASE JUST READ LENGTH (SO KNOW
;HOW MUCH TO READ WHEN READ MAIN
;BODY OF FILE).
TAY ;SAVE HI BYTE IN (Y).
LDA LENADRBF ;DO LIKEWISE WITH LOW BYTE.
STA LEN2RDWR
RTS
*=================================
* CLOSE FILE & ISSUE A PROGRAM-
* TOO-LARGE ERROR MESSAGE.
*=================================
TOTOOLRG JSR CMDCLOSE ;CLOSE FILE.
JMP TOOLARGE ;ISSUE ERROR MSG.
*=================================
* SELECT DESIRED BASIC
*=================================
* CHK IF DESIRED BASIC IS UP OR NOT
* (SWITCH BASIC IF NECESSARY).
SELCTBSC CMP FILTYPFM ;TYPE WANTED = TYPE FOUND?
BEQ SELBSRTN ;YES - BASIC WANTED IS ACTIVE.
LDX NDX2CMD ;SAVE INDEX 2 PRESENT CMD IN CASE
STX NEXTCMD ;WE ARE USING INTEGER & MUST LOAD
;INTEGER FILE CALLED "APPLESOFT"
;IN ORDER TO LOAD A(RAM).
LSR ;SHIFT TYPE WANTED TO SEE WHICH
;BASIC TO SWITCH INTO.
BEQ SWTCH2FP ;SWITCH FROM INTEGER 2 APPLESOFT.
JMP CMDINT ;SWITCH FROM APPLESOFT 2 INTEGER.
* SWITCHING FROM INT TO APPLESOFT
* SO COPY NAME OF FILE FROM PRIMARY
* TO SECONDARY NAME BUF IN CASE WE
* HAVE TO USE RAM-BASED APPLESOFT.
SWTCH2FP LDX #29 ;30 BYTES TO COPY (0 TO 29).
PRIM2SND LDA PRIMFNBF,X ;GET BYTE FROM PRIMARY.
STA SCNDFNBF,X ;COPY IT TO SECONDARY.
DEX
BPL PRIM2SND ;BRANCH IF MORE BYTES TO COPY.
JMP CMDFP ;EXECUTE THE FP COMMAND.
SELBSRTN RTS ;DESIRED BASIC WAS ACTIVE.
*=================================
* RUN COMMAND HANDLER
*=================================
CMDRUN LDA ACTBSFLG ;CHK WHICH BASIC IS CURRENT.
BEQ LOAD4RUN ;BRANCH IF USING INTEGER BASIC.
STA RUNTRUPT ;SET THE RUN INTERCEPT FLAG TO
;SIGNAL THAT WE ARE ABOUT TO
;INTERRUPT THE RUN COMMAND TO DO
;LOAD. ($40=A(ROM), $80=A(RAM).)
LOAD4RUN JSR CMDLOAD ;GO LOAD THE PROGRAM.
;************* NOTE *************
;* THE "JSR" IS ACTUALLY A *
;* PLACEBO BECAUSE AFTER FILE *
;* IS LOADED, EXECUTION GOES IN2*
;* BASIC & THEN RE-ENTERS DOS *
;* THRU THE DOS INTERCEPTS. ONCE*
;* DOS GETS ITS MITTS BACK INTO *
;* THINGS, THE RUNTRUPT FLAG IS *
;* TESTED & THEN EXECUTION FLOWS*
;* TO THE NEXT INSTRUCTION (AT *
;* RUNFPINT). THE MACHINE DOES *
;* NOT GET LOST BECAUSE THE STK *
;* PTR GETS RESET ACCORDINDLY. *
;********************************
RUNFPINT JSR CRVIADOS ;PRINT A <CR>.
JSR INITIOHK ;RESET THE I/O HKS TO PT TO DOS.
JMP (RUNTRY) ;GO EXECUTE THE PRGM.
;(RUNTRY PTS TO RUNFPROM IF USING
;A(ROM) OR POINTS TO FPRAMRUN
;IF USING A(RAM).)
*=======================================
* INTEGER BASIC'S RUN CMD ENTRY POINT.
* (RUNTRY PTS HERE WHEN INTEGER ACTIVE.)
*=======================================
RUNINTGR LDA LOMEM ;CLEAR OUT ALL VARIABLES.
STA INTVRLND ;ZERO OUT INTEGER BASIC'S CURRENT
LDA LOMEM+1 ;VARIABLE POINTER.
STA INTVRLND+1
JMP (CHAINTRY) ;GO INTO INTEGER BASIC 2 EXECUTE.
*=================================
* CHAIN COMMAND HANDLER
*=================================
CMDCHAIN JSR OPENLOAD ;LOAD THE INTEGER PRGM.
JSR CRVIADOS ;PRINT A <CR>.
JSR INITIOHK ;POINT I/O HOOKS AT DOS.
JMP (CHAINTRY) ;GO INTO INTEGER BASIC 2 EXECUTE.
*=================================
* A(ROM)'S RUN ENTRY POINT.
* (RUNTRY POINTS HERE IF A(ROM)
* BASIC IS ACTIVE.)
*=================================
RUNFPROM JSR SETZPTRS ;CLEAR OUT ALL VARIABLES.
STA PROMPT ;ZERO OUT PROMPT & ON-ERROR FLAG.
STA ERRFLG
JMP NEWSTT ;JUMP INTO BASIC TO EXECUTE PRGM.
*=================================
* A(RAM)'S RUN ENTRY POINT.
* (RUNTRY POINTS HERE IF A(RAM)
* VERSION OF BASIC IS UP.)
*=================================
FPRAMRUN JSR CLRFPRAM ;CLEAR ALL VARIABLES.
STA PROMPT ;ZERO OUT PROMPT & ON ERROR FLAG.
STA ERRFLG
JMP RUNFPRAM ;GO RUN THE PROGRAM.
#