X;SAVE #D9:FMSINIT.M65AFILE MANGER ENTRY POINTAX;(X; DFMSDH - DISK FILE MANAGEMENT DISKX; HANDLER ENTRY POINTX;$ @ORG .X;8 DFMSDHB DFMOPN;;OPEN FILEL DFMCLS;;CLOSE FILEV DFMGET;;GET FILE` DFMPUT;;PUT BYTEj DFMSTA;;STATUSt$ DFMDDC;;DEVICE DEPENDENT CMD~X;,X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X;0X; This table of single bit values is used by.X; GETSECTOR and FRESECt, the allocation/X; deallocation routines.X;GX; This is a crazy place to put it, but we had the bytes spare here.X; BITTBL =@= = ===X;-X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X;)X; and this flag, one byte below FMS's.X; initialization entry, is used to disable(,X; RAMIO's wait for vertical blank before2&X; doing a sector transfer...speeds<!X; up RAMDISK I/O tremendouslyFX;P(FASTRAM ;; a negative value allowsZ;the faster transfer rate.dX;nx+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X;X; INITIALIZATION CODEX;X; @ORG  DINIT X;X; SET UP DRIVE INFOX;2X; DRVTBL - 8 BYTES-ONE FOR EACH POSSIBLE DRIVEX;X; 0 = NO DRIVEX; NON-ZERO = DRIVE EXISTSX;&X; DBUFA(L,H) 8 TWO BYTE ENTRYS THE)X; DRIVE (VTOC) BUFFER ADR FOR A DRIVE"X;,QSASA;;MOVE START OF ALLOC6PZBUFP;;AREA TO ZBUFP@ QSASAJ PZBUFPTX;^QDRVBYT;;TEMP 1 IS DRIVEh"PZTEMP1;;EXCESS BITS FROM BOOTrX;|$>;;TEMP 2 ISX;3VTOCLOOPQ>;; PUT ZERO FOR NON-EXISTANT DRIVES"TZTEMP1;;SHIFT DR BIT TO CARRY D:DECDRV;;BR IF DR NOT THEREX; %>DVDWRQ;;SET WRITE READ OFF!P@ZBUFP7;;IN THE DRIVE BUFFERX;QZBUFP;;MOVE CURRENT ALLOCPDBUFAL9;;ADDR TO DBUFAQZBUFP;;AND INC ALLOCPDBUFAH9;;BY 144 BYTESQ>VTOCSIZE INCZBUFP;;VIA DINCBPX;*Q>DVDVTOP;; set length of regular vtoc&X;0&:DECDRVPDRVTBL9;; SET TABLE ENTRY:0;; DEC DRIVE NUMBERD!IVTOCLOOP;;BR IF MORE TO TESTNX;X$X; SET UP SECTOR ALLOCATION TABLEbX;l*X; THE SECTOR ALLOCATION TABLE (SECTBL)v$X; HAS 8 ONE BYTE ENTRIES-ONE FOR+X; EACH POSSIBLE 128 BYTE BUFFER. SABYTE'X; IN THE BOOT RECORD DETERMINES THE"X; NUMBER OF ENTRYS TO ALLOCATE(X; ALLOCATED ENTRIES ARE SET TO ZERO.X;)QZBUFP;; SAVE START OF SECTOR BUFFERSPSBUFSTART QZBUFPPSBUFSTARTX;)%SABYTE;; GET COUNT OF SECTOR BUFFERS$>X;)SECTLOOP1;; CHECK IF STILL ALLOCATING C PSECTBL9;; SET ALLOCATE BYTE .G:NEXTBUF;; SKIP BUFFER ALLOCATION IF DONE* DINCBP4:NEXTBUF2;; INC BUF#>(>;; ALL 8 DONE?H HSECTLOOPRX;\X; SET LOW MEMfX;pQZBUFP;;MOVE FINAL ADDRzPLMADR;;TO LOW MEM PTR QZBUFP PLMADRX;X; CLEAR FCBS TO ZEROX; CLRFCB Q>;;128 OF FCB?CFCBXPFCB8;;TO BE CLEARED3 ICFCBXX;?;; AGAIN SET Y TO ZERO ADI1QDEVTAB8;;FIND AH FADI2;;UNUSED R> D;;OR DISK$ FADI2;;EMPTY. 38 3B 3L )>V HADI1` +;;ELSE BREAKj X;t ADI2Q> D;;SET DISK~ PDEVTAB8 Q>DFMSDH;;SET FMS ADDR PDEVTAB8 Q>DFMSDH PDEVTAB8 X; :