|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 12416 (0x3080) Types: TextFile Names: »FORMAT16.ASM«
└─⟦b445f10af⟧ Bits:30004389 CP/M Plus Source files └─ ⟦this⟧ »FORMAT16.ASM«
TITLE 'CP/M PLUS CR16 MINI FLOPPY FORMAT PROGRAM - VERS 1.0 - 840320' PAGE 43 $*MACRO ;****************************************************************************** ; CHRISTIAN ROVSING A/S CP/M PLUS MINI FLOPPY FORMATTING PROGRAM ;****************************************************************************** ; ; CR8 MINI FLOPPY DISK FORMATTING PROGRAM FOR CP/M SYSTEMS (DUAL ; FLOPPY AND HARD DISK/FLOPPY) . ; THE UTILITY WILL OPERATE ON ANY DUAL SIDED 96 TPI 5 1/4 INCH ; MINI FLOPPY DISK DRIVE, AND GENERATE THE FOLLOWING FORMAT: ; ; 77 TRACKS ; 8 RECORDS PER TRACK ; TWO HEADS/SIDES ; 512 BYTE RECORDS ; ; THE ENTIRE DISK IS WRITTEN WITH SECTORS FILLED WITH 0E5H DATA. ; ;***************************************************************************** ;CONDITIONAL ASEMBLY PARAMTERS: ;------------------------------ DANISH EQU 0 ;0 FOR ENGLISH TEXT PROMPTS ;1 - DANISH - - MACLIB PORTS MACLIB Z80 ;SET BDOS ENTRY POINTS AND FUNCTIONS NUMBERS ; BDOS EQU 0005H ;ENTRY POINT BOOT EQU 0 CONIN EQU 1 ;CONSOLE INPUT CONOUT EQU 2 ;CONSOLE OUTPUT DCONIO EQU 6 ;DIRECT CONSOLE I/O PRTSTR EQU 9 ;PRINT MSG STRING VERSNO EQU 12 ;RETURN CP/M OR MP/M VALUE SLDSK EQU 14 ;SELECT DISK RETDSK EQU 25 ;RETURN CURRENT DISK MULTIO EQU 44 ;SET MULTI SECTOR COUNT ERRMOD EQU 45 ;SET ERROR MODE CLLBIOS EQU 50 ;CALL BIOS DIRECT ;BIOS FUNCTIONS NUMBERS SELDSK EQU 9 ;C=DRIVE SETTRK EQU 10 ;BC=TRACK NO. SETSEC EQU 11 ;BC=SECTOR NO. SETDMA EQU 12 ;BC=.DMA READ EQU 13 ; UTILITY EQU 30 ;BIOS USER DEF. ROUTINE FUNCTION NUMBER FORMAT EQU 01 ;USED TOGETHER WITH UTILITY CPMMSB EQU 00H ;RETURN VALUE (IN H) FROM VERSNO IF CP/M PLUS CPMLSB EQU 30H ; " (IN L) " " " " " PAGE ;**************************************************************************** START: LXI SP,LOC$STACK ;MAKE OURSELVES A STACK MVI C,RETDSK ;GET CURRENT DISK NO CALL BDOS ; STA CURDSK ; MVI C,VERSNO ;CHECK IF THIS IS MP/M CALL BDOS ;GET VERSION NUMBER MOV A,L CPI CPMLSB ;IS IT CP/M PLUS OR "HIGHER" JC NOEXEC ;IF WRONG VERSION PRINT "REQUIRES CP/M PLUS" SIGNON: LXI D,CLRMSG ;SEND HELLO TO CRT, CLEAR SCREEN TO START WITH CALL CRTMS ; IN P$SWITCH ; ANI M$HD$SELECT ;CHECK NUMBER OF FLOPPY DISKS JZ ONEFLOP ; MVI A,'G' ;TWO FLOPPYS, FIRST IS CALLED 'G:' STA STMSAE ; STA STMSA1 ; LXI D,STRMSG ; CALL CRTMS ; LXI D,STRMS2 ; CALL MONITOR ;GO TO MONITOR ROUTINE CPI 'G' ; JZ MFFMT ; CPI 'H' ; JZ MFFMT ; JMP ERRR ONEFLOP: MVI A,'G' ;ONE FLOPPY CALLED 'A:' STA STMSAE STA STMSA1 LXI D,STRMSG CALL MONITOR ;GO TO MONITOR ROUTINE CPI 'G' ; JNZ ERRR ; JMP MFFMT ; NOEXEC: LXI D,REQCPM3 ;PRINT "REQUIRES CP/M PLUS" CALL CRTMS ;AND JMP ?WBOOT ;WARM BOOT ;***************************************************************************** MONITOR: CALL CRTMS ; LXI D,STRMS3 CALL CRTMS CALL ?CONIN ;GET OPERATOR ENTRY CHARACTER PUSH PSW LXI D,STRMS4 CALL CRTMS POP PSW ;RESTORE ANI 05FH ;CONVERT TO UPPER CASE CPI 'Q' ;SEE IF QUIT JZ ?WBOOT ; RET ;************************************************************************** BIOS: STA FUNC LXI D,BIOSPB MVI C,CLLBIOS CALL BDOS RET BIOSPB: FUNC: DB 0 ;FUNCTION NUMBER AREG: DB 0 ;A REG BCREG: DW 0 ;BC REG DEREG: DW 0 ;DE REG HLREG: DW 0 ;HL REG ;*************************************************************************** ;HERE IF TO FORMAT A DISKETTE IN A MINI FLOPPY UNIT CURDSK: DB 0 FMTDSK: DB 0 ; MFFMT: STA FMTDSK LXI D,GOMS3 ;PRINT READY MESSAGE FOR FLOPPY CALL CRTMS LDA FMTDSK MOV C,A CALL CO ;PRINT SELECTED MINI DESIGNATOR LXI D,GOMS2 CALL CRTMS CALL ?CONIN ;GET OPERATOR RESPONSE ANI 05FH ;UPPER CASE if DANISH CPI 'J' else CPI 'Y' endif JNZ ENDCHK ;END PROCESS IF NOT READY LXI D,GOMS4 ;PRINT SECOND MAKE SURE MESSAGE CALL CRTMS CALL ?CONIN ;GET OPERATOR RESPONSE ANI 05FH ;UPPER CASE CPI 'F' ;F FOR FORMAT, TO BE ABSOLUTELY SURE JNZ ENDCHK ;BALE OUT IF NOT REALLY READY CALL CRLF MVI H,0 LDA FMTDSK ;GET FORMAT DISK NO SUI 'A' ; MOV L,A ; SHLD BCREG ; LXI H,0 ; SHLD DEREG ;AND SELECT DISK MVI A,SELDSK ; CALL BIOS ; LXI H,DATBF ; SHLD BCREG ; MVI A,SETDMA ;SET DMA ADDRESS = DATBF CALL BIOS ; XRA A ; CFLFMTLP: STA @TRK ;SET TRACK MOV L,A ; MVI H,0 ; SHLD BCREG ; MVI A,SETTRK ; CALL BIOS ; LXI H,01 ;SET SECTOR SHLD BCREG ; MVI A,SETSEC ; CALL BIOS ; CALL TRKFILL ;BUILD MINI FLOPPY TRACK IMAGE LXI H,FORMAT ;FORMAT USING CP/M PLUS SHLD BCREG ;FIRST CALL ACTIVATES FLOPPY RESTORE MVI A,UTILITY ; CALL BIOS ; ORA A ;GET RETURNED ERROR STATUS JNZ ENDCHK ; LDA @TRK ; INR A ;SET FOR NEXT TRACK NUMBER CPI (77*2) ; JNZ CFLFMTLP ; LXI D,FORDMS ;PRINT FORMAT COMPLETE MESSAGE CALL CRTMS ENDCHK: LXI D,DONMSG ;PRINT DONE MESSAGE CALL CRTMS CALL ?CONIN ;GET OPERATOR ANSWER ANI 05FH ;CONVERT RESPONSE TO UPPER CASE if DANISH CPI 'J' else CPI 'Y' ;SEE IF HE WANTS TO GO AGAIN endif JZ SIGNON ;GO START ALL OVER AGAIN ?WBOOT: LXI H,0 ; SHLD DEREG ;AND SELECT DISK lda curdsk ; MOV L,A ; SHLD BCREG ; MVI A,SELDSK ; CALL BIOS ; LDA CURDSK MOV E,A MVI C,SLDSK ;RE-SELECT CURRENT DISK CALL BDOS JMP BOOT ;************************************************************************ ; MINI FLOPPY TRACK IMAGE BUILDING ROUTINE ; ; THIS BUILDS AN IMAGE INTO MEMORY FOR THE MINI FLOPPY ; TRACK FORMAT IMAGE. VARIABLES REQUIRED TO BE SETUP ; BEFORE ENTRY ARE "FLPTRK" WITH THE TRACK NUMBER AND ; "FSIDE" WITH THE SIDE NUMBER. ; TRKFILL: MVI D,01H ;START SECTOR COUNT MVI E,8 ;MAX NUMBER OF SECTORS ON TRACK LXI H,DATBF ;POINT TO BUFFER FOR IMAGE BULID ;FIXUP PREINDEX GAP 4A ; MVI B,80 ;PREINDEX FILL 80 BYTES OF "4E" MVI A,04EH PREIND: MOV M,A ;PUT 4E INTO BUFFER INX H DJNZ PREIND MVI B,12 ;SYNC 12 BYTES OF "00" MVI A,00H PREIND1: MOV M,A ;PUT 00 INTO BUFFER INX H DJNZ PREIND1 ;WRITE INDEX ADDRESS MARK ONTO TRACK HERE ; MVI B,03 ;THREE BYTES OF "F6" MVI A,0F6H IAM: MOV M,A ;PUT F6 INTO BUFFER INX H DJNZ IAM ;WRITE INDEX MARK ITSELF ; MVI M,0FCH ;ONE BYTE OF "F6" INX H ;WRITE POST INDEX GAP 1 ; MVI B,50 ;GAP 1 50 BYTES OF "4E" MVI A,04EH POSTID: MOV M,A ;PUT 4E INTO BUFFER INX H DJNZ POSTID ;PRE SECTOR ID SYNC (ALSO ENTRY POINT TO DO NEXT SECTOR) ; SECTOR: MVI B,012 ;12 BYTES OF "00" MVI A,00H SECSYNC: MOV M,A ;PUT THE 00 INTO BUFFER INX H DJNZ SECSYNC ;WRITE SECTOR ID ADDRESS MARK ; MVI B,03H ;THREE BYTES OF "F5" MVI A,0F5H SIDAM: MOV M,A ;PUT F5 INTO BUFFER INX H DJNZ SIDAM ;PUT SINGLE BYTE SECTOR ID MARK ; MVI M,0FEH ;ONE BYTE "FE" INX H ;WRITE TRACK AND SIDE NUMBER INTO ID FIELD ; LDA @TRK ;GET TRACK NUMBER VARIABLE CPI 77 ; ********* JNC SIDE$ONE MOV M,A ;TRACK INX H XRA A MOV M,A ;SIDE 0 JMP END$SIDE SIDE$ONE: MOV B,A MVI A,153 SUB B MOV M,A ;TRACK INX H MVI A,1 ;SIDE 1 MOV M,A END$SIDE: INX H ;PUT SECTOR NUMBER INTO THE ID FIELD ; MOV M,D ;GET SECTOR NUMBER FROM (D) INX H ;PUT DATA FIELD LENGTH BYTE INTO THE ID FIELD ; MVI M,02 ;02 FOR 512 BYTE SECTORS ********** ;01 FOR 256 BYTE SECTORS ;00 FOR 128 BYTE SECTORS INX H ;SET CODE TO WRITE TWO CRC'S ONTO THE TRACK ; MVI M,0F7H ;ONE BYTE "F7" INX H ;FILL GAP 2 BEFORE DATA FIELD ; MVI B,22 ;22 BYTES OF "4E" MVI A,04EH PREDAT: MOV M,A ;PUT THE 4E INTO BUFFER INX H DJNZ PREDAT ;FILL DATA FIELD SYNC AREA ; MVI B,12 ;12 BYTES OF "00" MVI A,00H PREDAT1: MOV M,A ;PUT 00 INTO BUFFER INX H DJNZ PREDAT1 ;WRITE DATA ADDRESS MARK ; MVI B,03 ;THREE BYTES OF "F5" MVI A,0F5H DAM: MOV M,A ;PUT THE F5 INTO BUFFER INX H DJNZ DAM ;ONE BYTE DATA FIELD MARK ; MVI M,0FBH ;ONE BYTE OF 0FBH INX H ;FILL DATA FIELD WITH 0E5H DATA ; LXI B,512 ;GET SECTOR BYTE COUNT ********** DFILL: MVI M,0E5H ;PUT E5 INTO BUFFER INX H DCX B ;CHECK BYTE COUNT MOV A,B ORA C JNZ DFILL ;SET CODE TO WRITE DATA FIELD CRC'S ; MVI M,0F7H ;ONE BYTE CRC CODE (F7) INX H ;END SECTOR FILL ; MVI B,58 ;58 BYTES OF "4E" ********* MVI A,04EH DATGAP: MOV M,A ;PUT THE 4E INTO BUFFER INX H DJNZ DATGAP ;CHECK IF DONE WITH LAST SECTOR IMAGE ; INR D ;GET SECTOR NUMBER READY FOR NEXT LOOP DCR E ;DEC TOTAL SECTOR COUNT JNZ SECTOR ;OFF TO DO THAT AGAIN FOR NEXT SECTOR ;END TRACK FILL ; LXI B,2300 ;FILL TO END OF TRACK WITH "4E" ETFILL: MVI M,04EH ;PUT THE "4E" INTO BUFFER INX H DCX B ;CHECK THE BYTE COUNT MOV A,B ORA C JRNZ ETFILL RET ;BUFFER NOW SETUP ;************************************************************************** ; GENERAL PURPOSE I/O SUBROUTINES CRLF: MVI C,CR ;ROUTINE TO DO CONSOL CR AND LF CALL CO MVI C,LF CALL CO RET ;ERROR ON ENTRY OF OPERATOR PARAMETERS ; ERRR: MVI C,'?' ;OUTPUT UNKNOWN PARAMETER CALL CO CALL CRLF JMP ENDCHK ;GO TO OPERATOR END CHECK SEQUENCE ?CONIN: PUSH H PUSH D PUSH B CIAGN: MVI C,DCONIO MVI E,0FFH CALL BDOS ANI 7FH ORA A JRZ CIAGN CPI CR JRZ CIAGN PUSH PSW MOV C,A CALL CO POP PSW POP B POP D POP H RET CO: PUSH H PUSH D PUSH B MOV E,C MVI C,CONOUT CALL BDOS POP B POP D POP H RET ;***************************************************************************** ;CRTMS - ROUTINE TO DISPLAY A MESSAGE ON THE CRT. REGISTERS D AND E ; CONTAIN THE MESSAGE POINTER. END OF MESSAGE IS INDICATED BY ; A 0 CHARACTER. ; CRTMS: LDAX D CPI 0 ;END MESSAGE MARKER RZ ;YES - RETURN MOV C,A CALL CO INX D JMP CRTMS ;***************************************************************************** ;FORMAT PROGRAM MESSAGES ; if DANISH STRMSG: DB ' ',ESC,'Æ7m' ;ANSI REVERSE VIDEO DB ' Christian Rovsing A/S CP/M PLUS formatterings program ' DB ESC,'Æm',CR,LF,' ',ESC,'Æ7m' DB ' For dobbelt sidet 96 TPI 5 1/4 tomme mini diskette ' DB ESC,'Æm',CR,LF,LF DB ' Vælg funktion -',CR,LF,LF DB ' ' STMSAE: DB 'G' DB ') Formatter diskette ' STMSA1: DB '*:',CR,LF,0 STRMS2: DB ' H) Formatter diskette H:',CR,LF,0 STRMS3: DB ' Q) Quit',CR,LF DB CR,LF,' Option = ',ESC,'Æ7m',0 STRMS4: DB ESC,'Æm',0 GOMS2: DB ': (J/N) ',0 GOMS3: DB CR,LF,LF,' Er disketten installeret i drive ',0 GOMS4: DB CR,LF,LF,' NB! ' DB 'Formattering sletter ALLE data på disketten!' DB CR,LF,' Tast "F" for at starte formattering eller ' DB '"S" for at stoppe (F/S) ',0 FORDMS: DB CR,LF,LF,BELL,'Formattering afsluttet',CR,LF,0 CLRMSG: DB ESC,'Æ2J',ESC,'ÆH',CR,LF,0 DONMSG: DB CR,LF,LF,' Skal der formatteres flere disketter? (J/N) ',0 REQCPM3: DB CR,LF,'Programmet kan kun bruges under CP/M PLUS',0 else STRMSG: DB ' ',ESC,'Æ7m' ;ANSI REVERSE VIDEO DB ' Christian Rovsing A/S CP/M PLUS formatting utility ' DB ESC,'Æm',CR,LF,' ',ESC,'Æ7m' DB ' For dual sided (CR16 format) mini floppy disk drives ' DB ESC,'Æm',CR,LF,LF DB ' Select option -',CR,LF,LF DB ' ' STMSAE: DB 'G' ; DB ') Format mini floppy ' STMSA1: DB '*:',CR,LF,0 STRMS2: DB ' H) Format mini floppy H:',CR,LF,0 STRMS3: DB ' Q) Quit',CR,LF DB CR,LF,' Option = ',ESC,'Æ7m',0 STRMS4: DB ESC,'Æm',0 GOMS2: DB ': (Y/N) ',0 GOMS3: DB CR,LF,LF,' Has diskette been installed in drive ',0 GOMS4: DB CR,LF,LF,'NB! ' DB 'This operation will erase ALL data on the disk!' DB CR,LF,' ' DB 'Type "F" when ready to format or "S" to stop (F/S) ',0 FORDMS: DB CR,LF,LF,BELL,'Formatting complete',CR,LF,0 CLRMSG: DB ESC,'Æ2J',ESC,'ÆH',CR,LF,0 DONMSG: DB CR,LF,LF,' More disks to be formatted? (Y/N) ',0 REQCPM3: DB CR,LF,'Requires CP/M PLUS',0 endif ;*********************************************************************** @TRK: DB 0 ; ; ;FORMAT PROGRAM STACK AREA DS 80 ;SETUP STORAGE FOR 40 LEVEL STACK LOC$STACK EQU $ DATBF: DS 512 DB 0 END «eof»