DataMuseum.dk

Presents historical artifacts from the history of:

Christian Rovsing CR7, CR8 & CR16 CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦f978f9536⟧ TextFile

    Length: 12416 (0x3080)
    Types: TextFile
    Names: »FORMAT16.ASM«

Derivation

└─⟦b445f10af⟧ Bits:30004389 CP/M Plus Source files
    └─ ⟦this⟧ »FORMAT16.ASM« 

TextFile


	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»