DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

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

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦e092fb218⟧ TextFile

    Length: 19968 (0x4e00)
    Types: TextFile
    Names: »GETPUTF.ASM«

Derivation

└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk
    └─ ⟦this⟧ »GETPUTF.ASM« 

TextFile


	TITLE 'MINI FLOPPY DISK SYSTEM GETPUT UTILITY'
	PAGE 43

;******************************************************************************
;	CHRISTIAN ROVSING A/S FLOPPY SYSTEM GENERATION PROGRAM
;******************************************************************************
;
;
;	MINI FLOPPY DISK CP/M SYSTEM FETCHING AND PLACEMENT PROGRAM FOR 
;	USE WITH CP/M 2.2 ON A TANDON 96 TPI 5 1/4 INCH MINIFLOPPY DISK 
;	DRIVE. THE CP/M DISK DRIVE CONFIGURATION MAPS LOGICAL DRIVES A: AND B:
;	TO PHYSICAL UNITS 0 AND 1. THIS MAPPING MAKES 604K BYTES OF DATA 
;	STORAGE AVAILABLE TO EACH LOGICAL DRIVE. THIS SYSTEM UTILITY PROGRAM 
;	PERMITS READING THE CP/M SYSTEM TRACKS INTO MEMORY OR WRITING THE 
;	SYSTEM TRACKS FROM MEMORY TO DISK. BOTH MINI DISK DRIVES CAN BE
;	ACCESSEED IN A SIMILAR FASHION TO PERMIT SYSTEM TRACK BACKUP FROM
;	DISKETTE TO DISKETTE.TRACKS 0 AND 1 ARE RESERVED FOR THIS PURPOSE. 
;
;	THE GETPUT PROGRAM PLACES THE SYSTEM IMAGE INTO MEMORY STARTING 
;	AT ADDRESS 03480H. THIS ADDRESS IS CHOSEN FOR THE FOLLOWING
;	REASONS. 
;
;		1) PLACING IMAGE THIS HIGH ALLOWS THERE TO BE PLENTY
;		   OF ROOM BELOW THE IMAGE TO LOAD DDT WITHOUT
;		   CAUSING OVELAY OF THE SYSTEM IMAGE.
;
	PAGE
;
;	COMMAND OPTIONS OF THE MINI FLOPPY DISK GET/PUT PROGRAM INCLUDE THE
;	FOLLOWING OPTIONS:
;
;		A) GET A SYSTEM IMAGE FROM A SPECIFIC MINI DISK
;		   LOGICAL DRIVE A: OR B:.
;
;		B) PUT A SYSTEM IMAGE TO A SPECIFIC MINI DISK 
;		   LOGICAL DRIVE A: OR B:.
;
;		C) MODIFY MEMORY LOCATIONS FOR SPECIAL PURPOSE
;		   PATCHING OPERATIONS UPON THE SYSTEM IMAGE. THIS
;		   FEATURE ALLOWS FIELD MODIFICATION OF CERTAIN
;		   MINI FLOPPY DISK CP/M PARAMETERS AS MAY BE MADE 
;		   AVAILABLE FROM TIME TO TIME.
;
;
	PAGE
;******************************************************************************
;
;
;GENERAL EQUATES
;
CR	EQU	0DH		;CARRIAGE RETURN CODE
LF	EQU	0AH		;LINE FEED CODE
BS	EQU	08H		;BACK SPACE CODE
BEL	EQU	07H		;BELL RING CODE
ESC	EQU	01BH		;ESCAPE CODE
TRUE	EQU	0FFFFH		;TRUE CODE
FALSE	EQU	NOT TRUE	;FALSE CODE
;
;
FRPT	EQU	08H		;NUMBER OF 512 BYTE FLOPPY RECORDS PER
				;TRACK. (NOTE THAT REALLY 256 BYTE SECTOR
				;PAIRS).
ISIZE	EQU	FRPT*2		;GETPUT READS ENTIRE TWO SYSTEM TRACKS
IBUF	EQU	03480H		;MEMORY ADDRESS FOR BASE OF GET/PUT 
				;SYSTEM IMAGE BUFFER
SECSIZ	EQU	512		;SIMULATED HOST PHYSICAL SECTOR SIZE
MAXMINI	EQU	01H		;PHYSICAL ADDRESS OF MAX MINI DRIVE
;
;
;
COMPEN	EQU	080H		;WRITE COMPENSATION ENABLE
MINIEN	EQU	040H		;MINI DRIVE ENABLE
DENSEL	EQU	020H		;BIT MASK FOR DENSITY SELECT
;
	PAGE
;
;DEFINE MEMORY BASED I/O MODULE ENTRY POINTS
;
MODBASE EQU	0F800H		;SET JUMP TABLE EQUIVALENT ADDRESSES
;
INITSER EQU	MODBASE+00	;HARDWARE INITIALIZE
;				;(NO PARAMETERS)
SETCBAUD EQU	MODBASE+03	;SET CONSOLE I/O BAUD RATE FACTOR
;				;(HL) = COUNTER TIMER PARAMETER VALUE
SETLBAUD EQU	MODBASE+06	;SET LINE PRINTER I/O BAUD RATE FACTOR
;				;(HL) = COUNTER TIMER VALUE
SETLRMSK EQU	MODBASE+09	;SET LINE PRINTER SIO RECEIVER MASK VALUE
;				;(A) = LINE PRINTER SIO MASK BYTE
SETLRVAL EQU	MODBASE+012	;SET LINE PRINTER SIO RECEIVER POLL VALUE
;				;(A) = LINE PRINTER POLL VALUE
SETLTMSK EQU	MODBASE+015	;SET LINE PRINTER SIO TRANSMITTER MASK VALUE
;				;(A) = LINE PRINTER SIO MASK BYTE
SETLTVAL EQU	MODBASE+018	;SET LINE PRINTER SIO TRANSMITTER POLL VALUE
;				;(A) = LINE PRINTER SIO POLL VALUE BYTE
CONSTAT EQU	MODBASE+021	;GET CONSOLE STATUS
;				;RETURN (A)=00 FOR NOT READY INPUT
;				;	(A)=FF FOR READY INPUT
CONIN	EQU	MODBASE+024	;GO GET CONSOLE INPUT CHARACTER
;				;(A)=INPUT CONSOLE CHARACTER
CONOUT	EQU	MODBASE+027	;PUT OUT CONSOLE CHAR
;				;(C)=CHARACTER TO OUTPUT
LPTSTAT EQU	MODBASE+030	;GET LINE PRINTER STATUS
;				;RETURN (A)=00 FOR NOT NEXT OUTPUT
;				;	(A)=FF FOR READY OUTPUT
LPTIN	EQU	MODBASE+033	;GO GET LINE PRINTER INPUT CHARACTER
;				;(A)=INPUT LPT SERIAL PORT CHARACTER
LPTOUT	EQU	MODBASE+036	;PUT OUT LINE PRINTER CHARACTER
;				;(C)=LPT SERIAL OUTPUT CHARACTER
HUNIT	EQU	MODBASE+039	;SELECT HARD DISK UNIT NUMBER
;				;(C)=UNIT NUMBER ON MSC 9205 CONTROLLER
HPLAT	EQU	MODBASE+042	;SELECT HARD DISK PLATTER (HEAD) NUMBER 
;				;(C)=HEAD SELECT NUMBER
HSURF	EQU	MODBASE+045	;SELECT HARD DISK SURFACE(HEAD 2^2) NUMBER
;				;(C)=MSB OF HEAD NUMBER
HCYL	EQU	MODBASE+048	;SELECT HARD DISK CYLINDER NUMBER
;				;(BC)=CYLINDER NUMBER
HREC	EQU	MODBASE+051	;SELECT HARD DISK RECORD NUMBER
;				;(C)=RECORD NUMBER
HCNT	EQU	MODBASE+054	;SELECT HARD DISK SECTOR COUNT
;				;(C)=RECORD COUNT
HBADDR	EQU	MODBASE+057	;SET 9205 CONTROLLER DMA ADDRESS
;				;(BC)=16 BIT DATA BUFFER ADDRESS
HREST	EQU	MODBASE+060	;RESTORE SELECTED HARD DISK UNIT
;				;(A) RETURNS ERROR CODE
HREAD	EQU	MODBASE+063	;READ SELECTED SECTOR(S)
;				;(A) RETURNS ERROR CODE
HVERF	EQU	MODBASE+066	;VERIFY SELECTED SECTOR(S)
;				;(A) RETURNS ERROR CODE
HWRIT	EQU	MODBASE+069	;WRITE SELECTED SECTOR(S);
;				;(A) RETURNS ERROR CODE
HEXEC	EQU	MODBASE+072	;EXECUTE SPECIAL COMMAND OF MSC 9205
;				;(C) ENTRY WITH MSC 9205 COMMAND
;				;(A) RETURNS ERROR CODE
HRESET	EQU	MODBASE+075	;RESET HARD DISK CONTROLLER MSC 9205
;				;NO PARAMETERS
MUNIT	EQU	MODBASE+078	;SELECT MINI FLOPPY UNIT NUMBER
;				;(C)=FLOPPY PHYSICAL UNIT NUMBER
MSURF	EQU	MODBASE+081	;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER
;				;(C)=FLOPPY SIDE NUMBER
MCYL	EQU	MODBASE+084	;SELECT MINI FLOPPY CYLINDER(TRACK) NUMBER
;				;(C)=FLOPPY TRACK NUMBER
MREC	EQU	MODBASE+087	;SELECT MINI FLOPPY RECORD NUMBER
;				;(C)=FLOPPY SECTOR NUMBER
MCNT	EQU	MODBASE+090	;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT
;				;(C)=MINI FLOPPY SECTOR COUNT
MSIZE	EQU	MODBASE+093	;SELECT FLOPPY SECTOR SIZE (00)=256 BYTES
;				;(C)=MINI FLOPPY TRACK NUMBER
MBADDR	EQU	MODBASE+096	;SET FLOPPY DISK DATA BUFFER ADDRESS
;				;(BC)=FLOPPY BUFFER ADDRESS
MREST	EQU	MODBASE+099	;RESTORE SELECTED MINI FLOPPY UNIT
;				;(A)=RETURNS ERROR STATUS
MVERF	EQU	MODBASE+102	;VERIFY (READ) SELECTED SECTOR
;				;(A)=RETURNS STATUS
MWRIT	EQU	MODBASE+105	;WRITE SELECTED SECTOR
;				;(A)=RETURNED STATUS
MREAD	EQU	MODBASE+108	;READ SELECTED SECTOR
;				;(A)=RETURNED STATUS
MWTRK	EQU	MODBASE+111	;WRITE SELECTED FLOPPY TRACK
;				;(A)=RETURNED STATUS
MMODE	EQU	MODBASE+114	;SET FLOPPY OPERATION MODE
;				;(C)=STANDARD MODE DEFINITION
MINST	EQU	MODBASE+117	;FETCH CURRENT INSTRUCTION CODE
;				;(A)=RETURNED INSTRUCTION PATTERN
MMOFF	EQU	MODBASE+120	;CHECK MINI FLOPPY MOTOR ON COUNT
;				;OUT TIMER
;
	PAGE
;******************************************************************************
;
;SET START OF PROGRAM CP/M TRANSIENT PROGRAM AREA
;
	ORG	0100H
;
	DI			;DON'T ALLOW INTERRUPTS HERE
	JMP	START
;
;
;CP/M CONSOLE I/O INTERFACE ENTRY ROUTINES
;
;	DIRECT CALLS TO THE BIOS ARE DONE
;
VECTAB	EQU	0001H		;LOCATION IN MEMORY CONTAINING 
				;WARM BOOT VECTOR
CSTOFF	EQU	0003H		;CONSOLE STAT OFFSET FROM WBOOT
CINOFF	EQU	0006H		;CONSOLE INPUT OFFSET FROM WBOOT
COTOFF	EQU	0009H		;CONSOLE OUTPUT OFFSET FROM WBOOT
;
	PAGE
;
;CONSOLE INPUT ROUTINE (RETURNS CHARACTER IN A REGISTER)
;
CI:
	PUSH	H		;SAVE REGISTERS
	PUSH	D
	PUSH	B
	LHLD	VECTAB		;GET POINTER BASE
	LXI	D,CINOFF	;GET OFFSET VALUE
	DAD	D
	LXI	D,CI1		;PUT A RETURN BACK ONTO STACK
	PUSH	D
	PCHL			;GO TO BIOS ROUTINE
CI1:
	POP	B
	POP	D		;RESTORE CALLERS REGS
	POP	H
	RET
;
;
;CONSOLE OUTPUT ROUTINE (OUTPUT CHARACTER FROM C REG)
;
CO:
	PUSH	H		;SAVE REGISTERS
	PUSH	D
	PUSH	B
	LHLD	VECTAB		;GET POINTER BASE
	LXI	D,COTOFF	;GET OFFSET VALUE
	DAD	D
	LXI	D,CO1		;PUT A RETURN BACK ONTO STACK
	PUSH	D
	PCHL			;GO TO BIOS ROUTINE
CO1:
	POP	B
	POP	D		;RESTORE CALLERS REGS
	POP	H
	RET
;
	PAGE
;
;CONSOLE TERMINAL STATUS ROUTINE
; RETURNS A=00 IF NO CHARACTER PRESENT
; RETURNS A=FF IF    CHARACTER PRESENT
;
CSTS:
	PUSH	H		;SAVE REGISTERS
	PUSH	D
	PUSH	B
	LHLD	VECTAB		;GET POINTER BASE
	LXI	D,CSTOFF	;GET OFFSET VALUE
	DAD	D
	LXI	D,CSTS1		;PUT A RETURN BACK ONTO STACK
	PUSH	D
	PCHL			;GO TO BIOS ROUTINE
CSTS1:
	POP	B
	POP	D		;RESTORE CALLERS REGS
	POP	H
	RET
;
;
;COMPARE DOUBLE REGISTER PAIRS (DE) TO (HL) AND RETURN
;FLAGS SIMILAR TO STANDARD CMP B INSTRUCTION. IE (A) CORRESPONDS
;TO (DE) AND (B) CORRESPONDS TO (HL).
;
CDEHL:
	MOV	A,D		;CHECK HIGH BYTES FIRST
	CMP	H
	RNZ			;RETURN IF HIGH BYTES SET FLAGS
	MOV	A,E
	CMP	L		;CHECK LOW BYTES
	RET
;
	PAGE
;******************************************************************************
;
;	BEGIN EXECUTION OF GET/PUT PROGRAM HERE
;
START:
	LXI	SP,STCKK	;MAKE OURSELVES A STACK
;
SIGNON:				;SEND HELLO TO CRT
	CALL	CRLF
	CALL	CRLF
	LXI	D,STRMSG
	CALL	CRTMS
	JMP	MONITOR		;GO TO MONITOR ROUTINE
;
;
;SIGNON MESSAGE FOR GET/PUT PROGRAM
;
STRMSG:
;
	DB	ESC,'Æ7m'	;REVERSE FAINT RENDITION
;
	DB	'CHRISTIAN ROVSING A/S - MINI FLOPPY SYSTEM GENERATION',CR,LF
	DB	'UTILITY FOR TANDON TM-100 5 1/4 INCH MINIFLOPPY DRIVE',CR,LF
;
	DB	ESC,'Æm'	;BACK TO NORMAL RENDITION
	DB	CR,LF,CR,LF,'#'
;
	PAGE
;******************************************************************************
;
;
MONITOR:
	LXI	D,PRMSG		;PRINT OUT THE COMMAND PROMPT
				;MESSAGE SO THEY KNOW WHAT TO DO
	CALL	CRTMS
PROMPT:
	LXI	SP,STCKK	;RE INIT STACK IF BACK FROM ERROR
	LXI	D,PRMSG1	;PRINT OUT PROMPT
	CALL	CRTMS
;
	CALL	CECHO		;GET OPERATOR ENTRY COMMAND
	CPI	' '
	JZ	MONITOR		;REDO COMMAND LINE PROMPT IF SPACE
;
	ANI	05FH		;CONVERT TO UPPER CASE
	CPI	'G'
	JZ	GET		;TO ROUTINE TO GET SYSTEM IMAGE
	CPI	'P'
	JZ	PUT		;TO ROUTINE TO PUT SYSTEM IMAGE
	CPI	'M'
	JZ	MEM		;TO ROUTINE FOR MEMORY DISPLAY/ALTER
	CPI	'C'-040H
	JZ	GPXIT		;TO GET/PUT EXIT POINT
;
	MVI	C,'?'		;UNKNOWN COMMAND
	CALL	CO
	CALL	CRLF
	JMP	PROMPT		;BACK TO PROMPT IF BAD COMMAND
;
;
PRMSG:
	DB	'SELECT COMMAND',CR,LF
	DB	'   G) GET SYSTEM IMAGE     P) PUT SYSTEM IMAGE',CR,LF
	DB	'   M) MEMORY PATCH     CTL-C) WARM BOOT CP/M',CR,LF,'#'
PRMSG1:
	DB	CR,LF,'---->','#'
;
	PAGE
;
;OPERATOR SELECTED THE EXIT ROUTINE VIA CTL-C
;
GPXIT:
	CALL	CRLF
	JMP	0000H		;OFF TO THE WARM BOOT
;
;
;
;******************************************************************************
;
;	GENERAL PURPOSE I/O SUBROUTINES 
;
;
CRLF:				;ROUTINE TO DO CONSOL CR AND LF
	MVI	C,CR
	CALL	CO
	MVI	C,LF
	CALL	CO
	RET
;
;
;
CECHO:				;ROUTINE TO GET AND ECHO A CHARACTER
	CALL	CI
	MOV	C,A
	PUSH	PSW
	CALL	CO
	POP	PSW
	ANI	07FH		;GET RID OF PARITY
	RET
;
	PAGE
;
NBL:				;ROUTINE TO CONVERT A BYTE TO A HEX NIBBLE
	SUI	'0'
	RC
	ADI	0E9H
	RC
	ADI	06H
	JP	NIO
	ADI	07H
	RC
NIO:
	ADI	10
	ORA	A
	RET
;
;
BYTEC:				;ROUTINE TO GET A HEX BYTE IN A
	CALL	CECHO		;GET CHARACTER
BYTC1:
	CALL	NBL		;CONVERT TO HEX
	JC	ERRR		;TO ERROR ROUTINE
	RLC
	RLC
	RLC
	RLC
	PUSH	PSW		;SAVE 1ST ENTRY
	CALL	CECHO		;GET 2ND CHARACTER
	CALL	NBL		;CONVERT IT TO HEX
	JC	ERRR
	POP	B		;RECOVER 1ST RESULT
	ORA	B		;COMBINE WITH 2ND
	RET
;
;
CONI:				;ROUTINE TO GET A 1 BYTE PARAMETER
	PUSH	B
	CALL	BYTEC
	POP	B
	RET
;
	PAGE
;
PARAM:				;ROUTINE TO INPUT 4 HEX CHARACTERS
	LXI	H,0
PARM1:
	CALL	CECHO		;GET INPUT
	CPI	0DH		;LOOK FOR RETURN
	RZ
	DAD	H
	DAD	H
	DAD	H
	DAD	H
	JC	ERRR
	CALL	NBL		;CONVERT ENTRY TO HEX
	JC	ERRR
	ORA	L
	MOV	L,A
	JMP	PARM1		;GO FOR NEXT CHARACTER
;
;
HLCO:				;PRINT CRLF AND CONTENTS OF (HL)
	CALL	CRLF
HLCO1:				;ROUTINE TO PRINT CONTENTS OF (HL)
	MOV	A,H
	CALL	BYTEO
	MOV	A,L
	CALL	BYTEO
	RET
;
;
DSPYM:				;DISPLAYS MEMORY BYTE POINTED TO BY (HL)
	CALL	HLCO		;PRINT ADDRESS
	MVI	C,'='
	CALL	CO
	MOV	A,M
	CALL	BYTEO		;PRINT ADDRESS CONTENTS
	MVI	C,' '
	CALL	CO		;PRINT OUT SPACE
	RET
;
	PAGE
;
BYTEO:				;ROUTINE TO OUTPUT A HEX BYTE TO THE CONSOLE
	PUSH	PSW
	CALL	BYTO1
	MOV	C,A
	CALL	CO
	POP	PSW
	CALL	BYTO2
	MOV	C,A
	CALL	CO
	RET
;
BYTO1:
	RRC
	RRC
	RRC
	RRC
BYTO2:
	ANI	0FH
	CPI	0AH
	JM	BYTO3
	ADI	07H
BYTO3:
	ADI	030H
	RET
;
;
;
ERRR:				;ERROR ON ENTRY OF OPERATOR PARAMETERS
	MVI	C,'?'		;OUTPUT UNKNOWN PARAMETER
	CALL	CO
	CALL	CRLF
	JMP	PROMPT		;GO TO PROMPT IF ERROR
;
	PAGE
;******************************************************************************
;
;MEMORY DISPLAY ALTER ROUTINE TO ALLOW PATCHING OF MEMORY UNDER
;THE CONTROL OF THE GET/PUT PROGRAM. OPERATION AS FOLLOWS:
;
;	SELECT A HEX MEMORY ADDRESS FOLLOWED BY CARRIAGE 
;	RETURN. MEMORY CURRENT CONTENTS AT THAT ADDRESS
;	WILL BE PRINTED. CONTENTS CAN BE CHANGED BY ENTERING
;	A VALID HEX BYTE VALUE. AS VALUE IS ACCEPTED, THE DISPLAY
;	ADVANCES TO THE NEXT MEMORY ADDRESS. IF THE MEMORY LOCATION
;	IS BAD AND CANNOT ACCEPT THE ENTERED VALUE AN "E" IS PRINTED
;	TO THE RIGHT OF THE ENTERED VALUE TO INDICATE THE ERROR.
;	ENTERING SPACE BAR WILL ADVANCE TO THE NEXT MEMORY LOCATION
;	WITHOUT MODIFYING THE PRESENT MEMORY LOCATION. ENTRY OF THE
;	UP ARROW "^" WILL BACKUP DISPLAY TO THE PREVIOUS MEMORY
;	ADDRESS. CARRIAGE RETURN SENDS CONTROL BACK TO THE GET/PUT
;	MONITOR PROMPT.
;
MEM:
	LXI	D,MEMMSG	;DISPLAY ALTER MESSAGE
	CALL	CRTMS
	CALL	PARAM		;GET ADDESS IN H & L
MEM1:
	CALL	DSPYM		;DISPLAY MEMORY BYTE
	CALL	CECHO		;GET INPUT CHARACTER
	CPI	'^'		;NEED TO BACK UP?
	JZ	MEM10
	CPI	CR		;CHECK FOR CR EXIT
	JZ	MEMEND
	CPI	' '		;CHECK FOR NEXT CHARACTER
	JZ	MEM9
	CALL	BYTC1		;CONVERT THIS BYTE AND NEXT TO HEX
	MOV	M,A		;STUFF IT IN MEMORY
	CMP	M		;DID IT GO IN OK?
	JZ	MEM9
	MVI	C,' '		;NOPE   SHOW'EM AN E FOR ERROR
	CALL	CO
	MVI	C,'E'
	CALL	CO
MEM9:
	INX	H		;INCREMENT MEMORY ADDRESS
	JMP	MEM1
MEM10:
	DCX	H		;DECREMENT MEMORY ADDRESS
	JMP	MEM1
MEMEND:
	JMP	PROMPT		;RETURN TO MONITOR
;
;
MEMMSG:
	DB	'EMORY ADDRESS (0000-FFFF) =','#'
;
;
;******************************************************************************
;
;
;CRTMS - ROUTINE TO DISPLAY A MESSAGE ON THE CRT. REGISTERS D AND E
;	 CONTAIN THE MESSAGE POINTER. END OF MESSAGE IS INDICATED BY
;	 A "#" CHARACTER.
;
;
CRTMS:				;ROUTINE PRINTS MESSAGE ON CRT
	LDAX	D
	CPI	'#'		;END MESSAGE MARKER
	RZ			;YES - RETURN
	MOV	C,A
	CALL	CO
	INX	D
	JMP	CRTMS
;
	PAGE
;******************************************************************************
;
;	GET SYSTEM IMAGE FROM OPERATOR SELECTED DRIVE INTO MEMORY
;	AT ADDRESS OF THE IMAGE POSITION "IBUF" SET BY EQUATE AT 
;	THE BEGINNING OF THIS PROGRAM. ALL OF TRACKS 0 AND 1 ARE 
;	READ FOR MAXIMUM FLEXIBILITY. NOTE THAT THIS REQUIRES THAT 
;	8K OF MEMORY MUST BE AVAILABLE ABOVE THE "IBUF" POSITION
;
;
GET:
	CALL	CRLF
	LXI	D,GETMS		;PRINT GET UNIT SELECT MESSAGE
	CALL	CRTMS
	CALL	CECHO		;GET OPERATOR ENTRY
	ANI	05FH		;UPPERCASE
	SUI	'A'		;ZERO BASE SELECT
	CPI	MAXMINI+1	;CHECK IF TOO BIG
	JNC	ERRR
	MOV	C,A		;SELECT MINI UNIT
	CALL	MUNIT
	MVI	C,02H		;SET PAIRED SECTOR ACCESS
	CALL	MCNT
	MVI	C,00H		;SET SECTOR SIZE TO 256 BYTES
	CALL	MSIZE
;
	CALL	CRLF		;CLEAN UP DISPLAY
;
	CALL	MREST		;RESTORE SELECTED UNIT
;
	MVI	D,01H		;START WITH RECORD 1
	LXI	B,000H		;START WITH CYLINDER 0
	LXI	H,IBUF		;START OF BUFFER AREA
	MVI	E,ISIZE		;NUMBER OF RECORDS DO
GETLP:
	PUSH	B		;SAVE CYL
	PUSH	D		;SAVE RECORD NUMBER/REC COUNT
	PUSH	H		;SAVE LOAD ADDRESS
	CALL	MTRKTRAN	;TRANSLATE TRACK TO PHYS SIDE/TRACK
	POP	B
	PUSH	B		;GET LOAD ADRESS TO (BC)
	CALL	MBADDR		;SET FLOPPY IOPB
	MOV	C,D
	CALL	MSECTRAN	;TRANSLATE SECTOR NUMBER
	CALL	MREC		;SEND TO FLOPPY IOPB
	CALL	MREAD		;GO TRY TO READ
;
GSERR:
	POP	H		;GET BACK LOAD ADDRESS
	POP	D		;GET BACK REC / REC CNT
	POP	B		;GET BACK CYL
;
	ORA	A		;CHECK COMMAND COMPLETION STATUS
	JNZ	REPERR		;GO TO REPORT ERROR
;
	PUSH	B
	LXI	B,SECSIZ	;GET ADDRESS INDEX
	DAD	B		;(HL) HAS NEW LOAD ADDRESS
	POP	B
	INR	D		;SET FOR NEXT RECORD
	MOV	A,D		;CHECK IF PAST END OF CYLINDER
	CPI	FRPT+1
	JNZ	SAMTRK		;STILL ON SAME TRACK
;
	INX	B		;INCREMENT CYLINDER NUMBER
	MVI	D,01H		;RESET RECORD BACK FOR BEGINNING
SAMTRK:
	DCR	E		;SEE IF ALL SECTORS IN YET
	JNZ	GETLP		;GO DO MORE IF NOT DONE YET
;
	LXI	D,GETMS1	;PRINT COMPLETE MESSAGE
	CALL	CRTMS
	JMP	PROMPT		;BACK TO PROMPT 
;
;
;
GETMS:
	DB	'SOURCE MINI FLOPPY DISK A: OR B: (A/B) ','#'
GETMS1:
	DB	'SOURCE READ COMPLETE',CR,LF,'#'
;
	PAGE
;
;SHORT ROUTINE TO REPORT ERROR CODE ON OPERATION TO THE CONSOLE
;FOR A SIMPLE DEGREE OF FAULT ISOLATION. "STCHK" ERROR CODE IS REPORTED
;
REPERR:
	PUSH	PSW		;SAVE THE ERROR CODE
	LXI	D,ERRMSG	;PRINT ERROR MESSAGE
	CALL	CRTMS
	POP	PSW
	CALL	BYTEO		;OUTPUT ERROR CODE
	LXI	D,ERRMS1	;PRINT REST OF MESSAGE
	CALL	CRTMS
	JMP	PROMPT
;
;
ERRMSG:
	DB	CR,LF,LF,BEL,BEL,' *** MINI FLOPPY DISK I/O ERROR - CODE(','#'
;
ERRMS1:
	DB	') ***',CR,LF,'#'
;
;
	PAGE
;******************************************************************************
;
;	PUT SYSTEM IMAGE TO OPERATOR SELECTED DRIVE FROM MEMORY
;	AT ADDRESS OF THE IMAGE POSITION "IBUF" SET BY EQUATE AT 
;	THE BEGINNING OF THIS PROGRAM. ALL OF TRACKS 0 AND 1 ARE 
;	WRITTEN FOR MAXIMUM FLEXIBILITY. NOTE THAT THIS REQUIRES THAT 
;	8K OF MEMORY BE AVAILABLE ABOVE THE "IBUF" POSITION
;
;
PUT:
	CALL	CRLF
	LXI	D,PUTMS		;PRINT PUT UNIT SELECT MESSAGE
	CALL	CRTMS
	CALL	CECHO		;GET OPERATOR ENTRY
	ANI	05FH		;UPPERCASE
	SUI	'A'		;ZERO BASE SELECT
	CPI	MAXMINI+1	;CHECK IF TOO BIG
	JNC	ERRR
	MOV	C,A		;SELECT MINI UNIT
	CALL	MUNIT
	MVI	C,02H		;SET PAIRED SECTOR ACCESS
	CALL	MCNT
	MVI	C,00H		;SET SECTOR SIZE TO 256 BYTES
	CALL	MSIZE
;
	CALL	CRLF		;CLEAN UP DISPLAY
;
	CALL	MREST		;RESTORE SELECTED UNIT
;
	MVI	D,01H		;START WITH RECORD 1
	LXI	B,000H		;START WITH CYLINDER 0
	LXI	H,IBUF		;START OF BUFFER AREA
	MVI	E,ISIZE		;NUMBER OF RECORDS DO
PUTLP:
	PUSH	B		;SAVE CYL
	PUSH	D		;SAVE RECORD NUMBER/REC COUNT
	PUSH	H		;SAVE LOAD ADDRESS
	CALL	MTRKTRAN	;TRANSLATE TRACK TO PHYS SIDE/TRACK
	POP	B
	PUSH	B		;GET LOAD ADRESS TO (BC)
	CALL	MBADDR		;SET FLOPPY IOPB
	MOV	C,D
	CALL	MSECTRAN	;TRANSLATE SECTOR NUMBER
	CALL	MREC		;SEND TO FLOPPY IOPB
	CALL	MWRIT		;GO TRY TO WRITE
;
PSERR:
	POP	H		;GET BACK WRITE ADDRESS
	POP	D		;GET BACK REC / REC CNT
	POP	B		;GET BACK CYL
;
	ORA	A		;CHECK COMMAND COMPLETION STATUS
	JNZ	REPERR		;GO TO REPORT ERROR
;
	PUSH	B
	LXI	B,SECSIZ	;GET ADDRESS INDEX
	DAD	B		;(HL) HAS NEW LOAD ADDRESS
	POP	B
	INR	D		;SET FOR NEXT RECORD
	MOV	A,D		;CHECK IF PAST END OF CYLINDER
	CPI	FRPT+1
	JNZ	WSAMTK		;STILL ON SAME TRACK
;
	INX	B		;INCREMENT CYLINDER NUMBER
	MVI	D,01H		;SET RECORD BACK TO TRK START
WSAMTK:
	DCR	E		;SEE IF ALL SECTORS IN YET
	JNZ	PUTLP		;GO DO MORE IF NOT DONE YET
;
	LXI	D,PUTMS1	;PRINT COMPLETE MESSAGE
	CALL	CRTMS
	JMP	PROMPT		;BACK TO PROMPT 
;
;
PUTMS:
	DB	'DESTINATION MINI FLOPPY DISK A: OR B: (A/B) ','#'
PUTMS1:
	DB	'DESTINATION WRITE COMPLETE',CR,LF,'#'
;
	PAGE
;******************************************************************************
;
;
;ROUTINE TO TRANSLATE LOGICAL MINI FLOPPY TRACK NUMBERS TO SIDE
;AND REAL TRACK NUMBER.
;(C)=LOGICAL TRACK NUMBER ON ENTRY
;
MTRKTRAN:
	MOV	A,C
	PUSH	PSW
	ANI	01H		;FIND OUT WHAT THE SIDE NUMBER IS
	MOV	C,A
	CALL	MSURF		;SET MINI HEAD NUMBER
	POP	PSW
	ORA	A
	RAR			;DIVIDE TRACK BY 2
	MOV	C,A		;SEND PHYSICAL TRACK TO IOPB
	CALL	MCYL
	RET
;
;
;ROUTINE TO PERFORM PAIRED LOGICAL TO PHYSICAL SECTOR
;TRANSLATION FOR MINI FLOPPY
;ENTRY SECTOR NUMBER IN (C)
;RETURN SECTOR IN (C)
;
MSECTRAN:
	MOV	A,C
	ORA	A		;CONVERT TO PAIRED ODD BASED
	RAL
	DCR	A
	DCR	A		;NOW ZERO BASED FOR INDEXING
	MVI	B,00H
	MOV	C,A		;DOUBLE BYTE INDEX WORD
	LXI	H,MFSTRAN	;TRANSLATE TABLE BASE ADDRESS
	DAD	B
	MOV	C,M
	RET
;
	PAGE
;
;MINI FLOPPY PHYSICAL SECTOR TRANSLATE TABLE
;
MFSTRAN:
	DB	1,2,5,6,9,10,13,14,3,4,7,8,11,12,15,16
				;NOTE THAT ONLY ODD SECTORS ALLOWED
;
;
;******************************************************************************
;
;	MINI FLOPPY GETPUT STACK STORAGE 
;
;
	DS	80		;SETUP STORAGE FOR 40 LEVEL STACK
STCKK	EQU	$
;
	END
;
;+++...END OF FILE
«eof»