; --- DUMP --- ; ; BY: S. J. SINGER ; ; THIS PROGRAM IS AN IMPROVED DUMP UTILITY FOR CP/M. ANY CPM FILE ;MAY BE DUMPED TO THE CONSOLE IN A FORMAT SIMILAR TO THAT USED BY THE ;DDT DUMP COMMAND. IN ADDITION, ANY SECTOR OR GROUP OF SECTORS MAY ;BE DUMPED IN THE SAME FORMAT. ; ; -- OPERATION -- ; ; THE PROGRAM MAY BE RUN EITHER BY TYPING DUMP, OR DUMP FOLLOWED ;BY THE FILE NAME OR TRACK AND SECTOR. IF DUMP IS TYPED THE PROGRAM ;RESPONDS WITH A HEADING FOLLOWED BY A '*' AND WAITS FOR MORE INPUT. ;OPERATION IN THIS MODE IS SIMILAR TO OTHER UTILITIES LIKE PIP OR DDT. ; THE OPERATION DESIRED MAY THEN BE TYPED IN AS FOLLOWS: ; ; DUMP FILE.NAM ; DUMP A:FILE.NAM ; DUMP B:FILE.NAM ; ; OR DUMP MAY BE TYPED SEPARATELY AS: ; ; DUMP ; ; *FILE.NAM ; *B:FILE.NAM (THE * IS A PROGRAM PROMPT) ; ; THE PROGRAM MAY ALSO BE USED TO DUMP DISK SECTORS DIRECTLY, ;DUMP ANY CP/M EIGHT SECTOR GROUP, A MAP OF THE GROUP ALLOCATIONS FOR THE ;ENTIRE DISK OR THE DIRECTORY SORTED ALPHABETICALLY. ; ; DUMP TRACK 3 SECTOR 7 ; DUMP TRACK 5 SECTOR 3 - 9 ; DUMP TRACK 6 (DUMPS ALL 26 SECTORS) ; DUMP GROUP 19 ; DUMP MAP ; DUMP DIR (DUMPS DIRECTORY) ; ; THE WORDS TRACK, SECTOR AND GROUP MAY BE ABREVIATED AS FOLLOWS ; ; DUMP G 4 ; DUMP T 7 S 3-4 ; *TRACK 5 S 6 ; *SECTOR 2- 9 T 14 ; ; ; DUMP B: TRACK 3 ; DUMP A: T 9 S 4-6 ; DUMP B: G 5 ; DUMP B:MAP ; ; NOTE THAT THE FORMAT IS QUITE FREE. SPACES ARE USUALLY IGNORED ;THEY ARE ONLY REQUIRED AFTER THE WORDS TRACK AND SECTOR OR T AND S, ;AND AFTER THE WORD DUMP. ; A LIMITED EDITING FEATURE IS INCLUDED IN THE DUMP UTILITY TO ;ALLOW CHANGING DATA ON THE DISK. THE EDIT FEATURE WORKS AS FOLLOWS. ;ANY SINGLE SECTOR ON EITHER DRIVE MAY BE EDITED BY REQUESTING DISPLAY ;OF THE SECTOR FOLLOWED BY THE WORD EDIT. ; ; DUMP B:TRACK 4 SECTOR 2 EDIT ; ; THE REQUESTED SECTOR WILL BE DISPLAYED FOLLOWED BY AN EDIT PROMPT ; ; EDIT - ; ; ENTER THE ADDRESS OF THE FIRST BYTE TO BE CHANGED. THE PROGRAM WILL ;RESPOND BY TYPING BACK THE ADDR ENTERED AND THE PRESENT CONTENTS OF THAT ;ADDRESS. TO CHANGE THE CONTENTS OF THE ADDRESS ENTER THE NEW BYTE FOLLOWED ;BY A CARRIAGE RETURN. THE PROGRAM WILL DISPLAY THE NEXT ADDRESS AND ITS ;CONTENTS. TO STOP ENTERING DATA TYPE A PERIOD. THE PROGRAM WILL REDISPLAY ;THE SECTOR SHOWING THE CHANGES MADE. THE EDIT FEATURE WORKS ALMOST EXACTLY ;LIKE THE S ENTRY FEATURE IN DDT. TYPING ONLY A CARRIAGE RETURN OMITS ENTRY. ; TYPING A PERIOD MERELY REDISPLAYS THE SECTOR FROM MEMORY, IT DOES ;NOT CAUSE IT TO BE WRITTEN BACK ON THE DISK. WHEN EDITING IS COMPLETE, ;REDISPLAY THE SECTOR BY TYPING A PERIOD AND TYPE EITHER ; ; WRITE (WRITE SECTOR BACK ON DISK) ; STOP (STOP EDITING WITHOUT WRITING ON DISK) ; ; ALL EDIT ENTRIES MUST BE MADE IN HEX. ENTERING NON HEX CHARACTERS ;RESULTS IN AN ERROR MESSAGE. THE PERMISSABLE ADDRESS RANGE IS 0000 TO 007F. ;LARGER ADDRESSES GIVE AN ERROR MESSAGE. WHEN ENTERING A GROUP OF BYTES THE ;ADDRESSES ARE COMPUTED MODULO 128, THE NEXT ADDRESS AFTER 007F IS 0000. ; THE EDIT FEATURE SHOULD BE USED WITH CAUTION SINCE IT IS POSSIBLE ;TO EDIT CP/M TO "DEATH" BY CHANGING A SINGLE BYTE. ONE OCCASIONAL VALUABLE ;USE IS TO RESTORE FILES THAT HAVE BEEN ACCIDENTALLY ERASED. ERASING A FILE ;USING THE ERA COMMAND DOES NOT ERASE THE DATA FROM THE DISK, BUT ONLY ENTERS ;AN E5 INTO THE FIRST BYTE OF THE DIRECTORY. TO RESTORE A FILE, DISPLAY ;THE DIRECTORY BY DISPLAYING GROUPS 0 AND 1. FIND THE SECTOR CONTAINING THE ;NAME OF THE FILE TO BE RESTORED AND DISPLAY IT USING THE EDIT FEATURE ;CHANGE THE BYTE PRECEEDING THE FILE NAME FROM E5 TO 00 AND WRITE THE SECTOR ;BACK ON THE DISK. THIS WILL RESTORE THE FILE PROVIDED NONE OF THE SECTORS ;IN THE FILE WERE CHANGED AFTER THE FILE WAS "ERASED". ; ; AN ADDITIONAL FEATURE OF DUMP IS THE ABILITY TO VALIDATE A DISK. ; ; DUMP VALIDATE ; DUMP A:VALIDATE ; DUMP B:VALIDATE ; ; THIS CAUSES THE ENTIRE DISK SELECTED TO BE READ ONE SECTOR AT A ;TIME. THE SECTOR NUMBER OF ANY SECTOR CAUSING A READ ERROR WILL BE DISPLAYED. ;WHEN VALIDATING THE PROGRAM READS EVERY FIFTH SECTOR FOR SPEED. ; ; AS WITH OTHER CP/M UTILITIES ^S "FREEZES" THE DISPLAY, AND ^C ;RETURNS TO THE MONITOR. DUMP CONTAINS MANY ERROR AND CONSISTANCY ;CHECKS. THE RESULTING MESSAGES SHOULD BE SELF EXPLANATORY. ; ; DUMP WAS ASSEMBLED USING THE CP/M MACRO ASSEMBLER, AND USES A LARGE ;NUMBER OF MACROS INCLUDED IN A LIBRARY CALLED MACRO.LIB ; $-PRINT MACLIB MACRO ;INCLUDE MACRO LIBRARY ORG 100H ;SET PROG START LXI H,0 DAD SP ;GET STACK POINTER SHLD OLDSTK LXI SP,NEWSTK ;SET UP NEW STACK DISKIO ?DRIVE ;GET CURRENTLY LOGGED DRIVE NO STA NEWDRV ;ALSO SAVE IN NEW DRIVE NO LDA 81H ;CONSOLE INPUT ALREADY HERE ? ORA A JZ SIGNON ;BUFFER EMPTY, INPUT FROM CONSOLE LDA 80H ;GET NO OF CHAR INPUT ORI 80H ;ADD 128 MOV L,A ;TO L XRA A ;ZERO MOV H,A ;HL CONTAINS ADDR OF END OF BUFFER ZBFF: INR L JZ START ;REMAINDER OF BUFFER ZEROED MOV M,A JMP ZBFF ;LOOP SIGNON: PRINT PRINT <'COPYRIGHT 1978 BY S. J. SINGER',CR,LF> NEWIN: PRINT MVI A,0FFH ;SET SWITCH TO RETURN HERE AGAIN STA INFLAG LXI SP,NEWSTK ;RESET STACK POINTER XRA A STA VALFLG ;RESET VALIDATION ERROR FLAG LXI H,0 SHLD LINE ;SET LINE COUNT TO ZERO FILL 80H,0FFH ;ZERO INPUT BUFFER INPUT 80H ;READ FILE NAME ; ; SELECT DISK DRIVE AND SET UP FILE CONTROL BLOCK ; START: FILL FCB,FCB+32 ;ZERO FILE CONTROL BLOCK MATCH 82H,'A:' ;DRIVE A JZ ADISK MATCH 82H,'B:' ;DRIVE B JZ BDISK JMP GETNAM ;NO DRIVE SPECIFIED ADISK: XRA A STA NEWDRV ;SELECT DRIVE A JMP DOWN BDISK: MVI A,1 STA NEWDRV ;SELECT DRIVE B DOWN: MOVE 82H,80H,40H ;SHIFT BUFFER DOWN TWO BYTES ; ; SEARCH FOR DIRECT READ OF TRACK AND SECTOR OR VALIDATE ; GETNAM: INSTR 82H,40H,'VALIDATE' JC VALID ;VALIDATE DISK INSTR 82H,40H,'GROUP' JC GROUP ;DISPLAY CPM 8 SECTOR GROUP INSTR 82H,40H,'G ' ;SEARCH FOR 'G' JC GROUP ;DISPLAY GROUP INSTR 82H,40H,'MAP' ;ALLOCATION MAP JC MAP ;DISPLAY GROUP ALLOCATION MAP INSTR 82H,40H,'DIR' ;DIRECTORY REQUEST JC DIR ;DISPLAY DIRECTORY INSTR 82H,40H,'TRACK' ;SEARCH FOR TRACK JC TRK1 INSTR 82H,40H,'T ' ;SEARCH FOR 'T' JNC FILNAM ;NO TRACK GO TO READ FILE TRK1: SCAN ;FIND AND CONVERT NUMBER DECIN JC INERR ;INPUT ERROR ON CARRY STA TRACK ;SAVE TRACK NO INSTR 82H,40H,'SECTOR' ;SEARCH FOR SECTOR JC SEC1 INSTR 82H,40H,'S ' ;TRY 'S' JNC WHLTRK ;DUMP ENTIRE TRACK SEC1: SCAN DECIN JC INERR ;INPUT ERROR ON CARRY STA BSEC ;BEGINNING SECTOR STA ESEC ;SAVE IN END SECTOR ALSO XCHG ;SET BUFFER POINTER FOR SCAN SHLD IPOINT ;SAVE BUFFER POINTER FOR EDIT INSTR ,40H,'-' ;SEARCH FOR '-' JNC EDIT ;CHECK FOR EDITION OF SECTOR SCAN DECIN ;SCAN AND CONVERT ANOTHER NO JC INERR ;ERROR IF CARRY SET STA ESEC ;SAVE IN END SECTOR LXI H,BSEC ;POINTS TO BSEC CMP M ;COMPARE BEGIN AND END JP DOREAD ;OK IF END>=BEGIN MOV B,A ;OTHERWISE MOV A,M ;SWITCH THEM STA ESEC MOV M,B DOREAD: CALL RDISK0 ;READ DIRECT JMP ENDFIL ;BACK FOR MORE INPUT EDIT: LHLD IPOINT ;RESET BUFFER POINTER INSTR ,40H,'EDIT' ;CHECK EDIT FUNCTION JNC DOREAD ;GO TO DISPLAY SECTOR CALL RDISK0 ;DISPLAY SECTOR EDIT1: PRINT FILL INBUF,INBUF+9 INPUT INBUF,6 ;INPUT MAXIMUM 6 CHAR INSTR INBUF,8,'WRITE' ;WRITE EDITED SECTOR ON DISK? JC WRTDSK ;WRITE BUFFER BACK ON DISK INSTR INBUF,8,'STOP' ;STOP EDITING WITHOUT WRITING? JC ENDFIL ;EXIT HEXIN INBUF+2 ;CONV ASCII TO HEX JNC CKLIM ;IF NO ERROR, CHECK ADDR LDAX D ;GET ASCII CHAR CPI '.' ;CHECK FOR EXIT CHAR JZ EDIT3 ;BACK FOR MORE EDITING JMP ADERR ;ADDRESS ERROR CKLIM: LXI D,0080H ;CHECK ADDR LIMIT CPHL JP ADERR ;ADDRESS ERROR SHLD IPOINT ;SAVE ADDRESS PRINT CRLF,$ PTX: HEXOUT IPOINT+1 HEXOUT IPOINT ;ECHO THE ADDRESS PRINT SPACE,$ LHLD IPOINT ;ECHO PRESENT CONTENTS LXI D,0080H DAD D ;COMPUTE MEMORY ADDR MOV A,M ;GET BYTE FROM MEMORY HEXOUT PRINT SPACE,$ FILL INBUF,INBUF+5 ;ZERO INPUT BUFFER INPUT INBUF,4 ;INPUT 4 CHAR MAX HEXIN INBUF+2 ;CONVERT JNC EDIT2 ;HEX CHAR LDAX D ;GET ASCII CHAR CPI '.' ;PERIOD ENDS INPUT JZ EDIT3 ;BACK FOR MORE EDITING JMP HEXERR ;ERROR NOT HEX CHAR EDIT2: LDA INBUF+1 ;LOAD NO OF CHAR TYPED ORA A JZ EDITX ;NO REPLACEMENT IF JUST CR MOV A,L ;CONVERTED CHAR BACK TO A LHLD IPOINT ;LOAD MEMORY BUFFER POINTER LXI D,0080H ;OFFSET DAD D ;CALC MEMORY ADDR MOV M,A ;STORE NEW INPUT TO MEMORY EDITX: PRINT CRLF,$ LDA IPOINT ;LEAST SIGNIFICANT HALF OF ADDR INR A ;INCR BY ONE ANI 7FH ;COUNT MOD 128 STA IPOINT JMP PTX ;INPUT MORE DATA EDIT3: LXI H,0 SHLD LINE ;RESET LINE NO TO ZERO CALL PRTSEC ;PRINT BUFFER WITH HEADING JMP EDIT1 ;BACK FOR ADDITIONAL EDITING WRTDSK: CALLBIOS DWRITE ;WRITE BUFFER BACK ON DISK JMP ENDFIL ;EXIT ; ; READ TRACK AND SECTOR DIRECT ; RDISK0: CALL FIXB RDISK: SETSEC BSEC ;SET SECTOR JC BADSEC ;WRONG SECTOR NO TRK2: SETTRK TRACK ;SET TRACK JC BADTRK ;WRONG TRACK NO LDA NEWDRV MOV E,A DISKIO LOGIN ;SELECT NEW DEIVE IF SPECIFIED CALLBIOS DREAD ;READ TRACK AND SECTOR ; ; PRINT DRIVE, TRACK AND SECTOR HEADING ; PRTSEC: LDA NEWDRV ;NEW DRIVE NO ORA A JNZ PRNB ;PRINT DRIVE B PRINT PRNTRK: PRINT ' TRACK ' LXI H,0 LDA TRACK MOV L,A DECOUT PRINT ' SECTOR ' LXI H,0 LDA BSEC MOV L,A DECOUT PRINT CRLF,$ CALL PRTBUF ;PRINT IT LXI H,BSEC ;ADDR OF SECTOR NUMBER LDA ESEC ;END SECTOR NUMBER CMP M ;COMPARE THEM RZ ;EXIT IF THEY ARE EQUAL INR M ;INCR BSEC JMP RDISK PRNB: PRINT JMP PRNTRK ;PRINT TRACK AND SECTOR ; ; DUMP ENTIRE TRACK IF NO SECTOR INPUT ; WHLTRK: MVI A,1 ;BEGIN SECTOR STA BSEC MVI A,26 ;END SECTOR STA ESEC CALL RDISK0 ;TO READ DISK JMP ENDFIL ;BACK FOR MORE INPUT ; ; FILL IN FCB FOR NAMED FILE ; FILNAM: FILFCB FCB,82H ;FILL IN FCB NAME FROM INPUT BUFFER JC NAMERR ;ERROR IN FILE NAME MATCH FCB+9,'COM' ;TEST FOR COM FILE JNZ SELDR LXI H,100H SHLD LINE ;SET LINE NO. TO 100 SELDR: LDA NEWDRV ;SELECT NEW DRIVE MOV E,A DISKIO LOGIN DISKIO OPEN,FCB ;0PEN FILE CPI 255 ;CHECK FILE PRESENT JZ OPNERR ;EXIT IF ERROR RDFILE: DISKIO READ,FCB ;READ A BLOCK ORA A ;ZERO INDICATES SUCESSFUL READ JNZ ENDFIL ;1 INDICATES EOF CALL PRTBUF ;DO PRINT SUBROUTINE JMP RDFILE ;BACK FOR NEXT BLOCK ENDFIL: LDA INFLAG ;SEE WHERE TO GO ORA A JZ MONITOR JMP NEWIN ; ; ; PRTBUF - PRINT BUFFER IN HEX AND ASCII ; PRTBUF: MVI B,8 ;8 LINES LXI H,80H ;INITIAL BUFFER POINTER SHLD IPOINT ;STORAGE FOR POINTER BPRN: LHLD IPOINT ;LOAD POINTER MVI C,16 ;CHAR PER LINE LDA LINE+1 ;LINE NUMBER SAVE B,H HEXOUT LDA LINE ;SECOND TWO DIGITS HEXOUT PRINT ' ' RESTORE H,B PLOOP: MOV A,M ;GET A BYTE SAVE B,H HEXOUT PRINT SPACE,$ RESTORE H,B INX H ;INCR MEMORY POINTER MOV A,C CPI 9 ;CHECK 8 CHAR JNZ DECC ;SKIP IF NOT SAVE B,H PRINT SPACE,$ RESTORE H,B DECC: DCR C ;DECR CHAR COUNT JNZ PLOOP ;PRINT SOME MORE SAVE B PRINT SPACE,$ RESTORE B LHLD IPOINT ;RESET POINTER FOR ASCII MVI C,10H ;RESET CHAR COUNT PLOOP1: MOV A,M ;GET A BYTE ANI 7FH ;MASK OFF HIGH BIT CPI 7FH ;DELETE CODE JZ PERIOD ;PRINT PERIOD FOR DELETE CPI 20H ;TEST FOR CONTROL CHAR JP SKIPX ;SKIP SUBSTITUTION PERIOD: MVI A,2EH ;ASCII PERIOD SKIPX: SAVE B,H CHAROUT ;PRINT IT SAVE REGS RESTORE H,B INX H ;INCR MEMORY POINTER MOV A,C CPI 9 ;CHECK 8 CHAR JNZ DECC2 SAVE B,H PRINT SPACE,$ RESTORE H,B DECC2: DCR C ;DECR CHAR COUNT JNZ PLOOP1 ;PRINT SOME MORE SAVE B PRINT CRLF,$ ;CARRIAGE RETURN CALL PRNCON ;PRINT CONTROL? POP B INDEX LINE,16 ;INCR LINE NO BY 16 DCR B ;DECR LINE COUNT RZ ;RETURN IF LINE COUNT ZERO INDEX IPOINT,16 ;INCR POINTER BY 16 JMP BPRN ;LOOP BACK ; ; THIS SECTION VALIDATES A DISK ; VALID: MVI A,1 ;START WITH SECTOR 1 STA SNUM XRA A ;START WITH TRACK 0 STA TNUM LDA NEWDRV ;SELECT NEW DRIVE MOV E,A DISKIO LOGIN RS0: SETTRK TNUM JC BADTRK RS1: SETSEC SNUM JC BADSEC CALLBIOS DREAD ORA A CNZ VALERR ;ERROR IF NOT ZERO CALL PRNCON ;ESCAPE ON CONTROL C LDA SNUM ;SECTOR NO ADI 5 ;INCR BY 5 STA SNUM ;STORE IT BACK SBI 27 ;CALC SECTOR MOD 26 JM RS1 ;SECTOR OK IF MINUS INR A ;SECTOR MOD 26 STA SNUM ;STORE IT BACK CPI 1 ;ARE WE BACK TO ONE YET JNZ RS1 ;READ SOME MORE LDA TNUM ;TRACK NUMBER INR A ;INCR BY ONE CPI 77 ;CHECK LIMIT JZ VALOUT ;TO EXIT STA TNUM ;STORE BACK TRACK NO JMP RS0 ;BACK TO READ ROUTINE VALOUT: LDA VALFLG ;CHECK ERROR FLAG ORA A JNZ ENDFIL PRINT LDA NEWDRV ORA A JNZ VAL2 PRINT ' DRIVE A' JMP ENDFIL VAL2: PRINT ' DRIVE B' JMP ENDFIL VALERR: PRINT LDA TNUM LXI H,0 MOV L,A DECOUT PRINT ' SECTOR ' LXI H,0 LDA SNUM MOV L,A DECOUT PRINT CRLF,$ MVI A,-1 STA VALFLG ;SET ERROR FLAG RET ; ; PRINT CONTROL AND ESCAPE ; PRNCON: MVI C,11 CALL 5 ANI 1 RZ ;RETURN CHARIN ;READ CONSOLE CPI 3 ;TEST FOR CONTROL C JZ ENDFIL ;EXIT IF CONTROL C RET ; ; THIS SECTION DISPLAYS A CPM GROUP OF 8 SECTORS ; GROUP: SCAN ;GET THE GROUP NO DECIN ;CONVERT TO BINARY JC INERR ;INPUT ERROR IF CARRY SET STA G ;SAVE GROUP NO ADI 13 ;CHECK LEGAL RANGE JC BADGRP XRA A STA S ;SET SECTOR COUNT TO 0 CALL FIXB ;RESTORE DRIVE B IF SELECTED GRP1: CALL GRPTS ;CONVERT TO TRACK AND SECTOR CALL RDISK ;PRINT THE SECTOR LDA S ;CHECK SECTOR COUNT INR A STA S ;INCR S BY 1 CPI 8 ;CHECK LIMIT JNZ GRP1 ;PRINT ANOTHER SECTOR JMP ENDFIL ;BACK FOR MORE INPUT ; ; GRPTS CONVERT CPM GROUP AND SECTOR NUMBER TO TRK AND SEC ; GRPTS: MVI H,0 ;ZERO H LDA G ;GROUP NO MOV L,A ;TO L MOV D,H ;ZERO D DAD H DAD H DAD H ;SHIFT LEFT 3 LDA S ;GET SECTOR NO MOV E,A ;TO DE DAD D ;HL HAS G*8+S LXI D,-26 ;DIVISOR MVI A,1 ;CONTAINS DIVIDEND DIV: DAD D ;SUB 26 INR A JC DIV ;LOOP TILL MINUS LXI D,TABLE+26 ;INDEX INTO TABLE DAD D STA TRACK ;STORE TRACK NO MOV A,M ;GET SECTOR NO STA BSEC ;SAVE IN BEGINNING SECTOR STA ESEC ;SAVE IN END SECTOR TOO RET $+PRINT ; ; THIS ROUTINE DISPLAYS THE DISK SECTOR ALLOCATION MAP ; MAP: LDA NEWDRV MOV E,A DISKIO LOGIN ;LOG IN SELECTED DRIVE DISKIO ?ALLOC ;GET POINTER TO ALLOCATION MAP MOV H,B MOV L,A ;TO HL SHLD IPOINT ;SAVE MAP POINTER LXI H,0 ;ZERO HL SHLD G ;ZERO COUNT OF UNUSED GROUPS PRINT LDA NEWDRV ;LOGGED DRIVE ORA A JNZ DRB ;DRIVE B PRINT <' A',CR,LF,LF> JMP MAP1 DRB: PRINT <' B',CR,LF,LF> MAP1: LHLD IPOINT ;POINTER TO DISK ALLOCATION MAP MVI D,8 ;NO OF LINES MAP2: MVI C,4 ;WORDS PER LINE MAPX: SAVE PRINT ' ' RESTORE MAP3: MVI B,8 ;BITS PER WORD MOV A,M ;GET A BYTE FROM ALLOC MAP MAP4: RAL ;SHIFT LEFT THRU CARRY SAVE B,D,H,PSW JC MAP5 ;PRINT A ONE PRINT '0' ;PRINT A ZERO LDA G ;UNUSED GROUPS INR A ;ADD 1 STA G ;STORE IT BACK JMP MAP6 MAP5: PRINT '1' ;PRINT A ONE MAP6: RESTORE PSW,H,D,B SAVE PSW ;SAVE BIT MAP BYTE MOV A,B ;BIT COUNT CPI 7 JNZ MAPY MOV A,C ;WORD COUNT CPI 2 JNZ MAPY MOV A,D ;LINE COUNT CPI 1 JNZ MAPY RESTORE PSW JMP MAP7 ;TO PRINT UNUSED GROUPS MAPY: RESTORE PSW DCR B ;DCR BIT COUNT JNZ MAP4 ;PRINT MORE BITS DCR C ;DECR WORD COUNT INX H ;INCR ALLOC MAP POINTER JNZ MAP3 SAVE PRINT CRLF,$ RESTORE DCR D ;DECR LINE COUNT JMP MAP2 MAP7: PRINT DECOUT G ;PRINT NO OF UNUSED SECTORS PRINT <' GROUPS REMAINING ON DISK OUT OF 243',CR,LF> JMP ENDFIL ;EXIT ; ; THIS ROUTINE SORTS AND DISPLAYS THE DIRECTORY ; (NOT IMPLEMENTED IN THIS VERSION) ; DIR: JMP ENDFIL ;EXIT ; ; THIS ROUTINE RESTORES DRIVE B ; FIXB: LDA NEWDRV ;CHECK DRIVE NO ORA A RZ ;RETURN IF DRIVE A LDA NEWDRV ;SELECT DRIVE B MOV E,A DISKIO LOGIN XRA A STA TNUM ;SELECT TRACK ZERO INR A ;SELECT SECTOR 1 STA SNUM SETSEC SNUM SETTRK TNUM CALLBIOS DHOME ;HOME DRIVES CALLBIOS DREAD ;READ TRACK ZERO DIRECT RET ; ; ERROR AND EXIT ROUTINES ; ; INERR: PRINT JMP ENDFIL ; BADSEC: PRINT JMP ENDFIL ; BADTRK: PRINT JMP ENDFIL ; BADGRP: PRINT JMP ENDFIL ; OPNERR: LDA NEWDRV ;CURRENT DRIVE NO ORA A JNZ OPNER1 PRINT JMP ENDFIL OPNER1: PRINT JMP ENDFIL ; RDERR: PRINT JMP MONITOR NAMERR: PRINT JMP ENDFIL ; ADERR: PRINT JMP EDIT1 ;ADDRESS ERROR ON EDIT ; HEXERR: PRINT JMP PTX ; MONITOR: PRINT CRLF,$ LDA DRVNO ;RESTORE LOGGED DRIVE NO MOV E,A DISKIO LOGIN LHLD OLDSTK SPHL ;RESET OLD STACK POINTER RET ; ; ; DATA ALLOCATIONS ; FCB EQU 5CH ;FILE CONTROL BLOCK SPACE: DB ' $' ;ASCII SPACE CRLF: DB 0DH,0AH,24H ;ASCII CR LF I: DW 0 ;PSEUDO INDEX REGISTER LINE: DW 0 ;LINE NUMBER FOR LISTING IPOINT: DW 00 ;VARIABLE BUFFER POINTER INBUF: DS 10 ;USED AS CONSOLE INPUT BUFFER LASTIN: DB 0 ;LAST CONSOLE INPUT CHAR INFLAG: DB 0 ;FLAG, RET FOR MORE CONSOLE INPUT DRVNO: DB 0 ;STORAGE FOR ORIGINALLY LOGGED DRIVE NEWDRV: DB 0 ;STORAGE FOR NEW DRIVE NO TRACK: DB 0 ;SELECTED TRACK BSEC: DB 0 ;SELECTED BEGINNING SECTOR ESEC: DB 0 ;SELECTED ENDING SECTOR TNUM: DB 0 ;TRACK NO FOR VALIDATE SNUM: DB 0 ;SECTOR NO FOR VALIDATE VALFLG: DB 0 ;VALIDATION ERROR FLAG G: DB 0 ;CPM GROUP NO S: DB 0 ;SECTOR NO WITHIN GROUP G COUNT: DB 0 ;COUNT OF DIRECTORY ENTRIES OLDSTK: DW 0 ;STORAGE FOR OLD STACK POINTER ENDSTK: DS 24 ;STORAGE FOR NEW STACK NEWSTK: DW 0 ;NEW STACK INB: DW 0 ;STORES POINTER TO INPUT BUFFER AREA OUTB: DW 0 ;STORES POINTER TO DIRECTORY BUFFER AREA TABLE: DB 01H ;SECTOR LOOK UP TABLE DB 07H DB 0DH DB 13H DB 19H DB 05H DB 0BH DB 11H DB 17H DB 03H DB 09H DB 0FH DB 15H DB 02H DB 08H DB 0EH DB 14H DB 1AH DB 06H DB 0CH DB 12H DB 18H DB 04H DB 0AH DB 10H DB 16H PDIR DW 0 ;POINTER TABLE TO DIRECTORY (64 ENTRIES MAX) DIRBUF: EQU PDIR+130 ;START OF AREA USED TO STORE AND SORT DIRECTORY END