CP/M RMAC ASSEM 1.1	#001	PROF-80 MULTI DENSITY DISKETTE HANDLER

                	title 'PROF-80 Multi density diskette handler'
                
                ;    CP/M-80 Version 3     --  Modular BIOS
                
                ;	Disk I/O Module for PROF-80
                
                	;		Letzte Aenderung am 24.11.1984 (Joachim)
                
                	dseg
                
                    ; Disk drive dispatching tables for linked BIOS
                
                	public	fdsd0,fdsd1,fdsd2,fdsd3
                
                
                    ; Variables containing parameters passed by BDOS
                
                	extrn	@adrv,@rdrv
                	extrn	@dma,@trk,@sect
                	extrn	@dbnk,@cbnk
                
                    ; System Control Block variables
                
                	extrn	@ermde		; BDOS error mode
                
                    ; Utility routines in standard BIOS
                
                	extrn	?wboot	; warm boot vector
                	extrn	?pmsg	; print message @<HL> up to 00, saves <BC> & <DE>
                	extrn	?pdec	; print binary number in <A> from 0 to 99.
                	extrn	?pderr	; print BIOS disk error header
                	extrn	?conin,?cono	; con in and out
                	extrn	?const		; get console status
                	extrn	?bank
                
                    ; Utility routines in PROF-80 BIOS
                
                	extrn	monon,monoff
                
                
                
                	maclib cdef
                ;
                	maclib cpm3
                ;
                	maclib z80
                ;
                	maclib monvec
                ;
                	maclib syspage
                
                    ; common control characters
                
 000D =         cr	equ 13
 000A =         lf	equ 10
 0007 =         bell	equ 7
CP/M RMAC ASSEM 1.1	#002	PROF-80 MULTI DENSITY DISKETTE HANDLER

                
                
                    ; Extended Disk Parameter Headers (XPDHs)
                
 0000 9D04      	dw	fd$write
 0002 A104      	dw	fd$read
 0004 6304      	dw	fd$login
 0006 5C04      	dw	fd$init
 0008 0000      	db	0,0		; relative drive zero
                fdsd0	dph     skew8,dp8d3a,64,144
 000A+1E04      	DW SKEW8		; TRANSLATE TABLE ADDRESS
 000C+0000000000	DB 0,0,0,0,0,0,0,0,0	; BDOS SCRATCH AREA
 0015+00        	DB 0			; MEDIA FLAG
 0016+4400      	DW DP8D3A			; DISK PARAMETER BLOCK
 0018+2300      	DW ??0001			; CHECKSUM VECTOR
 001A+6300      	DW ??0002			; ALLOCATION VECTOR
 001C+FEFFFEFFFE	DW 0FFFEH,0FFFEH,0FFFEH	; DIRBCB, DTABCB, HASH ALLOC'D
 0022+00        	DB 0			; HASH BANK
 0023+          ??0001	DS	64		; CHECKSUM VECTOR
 0063+          ??0002	DS	144		; ALLOCATION VECTOR
                
 00F3 9D04      	dw	fd$write
 00F5 A104      	dw	fd$read
 00F7 6304      	dw	fd$login
 00F9 6204      	dw	fd$init0
 00FB 0100      	db	1,0		; relative drive one
                fdsd1	dph	skew8,dp8d3a,64,144
 00FD+1E04      	DW SKEW8		; TRANSLATE TABLE ADDRESS
 00FF+0000000000	DB 0,0,0,0,0,0,0,0,0	; BDOS SCRATCH AREA
 0108+00        	DB 0			; MEDIA FLAG
 0109+4400      	DW DP8D3A			; DISK PARAMETER BLOCK
 010B+1601      	DW ??0003			; CHECKSUM VECTOR
 010D+5601      	DW ??0004			; ALLOCATION VECTOR
 010F+FEFFFEFFFE	DW 0FFFEH,0FFFEH,0FFFEH	; DIRBCB, DTABCB, HASH ALLOC'D
 0115+00        	DB 0			; HASH BANK
 0116+          ??0003	DS	64		; CHECKSUM VECTOR
 0156+          ??0004	DS	144		; ALLOCATION VECTOR
                
 01E6 9D04      	dw	fd$write
 01E8 A104      	dw	fd$read
 01EA 6304      	dw	fd$login
 01EC 6204      	dw	fd$init0
 01EE 0200      	db	2,0		; relative drive two
                fdsd2	dph	skew8,dp8d3a,64,144
 01F0+1E04      	DW SKEW8		; TRANSLATE TABLE ADDRESS
 01F2+0000000000	DB 0,0,0,0,0,0,0,0,0	; BDOS SCRATCH AREA
 01FB+00        	DB 0			; MEDIA FLAG
 01FC+4400      	DW DP8D3A			; DISK PARAMETER BLOCK
 01FE+0902      	DW ??0005			; CHECKSUM VECTOR
 0200+4902      	DW ??0006			; ALLOCATION VECTOR
 0202+FEFFFEFFFE	DW 0FFFEH,0FFFEH,0FFFEH	; DIRBCB, DTABCB, HASH ALLOC'D
 0208+00        	DB 0			; HASH BANK
 0209+          ??0005	DS	64		; CHECKSUM VECTOR
 0249+          ??0006	DS	144		; ALLOCATION VECTOR
                
 02D9 9D04      	dw	fd$write
CP/M RMAC ASSEM 1.1	#003	PROF-80 MULTI DENSITY DISKETTE HANDLER

 02DB A104      	dw	fd$read
 02DD 6304      	dw	fd$login
 02DF 6204      	dw	fd$init0
 02E1 0300      	db	3,0		; relative drive three
                fdsd3	dph	skew8,dp8d3a,64,144
 02E3+1E04      	DW SKEW8		; TRANSLATE TABLE ADDRESS
 02E5+0000000000	DB 0,0,0,0,0,0,0,0,0	; BDOS SCRATCH AREA
 02EE+00        	DB 0			; MEDIA FLAG
 02EF+4400      	DW DP8D3A			; DISK PARAMETER BLOCK
 02F1+FC02      	DW ??0007			; CHECKSUM VECTOR
 02F3+3C03      	DW ??0008			; ALLOCATION VECTOR
 02F5+FEFFFEFFFE	DW 0FFFEH,0FFFEH,0FFFEH	; DIRBCB, DTABCB, HASH ALLOC'D
 02FB+00        	DB 0			; HASH BANK
 02FC+          ??0007	DS	64		; CHECKSUM VECTOR
 033C+          ??0008	DS	144		; ALLOCATION VECTOR
                
                	cseg	; DPB must be resident
                
                dp8s0	dpb 128,26,77,1024,64,2
 0000+1A00      	DW	??0009		; 128 BYTE RECORDS PER TRACK
 0002+0307      	DB	??0010,??0011	; BLOCK SHIFT AND MASK
 0004+00        	DB	??0012		; EXTENT MASK
 0005+F200      	DW	??0013		; MAXIMUM BLOCK NUMBER
 0007+3F00      	DW	??0014		; MAXIMUM DIRECTORY ENTRY NUMBER
 0009+C000      	DB	??0015,??0016	; ALLOC VECTOR FOR DIRECTORY
 000B+1000      	DW	??0017		; CHECKSUM SIZE
 000D+0200      	DW	2		; OFFSET FOR SYSTEM TRACKS
 000F+0000      	DB	??0018,??0019	; PHYSICAL SECTOR SIZE SHIFT
                dp8d3	dpb 1024,8,77,2048,128,2
 0011+4000      	DW	??0021		; 128 BYTE RECORDS PER TRACK
 0013+040F      	DB	??0022,??0023	; BLOCK SHIFT AND MASK
 0015+00        	DB	??0024		; EXTENT MASK
 0016+2B01      	DW	??0025		; MAXIMUM BLOCK NUMBER
 0018+7F00      	DW	??0026		; MAXIMUM DIRECTORY ENTRY NUMBER
 001A+C000      	DB	??0027,??0028	; ALLOC VECTOR FOR DIRECTORY
 001C+2000      	DW	??0029		; CHECKSUM SIZE
 001E+0200      	DW	2		; OFFSET FOR SYSTEM TRACKS
 0020+0307      	DB	??0030,??0031	; PHYSICAL SECTOR SIZE SHIFT
                dp8d1a	dpb 256,52,77,4096,128,2
 0022+6800      	DW	??0033		; 128 BYTE RECORDS PER TRACK
 0024+051F      	DB	??0034,??0035	; BLOCK SHIFT AND MASK
 0026+03        	DB	??0036		; EXTENT MASK
 0027+F200      	DW	??0037		; MAXIMUM BLOCK NUMBER
 0029+7F00      	DW	??0038		; MAXIMUM DIRECTORY ENTRY NUMBER
 002B+8000      	DB	??0039,??0040	; ALLOC VECTOR FOR DIRECTORY
 002D+2000      	DW	??0041		; CHECKSUM SIZE
 002F+0200      	DW	2		; OFFSET FOR SYSTEM TRACKS
 0031+0101      	DB	??0042,??0043	; PHYSICAL SECTOR SIZE SHIFT
                dp8d2a	dpb 512,30,77,2048,256,2
 0033+7800      	DW	??0045		; 128 BYTE RECORDS PER TRACK
 0035+040F      	DB	??0046,??0047	; BLOCK SHIFT AND MASK
 0037+00        	DB	??0048		; EXTENT MASK
 0038+3102      	DW	??0049		; MAXIMUM BLOCK NUMBER
 003A+FF00      	DW	??0050		; MAXIMUM DIRECTORY ENTRY NUMBER
 003C+F000      	DB	??0051,??0052	; ALLOC VECTOR FOR DIRECTORY
 003E+4000      	DW	??0053		; CHECKSUM SIZE
CP/M RMAC ASSEM 1.1	#004	PROF-80 MULTI DENSITY DISKETTE HANDLER

 0040+0200      	DW	2		; OFFSET FOR SYSTEM TRACKS
 0042+0203      	DB	??0054,??0055	; PHYSICAL SECTOR SIZE SHIFT
                dp8d3a	dpb 1024,16,77,8192,256,2
 0044+8000      	DW	??0057		; 128 BYTE RECORDS PER TRACK
 0046+063F      	DB	??0058,??0059	; BLOCK SHIFT AND MASK
 0048+07        	DB	??0060		; EXTENT MASK
 0049+9500      	DW	??0061		; MAXIMUM BLOCK NUMBER
 004B+FF00      	DW	??0062		; MAXIMUM DIRECTORY ENTRY NUMBER
 004D+8000      	DB	??0063,??0064	; ALLOC VECTOR FOR DIRECTORY
 004F+4000      	DW	??0065		; CHECKSUM SIZE
 0051+0200      	DW	2		; OFFSET FOR SYSTEM TRACKS
 0053+0307      	DB	??0066,??0067	; PHYSICAL SECTOR SIZE SHIFT
                dp5d1	dpb 256,16,40,1024,64,4
 0055+2000      	DW	??0069		; 128 BYTE RECORDS PER TRACK
 0057+0307      	DB	??0070,??0071	; BLOCK SHIFT AND MASK
 0059+00        	DB	??0072		; EXTENT MASK
 005A+8F00      	DW	??0073		; MAXIMUM BLOCK NUMBER
 005C+3F00      	DW	??0074		; MAXIMUM DIRECTORY ENTRY NUMBER
 005E+C000      	DB	??0075,??0076	; ALLOC VECTOR FOR DIRECTORY
 0060+1000      	DW	??0077		; CHECKSUM SIZE
 0062+0400      	DW	4		; OFFSET FOR SYSTEM TRACKS
 0064+0101      	DB	??0078,??0079	; PHYSICAL SECTOR SIZE SHIFT
                dp5d2	dpb 1024,5,40,1024,64,3
 0066+2800      	DW	??0081		; 128 BYTE RECORDS PER TRACK
 0068+0307      	DB	??0082,??0083	; BLOCK SHIFT AND MASK
 006A+00        	DB	??0084		; EXTENT MASK
 006B+B800      	DW	??0085		; MAXIMUM BLOCK NUMBER
 006D+3F00      	DW	??0086		; MAXIMUM DIRECTORY ENTRY NUMBER
 006F+C000      	DB	??0087,??0088	; ALLOC VECTOR FOR DIRECTORY
 0071+1000      	DW	??0089		; CHECKSUM SIZE
 0073+0300      	DW	3		; OFFSET FOR SYSTEM TRACKS
 0075+0307      	DB	??0090,??0091	; PHYSICAL SECTOR SIZE SHIFT
                dp5d3	dpb 1024,5,80,2048,128,3
 0077+2800      	DW	??0093		; 128 BYTE RECORDS PER TRACK
 0079+040F      	DB	??0094,??0095	; BLOCK SHIFT AND MASK
 007B+01        	DB	??0096		; EXTENT MASK
 007C+BF00      	DW	??0097		; MAXIMUM BLOCK NUMBER
 007E+7F00      	DW	??0098		; MAXIMUM DIRECTORY ENTRY NUMBER
 0080+C000      	DB	??0099,??0100	; ALLOC VECTOR FOR DIRECTORY
 0082+2000      	DW	??0101		; CHECKSUM SIZE
 0084+0300      	DW	3		; OFFSET FOR SYSTEM TRACKS
 0086+0307      	DB	??0102,??0103	; PHYSICAL SECTOR SIZE SHIFT
                dp5d2a	dpb 512,20,40,2048,128,3
 0088+5000      	DW	??0105		; 128 BYTE RECORDS PER TRACK
 008A+040F      	DB	??0106,??0107	; BLOCK SHIFT AND MASK
 008C+01        	DB	??0108		; EXTENT MASK
 008D+B800      	DW	??0109		; MAXIMUM BLOCK NUMBER
 008F+7F00      	DW	??0110		; MAXIMUM DIRECTORY ENTRY NUMBER
 0091+C000      	DB	??0111,??0112	; ALLOC VECTOR FOR DIRECTORY
 0093+2000      	DW	??0113		; CHECKSUM SIZE
 0095+0300      	DW	3		; OFFSET FOR SYSTEM TRACKS
 0097+0203      	DB	??0114,??0115	; PHYSICAL SECTOR SIZE SHIFT
                dp5d3a	dpb 512,20,80,2048,128,3
 0099+5000      	DW	??0117		; 128 BYTE RECORDS PER TRACK
 009B+040F      	DB	??0118,??0119	; BLOCK SHIFT AND MASK
 009D+00        	DB	??0120		; EXTENT MASK
CP/M RMAC ASSEM 1.1	#005	PROF-80 MULTI DENSITY DISKETTE HANDLER

 009E+8001      	DW	??0121		; MAXIMUM BLOCK NUMBER
 00A0+7F00      	DW	??0122		; MAXIMUM DIRECTORY ENTRY NUMBER
 00A2+C000      	DB	??0123,??0124	; ALLOC VECTOR FOR DIRECTORY
 00A4+2000      	DW	??0125		; CHECKSUM SIZE
 00A6+0300      	DW	3		; OFFSET FOR SYSTEM TRACKS
 00A8+0203      	DB	??0126,??0127	; PHYSICAL SECTOR SIZE SHIFT
                
                	dseg
                
                skew26	skew	26,6,1
 03CC+01        	DB	?NXTSEC+1
 03CD+07        	DB	?NXTSEC+1
 03CE+0D        	DB	?NXTSEC+1
 03CF+13        	DB	?NXTSEC+1
 03D0+19        	DB	?NXTSEC+1
 03D1+05        	DB	?NXTSEC+1
 03D2+0B        	DB	?NXTSEC+1
 03D3+11        	DB	?NXTSEC+1
 03D4+17        	DB	?NXTSEC+1
 03D5+03        	DB	?NXTSEC+1
 03D6+09        	DB	?NXTSEC+1
 03D7+0F        	DB	?NXTSEC+1
 03D8+15        	DB	?NXTSEC+1
 03D9+02        	DB	?NXTSEC+1
 03DA+08        	DB	?NXTSEC+1
 03DB+0E        	DB	?NXTSEC+1
 03DC+14        	DB	?NXTSEC+1
 03DD+1A        	DB	?NXTSEC+1
 03DE+06        	DB	?NXTSEC+1
 03DF+0C        	DB	?NXTSEC+1
 03E0+12        	DB	?NXTSEC+1
 03E1+18        	DB	?NXTSEC+1
 03E2+04        	DB	?NXTSEC+1
 03E3+0A        	DB	?NXTSEC+1
 03E4+10        	DB	?NXTSEC+1
 03E5+16        	DB	?NXTSEC+1
                	skew1	26,6,1
 03E6+81        	DB	?NXTSEC+1 OR 80H
 03E7+87        	DB	?NXTSEC+1 OR 80H
 03E8+8D        	DB	?NXTSEC+1 OR 80H
 03E9+93        	DB	?NXTSEC+1 OR 80H
 03EA+99        	DB	?NXTSEC+1 OR 80H
 03EB+85        	DB	?NXTSEC+1 OR 80H
 03EC+8B        	DB	?NXTSEC+1 OR 80H
 03ED+91        	DB	?NXTSEC+1 OR 80H
 03EE+97        	DB	?NXTSEC+1 OR 80H
 03EF+83        	DB	?NXTSEC+1 OR 80H
 03F0+89        	DB	?NXTSEC+1 OR 80H
 03F1+8F        	DB	?NXTSEC+1 OR 80H
 03F2+95        	DB	?NXTSEC+1 OR 80H
 03F3+82        	DB	?NXTSEC+1 OR 80H
 03F4+88        	DB	?NXTSEC+1 OR 80H
 03F5+8E        	DB	?NXTSEC+1 OR 80H
 03F6+94        	DB	?NXTSEC+1 OR 80H
 03F7+9A        	DB	?NXTSEC+1 OR 80H
 03F8+86        	DB	?NXTSEC+1 OR 80H
CP/M RMAC ASSEM 1.1	#006	PROF-80 MULTI DENSITY DISKETTE HANDLER

 03F9+8C        	DB	?NXTSEC+1 OR 80H
 03FA+92        	DB	?NXTSEC+1 OR 80H
 03FB+98        	DB	?NXTSEC+1 OR 80H
 03FC+84        	DB	?NXTSEC+1 OR 80H
 03FD+8A        	DB	?NXTSEC+1 OR 80H
 03FE+90        	DB	?NXTSEC+1 OR 80H
 03FF+96        	DB	?NXTSEC+1 OR 80H
                
                skew15	skew	15,4,1
 0400+01        	DB	?NXTSEC+1
 0401+05        	DB	?NXTSEC+1
 0402+09        	DB	?NXTSEC+1
 0403+0D        	DB	?NXTSEC+1
 0404+02        	DB	?NXTSEC+1
 0405+06        	DB	?NXTSEC+1
 0406+0A        	DB	?NXTSEC+1
 0407+0E        	DB	?NXTSEC+1
 0408+03        	DB	?NXTSEC+1
 0409+07        	DB	?NXTSEC+1
 040A+0B        	DB	?NXTSEC+1
 040B+0F        	DB	?NXTSEC+1
 040C+04        	DB	?NXTSEC+1
 040D+08        	DB	?NXTSEC+1
 040E+0C        	DB	?NXTSEC+1
                	skew1	15,4,1
 040F+81        	DB	?NXTSEC+1 OR 80H
 0410+85        	DB	?NXTSEC+1 OR 80H
 0411+89        	DB	?NXTSEC+1 OR 80H
 0412+8D        	DB	?NXTSEC+1 OR 80H
 0413+82        	DB	?NXTSEC+1 OR 80H
 0414+86        	DB	?NXTSEC+1 OR 80H
 0415+8A        	DB	?NXTSEC+1 OR 80H
 0416+8E        	DB	?NXTSEC+1 OR 80H
 0417+83        	DB	?NXTSEC+1 OR 80H
 0418+87        	DB	?NXTSEC+1 OR 80H
 0419+8B        	DB	?NXTSEC+1 OR 80H
 041A+8F        	DB	?NXTSEC+1 OR 80H
 041B+84        	DB	?NXTSEC+1 OR 80H
 041C+88        	DB	?NXTSEC+1 OR 80H
 041D+8C        	DB	?NXTSEC+1 OR 80H
                
                skew8	skew	8,3,1
 041E+01        	DB	?NXTSEC+1
 041F+04        	DB	?NXTSEC+1
 0420+07        	DB	?NXTSEC+1
 0421+02        	DB	?NXTSEC+1
 0422+05        	DB	?NXTSEC+1
 0423+08        	DB	?NXTSEC+1
 0424+03        	DB	?NXTSEC+1
 0425+06        	DB	?NXTSEC+1
                	skew1	8,3,1
 0426+81        	DB	?NXTSEC+1 OR 80H
 0427+84        	DB	?NXTSEC+1 OR 80H
 0428+87        	DB	?NXTSEC+1 OR 80H
 0429+82        	DB	?NXTSEC+1 OR 80H
 042A+85        	DB	?NXTSEC+1 OR 80H
CP/M RMAC ASSEM 1.1	#007	PROF-80 MULTI DENSITY DISKETTE HANDLER

 042B+88        	DB	?NXTSEC+1 OR 80H
 042C+83        	DB	?NXTSEC+1 OR 80H
 042D+86        	DB	?NXTSEC+1 OR 80H
                
                skew5	skew	5,1,1
 042E+01        	DB	?NXTSEC+1
 042F+02        	DB	?NXTSEC+1
 0430+03        	DB	?NXTSEC+1
 0431+04        	DB	?NXTSEC+1
 0432+05        	DB	?NXTSEC+1
                	skew1	5,1,1
 0433+81        	DB	?NXTSEC+1 OR 80H
 0434+82        	DB	?NXTSEC+1 OR 80H
 0435+83        	DB	?NXTSEC+1 OR 80H
 0436+84        	DB	?NXTSEC+1 OR 80H
 0437+85        	DB	?NXTSEC+1 OR 80H
                
                skew10	skew	10,2,1
 0438+01        	DB	?NXTSEC+1
 0439+03        	DB	?NXTSEC+1
 043A+05        	DB	?NXTSEC+1
 043B+07        	DB	?NXTSEC+1
 043C+09        	DB	?NXTSEC+1
 043D+02        	DB	?NXTSEC+1
 043E+04        	DB	?NXTSEC+1
 043F+06        	DB	?NXTSEC+1
 0440+08        	DB	?NXTSEC+1
 0441+0A        	DB	?NXTSEC+1
                	skew1	10,2,1
 0442+81        	DB	?NXTSEC+1 OR 80H
 0443+83        	DB	?NXTSEC+1 OR 80H
 0444+85        	DB	?NXTSEC+1 OR 80H
 0445+87        	DB	?NXTSEC+1 OR 80H
 0446+89        	DB	?NXTSEC+1 OR 80H
 0447+82        	DB	?NXTSEC+1 OR 80H
 0448+84        	DB	?NXTSEC+1 OR 80H
 0449+86        	DB	?NXTSEC+1 OR 80H
 044A+88        	DB	?NXTSEC+1 OR 80H
 044B+8A        	DB	?NXTSEC+1 OR 80H
                
                noskew	skew	16,1,1
 044C+01        	DB	?NXTSEC+1
 044D+02        	DB	?NXTSEC+1
 044E+03        	DB	?NXTSEC+1
 044F+04        	DB	?NXTSEC+1
 0450+05        	DB	?NXTSEC+1
 0451+06        	DB	?NXTSEC+1
 0452+07        	DB	?NXTSEC+1
 0453+08        	DB	?NXTSEC+1
 0454+09        	DB	?NXTSEC+1
 0455+0A        	DB	?NXTSEC+1
 0456+0B        	DB	?NXTSEC+1
 0457+0C        	DB	?NXTSEC+1
 0458+0D        	DB	?NXTSEC+1
 0459+0E        	DB	?NXTSEC+1
 045A+0F        	DB	?NXTSEC+1
CP/M RMAC ASSEM 1.1	#008	PROF-80 MULTI DENSITY DISKETTE HANDLER

 045B+10        	DB	?NXTSEC+1
                
                
                
                    ; Disk I/O routines for standardized BIOS interface
                
                ; Initialization entry point.
                
                ;		called for first time initialization.
                
                
                fd$init:
 045C 21D205    	lxi	h,disk$type$list	; setze Zeiger auf
 045F 2277FF    	shld	typelist		; disk$type$list
                fd$init0:
 0462 C9        	ret
                
                
                
                fd$login:
                		; This entry is called when a logical drive is about to
                		; be logged into for the purpose of density determination.
                
                		; It may adjust the parameters contained in the disk
                		; parameter header pointed at by <DE>
                
 0463 D5        	push	d		; save pointer to dph
 0464 CD8605    	call	test$format	; test disk format
 0467 D1        	pop	d		; get back dph pointer
 0468 FEFF      	cpi	0ffh		; disk not correct
                	jrz	disk$not$korr	; dann sprung
 046A+2829      	DB	28H,DISK$NOT$KORR-$-1
 046C 21FFFF    	lxi	h,-1		; zeiger auf drive typ
 046F 19        	dad	d		;
 0470 77        	mov	m,a		; setze drive type in xdph
 0471 6F        	mov	l,a		; setze dph
 0472 2600      	mvi	h,0		;
 0474 29        	dad	h		;
 0475 29        	dad	h		;
 0476 29        	dad	h		;
 0477 01D605    	lxi	b,disk$type$list+4
 047A 09        	dad	b		; hl zeigt auf dpb adr
 047B E5        	push	h		;
                	exx			; zweitregistersatz
 047C+D9        	DB	0D9H
 047D E1        	pop	h		;
 047E 4E        	mov	c,m		;
 047F 23        	inx	h		;
 0480 46        	mov	b,m		;
 0481 23        	inx	h		;
 0482 5E        	mov	e,m		;
 0483 23        	inx	h		;
 0484 56        	mov	d,m		;
                	exx			;
 0485+D9        	DB	0D9H
 0486 D5        	push	d		; dph adr. in zweitregister
CP/M RMAC ASSEM 1.1	#009	PROF-80 MULTI DENSITY DISKETTE HANDLER

                	exx			;
 0487+D9        	DB	0D9H
 0488 E1        	pop	h		;
 0489 73        	mov	m,e		;
 048A 23        	inx	h		;
 048B 72        	mov	m,d		;
 048C 110B00    	lxi	d,11		;
 048F 19        	dad	d		;
 0490 71        	mov	m,c		;
 0491 23        	inx	h		;
 0492 70        	mov	m,b		;
                	exx			;
 0493+D9        	DB	0D9H
 0494 C9        	ret			;
                disk$not$korr:
                	; setze stack so, dass hl=0 wenn seldsk zum bdos zurueckkehrt
 0495 D1        	pop	d	; returnadresse
 0496 E1        	pop	h	; dph adresse
 0497 210000    	lxi	h,0	; setze dph adresse auf 0 (platte nicht erkennbar)
 049A E5        	push	h	; stack wieder herstellen
 049B D5        	push	d	;
 049C C9        	ret		;
                
                
                ; disk READ and WRITE entry points.
                
                		; these entries are called with the following arguments:
                
                			; relative drive number in @rdrv (8 bits)
                			; absolute drive number in @adrv (8 bits)
                			; disk transfer address in @dma (16 bits)
                			; disk transfer bank	in @dbnk (8 bits)
                			; disk track address	in @trk (16 bits)
                			; disk sector address	in @sect (16 bits)
                			; pointer to XDPH in <DE>
                
                		; they transfer the appropriate data, perform retries
                		; if necessary, then return an error code in <A>
                fd$write:
 049D 3EFF      	mvi	a,0ffh
                	jr	rwcom
 049F+1801      	DB	18H,RWCOM-$-1
                
                
                fd$read:
 04A1 AF        	xra	a
                rwcom:
 04A2 320301    	sta	roderw		; read oder write
 04A5 EB        	xchg			; save dph adress
 04A6 222306    	shld	current$dph
                more$retries:
 04A9 3EFF      	mvi	a,0ffh		; unterdruecke fehlermeldung
 04AB 3263FF    	sta	dermsg
 04AE 3E05      	mvi	a,5		; fuenf versuche
 04B0 3264FF    	sta	rwretry
                	
CP/M RMAC ASSEM 1.1	#010	PROF-80 MULTI DENSITY DISKETTE HANDLER

 04B3 CDAA00    	call	rwcom1		; lesen und schreiben von common
                
 04B6 B7        	ora	a		; fehler?
                	jrz	rwcom3		; sprung wenn nein
 04B7+2834      	DB	28H,RWCOM3-$-1
 04B9 3A44FF    	lda	rest+1		; write protect?
 04BC E602      	ani	2		;
                	jrnz	rwcom3		; ja, fehlercode 2 (zufall)
 04BE+202D      	DB	20H,RWCOM3-$-1
 04C0 CD8605    	call	test$format	; format geaendert?
 04C3 2A2306    	lhld	current$dph
 04C6 2B        	dcx	h
 04C7 BE        	cmp	m		; format gleich ?
 04C8 3EFF      	mvi	a,0ffh
                	jrnz	rwcom3		; sprung wenn formatwechsel
 04CA+2021      	DB	20H,RWCOM3-$-1
 04CC 3A0000    	lda	@ermde		; fehlermeldung zugelassen?
 04CF 3263FF    	sta	dermsg
                
 04D2 CDAA00    	call	rwcom1		; zweiter lese-schreib-versuch
                
 04D5 B7        	ora	a
                	jrz	rwcom3
 04D6+2815      	DB	28H,RWCOM3-$-1
 04D8 3A0000    	lda	@ermde
 04DB B7        	ora	a
                	jrnz	rwcom6
 04DC+200D      	DB	20H,RWCOM6-$-1
 04DE 21FD04    	lxi	h,retrymsg
 04E1 CD0000    	call	?pmsg
 04E4 CDEE04    	call	conin$echo
 04E7 FE59      	cpi	'Y'
                	jrz	more$retries
 04E9+28BE      	DB	28H,MORE$RETRIES-$-1
 04EB 3E01      rwcom6	mvi	a,1
 04ED C9        rwcom3	ret
                
                conin$echo:
 04EE CD0000    	call	?conin
 04F1 F5        	push	psw
 04F2 4F        	mov	c,a
 04F3 CD0000    	call	?cono
 04F6 F1        	pop	psw
 04F7 FE61      	cpi	'a'
 04F9 D8        	rc
 04FA D620      	sui	'a'-'A'
 04FC C9        	ret
                
                retrymsg:
 04FD 0A0D205265	db	10,13,' Retry (Y/N) ?',0
                
                
                setup:
                	; setze alle parameter in CMDTAB
                	; setze 9229 auf mini/maxi betrieb
                
CP/M RMAC ASSEM 1.1	#011	PROF-80 MULTI DENSITY DISKETTE HANDLER

 050E 2A2306    	lhld	current$dph	; zeiger auf plattentyp setzen
 0511 EB        	xchg			;
 0512 21FFFF    	lxi	h,-1		;
 0515 19        	dad	d		;
 0516 6E        	mov	l,m		; zeiger auf disk$type$list eintrag
 0517 2600      	mvi	h,0		;
 0519 29        	dad	h		;
 051A 29        	dad	h		;
 051B 29        	dad	h		;
 051C 01D205    	lxi	b,disk$type$list;
 051F 09        	dad	b		;
 0520 7E        	mov	a,m		;
 0521 E620      	ani	20h		; setze auf mini/maxi
                	jrz	setup1		;
 0523+2805      	DB	28H,SETUP1-$-1
 0525 CD7805    	call	miniset		;
                	jr	setup2		;
 0528+1803      	DB	18H,SETUP2-$-1
 052A CD7F05    setup1	call	maxiset		;
 052D 7E        setup2	mov	a,m		; setze diskformat in cmdtab
 052E 4F        	mov	c,a		;
 052F E640      	ani	40h		; setze mfm bit
 0531 3233FF    	sta	cmdtab		;
 0534 79        	mov	a,c		; setze sektorgrroesse
 0535 E603      	ani	00000011b	;
 0537 3238FF    	sta	secsz		;
 053A B7        	ora	a		; setze dtl
 053B 3EFF      	mvi	a,0ffh		;
                	jrnz	setup3		;
 053D+2002      	DB	20H,SETUP3-$-1
 053F 3E80      	mvi	a,80h		;
 0541 323BFF    setup3	sta	dtll		;
 0544 23        	inx	h		; setze eot
 0545 7E        	mov	a,m		;
 0546 3239FF    	sta	eot		;
 0549 23        	inx	h		; setze gap laenge
 054A 7E        	mov	a,m		;
 054B 323AFF    	sta	gapll		;
 054E 23        	inx	h		; setze write precompensation
 054F 7E        	mov	a,m		;
 0550 3265FF    	sta	write$precom	;
 0553 3A0000    	lda	@rdrv		; laufwerk
 0556 E603      	ani	00000011b	;
 0558 3234FF    	sta	unit		;
 055B 3A0000    	lda	@trk		; spur
 055E 3235FF    	sta	track		;
 0561 2A0000    	lhld	@sect		; sektor
 0564 7D        	mov	a,l		;
 0565 E67F      	ani	01111111b	; blende head bit aus
 0567 3237FF    	sta	sector		;
 056A AF        	xra	a		; head
 056B 3236FF    	sta	head		;
 056E 7D        	mov	a,l		;
 056F E680      	ani	80h		; war es die zweite seite
 0571 C8        	rz			; dann zurueck
 0572 3E01      	mvi	a,1		;
CP/M RMAC ASSEM 1.1	#012	PROF-80 MULTI DENSITY DISKETTE HANDLER

 0574 3236FF    	sta	head		;
 0577 C9        	ret			;
                
                miniset:
 0578 F5        	push	psw
 0579 3EF3      	mvi	a,pad$mini or 1
 057B D3D8      	out	p$ls259
 057D F1        	pop	psw
 057E C9        	ret
                
                maxiset:
 057F F5        	push	psw
 0580 3EF2      	mvi	a,pad$mini
 0582 D3D8      	out	p$ls259
 0584 F1        	pop	psw
 0585 C9        	ret
                
                	cseg
                
                rwcom1:
 00AA CD0E05    	call	setup		; lese-schreib-kern
 00AD CDCA00    	call	setmem		; muss in common liegen
 00B0 CD0000    	call	monon
 00B3 3A0301    	lda	roderw
 00B6 B7        	ora	a
                	jrz	rwcom2
 00B7+2805      	DB	28H,RWCOM2-$-1
 00B9 CD2A00    	call	mwrite
                	jr	rwcom5
 00BC+1803      	DB	18H,RWCOM5-$-1
 00BE CD2700    rwcom2	call	mread
 00C1 CD0000    rwcom5	call	monoff
 00C4 F5        	push	psw
 00C5 CDFC00    	call	bank0
 00C8 F1        	pop	psw
 00C9 C9        	ret
                
                setmem:
                	; setze kacheln fuer uebertrag
                	; und dmaadresse
 00CA 3E01      	mvi	a,1		; ein sektor uebertragen
 00CC 322CFF    	sta	sectcnt		;
 00CF 2A0000    	lhld	@dma		; lese dma adresse
 00D2 3E2A      	mvi	a,2ah		; unter 3000h ?
 00D4 BC        	cmp	h		;
                	jrnc	setmem1		; wenn ja, sprung
 00D5+300A      	DB	30H,SETMEM1-$-1
 00D7 222AFF    	shld	dmaadr		; trage dmaadresse ein
 00DA 3A0000    	lda	@dbnk		; setze dmabank
 00DD CD0000    	call	?bank		;
 00E0 C9        	ret			;
 00E1 110080    setmem1	lxi	d,8000h		; addiere 8000h zu dmaadresse
 00E4 19        	dad	d		;
 00E5 222AFF    	shld	dmaadr		;
                				; lege untere 3 kacheln nach 8000h
 00E8 0680      	mvi	b,80h		;
CP/M RMAC ASSEM 1.1	#013	PROF-80 MULTI DENSITY DISKETTE HANDLER

 00EA 0EDE      	mvi	c,p$ram$table	;
 00EC 3A0000    	lda	@dbnk		; schalte gewuenschte bank nach 8000h
 00EF C602      	adi	2		;
                	outp	a		;
 00F1+ED79      	DB	0EDH,A*8+41H
 00F3 0690      	mvi	b,90h		;
                	outp	a		;
 00F5+ED79      	DB	0EDH,A*8+41H
 00F7 06A0      	mvi	b,0a0h		;
                	outp	a		;
 00F9+ED79      	DB	0EDH,A*8+41H
 00FB C9        	ret			;
                
                bank0
 00FC 3A0000    	lda	@cbnk		; setze alte bank
 00FF CD0000    	call	?bank		;
 0102 C9        	ret
                
 0103           roderw	ds	1
                
                	dseg			; rest is banked
                
                
                TEST$FORMAT:
                	;TESTET DAS FORMAT DER DISK, DIE SICH IM VON
                	;SEKDSK	SPEZIFIZIERTEN LAUFWERK BEFINDET UND VERGLEICHT
                	;ES MIT DEN IN DISK$TYPE$LIST ERLAUBTEN FORMATEN.
                	;IST DAS FORMAT NICHT ERKENNBAR, ODER IN DISK$TYPE$LIST
                	;NICHT VEREINBART, SO KEHRT TEST$FORMAT MIT AKKU=0FFH
                	;ZURUECK. KONNTE DAS FORMAT ERMITTELT WERDEN UND WAR ES AUCH IN
                	;DISK$TYPE$LIST VEREINBART, DANN KEHRT TEST$FORMAT MIT AKKU=0
                	;ZURUECK. IN DIESEM FALL WIRD IN ABHAENIGKEIT VON SEKDSK
                	;DER DISK-TYP IN DISKTYPA, -B, -C ODER -D NEU GESETZT
                	;DER DISK-TYP ENTSPRICHT DER LAUFENDEN NUMMER DES EINTRAGS
                	;IN DER DISK$TYPE$LIST TABELLE.
                	;
 0586 3A0000    	lda	@rdrv		;SETZE DAS ZU TESTENDE LAUFWERK
 0589 E603      	ani	03h		;maskiere die oberen 6 bits
 058B 3234FF    	STA	UNIT		;
 058E 0605      	MVI	B,5		;FUENF TEST-VERSUCHE
 0590 3E01      	MVI	A,1		;AUF SPUR 1
 0592 3225FF    	STA	TEST$TRACK	;
 0595 C5        TESTF1:	PUSH	B		;
 0596 CD0000    	CALL	monon		;BENUTZE TEST-PROGRAMM
 0599 CD4100    	CALL	mtest		;AUS MONITOR
 059C CD0000    	CALL	monoff		;
 059F C1        	POP	B		;
 05A0 B7        	ORA	A		;WAR TEST ERFOLGREICH ?
                	JRZ	TESTF3		;SPRUNG WENN JA
 05A1+2805      	DB	28H,TESTF3-$-1
                	DJNZ	TESTF1		;SONST MAXIMAL FUENF VERSUCHE
 05A3+10F0      	DB	10H,TESTF1-$-1
 05A5 3EFF      TESTF2	MVI	A,0FFH		;SONST RUECKSPRUNG MIT AKKU=0FFH
 05A7 C9        	RET			;
                TESTF3:				;OK, FORMAT DATEN STEHEN IN TEST$TYPE
                				;UND TEST$TRACK
CP/M RMAC ASSEM 1.1	#014	PROF-80 MULTI DENSITY DISKETTE HANDLER

 05A8 0600      	MVI	B,0		;ZAEHLER FUER DISKTYP
 05AA 3A23FF    	LDA	TEST$TYPE	;TYPE IN D
 05AD 57        	MOV	D,A		;
 05AE 3A24FF    	LDA	TEST$MSEK	;SECTORGROESSE IN E
 05B1 5F        	MOV	E,A		;
 05B2 21D205    	LXI	H,DISK$TYPE$LIST;ZEIGER AUF VEREINBARTE FORMATE
 05B5 7E        TESTF4:	MOV	A,M
 05B6 E610      	ANI	010H		;ENDE DER LISTE
                	JRNZ	TESTF2		;DANN MIT FEHLER-MELDUNG ZURUECK
 05B8+20EB      	DB	20H,TESTF2-$-1
 05BA 7E        	MOV	A,M		;VERGLEICHE EINTRAG MIT DE
 05BB BA        	CMP	D		;IST TYP GLEICH?
 05BC C2C705    	JNZ	INX8		;NEIN EINEN EINTRAG WEITER
 05BF 23        	INX	H		;TYP WAR GLEICH
 05C0 7E        	MOV	A,M		;STIMMT AUCH NOCH DIE SEKTORGROESSE
 05C1 BB        	CMP	E		;
 05C2 C2C805    	JNZ	INX7		;NEIN EINEN EINTRAG WEITER
                				;
                				;OK, DISK WURDE ERKANNT
 05C5 78        	mov	a,b		;
 05C6 C9        	RET			;
                				;
 05C7 23        INX8	INX	H		;EINEN DISK-TYP WEITER
 05C8 23        INX7	INX	H		;
 05C9 23        	INX	H		;
 05CA 23        	INX	H		;
 05CB 23        	INX	H		;
 05CC 23        	INX	H		;
 05CD 23        	INX	H		;
 05CE 23        	INX	H		;
 05CF 04        	INR	B		;
                	JR	TESTF4		;
 05D0+18E3      	DB	18H,TESTF4-$-1
                
                
                ;********************************************************************
                ;
                ;HIER WERDEN DIE MOEGLICHEN DISK-FORMATE VEREINBART
                ;
                ;
                ;
                DISK$TYPE$LIST:
                	;
                	;DIESE LISTE DEFINIERT DIE VOM BETRIEBSSYSTEM LESBAREN
                	;PLATTEN-TYPEN
                	;DIE LISTE BESTEHT AUS BELIEBIG VIELEN EINTRAEGEN VON
                	;JE ACHT BYTE, DIE WIE NACHFOLGEND BESCHREIBEN AUFGEBAUT
                	;SIND:
                	;	BYTE 1	:DISK-TYP WIE VON MONTEST ERMITTELT
                	;	BYTE 2	:SEKTOR-ANZAHL
                	;	BYTE 3	:GAP-LAENGE DIE DER UPD 765 VERWENDEN SOLL
                	;	BYTE 4	:WRITE PRECOMPENSATION
                	;	BYTE 5-6:ADRESSE DES DPB FUER DIESES FORMAT
                	;	BYTE 7-8:ADRESSE DER SEKTOR SKEW-TABLE
                	;
                	;TEST$FORMAT VERGLEICHT DIE BEIDEN ERSTEN BYTES MIT
CP/M RMAC ASSEM 1.1	#015	PROF-80 MULTI DENSITY DISKETTE HANDLER

                	;TEST$TYPE UND TEST$MSEK DIE DAS UNTERPROGRAM MONTEST
                	;LIEFERTT.
                	;
 0000 =         	SSIDE	EQU	000H	;EQUATES FUER TYPE
 0080 =         	DSIDE	EQU	080H	;
 0000 =         	SDENS	EQU	000H	;
 0040 =         	DDENS	EQU	040H	;
 0000 =         	MAXIF	EQU	000H	;
 0020 =         	MINIF	EQU	020H	;
 0000 =         	S0128	EQU	000H	;
 0001 =         	S0256	EQU	001H	;
 0002 =         	S0512	EQU	002H	;
 0003 =         	S1024	EQU	003H	;
                	;
                	;
 05D2 00        	DB	SSIDE OR SDENS OR MAXIF OR S0128
 05D3 1A        	DB	26
 05D4 0700      	DB	07,0
 05D6 0000CC03  	DW	DP8S0,SKEW26
                	;
 05DA 43        	DB	SSIDE OR DDENS OR MAXIF OR S1024
 05DB 08        	DB	8
 05DC 3502      	DB	35H,2
 05DE 11001E04  	DW	DP8D3,SKEW8
                	;
 05E2 C1        	DB	DSIDE OR DDENS OR MAXIF OR S0256
 05E3 1A        	DB	26
 05E4 0702      	DB	7,2
 05E6 2200CC03  	DW	DP8D1A,SKEW26
                	;
 05EA C2        	DB	DSIDE OR DDENS OR MAXIF OR S0512
 05EB 0F        	DB	15
 05EC 1802      	DB	18H,2
 05EE 33000004  	DW	DP8D2A,SKEW15
                	;
 05F2 C3        	DB	DSIDE OR DDENS OR MAXIF OR S1024
 05F3 08        	DB	8
 05F4 3502      	DB	35H,2
 05F6 44001E04  	DW	DP8D3A,SKEW8
                	;
 05FA 61        	DB	SSIDE OR DDENS OR MINIF OR S0256
 05FB 10        	DB	16
 05FC 1B02      	DB	1BH,2
 05FE 55004C04  	DW	DP5D1,NOSKEW
                	;
 0602 63        	DB	SSIDE OR DDENS OR MINIF OR S1024
 0603 05        	DB	5
 0604 1B02      	DB	1BH,2
 0606 66002E04  	DW	DP5D2,SKEW5
                	;
 060A E3        	DB	DSIDE OR DDENS OR MINIF OR S1024
 060B 05        	DB	5
 060C 1B02      	DB	1BH,2
 060E 77002E04  	DW	DP5D3,SKEW5
                	;
 0612 62        	DB	SSIDE OR DDENS OR MINIF OR S0512
CP/M RMAC ASSEM 1.1	#016	PROF-80 MULTI DENSITY DISKETTE HANDLER

 0613 0A        	DB	10
 0614 0E02      	DB	0EH,2
 0616 88003804  	DW	DP5D2A,SKEW10
                	;
 061A E2        	DB	DSIDE OR DDENS OR MINIF OR S0512
 061B 0A        	DB	10
 061C 0E02      	DB	0EH,2
 061E 99003804  	DW	DP5D3A,SKEW10
                	;
 0622 10        	DB	010H		;ENDE-KENNUNG
                
 0623           current$dph	ds	2	
                
 0625           	end
