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

/RXHD HIGH DENSITY FLOPPY SYSTEM HANDLER
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1979   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, 20-Sep-79, Zuerich
/RXHD COS BYTE MODE SYS-HANDLER
/
/THIS HANDLER WILL ONLY USE RX01 MODE ON EITHER RX01 OR RX02
/IT JUST HAPPENS THAT THE OS8 BLOCK SIZE IS TOO SMALL FOR
/BYTE MODE IN RX02 SIZED SECTORS
/
/
VERSION="M&77
/
/
AC1=CLL CLA IAC
AC2=CLL CLA CML RTL
AC4=CLL CLA IAC RTL
AC6=CLL CLA CML IAC RTL		/RXHD'S MUST RUN ON AN OMNI-BUS !!
AC4000=CLL CLA CML RAR
AC3777=CLL CLA CMA RAR
AC7775=CLL CLA CMA RTL
AC7776=CLL CLA CMA RAL
/
/  DEVICE IOT SYMBOLIC EQUATES
/
LCD=6751		/LOAD COMMAND
XDR=6752		/TRANSFER DATA
STR=6753		/SKIP IF READY TO TRANSFER
SER=6754		/SKIP ON ERROR
SDN=6755		/SKIP ON DONE
INIT=6757		/INIT CONTROLLER&INTERFACE
/
/  HERE IS A LISTING OF THE PRIMARY BOOT FOR CONVENIENCE
/
	NOPUNCH
/
	*20
/
READ,	TAD	UNIT	/TRY NEXT COMBINATION OF DENSITY AND UNIT
	TAD	CON360	/ADDING IN 360
	AND	CON420	/KEEPING ONLY 420 BITS
	DCA	UNIT	/CYCLES 400,420,0,20,400,,,,,,,,
	AC6		/COMMAND TO READ DISK
	TAD	UNIT	/UNIT AND DENSITY
	LCD		/COMMAND TO CONTROLLER
	AC1		/TO SET SECTOR AND TRACK TO 1
	JMS	LOAD	/SECTOR TO CONTROLLER, LEAVES AC ALONE
	JMS	LOAD	/AND TRACK
LITRAL,	7004		/LEAVING A 2 IN AC; SERVES AS LITERAL
/
/  FOLLOWING IS PART OF WAIT LOOP, SAME SECONDARY BOOTS, OLD PRIMARY BOOT
/
START,	SDN		/HAS DONE COME UP; CODE STARTS HERE!
	JMP	LOAD+1	/NO, GO CHECK FOR READY TO TRANSFER
/
/  NOW, DONE OR ERROR
/
	SER		/SKIP ON AN ERROR, TRY ANOTHER DENSITY ETC.
	SNA		/NASTY, AC=2 FOR ABOUT TO DO SILO, 0 ON START-UP
	JMP	READ	/START-UP, GO SET UP UNIT, THEN READ TO SILO
	TAD	UNIT	/AC ALREADY 2, PUT IN UNIT, DENSITY
	LCD		/TO EMPTY THE SILO
	TAD	UNIT	/SET UP LOC 60 FOR OLD SECONDARY BOOT
	AND	CON360	/KEEPING UNLY DENSITY BIT
	TAD	LITRAL	/ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS
	DCA	RX1SAV	/OLD SECONDARY BOOT MOVES IT TO HANDLER
CON360,	360		/LITERAL; EXECUTES IN LINE AS A NO-OP
/			/FALLS THRU TO NEXT PAGE OF LISTING
/
/
/  FOLLOWING CODE SAME AS OLD PRIMARY BOOT
/
	JMS	LOAD	/GRAB NEXT ITEM FROM SILO
	DCA	2	/TRADITION; SECONDARY BOOT STARTS LOADING AT 2 !
	ISZ	50	/INCREMENT LOAD ADDRESS
	JMP	47	/GO BACK FOR ANOTHER
/
/  SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOCATION 47 IS LOADED,
/  THEN CONTROL PASSES TO SECONDARY BOOT
/
LOAD,	0		/SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER
	STR		/IS HE READY TO TALK TO US?
	JMP	START	/NO, IS HE PERHAPS DONE WITH SILO, OR IN ERROR?
	XDR		/YES, DATA IN OR OUT;IF DATA TO CONTROLLER, AC UNCHANGED
	JMP I	LOAD	/NO MAGIC, JUST EXIT FROM SUBROUTINE
/
/  60 GOES TO OLD SECONDARY BOOT
/  61 HAS DENSITY AND UNIT THAT BOOTED SUCCESSFULLY
/
/
CON420,			/USE IT TO HOLD 420 LITERAL TO START OUT
RX1SAV,	420		/UNIT^20+7004 TO GO TO SYS HANDLER
UNIT,	20		/<DENSITY^400>+<UNIT^20> THAT BOOTED OK
/
	ENPUNCH
/
/	##  SECONDARY BOOT  ##
/
	NOPUNCH		/12-BIT CODE HAS TO BE TRANSLATED
	*0		/COUNT LOCATIONS
	RELOC	2	/SECTION LOADING OVER PRIMARY BOOT 2 - 47
/
/
/
BMODE,	TAD	UNIT	;HBY00=TAD	UNIT	/CHANGE FUNCTION TO BYTE MODE
	TAD	BYTES	;HBY01=TAD	BYTES
	JMP	NEXSEG-1;HBY02=JMP	NEXSEG-1

INDJMP,	TAD I	YR	;HBY03=TAD I	YR	/GET ADDRESS
	DCA	BTEMP	;HBY04=DCA	BTEMP
	JMP I	BTEMP	;HBY05=JMP I	BTEMP	/TO NEXT ROUTINE
/
/	## AUTO-INC REGISTERS ##
/
XR,	61		;HBY06=61
YR,	61		;HBY07=61
BCONV,	2-7004		;HBY10=2-7004
BYTES,	100		;HBY11=100
BHALF,	JMP	LODHLF	;HBY12=JMP	LODHLF
XRF1,	7000-1		;HBY13=7000-1
XRF2,	7200-1		;HBY14=7200-1
XROLD,	7000-1		;HBY15=7000-1
/
/
ONCE,	TAD	RX1SAV	;HBY16=TAD	RX1SAV	/GET WORD COMMON TO BOTH
	TAD	BCONV	;HBY17=TAD	BCONV	/PRIMARY BOOTSTRAPS
	DCA	UNIT	;HBY20=DCA	UNIT	/AND CONVERT TO UNIT+2
NEXSEG,	AC4		;HBY21=AC4		/+2 = GET SECTOR
	TAD	UNIT	;HBY22=TAD	UNIT
	LCD		;HBY23=LCD
	TAD I	YR	;HBY24=TAD I	YR	/GET SECTOR FROM LIST
	JMS	LOAD	;HBY25=JMS	LOAD
	TAD I	YR	;HBY26=TAD I	YR	/GET TRACK-SECTOR
	JMS	LOAD	;HBY27=JMS	LOAD
	TAD I	YR	;HBY30=TAD I	YR	/GET ADDRESS-1-TRACK FOR XR
HANG,	SDN		;HBY31=SDN
	JMP	LOAD+1	;HBY32=JMP	LOAD+1	/FIGURE 8 LOOP
	SER		;HBY33=SER
	SKP		;HBY34=SKP
	HLT		;HBY35=HLT
	SNA		;HBY36=SNA
	JMP	INDJMP	;HBY37=JMP	INDJMP	/GO TO NEXT IF END OF SILO
	DCA	XR	;HBY40=DCA	XR	/SET ADDRESS IF END OF SEEK
	TAD	UNIT	;HBY41=TAD	UNIT
	LCD		;HBY42=LCD
LOAD12,	JMS	LOAD	;HBY43=JMS	LOAD
	DCA I	XR	;HBY44=DCA I	XR
	JMP	LOAD12	;HBY45=JMP	LOAD12
BTEMP=.
	RELOC
/
/THIS IS THE LAST LITTLE PART WHICH COMES FROM THE FIRST SECTOR
/IT LOADS AFTER THE LOCATIONS HOLDING THE UNIT FROM PRIMARY BOOT
	RELOC 62
	ONCE	;HBY46=ONCE
	4	;HBY47=4
	1-4	;HBY50=1-4
	66-1-1	;HBY51=66-1-1
/	THIS PART COMES FROM SECTOR 4 IN LS BYTE MODE
/
	BMODE	;BY00=BMODE	/12-BIT BOOT IS IN GO TO BYTE MODE
	7	;BY01=7
	1-7	;BY02=1-7
	7600-1-1;BY03=7600-1-1	/READ IN LS BYTES OF 07600
	NEXSEG	;BY04=NEXSEG
	26	;BY05=26
	7-26	;BY06=7-26
	7000-1-7;BY07=7000-1-7	/READ IN LS BYTES OF 17600 IN 07000
	NEXSEG	;BY10=NEXSEG
	31	;BY11=31
	7-31	;BY12=7-31
	7200-1-7;BY13=7200-1-7	/READ IN LS BYTES OF 27600 IN 07200
	HLFBYT	;BY14=HLFBYT	/MODIFY BOOTSTRAP FOR MS HALF BYTES
	23	;BY15=23
	7-23	;BY16=7-23
	7000-1-7;BY17=7000-1-7	/READ IN MS HALF BYTES OF 17600 & 27600
	NEXSEG	;BY20=NEXSEG
	1	;BY21=1
	1-1	;BY22=1-1
	7400-1-1;BY23=7400-1-1	/READ IN MS HALF BYTES OF 'CRAP'& 07600
	BOOTEN	;BY24=BOOTEN	/GO TO END OF BOOTSTRAP
BOOTEN,	CDF 10		;BY25=CDF 10		/GO TO DATE FIELD
	TAD I	PDATE	;BY26=TAD I	PDATE	/GET TODAY'S DATE
	DCA	BTEMP	;BY27=DCA	BTEMP	/STORE A WHILE
TRNLP,	CDF 0		;BY30=CDF 0
	TAD I	XRF2	;BY31=TAD I	XRF2	/TRANSFER TEMPORARY BUFFFER
	CDF 20		;BY32=CDF 20
	DCA I	PTF12	;BY33=DCA I	PTF12	/TO FIELD 2
	CDF 0		;BY34=CDF 0
	TAD I	XRF1	;BY35=TAD I	XRF1	/TRANSFER TEMPORARY BUFFER
	CDF 10		;BY36=CDF 10
	DCA I	PTF12	;BY37=DCA I	PTF12	/TO FIELD 1
	ISZ	PTF12	;BY40=ISZ	PTF12	/TRANSFERRED ALL?
	JMP	TRNLP	;BY41=JMP	TRNLP	/NO
	TAD	BTEMP	;BY42=TAD	BTEMP	/GET TODAY'S DATE
	DCA I	PDATE	;BY43=DCA I	PDATE	/TRANSFER TO THIS SYSTEM
	CDF 0		;BY44=CDF 0
	INIT		;BY45=INIT		/RESET THE DONE FLAG
	AC7776		;BY46=AC7776
	TAD	UNIT	;BY47=TAD	UNIT
	DCA I	PUNIT	;BY50=DCA I	PUNIT	/BYTE MODE & UNIT TO MAGIC
	JMP I	BMONIT	;BY51=JMP I	BMONIT
BMONIT,	7605		;BY52=7605
PTF12,	7600		;BY53=7600
PUNIT,	7623		;BY54=7623
PDATE,	7666		;BY55=7666
/
HLFBYT,	TAD	BHALF	;BY56=TAD	BHALF	/GO TO OTHER ROUTINE FOR HALF
	DCA	LOAD12	;BY57=DCA	LOAD12	/BYTE LOADING OF MS PART
	JMP	NEXSEG	;BY60=JMP	NEXSEG
/
LODHLF,	JMS	LOAD	;BY61=JMS	LOAD	/GET BYTE
	JMS	HLFCON	;BY62=JMS	HLFCON	/CONVERT TO MS 4 BITS + BYTE
	DCA I	XR	;BY63=DCA I	XR	/AND SAVE AGAIN
	TAD	BTEMP	;BY64=TAD	BTEMP	/GET AGAIN
	JMS	HLFCON	;BY65=JMS	HLFCON	/CONVERT OTHER HALF BYTE
	JMP	LOAD12+1;BY66=JMP	LOAD12+1/SAVE IN 'LOAD'
/
HLFCON,	0		;BY67=0		/CONVERT BYTE TO HALF BYTE IN MS POS
	CLL RTL		;BY70=CLL RTL
	RTL		;BY71=RTL
	DCA	BTEMP	;BY72=DCA	BTEMP
	TAD	BTEMP	;BY73=TAD	BTEMP
	AND	B7400	;BY74=AND	B7400
	TAD I	XROLD	;BY75=TAD I	XROLD
	JMP I	HLFCON	;BY76=JMP I	HLFCON
B7400,	7400		;BY77=7400
/
	RELOC
	ENPUNCH
/
/HEADER BLOCK FOR BUILD
/
	*0
	-3		/ONLY THREE ENTRY-POINTS
	DEVICE	RXHD
	DEVICE	SYS
	4410		/BYTE MODE FLOPPY HANDLER
	SYS&177+6000	/TWO PAGE HANDLER & SYS
	0		/UNUSED
	1222		/SIZE
	DEVICE	RXHD
	DEVICE	RXH0	/OTHER NAME FOR SYS
	4410		/RW FILE ORIENTED
	RXH0&177+5000	/TWO PAGE HANDLER & CORES
	0		/UNUSED
	1222		/SIZE
	DEVICE	RXHD
	DEVICE	RXH1	/SECOND FLOPPY DEVICE
	4410
	RXH1&177+5000	/THIS ONE REALLY CORESIDENT
	0		/UNUSED
	1222		/SIZE
/
	STBOOT-NDBOOT	/- BOOT SIZE
/
	STBOOT=.
/
/NOW FOLLOWS THE BYTE ENCODING OF THE 12-BIT BOOTSTRAP
/
	X=BY00%20&377;				HBY00&7400+X
	Y=BY00^20&360;	X=BY01%400&17+Y;	HBY00^20&7400+X
	X=BY01&377;				HBY00^400&7400+X
	X=BY02%20&377;				HBY01&7400+X
	Y=BY02^20&360;	X=BY03%400&17+Y;	HBY01^20&7400+X
	X=BY03&377;				HBY01^400&7400+X
	X=BY04%20&377;				HBY02&7400+X
	Y=BY04^20&360;	X=BY05%400&17+Y;	HBY02^20&7400+X
	X=BY05&377;				HBY02^400&7400+X
	X=BY06%20&377;				HBY03&7400+X
	Y=BY06^20&360;	X=BY07%400&17+Y;	HBY03^20&7400+X
	X=BY07&377;				HBY03^400&7400+X
	X=BY10%20&377;				HBY04&7400+X
	Y=BY10^20&360;	X=BY11%400&17+Y;	HBY04^20&7400+X
	X=BY11&377;				HBY04^400&7400+X
	X=BY12%20&377;				HBY05&7400+X
	Y=BY12^20&360;	X=BY13%400&17+Y;	HBY05^20&7400+X
	X=BY13&377;				HBY05^400&7400+X
	X=BY14%20&377;				HBY06&7400+X
	Y=BY14^20&360;	X=BY15%400&17+Y;	HBY06^20&7400+X
	X=BY15&377;				HBY06^400&7400+X
	X=BY16%20&377;				HBY07&7400+X
	Y=BY16^20&360;	X=BY17%400&17+Y;	HBY07^20&7400+X
	X=BY17&377;				HBY07^400&7400+X





	X=BY20%20&377;				HBY10&7400+X
	Y=BY20^20&360;	X=BY21%400&17+Y;	HBY10^20&7400+X
	X=BY21&377;				HBY10^400&7400+X
	X=BY22%20&377;				HBY11&7400+X
	Y=BY22^20&360;	X=BY23%400&17+Y;	HBY11^20&7400+X
	X=BY23&377;				HBY11^400&7400+X
	X=BY24%20&377;				HBY12&7400+X
	Y=BY24^20&360;	X=BY25%400&17+Y;	HBY12^20&7400+X
	X=BY25&377;				HBY12^400&7400+X
	X=BY26%20&377;				HBY13&7400+X
	Y=BY26^20&360;	X=BY27%400&17+Y;	HBY13^20&7400+X
	X=BY27&377;				HBY13^400&7400+X
	X=BY30%20&377;				HBY14&7400+X
	Y=BY30^20&360;	X=BY31%400&17+Y;	HBY14^20&7400+X
	X=BY31&377;				HBY14^400&7400+X
	X=BY32%20&377;				HBY15&7400+X
	Y=BY32^20&360;	X=BY33%400&17+Y;	HBY15^20&7400+X
	X=BY33&377;				HBY15^400&7400+X
	X=BY34%20&377;				HBY16&7400+X
	Y=BY34^20&360;	X=BY35%400&17+Y;	HBY16^20&7400+X
	X=BY35&377;				HBY16^400&7400+X
	X=BY36%20&377;				HBY17&7400+X
	Y=BY36^20&360;	X=BY37%400&17+Y;	HBY17^20&7400+X
	X=BY37&377;				HBY17^400&7400+X

	X=BY40%20&377;				HBY20&7400+X
	Y=BY40^20&360;	X=BY41%400&17+Y;	HBY20^20&7400+X
	X=BY41&377;				HBY20^400&7400+X
	X=BY42%20&377;				HBY21&7400+X
	Y=BY42^20&360;	X=BY43%400&17+Y;	HBY21^20&7400+X
	X=BY43&377;				HBY21^400&7400+X
	X=BY44%20&377;				HBY22&7400+X
	Y=BY44^20&360;	X=BY45%400&17+Y;	HBY22^20&7400+X
	X=BY45&377;				HBY22^400&7400+X
	X=BY46%20&377;				HBY23&7400+X
	Y=BY46^20&360;	X=BY47%400&17+Y;	HBY23^20&7400+X
	X=BY47&377;				HBY23^400&7400+X
	X=BY50%20&377;				HBY24&7400+X
	Y=BY50^20&360;	X=BY51%400&17+Y;	HBY24^20&7400+X
	X=BY51&377;				HBY24^400&7400+X
	X=BY52%20&377;				HBY25&7400+X
	Y=BY52^20&360;	X=BY53%400&17+Y;	HBY25^20&7400+X
	X=BY53&377;				HBY25^400&7400+X
	X=BY54%20&377;				HBY26&7400+X
	Y=BY54^20&360;	X=BY55%400&17+Y;	HBY26^20&7400+X
	X=BY55&377;				HBY26^400&7400+X
	X=BY56%20&377;				HBY27&7400+X
	Y=BY56^20&360;	X=BY57%400&17+Y;	HBY27^20&7400+X
	X=BY57&377;				HBY27^400&7400+X





	X=BY60%20&377;				HBY30&7400+X
	Y=BY60^20&360;	X=BY61%400&17+Y;	HBY30^20&7400+X
	X=BY61&377;				HBY30^400&7400+X
	X=BY62%20&377;				HBY31&7400+X
	Y=BY62^20&360;	X=BY63%400&17+Y;	HBY31^20&7400+X
	X=BY63&377;				HBY31^400&7400+X
	X=BY64%20&377;				HBY32&7400+X
	Y=BY64^20&360;	X=BY65%400&17+Y;	HBY32^20&7400+X
	X=BY65&377;				HBY32^400&7400+X
	X=BY66%20&377;				HBY33&7400+X
	Y=BY66^20&360;	X=BY67%400&17+Y;	HBY33^20&7400+X
	X=BY67&377;				HBY33^400&7400+X
	X=BY70%20&377;				HBY34&7400+X
	Y=BY70^20&360;	X=BY71%400&17+Y;	HBY34^20&7400+X
	X=BY71&377;				HBY34^400&7400+X
	X=BY72%20&377;				HBY35&7400+X
	Y=BY72^20&360;	X=BY73%400&17+Y;	HBY35^20&7400+X
	X=BY73&377;				HBY35^400&7400+X
	X=BY74%20&377;				HBY36&7400+X
	Y=BY74^20&360;	X=BY75%400&17+Y;	HBY36^20&7400+X
	X=BY75&377;				HBY36^400&7400+X
	X=BY76%20&377;				HBY37&7400+X
	Y=BY76^20&360;	X=BY77%400&17+Y;	HBY37^20&7400+X
	X=BY77&377;				HBY37^400&7400+X




	HBY40&7400
	HBY40^20&7400
	HBY40^400&7400
	HBY41&7400
	HBY41^20&7400
	HBY41^400&7400
	HBY42&7400
	HBY42^20&7400
	HBY42^400&7400
	HBY43&7400
	HBY43^20&7400
	HBY43^400&7400
	HBY44&7400
	HBY44^20&7400
	HBY44^400&7400
	HBY45&7400
	HBY45^20&7400
	HBY45^400&7400
	HBY46&7400
	HBY46^20&7400
	HBY46^400&7400
	HBY47&7400
	HBY47^20&7400
	HBY47^400&7400
	HBY50&7400
	HBY50^20&7400
	HBY50^400&7400
	HBY51&7400
	HBY51^20&7400
	HBY51^400&7400
/
	NDBOOT=.
/  CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS
/
/	##  CODE FOR SYSTEM HANDLER  ##
/
	RELOC
	*200
	RELOC	7600
/
/			/USE DATA BREAKS FOR TEMPORARIES
/
/QUO=MQ			/CURRENT LOGICAL TRACK IN MQ REGISTER
REC=7750		/CURRENT LOGICAL SECTOR !!MUST BE 7750!!
REMD=7751		/REMAINDER FOR DIVIDE == SECTOR
IOTYP=7752		/LOGICAL UNIT+BYTE (NORMAL OR REVERSED)
RETRY=7753		/RETRIES COUNT
SHIFT=7754		/DIVISOR FOR DIVIDE
/
	ZBLOCK	7	/REQUIRED BY BUILD
/
/
/  ENTRY POINT
/
RXH0,			/NORMAL HANDLER NAME
SYS,	VERSION		/SYSTEM HANDLER NAME
L33,	33		/FALL THRU SOME LITERALS
L7700,	7700		/'SMA CLA' CLEARS AC!!
L3,	3		/!!REQUIRED AT 7612!! TO SHOW OS8 TWO PAGE HANDLER
	TAD	SYS	/USE RXH1 AS COMMON ENTRY POINT
	DCA	RXH1	/I HOPE THE CODE IS SHORTER
	JMP	JOINT	/SET UNIT 0,1 - DEPENDING ON BOOT
/
/		START OF DIVIDE ROUTINE - FITS IN HERE
DIVSUB,	0
	SPA SZL		/IS IT A LEGAL SECTOR NUMBER?
	JMP	FATAL	/NO! DON'T EVEN RETRY
	DCA	REC	/SET FIRST OR NEXT LOGICAL SECTOR
L20,	20		/THESE 2 ITEMS WILL EXECUTE AS 'AND'
BOOTYP,	100		/!!MUST BE AT 7623!! SECONDARY BOOT PUTS AT BOOT TIME
/			/100 FOR BYTE MODE, AND 20 IF UNIT 1
	TAD	L7700	/SET DIVIDE QUOTIENT
	MQL		/FOR 6 DIVIDES
	TAD	REC	/THIS FOR TRACK-SECTOR
	DCA	REMD	/GETS REDUCED TO NEG. REMAINDER
	TAD	L4600	/=-26*2^6
	JMP	DIVSTA	/GO INTO DIVIDE LOOP
/
L4600,	4600
LLCDI0,	CIF CDF	0
/			/SECOND ENTRY POINT
RXH1,	VERSION		/BE NICE AND PUT AT 7634
	CLA CLL		/THE USUAL SECURITY
	TAD	L20	/SET UNIT TO 1,0 - MAY SET BIT 40 = NOP
JOINT,	TAD	BOOTYP	/SET UNIT 0,1 OR 1,0 - DEPENDING ON BOOT
	DCA	IOTYP	/THIS WILL BE USED BY LDCMD
	RDF		/GRAB CALLER'S FIELD
	CIF 20		/!!MUST BE AT 7642 FOR FRTS!! (OTHER CIFS COMING)
	TAD	LLCDI0	/MAKE CIF CDF TO IT (A CIF 20 WILL FOLLOW IT)
	DCA	RESTOR	/PUT IT BACK, GOING TO I/O ROUTINE ON PAGE 2
	TAD	RESTOR	/SETUP RETURN TO USER
	DCA	EXIT	/AFTER NORMAL OR ERROR RETURN
	AC7775		/SET UP RETRY COUNTER
	DCA	RETRY	/RETRIES ARE OVER ENTIRE OPERATION
RSTART,	TAD	RXH1	/NOW GO TO PAGE 2 FOR MOST
RESTOR,	HLT		/WILL HAVE CIF CDF USER
	CIF 20		/KILL PREVIOUS CIF AND
	JMP	PAGE2	/GO TO PAGE2

HAPPY,	SNL CLA		/WAS LINK SET FOR LCD WITH ARGS?
	JMP	LDEND	/NO, RETURN
	TAD	REMD	/YES, LOAD SECTOR
	STR
	JMP	.-1
	XDR
	CLA MQA		/CLEAR AC, GET LOGICAL TRACK
	IAC		/LOGICAL TO STANDARD
	STR
	JMP	.-1
	XDR
LDEND,	CLA CLL		/LINK MUST BE 0 FOR FOLLOWING DIVSUB
	CIF 20
	JMP I	LDCMD
LDCMD,	0		/THIS ROUTINE HANDLES ALL LCD COMMANDS
	SDN		/READY TO ACCEPT?
	JMP	.-1
	CLL RAL		/MOVE COMMAND OVER NOP BIT AND SET LINK FLAG
	TAD	IOTYP	/ADD BYTE BIT AND UNIT
/AT 7700!! THIS IS ALL I CAN DO FOR THE BAD PROGRAMMERS!!
	LCD		/START CODE (MICROCODE THAT IS)
	SER		/UNHAPPY?
	JMP	HAPPY	/YOUPEE
	ISZ	RETRY	/GIVE HIM ANOTHER TRY?
	JMP	RSTART	/YES
FATAL,	AC4000		/THATS THE FATAL SIGNAL
	SKP		/TO ERROR RETURN
END,	ISZ	RXH1	/END CALLED FROM PAGE 2
	ISZ	RXH1
	ISZ	RXH1
	ISZ	RXH1	/RXH1 COMMON ENTRY, REMEMBER?
EXIT,	HLT		/RETURN TO USER FIELD
	JMP I	RXH1	/BYE BYE
/
/ THIS IS THE MAIN PART OF TRACK/SECTOR CALCULATION (SEE DIVSUB)
/
DIVLOO,	TAD	SHIFT	/MAIN DIVIDE LOOP
	STL RAR		/NEXT DIVISOR
DIVSTA,	DCA	SHIFT
	TAD	SHIFT	/LINK IS NOW = 0
	TAD	REMD	/
	SZL		/OVERFLOW?
	DCA	REMD	/YES, UPDATE REMAINDER
	CLA MQA		/GET QUOTIENT WITH COUNT MASK
	RAL		/SHIFT IN DIVIDE BIT
	MQL		/AND SHIFT BUSY BIT OUT
	SZL		/SKIP IF DONE
	JMP	DIVLOO
	TAD 	REMD	/MULTIPLY BY THREE FOR INTERLEAVE
	CLL RAL
	TAD 	REMD	/NOW SHIFT IS AT -26 SO WE CAN
	TAD	SHIFT	/DIVIDE BY 26 TO GET SECTOR
	SMA		/SKIP IF DONE
	JMP	.-2
	TAD	L33
	DCA	REMD	/WHEW, THATS IT!
	ISZ	REC	/PREPARE NEXT LOGICAL SECTOR
	CIF	20	/POP BACK TO OTHER PAGE
	JMP I	DIVSUB	/!!THIS IS IN LAST USABLE LOCATION, EXEC NEEDS 7744!!

/
/	##  SECOND PAGE  ##
/
	RELOC
	*400
	RELOC	7600

LCDF0,	CDF 0

FILL4,	0		/SUBROUTINE TO PUT 1 4-BIT IN CORE
	CLL RTL
	RTL
	DCA	TEMP4
	TAD	TEMP4
	AND	L7400
	DCA I	BUF4
	ISZ	BUF4
L7,	7
	JMP I	FILL4
/
/  FETCH ARGUMENTS, ETC.
/
PAGE2,	DCA	FETCH	/ENTER WITH ARGUMENT LIST ADDR IN AC
	AC4000		/SET UP TO PUT R/W BIT TO LINK
	TAD I	FETCH	/FIRST ARGUMENT HAS FIELD FOR TRANSFER
	AND	L70	/KEEPING ONLY FIELD
	TAD	LCDF0	/MAKE CDF TO TRANSFER FIELD
	DCA	BUFCDF	/PLACE IN LINE FOR SILO LOOP
	CML RAL		/0=WRITE, 1=READ
	DCA	FN
	TAD I	FETCH	/MAKE CONTROL COUNT FOR TRANSFER
	CLL RAL
	AND	L7600
	CLL CIA
	DCA	SNGWC	/8-BIT WORD COUNT
	TAD	SNGWC
	STL RAR		/4000 FOR WHOLE FIELD
	DCA	DBLWC	/4-BIT DOUBLE WORD COUNT
	ISZ	FETCH	/NEXT ARGUMENT
	TAD I	FETCH	/BUFFER ADDRESS
	DCA	BUF8	/FOR RIGHT 8-BITS
	ISZ	FETCH	/NEXT
	TAD I	FETCH	/TEST BLOCK NUMBER
	CLL RAL		/*2
	SMA SNL		/SECTOR NUMBER MUST STAY NON-NEG
	TAD I	FETCH	/+1=3, 3*1221=3663 IS THE LIMIT
LCDIF0,	CIF CDF 0	/GO BACK TO FIRST PAGE
	JMS	DIVSUB	/SET UP TRACK AND SECTOR
/DIVSUB WILL TEST IF SECTOR NON-NEG AND ADD IT TO THE INITIALIZED
/(=0) VALUE OF 'REC'
/
/  TOP OF BLOCK LOOP
/
LBLOCK,	STA
	DCA	LMODE	/FIRST 4-BIT MODE
TOP,	AC7776
	TAD	LMODE	/SEE IF LMODE AT END
	SNA CLA
	JMP	LBLOCK	/YES, RESET TO -1
	TAD	BUF8	/NOW SET THE 4-BIT BUFFER
	DCA	BUF4	/TO TLE LAST 8-BIT BUFFER
	TAD	FN	/SPLIT READ AND WRITE
	SZA		/WRITE SKIPS
	JMS	SECTOR	/AC CARRIES FN=1 FOR READ
	TAD	FN	/SET SILO TO LOAD-UNLOAD
	CIF CDF 0
	JMS	LDCMD	/COMMAND TO CONTROLLER
BUFCDF,	HLT		/CDF TO BUFFER FIELD PLACED HERE
	ISZ	LMODE	/GO TO NEXT MODE AND TEST
	JMP	RW8BIT
RW4BIT,	TAD	FN	/TEST IF R/W FOR FETCH OR FILL
LREC,	SPA SNA CLA	/!! LREC AT 7750!!
	JMP	WR4BIT
RD4BIT,	JMS	SILO	/GET A BYTE
	JMS	FILL4	/LOAD 4BIT-A IN EVEN WORD
	TAD	TEMP4
	JMS	FILL4	/LOAD 4BIT-B IN ODD WORD
TS4BIT,	ISZ	DBLWC	/DO WE HAVE A HALF-BLOCK?
	JMP	RW4BIT	/NOT YET, LOOP
FLUSH,	JMS	SILO	/EMPTY SILO AND DISCARD OR FILL WITH NULLS
/	..............	/
IFNZRO .-7700 <NOSMA,_>	/EXERCISE FOR THE READER
FETCH,
TEMP4,
SILO,	0		/FILL OR EMPTY SILO
	STR		/WAIT FOR TRANSFER READY
	JMP	TSDONE	/TEST FOR DONE READY
	XDR
	JMP I	SILO
TSDONE,	SDN		/IS SILO EMPTY/FULL
	JMP	SILO+1	/NO WAIT
	CLA CLL		/RUBBISH IN AC
	TAD	MAGIC	/FUNCTION 10 IS 'NOP'
	LCD		/RESET FLAG
	TAD	FN	/IS IT WRITE?
	SNA CLA
	JMS	SECTOR	/YES, WRITE SECTOR (AC=0)
	TAD	DBLWC	/DOUBLE WORDS DONE? GUARANTEES FULL FIELD
MAGIC,	SNA		/BE SURE OF 'AND' CONDITION!
	TAD	SNGWC	/SINGLE WORDS DONE? GUARANTEES 8-BIT DONE
	SZA CLA		/ALL DONE?
	JMP	TOP	/DO NEXT SECTOR
	CIF CDF 0
	JMP	END	/RETURN TO USER

SECTOR,	0		/AC CARRIES READ/WRITE SILO COMMAND
	TAD	L7002	/TURN SILO COMMAND INTO READ-WRITE COMMAND
	CIF CDF 0	/THE 4000 BIT TELLS THAT LCD NEEDS ARGS
	JMS	LDCMD	/I/O COMMAND TO CONTROLLER
	CDF CIF 0	/GO BACK TO FIRST PAGE
	TAD I	LREC	/GET LAST RECORD+1
	JMS	DIVSUB	/FOR TRACK AND SECTOR
	TAD	L7	/WAIT FOR OPERATION TO COMPLETE
	CIF CDF 0	/FUNCTION 16 IS 'READ ERROR REGISTER'
	JMS	LDCMD
	JMP I	SECTOR
WR4BIT,	TAD I	BUF4	/GET FIRST 4-BIT FROM EVEN WORD
	ISZ	BUF4
	AND	L7400
	CLL RTR		/NOW IN POSITION 1700
	DCA	TEMP4	/SAVE A WHILE
	TAD I	BUF4	/GET SECOND 4-BIT FROM ODD WORD
	ISZ	BUF4
L7400,	7400
	AND	L7400
L7002,	BSW		/IN POSITION 0074
	TAD	TEMP4	/NOW 1774
	CLL RTR		/IN BYTE POSITION 377
	JMS	SILO
L7600,	7600		/CLA FOR TEST
	JMP	TS4BIT	/GO INCREMENT DOUBLE WORDS

RW8BIT,	TAD I	BUF8	/8-BIT TRANSFER LOOP
	JMS	SILO	/FOR BOTH READ AND WRITE
	DCA I	BUF8
	ISZ	BUF8
L70,	70
	ISZ	SNGWC	/KEEP TRACK OF END
	JMP	RW8BIT
	JMP	FLUSH	/THE END, 1 MORE 'JMS SILO'
/
/  VARIABLES ETC.
/
BUF4,	0		/POINTER TO CALLER'S BUFFER 4-BITS
BUF8,	0		/POINTER TO CALLER'S BUFFER 8-BITS
DBLWC,	0		/CONTROL COUNT, DOUBLE WORDS TO TRANSFER
SNGWC,	0		/CONTROL COUNT, WORDS TO TRANSFER
FN,	0		/0 FOR WRITE, 1 FOR READ
LMODE,	0		/-1 TO 2 4-BIT OR 8-BIT MODE

	ZBLOCK 4	/FOR BATCH
IFZERO .-1&4000 <FFULL,_>	/FIELD OVERFLOW

	$ $ $ $