******************************** * QUICKFILE HANDLER 1.0 * FOR MC3 * DANIEL TUFVESSON 2013-2014 ******************************** ******************************** * MONITOR LABLES ******************************** RETURN EQU $C000 RETURN TO PROMPT OUTCHAR EQU $C003 OUTPUT CHAR ON CONSOLE INCHAR EQU $C006 INPUT CHAR FROM CONSOLE AND ECHO PDATA EQU $C009 PRINT TEXT STRING @ X ENDED BY $04 OUT2HS EQU $C012 PRINT 2 HEX CHARS @ X OUT4HS EQU $C015 PRINT 4 HEX CHARS @ X BADDR EQU $C01E INPUT ADDRESS TO X. CARRY SET = OK CONSVEC EQU $7FE5 CONSOLE STATUS VECTOR CONOVEC EQU $7FE8 CONSOLE OUTPUT VECTOR CONIVEC EQU $7FEB CONSOLE INPUT VECTOR ******************************** * CF REGS ******************************** CFBASE EQU $8060 CFREG0 EQU CFBASE+0 DATA PORT CFREG1 EQU CFBASE+1 READ: ERROR CODE, WRITE: FEATURE CFREG2 EQU CFBASE+2 NUMBER OF SECTORS TO TRANSFER CFREG3 EQU CFBASE+3 SECTOR ADDRESS LBA 0 [0:7] CFREG4 EQU CFBASE+4 SECTOR ADDRESS LBA 1 [8:15] CFREG5 EQU CFBASE+5 SECTOR ADDRESS LBA 2 [16:23] CFREG6 EQU CFBASE+6 SECTOR ADDRESS LBA 3 [24:27 (LSB)] CFREG7 EQU CFBASE+7 READ: STATUS, WRITE: COMMAND ******************************** * VARIABLES ******************************** ORG $0080 IOPUSR RMB 1 USER IO PAGE CFSIZ3 RMB 1 CARD LBA SIZE CFSIZ2 RMB 1 CFSIZ1 RMB 1 CFSIZ0 RMB 1 CFLBA3 RMB 1 CARD LBA POSITION CFLBA2 RMB 1 CFLBA1 RMB 1 CFLBA0 RMB 1 SFNAME RMB 24 TEMPORARY FILE NAME STORAGE FOR SEARCH * || SAME NAMELE EQU 24 QUICKFILE NAME LENGTH TEMP RMB 2 GENERAL TEMPORARY STORAGE RUNFLG RMB 1 RUN FLAG - SET TO EXECUTE AFTER LOAD ******************************** * START OF PROGRAM ******************************** ORG $D000 JMP START TCRLF FCB $0D,$0A,$04 TPROMPT FCC ">> " FCB $04 TQUIT FCC "QUIT" FCB $04 TCATALO FCC "CATALOG " FCB $04 TSAVE FCC "SAVE " FCB $04 TLOAD FCC "LOAD " FCB $04 TRUN FCC "RUN " FCB $04 TDELETE FCC "DELETE " FCB $04 TATTR FCC "ATTRIBUTE " FCB $04 TINFO FCC "INFO " FCB $04 TNAME FCC "NAME " FCB $04 TFORMAT FCC "FORMAT " FCB $04 TERR FCC "ERROR " FCB $04 TOK FCC "OK" FCB $0D,$0A,$04 TNSL FCC "NO SPACE LEFT" FCB $0D,$0A,$04 TFNF FCC "FILE NOT FOUND" FCB $0D,$0A,$04 TLOADIN FCC "LOADING" FCB $0D,$0A,$04 TDENIED FCC "DENIED" FCB $0D,$0A,$04 TSTART FCC " START:" FCB $04 TEND FCC " END:" FCB $04 TINHDR FCC "NAME ATTR LOAD SIZE" FCB $0D,$0A,$04 TCONFIR FCC "TYPE 'YES' TO CONFIRM" FCB $0D,$0A,$04 TFORMA FCB $0D,$0A FCC "FORMATTING" FCB $0D,$0A,$04 THELP FCC "HELP" FCB $0D,$0A FCC " QUICKFILE 1.0" FCB $0D,$0A FCC " C - CATALOG" FCB $0D,$0A FCC " S - SAVE" FCB $0D,$0A FCC " L - LOAD" FCB $0D,$0A FCC " R - RUN LOAD" FCB $0D,$0A FCC " D - DELETE" FCB $0D,$0A FCC " N - NAME" FCB $0D,$0A FCC " A - ATTRIBUTE" FCB $0D,$0A FCC " I - INFO" FCB $0D,$0A FCC " F - FORMAT" FCB $0D,$0A FCC " Q - QUIT" FCB $0D,$0A,$04 START LDAA $0002 STAA IOPUSR SAVE USER I/O PAGE ANDA #$0F CMPA #$00 WAS THE USER I/O PAGE 0? BNE SETIO IF NOT. CONTINUE LDAA #$87 STAA IOPUSR SET USER I/O PAGE 7 INSTEAD OF 0 SETIO LDAA #$80 STAA $0002 SELECT I/O PAGE 0 CLR CFLBA3 CLR CFLBA2 CLR CFLBA1 CLR CFLBA0 JSR CFINIT JSR CFCHERR CHECK FOR ERROR BCC *+5 JMP END * OBTAIN CF SIZE LDAA #$EC DRIVE ID COMMAND STAA CFREG7 LDX #SECSTO JSR CFREDA READ DRIVE ID JSR CFCHERR BCC *+5 JMP END LDAA SECSTO+123 GET CF LBA SIZE STAA CFSIZ3 LDAA SECSTO+122 STAA CFSIZ2 LDAA SECSTO+121 STAA CFSIZ1 LDAA SECSTO+120 STAA CFSIZ0 LDX #TCRLF JSR PDATA PROMPT CLR RUNFLG LDX #TPROMPT JSR PDATA JSR CONIVEC ANDA #$DF TO UPPER CASE CMPA #'Q QUIT BNE *+5 JMP QUIT CMPA #'C CATALOG BNE *+5 JMP CATALOG CMPA #'S SAVE BNE *+5 JMP SAVE CMPA #'L LOAD BNE *+5 JMP LOAD CMPA #'R RUN BNE *+5 JMP RUN CMPA #'D DELETE BNE *+5 JMP DELETE CMPA #'A ATTRIBUTE BNE *+5 JMP ATTR CMPA #'I INFO BNE *+5 JMP INFO CMPA #'N NAME BNE *+5 JMP NAME CMPA #'F FORMAT BNE *+5 JMP FORMAT CMPA #'H HELP BNE *+5 JMP HELP LDAA #'? JSR OUTCHAR LDX #TCRLF JSR PDATA BRA PROMPT END JMP RETURN QUIT LDAA IOPUSR STAA $0002 RESTORE USER IO PAGE LDX #TQUIT JSR PDATA JMP RETURN ******************************** * CATALOG ROUTINE ******************************** CATALOG LDX #TCATALO JSR PDATA JSR CLSFNAM LDX #SFNAME JSR INAME BCS *+5 JMP CATABO ABORT LDX #TCRLF JSR PDATA CLR CFLBA3 CLEAR LBA POSITION CLR CFLBA2 CLR CFLBA1 CLR CFLBA0 * FILE CATALOG LOOP CATLOP JSR CONSVEC CHECK FOR KEYSTROKE CMPA #0 BEQ *+5 JMP CATSTOP STOP CATALOG LOOP ON KEYSTROKE JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 READ ONE SECTOR LDAA #$20 READ SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFREDA JSR CFCHERR CHECK FOR ERROR BCC *+5 JMP CATEND * CHECK IF FILE SOULD BE DISPLAYED JSR VALHDR VALIDATE PARTITION HEADER BCC CATNXT LDAA FSPTYPE CHECK PARTITION TYPE CMPA #$01 BNE CATNXT LDAA QFTYPE CHECK QUICKFILE TYPE CMPA #$01 BNE CATNXT LDAA SFNAME CMPA #$00 CHECK IF NAME FILTER IS PROVIDED BEQ CATNCHK JSR NAMCMP BCC CATNXT CATNCHK LDAA #$20 JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR * LDX #CFLBA3 PRINT PARTITION NUMBER * JSR OUT4HS LDX #QFNAME JSR PFNAME LDAA #$20 PRINT FILE ATTRIBUTES JSR OUTCHAR JSR OUTCHAR JSR PRATTR * END OF FILE LINE LDX #TCRLF JSR PDATA * SET NEXT SECTOR ADDRESS CATNXT LDX CFLBA3 INX STX CFLBA3 * CHECK IF ALL PARTITIONS HAVE BEEN READ LDAA CFSIZ3 CMPA CFLBA3 BEQ *+5 JMP CATLOP LDAA CFSIZ2 CMPA CFLBA2 BEQ *+5 JMP CATLOP CATEND JMP PROMPT CATSTOP JSR CONIVEC FLUSH KEYSTROKE BRA CATEND CATABO LDX #TCRLF REGULAR ABORT JSR PDATA JMP PROMPT ******************************** * SAVE FILE ******************************** SAVE LDX #TSAVE JSR PDATA JSR EMPTY LOOK FOR EMPTY SPACE ON DEVICE BCS SAVHDR EMPTY SPACE FOUND LDX #TCRLF JSR PDATA LDX #TNSL NO SPACE LEFT JSR PDATA JMP PROMPT * SET FILE HEADER DATA SAVHDR JSR CLRQF CLEAR QUICKFILE HEADER LDX #QFNAME JSR INAME BCS *+5 JMP SAVABT ABORT SAVE LDAA QFNAME CMPA #$00 BEQ SAVABT NO EMPTY FILE NAME LDAA #$01 PARTITION TYPE STAA FSPTYPE LDAA #$01 QUICKFILE TYPE STAA QFTYPE LDAA #%00000111 ATTRIBUTES STAA QFATTR LDX #TSTART START ADDRESS JSR PDATA JSR BADDR BCC SAVABT STX QFLOAD LDX #TEND END ADDRESS JSR PDATA JSR BADDR BCC SAVABT STX TEMP LDX #TCRLF JSR PDATA * CALCULATE LENGTH OF FILE LDAA QFLOAD SAVLEL INCA INCA INC QFSIZE+1 INC QFPREL+1 CMPA TEMP BLS SAVLEL BRA SAVBEG SAVABT LDX #TCRLF JSR PDATA JMP PROMPT SAVNSL LDX #TNSL NO SPACE LEFT JSR PDATA JMP PROMPT * STORE FILE DATA SAVBEG LDX #$0001 SET FILE DATA LBA (xxxx0001) STX CFLBA1 JSR CFSLBA SET LBA LDAA QFPREL+1 STAA CFREG2 NUMBER OF SECTORS TO WRITE LDAA #$30 WRITE SECTOR COMMAND STAA CFREG7 LDX QFLOAD JSR CFWRDAI JSR CFWAIT JSR CFCHERR CHECK FOR ERROR BCS SAVABT * STORE QUICKFILE HEADER LDX #$0000 SET HEADER LBA (xxxx0000) STX CFLBA1 JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 WRITE ONE SECTOR LDAA #$30 WRITE SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFWRDA JSR CFWAIT JSR CFCHERR CHECK FOR ERROR BCS SAVABT SAVEND LDX #TOK JSR PDATA JMP PROMPT ******************************** * RUN FILE ******************************** RUN LDX #TRUN JSR PDATA INC RUNFLG ******************************** * LOAD FILE ******************************** LOAD LDX #TLOAD JSR PDATA JSR CLSFNAM LDX #SFNAME INPUT FILE NAME TO LOAD JSR INAME BCC LOADAB ABORT LOAD LDAA SFNAME CMPA #$00 BEQ LOADAB ABORT LOAD LDX #TCRLF JSR PDATA JSR SEARCH SEARCH FOR FILE BCS LOADBEG LDX #TFNF FILE NOT FOUND JSR PDATA LOADE JMP PROMPT LOADAB LDX #TCRLF LOAD ABORT JSR PDATA JMP PROMPT LOADDEN LDX #TDENIED LOAD DENIED JSR PDATA JMP PROMPT LOADBEG LDAA QFATTR ANDA #$01 CHECK FOR READ FLAG BEQ LOADDEN LDX #TLOADIN PRINT LOADING JSR PDATA * LOAD FILE DATA LDX #$0001 SET FILE DATA LBA (xxxx0001) STX CFLBA1 JSR CFSLBA SET LBA LDAA QFPREL+1 STAA CFREG2 NUMBER OF SECTORS TO READ LDAA #$20 READ SECTOR COMMAND STAA CFREG7 LDX QFLOAD JSR CFREDAI JSR CFCHERR CHECK FOR ERROR BCC *+5 JMP LOADAB * PRINT LOAD ADDRESS RANGE DEX STX TEMP LDX #QFLOAD JSR OUT4HS LDAA #$08 JSR OUTCHAR LDAA #'- JSR OUTCHAR LDX #TEMP JSR OUT4HS LDX #TCRLF JSR PDATA TST RUNFLG BNE LOADRUN LOADOK LDX #TOK JSR PDATA JMP PROMPT LOADRUN LDAA QFATTR ANDA #$04 CHECK FOR EXECUTE FLAG BEQ LOADDEN JSR IOSWAP SELECT USR IO PAGE LDX QFLOAD JMP ,X ******************************** * DELETE FILE ******************************** DELETE LDX #TDELETE JSR PDATA JSR CLSFNAM LDX #SFNAME INPUT FILE NAME TO LOAD JSR INAME BCC DELABT ABORT DELETE LDAA SFNAME CMPA #$00 BEQ DELABT ABORT DELETE LDX #TCRLF JSR PDATA JSR SEARCH SEARCH FOR FILE BCS DELBEG DELFNF LDX #TFNF JSR PDATA JMP PROMPT DELABT LDX #TCRLF JSR PDATA JMP PROMPT DELDEN LDX #TDENIED DELETE DENIED JSR PDATA JMP PROMPT DELBEG LDAA QFATTR ANDA #$02 CHECK FOR WRITE FLAG BEQ DELDEN JSR CLRQF BEGIN DELETE CLR FSPTYPE MARK PARTITION AS DELETED JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 WRITE ONE SECTOR LDAA #$30 WRITE SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFWRDA JSR CFWAIT JSR CFCHERR CHECK FOR ERROR BCS DELABT LDX #TOK JSR PDATA JMP PROMPT ******************************** * CHANGE ATTRIBUTES FOR FILE ******************************** ATTR LDX #TATTR JSR PDATA JSR CLSFNAM LDX #SFNAME INPUT FILE NAME TO LOAD JSR INAME BCC ATTRABT ABORT ATTR LDAA SFNAME CMPA #$00 BEQ ATTRABT ABORT ATTR LDX #TCRLF JSR PDATA JSR SEARCH SEARCH FOR FILE BCS ATTRBEG LDX #TFNF FILE NOT FOUND JSR PDATA JMP PROMPT ATTRABT LDX #TCRLF JSR PDATA JMP PROMPT ATTRBEG LDAA #$0D JSR OUTCHAR JSR PRATTR PRINT ARRTIBUTES JSR CONIVEC READ CHARACTER ANDA #$DF UPPER CASE CMPA #'R R = READ BEQ ATTRKR CMPA #'W R = WRITE BEQ ATTRKW CMPA #'X X = EXECUTE BEQ ATTRKX CMPA #$0D CR = SAVE BEQ ATTRSAV LDX #TCRLF OTHER KEY = EXIT JSR PDATA JMP PROMPT ATTRKR LDAA QFATTR TOGGLE R EORA #$01 STAA QFATTR BRA ATTRBEG ATTRKW LDAA QFATTR TOGGLE W EORA #$02 STAA QFATTR BRA ATTRBEG ATTRKX LDAA QFATTR TOGGLE X EORA #$04 STAA QFATTR BRA ATTRBEG ATTRSAV LDX #TCRLF JSR PDATA * STORE QUICKFILE HEADER LDX #$0000 SET HEADER LBA (xxxx0000) STX CFLBA1 JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 WRITE ONE SECTOR LDAA #$30 WRITE SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFWRDA JSR CFWAIT JSR CFCHERR CHECK FOR ERROR BCS ATTRABT LDX #TOK JSR PDATA JMP PROMPT ******************************** * DISPLAY FILE INFORMATION ******************************** INFO LDX #TINFO JSR PDATA JSR CLSFNAM LDX #SFNAME INPUT FILE NAME TO LOAD JSR INAME BCC INFOABT ABORT INFO LDAA SFNAME CMPA #$00 BEQ INFOABT ABORT INFO LDX #TCRLF JSR PDATA JSR SEARCH SEARCH FOR FILE BCS INFOBEG LDX #TFNF FILE NOT FOUND JSR PDATA JMP PROMPT INFOABT LDX #TCRLF JSR PDATA JMP PROMPT INFOBEG LDX #TINHDR JSR PDATA LDX #QFNAME JSR PFNAME JSR PRATTR LDAA #$20 JSR OUTCHAR JSR OUTCHAR LDX #QFLOAD JSR OUT4HS LDAA #$08 JSR OUTCHAR LDAA #'- JSR OUTCHAR JSR CALCEND CALCULATE END ADDRESS STX TEMP LDX #TEMP JSR OUT4HS LDAA #$20 JSR OUTCHAR LDX #QFSIZE JSR OUT4HS LDAA #$20 JSR OUTCHAR LDX #TCRLF JSR PDATA JMP PROMPT ******************************** * CHANGE FILE NAME ******************************** NAME LDX #TNAME JSR PDATA JSR CLSFNAM LDX #SFNAME INPUT FILE NAME TO LOAD JSR INAME BCC NAMEABT ABORT NAME LDAA SFNAME CMPA #$00 BEQ NAMEABT ABORT NAME LDX #TCRLF JSR PDATA JSR SEARCH SEARCH FOR FILE BCS NAMEBEG LDX #TFNF FILE NOT FOUND JSR PDATA JMP PROMPT NAMEABT LDX #TCRLF JSR PDATA JMP PROMPT NAMEBEG LDAA #$20 JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR JSR OUTCHAR LDX #QFNAME JSR INAME BCC NAMEABT LDX #TCRLF JSR PDATA * UPDATE QUICKFILE HEADER JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 WRITE ONE SECTOR LDAA #$30 WRITE SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFWRDA JSR CFWAIT JSR CFCHERR CHECK FOR ERROR BCS NAMEABT LDX #TOK JSR PDATA JMP PROMPT ******************************** * FORMAT CF CARD ******************************** FORMAT LDX #TFORMAT JSR PDATA JSR CONIVEC CMPA #$0D BEQ *+5 JMP FRMEND LDX #TCRLF JSR PDATA LDX #TCONFIR CONFIRM FORMAT JSR PDATA JSR INCHAR CMPA #'Y BEQ *+5 JMP FRMEND JSR INCHAR CMPA #'E BEQ *+5 JMP FRMEND JSR INCHAR CMPA #'S BEQ *+5 JMP FRMEND LDX #TFORMA FORMAT CONFIRMED JSR PDATA CLR CFLBA3 CLEAR START LBA CLR CFLBA2 CLR CFLBA1 CLR CFLBA0 JSR CLRSEC CLEAR SECTOR STORAGE LDAA #'M SET FILE SYSTEM ID AND VERSION STAA FSID+0 LDAA #'C STAA FSID+1 LDAA #'F STAA FSID+2 LDAA #'S STAA FSID+3 LDAA #$01 STAA FSVER * BEGIN WRITING SECTORS FRMLOOP LDX #CFLBA3 PRINT PARTITION START JSR OUT4HS LDX CFLBA3 SET PARTITION START IN SECTOR STX FSSTART LDX #$FFFF SET PARTITION SIZE IN SECTOR STX FSSIZE JSR CFSLBA SET DESTINATION SECTOR LDAA #$01 STAA CFREG2 WRITE ONE SECTOR JSR CFWAIT LDAA #$30 WRITE SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFWRDA WRITE SECTOR DATA JSR CFWAIT JSR CFCHERR BCS FRMEND LDX CFLBA3 INX STX CFLBA3 * CHECK IF ALL PARTITIONS WRITTEN LDAA CFSIZ3 CMPA CFLBA3 BNE FRMCONT LDAA CFSIZ2 CMPA CFLBA2 BEQ FRMOK * CONTINUE FORMATTING FRMCONT LDAA #$0D JSR OUTCHAR BRA FRMLOOP FRMOK LDX #TOK JSR PDATA FRMEND LDX #TCRLF JSR PDATA JMP PROMPT ******************************** * PRINT HELP TEXT ******************************** HELP LDX #THELP JSR PDATA JMP PROMPT ******************************** * CLEAR SEARCH FILE NAME ******************************** CLSFNAM LDX #SFNAME CLSNAML CLR ,X INX CPX #SFNAME+NAMELE BNE CLSNAML RTS ******************************** * PRINT ATTRIBUTES ******************************** PRATTR LDAA #'- ATTRIBUTE - READ LDAB QFATTR PRINT QUICKFILE ATTRIBUTE ANDB #$01 CHECK FOR READ FLAG CMPB #$01 BNE *+4 LDAA #'R JSR OUTCHAR LDAA #$20 JSR OUTCHAR LDAA #'- ATTRIBUTE - WRITE LDAB QFATTR PRINT QUICKFILE ATTRIBUTE ANDB #$02 CHECK FOR WRITE FLAG CMPB #$02 BNE *+4 LDAA #'W JSR OUTCHAR LDAA #$20 JSR OUTCHAR LDAA #'- ATTRIBUTE - EXECUTE LDAB QFATTR PRINT QUICKFILE ATTRIBUTE ANDB #$04 CHECK FOR EXECUTE FLAG CMPB #$04 BNE *+4 LDAA #'X JSR OUTCHAR RTS ******************************** * PRINT FILE NAME @ X ******************************** PFNAME PSHA PSHB CLRB PFNAMEL LDAA ,X CMPA #$00 BNE *+4 LDAA #$20 JSR OUTCHAR INX INCB CMPB #NAMELE BEQ *+5 JMP PFNAMEL PULB PULA RTS ****************************** * EDIT FILENAME POINTED AT BY X * STATUS: OK=SEC, FAIL=CLC ****************************** INAME PSHA PSHB CLRB INAMEPL LDAA ,X PRINT EXIXTING LABLE CMPA #$00 BEQ INAMELO FOUND END OF NAME JSR OUTCHAR INX INCB CMPB #NAMELE BHI *+4 BRA INAMEPL INAMELO JSR CONIVEC GET CHARACTER FROM ACIA CMPA #$1B IC CHARACTER ESCAPE ($1B) BEQ INAM_ES EXIT CMPA #$7F IS CHARACTER DELETE ($7F) OR NON-PRINTABLE? BEQ INAMELO READ NEW CHARACTER BHI INAMELO READ NEW CHARACTER CMPA #$08 IS CHARACTER A BACKSPACE ($08)? BEQ INAM_BS CMPA #$0D IS CHARACTER A CASH RETURN ($0D)? BEQ INAM_CR CMPA #$1F IS CHARACTER NONPRINTABLE? BLS INAMELO READ NEW CHARACTER JMP INAM_OK IF WE HAVE COME THIS FAR CHARACTER IS OK INAM_BS CMPB #0 BEQ INAMELO IF AT BEGINNING OF NAME SEGMENT DONT DELETE DEX DECB JSR OUTCHAR PRINT THE RECIEVED BACKSPACE LDAA #$20 JSR OUTCHAR PRINT SPACE LDAA #$08 JSR OUTCHAR PRINT BACKSPACE CLRA STAA ,X CLEAR CHARACTER FROM NAME SEGMENT (STORE $00 AT ITS PLACE) JMP INAMELO READ NER CHARACTER INAM_OK CMPB #NAMELE BEQ INAMELO IF AT END OF NAME SEGMENT DONT ENTER NEW CHARACTER JSR OUTCHAR ECHO ENTERED CHARACTER STAA ,X INX INCB JMP INAMELO READ NEW CHARACTER INAM_CR PULB IF CASHRETURN CONTINUE PULA SEC RTS INAM_ES PULB IF CASHRETURN CONTINUE PULA CLC RTS ******************************** * COMPARE FILENAME * IF SFNAME == QFNAME * SEC * ELSE * CLC ******************************** NAMCMP CLRB NAMCMPL CMPB #NAMELE HAVE WE CHECKED ENTIRE NAME? BEQ NAMCMPM THEN ALL CHARACTERS MATCH LDX #SFNAME ABX LDAA ,X CMPA #'* BEQ NAMCMPM WILDCARD. STOP LOOKING LDX #QFNAME ABX CMPA ,X BNE NAMCMPE THIS NAME DOES NOT MATCH INCB BRA NAMCMPL NAMCMPM SEC NAME IS A MATCH RTS NAMCMPE CLC NAME IS NOT A MATCH RTS ******************************** * SEARCH FOR FILE * IN: SFNAME * OUT: LBA[0-3], SECSTO * STATUS: OK=SEC, FAIL=CLC ******************************** SEARCH CLR CFLBA3 CLEAR LBA POSITION CLR CFLBA2 CLR CFLBA1 CLR CFLBA0 * FILE SEARCH LOOP SEALOP JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 READ ONE SECTOR LDAA #$20 READ SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFREDA JSR CFCHERR CHECK FOR ERROR BCC *+5 JMP SEAFAIL * CHECK LOADED FILE HEADER JSR VALHDR VALIDATE PARTITION BCC SEANXT LDAA FSPTYPE CHECK PARTITION TYPE CMPA #$01 BNE SEANXT LDAA QFTYPE CHECK QUICKFILE TYPE CMPA #$01 BNE SEANXT JSR NAMCMP CHECK FILE NAME BCS SEAFOUN * SET NEXT SECTOR ADDRESS SEANXT LDX CFLBA3 INX STX CFLBA3 * CHECK IF ALL PARTITIONS HAVE BEEN READ LDAA CFSIZ3 CMPA CFLBA3 BEQ *+5 JMP SEALOP LDAA CFSIZ2 CMPA CFLBA2 BEQ *+5 JMP SEALOP SEAFAIL CLC FILE NOT FOUND RTS SEAFOUN SEC FILE FOUND RTS ******************************** * FIND EMPTY FILE SLOT * OUT: LBA[0-3], SECSTO * STATUS: OK=SEC, FAIL=CLC ******************************** EMPTY CLR CFLBA3 CLEAR LBA POSITION CLR CFLBA2 CLR CFLBA1 CLR CFLBA0 * SEARCH LOOP EMPLOP JSR CFSLBA SET LBA LDAA #$01 STAA CFREG2 READ ONE SECTOR LDAA #$20 READ SECTOR COMMAND STAA CFREG7 LDX #SECSTO JSR CFREDA JSR CFCHERR CHECK FOR ERROR BCC *+5 JMP EMPFAIL * CHECK LOADED FILE HEADER JSR VALHDR VALIDATE PARTITION BCC EMPNXT LDAA FSPTYPE CHECK PARTITION TYPE CMPA #$00 $00 = EMPTY PARTITION BEQ EMPFOUN * SET NEXT SECTOR ADDRESS EMPNXT LDX CFLBA3 INX STX CFLBA3 * CHECK IF ALL PARTITIONS HAVE BEEN READ LDAA CFSIZ3 CMPA CFLBA3 BEQ *+5 JMP EMPLOP LDAA CFSIZ2 CMPA CFLBA2 BEQ *+5 JMP EMPLOP EMPFAIL CLC EMPTY SLOT NOT FOUND RTS EMPFOUN SEC EMPTY SLOT FOUND RTS ******************************** * CLEAR QUICKFILE HEADER ******************************** CLRQF LDX #SECSTO+12 BEGINNIG OF QUICKFILE HEADER CLRQFL CLR ,X INX CPX #SECSTO+400 SOULD BE ENOUGH BNE CLRQFL RTS ******************************** * VALIDATE PARTITION HEADER * CARRY SET = HEADER OK ******************************** VALHDR LDAA FSID CMPA #'M BNE VALHDRE LDAA FSID+1 CMPA #'C BNE VALHDRE LDAA FSID+2 CMPA #'F BNE VALHDRE LDAA FSID+3 CMPA #'S BNE VALHDRE LDAA FSVER CMPA #$01 BNE VALHDRE SEC RTS VALHDRE CLC RTS ******************************** * CALCULATE FILE END ADDR * OUT: X = END ADDR ******************************** CALCEND LDX QFLOAD LDAA QFPREL+1 LDAB #$FF CALLOOP CMPA #$00 BEQ CALSTOP ABX INX ABX INX DECA BRA CALLOOP CALSTOP DEX RTS ******************************** * INITIALIZE CF ******************************** CFINIT LDAA #$04 RESET COMMAND STAA CFREG7 JSR CFWAIT LDAA #$E0 LBA3=0, MASTER, MODE=LBA STAA CFREG6 LDAA #$01 8-BIT TRANSFERS STAA CFREG1 LDAA #$EF SET FEATURE COMMAND STAA CFREG7 JSR CFWAIT RTS ******************************** * WAIT FOR CF READY ******************************** CFWAIT LDAA CFREG7 ANDA #$80 MASK OUT BUSY FLAG CMPA #$00 BNE CFWAIT CFWAITE RTS ******************************** * CHECK FOR CF ERROR * OUT: CLS = ERROR ******************************** CFCHERR LDAA CFREG7 ANDA #$01 MASK OUT ERROR BIT CMPA #0 BEQ CFNERR PSHX LDX #TERR JSR PDATA LDX CFREG1 JSR OUT2HS LDX #TCRLF JSR PDATA PULX SEC RTS CFNERR CLC RTS ******************************** * READ DATA FROM CF ******************************** CFREDA JSR CFWAIT JSR CFCHERR LDAA CFREG7 ANDA #%00001000 FILTER OUT DRQ CMPA #%00001000 BNE CFREDAE LDAA CFREG0 READ DATA BYTE STAA ,X INX BRA CFREDA CFREDAE JSR CFWAIT RTS * READ DATA FROM CF PRESERVING USER IO PAGE CFREDAI JSR CFWAIT JSR CFCHERR LDAA CFREG7 ANDA #%00001000 FILTER OUT DRQ CMPA #%00001000 BNE CFREDAE LDAA CFREG0 READ DATA BYTE JSR IOSWAP STAA ,X JSR IOSWAP INX BRA CFREDAI ******************************** * WRITE DATA TO CF ******************************** CFWRDA JSR CFWAIT JSR CFCHERR LDAA CFREG7 ANDA #%00001000 FILTER OUT DRQ CMPA #%00001000 BNE CFWRDAE LDAA ,X STAA CFREG0 READ DATA BYTE INX BRA CFWRDA CFWRDAE JSR CFWAIT RTS * WRITE DATA TO CF PRESERVING USER IO PAGE CFWRDAI JSR CFWAIT JSR CFCHERR LDAA CFREG7 ANDA #%00001000 FILTER OUT DRQ CMPA #%00001000 BNE CFWRDAE JSR IOSWAP LDAA ,X JSR IOSWAP STAA CFREG0 READ DATA BYTE INX BRA CFWRDAI ******************************** * CF SET LBA ******************************** CFSLBA LDAA CFLBA0 LBA 0 STAA CFREG3 LDAA CFLBA1 LBA 1 STAA CFREG4 LDAA CFLBA2 LBA 2 STAA CFREG5 LDAA CFLBA3 LBA 3 ANDA #%00001111 FILTER OUT LBA BITS ORAA #%11100000 MODE LBA, MASTER DEV STAA CFREG6 RTS ******************************** * SWAP USER AND PROGRAM IO PAGE ******************************** IOSWAP PSHA PSHB LDAA $0002 LDAB IOPUSR STAB $0002 STAA IOPUSR PULB PULA RTS ******************************** * CLEAR SECTOR STORAGE ******************************** CLRSEC LDX #SECSTO CLRSECL CLR ,X INX CPX #SECSTO+512 BNE CLRSECL RTS ******************************** * STORAGE FOR SECTOR ******************************** ORG $7C00 SECSTO RMB 512 * PARTITION SECTOR STRUCTURE (12BYTES) - 1ST SECTOR OF EVERY PARTITION ORG SECSTO FSID RMB 4 ID FOR PARTITION TYPE - "MCFS" FSVER RMB 1 VERSION $01 FSSTART RMB 4 LBA OF PARTITION START FSSIZE RMB 2 LBA OF PARTITION SIZE FSPTYPE RMB 1 PARTITION TYPE - $00=EMPTY/UNUSED, $01=QUICKFILE * QUICKFILE HEADER STRUCTURE - 1ST SECTOR OF EVERY PARTITION ORG SECSTO+12 QFTYPE RMB 1 QUICKFILE TYPE - $01=STD/VERSION1 QFSIZE RMB 2 QUICKFILE SIZE IN BLOCKS/SECTORS QFNAME RMB 24 QUICKFILE NAME QFDATE RMB 7 QUICKFILE ISO DATE - BCD: YYYYMMDDHHMMSS QFATTR RMB 1 QUICKFILE ATTRIBUTES - SEE BELOW QFLOAD RMB 2 QUICKFILE LOAD ADDRESS - DEFAULT $0100 QFPREL RMB 1 QUICKFILE PRELOAD BLOCKS - SEE BELOW ******************************** * QFATTR - FILE ATTRIBUTES ******************************** * BIT 0 - READABLE * BIT 1 - WRITEABLE * BIT 2 - EXECUTABLE * BIT 3 * BIT 4 * BIT 5 * BIT 6 * BIT 7 ******************************** * QFPREL - PRELOAD BYTES ******************************** * NUMBER OF BYTES TO LOAD * AT INITIAL LOAD * * FOR SMALL FILE = FILE LENGTH * FOR LARGE FILE = USR DEFINED