; SAVE#D:MDOS2.M65 ; ; ;*DISK OPEN ROUTINE ; DKOPEN ; ; Fix nasty bug! JSR WBITMP ; [Bob Puff] JSR SETUP ; BUF PTRS, ETC. JSR GETFNM ; GET DRIVE ID ; ; OR FILE NAME ; ; FROM BUFFER LDA ICAX1Z ; GET TYPE OF ; ; OPEN FROM IOCB STA FCBOTC,X AND #$02 ; DIR READ? BEQ DKOPN1 JMP LSTDIR ;IF SET, GO ; ; HANDLE DIR LIST ; DKOPN1 STA SAVSEC,X STA SAVSEC+1,X ; CLR SAVSEC JSR SFDIR PHP ; SAVE STATUS BCS OPNEW LDA #$10 ; MAKE SURE THIS ; ; IS NOT A DIR JSR GETFLAG BNE DIROPN ; IF A DIR ; ; GO HANDLE IT OPNEW LDY ICAX1Z CPY #8 BEQ OPNOP ; OPEN > OUTPUT CPY #4 BEQ OPNIN ; OPEN > INPUT CPY #12 BEQ OPNUP ; OPEN > UPDATE CPY #9 BEQ OPNAP ; OPEN > APPEND DIROPN ; ; IF NONE OF THE JMP ERRCMD ; ABOVE - ERROR! ; OPNAP PLP ; OPEN APPEND BCS OPNCR0 JSR TSTLOK JSR INITYP ; READ ALL THE ; ; SECTORS IN THE FILE LDA DIRBUF+1,Y STA SECCNT,X LDA DIRBUF+2,Y STA SECCNT+1,X APPRD JSR RDNXTS BCC APPRD ; IF NOT EOF, ; ; READ ANOTHER LDA MAXLEN,X JSR LENSET ; SET LENGTH FOR ; ; OUTPUT LDA SECCNT,X BNE SGLDEC DEC SECCNT+1,X SGLDEC ; ; ALLOW FOR DEC SECCNT,X ; SECT REWRITE JMP OPOUTX ; OPNUP ; ; OPEN UPDATE PLP BCS OPNER1 JSR TSTLOK OPNOWR JSR INSTRT JMP DONE ; OPNIN ; ; OPEN INPUT PLP BCC OPNOWR OPNER1 LDA #170 ; FILE NOT FOUND BMI EROXIT ; OPNOP ; ; OPEN OUTPUT PLP BCS OPNCR JSR REMOVE JMP GET1ST ; OPNCR0 DEC FCBOTC,X OPNCR LDA HOLFN STA CURFNO BMI OPDIRF GET1ST JSR ALLOC ; LDA ICAX2Z ; TYPE OF FILE AND #$24 ; SAVE LOCKED & ; ; FORMAT BITS ; ; (with 4.5, DOS I no-more) ; EOR #$43 ; MERGE IN ; ; DEFAULT CODE ; ; (DOS II, UNLOCKED) LDY MAPBUF ; DISK TYPE? CPY #3 ; >2=MYDOS(3) BCC LLINKS ORA #$04 ; LLINKS PHA JSR RDCFNO ; GET DIR SEC SEC JSR ENTNAME ; PUT NAME IN IT LDA LNKSEC+1,X STA DIRBUF+4,Y LDA LNKSEC,X STA DIRBUF+3,Y PLA JSR SAVFLAG JSR INITYP JSR TONXT OPOUTX LDA #$80 STA FCBFLG,X JSR TSTDOS ; DOS.SYS? BNE JDONE LDY CURSEC,X LDA CURSEC+1,X JSR SETDOS ; YES, UPDATE ; ; BOOT SECTORS LDA DOSAD STA FMSZPG LDA DOSAD+1 STA FMSZPG+1 BNE OWTDOS ; DOS CAN'T ; ; START ON ZERO-PAGE ; OPDIRF LDA #169 EROXIT JMP AEXIT ; ; AUTOMATICALLY WRITE DOS OUT ; IF WE OPEN "DOS.SYS" FOR A ; WRITE (THIS IS BECAUSE DOS 2.0 ; WOULD BLOW ITSELF AWAY IF A ; REAL WRITE FROM THE DOS AREA ; WAS ATTEMPTED, AND WE HAVE TO ; TO REMAIN COMPATIBLE). ; LWTDOS JSR WRNXTS OWTDOS LDY #0 CDOSBF LDA (FMSZPG),Y STA (FMSBPT),Y INY CPY DLINK BCC CDOSBF TYA STA CURLEN,X JSR MVBUFR CPY DOSEND SBC DOSEND+1 BCC LWTDOS JDONE JMP DONE ; ;*READ DATA FROM A FILE ; DKREAD JSR SETUP ; SETUP BUFFS LDA FCBOTC,X AND #$02 ; TEST DIR I/O BEQ RDFILE JMP DIRRD ; JUMP DIR READ ; RDFILE LDA CURLEN,X CMP MAXLEN,X BCC RDSGBT ; GET ONE BYTE ; ; IF NOT AT END BCS RDASNT ; OR GET MORE ; RDASLP LDA ICCOMZ AND #$02 ; BINARY I/O? BEQ RDSGBT ; GET ONE BYTE LDY DLINK DEY RDSCLP ; ; SIMULATED ; ; BURST I/O ; ; (with unrolled loop) LDA (FMSBPT),Y STA (ICBALZ),Y DEY LDA (FMSBPT),Y STA (ICBALZ),Y DEY LDA (FMSBPT),Y STA (ICBALZ),Y DEY LDA (FMSBPT),Y STA (ICBALZ),Y DEY BNE RDSCLP LDA (FMSBPT),Y ; NUM OF DATA ; ; BYTES IS MULTIPLE ; ; OF 4 + 1 STA (ICBALZ),Y JSR BUFADJ ; ADJUST BUFFER ; ; PTR BY 125 OR 253 RDASNT ; ; READ IN THE JSR RDNXTS ; NEXT SECTOR BCS RETEOF ; EOF-ERROR LDA ICBLLZ+1 BNE RDASLP ; AND REPEAT THE ; ; LOOP IF > 256 ; ; BYTES LEFT ; RDSGBT TAY LDA (FMSBPT),Y ; FETCH A ; ; DATA BYTE FROM ; ; THE BUFFER STA DATBYT ; STORE IT CIO INY TYA STA CURLEN,X ; BUMP LENGTH EOR MAXLEN,X ORA LNKSEC,X ORA LNKSEC+1,X ; LAST BYTE? BNE JDONE LDA #3 ; YES, SAY SO .BYTE $2C ; FAKE BIT OP ; RETEOF LDA #136 ; EOF STATUS JMP AEXIT ; ;*WRITE DATA TO A FILE ; DKWRIT STA DATBYT ; SAVE THE DATA ; ; BYTE (IF IT IS IN ACC) LDY ICDNO,X STY ICDNOZ ; INSURE ICDNOZ ; ; IS SET UP ; ; (BASIC DOESN'T!) JSR SETUPW LDA FCBOTC,X AND #$08 BEQ CANTWR ; ERROR OUT IF ; ; ILLEGAL TO WRITE ; ; (BASIC AGAIN!) LDA CURLEN,X TAY CMP MAXLEN,X BCC SKBURST ; SKIP AROUND IF ; ; NOT THE END OF ; ; THE SECTOR WRASLP JSR WRNXTS ; WRITE A SECTOR ; ; OF DATA BCS RETEOF ; ERROR OUT IF ; ; NO MORE SPACE LDY STKPSV LDA $0102,Y CMP #$C0 ; IF FROM BASIC ; ; RETURN ADDRESS ; ; < $C000 BCC BASWRT ; SINGLE BYTES LDA FCBOTC,X ; Fix bug in ; ; open/update vs ; ; burst I/O [Bob AND #$04 ; Puff, again!] BNE BASWRT LDA ICCOMZ ; IF RECORD I/O, ; ; PASS SINGLE ; ; BYTES ALSO AND #$02 BEQ BASWRT LDY ICBLLZ+1 ; AND IF THE ; ; BUFFER HOLDS ; ; FEWER THAN 256 ; ; BYTES BEQ BASWRT ; PASS SINGLE ; ; BYTES AS WELL LDY MAXLEN,X DEY WRSCLP LDA (ICBALZ),Y ; ELSE, DO ; ; SIMULATED BURST ; ; I/O STA (FMSBPT),Y DEY LDA (ICBALZ),Y STA (FMSBPT),Y ; BUT ONLY ; ; UNROLL 2 ENTRIES ; ; FOR WRITES! DEY ; (WE GOT VERY ; ; LITTLE RAM TO WASTE!) BNE WRSCLP LDA (ICBALZ),Y STA (FMSBPT),Y JSR BUFADJ LDA (ICBALZ),Y STA DATBYT JMP WRASLP ; BASWRT LDY #0 SKBURST LDA DATBYT INC CURLEN,X STA (FMSBPT),Y LDA #$40 ORA FCBFLG,X ; FOR UPDATE ; ; MODE, SAY THE ; ; SECTOR WAS MODIFIED STA FCBFLG,X BNE TODONE ; BRANCH ALWAYS! ; CANTWR JMP ERRCMD ; BUFADJ CLC LDA MAXLEN,X STA CURLEN,X ADC ICBALZ STA ICBALZ BCC RBAOK INC ICBALZ+1 RBAOK SEC LDA ICBLLZ SBC MAXLEN,X STA ICBLLZ BCS RBLOK DEC ICBLLZ+1 RBLOK RTS ; ;*RETURN FILE STATUS ; DKSTAT JSR SETUP ; SET UP RETURN ; ; ADDRESS, ETC. JSR LFFILE ; FIND IF FILE ; ; IS THERE, ETC. JSR TSTLOK ; IS IT LOCKED? TODONE JMP DONE ; RET TO CALLER ; ;*CLOSE FILE (WRITING ANY ; PENDING SECTOR) ; DKCLOS JSR SETUP LDA FCBOTC,X AND #$08 ; OUTPUT LEGAL? BEQ CLROTC ; NO, JUST EXIT ROL FCBFLG,X BCC CKFLSC JSR REWRIT ; REWRITE THE ; ; LAST SECTOR JSR RRDIR LDA SECCNT,X LDY DIRDSP STA DIRBUF+1,Y LDA SECCNT+1,X STA DIRBUF+2,Y LDA DIRBUF,Y AND #$FE ; NOT OPEN FOR ; ; OUTPUT ANY MORE JSR SAVFLAG LDA SAVSEC,X ORA SAVSEC+1,X BEQ CLROTC CPX LSTIOCB BEQ FAPPD JSR INITYP ; READ ALL THE ; ; SECTORS AGAIN APPLP JSR RDNXTS BCC APPLP ; NOT EOF YET BCS TIELNK FAPPD LDA LSTSEC STA CURSEC,X LDA LSTSEC+1 STA CURSEC+1,X TIELNK CLC JSR RWDISK LDA DLINK STA CURLEN,X LDA SAVSEC,X LDY SAVSEC+1,X JSR SAVLNK CLROTE BPL CLROTC LDA #163 ; FAILURE IS A ; ; SYSTEM ERROR JMP AEXIT CLROTC LDA #$FF STA ICHID,X LDA #0 STA FCBOTC,X JMP FREDON ; CKFLSC ROL FCBFLG,X BCC CLROTC JSR WRDISK JMP CLROTE ; INITYP LDA #$06 JSR GETFLAG LSR A ROR A ROR A ROR A ORA FCBOTC,X STA FCBOTC,X LDA DIRBUF+3,Y STA LNKSEC,X LDA DIRBUF+4,Y STA LNKSEC+1,X LDA CURFNO STA FCBFNO,X LDA #0 STA FCBFLG,X STA CURLEN,X STA SECCNT,X STA SECCNT+1,X RTS ; ;*DOS XIO ROUTINES ; ; Sorry about the lack of ; comments in some parts of this ; file, I just never had to ; figure this code out after I ; wrote it (:-)! ; NODIRF LDA #176 ; FILE NOT A ; ; DIRECTORY JMP AEXIT ; PIKDIR LDY #0 LDA #': FDVND INY CMP (ICBALZ),Y BNE FDVND INY LDA (ICBALZ),Y CMP #'@ BCC SETRDIR CMP #'Z+1 BCC GFNDIR CMP #' BCC SETRDIR CMP #'z+1 BCS SETRDIR GFNDIR JSR LFFILE ; FIND NEW ; ; DEFAULT DIR JSR INITYP JSR TONXDR BEQ NODIRF ; IF NOT DIR LDA DIRBAS+1,X TAY LDA DIRBAS,X SAVDEF STY CDIREC+1 ; UPDATE ; ; DIR ADDRESS STA CDIREC LDA ICDNOZ STA DEFAULT ; UPDATE UNIT # BPL TOFDN ; SETRDIR LDA # <361 LDY # >361 BPL SAVDEF ; RENAME JSR LFFILE ; GET OLD NAME, ; ; DRIVE, VALIDATE LDY #11 STEMPL LDA FNAME-1,Y STA MAPBUF+256,Y DEY BNE STEMPL RNLOOP JSR TSTLOK ; CANNOT RENAME ; ; IF LOCKED JSR TDDOS ; TEST FOR DOS ; ; GONE! LDY TMP2 JSR GETNAM ; GET NEW NAME CLC JSR ENTNAME ; OVERWRITE NAME ; ; IN DIR JSR WDIRBK ; REWRITE DIR ; JSR TSTDOS ; DOS.SYS? BNE REPLDS ; NO, NEXT? LDY DIRDSP LDA DIRBUF+4,Y ; SAVE FILE ; ; LOCATION ON THE ; ; STACK PHA LDA DIRBUF+3,Y PHA ; ;;; JSR SYSSET ;Use the MAP ; buffer [IS THIS NECESSARY??? ; CLC ; == READ LDX #1 ; == SECTOR SIZE ; ; CODE (1=128, 2=256) LDA #0 LDY #1 ; == SECTOR #1 JSR DKIO ; Read it ; LDA SECDAT STA MAPBUF+SECDAT-$0700 PLA STA MAPBUF+DOSLOC-$0700 PLA STA MAPBUF+DOSLOC+1-$0700 ; ;; LDA #$00 ;[AND IS THIS REALLY ;; NECESSARY??? ;;; STA MAPBUF+STATE-$0700 ; SEC ; == WRITE LDX #1 ; == SECTOR SIZE ; ; CODE (1=128, 2=256) JSR DKIO2 ; Write it (same ; ; sector as I ; ; read before) ; LDA #$FF ; Then make sure ; ; we reread the ; ; dir buffer STA DIUNIT ; REPLDS LDY #11 RTEMPL LDA MAPBUF+256,Y STA FNAME-1,Y DEY BNE RTEMPL JSR CSFDIR ;TO RENAME BCC RNLOOP TOFDN JMP FREDON ; DELETE JSR LFFILE DELLP JSR REMOVE ; FLUSH SECS JSR RRDIR ; REREAD DIR JSR TDDOS ; DELETED DOS? LDA #$80 JSR SAVFLAG ; REWRITE DIR JSR CSFDIR BCC DELLP ; IF ANOTHER ; ; FOUND, BCS TOFDN ; ELSE, WRAP UP ; ; AND EXIT ; REMOVE JSR TSTLOK ; ONCE HAD ; ; 'OPVTOC' CALL ; ; FIRST JSR INITYP JSR TONXDR BNE DELDIR JSR CHASE ; FREELP JSR FREE JSR RDNXTS BCC FREELP RTS ; INVDEL LDA #175 ; DIRECTORY NOT ; ; DELETABLE JMP AEXIT ; LOCK LDA #$20 .BYTE $2C ; BIT ABS (SKIP ; ; 2 BYTES) ; UNLOCK LDA #$00 STA DATBYT JSR LFFILE ; FIND FILE AND ; ; VERIFY WRITABLE LKULKL LDA #$DF ; STRIP OFF OLD ; ; BIT 5 JSR GETFLAG ORA DATBYT ; AND REPLACE ; ; WITH NEW JSR SAVFLAG JSR CSFDIR BCC LKULKL BCS TOFDN ; DELDIR LDY #-11 LDA #'? DELSET STA FNAME+11-256,Y INY BNE DELSET JSR SFDIR BCC INVDEL ; LDA #8 STA DATBYT JSR TONXT DELDRL JSR FREE JSR INCCSEC DEC DATBYT BNE DELDRL JMP GETFNM ; POINT LDY FCBFLG,X BMI ERRCMD ; LDA ICSPR+1,X CMP CURSEC+1,X BNE PNTREAD LDA ICSPR,X CMP CURSEC,X BEQ PNTSME PNTREAD TYA BEQ PNTCLN ; IF SECTOR ; ; UNMODIFIED JSR WRDISK LDA #0 STA FCBFLG,X PNTCLN LDA ICSPR+1,X STA LNKSEC+1,X LDA ICSPR,X STA LNKSEC,X JSR CHASE ; READ SECTOR ; ; POINTED TO BCS BADPNT ; PNTSME LDA ICSPR+2,X CMP MAXLEN,X BCS PNTEQL PNTLST STA CURLEN,X JMP DONE ; PNTEQL BEQ PNTLST ; IF POINTING ; ; AT LAST BYTE BADPNT LDA #166 ; INVALID POINT ; ; LOCATION ERR .BYTE $AE ; FAKE LDX ; ERRCMD LDA #168 ; INVALID IOCB ; ; PARAMETER JMP AEXIT ; NOTE LDA CURSEC,X STA ICSPR,X LDA CURSEC+1,X STA ICSPR+1,X LDA CURLEN,X STA ICSPR+2,X JMP DONE ; DKXIO JSR SETUP LDA ICCOMZ ; GET COMMAND ; ; BYTE CMP #254 BEQ FORMAT CMP #43 ; ADD "MKDIR" ; ; CODE FOR SpartaDOS? ; ; [Bob Puff] BCS ERRCMD ; IF INVALID ; ; COMMAND SBC #32-1 BCC ERRCMD TAY LDA VECTBH,Y PHA LDA VECTBL,Y PHA RTS ; VECTOR TO ; ; PROPER ROUTINE ; VECTBH .BYTE >RENAME-1, >DELETE-1 .BYTE >MKDIR-1, >LOCK-1 .BYTE >UNLOCK-1, >POINT-1 .BYTE >NOTE-1, >DKLOAD-1 ;* .BYTE >ERRCMD-1, >PIKDIR-1 .BYTE >DKLOAD-1, >PIKDIR-1 .BYTE >MKDIR-1 ; ; extra vector to ; ; to MKDIR [Bob Puff] ; VECTBL .BYTE 3 LDY DSKTIM ; DISK TIMEOUT ; ; VALUE (RET IN STATUS) JSR DKFME ; ENTER DKIO AT ; ; FORMAT ENTRY BPL FMTOK ; Accepting 144 ; ; errors here removed ; ; [Bob Puff] JMP AEXIT ; RETURN ERROR ; ; CODE IF ANY ; RAMFMT STA CURSEC,X ; STUFF PROPER ; ; # OF SECTORS ; ; INTO CURSEC CLC ; 256-BYTE PAGES ; ; * 2 SINCE SECTOR ; ; SIZE IS 128 ADC RDKLMT LSR A ROR CURSEC,X BNE NOTDEF ; FAIL IF NOT ; ; 256 SECTORS OR ; ; MORE (need 370) ; ;*SUCCESSFUL FORMAT, CREATE VTOC ; AND EMPTY DIRECTORY ; FMTOK ; [Bob Puff] disabled the ; marginal format code ; ldy #0 ; check for bad format ; lda (FMSBPT),y ; and (FMSBPT),y ; 1st 2 $FF? ; cmp #$FF ; beq FMTOK2 ; yep, continue ; lda #173 ; format error ; bne FMEXIT ; FMTOK2 JSR INVUNIT ; Can we do this ; ; (asks Bob Puff) JSR DELDOS LDA ICAX1Z STA CURSEC,X LDA ICAX2Z AND #$7F ; DISK MUST HAVE ; ; 256 SECTORS BNE NOTDEF ; IF SIZE ; ; SPECIFIED, USE IT LDY ICDNOZ LDA HDTAB-1,Y ; IF NOT AND ; ; THIS IS A HARD DISK STA CURSEC,X ; USE THE ; ; SYSTEM DEFINED SIZE LDA HDTAB+8-1,Y BNE NOTDEF BIT DVSTAT ; 1050 DRIVE? BPL FIGSIZ ; FIGURE SIZE LDA # <1040 ; YES, FORCE TO ; ; 1040 SECTORS STA CURSEC,X LDA # >1040 BNE NOTDEF ; FIGSIZ LDA DRVDEF-1,Y AND #$31 ; EXTRACT TRACK ; ; COUNT FLAGS LSR A PHP LSR A LSR A TAY LDA NOSECS,Y ; AND USE DRIVE ; ; DEFAULT SECTOR COUNT STA CURSEC,X LDA NOSECS+1,Y PLP BCC NOTDEF ; IF NOT DOUBLE ; ; SIDED, THIS IS IT ASL CURSEC,X ROL A ; ELSE DOUBLE IT ; NOTDEF STA CURSEC+1,X CMP #4 ; NEED 16 BIT ; ; LINKS? BCC SHORTS ; NO, SHORT DOS2 ; ; FORMAT OK INC MAPBUF ; YES, FORCE ; ; LONG FORMAT ; ; MYDOS(3) SHORTS JSR FNDBIT ; FIND LAST BIT ; ; MAP SECTOR LDA TMP2 BNE GT246 ; IF PAST 256TH ; ; MAP BYTE BIT DLINK ; SD? BMI FDBDEN CPY #0 BPL FDBDEN GT246 STA MAP2 CLC ADC #3 STA MAPBUF FDBDEN LDA # >-9 STA MAPBUF+4 LDA # <-9 STA MAPBUF+3 ; START WITH 9 ; ; FREE SECTORS ; ; UN-FREE! FLOOP JSR FMTFRE JSR DECCSEC CMP #4 ; BOOT SECTORS ; ; YET? BNE FLOOP ; IF NOT, ; ; CONTINUE DEALLOCATING LDA CURSEC+1,X BNE FLOOP ; ;*ALLOCATE BAD SECTORS ; [Bob Puff] replaced this with ; code to set FMSBPT to 1, since ; he disallows bad sectors ; LDY #0 CLRBDLP LDA (FMSBPT),Y STA CURSEC,X INY LDA (FMSBPT),Y STA CURSEC+1,X INY AND CURSEC,X CMP #$FF CLC BEQ MAPDONE STY TMP1 JSR DECCNT JSR FNDLBIT EOR #$FF BCC CLRBD1 AND MAPBUF+256,Y STA MAPBUF+256,Y BCS CLRBD2 CLRBD1 AND MAPBUF,Y STA MAPBUF,Y CLRBD2 LDY TMP1 BNE CLRBDLP SEC LDY #173*2-256 ; NO $FFFF => ; ; BAD FORMAT MAPDONE TYA ROR A STA FMSBPT ; POSITIVE VALUE ; ; = # OF BAD ; ; SECTORS ; ;*[End of code that can be ; optionally deleted] ; LDA #$00 STA MAPBUF+55 LDA #$7F STA MAPBUF+56 LDY #44 ; START ALLOC. ; ; OF VTOC HERE LDA MAPBUF SEC SBC #2 ; GET # OF SECS BIT DLINK ; SD? BMI MPNSD ; IF NOT, M-3 ASL A ; IF SO, M*2-5 MPNSD TAX ; COUNT TO X DEX ; ALCMPL LDA #$FF ALCMAP DEX BMI SMBSIZ PHA JSR DECCNT PLA ASL A BNE ALCMAP STA MAPBUF+10,Y DEY BPL ALCMPL ; BR ALWAYS! ; SMBSIZ STA MAPBUF+10,Y LDA MAPBUF+3 ; MARK EMPTY STA MAPBUF+1 ; SIZE TOO LDA MAPBUF+4 STA MAPBUF+2 JSR FMTMAP ; WRITE OUT MAP ; ;*CREATE AN EMPTY DIRECTORY ; LDA # <361 LDY # >361 CLRDIR JSR SETDIR ; RESET THE ; ; DIRECTORY BASE ; ; SECTOR TYA CLRDLP STA DIRBUF,Y ; ZERO THE ; ; DIRECTORY BUFFER INY BNE CLRDLP ; LDA #7 STA DIRSEC CLRDL2 JSR WDIRBK ; THEN WRITE ALL ; ; 8 SECTORS OUT DEC DIRSEC BPL CLRDL2 LDY BUFNO,X LDA #0 STA BUFNO,X STA BUFFLG-1,Y ; FORMAT DONE ; ; FREE THE ; ; INTERNAL BUFFER LDA FMSBPT JMP AEXIT ; NOSECS .WORD 35*18,40*18 .WORD 80*18,77*26 ; SETDIR STA DIRBAS,X TYA STA DIRBAS+1,X LDY #0 RTS ; ;*DOS BINARY LOAD CODE (LOAD ; AND OPTIONALLY EXECUTE A ; PROGRAM) ; DKLOAD LDA ICAX1Z STA ICPTLZ ; SAVE PROGRAM ; ; NAME BUFFER POINTER CMP #$08 BCS TOERRC ; IF WRITE, ; ; REPORT ERROR ; LDA # TORTS ; ASSUME RUNN ; ; ADDRESS IS ABSENT STA RUNADR+1 LDA #4 STA ICAX1Z LDA ICHID,X ; IOCB OPEN? BPL CCFILE JSR DKOPEN ; NO, OPEN IT BMI DKLERV JSR WDREAD ; READ ONE WORD ; ; OF THE HEADER BEQ CCFILE LDY #180 ; NO $FFFF, ; ; HEADER ERROR CODE BMI DKLERV ; TOERRC LDY #168 ; INVALID IOCB RTS ; GETTXT LDA # TORTS ; FOR EACH ; ; SEGMENT, RECLEAR ; ; THE INIT VECTOR STA INIADR+1 TXTLP JSR DKREAD DKLERV BMI DKLERR LDY #0 STA (ICBALZ),Y INC ICBALZ BNE DECLEN INC ICBAHZ DECLEN LDA ICBLLZ BNE DECLOW DEC ICBLHZ DECLOW DEC ICBLLZ BNE TXTLP LDA ICBLHZ BNE TXTLP LDA ICBAHZ CMP # >INIADR BNE CCFILE ; LDA ICPTLZ ; IF NO INITS, LSR A BCS CCFILE ; SKIP TO NEXT ; ; PAGE TXA ; ELSE SAVE IOCB PHA LDY #256-12 CPSICB LDA ICHIDZ-256+12,Y STA ICHID,X ; SAVE THE ; ; 12-BYTE IOCB ENTRY INX INY BNE CPSICB PLA TAX PHA JSR DOINIT ; AND CALL INIT ; ; FUNCTION PLA TAX PHA LDY #256-12 CPRICB LDA ICHID,X ; THEN RESTORE ; ; THE 12-BYTE IOCB STA ICHIDZ-256+12,Y INX INY BNE CPRICB PLA TAX ; CCFILE JSR WDREAD ; READ THE ; ; SEGMENT START ADDRESS BEQ CCFILE STA ICBALZ STY ICBAHZ JSR WDREAD ; READ THE ; ; SEGMENT END ADDRESS SEC ADC #0 BCC CCSUBT INY CCSUBT SEC SBC ICBALZ ; CALCULATE THE ; ; LENGTH TO LOAD ; ; INTO RAM STA ICBLLZ TYA SBC ICBAHZ STA ICBLHZ BCS GETTXT ; BRANCH IF ; ; VALID LENGTH ; ; (GET DATA BYTES) LDY #181 ; ELSE, MEMORY ; ; WRAP ERROR BMI DKLERR ; WDXIT PLA PLA DKLERR TYA PHA JSR DKCLOS ; CLOSE THE ; ; PROGRAM FILE PLA TAY ; AND RETURN ANY ; ; ERROR CODE RTS ; ;*READ A WORD FROM THE PROGRAM ; FILE AND COMPARE IT WITH ; $FFFF ; WDREAD LDA #0 STA ICBLLZ STA ICBLHZ ; SET LENGTH TO ; ; ZERO JSR DKREAD ; READ A BYTE BMI WDEOF PHA JSR DKREAD ; READ THE ; ; SECOND BYTE BMI WDEOF1 TAY PLA CPY #$FF ; HI BYTE $FF? BNE TORTS ; NO, THEN WORD ; ; IS NOT $FFFF CMP #$FF ; YES, IS LOWER ; ; BYTE $FF? TORTS RTS ; IF BOTH $FF, ; ; RETURN ZERO FLAG ; WDEOF1 PLA WDEOF CPY #136 ; IS THIS END OF ; ; FILE? BNE WDXIT ; IF NOT, RETURN ; ; ERROR CODE PLA PLA ; ELSE, GET RID ; ; OF RETURN ADDR LDA ICPTLZ LSR A LSR A PHP JSR DKCLOS ; CLOSE FILE AND ; ; SET Y=1 PLP BCS TORTS ; EXIT IF NO-RUN ; ; SPECIFIED JMP (RUNADR) ; THEN GO TO ; ; RUN ADDRESS ; ;*INVOKE INIT FOR EVERY BLOCK ; OF INPUT CODE (USUALLY JUST ; AN RTS) ; DOINIT JMP (INIADR) ; CALL INDIRECT ; XIO FUNCTION TO CREATE A NEW ; DIRECTORY PARSE DIR NAME ; ; MKDIR JSR GETFNM JSR SFDIR ; FIND FILE IN ; ; DIRECTORY BCS MKDMRD LDA #172 ;FILE ALREADY ; ; EXISTS .BYTE $AE ; FAKE LDX #169 DISFUL LDA #169 ; DIR FULL ERR JMP AEXIT ; ;*READ IN BIT MAP ; MKDMRD LDA HOLFN BMI DISFUL JSR RBITMP LDY MAPBUF DEY DEY STY DATBYT ; ;*FIND EIGHT SECTORS FOR ; DIRECTORY ; LDA # <369 ; FIRST ; ; AVAILABLE SECTOR ; ; AFTER ROOT DIR STA CURSEC,X LDA # >369 STA CURSEC+1,X LDA #0 STA TMP1 FDIRLP INC TMP1 JSR FNDLBIT ; IS THIS SECTOR ; ; FREE? BCS FDIR2 AND MAPBUF,Y BCC FDIR1 FDIR2 AND MAPBUF+256,Y FDIR1 BNE FDIR3 STA TMP1 FDIR3 JSR INCCSEC LDA TMP1 CMP #8 BNE FDIRLP ; ;*ALLOCATE THE SECTORS USED ; ALCDLP JSR DECCSEC JSR FNDLBIT EOR #$FF BCS ALCPG2 AND MAPBUF,Y STA MAPBUF,Y BCC ALCPG1 ALCPG2 AND MAPBUF+256,Y STA MAPBUF+256,Y LSR MAP2MOD ALCPG1 JSR DECCNT DEC TMP1 BNE ALCDLP ; ;*WRITE ALLOCATION MAP BACK TO ; DISK ; JSR FMTMAP ; ;*ENTER NAME AND TYPE INFO ; INTO PARENT DIRECTORY ; LDA HOLFN JSR SDIRBK SEC JSR ENTNAME LDA CURSEC+1,X STA DIRBUF+4,Y LDA CURSEC,X STA DIRBUF+3,Y LDA #0 STA DIRBUF+2,Y LDA #8 STA DIRBUF+1,Y ASL A JSR SAVFLAG ; ;*THEN CLEAR NEW DIRECTORY ; LDA #1 STA FMSBPT LDA CURSEC,X LDY CURSEC+1,X JMP CLRDIR