; BIGBOARD SCAN PROGRAM VER. 2 19/11/82 ; BDOS EQU 0005H STREG EQU 010H ;STATUS REG. TREG EQU 011H ;TRACK REG. SEREG EQU 012H ;SECTOR REG. IOPTR EQU 0FF71H ;LABEL 'IOPTR' IN PFM SECVAL EQU 0FF6EH ;LABEL 'SECTOR' IN PFM RTYCT EQU 0FF70H ;LABEL 'RETRY' IN PFM CMDTYP EQU 0FF6FH ;LABEL 'CMDTYP' IN PFM RW1 EQU 0F73CH ;LABEL 'RW1' IN PFM SELECT EQU 0F6B1H ;LABEL 'SELECT' IN PFM BIOS EQU 0E800H ;START OF BIOS HOME EQU BIOS+24 ;HOME VECTOR SETTRK EQU BIOS+30 ;SET TRACK VECTOR ; ; ORG 100H SAVCUR: MVI C,25 ;GET LOGGED DISK # CALL BDOS STA LDSK ;SAVE IT ; DRSEL: LDA 05DH CPI ' ' ;CHECK FOR EXPLICIT DRIVE REQ. JNZ SEL1 ;YES, GO SEE IF VALID XRA A STA DRV ;SET UP TO USE CURRENT DRIVE JMP START ; SEL1: ANI 05FH ;CONVERT TO UPPER CASE CPI 'A' JC SELERR CPI 'D'+1 JNC SELERR SUI 'A'-1 ;CONVERT TO BINARY STA DRV ;SAVE DRIVE CODE ; START: MVI C,9 LXI D,MSG1 ;PRINT MOUNT MSG CALL BDOS MVI C,1 CALL BDOS ;WAIT FOR RESPONSE ANI 'G' ;CONV. TO UPPER CASE CPI 'G' JNZ EXIT ; LDA DRV ;GET DRIVE CODE ORA A JZ STEP1 ;USE CURRENT DRIVE DCR A ;CONVT TO TRUE CODE MOV C,A CALL SELECT ;GO SELECT DRIVE ORA A ;SET FLAGS JZ STEP1 ;JUMP IF SELECT OK LXI D,NRDY MVI C,9 CALL BDOS ;PRINT NOT READY MSG RESP: MVI C,1 CALL BDOS ;GET RESPONSE JMP SEL1 ; SELERR: LXI D,SELMSG MVI C,9 CALL BDOS ;PRINT INV SELECTION MSG JMP RESP ;GO ASK FOR DRIVE CODE ; STEP1: MVI C,2 ;PREPARE TO READ DIRECTORY CALL SETTRK ;SEEK TO TRACK 2 LXI H,VTOC ;INIT BUFFER ADDRESS SHLD BUFAD MVI A,1 ;INIT SECTOR VALUE STA SECT LOOP1: LHLD BUFAD MOV B,H MOV C,L CALL SETDMA LDA SECT MOV C,A CALL SETSEC MVI A,10 ;SET RETRY COUNT TO 10 CALL READ LHLD BUFAD LXI D,80H DAD D SHLD BUFAD LDA SECT CPI 14 JZ STEP2 ADI 6 CPI 31 JNZ TEST2 MVI A,5 TEST2: CPI 29 JNZ TEST3 MVI A,3 TEST3: CPI 27 JNZ STSEC MVI A,2 STSEC: STA SECT JMP LOOP1 BUFAD: DS 2 MSG1: DB 0DH,0AH,'MOUNT DESIRED DISK AND TYPE ''G''',0DH,0AH,'$' STEP2: CALL HOME MVI A,0 ;INITIALIZE TRACK COUNTER STA TRK MVI A,1 ; INITIALIZE SECTOR COUNTER STA SECT LOOP2: LDA TRK ; GET TRACK NO. CPI 77 ; LAST TRACK? JZ FIN MOV C,A ; TRACK NO. TO C CALL SETTRK ; GO SEEK LOOP3: LDA SECT ; GET SECTOR NO. CPI 27 ; LAST SECTOR? JZ NXTRK ; IF YES, INCR. TRK MOV C,A CALL SETSEC ; SET SECTOR MVI C,80H MVI B,0 CALL SETDMA ; SET DMA ADDR. MVI A,1 ;DISABLE RETRIES BY PFM CALL READ ; GO READ SECTOR CNZ ERR ; PROCESS STATUS IF NON-ZERO LXI H,SECT INR M ; INCR. SECTOR COUNT JMP LOOP3 NXTRK: LXI H,TRK INR M ; INCR. TRACK COUNT MVI A,1 STA SECT ; RESET SECTOR COUNT JMP LOOP2 FIN: LXI D,COMP ; PRINT ENDING MSG MVI C,9 CALL BDOS JMP START ; REQUEST ANOTHER DISKETTE ; ; TRK: DB 0 SECT: DB 1 ; ERR: CALL CONVT ; CONVERT TO ASCII SHLD STATUS IN TREG ; READ 1771 TRACK REG CALL CONVT SHLD TRACK IN SEREG ; READ 1771 SECTOR REG CALL CONVT SHLD SECTOR IN TREG SUI 2 JM PRTCPM ;ERROR IS IN CPM AREA MOV B,A RLC ;MULTIPLY ANI 0FEH ;TRACK ADD B ;BY 3 MOV C,A ;SAVE IN C MOV A,B RRC ;DIVIDE RRC ;TRACK BY 4 MOV B,A ;SAVE IN B ANI 3FH ;CLEAR EXCESS BITS ADD C ;A=INT(TRACK*3.25) STA BLK1 ;SAVE IT MOV A,B ANI 0C0H ;A=FRAC(TRACK*3.25) STA BLK2 ;SAVE IT LXI H,STABL ;SET UP SECTOR TABLE ADDRESS LXI B,20H ;B-C SET TO 1/8 OF A BLOCK IN SEREG ;CURRENT SECTOR IN A TEST5: CMP M ;DOES CURRENT SECT.= SECTOR IN TABLE? JZ SCH ;IF SO, GO FIND FILENAME INX H ;INCR. POINTER TO SECTOR TABLE XCHG ;SAVE IN D-E LHLD BLK2 ;BLOCK NO. TO H-L DAD B ;INCR. BY 1/8 SHLD BLK2 ;SAVE RESULT XCHG ;RESTORE H-L FROM D-E JMP TEST5 ;GO COMPARE NEXT TABLE ENTRY STABL: DB 1,7,13,19 DB 25,5,11,17 DB 23,3,9,15 DB 21,2,8,14 DB 20,26,6,12 DB 18,24,4,10 DB 16,22 BLK2: DS 1 BLK1: DS 1 SCH: LDA BLK1 CPI 0 JZ PRTDIR CPI 1 JZ PRTDIR LXI H,VTOC LXI D,20H MVI A,0E5H MVI B,64 LOOP4: SHLD ASAVE CMP M JNZ MATCH DAD D COUNT: DCR B JNZ LOOP4 LXI H,MSG4 SHLD MSG3 JMP ERENT MATCH: LXI D,10H DAD D LDA BLK1 TEST7: CMP M JZ FOUND INX H DCR E JNZ TEST7 MVI A,0E5H LXI D,20H JMP COUNT FOUND: LHLD ASAVE INX H LXI D,MSG5 MVI B,8 CALL LOOP5 INX D MVI B,3 CALL LOOP5 LXI H,MSG5 SHLD MSG3 JMP ERENT LOOP5: MOV A,M STAX D DCR B INX H INX D JNZ LOOP5 RET PRTCPM: LXI H,MSG6 SHLD MSG3 JMP ERENT PRTDIR: LXI H,MSG7 SHLD MSG3 ERENT: XRA A RETRY: STA ERRCT ; INIT RETRY COUNT MVI A,1 ;DISABLE RETRY BY PFM CALL READ ; RE-READ SECTOR JZ TMP ; IF OK IT'S TEMPORARY LDA ERRCT ; GET RETRY COUNT INR A CPI 9 ; LIMIT REACHED ? JNZ RETRY ; TRY AGAIN IF NOT LXI D,PERM ; PRINT PERM. ERROR MVI C,9 CALL BDOS JMP PRINT ; GO PRINT STATUS INFO TMP: LXI D,TEMP ; PRINT TEMP. ERROR MVI C,9 CALL BDOS PRINT: LXI D,MSG2 MVI C,9 CALL BDOS ; GO PRINT MSG LHLD MSG3 XCHG MVI C,9 CALL BDOS RET CONVT: MOV C,A CALL CONV1 MOV H,A MOV A,C RAR RAR RAR RAR CALL CONV1 MOV L,A RET CONV1: ANI 0FH ; STRIP OFF HIGH 4 BITS ORI 30H ; ADD ASCII PREFIX CPI 3AH ; IS IT 0-9 ? RM ; FINISHED IF YES ADI 7 ; MODIFY PREFIX FOR A-F RET ERRCT DB 0 ASAVE: DS 2 MSG3: DS 2 PTR: DS 2 OFFS1: DS 2 OFFS2: DS 2 ; SETSEC: MOV A,C STA SECVAL ;SET UP PFM'S SECTOR VALUE RET SETDMA: MOV L,C MOV H,B ;DMA ADDRESS TO H-L SHLD IOPTR ;SET UP PFM'S BUFFER POINTER RET READ: STA RTYCT ;SET UP RETRY COUNT FOR PFM MVI A,88H ;READ COMMAND STA CMDTYP ;PASS IT TO PFM JMP RW1 ;GO TO PFM TO READ & RETURN ; EXIT: LDA LDSK ;RESTORE LOGGED DISK MOV C,A JMP SELECT ;SELECT IT & GO TO CP/M ; LDSK: DS 1 ; DRV: DS 1 ;DRIVE SELECT CODE NRDY: DB 0DH,0AH,'DRIVE NOT READY ' DB 0DH,0AH,'MAKE IT READY OR SELECT ANOTHER, ' DB 0DH,0AH,'THEN REPLY WITH DRIVE NUMBER : $' SELMSG: DB 0DH,0AH,'INVALID DRIVE NUMBER. RE-ENTER (A-D) : $' TEMP: DB 0DH,0AH,'TEMP $' PERM: DB 0DH,0AH,'PERM $' MSG2: DB 'ERROR AT TRACK ' TRACK: DB 0,0,', SECTOR ' SECTOR: DB 0,0,'. STATUS = ' STATUS: DB 0,0,' $' MSG4: DB 'UNALLOCATED $' MSG5: DB ' $' MSG6: DB 'CP/M REGION $' MSG7: DB 'DIRECTORY $' COMP: DB 0DH,0AH,'SCAN COMPLETE$' VTOC: DS 2048 ;DIRECTORY BUFFER AREA END 100H