File: RB01NS.PA of Tape: OS8/OS8-Latest/new-12
(Source file text) 

/BYTE MODE HANDLER PDP8-E/VT-78
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1980   BY DATAPLAN GMBH, LAUDA, BRD
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH.
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR ANY ERRORS THAT MAY APPEAR
/IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN.
/
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN.
/
/
/
/
/
/
/
/
/
/
/
/WVDM, DP, ZUERICH, 1-JAN-80
/ PDP-11 COMPATIBLE OS/8 FLOPPY HANDLER		-JVZ-

/(C) 1979 LAB DATA SYSTEMS, SEATTLE.  ALL RIGHTS RESERVED.

/THIS IS A NON-SYSTEM DEVICE DRIVER FOR THE RX01,02 FLOPPY
/DISK SYSTEM WHICH USES SINGLE DENSITY BYTE MODE (IBM 3740
/FORMAT) TO GET 658 OS/8 BLOCKS PER DISKETTE.

/A PDP11-COMPATIBLE FORMAT IS USED SO THAT INFORMATION CAN
/BE EASILY TRANSFERRED BETWEEN PDP8 AND PDP11 SYSTEMS.  AS
/AN OPTION,  HOWEVER,  ONE MAY SWITCH TO A SPECIAL 'VT/78'
/FORMAT IN ORDER TO READ OR WRITE BYTE-MODE FLOPPIES USING
/THIS FORMAT: JUST CHANGE 'VT78SW' (LOCATION '200') TO 1.

/  THIS HANDLER WILL WORK WITH EITHER THE RX01 OR THE RX02
/CONTROLLER: 'ONCE-ONLY' INITIALIZATION CODE DETECTS WHICH
/SYSTEM IS IN USE, AND MAKES APPROPRIATE CHANGES THE FIRST
/TIME THE HANDLER IS CALLED. ONLY SINGLE-DENSITY DISKETTES
/SHOULD BE USED; DOUBLE DENSITY DISKETTES WILL GIVE ERRORS

/NOTE: TYPING CTRL/C ON THE KEYBOARD WILL ABORT THE OPERA-
/TION AND RETURN TO OS/8.  ANY OTHER KEY WILL BE IGNORED.

/IN ORDER TO ZERO THE DIRECTORY OF A DEVICE, THE FOLLOWING
/CHANGE MUST BE MADE TO THE OS/8 PROGRAM 'PIP.SV':

/	.GET SYS PIP
/	.ODT
/	13641/XXXX 6556	     = -NUMBER OF BLOCKS AVAILABLE
/	13642/XXXX 6556		THE SAME FOR VT78 FORMAT
/	^C
/	.SAVE SYS PIP
/	.SAVE SYS PIP	     (TWICE TO KEEP SAME LOCATION)

/TO CHANGE FROM 'PDP11' FORMAT TO 'VT/78' FORMAT, JUST SET
/LOCATION '200' TO A NON-ZERO VALUE:
/
/	.SET D1: LOC 200,1	(SWITCH TO VT/78 FORMAT)
/OR
/	.SET D1: LOC 200,0	(CHANGE TO PDP11 FORMAT)
/	PARAMETER BLOCK FOR 'BUILD'

	PAGE 0
	-2		/TWO HANDLERS, RBA0: AND RBA1:

DEVICE	RB01		/GROUP NAME FOR HANDLER
DEVICE	RBA0		/DEVICE NAME
	4410		/FILE-STRUCTURED, DEVICE TYPE 41
	RBA0&177+4000	/TWO-PAGE HANDLER, ENTRY AT LOC 61
	ZBLOCK 2	/ZERO IF NOT SYSTEM HANDLER

DEVICE	RB01		/REPEAT EVERYTHING
DEVICE	RBA1		/BUT CHANGE THE NAME
	4410		/COULD ALSO BE 4420 FOR VT78 (SET RBA1 VT78)
	RBA1&177+4000	/ENTRY POINT IS LOC 65
	ZBLOCK 2

VERSION="M&77		/DEFINE THE VERSION NUMBER

/	DEFINE I/O INSTRUCTION CODES

RX8=	6750		/DEFINE DEVICE ADDRESS

LCD=	   1		/LOAD COMMAND REGISTER
XDR=	   2		/TRANSFER DATA
STR=	   3		/SKIP ON TRANSFER FLAG, CLEAR IT
SER=	   4		/SKIP ON ERROR, CLEAR FLAG
SDN=	   5		/SKIP ON DONE, CLEAR FLAG
INIT=	   7		/GENERATE INITIALIZE PULSE

/	DEFINE THE FUNCTION CODES

/	FILL BUFFER=	 0
/	EMPTY BUFFER=	 2
/	WRITE SECTOR=	 4
/	READ SECTOR=	 6
/	SET DENSITY=	10	(RX02 ONLY)
/	READ STATUS=	12
/	WRITE DEL DATA=	14
/	READ ERROR REG=	16

/	DRIVE 1 SELECT=	20
/	BYTE MODE SEL= 100
/	MAINT. MODE=   200	(GOOD FOR SETTING FLAGS)
/	DOUBLE DENSITY=400
/	DOUBLE SIDED= 1000
	PAGE 1

RETRYS,	-1-2		/RETRY COUNT: EASY TO CHANGE!

/LOOP HERE READING THREE BYTES AT A TIME, PACKING THEM INTO
/MEMORY TWO WORDS AT A TIME USING THE STANDARD OS/8 PACKING
/SCHEME. HAPPILY THIS IS THE SAME AS THE PDP11 DATA FORMAT!

RDLOOP,	JMS I XMOVB	/GET THE FIRST BYTE
	DCA BYTE1	/SAVE FOR LATER
	JMS I XMOVB	/GET THE SECOND BYTE
	DCA BYTE2	/SAVE IT

	JMS I XMOVB	/GET THE THIRD BYTE
	CLL RTL
	CLL RTL		/SHIFT HALFWAY OVER
	DCA TEMP	/SAVE THIS FOR A MOMENT

	TAD TEMP
	AND P7400	/MASK OFF BITS 0-3
	TAD BYTE1	/MERGE WITH BITS 4-11
	DCA I BUF	/STORE WORD1 AWAY
	ISZ BUF		/ADVANCE POINTER
P20,	20		/PROTECT THE ISZ

	TAD TEMP	/NOW DO THE SECOND WORD
	CLL RTL
	CLL RTL		/FINISH THE SHIFT
	AND P7400
	TAD BYTE2	/MERGE
	DCA I BUF	/PUT IT AWAY
	ISZ BUF		/ADVANCE BUFFER POINTER
P70,	70		/IN CASE ISZ SKIPS

	ISZ WC		/ARE WE DONE?
	JMP RDLOOP	/NOT YET
/BECAUSE OS/8 TRANSFERS ARE SPECIFIED IN UNITS OF 'PAGES'
/(1 PAGE=128 WORDS=192 BYTES), WHEREAS DISK TRANSFERS ARE
/ALWAYS IN UNITS OF SECTORS (1 SECTOR=128 BYTES), THE LAST
/TRANSFER MAY NOT USE UP ALL THE DATA STORED IN THE SILO.
/THIS MEANS THAT THE DONE FLAG WILL NOT BE SET, CAUSING
/THE HANDLER TO 'HANG' ON THE NEXT CALL.  THE SOLUTION IS
/SIMPLY TO CLEAR OUT THE SILO AT THE END OF EACH CALL:

	JMS I XCLEAR	/EMPTY THE SILO
RX8OUT,	ISZ RBA0	/SKIP THE ERROR RETURN
	JMP REXIT	/AND GO BACK TO THE CALLER
/LOOP HERE TO UNPACK 2 12-BIT WORDS INTO 3 BYTES, PUTTING
/THEM INTO THE SILO AND EVENTUALLY WRITING THEM TO DISK...

WRLOOP,	JMS PUTBUF	/PUT AWAY THE FIRST BYTE
	DCA TEMP	/BUT SAVE BITS 0-3
	JMS PUTBUF	/PUT AWAY THE SECOND BYTE
	CLL RTR		/SHIFT LOW-ORDER BITS
	CLL RTR
	TAD TEMP	/MERGE WITH HIGH-ORDER
	CLL RTR
	CLL RTR		/SHIFT ALL 8 BITS INTO PLACE
	JMS I XMOVB	/MOVE INTO THE SILO
P7600,	7600		/DON'T FORGET THE 'CLA'!
	ISZ WC		/MORE WORDS TO TRANSFER?
	JMP WRLOOP	/YES - CONTINUE HERE

/CALL THE 'CLEAR' ROUTINE AGAIN TO FINISH FILLING THE SILO
/SO WE CAN WRITE OUT THE LAST DISK SECTOR BEFORE RETURNING.

	JMS I XCLEAR	/ZERO FILLS THE REST OF THE SECTOR

	JMS I XIOSUB	/NOW WRITE OUT THE LAST SECTOR
	JMP RX8OUT	/ALL DONE - TAKE THE 'GOOD' RETURN

XMOVB,	MOVEB-ERCNT	/THESE ARE ALL RELATIVE LOCATIONS
XINITL,	INITLZ-ERCNT	/WHICH ARE INITIALIZED TO ABSOLUTE
XIOSUB,	IOSUB-ERCNT
XCLEAR,	CLEAR-ERCNT
XKBRTN,	KBCHEK-ERCNT
XCCHEK,	CCHECK-ERCNT

RBA0,	VERSION		/ENTRY POINT FOR DRIVE 0
	CLA		/NEVER TRUST THE CALLER!
	JMP DRV0	/AND MERGE WITH 'RBA1' CALL
P175,	175

TRYCNT,
RBA1,	VERSION		/ENTRY POINT FOR DRIVE 1
	CLA		/BE SURE!
	TAD RBA1
	DCA RBA0	/MOVE RETURN ADDRESS TO RBA0
	TAD P20		/GET UNIT SELECT CODE
DRV0,	DCA DRIVE	/SAVE FOR PAGE 2
	RDF		/GET CALLING FIELD
	TAD CDI0	/GENERATE THE RETURN 'CDI'
	DCA REXIT	/SAVE FOR EXIT AND ANY RETRIES
	TAD RETRYS	/SET THE RETRY COUNT (1 RETRY)
	DCA TRYCNT	/RE-USE THE SECOND ENTRY POINT
	JMS TEMP	/ZAPPED AFTER ONCE-ONLY CODE

/COME BACK TO THIS POINT AFTER INITIALIZATION WITH AC=0,
/OR AFTER AN ERROR WITH AC=-2, TO REPEAT THE WHOLE THING

ERCNT,	ISZ TRYCNT	/CHECK THE ERROR COUNT
	JMP AGAIN	/DON'T GIVE UP YET...
REXIT,	HLT		/'CDI CF' STORED HERE
	ISZ RBA0	/ADVANCE THE RETURN POINT
	JMP I RBA0	/(AC=-2 FOR ERROR RETURN)

AGAIN,	TAD RBA0	/RESET ARGUMENT POINTER
	DCA RBA0
	TAD REXIT	/RESTORE THE CALLING DATA FIELD
	DCA .+1
COUNTR,	XMOVB-XCCHEK-2	/'CDI CF'  CAUTION!! NO JUMPS!!

/	NOW SCAN THE ARGUMENT LIST

	TAD I RBA0	/GET THE FUNCTION WORD
	RAL
	AND P7600	/ISOLATE THE PAGE COUNT
	CIA		/NEGATE
	STL RAR
	DCA WC		/SAVE DOUBLE-WORD COUNT
	SM0		/SET BIT 0 IN THE AC
	TAD I RBA0	/PUT R/W BIT IN THE LINK
	AND P70		/ISOLATE THE MEMORY FIELD
	TAD CDF0	/ADD 'CDF 0'
	DCA SETFLD	/SET DF AFTER INITIALIZATION
	ISZ RBA0	/ADVANCE TO BUFFER ADDRESS
	TAD I RBA0
	DCA BUF

	ISZ RBA0	/ADVANCE TO THE BLOCK NUMBER
	TAD I RBA0
	TAD I RBA0	/X3 TO GET LOGICAL SECTOR NUMBER
	TAD I RBA0

/LINK HOLDS READ/WRITE BIT: L=0 FOR READ, L=1 FOR WRITE

CDI0,	CDF CIF 0	/CHANGE TO THIS FIELD (FINALLY!)
	JMS I XINITL	/INITIALIZE FOR THIS CALL
DRIVE,	0		/UNIT*20 + 100

/AC NOW HAS READ/WRITE BIT: POS FOR READ, NEG FOR WRITE

SETFLD,	HLT		/'CDF BF'
	SMA CLA		/SKIP IF WRITE
	JMP RDLOOP	/JUMP TO READ
	JMP WRLOOP	/JUMP TO WRITE

/THIS SUBROUTINE SENDS A 12-BIT WORD TO THE SILO, RETURNING
/THE BITS WHICH WERE NOT USED SO THEY CAN BE COMBINED INTO
/THE THIRD BYTE.  TIMING IN THE WRITE LOOP IS NOT QUITE SO
/CRITICAL, THUS WE CAN AFFORD TO USE A SUBROUTINE FOR THIS.

PUTBUF,	0
	TAD I BUF	/GET A 12-BIT WORD
	JMS I XMOVB	/SEND IT (AC NOT CLEARED)
	AND P7400	/STRIP HIGH-ORDER BITS
	ISZ BUF		/STEP BUFFER POINTER
P7400,	7400		/PROTECT THE 'ISZ'
	JMP I PUTBUF	/AC=BITS 0-3
/THIS IS 'ONCE-ONLY' CODE TO DETERMINE ABSOLUTE ADDRESSES
/ON THE SECOND PAGE.  IT IS EXECUTED ON THE FIRST CALL.

TEMP,	0		/ADDRESS OF 'ERCNT' SAVED BY 'JMS'
BYTE1,	TAD XMOVB-1	/ADD ABSOLUTE ADDRESS
BYTE2,	DCA XMOVB-1	/TO THE PAGE OFFSET...
WC,	ISZ BYTE1	/ADVANCE THROUGH THE LIST
BUF,	ISZ BYTE2	/THE FIRST TIME IS A 'NOP'
	DCA ERCNT-1	/REMOVE THE 'JMS TEMP' INSTR.
	TAD TEMP	/USE ERROR RETURN AS THE OFFSET
	ISZ COUNTR	/DONE?
	JMP BYTE1	/NOT QUITE YET...

/NOW GO TO PAGE 2 TO DETERMINE WHICH CONTROLLER WE HAVE

	JMS I XCCHEK	/ERROR RETURN IS IN THE AC

/THIS ROUTINE CHECKS THE KEYBOARD BUFFER WHEN THE FLAG
/IS UP TO SEE IF THE USER IS TRYING TO ABORT BY TYPING
/CTRL/C.  ANY OTHER CHAR IS REMOVED TO SPEED UP THE LOOP.

	TAD P7600	/USE 7600 TO SET THE PARITY BIT
	KRS		/READ THE BUFFER
	TAD P175	/COMPARE WITH CODE FOR CTRL/C
	SZA CLA		/IS THAT WHAT WE HAVE?
	JMP I XKBRTN	/NO, RETURN TO WAIT LOOP

CDF0,	CDF 0		/DON'T FORGET TO DO THIS!
	JMP I P7600	/RETURN TO THE OS/8 MONITOR

	PAGE 2

/DEFINE TWO MICRO-CODED INSTRUCTIONS (GOOD ON ALL 8'S):

SM0=	CLA STL RAR	/'MINUS 0' = '4000'
SM2=	STA CLL RAL
/NOTE:	VALUE IN 'VT78SW' DETERMINES THE DATA FORMAT:

/	0=PDP11 COMPATIBLE (2-WAY SECTOR INTERLEAVING)
/	1 (OR ANY NON-ZERO VALUE) GIVES 'VT/78' FORMAT

VT78SW,	0		/RELATIVE LOCATION = '200'
P116,	116		/MOVE ERROR REGISTER

/THIS ROUTINE SETS UP PARAMETERS FOR EACH HANDLER CALL

INITLZ,	0		/AC= 3X OS/8 BLOCK NUMBER
	DCA LSECTR	/SAVE LOGICAL SECTOR NUMBER
	TAD .		/!
	SZL		/CHECK READ/WRITE BIT
	AND M200	/LEAVE '1200' FOR WRITE
	RAR		/READ=>0502, WRITE=>4500
	TAD I INITLZ	/ADD THE UNIT SELECT BIT
	DCA FUNCTN
	JMS DIVIDE	/COMPUTE DISK ADDRESS
	TAD FUNCTN
P7740,	SMA SZA CLA	/READ OR WRITE?
	JMS IOSUB	/READ THE FIRST SECTOR
	JMS FNCALL	/DO THE SILO OP
	TAD FUNCTN
	ISZ INITLZ
	JMP I INITLZ	/AC IS POSITIVE FOR 'READ'

/	THIS ROUTINE MOVES DATA INTO OR OUT OF THE SILO

MOVEB,	0
	ISZ BYTCNT	/TRANSFERRED 128 BYTES YET?
	JMP MOVIE	/NO

	DCA CLEAR	/SAVE THE AC FOR WRITE
	JMS IOSUB	/READ OR WRITE A SECTOR
	JMS FNCALL	/RESET SILO OPERATION
	TAD CLEAR	/RESTORE THE AC
	ISZ BYTCNT	/COUNT BYTE-IN-PROGRESS

MOVIE,	RX8 STR		/CHECK THE TRANSFER FLAG
	JMP .-1
	RX8 XDR		/READ OR WRITE A LITTLE BYTE
	JMP I MOVEB	/RETURNING WITH IT IN THE AC

/THIS ROUTINE CHECKS THAT THE SILO OPERATION IS FINISHED
/SO THAT THE DONE FLAG WILL COME UP AT THE END.

CLEAR,	0		/FINISH THE SILO OPERATION
	SKP CLA		/(WE MAY ALREADY BE DONE)
	JMS TRNSFR	/MOVE A BYTE IN OR OUT
	ISZ BYTCNT	/CHECK THE BYTE COUNTER
	JMP .-2		/THIS GOES VERY QUICKLY
	JMP I CLEAR	/OK: THE DONE FLAG IS UP NOW
/THIS ROUTINE PERFORMS ALL THE ACTUAL DISK OPERATIONS

IOSUB,	0
	TAD P7004	/ADD 4 TO THE SILO OP CODE
	JMS FNCALL	/SEND COMBINATION TO CONTROLLER

	TAD SECTOR	/GET THIS SECTOR
	JMS TRNSFR	/SEND IT TO THE CONTROLLER

	TAD TRACKN	/NOW GET THE TRACK NUMBER
	CLL IAC		/PLUS ONE
	JMS TRNSFR	/SEND IT TO THE CONTROLLER

	ISZ LSECTR	/COMPUTE THE NEXT DISK ADDR
	JMS DIVIDE	/WHILE THIS ONE IS FINISHING

/NOW WE HAVE TO WAIT FOR THE DISK TO FINISH SO WE CAN
/TEST IF THERE WERE ANY PROBLEMS.  WE CAN'T JUST TEST
/THE 'DONE' FLAG BECAUSE THAT WILL CLEAR IT,  CAUSING
/THE NEXT OPERATION TO HANG, SO WE MOVE THE ERROR REG.

	TAD P116	/MOVE ERROR REGISTER TO INTERFACE
	JMS FNCALL	/IN ORDER TO SET THE DONE FLAG...

	RX8 SER		/SKIP ON ANY ERRORS
	JMP I IOSUB	/RETURN - THERE WEREN'T ANY

/TOO BAD! SOMETHING WENT WRONG, SO DO AN 'INIT' AND RETRY:

	RX8 INIT	/BANG THINGS AROUND A BIT
	SM2		/SET THE AC TO -2 FOR A RETRY
	JMP I ERROR	/AND GO CHECK THE ERROR COUNT

/'DIVIDE' COMPUTES THE PHYSICAL TRACK AND SECTOR ADDRESSES
/FROM THE LOGICAL SECTOR NUMBER.  THE CALCULATION OVERLAPS
/THE SECTOR OPERATION, SO WE HAVE ABOUT 5.7 MSEC TO DO IT,
/EXCEPT FOR THE FIRST SECTOR ON A READ CALL.  THUS 1 BLOCK
/READS (SUCH AS 'FUTIL' SCANS) PERFORM BEST IF WE USE THIS
/HIGH-SPEED DIVIDE ROUTINE RATHER THAN THE SHORTER, SLOWER
/'SUBTRACT-UNTIL-OVERFLOW' VERSION.

DIVIDE,	0
	TAD (-201
	DCA BYTCNT	/RESET THE BYTE COUNTER
	TAD VT78SW
	CLL CMA		/SET THE FORMAT SWITCH
	DCA FNCALL
	TAD P7740	/SET THE BIT COUNTER
	DCA TRACKN
	TAD LSECTR	/GET THE DIVIDEND
	DCA SECTOR
	TAD M26X64	/GET THE DIVISOR
	JMP DVENTR
DVLOOP,	RAL		/SHIFT IN THE QUOTIENT
	DCA TRACKN	/UPDATE TRACK AND BIT COUNTER
	TAD TRNSFR	/SHIFT THE DIVISOR ONE PLACE
	STL RAR
DVENTR,	DCA TRNSFR	/THIS ALSO CLEARS THE LINK

	TAD TRNSFR	/SUBTRACT THIS POWER
	TAD SECTOR
	SZL		/SKIP IF SUBTRACT FAILED
	DCA SECTOR	/SUCCESSFUL - UPDATE RESULT

	CLA		/CLEAR AC IF UNSUCCESSFUL
	TAD TRACKN	/GET THE TRACK NUMBER
	SPA		/TEST FOR END OF LOOP
	JMP DVLOOP	/KEEP GOING

/WE NOW HAVE THE LOGICAL TRACK NUMBER (0-76) IN THE AC AND
/THE LOGICAL SECTOR (0-12) IN 'SECTOR'. THE LINK IS SET IF
/THE ACTUAL SECTOR NUMBER WAS .GT. 12.  WE NOW COMBINE ALL
/THESE THINGS TO COMPUTE THE PHYSICAL TRACK AND SECTOR NO.
/USING EITHER A 2- OR 4-WAY INTERLEAVE & A 6-SECTOR OFFSET:

/ [ < 6*TRACK + (2 OR 4)*SECTOR + SECTOR/13 > MOD 26 ] + 1

/NOTE: THE INSTRUCTION AT 'DVDONE+3' DETERMINES WHETHER WE
/USE 'PDP11' FORMAT OR 'VT/78' FORMAT. IF THE ISZ SKIPS WE
/GET PDP11 FORMAT, BUT IF NOT WE GET VT/78 FORMAT. THIS IS
/SET UP DYNAMICALLY EACH TIME THE DIVIDE ROUTINE IS CALLED.

DVDONE,	TAD TRACKN	/AC=2*TRACK NO.,L=HALFTRACK
	TAD TRACKN	/3X TRACK NUMBER
	TAD SECTOR	/ADD IN SECTOR OFFSET
	ISZ FNCALL	/WHICH FORMAT?
	TAD SECTOR	/USE 'VT/78' FORMAT
P7004,	RAL		/SHIFT IN THE HALFTRACK BIT

/	NOW REDUCE THIS NUMBER MODULO TWENTY-SIX

	TAD M32		/JUST KEEP SUBTRACTING 26!
	SMA		/UNDERFLOW?
	JMP .-2		/NOT YET
	TAD P33		/RESTORE REMAINDER (PLUS 1)
	DCA SECTOR	/SAVE NEXT PHYSICAL SECTOR
	JMP I DIVIDE	/GO WAIT FOR THE DONE FLAG

/SUBROUTINE TO LOAD THE COMMAND BUFFER. NOTE THAT THE RX02
/REQUIRES A SECOND BYTE TO COMPLETE THE COMMAND SEQUENCE..

FNCALL,	0		/ENTRY POINT SERVES MANY PURPOSES!
	SPA SNA		/SKIP FOR ERROR TRANSFER
	TAD FUNCTN	/BYTE MODE + UNIT*20 + R/W*2
	RX8 SDN		/WAIT FOR DONE FLAG TO COME UP
	JMP KBCHEK+2	/CHECK THE KEYBOARD WHILE WE WAIT
	RX8 LCD		/LOAD THE COMMAND
/	THE NEXT INSTRUCTION GETS 'NOPPED' FOR THE RX01

RX01,	JMS TRNSFR	/RX02 COMMANDS NEED ANOTHER BYTE
	JMP I FNCALL	/RETURN NOW TO CALL

/CHECK THE KEYBOARD OCCASIONALLY, IN CASE THE USER WANTS
/TO ABORT THE OPERATION BY TYPING CTRL/C...

KBCHEK,	TAD TRNSFR	/RESTORE THE COMMAND
	JMP FNCALL+3	/SOME CHARACTER IN BUFFER (MAYBE ^P?)
	KSF		/CHECK FOR OPERATOR ABORT
	JMP FNCALL+3	/HE'S HAPPY
	DCA TRNSFR	/SAVE THE COMMAND
	JMP I CCHECK	/GO CHECK FOR CTRL/C

/SUBROUTINE TO WAIT FOR THE DATA FLAG, THEN DO TRANSFER:

TRNSFR,	0
	RX8 STR		/READY YET?
	JMP RX02	/NOT YET
	RX8 XDR		/OK - DO IT
M200,	7600		/CLEAR THE AC
	JMP I TRNSFR

RX02,	ISZ CLEAR	/THIS IS ONCE-ONLY
	JMP TRNSFR+1	/BUT THIS INSTRUCTION STAYS
BYTCNT,	DCA RX01	/WE TIMED OUT, SO IT
	JMP I TRNSFR	/MUST NOT BE AN RX02

/	ONCE-ONLY CODE TO CHECK WHICH CONTROLLER WE HAVE

/	NOTE: WE USE THE FACT THAT IN BYTE MODE THE RX02
/	REQUIRES A SECOND BYTE TO COMPLETE THE COMMAND..
/	THE RX01 DOES NOT, AND SO NEVER SETS THE TR FLAG

CCHECK,	0		/HOLDS ADDRESS OF CTRL/C CHECK
ERROR,	DCA ERROR	/SAVE ERROR RETURN FROM PAGE 1
TRACKN,	TAD P116	/'TRANSFER ERROR REG'
SECTOR,	JMS FNCALL	/THIS SETS THE FLAG FOR LATER
FUNCTN,	ISZ TRNSFR+2	/REMOVE THE TIMEOUT TRAP
LSECTR,	JMP I ERROR	/END OF INITIALIZATION

	DECIMAL
M32,	-26^1		/FLOPPY DISK CONSTANTS
P33,	+26+1
M26X64,	-26^64		/MASTER TRACK DIVISOR
	OCTAL

	$$$$		/THE END