957 lines
27 KiB
Plaintext
957 lines
27 KiB
Plaintext
*=================================
|
||
* 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.)
|
||
|