; SAVE#D:MDOS4.M65 ; ; ;*DOS ALLOCATION ROUTINES ; ;*FREE A SECTOR FOR LATER USE ; FREE JSR RBITMP ; MAKE SURE WE ; ; HAVE THE RIGHT MAP STA CHGMAP FMTFRE INC MAPBUF+3 ; BUMP LOW BYTE ; ; OF FREE SECTOR ; ; COUNT BNE FREE0 ;IF NO CARRY INC MAPBUF+4 FREE0 JSR FNDBIT PHA LDA TMP2 BEQ SBMP1 STY TMP2 CMP CURMP ; BEFORE FIRST ; ; HOLE? BCS SBMP2 ; NO, LEAVE ; ; UNCHANGED STA CURMP ; YES, NEW FIRST ; ; HOLE SBMP2 JSR RDNXTM LDY TMP2 LSR MAP2MOD ; MARK MAP PAGE2 ; ; DIRTY PLA ORA MAPBUF+256,Y STA MAPBUF+256,Y RTS ; SBMP1 PLA ORA MAPBUF,Y STA MAPBUF,Y RTS ; ;*FIND BIT ASSOCIATED WITH A ; SECTOR ON THE DISK ; FNDBIT LDA CURSEC,X AND #7 ; EXTRACT THE ; ; BIT NUMBER TAY SEC LDA #0 FREE1 ROR A ; POSITION CARRY ; ; TO THE BIT TO FLIP DEY BPL FREE1 PHA ; SAVE THE BIT ; ; MASK ; LDA CURSEC,X CLC ADC #10*8 ; ALLOW FOR 10 ; ; BYTE HEADER TAY ; SAVE LOW BYTE LDA CURSEC+1,X ADC #0 ; ADD IN CARRY LSR A STA TMP2 TYA ROR A LSR TMP2 ROR A LSR TMP2 ROR A TAY ; PLA ; RESTORE THE ; ; BIT MASK RTS ; ;*ALLOCATE AN UNUSED SECTOR TO A ; FILE ; ALLOC JSR RBITMP STA CHGMAP LDY #10 LDA #0 STA TMP2 ALL1 CMP MAPBUF,Y ; ANY BITS ; ; LEFT? BNE SECFN1 ; IF SO INY BNE ALL1 ; SEC LDA MAPBUF SBC CURMP SEC SBC #3 STA TMP1 ALLCK BMI ALGONE LDA CURMP STA TMP2 JSR RDNXTM LDA #0 TAY ALL2 CMP MAPBUF+256,Y BNE SECFN2 ; IF FREE SECTOR ; ; IN SECOND PART ; ; OF MAP INY BNE ALL2 INC CURMP ; TO NEXT SECTOR ; ; OF BIT MAP DEC TMP1 BPL ALLCK ; ALGONE DEC CURMP DFERR LDA #162 ; DISK FULL ERR JMP AEXIT ; ERROR-EXIT ; SECFN1 SEC LDX #$AF ; -8*10 - 1 ALL3 ROR A INX CMP MAPBUF,Y BCC ALL4 CLC BNE ALL3 ALL4 EOR MAPBUF,Y STA MAPBUF,Y BPL ALL7 ; SECFN2 SEC LDX #$AF ; -8*10 - 1 ALL5 ROR A INX CMP MAPBUF+256,Y BCC ALL6 CLC BNE ALL5 ALL6 LSR MAP2MOD EOR MAPBUF+256,Y STA MAPBUF+256,Y ; ALL7 TYA ASL A ROL TMP2 ASL A ROL TMP2 ASL A ROL TMP2 STA TMP1 TXA ADC TMP1 LDX CURFCB STA LNKSEC,X LDA TMP2 ADC #$FF STA LNKSEC+1,X DECCNT LDA MAPBUF+3 BNE NOBOR DEC MAPBUF+4 NOBOR DEC MAPBUF+3 CLC RTS ; ;*SIMULATE OLD STYLE BIT FINDER ; FNDLBIT JSR FNDBIT PHA ; SAVE MASK LDA TMP2 ; FIRST PAGE? BEQ FNDPG0 STY TMP2 ; SAVE OFFSET IN ; ; PAGE CMP DATBYT BCS DFEJMP JSR RDNXTM ; READ IN PROPER ; ; PAGE LDY TMP2 ; THEN RESTORE A ; ; AND Y REGS PLA SEC ; SET CY (PAGE 1 ; ; BUFFER USED) RTS ; FNDPG0 PLA ; RESTORE SAVED CLC ; MASK AND CLR ; ; CY-SAY PAGE 0 RTS ; DFEJMP JMP DFERR ; DECCSEC LDA CURSEC,X BNE ALCPG0 DEC CURSEC+1,X ALCPG0 DEC CURSEC,X RTS ; INCCSEC INC CURSEC,X BNE DELDIN INC CURSEC+1,X DELDIN RTS ; ;*DOS MISC. SUBROUTINES ; ;*SET UP STATE VARIABLES ON ; ENTRY ; SETUP LDY ICDNOZ ; GET UNIT # SETUPW STX CURFCB TSX INX INX STX STKPSV ; SAVE POINTER ; ; TO RETURN ADDR ; ; ON STACK SETUPD STY DUNIT ; COPY UNIT # ; ; TO DCB LDA #1 CPY RAMDKU BEQ UFIXED ; RAMDISK SECTOR ; ; SIZE IS ALWAYS ; ; 128 BYTES LDA SECSIZ-1,Y BEQ INVUNIT ; IF NOT ; ; CURRENTLY VALID ; ; UNIT, TEST FOR ; ; DENSITY ; UFIXED STA SECDAT ; OTHERWISE, ; ; STORE CORRECT ; ; DENSITY DATA LSR A ROR A ROR A ORA #$7D ; UPDATE THE ; ; LINK POSITION ; ; IN THE DISK SECTOR STA DLINK ; LDX CURFCB LDY BUFNO,X ; GET THE BUFFER ; ; NUMBER BNE RSETUP LDY FILES ; IF ONE IS NOT ; ; ALLOCATED INY SFORB DEY BEQ NOSECB ; ALLOCATE ONE, ; ; OR ABORT THE ; ; OPERATION NOW LDA BUFFLG-1,Y BNE SFORB LDA #$80 STA BUFFLG-1,Y TYA STA BUFNO,X RSETUP LDA DOSEND ; ==SBTABL STA FMSBPT LDA SBTABU-1,Y STA FMSBPT+1 RTS ; INVUNIT JSR JSTRD BNE UFIXED ; NOUNIT LDA #160 ; DRIVE NOT ; ; PRESENT ERR .BYTE $AE ; FAKE LDX NOSECB LDA #161 ; TOO MANY OPEN ; ; FILES ERR JMP AEXIT ; ;*REMOVE DOS POINTER FROM BOOT ; SECTORS ; TDDOS JSR TSTDOS ; MUST WE UPDATE ; ; BOOT? BNE NODOSX ; NO, RETURN ; DELDOS LDY #0 ; YES, REMOVE ; ; DOS POINTER ; ; FROM BOOT BEQ UPDBT ; ;*ADD DOS POINTER TO BOOT ; SECTORS ; SETDOS STY DOSLOC STA DOSLOC+1 LDY SECDAT UPDBT LDA DUNIT CMP RAMDKU BEQ TDEXIT STY SECDAT LDA STATE PHA LDA DEFAULT PHA LDA #$00 STA STATE ; NOTHING IS IN ; ; MEMORY YET LDY #$FF LDA FCBOTC,X BMI NOAND ; LONG LENGTH ; ; FIELD? LDY #$03 ; IF NOT, USE ; ; ONLY 10 BITS NOAND STY ANDCD+1 LDA # >BOOTFL LDY #