TITLE 'SECTOR DISK MAINTENANCE PROGRAM' ; DERIVED 8/77 W. EARNEST ; MODIFIED 9/77 FOR EFFICIENCY+LOGIC ; MODIFIED 4/07/78 FOR MORE FEATURES ; MODIFIED 1/15/79 FOR CP/M USAGE ; MODIFIED 7/14/80 FOR CP/M REV 2.X ; BDOS EQU 5 BOOT EQU 0 ;BDOS FUNCT CODES CONIN EQU 1 CONOU EQU 2 LIST EQU 5 PMSG EQU 9 REVNR EQU 12 GETDPB EQU 31 ; BIOS OFFSETS SDRV EQU 27 STRK EQU 30 SSEC EQU 33 SDMA EQU 36 READ EQU 39 WRITE EQU 42 SECTRN EQU 48 ; ORG 100H BEGIN: LXI SP,STACK MVI C,REVNR CALL BDOS ;CHECK SYSTEM REVISION MOV A,L ORA A JNZ CPMOK ;CURRENT SYSTEM LXI D,REVMSG CALL MSGO JMP EXIT ;GIVE UP NOW ; CPMOK: LDA 2 ;BIOS PAGE BYTE STA SEDMA+2 STA FILBF+2 STA WRTBF+2 STA SESCT+2 STA SETRK+2 STA SEDRV+2 STA SCTRN+2 LXI B,BUFFR SEDMA: CALL SDMA JMP START ; EXIT: CALL CRLF JMP BOOT ; CO: PUSH PSW PUSH H PUSH D PUSH B MVI C,CONOU MOV E,A CALL BDOS POP B POP D POP H POP PSW RET ; CI: MVI C,CONIN PUSH H PUSH D CALL BDOS POP D POP H ANI 7FH CPI 1BH ;ESC CODE JZ ESCCH ;ABORT THIS COMMAND CPI 61H ;LOWER CASE A RC ANI 5FH ;CONVT TO UPPER RET ; SO: JMP CO ;VARIABLE JUMP FOR PRINT ; LO: PUSH PSW PUSH H PUSH D PUSH B MVI C,LIST MOV E,A CALL BDOS POP B POP D POP H POP PSW RET ; DEFUN: LXI D,PRMUN CALL MSGO UNAGN: CALL IN2NR MOV A,L KPUNT: STA NUNIT DEFTK: LXI D,PRMTK CALL MSGO TKAGN: CALL IN2NR MOV A,L CPI 77 JC KPTRK CALL INERR JMP TKAGN ; KPTRK: STA NTRAK DEFSC: LXI D,PRMSC CALL MSGO SCAGN: CALL IN2NR DCR L ;START W/SCTR 1 MOV A,L KPSCT: STA NSCTR MODBR: JMP LDBUF ;CHGS FOR BLOCK MOVE ; LDBUF: LDA BUFLG ORA A JNZ WTBUF CALL SUPRD CALL FILBF PRINT: CALL PRBUF ; START: LXI SP,STACK CALL PRMPT CALL CI SUI 'A' ;TABLE START VALUE JC INVLID ;BELOW LEGAL RANGE CPI 'Z'-'A'+1 ;END OF TABLE JNC INVLID ;ABOVE LEGAL RANGE ADD A ;DOUBLE MOV E,A MVI D,0 LXI H,DOTBL DAD D ;CALCULATE VECTOR MOV A,M INX H MOV H,M MOV L,A CALL CRLF PCHL ;GO TO ROUTINE ; ESCCH: POP H LXI D,CANMSG JMP EMSG ; INVLID: CALL CRLF LXI D,INVAL EMSG: CALL MSGO JMP START ; DOTBL: DW TOMEM ;A DISK TO MEMORY DW BLKMV ;B BLOCK MOVE DW CHGBF ;C CHANGE CONTENTS DW DMODE ;D DECIMAL MODE DW EXTTBL ;E EXTRNAL XLATE DW PHSTBL ;F PHYSICAL SECTORS DW GENTBL ;G LOGICAL SECTORS DW HMODE ;H HEXADECIMAL MODE DW START ;I DW START ;J DW EXIT ;K EXIT TO CP/M DW LSET ;L LINE PRINTER OUT DW MOVE ;M MOVE SECTOR DW START ;N DW START ;O DW PRINT ;P PRINT BUFFER DW START ;Q DW START ;R DW DEFSC ;S SET SECTOR DW DEFTK ;T SET TRACK DW DEFUN ;U SET UNIT DW VSET ;V VIDEO OUTPUT DW WTBUF ;W WRITE BUFF TO DISK DW XLATE ;X XLATE BLOCK (INTERLACE) DW START ;Y DW FRMEM ;Z MEMORY TO DISK ; PHSTBL: LXI H,PHMAP MVI A,'F' JMP TBLST ; GENTBL: LXI H,GENMAP MVI A,'G' ; TBLST: SHLD HLDIT SHLD HLDOT STA PRMST JMP START ; XLATE: CALL CI LXI H,PHMAP CPI 'F' JZ XLSET LXI H,GENMAP CPI 'G' JZ XLSET LXI H,EXMAP CPI 'E' JZ XLSET JMP INVLID ; EXTTBL: LXI H,EXTBL ;TABLE FOR EXTRN SKEW SHLD CHGBAS LXI H,EXMAP SHLD HLDIT SHLD HLDOT MVI A,'E' STA PRMST MVI B,0 PUSH B JMP CHGLP ; CHGBF: LXI H,BUFFR-1 SHLD CHGBAS CALL IN2NR MOV B,L PUSH B CHGLP: CALL IN2NR POP B LDA LSTCH CPI 0DH ;CR? JZ CHEND ;YES MOV C,L MOV A,B CPI 129 JNC RGERR LHLD CHGBAS ADD L MOV L,A JNC NCARY INR H NCARY: MOV M,C INR B PUSH B LDA LSTCH CPI '.' JNZ CHGLP POP B CHEND: CALL CRLF JMP START ; RGERR: LXI D,RNMSG JMP EMSG ; WTBUF: CALL SUPWT CALL WRTBF XRA A STA BUFLG JMP START ; MOVE: CALL CRLF LXI D,ADMSG CALL MSGO MVI A,1 STA BUFLG ;MARK TO BE WRITTEN CALL CRLF JMP DEFUN ; XLSET: SHLD HLDOT BLKMV: LXI D,FRMMG LXI H,RDSTU STUCOM: SHLD MODBR+1 CALL MSGO CALL CRLF JMP DEFUN ; RDSTU: LHLD NSCTR SHLD RSCTR LHLD NTRAK SHLD RTRAK LXI D,TOMSG LXI H,WTSTU JMP STUCOM ; WTSTU: LXI D,SIZMG CALL MSGO CALL INNRS SHLD SCTCT LXI H,LDBUF SHLD MODBR+1 MORBL: CALL SUPBK CALL FILBF CALL SUPWT CALL WRTBF LXI H,NSCTR CALL INCAD LXI H,RSCTR CALL INCAD LHLD SCTCT DCX H SHLD SCTCT MOV A,L ORA H JNZ MORBL JMP START ; INCAD: INR M LDA SPERT CMP M JZ TKEND RNC TKEND: MVI M,0 INX H INX H INR M RET ; PRMPT LXI D,PRMST ;PROMPT STRING JMP MSGO ; INERR: LXI D,ERRMG MSGO: MVI C,PMSG JMP BDOS ; LMSG: CALL PCRLF LMSGL: LDAX D CPI '$' RZ CALL SO INX D JMP LMSGL ; IN2NR: CALL INNRS MOV A,H ORA A RZ LXI D,LMSG1 CALL MSGO JMP IN2NR ; INNRS: LXI H,0 NRSLP: PUSH H CALL CI STA LSTCH CPI 0DH POP H JZ LINFD CPI ',' RZ CPI '.' RZ CALL HEXBI JNC NRSLP LXI D,LMSG2 CALL MSGO JMP INNRS ; LINFD: MVI A,0AH JMP CO ; HEXBI: CPI '0' RC CPI '9'+1 JC CVNUM CPI 'A' RC CPI 'G' ALJMP: JC CVALP NRBAD: STC RET ; CVALP: ADI 9 CVNUM: ANI 0FH PUSH H POP D DAD H RC DAD H RC HDCHG: DAD H RC DAD H RC ADD L MOV L,A RET ; DMODE: MVI A,'D' STA PRMST+1 MVI A,19H ;DAD D LXI H,NRBAD MDCOM: STA HDCHG SHLD ALJMP+1 JMP START ; HMODE: MVI A,'H' STA PRMST+1 MVI A,29H ;DAD H LXI H,CVALP JMP MDCOM ; CRLF: MVI A,0DH CALL CO MVI A,0AH JMP CO ; FILBF: JMP READ ; WRTBF: JMP WRITE ; SUPBK: LDA RUNIT MOV C,A CALL SEDRV LDA RTRAK ANI 7FH MOV C,A CALL SETRK LHLD RSCTR XCHG LXI H,HLDIT JMP GTSEC ; SUPRD: LXI H,HLDIT SUUTK: PUSH H LDA NUNIT MOV C,A CALL SEDRV LDA NTRAK ANI 7FH MOV C,A CALL SETRK LHLD NSCTR XCHG POP H JMP GTSEC ; SUPWT: LXI H,HLDOT JMP SUUTK ; SEDRV: CALL SDRV MOV A,H ORA L JZ UNIERR MOV E,M INX H MOV D,M XCHG SHLD XLTADR LXI H,9 DAD D MOV E,M INX H MOV D,M XCHG MOV A,M STA SPERT RET ; SETRK: JMP STRK UNIERR: LXI D,UNERMG JMP EMSG ; TOMEM: LXI D,MVMSG CALL MSGO CALL INNRS LXI D,BUFFR MVCOM: MVI B,128 MMVLP: LDAX D MOV M,A INX D INX H DCR B JNZ MMVLP JMP START ; FRMEM: LXI D,MVMSG CALL MSGO CALL INNRS LXI D,BUFFR XCHG JMP MVCOM ; PRBUF: LDA NUNIT ORI '0' STA IDMSG+5 LDA NTRAK LXI H,IDMSG+13 CALL PBYT LDA NSCTR INR A LXI H,IDMSG+23 CALL PBYT LXI D,IDMSG CALL LMSG LXI D,BUFFR PUSH D CALL PCRLF MVI A,1 PRBGN: STA PRPTR POP D PRILP: PUSH D LDA PRPTR CALL PRADR POP D PUSH D CALL PRSPC CALL PR4BT CALL PRSPC CALL PR4BT CALL PRSPC CALL PR4BT CALL PRSPC CALL PR4BT CALL PRSPC POP D CALL PRLIT PUSH D CALL PCRLF POP D LDA PRPTR ADI 10H STA PRPTR CPI 81H JNZ PRILP RET ; PR4BT: CALL PRHWD CALL PRHWD RET ; PRHWD: LDAX D INX D MOV H,A LDAX D INX D MOV L,A PUSH D CALL HEXCH POP D RET ; PBYT: PUSH PSW RAR RAR RAR RAR CALL CNIB POP PSW CNIB: ANI 0FH CPI 10 JC NNIB ADI 7 NNIB: ADI '0' MOV M,A INX H RET ; PRSPC: MVI A,' ' JMP SO ; PRLIT: MVI A,'*' CALL SO MVI B,10H LITLP: LDAX D INX D CPI ' ' JC INVIS CPI 80H JNC INVIS LITBR: CALL SO DCR B JNZ LITLP MVI A,'*' JMP SO ; INVIS: MVI A,'.' JMP LITBR ; PRADR: MOV L,A MVI H,0 HEXCH: MVI D,4 HEXLP: XRA A DAD H RAL DAD H RAL DAD H RAL DAD H RAL CPI 10 JC NTALP ADI 7 NTALP: ADI '0' CALL SO DCR D JNZ HEXLP RET ; PCRLF: MVI A,0AH CALL SO MVI A,0DH JMP SO ; LSET: LXI H,LO MVI A,'L' PSET: SHLD SO+1 STA PRMST+2 JMP START ; VSET: LXI H,CO MVI A,'V' JMP PSET ; GTSEC: LDA SPERT CMP E ;NR WANTED JZ SECERR JC SECERR MOV A,M INX H MOV H,M MOV L,A PCHL ; SECERR: LXI D,SECERM JMP EMSG ; PHMAP: MOV C,E INR C SESCT: JMP SSEC ; EXMAP: LXI H,EXTBL SHLD XLTADR ; GENMAP: MOV C,E MOV B,D LHLD XLTADR XCHG SCTRN: CALL SECTRN MOV C,L JMP SESCT ; EXTBL: DB 1,2,3,4,5 DB 6,7,8,9,10 DB 11,12,13,14,15 DB 16,17,18,19,20 DB 21,22,23,24,25 DB 26,27,28,29,30 DB 31,32,33,34,35 DB 36,37,38,39,40 DB 41,42,43,44,45 DB 46,47,48,49,50 DB 51,52,53,54,55 DB 56,57,58,59,60 DB 61,62,63,64 ; REVMSG: DB 'Not valid CP/M revision!!$' INVAL: DB 'Invalid Command:$' RNMSG: DB 'Range exceeded:$' PRMTK: DB 'Enter Track:$' PRMSC: DB 'Enter Sector:$' PRMUN: DB 'Enter Unit:$' FRMMG: DB 'Enter Sending address:$' TOMSG: DB 'Enter Receiving address:$' SIZMG: DB 'Enter Number of Sectors to move:$' ADMSG: DB 'Enter new address:$' MVMSG: DB 'Enter Memory address:$' IDMSG: DB 'Unit X,Track XX,Sector XX$' ERRMG: DB 'RETYPE:$' LMSG1: DB '2 Hex Digit limit. Retype:$' LMSG2: DB '4 Hex Digit limit. Retype:$' UNERMG: DB 'Invalid Unit number',0DH,0AH,'$' SECERM: DB 'Invalid Sector number',0DH,0AH,'$' CANMSG: DB 'Cancelled',0dh,0ah,'$' PRMST: DB 'GHV==>$' ; ; DONT MOVE THE NEXT 6 ITEMS NSCTR: DW 0 ;XTRA BYTE FOR TBL CALC PAD NTRAK: DB 0 NUNIT: DB 0 RSCTR: DW 0 RTRAK: DB 0 RUNIT: DB 0 SCTCT: DW 0 BUFLG: DB 0 HLDIT: DW GENMAP ;CP/M IS DEFAULT HLDOT: DW GENMAP ;CP/M FOR OUT ALSO CHGBAS: DW 0 ;BASE ADDR FOR BYTE CHANGES XLTADR: DW EXTBL ;POINT AT SOMETHING SPERT: DB 26 ;SECTORS PER TRACK LSTCH: DS 1 PRPTR: DS 1 DS 24 STACK: DS 2 BUFFR: DS 128 ; END