textfiles/apple/ANATOMY/t.dos.a510.a850.txt

957 lines
27 KiB
Plaintext
Raw Permalink 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.

*=================================
* WRITE COMMAND HANDLER.
*=================================
CMDWRITE JSR COMRDWR ;CALL COMMON READ/WRITE ROUTINE.
;FIND NAMED BUF, ELSE A FREE BUF.
;OPEN FILE IF NOT ALREADY OPEN.
;POS'N FILE PTR IF R- OR B-PARMS
;WERE ISSUED.
LDA #5 ;SET CONDITION 5.
STA OPUTCOND
JMP FINSHCMD ;XIT WITH CONDITION 5 SET SO THAT
;THE NEXT TIME A PRINT STATEMENT
;IS ENCOUNTERED, EXECUTION WILL
;FLOW VIA COUT & THE DOS HKS TO
;SEND CHARS TO THE NAMED FILE.
*=================================
* READ COMMAND HANDLER.
*=================================
CMDREAD JSR COMRDWR ;CALL COMMON READ/WRITE ROUTINE.
;FIND NAMED BUF, ELSE FIND A FREE
;BUFFER. OPEN FILE IF NOT ALREADY
;OPEN. POS'N FILE PTR IF R- OR
;B-PARMS WERE ISSUED WITH CMD.
LDA #1 ;SET CONDNFLG TO SIGNAL READING.
STA CONDNFLG
JMP FINSHCMD ;XIT WITH OPUTCOND=0 & CONDNFLG=1
;EXECUTION EVENTUALLY FLOWS BACK
;INTO APPLESOFT. WHEN APPLESOFT
;PICKS UP A SUBSEQUENT "INPUT" OR
;"GET" STATEMENT, IT PRINTS A
;PROMPT. DOS INTERCEPTS OUTPUT
;VIA OPUTINCP ($9EBD). WHEN THE
;SETTING OF CONDNFLG IS DETECTED,
;THE MACHINE IS DIRECTED TO TAKE
;DATA FROM THE DISK.
*=================================
* CODE COMMON TO READ/WRITE.
*=================================
COMRDWR JSR GETBUFF ;LOCATE A DOS BUF WITH SAME NAME,
;ELSE LOCATE A FREE BUF.
BCC BUFS4RW ;BRNCH IF MATCHING BUF WAS FOUND.
JSR CMDOPEN ;FILE NOT ALREADY OPN, SO OPEN IT
JMP CKRBOPTN ;GO CHK IF R- & B-PARMS ISSUED.
BUFS4RW JSR BUFS2PRM ;COPY ADDRS OF THE VARIOUS DOS
;BUFFERS TO THE FM PARAMETER LIST
* CHK IF R- OR B-PARAMETERS
* WERE ISSUED WITH COMMAND.
CKRBOPTN LDA CUMLOPTN ;CHK IF R- OR B-PARMS ISSUED.
AND #%00000110 ;(R=$04, B=$02.)
BEQ RDWRRTN ;NO - SKIP POS'NING OF FILE PTR.
* COPY B- & R-PARMS FROM OPTION
* PARSED TABLE TO FM PARM LIST.
LDX #3
CPYBPARM LDA RECPRSD,X ;GET VALUE OF PARAMETER.
STA RECNMBFM,X ;STORE IT IN PARM LIST.
DEX ;4 BYTES TO COPY (3 TO 0).
BPL CPYBPARM
* CALL THE FILEMANAGER
* WITH THE POSITION OPCODE.
BK2APND LDA #$0A ;OPCODE FOR POSITION.
STA OPCODEFM ;PUT IT IN THE FM PARAMETER LIST.
JSR FMDRIVER ;CALL FM 2 DO THE POS'N FUNCTION.
RDWRRTN RTS
*=================================
* INIT COMMAND HANDLER.
*=================================
CMDINIT LDA #%01000000 ;CHK TO SEE IF V(OLUME) OPTION
AND CUMLOPTN ;WAS ISSUED WITH INIT COMMAND.
BEQ VOL254 ;NO V-PARM ISSUED, SO USE A DFLT
;VOLUME VALUE OF 254.
LDA VOLPRSD ;A VOL VAL WAS ISSUED, SO USE IT
BNE OTHRVOL ;(BUT ONLY IF IT IS NOT ZERO).
VOL254 LDA #254 ;USE VOL 254 AS DEFAULT VALUE.
STA VOLPRSD
OTHRVOL LDA ADOSTART+1 ;HI BYTE OF DOS LOAD ADDR FROM
;DOS'S MAIN VARIABLE TABLE.
STA SUBCODFM
LDA #11 ;OPCODE FOR INIT COMMAND.
JSR HNDLCMD1 ;CALL FM COMMAND HANDLER TO DO
;THE INIT COMMAND.
JMP CMDSAVE ;GO SAVE THE "HELLO" FILE & THEN
;EXIT TO THE CALLER OF THE INIT
;CMD. (NORMALLY RTNS TO AFTRCMD
;($A17D) LOCATED IN THE COMMAND
;PARSING & PROCESSING ROUTINES.)
*=================================
* CATALOG COMMAND HANDLER.
*=================================
CMDCATLG LDA #6 ;CATALOG OPCODE.
JSR HNDLCMD1 ;CALL CMD HANDLER TO DO CATALOG.
LDA VOLFM ;GET VOLUME # FROM FM PARM LIST
STA VOLPRSD ;& PUT IT IN THE PARSED TABLE.
RTS ;EXIT TO CALLER OF CATALOG CMD.
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
;LOCATED IN THE CMD PARSING AND
;PROCESSING ROUTINES.)
*=================================
* FP COMMAND HANDLER.
*=================================
CMDFP LDA #$4C ;(A) = OPCODE FOR "JMP".
JSR SETROM ;TEST 2 SEE IF LANGUAGE WANTED IS
;ON CARD OR MOTHERBOARD.
BEQ TODOSCLD ;ROM VERSION OF FP WAS PRESENT ON
;EITHER CARD OR MOTHERBOARD SO GO
;DO A COLDSTART.
* USING MACHINE WITH INTEGER IN ROM.
*
* ASSUME USING "SYSTEM MASTER" DISK
* SO TRY TO RUN AN INTEGER PRGM
* CALLED "APPLESOFT". WHEN RUN, THE
* PRGM CALLED "APPLESOFT" LOADS A
* RAM OR DISK-BASED VERSION OF FP
* BASIC THAT IS CONTAINED IN A BINARY
* FILE CALLED "FPBASIC". THIS LATTER
* FILE IS ALSO HOUSED ON THE SYSTEM
* MASTER DISK.
LDA #0 ;SET ACTIVE BASIC FLAG TO DENOTE
STA ACTBSFLG ;USING INTEGER.
LDY #30
JSR BLNK1RST ;BLANK OUT THE PRIMARY FILE NAME
;BUFFER (30 BYTES LONG).
* COPY THE NAME OF THE INTEGER FILE
* CALLED "APPLESOFT" INTO THE PRIMARY
* FILE NAME BUFFER.
LDX #9 ;ONLY 9 CHARS IN NAME "APPLESOFT"
CPYAPPLE LDA RUNTRUPT,X ;GET CHARS OF NAME.
STA PRIMFNBF-1,X ;STORE THEM IN PRIMARY NAME BUF
DEX ;REDUCE COUNTER.
BNE CPYAPPLE ;MORE CHARS TO COPY.
LDA #$C0 ;SET CONDNFLG TO DESIGNATE USING
STA CONDNFLG ;RAM VERSION OF APPLESOFT.
JMP CMDRUN ;GO RUN FILE CALLED "APPLESOFT"
;WHICH LOADS A RAM VERSION OF
;FP BASIC CONTAINED IN A BINARY
;FILE CALLED "FPBASIC".
*=================================
* INT COMMAND HANDLER.
*=================================
CMDINT LDA #$20 ;OPCODE FOR "JSR".
JSR SETROM ;TEST TO SEE IF LANGUAGE WANTED
;IS ON CARD OR MOTHERBOARD.
BEQ INTPRSNT ;INTEGER BASIC IS PRESENT (EITHER
;ON CARD OR MOTHERBOARD).
* INTEGER BASIC NOT PRESENT
* ON CARD OR MOTHERBOARD.
NOLNGINT LDA #1 ;SET ERROR CODE FOR LANGUAGE-NOT-
JMP ERRHNDLR ;AVAILABLE MSG & GO EXIT.
* INTEGER BASIC PRESENT ON DEVICE.
INTPRSNT LDA #0 ;CAUSE DESIRED BASIC IS PRESENT,
STA RUNTRUPT ;ZERO OUT THE RUN INTERCEPT FLAG
;CAUSE WE WON'T BE LOADING A LANG
TODOSCLD JMP DOSCOLD ;GO INTO THE COLDSTART ROUTINE.
*=================================
* SELECT DESIRED BASIC
*=================================
* TEST CARD OR MOTHERBOARD TO INSURE
* THAT DEVICE CONTAINING THE ROM
* VERSION WE WANT IS SELECTED.
* BASICCLD ($E000) CONTAINS A "JMP"
* OR "JSR" INSTRUCTION IF DEALING
* WITH FP OR INTEGER ROM RESPECTIVELY.
SETROM CMP BASICCLD ;TEST CARD OR MOTHERBOARD.
;(IE.CHK WHICHEVER DEVICE IS UP.)
BEQ DVICERTN ;LANG WNTD ON PRESENT ROM DEVICE.
* LANGUAGE WAS NOT ON DEVICE SELECTED
* ABOVE, SO SPECIFICALLY TEST CARD
* IN SLOT 0. (P.S. COULD CHANGE ADDRS
* IF WANT CARD IN DIFFERENT SLOT.)
STA $C080 ;READ ENABLE SLOT0.
CMP BASICCLD ;CHECK IDENTIFYING BYTE.
BEQ DVICERTN ;BRANCH IF ROM WANTED IS ON CARD.
* ROM WANTED WAS NOT ON CARD.
* WE MAY HAVE JUST TESTED CARD TWICE
* SO NOW SPECIFICALLY TEST MOTHERBOARD.
STA $C081 ;TEST MOTHERBOARD.
CMP BASICCLD ;CHECK IDENTIFYING BYTE.
DVICERTN RTS ;EXIT WITH THE SWITCHES POINTING
;AT THE LAST DEVICE TESTED.IF THE
;DESIRED LANGUAGE IS PRESENT, THE
;SWITCHES ARE LEFT WITH THE
;APPROPRIATE DEVICE SELECTED.
*=================================
* EXEC COMMAND HANDLER.
*=================================
CMDEXEC JSR CMDOPEN ;GO OPEN THE FILE TO BE EXECED.
LDA CURFNADR ;GET ADDR OF CURRENT FILENAME BUF
STA EXECBUFF ;& DESIGNATE AS EXEC'S NAME BUF.
LDA CURFNADR+1
STA EXECBUFF+1
LDA PRIMFNBF ;SET EXEC FLAG TO A NON-ZERO VAL.
STA EXECFLAG ;(USE 1RST CHAR OF FILE NAME.)
BNE POSNCHKR ;ALWAYS - GO POS'N FILE PTR IF
;NECESSARY.
;NOTE: ACTUAL EXECING OF STATMNTS
;DOES NOT OCCUR UNTIL AFTER THE
;COMPUTER RETURNS TO BASIC'S
;RESTART ($D43C) ROUTINE. WHEN
;INPUT IS REQUESTED, EXECUTION
;FLOWS VIA DOS HKS INTO OPUTINCP
;($9EBD). HERE THE EXECFLAG IS
;TESTED & DISCOVERED TO BE SET.
;AS RESULT, THE READEXEC ($A682)
;ROUTINE IS USED 2 READ DATA FROM
;THE EXEC FILE. THE STATEMENTS
;ARE INTERPRETED AS IF THEY WERE
;ENCOUNTERED IN THE IMMED MODE.
*=================================
* POSITION COMMAND HANDLER
*=================================
CMDPOSN JSR GETBUFF ;LOCATE BUF WITH SAME NAME, ELSE
;LOCATE A FREE BUFFER.
BCC BUFS4PSN ;ALREADY OPEN -SKIP NEXT INSTRUC.
JSR CMDOPEN ;GO OPEN THE FILE.
JMP POSNCHKR ;BYPASS NEXT INSTRUC, CAUSE JUST
;OPENED FILE & PARM LIST ALREADY
;CONTAINS ADRS OF DIF DOS BUFS.
BUFS4PSN JSR BUFS2PRM ;GET ADR OF DOS BUFS FROM CHAIN
;BUF & PUT THEM IN FM PARM LIST.
POSNCHKR LDA CUMLOPTN ;CHK TO SEE IF A NON-ZERO R-PARM
AND #%00000100 ;WAS ISSUED WITH CMD.
BEQ DONEPOSN ;R-PARM WAS ZERO, SO GO EXIT
;(IE. DON'T MOVE FILE POINTER).
* A NON-ZERO R-PARM WAS ISSUED, SO GO MOVE
* THE FILE POINTER FORWARD BY READING
* ONE BYTE AT A TIME. WHEN A <CR> IS
* ENCOUNTERED, REDUCE THE COUNT OF THE
* RELATIVE FIELD POSITIONS LEFT TO MOVE.
* WHEN THE COUNT EQUALS ZERO, WE ARE
* DONE POSITIONING.
CKPSNDUN LDA RECPRSD ;CHECK COUNT.
BNE POSNMORE
LDX RECPRSD+1
BEQ DONEPOSN ;R-PRM HAS BEEN COUNTED DWN TO 0,
;SO WE ARE DONE POSITIONING.
DEC RECPRSD+1 ;REDUCE COUNT OF R-PARM (IE. # OF
POSNMORE DEC RECPRSD ;FIELDS MOVED FORWARD) FOR NEXT
;TIME AROUND.
PSNFIELD JSR RDTXTBYT ;GO READ A TEXT FILE BYTE.
BEQ ENDATERR ;IF BYTE JUST READ = $00,THEN RAN
;OUT OF DATA. A ZERO BYTE CAN BE
;OBTAINED FROM AN INCOMPLETELY
;FILLED DATA SECTOR. OR, IF THE
;FILE ENDS ON A SECTOR BOUNDARY,
;A $00 CAN ALSO BE ACQUIRED FROM
;A ZEROED-OUT T/S LINK OR A
;ZEROED-OUT DATA PAIR (TRK/SEC
;VALUES) LISTED IN A T/S LIST.
CMP #$8D ;WAS BYT A FIELD-DELIMITING <CR>?
BNE PSNFIELD ;NO -GO READ THE NEXT BYTE IN THE
;SAME FIELD.
BEQ CKPSNDUN ;YES - GOT END-OF-FIELD MARKER SO
;BRANCH BACK TO REDUCE THE FIELD
;COUNT & SEE IF WE'RE DONE
;POSITIONING YET.
DONEPOSN RTS ;EXIT - EITHER DONE POSITIONING,
;ELSE R-PARM WAS 0 TO START WITH
;& THERE4 NO POSITIONING NEEDED.
;EXIT 2 CALLER OF COMMAND. OFTEN
;RETURNS 2 AFTRCMD ($A17D) LOC'D
;IN THE CMD PARSING & PROCESSING
;ROUTINES.
*=================================
* WRITE-ONE-DATA-BYTE SUBROUTINE.
*=================================
WRITEXT JSR CKBSCRUN ;CHK IF BASIC IS RUNNING A PRGM.
BCS CLOSZERO ;NOT RUNNING, SO GO CLOSE FILE,
;RESET TO CONDITION 0 & THEN DO A
;WARMSTART. (REMEMBER, WRITE CMD
;IS RESTRICTED TO DEFERRED MODE.)
LDA ASAVED ;RETRIEVE BYTE TO WRITE.
STA ONEIOBUF ;PUT IT IN FM PARM LIST.
LDA #4 ;SET PARM LIST TO WRITE ONE BYTE.
STA OPCODEFM
LDA #1
STA SUBCODFM
JMP FMDRIVER ;GO TO FM DRV TO WRITE DATA BYTE.
*=================================
* ROUTINE TO READ A DATA BYTE.
*=================================
READTEXT JSR CKBSCRUN ;CHK IF BASIC IS RUNNING A PRGM.
BCS CLOSZERO ;BASIC NOT RUNNING SO GO CLOSE
;FILE, RESET 2 CONDITION 0 & DO A
;WARMSTART. (REMEMBER READ CMD
;IS RESTRICTED 2 DEFERRED MODE.)
LDA #6 ;SET COND'N6 -IGNORE INPUT PROMPT
SETCOND STA OPUTCOND
JSR RDTXTBYT ;GO READ TEXT FILE DATA BYTE.
BNE NOTEND ;IF BYTE READ <> 0, THEN HAVEN'T
;HIT END-OF-FILE MARKER YET.
* RAN OUT OF DATA. PICKED UP A $00 BYTE
* EITHER FROM PARTIALLY FULL DATA SECTOR,
* A ZEROED-OUT T/S LINK OR A ZEROED-OUT
* DATA PAIR (TRK/SEC VALUES LISTED IN A
* T/S LIST).
JSR CLOSEONE ;RAN OUT OF DATA SO CLOSE FILE.
LDA #3 ;USING CONDITION 3?
CMP OPUTCOND ;IE. HNDLING AN INPUT STATEMENT?
BEQ DONEPOSN ;YES - JUST GO TO AN "RTS".
ENDATERR LDA #5 ;NO - THERE4 GOT OUT-OF-DATA ERR.
JMP ERRHNDLR ;GO HANDLE ERROR.
NOTEND CMP #$E0 ;LOWERCASE?
BCC SAVIT ;BRANCH IF UPPERCASE.
AND #$7F ;CONVERT LOWER TO UPPER IN ORDER
;2 FOOL CAPTST ROUTINE ($FD7E)
;IN MONITOR ROM.
SAVIT STA ASAVED ;SAVE CHAR READ.
LDX XSAVED ;GET INDEX TO INPUT BUFFER.
BEQ TOEXIT ;BRANCH IF 1RST CHAR.
DEX ;TURN HI BIT ON IN PREVIOUS CHAR
LDA BUF200,X ;STORED IN BUF200 TO CONVERT TO
ORA #$80 ;LOWERCASE IF NECESSARY.
STA BUF200,X
TOEXIT JMP DOSEXIT ;GO TO DOS'S EXIT ROUTINE.
*==================================
* CHECK IF BASIC IS RUNNING A PRGM.
*==================================
CKBSCRUN PHA ;SAVE (A) ON STK.
LDA ACTBSFLG ;WHICH BASIC IS UP?
BEQ INTBASIC ;BRANCH IF USING INTEGER.
* USING APPLESOFT SO NOW CHECK IF
* IN IMMEDIATE OR DEFERRED MODE.
* (IF LINE NUMBER BYTES ARE
* GREATER THAN OR EQUAL TO DECIMAL
* 65280 ($FF IN HI BYTE), THEN THE
* COMPUTER ASSUMES THAT WE'RE USING
* THE IMMEDIATE MODE.)
LDX CURLIN+1 ;CHK HI BYTE OF LINE #.
INX ;IF $FF --> $00, THEN # > = 65280
BEQ IMEDMODE ;BRANCH IF USING IMMEDIATE MODE.
* FP APPEARS TO BE RUNNING A PRGM
* BUT, MAYBE CURLIN+1 WAS ZAPPED
* (POSSIBLY AS PART OF A PROTECTION
* SCHEME) SO BETTER ALSO CHECK THE
* PROMPT.
LDX PROMPT
CPX #"]" ;USING AN APPLESOFT PROMPT?
BEQ IMEDMODE ;YES - SO MUST BE IN IMMED MODE.
RUNNING PLA ;GET SAVED (A) BACK FROM STK.
CLC ;SIGNAL PRGM IS RUNNING.
RTS
INTBASIC LDA RUNMODE ;CHK INTGR BASIC'S RUN MODE FLG.
BMI RUNNING ;IF NEG, INT BASIC IN DEFERRED.
IMEDMODE PLA ;GET SAVED (A) BACK FROM STK.
SEC ;SIGNAL IN IMMEDIATE MODE.
RTS
*====================================
* CLOSE FILE, SET CONDITION0, & EXIT.
*====================================
CLOSZERO JSR CLOSEONE ;CLOSE OPEN FILE.
JSR RESTAT0 ;RESET TO CONDITION 0.
JMP DOSEXIT ;GO TO DOS'S EXIT ROUTINE.
*=================================
* EXEC'S READ DATA ROUTINE.
*=================================
READEXEC JSR PT2EXEC ;POINT THE A3L/H POINTER AT BUF
;THAT WE'RE EXECING IN.
JSR BUFS2PRM ;COPY ADDRS OF THE VARIOUS DOS
;BUFS FROM THE CHAIN BUF & PUT
;THEM IN THE FM PARAMETER LIST.
LDA #3 ;SET CONDITION 3 SO PROCESS DATA
BNE SETCOND ;INPUT FROM THE DISK.
*=================================
* READ A TEXT FILE BYTE.
*=================================
RDTXTBYT LDA #3 ;SET FM PRM LIST 2 READ ONE BYTE.
STA OPCODEFM
LDA #1
STA SUBCODFM
JSR FMDRIVER ;CALL FM DRIVER TO READ A BYTE.
LDA ONEIOBUF ;LOAD (A) WITH BYTE JUST READ.
RTS
*=================================
* POINT THE A3L/H POINTER AT
* BUFFER THAT WE'RE EXECING IN.
*=================================
PT2EXEC LDA EXECBUFF+1 ;GET ADR OF DOS BUF USING 2 EXEC.
STA A3L+1 ;PUT IT IN POINTER.
LDA EXECBUFF
STA A3L
RTS
*=================================
* THE FILE MANAGER DRIVER.
*=================================
FMDRIVER JSR FILEMGR ;CALL FM MANAGER TO DO FUNCTION.
* RETURN HERE AFTER DOING THE FUNCTION.
* (CAUSE, USE STACK TO GET BACK TO
* ORIGINAL CALLER OF FUNCTION.)
* IF WE JUST DID A READ FUNCTION &
* THE LAST BYTE READ WAS FROM A DATA
* SECTOR, THEN ENTER WITH (C)=0.
* (NOTE THAT IT MAKES NO DIFFERENCE
* IF THAT DATA BYTE WAS A $00 OR NOT.)
* HOWEVER, IF WE ARE DEALING WITH A
* ZEROED-OUT T/S LINK OR A ZEROED-OUT
* DATA-PAIR BYTE FROM A T/S LIST,
* THEN ENTER WITH CARRY SET.
AFTRFUNC BCC FMDRVRTN ;(C) = 0 = NO ERRORS.
LDA RTNCODFM ;GET RETURN CODE FRM FM PARM LIST
CMP #5 ;"END-OF-DATA" ERROR?
BEQ TOAPPTCH ;YES -NOT HANDLED LIKE OTHER ERRS
;FILE ENDS AT A FULL DATA SEC SO
;WE ENCOUNTERED A ZEROED-OUT T/S
;LINK OR A ZEROED-OUT DATA PAIR
;(TRK/SEC VALUES LISTED IN A T/S
;LIST).
JMP OTHRERR ;ONLY TAKE IF GOT AN ERROR OTHER
;THAN AN END-OF-DATA ERROR.
TOAPPTCH JMP APNDPTCH ;GO HANDLE END-OF-DATA ERROR.
NOP
BK2FMDRV JSR CKIFAPND ;<---NOTE: APNDPTCH RETURN HERE!!
;GO CHK IF THE APPEND FLAG IS ON.
LDX #0 ;ZERO-OUT THE ONE-DATA-BYTE BUF
STX ONEIOBUF ;IN THE FM PARAMETER LIST. (ALSO
;REFERRED TO AS THE LOW BYTE OF
;CURIOBUF.)
FMDRVRTN RTS ;RETURN TO CALLER OF FM DRIVER.
*=================================
* SELECTED ERROR PROCESSING.
*=================================
* NOTE: PROGRAMMERS WHO ACCESS DOS
* FROM ASSEMBLY LANGUAGE PROGRAMS
* SHOULD TAKE SPECIAL NOTE OF THE
* THE FORMATTED DISASSEMBLY TITLED
* "DISASSEMBLY OF ERRORS".
SYNTXERR LDA #11
BNE ERRHNDLR ;ALWAYS.
NOBUFERR LDA #12
BNE ERRHNDLR ;ALWAYS.
TOOLARGE LDA #14
BNE ERRHNDLR ;ALWAYS.
TYPMISM LDA #13
*=================================
* DOS'S MAIN ERROR-HANDLER ROUTINE
*=================================
ERRHNDLR STA ASAVED ;SAVE RETURN CODE FOR LATER USE.
JSR RESTATIN ;RESET THE FOLLOWING FLAGS TO 0:
; OPUTCOND, CONDNFLG & RUNTRUPT.
LDA ACTBSFLG ;CHK IF INT OR FP BASIC ACTIVE.
BEQ WASINT ;BRANCH IF USING INTEGER.
;(ONERR FLAG NOT APPLIC TO INT.)
LDA ERRFLG ;CHK IF BASIC'S ONERR FLAG IS ON.
BMI ONERRACT ;YES - SKIP PRINTING OF ERROR MSG
;CAUSE WE EVENTUALLY WANT 2 GO 2
;OUR OWN CUSTOMIZED ERROR-HNDLING
;ROUTINE.
WASINT LDX #0 ;INITIALIZE INDEX TO TABLE OF
;OFFSETS TO ERRORS.
JSR PRDOSERR ;GO PRINT <RTN>, BELL, <RTN>.
LDX ASAVED ;GET SAVED RETURN CODE.
JSR PRDOSERR ;GO PRINT THE ERROR MESSAGE.
JSR CRVIADOS ;PRINT A <CR>.
ONERRACT JSR INITIOHK ;RESET I/O HKS TO POINT TO DOS.
JSR CKBSCRUN ;CHK IF BASIC IS RUNNING A PRGM:
; (C) = 0 IF RUNNING.
; (C) = 1 IF IMMEDIATE.
LDX ASAVED ;GET SAVED RETURN CODE.
LDA #3 ;SET (A) = 3 IN CASE FALL THRU TO
;GO TO BASIC'S ERROR HANDLING
;ROUTINE. THE MAGIC # OF 3 ALLOWS
;BSCERHLR ($D865) TO CONDITION
;(C) = 0 AND (Z) = 1 IN ORDER TO
;COMPLY WITH THE BASIC ROUTINE
;THAT IS RESPONSIBLE FOR PRINTING
;BASIC'S ERROR MESSAGES.
BCS DOWRM ;BASIC IS NOT RUNNING.
TOBSCERR JMP (ADBSCERR) ;2 BASIC'S ERROR HANDLING ROUTINE
;(BSCERHLR, $D865).
DOWRM JMP (TOWRMVEC) ;TO BASIC'S WARMSTART ROUTINE
;(RESTART, $D43C).
*=================================
* PRINT THE DOS ERROR MESSAGE.
*=================================
PRDOSERR LDA OFF2ERR,X ;USE ERROR CODE TO GET OFFSET TO
;ERROR MESSAGE.
TAX ;(X) = OFFSET INTO THE TABLE
;CONTAINING THE TEXT OF THE DOS
;ERROR MESSAGES.
MORERMSG STX TEMPBYT ;SAVE OFFSET INTO TXT TABLE.
LDA ERRTXTBL,X ;GET CHAR OF ERROR MESSAGE.
PHA ;SAVE IT ON STACK.
ORA #$80 ;TURN HI BIT ON 2 SATISFY MONITOR
JSR GODSPLY ;GO PRINT VIA TRUE OUTPUT HANDLER
LDX TEMPBYT ;RESET OFFSET TO TABLE OF TEXT.
INX ;KICK INDEX UP FOR NXT CHR OF MSG
PLA ;GET ORIG CHAR BACK IN (A).
BPL MORERMSG ;BRANCH IF MORE CHRS IN MSG 2 PRT
RTS ;ALL BUT LAST CHR IN MSG ARE POS.
*=================================
* PUT VOL, DRV, AND SLOT VALUES
* PLUS THE ADR OF THE PRIMARY FILE
* NAME BUFFER IN FM PARAMETER LIST
*=================================
CPY2PARM LDA VOLPRSD ;FROM PARSED TABLE.
STA VOLFM
LDA DRVPRSD ;FROM PARSED TABLE.
STA DRVFM
LDA SLOTPRSD ;FROM PARSED TABLE.
STA SLOTFM
LDA ADRPFNBF ;GET THE ADR OF THE PRIMARY FILE
STA FNAMBUFM ;NAME BUF FROM THE CONSTANTS TBL
LDA ADRPFNBF+1 ;AND PUT IT IN THE FM PARM LIST.
STA FNAMBUFM+1
LDA A3L ;SAVE ADR OF CURRENT DOS FILENAME
STA CURFNADR ;BUF IN TABLE OF DOS VARIABLES.
LDA A3L+1
STA CURFNADR+1
RTS
*===================================
* COPY NAME OF FILE FROM THE PRIMARY
* FILENAME BUFFER TO THE APPROPRIATE
* DOS NAME BUFFER LOCATED IN THE
* CHAIN OF DOS BUFFERS.
* THIS ASSIGNS (OR RE-ASSIGNS) A DOS
* BUFFER TO THE FILE WE WANT TO OPEN.
* THE HIGHEST NUMBERED (LOWEST IN
* MEMORY) FREE DOS BUFFER IS USED.
*===================================
CPYPFN LDY #29 ;30 BYTES TO COPY (0 TO 29).
CPYPRIM LDA PRIMFNBF,Y ;GET CHAR FROM PRIMARY.
STA (A3L),Y ;STORE IT IN DOS NAME BUF.
DEY ;REDUCE COUNTER.
BPL CPYPRIM ;MORE CHARS TO COPY.
RTS
*====================================
* GET THE ADDRS OF THE VARIOUS DOS
* BUFS FROM THE CURRENT DOS CHAIN
* BUF & PUT THEM IN THE FM PARM LIST.
*====================================
BUFS2PRM LDY #30 ;GET ADR OF FM WORK BUF, T/S LIST
ADRINPRM LDA (A3L),Y ;BUF, DATA SECTOR BUF & NEXT
STA WRKBUFFM-30,Y ;DOS FILE NAME BUF FROM CHAIN
INY ;PTRS BUF & PUT IN FM PARM LIST.
CPY #38 ;(PS. ADDR OF NEXT DOS FILE NAME
BNE ADRINPRM ;BUF IS NOT USED BY DOS.)
RTS
*=================================
* RESET CONDNFLG & OPUTCOND TO 0.
*=================================
RESTAT0 LDY #0
STY CONDNFLG
STY OPUTCOND
RTS
*==================================
* LOCATE BUFFER WITH SAME NAME.
* IF THAT FAILS, LOCATE A FREE BUF.
*==================================
GETBUFF LDA #0 ;DEFAULT HI BYTE OF PTR TO 0.
STA A5L+1 ;(IE. ASSUME NO FREE BUFS AVAIL.)
JSR GETFNBF1 ;PT A3L/H AT 1RST DOS FILE NAME
;BUFFER IN THE DOS BUFFER CHAIN.
JMP FNCHAR1 ;GO GET 1RST CHR OF NAME FRM BUF.
GETFNLNK JSR GETNXBUF ;GET ADR OF NXT NAME BUF IN CHAIN
;FROM CHAIN POINTERS BUF(WHICH IS
;OFFSET 37 & 36 BYTES FROM 1RST
;CHAR OF PRESENT FILE NAME BUF).
BEQ NOFNMTCH ;LINK ZEROED OUT=END OF BUF CHAIN
FNCHAR1 JSR GETFNBY1 ;GET 1RST CHR OF NAME FRM NAM BUF
BNE NXFNBUF ;TAKE BRANCH IF BUF NOT FREE.
LDA A3L ;BUF WAS FREE, THERE4 POINT THE
STA A5L ;A5L/H POINTERS AT THE FREE BUF.
LDA A3L+1
STA A5L+1
BNE GETFNLNK ;ALWAYS.
NXFNBUF LDY #29 ;BUF WASN'T FREE SO CMP NAME OF
CMPFNCHR LDA (A3L),Y ;OWNER WITH NAME OF FILE IN
CMP PRIMFNBF,Y ;PRIMARY FILE NAME BUF. (START
;WITH LAST CHAR FIRST.)
BNE GETFNLNK ;CHAR DIDN'T MATCH, SO LOOK FOR
;ANOTHER BUF THAT MIGHT HAS SAME
;FILE NAME.
DEY ;THAT CHAR MATCHED. HOW ABOUT
;REST OF CHARS IN NAME?
BPL CMPFNCHR ;30 CHARS IN NAME (IE. 0 TO 29).
CLC ;(C)=0 TO SIGNAL NAMES MATCHED.
RTS
NOFNMTCH SEC ;LINK ZEROED OUT.
RTS
*===================================
* POINT THE A3L/H POINTER AT THE
* FIRST DOS FILE NAME BUFFER IN
* THE DOS BUFFER CHAIN. (IE. LOWEST
* NUMBERED BUFFER, BUT HIGHEST IN
* MEMORY.)
*===================================
GETFNBF1 LDA ADOSFNB1 ;GET 1RST LINK TO CHAIN OF BUFS.
LDX ADOSFNB1+1
BNE SETNXPTR ;ALWAYS.
*=================================
* GET ADR OF NXT FILENAME BUF IN
* CHAIN FROM THE CURRENT CHAIN
* POINTERS BUF (WHICH IS OFFSET
* 37 & 36 BYTES FROM 1RST CHAR
* IN PRESENT DOS FILE NAME BUF).
*---------------------------------
GETNXBUF LDY #37 ;OFFSET TO CHAIN BUF.
LDA (A3L),Y ;PICK UP ADR OF NEXT NAME BUF.
BEQ GETNXRTN ;IF HI BYTE=$00, LINK ZEROED OUT.
TAX ;SAVE HI BYTE IN (X).
DEY ;OFFSET FOR LOW BYTE.
LDA (A3L),Y ;PUT ADR OF FILE NAME BUF IN PTR.
SETNXPTR STX A3L+1 ;PUT HI BYTE IN POINTER.
STA A3L ;PUT LOW BYTE IN POINTER.
TXA ;GET HI BYTE BACK IN (A).
GETNXRTN RTS
*=================================
* GET 1RST CHAR OF FILE NAME
* FROM DOS FILE NAME BUFFER.
*=================================
GETFNBY1 LDY #0 ;BUF IS FREE IF 1RST BYTE = $00.
LDA (A3L),Y ;ELSE 1RST BYTE = 1RST CHAR OF
RTS ;NAME OF FILE WHICH OWNS BUF.
*=================================
* CHECK IF THE CURRENT FILE NAME
* BUFFER BELONGS TO AN EXEC FILE.
* (AFTER ALL, WE DON'T WANT TO
* PREMATURELY CLOSE A FILE IF WE
* ARE USING IT TO EXEC - WOULD BE
* LIKE BURYING OURSELVES ALIVE).
*=================================
CKEXCBUF LDA EXECFLAG ;CHK TO SEE IF EXECING.
BEQ NOTEXCBF ;BRANCH IF NOT EXECING.
LDA EXECBUFF ;WE ARE EXECING, THERE4 CHK IF BUF
CMP A3L ;BELONGS TO THE EXEC FILE.
BNE CKEXCRTN ;NO.
LDA EXECBUFF+1 ;MAYBE - LOW BYTES MATCHED SO
CMP A3L+1 ;CHK HI BYTES OF ADR.
BEQ CKEXCRTN ;YES, EXEC BUF = CURRENT BUF.
NOTEXCBF DEX ;NOT EXECING, SO REDUCE (X) TO
;MAKE SURE THAT Z-FLAG IS OFF.
;(PS. (X) WAS ORIG CONDITIONED TO
;A LARGE NON-ZERO VAL ON ENTRY
;TO GETFNBF1, THERE4, IF NOW DEX,
;THEN INSURE Z-FLAG OFF.)
CKEXCRTN RTS ;EXIT WITH:
; Z-FLAG = 1 IF EXECING.
; = 0 IF NOT EXECING.
*======================================
* CHK IF FILE TYPE WANTED = TYPE FOUND.
*======================================
CHKFTYPE EOR FILTYPFM ;TYPE FOUND (VIA OPEN FUNCTION).
BEQ CKTYPRTN ;BRNCH IF TYPE WANTED=TYPE FOUND.
AND #%01111111 ;MAYBE MATCHED-DISREGARD LOCK BIT
BEQ CKTYPRTN ;BRANCH IF MATCHED.
JSR CMDCLOSE ;NAMED FILE IS WRONG TYPE, SO GO
JMP TYPMISM ;CLOSE FILE & EXIT WITH A TYPE-
;MISMATCH ERROR MESSAGE.
CKTYPRTN RTS ;TYPE WANTED = TYPE FOUND.
*=================================
* BUILD THE DOS BUFFERS.
*=================================
* POINT A3L/H AT FILENAME FIELD
* IN THE LOWEST NUMBERD (HIGHEST
* IN MEMORY) DOS BUFFER.
BILDBUFS SEC ;IRREL, MIGHT AS WELL BE A "NOP".
LDA ADOSFNB1 ;GET ADDR OF 1RST FILE NAME FIELD
STA A3L ;& PUT IT IN A3L/H POINTER.
LDA ADOSFNB1+1
STA A3L+1
* GET # OF MAXFILES WANTED & STORE
* IT IN THE COUNTER (TEMPBYT).
LDA MXFILVAL
STA TEMPBYT
* FREE BUFFER BY ZEROING OUT THE
* FIRST BYTE OF THE DOS BUFFER'S
* FILE NAME FIELD.
ZDOSBUFN LDY #0
TYA
STA (A3L),Y
* POINT LINK IN CHAIN POINTERS BUF
* AT FM WORK AREA BUFFER.
LDY #30 ;SET (Y) TO INDEX 1RST LINK IN
;CHAIN POINTERS BUFFER.
SEC
LDA A3L ;SUBT 45 FROM LOW BYTE OF ADDR
SBC #45 ;OF NAME BUF TO CALC LOW BYTE OF
STA (A3L),Y ;ADDR OF FM WORK BUF & PUT IT IN
PHA ;THE CHAIN PTR BUF & ON THE STK.
LDA A3L+1 ;SUBT (C) FROM HIGH BYTE OF ADR
SBC #0 ;OF NAME BUF TO GET HI BYTE OF
;FM WRK BUF ADR.
INY ;KICK UP (Y) TO INDEX ADDR OF HI
;BYTE OF LINK IN CHAIN POINTERS.
STA (A3L),Y ;STORE HI BYTE OF ADR OF FM WRK
;BUF IN THE LINK.
;(NOTE: ABOVE CALCS EFFECT (A)
;BUT NOT A3L/H.)
* POINT LINK IN CHAIN POINTERS BUFFER
* AT T/S LIST SECTOR BUFFER.
TAX ;PUT HI BYTE OF ADDR OF FM WRK BUF
DEX ;IN (X) & KICK IT DOWN SO IT
;INDEXES HI BYTE OF T/S LIST BUF.
;(T/S LST BUF = $100 BYTES LONG.)
PLA ;GET LOW BYTE OF ADDR OF FM WRK
PHA ;BACK FROM STK.
INY ;KICK UP INDEX TO LINK IN CHAIN
;POINTERS BUFFER.
STA (A3L),Y ;PUT LOW BYTE OF FM WRK BUF ADR
;IN LINK BUFFER'S POINTERS.
TXA ;GET HI BYTE T/S LIST BUF IN (A).
INY ;KICK UP INDEX IN CHAIN BUF.
STA (A3L),Y ;PUT HI BYTE OF LINK IN PTRS BUF.
* POINT LINK IN CHAIN POINTERS BUF
* AT DATA SECTOR BUFFER.
TAX ;PUT HI BYTE OF ADDR OF T/S LIST
DEX ;BUF IN (X) & KICK IT DOWN TO
;CORRESPOND TO HI BYTE OF ADDR
;OF DATA SEC BUF.
PLA ;GET LOW BYTE OF T/S LIST SEC BUF
PHA ;FROM STACK & USE IT FOR LOW BYTE
;OF DATA SEC BUF (CAUSE THEY ARE
;EXACTLY 1 PAGE APART).
INY ;KICK UP INDEX TO CHAIN BUF.
STA (A3L),Y ;PUT LOW BYTE OF DATA SEC BUF
;IN LINK.
INY ;KICK UP INDEX TO CHAIN BUF.
TXA ;GET HI BYTE OF ADR OF T/S LIST
STA (A3L),Y ;BUF & DESIGN8 AS HI BYT OF LINK.
* REDUCE COUNTER FOR # OF BUFS TO BUILD.
DEC TEMPBYT ;IF COUNTER GOES TO 0, THEN JUST
BEQ ZLNK2NXT ;DID LAST BUF & SHOULD 0 OUT LNK.
* NOT DONE ALL BUFS YET SO POINT
* LINK IN CHAIN POINTERS BUFFER
* AT NEXT FILE NAME FIELD.
TAX ;SET (X) = LOW BYTE OF ADR OF DATA
;SECTOR BUFFER.
PLA ;GET LOW BYTE OF ADDR OF DATA
;SECTOR BUF BACK OFF STK.
SEC ;SUBT 38 FROM LOW BYTE OF DATA SEC
SBC #38 ;ADR TO INDEX NEXT NAME BUF.
INY ;KICK UP INDEX TO CHAIN BUF.
STA (A3L),Y ;STORE LOW BYTE OF ADR OF NEXT
PHA ;NAME BUF IN LINK & THEN SAVE
;IT ON STK.
TXA ;GET HI BYTE OF ADR OF DATA SEC
SBC #0 ;BUF FROM (X) & SUBT (C) (IN CASE
;CROSS PAGE BOUNDARY) TO GET
;(A) = HI BYTE OF NEXT NAME BUF.
INY ;KICK INDEX UP TO CHAIN PTRS BUF
STA (A3L),Y ;& STORE HI BYTE OF NEXT NAME BUF
;IN LINK.
* POINT A3L/H AT NEXT NAME BUF.
STA A3L+1
PLA
STA A3L
JMP ZDOSBUFN ;GO BACK TO FREE NEXT NAME BUF
;& BUILD MORE DOS BUFFERS.
* NO MORE BUFS TO BUILD SO ZERO OUT
* THE LINK THAT WOULD NORMALLY POINT
* TO THE NEXT NAME BUFFER.
ZLNK2NXT PHA ;SAVE LOW BYTE OF ADR OF DATA BUF
;ON STK.
LDA #0 ;ZERO OUT LINK TO NEXT NAME BUF.
INY
STA (A3L),Y
INY
STA (A3L),Y
* CHK WHICH BASIC IS ACTIVE.
LDA ACTBSFLG ;CHK IF ACTV BASIC IS FP OR INT.
BEQ SETINTPT ;BRANCH IF INTEGER.
* USING APPLESOFT, SO INITIALIZE
* MEMSIZ & FRETOP (STRING STORAGE)
* TO A VALUE 1 BYTE GREATER THAN
* HIGHEST MEMORY LOCATION AVAILABLE
* TO BASIC PROGRAM.
PLA
STA MEMSIZ+1
STA FRETOP+1
PLA
STA MEMSIZ
STA FRETOP
RTS ;EXIT TO CALLER OF MAXFILES CMD.
;(USUALLY EXITS 2 AFTRCMD ($A17D)
;LOCATED IN THE DOS CMD PARSING
;AND PROCESSING ROUTINES.)
* USING INTEGER, SO SET HIMEM AND
* PROGRAM POINTER (INTPGMST).
SETINTPT PLA
STA HIMEM+1
STA INTPGMST+1
PLA
STA HIMEM
STA INTPGMST
RTS ;EXIT TO CALLER OF MAXFILES CMD.
;(USUALLY EXITS 2 AFTRCMD ($A17D)
;LOCATED IN THE DOS CMD PARSING
;AND PROCESSING ROUTINES.)
O