* *``````````````````````````````* * DEMO.DOSFM.ASM * * * * A DEMO FILE FOR THE DOS * * FILE MANAGER MACROS. * * * THIS IS CURRENTLY UNFINISHED * * AND DOES NOT EVEN REMOTELY * * WORK PROPERLY. IT WILL BE * * INTEGRATED INTO THE REST OF * * THE COLLECTION IN THE NEXT * * REVISION. * * * * AUTHOR: NATHAN RIGGS * * CONTACT: NATHAN.RIGGS@ * * OUTLOOK.COM * * * * DATE: 21-APR-2021 * * ASSEMBLER: MERLIN 8 PRO * * OS: DOS 3.3 * *,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* * ** ASSEMBLER DIRECTIVES * CYC AVE EXP OFF TR ON DSK CATM OBJ $BFE0 ORG $6000 * *``````````````````````````````* * TOP INCLUDES * *,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* * PUT MIN.HEAD.REQUIRED.ASM USE MIN.MAC.REQUIRED.ASM PUT MIN.HEAD.DOS.ASM USE MIN.MAC.DOSFM.ASM * ]TRKOFF EQU $01 ; TRACK OFFSET IN CAT SECTOR ]SECOFF EQU $02 ; SECTOR OFFSET IN CAT SECTOR ]HOME EQU $FC58 ; CLEAR SCREEN VECTOR ]ZSLOT EQU $06 ; SLOT TO USE ]ZDRIVE EQU $02 ; DRIVE TO USE ]WORK EQU $9000 ; WORK AREA FOR VTOC AND CATSECS ]DEST EQU $8000 ; DESTINATION FOR ALL ; FILE DESCRIPTION ENTRIES (FDE'S) * JMP _ENDVARS * FDECOUNT HEX 00 ; NUMBER OF ENTRIES AT THE END CURTRK HEX 00 ; CURRENT TRACK IN LOOP CURSEC HEX 00 ; CURRENT SECTOR IN LOOP CURADDR DA ]DEST ; CURRENT WORKING ADDRESS IN ; THE DESTINATION ADDRESS AREA NEWADDR DA ]DEST ; FOR COUNTING THE NUMBER OF ENTRIES * _ENDVARS * ** RESET ALL VARIABLES * LDA #0 TAX TAY STA FDECOUNT STA CURTRK STA CURSEC STA CURADDR STA CURADDR+1 STA NEWADDR STA NEWADDR+1 * ** PUT THE VTOC IN THE WORK AREA * SRWTS #]ZSLOT;#]ZDRIVE;#0;#$11;#0;#]WORK;#1 GRWTS * ** READ THE TRACK AND SECTOR OF FIRST CATALOG SECTOR, ** THEN PUT THAT FIRST SECTOR INTO THE WORK AREA * LDY #]TRKOFF ; GET TRACK OFFSET LDA ]WORK,Y ; GET NEW TRACK AT OFFSET STA CURTRK ; STORE NEW TRACK LDY #]SECOFF ; GET SECTOR OFFSET LDA ]WORK,Y ; GET NEW SECTOR AT OFFSET STA CURSEC ; STORE NEW SECTOR * SRWTS #]ZSLOT;#]ZDRIVE;#0;CURTRK;CURSEC;#]WORK;#1 GRWTS * ** GET NEXT CURRENT TRACK AND SECTOR AND HOLD IT * LOOP1 LDY #]TRKOFF ; GET TRACK OFFSET LDA ]WORK,Y ; GET NEW TRACK AT OFFSET STA CURTRK ; STORE NEW TRACK LDY #]SECOFF ; GET SECTOR OFFSET LDA ]WORK,Y ; GET NEW SECTOR AT OFFSET STA CURSEC ; STORE NEW SECTOR * ** IF TRACK AND SECTOR ARE NOT #0, COPY THE SEVEN ** FILE DESCRIPTION ENTRIES (FDE'S) TO THE DESTINATION * LDY #$0A ; OFFSET TO START OF FDE'S -1 LDX #255 INLOOP INY INX LDA ]WORK,Y ; GET BYTE IN WORK AREA STA ]DEST,X ; STORE IN DESTINATION CPY #$FF ; IF .Y != LAST BYTE OF FDE, BNE INLOOP ; THEN KEEP LOOPING * ** INCREASE THE CURADDR BY #$F4, WHICH IS THE TOTAL ** BYTE LENGTH OF THE SEVEN DFE'S COMBINED * LDA #$F4 ; LOAD THE TOTAL FDE LENGTH CLC ; (CLEAR THE CARRY) ADC CURADDR ; ADD LOW BYTE OF CURRENT ADDRESS STA CURADDR ; STORE BACK IN CURADDR LDA #0 ; LOAD ZERO ADC CURADDR+1 ; AND ADD HIGH BYTE FOR CARRY STA CURADDR+1 ; THEN STORE BACK IN CURADDR+1 * ** IF BOTH THE TRACK AND THE SECTOR TO BE JUMPED TO ** ARE #0, THEN GOTO COUNTIT TO COUNT THE FDE'S * LDA CURSEC ; IF CURSEC != 0 CMP #0 BNE _NOT0 ; THEN GOTO _NOT0 LDA CURTRK ; IF CURTRK != 0 CMP #0 BNE _NOT0 ; THEN GOTO _NOT0 JMP COUNTIT ; OTHERWISE, COUNT FDE'S * ** READ CATALOG SECTOR AT CURTRK AND CURSEC, ** THEN COPY IT TO THE WORK AREA * _NOT0 SRWTS #]ZSLOT;#]ZDRIVE;#0;CURTRK;CURSEC;#]WORK;#1 GRWTS * ** LOOP BACK TO THE NEW SECTOR TO WORK WITH * * ** WE ARE NOW DONE COPYING. NEXT, WE NEED TO COUNT ** THE NUMBER OF FILE DESCRIPTION ENTRIES THAT WERE ** ^ACTUALLY^ COPIED TO THE DESTINATION. * COUNTIT * ** CLEAR THE RELEVANT COUNTERS * LDA #0 TAX TAY * ** INIT VARIABLES FOR COUNTING LOOP * LDA NEWADDR CLC ADC #3 STA NEWADDR LDA #0 ADC NEWADDR+1 STA NEWADDR+1 LDA #0 STA FDECOUNT * ** LOOP TO COUNT NUMBER OF ENTRIES * CLOOP *LDY #0 *LDA NEWADDR *STA ADDR1 *LDA NEWADDR+1 *STA ADDR1 *LDA (ADDR1),Y *CMP #0 *BEQ _QUIT *INC FDECOUNT *LDA NEWADDR *CLC *ADC #$22 *STA NEWADDR *LDA #0 *ADC NEWADDR+1 *JMP CLOOP * ** EXIT * _QUIT LDY FDECOUNT LDA NEWADDR LDX #2 STX RETLEN STA RETURN LDX NEWADDR+1 STX RETURN+1 * * EXIT JMP $3D0 * PUT MIN.LIB.REQUIRED.ASM *