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

/ BYTE MODE SYS HANDLER (PDP8-E)
/
/
/
/
/
/
/
/
/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
/PDP11-COMPATIBLE FLOPPY SYSTEM HANDLER		-JVZ-

/THIS IS AN OS/8 FLOPPY DISK -SYSTEM HANDLER- WHICH USES
/BYTE MODE (RATHER THAN 12-BIT MODE) IN ORDER TO GET 658
/OS/8 BLOCKS PER DISK (INSTEAD OF ONLY 494). THE DATA IS
/STORED IN A FORMAT IDENTICAL TO THAT USED BY THE PDP-11
/SO ASCII FILES CAN BE INTERCHANGED QUITE EASILY.

/THE HANDLER IS LOADED USING THE STANDARD BOOTSTRAP, BUT
/REQUIRES A SYSTEM WITH AT LEAST 12K OF MEMORY. LOCATION
/13641 IN 'PIP' MUST BE CHANGED TO 6556 IN ORDER TO HAVE
/THE CORRECT LENGTH APPEAR IN DIRECTORIES.DEVICES 'RBA0'
/AND 'RBA1' (DRIVES 0/1) ARE BOTH CO-RESIDENT WITH SYS:.

/THIS HANDLER IS NOT RECOMMENDED FOR USE ON A DECSTATION
/SINCE THE '6100' PROCESSOR CANNOT KEEP UP WITH THE DATA
/RATE, CAUSING A SERIOUS DEGRADATION IN PERFORMANCE. (IT
/WILL WORK CORRECTLY - JUST VERY SLOWLY.)  IT WILL, HOW-
/EVER, WORK WITH EITHER THE RX01 OR THE RX02 CONTROLLER!

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

	PAGE 0		/BUILD STUFF
	-3		/3 ENTRY POINTS

DEVICE	RB28		/MEANS BYTE SYSTEM HANDLER
			/BUILD ON RX02 DRIVE, RX01 MEDIA
DEVICE	SYS		/THE MAIN ENTRY POINT
	4410		/DEVICE TYPE 41 (NOTE FOR PIP)
	SYS&177+6000	/READ/WRITE, ENTRY PT. AT 7607
	0
	1222		/658(10) BLOCKS

DEVICE	RB28		/SECOND SYSTEM ENTRY POINT
DEVICE	RBA0		/(THIS IS REALLY OPTIONAL)
	4410
	RBA0&177+5000
	0
	1222

DEVICE	RB28		/DRIVE ONE IS NOW CORESIDENT
DEVICE	RBA1		/SIMILAR TO THE RT/11 NAMES!
	4410
	RBA1&177+5000	/SELECT A 'MAGIC' ENTRY POINT
	0
	1222		/GIVES A TOTAL OF 1316 BLOCKS

MLEN,	-154		/-LENGTH OF BOOTSTRAP

VERSION="M&77		/IDENTIFY THE VERSION NO.
/HERE IS A LISTING OF THE PRIMARY BOOTSTRAP FOR REFERENCE

	NOPUNCH
	*20
CYCLE,	TAD TEST	/TRY NEXT COMBINATION
	TAD C360	/OF UNIT AND DENSITY
	AND C420	/'400'=D.D., '20'=DRIVE 1
	DCA TEST	/CYCLES 400,420,0,20,400...
	IAC STL RTL	/6: READ A DISK SECTOR
	TAD TEST	/UNIT AND DENSITY
	RX8 LCD		/LOAD COMMAND REGISTER
	CLA IAC
	JMS LOAD	/LOAD SECTOR NUMBER (1)
	JMS LOAD	/THEN TRACK  NUMBER (1)
C7004,	RAL		/TURN THE '1' INTO A '2'

START,	RX8 SDN		/CHECK THE DONE FLAG
	JMP LOAD+1	/FIGURE EIGHT WAIT LOOP
	RX8 SER		/ANY ERRORS?
	SNA		/NO, CHECK OPERATION
	JMP CYCLE	/YES, TRY DIFFERENT COMBO

	TAD TEST	/OK, DUMP THE SILO (AC=2)
	RX8 LCD
	TAD TEST	/SAVE FUNNY RESULT FOR
	AND C360	/COMPATIBILITY REASONS
	TAD C7004
	DCA C420	/DON'T NEED THIS ANY MORE

C360,	360		/THIS IS A 'NOP'
	JMS LOAD	/GET 12-BITS FROM SILO
	DCA 2		/PUT IN IT LOCATION 2
	ISZ .-1		/NOW MAKE THAT LOCATION 3
	JMP .-3		/LOOP HERE 'TIL WE HIT '.-3'

LOAD,	0		/MOVE DATA BACK AND FORTH
	RX8 STR		/READY?
	JMP START	/NO, DONE?
	RX8 XDR
	JMP I LOAD

C420,	420		/MASK
TEST,	 20		/DRIVE AND DENSITY SELECTION
	ENPUNCH

/HERE ARE THE VARIOUS IOT INSTRUCTIONS - SOME USE THE AC

RX8=	6750		/THE STANDARD DEVICE CODE
LCD=	   1		/LOAD COMMAND REGISTER
XDR=	   2		/TRANSFER DATA
STR=	   3	/SKIPS	/SKIP ON DATA FLAG
SER=	   4	/CLEAR	/SKIP ON ERROR FLAG
SDN=	   5	/FLAGS	/SKIP ON DONE FLAG
INTR=	   6		/+AC11 SETS INTERRUPTS
INIT=	   7		/INITIALIZE CONTROLLER
/NOW WE HAVE AN INTERESTING PROBLEM: THE PRIMARY BOOTSTRAP
/READS IN SECTOR 1 OF TRACK 1 IN 12-BIT MODE.  HOWEVER, WE
/MUST WRITE THIS SECTOR IN 8-BIT MODE,  SO WE HAVE TO FILL
/IT IN 'BY HAND' WITH SOME MIGHTY FUNNY LOOKING STUFF. THE
/CONVERSION WAS DONE WITH 'FUTIL' BY FIRST WRITING THE IN-
/STRUCTIONS IN 12-BIT MODE,  AND THEN READING THEM BACK IN
/IN 8-BIT MODE,USING THE APPROPRIATE HANDLER (RXA1:,RBA1:)

/HERE IS A LIST OF THE 8-BIT CODES WHICH MUST BE WRITTEN:

/	2000; 0057; 2336; 2640; 2372; 3606; 0002; 0760
/	2102; 2022; 0542; 0536; 2140; 4702; 3140; 3216
/	1540; 6562; 0204; 4522; 0202; 1262; 0140; 6222
/	7202; 6675; 7242; 6315; 5760; 3217; 0372; 1213
/	2044; 2410; 4202; 0674; 1160; 2212; 0202; 2266
/	0202; 2666; 1602; 5670; 0040; 2126; 1440; 5550
/	1643; 0400; 2344; 3156; 0140; 3142; 0004; 2042
/	0360; 4007; 0263; 4260; 1336; 5630; 7664; 7536


XLIST;	/QUIETLY LOAD THE INSTRUCTIONS WE LISTED ABOVE
	2000; 0057; 2336; 2640; 2372; 3606; 0002; 0760
	2102; 2022; 0542; 0536; 2140; 4702; 3140; 3216
	1540; 6562; 0204; 4522; 0202; 1262; 0140; 6222
	7202; 6675; 7242; 6315; 5760; 3217; 0372; 1213
	2044; 2410; 4202; 0674; 1160; 2212; 0202; 2266
	0202; 2666; 1602; 5670; 0040; 2126; 1440; 5550
	1643; 0400; 2344; 3156; 0140; 3142; 0004; 2042
	0360; 4007; 0263; 4260; 1336; 5630; 7664; 7536
XLIST;	/THIS PREVENTS NEEDLESS GARBAGE IN THE LISTING
/	NOW FOR A LISTING OF THE SECONDARY BOOTSTRAP

NOPUNC;	RELOC 2		/STARTS AT LOC 2
FIRST,	.		/LOAD CONTROL
	SMA		/NOP

BYTE1,	RX8 XDR		/READ THE STATUS REGISTER
BYTE2,	AND LSUB	/CHECK THE 'RX02' BIT
BYTE3,	SNA CLA		/IF SET, LEAVE LSUB ALONE
SECNT,	DCA LSUB+2	/IF NOT, REMOVE THIS INST.

INDEX,	UNLOAD-1	/CONTINUE 12-BIT LOAD
RECRD,	1		/THE SECTOR NUMBER
	ISZ JMPNXT	/CLIP THE CONNECTION
	TAD JMPINS
TRACK,	DCA XFIELD+1	/CHANGE THE DATA LOOP

	CML IAC		/TRACK 1, SECTOR 1 AGAIN
SECOND,	DCA TRACK	/TRACK 7, SECTOR 27 LATER
	TAD B7377
	DCA INDEX	/LOAD AT 07400, 27400
	CMA CLL RTL	/-3
	DCA SECNT	/3 SECTORS PER OS/8 BLOCK

THIRD,	TAD B106	/BYTE MODE READ FROM UNIT 0
	JMS LSUB
	TAD RECRD	/LOAD CURRENT SECTOR NUMBER
	JMS LOAD
FOURTH,	TAD FIRST	/ADD 2
	DCA RECRD
	TAD TRACK	/NOW THE TRACK NUMBER (1,7)
	JMS LOAD	/THIS WILL SET THE DONE FLAG

START,	RX8 SDN		/MATCHES UP WITH PRIMARY BOOT
	JMP LOAD+1
	RX8 SER
	SKP
B7666,	17666		/'HLT' - ALL ERRORS ARE FATAL
	SNA CLA
JMPNXT,	JMP I FIRST	/AC=0 FOR SILO OPERATION
	TAD B102
	JMS LSUB	/EMPTY THE SILO AFTER READ

XFIELD,	JMS LOAD
	CDF 0		/BECOMES 'JMP I STOR'
	DCA I INDEX
	JMP XFIELD	/12-BIT UNLOAD LOOP

/THE PRIMARY BOOTSTRAP ENDS WHEN THE INSTRUCTION ABOVE
/IS LOADED.  THIS FINISHES THE 12-BIT LOAD WHICH READS
/IN THE ROUTINES TO HANDLE 8-BIT DATA. THE INSTRUCTION
/LABELED 'JMPNXT' THEN STARTS UP THE FINAL LOAD PROCE-
/DURE WHICH READS IN THE LAST PAGES OF FIELDS 0,1 & 2.
RELOC	60		/FOLLOWING 'LOAD'
UNLOAD,	JMS LOAD
	DCA BYTE1	/8-BIT UNPACKING LOOP
	JMS LOAD
	DCA BYTE2
	JMS LOAD
	JMS STOR
	TAD BYTE2
	DCA BYTE1
	TAD BYTE3
	JMS STOR
	JMP UNLOAD

STOR,	UNLOAD+1	/REMEMBERS THE NEXT STEP
	CLL RTL
B106,	CLL RTL
	DCA BYTE3
	TAD BYTE3
B102,	AND B7400	/STRIP OFF 4 BITS
	TAD BYTE1
B7400,	7400
	DCA I INDEX
JMPINS,	JMP I STOR

LSUB,	10		/MASK FOR STATUS REGISTER
	RX8 LCD
	JMS LOAD	/FOR THE RX02; 0 FOR RX01
	JMP I LSUB
B7377,	7377		/END OF 12-BIT LOAD

	ENPUNCH		/BEGINNING OF 8-BIT CODE

RELOC	SMA		/COME HERE ON A SECTOR BREAK
	TAD LOAD
	DCA STOR	/SAVE THE RETURN ADDRESS
B2007,	ISZ SECNT
	JMP THIRD	/DO THREE AT A TIME

	TAD B31
	DCA RECRD+1	/CHANGE THE RECORD SEQUENCER
	IAC
	DCA RECRD+2	/TO INDEX THROUGH A LIST NOW
	TAD BISZ25
B3027,	DCA FOURTH
	TAD B3027	/LOCATION OF OS/8 BLOCK 66
	DCA RECRD
	TAD B2007	/IS TRACK 7, SECTORS 27,31,1
	CDF 20
	ISZ .+1		/SET UP FOR THE NEXT PHASE
	JMP .
	JMP SECOND	/READ BLOCK 66 INTO 27400

/THE HIGH-ORDER BITS IN 'TRACK' AND 'RECRD' ARE IGNORED
/NEXT STEP IS TO CHECK THE 'LSUB' ROUTINE TO SEE WHICH
/CONTROLLER WE HAVE AND MODIFY THE HANDLER ACCORDINGLY.

B7600,	7600		/MULTI-USE CONSTANT
	TAD LSUB+2	/THIS IS '0' FOR THE RX01
	SZA CLA
	TAD BJMS
	DCA I BADR	/MAKE THE HANDLER THE SAME

/HERE'S A NICE FEATURE THAT ALL BOOTSTRAPS SHOULD HAVE:
/TRY TO PRESERVE THE CURRENT DATE WORD (MAY BE GARBAGE)

	CDF 10		/LOCATION OF OS/8 DATE WORD
	TAD I B7666
	DCA LOAD	/SAVE FOR A MOMENT

/NOW MOVE THE CODE AT 27400 TO THE LAST PAGE OF FIELD 1

BMOVE,	CDF 20
	ISZ B7377
	TAD I B7377
	CDF 10
	DCA I B7600
	ISZ B7600
	JMP BMOVE

	TAD LOAD	/PUT THE DATE BACK
	DCA I B7666

	CDF 0
	TAD B16		/SET THE DONE FLAG
	RX8 LCD
	JMP I .+1	/AND WE'RE UP AND RUNNING!
	07605

B16,	16		/MOVE ERROR REGISTER
B31,	31
BJMS,	JMSXFR
BADR,	RX02XX
BISZ25,	ISZ THIRD+2

RELOC			/END OF BOOTSTRAP CODE


/THE HANDLER ITSELF FOLLOWS.  IT LIVES IN THE LAST PAGE
/OF FIELDS 0 AND 2 AND HENCE REQUIRES A 12K SYSTEM. THE
/LAST PAGE OF FIELD 1 IS USED FOR SYSTEM TABLES. A PRO-
/GRAM WHICH REQUIRES THE USE OF ALL OF FIELD 2 MUST RE-
/COGNIZE CERTAIN 'FINGERPRINTS' IN THE HANDLER AND MAKE
/THE NECESSARY MODIFICATIONS TO RELOCATE THE HIGH FIELD
/CODE SOMEWHERE ELSE.   FORTRAN IV AND COMMERCIAL BASIC
/ARE BOTH CLEVER ENOUGH TO KNOW HOW TO DO THIS...
	PAGE 1
RELOC	07600
	ZBLOCK 7	/LEAVE ROOM FOR MONITOR CALL
SYS,
RBA0,	VERSION		/STARTS AT 07607
	CLA CLL		/DON'T TRUST USER
	0		/FREE!! (FOR SMALL CONSTANT)
	3		/FLAG FOR A '12K' HANDLER
	TAD RBA0	/MOVE THE CALL ADDRESS
	DCA RBA1
UNIT1,	CLL RTL		/COMES IN WITH AC=4 FROM RBA1:
	DCA DRIVE	/SAVE THE UNIT SELECT BIT
	RDF		/MUST BE BEFORE 7635
	TAD CDI0
	DCA REXIT	/SAVE THE RETURN CDI
	CMA CLL RTL
	DCA ERCNT	/SET THE RETRY COUNT
CDI0,	CDF CIF 0	/MUST BE BEFORE 7635
/////

AGAIN,	TAD RBA1	/BACK UP THE ARG. POINTER
	DCA RBA1
	TAD REXIT	/RESTORE THE CALLING FIELD
	DCA .+1
TEMP,	HLT		/CDF CIF CF
	TAD I RBA1	/SAVE THE FUNCTION WORD
	DCA PUTB	/WHERE WE CAN GET AT IT
	ISZ RBA1	/ADVANCE CALL POINTER
	TAD I RBA1
	DCA BUFAD	/SAVE THE BUFFER ADDRESS
	ISZ RBA1	/ADVANCE TO BLOCK NUMBER
	TAD I RBA1
	TAD I RBA1	/X3 CONVERTS TO SECTORS
	IFNZRO .-7642	<ER7642, __>
	CIF 20		/MUST BE LOCATED AT 7642
	TAD I RBA1
	JMS INITLZ	/SAVE SECTOR COUNT, ETC.
PUTB,	0		/HOLDS FIRST ARGUMENT
	TAD I BUFAD
	ISZ BUFAD
P7400,	7400		/NOP
	JMS MOVEB	/PUT A BYTE IN SILO
	AND P7400
	JMP I PUTB	/RETURN HIGH 4 BITS
/////

	ISZ RBA1	/SKP THE ERROR RETURN
REXIT,	HLT		/CDI TO CALLING FIELD
	ISZ RBA1
	JMP I RBA1	/AC IS -2 ON AN ERROR
/////

	TAD SAVAC	/RESTORE AC
MOVIE,	RX8 STR		/TRANSFER FLAG UP?
	JMP .-1
	RX8 XDR		/MOVE DATA IN OR OUT
	JMP I MOVEB
/////
	IFNZRO .-7665	<ERRBA1, __ /INTERLEAVED WITH RLC >
RBA1,	VERSION		/ENTRY POINT FOR DRIVE 1
	CLA CLL IAC RTL	/SET AC=4 FOR DRIVE
	JMP UNIT1	/REJOIN MAINLINE
/////

WRITE,	JMS PUTB	/PUT AWAY FIRST BYTE
	CLL RTR
	DCA TEMP	/SAVE HIGH NIBBLE AT 1700 BITS
	JMS PUTB
	BSW		/MOVE LOWER NIBBLE TO 0074 BITS
	TAD TEMP	/MERGE UPPER NIBBLE
	CLL RTR		/AND MOVE TO 377 POSITION
	JMS MOVEB	/THE NEXT LOC MAY GET WIPED OUT
	IFNZRO .-7700	<ERUSR0, __ >
	SKP CLA		/REMOVE DATA BITS AND WRONG USR ENTRY
	HLT		/FATAL FIELD 0 USR CALL HALT AT 7701
	ISZ BUCNT	/FINISHED YET?
	JMP WRITE
RXOUT,	CIF 20		/CLEAR BUFFER AT END
	JMP CLEAR+1	/WRITE SECTOR AND EXIT
/////

MOVEB,	0		/PUT OR GET BYTE FROM SILO
	ISZ BYCNT
	JMP MOVIE	/NOT DONE YET
	DCA SAVAC	/SAVE THE AC
	CIF 20
	JMP MOVEC	/READ/WRITE SECTOR, ETC.
/////

READ,	JMS MOVEB	/GET THE FIRST BYTE
	DCA TEMP
	JMS MOVEB	/GET THE SECOND ONE
	DCA PUTB
	JMS MOVEB	/AND THEN GET NO. 3
	CLL RTL		/PUT IN 1774 BIT POSITION
	DCA MOVEB
	TAD MOVEB	/PUT AWAY FIRST WORD
	CLL RTL		/IN 776 POS
	AND P7400
	TAD TEMP	/MERGE BITS AND BYTES
	DCA I BUFAD
	ISZ BUFAD
	NOP
	TAD MOVEB	/NOW DO THE NEXT ONE
	BSW
	AND P7400
	TAD PUTB
	DCA I BUFAD
	ISZ BUFAD
DRIVE,	0		/LOCATED AT 7740
	ISZ BUCNT	/FILLED THE ENTIRE BUFFER?
	JMP READ	/NO
	JMP RXOUT	/YES

BYCNT=	7750		/USE A FEW DATA BREAK LOCS
ERCNT=	7751
BUFAD=	7752
SAVAC=	7753
BUCNT=	7754

RELOC;	PAGE		/REMAINDER IS USED BY OS/8
/UPPER FIELD STUFF - LOTS OF ROOM HERE (OH REALLY?)

NOPUNC;	FIELD 2; ENPUNCH
RELOC	27600

TRNSFR,	0		/MOVE A BYTE IN OR OUT
	RX8 STR
	JMP .-1		/WAIT FOR THE FLAG
	RX8 XDR
M200,	7600		/CLEAR THE AC
	JMP I TRNSFR

LSECTR,	0		/LOGICAL SECTOR NUMBER
SECTOR,	0		/PHYSICAL   "      "
FUNCTN,			/BYTE MODE, UNIT, R/W
INITLZ,	0
	DCA LSECTR	/SAVE LOGICAL SECTOR NO.
	JMS DIVIDE	/SET DF, BYTE COUNT, DISK ADR

	TAD I INITLZ	/GET THE FUNCTION WORD
P7004,	RAL
	AND M200	/STRIP PAGE COUNT
	CIA
	STL RAR
	DCA I PBUCNT	/SAVE IN FIRST ENTRY POINT

	STL RAR
	TAD I INITLZ	/GET FUNCTION WORD AGAIN
	AND P70
	TAD CDF0	/FORMULATE THE CDF
	DCA CDFB

	TAD P7102	/GET SILO COMMAND
	SZL		/READ OR WRITE?
	AND P1100	/READ=7102, WRITE=1100
	TAD I P7740	/PLUS DRIVE SELECT BIT
	DCA FUNCTN

	SNL CLA		/IS IT A READ CALL?
	JMS FLOPPY	/YES, GET THE FIRST SECTOR
	JMS FNCALL	/SET DF AND SILO OPERATION

	CIF 0
	SNL CLA		/SELECT THE CORRECT RETURN
	JMP READ
	JMP WRITE	/ONE OF THESE TWO

MOVEC,	JMS FLOPPY	/SILO DONE, DO SECTOR OP
	CDF 0
	ISZ I P7750	/COUNT BYTE-IN-PROGRESS
	JMS FNCALL	/THEN DO ANOTHER SILO OP
	CIF 0
	JMP MOVIE-1	/RETURN TO SILO ROUTINE.
CLEAR,	JMS TRNSFR	/CLEAR OUT THE SILO
	CDF 0
	ISZ I P7750	/TEST THE BYTE COUNTER
	JMP CLEAR
	TAD FUNCTN	/WAS IT WRITE?
P7740,	SMA SZA CLA	/POINTS TO 'DRIVE'
	JMS FLOPPY	/YES, WRITE LAST SECTOR
	CIF 0
	JMP REXIT-1	/EXIT FROM HANDLER CALL

P70,	70
P116,	116		/MOVE ERROR REGISTER

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

TRACKN,	0		/PHYSICAL TRACK NUMBER
PBUCNT,	BUCNT


FNCALL,	0
	SPA SNA		/SKIP FOR ERROR TRANSFER
	TAD FUNCTN	/BYTE MODE + UNIT + R/W
CDFB,	HLT		/RESET THE DATA FIELD
	RX8 SDN
	JMP .-1		/WAIT FOR THE DONE FLAG
	RX8 LCD
RX02XX,	JMS TRNSFR	/= 'NOP' FOR RX01
	JMP I FNCALL	/(GOES AT LOCATION 27700)

JMSXFR=	JMS TRNSFR	/FOR BOOTSTRAP AND BUILD

FLOPPY,	0		/SECTOR I/O ROUTINE
	TAD P7004	/ADD 4 TO SILO COMMAND
	JMS FNCALL
	TAD SECTOR	/LOAD SECTOR ADDRESS
	JMS TRNSFR

	TAD TRACKN	/THEN LOAD THE TRACK NO.
	CLL IAC		/PLUS ONE
	JMS TRNSFR	/SEND TO THE CONTROLLER

	ISZ LSECTR	/COMPUTE NEXT DISK ADR.
	JMS DIVIDE	/(OVERLAPS SECTOR OPER)

	TAD P116	/WAIT FOR COMPLETION
	JMS FNCALL	/RESETS DF AND DONE FLAG

	RX8 SER		/ANY ERRORS?
	JMP I FLOPPY	/NOPE!
	RX8 INIT	/INITIALIZE AFTER AN ERROR
	CMA CLL RAL	/BACK UP THE ARGUMENT LIST
	CDF CIF 0
	ISZ I P7751	/CHECK THE ERROR COUNT
	JMP AGAIN	/TRY IT ALL OVER AGAIN
	JMP REXIT	/3 STRIKES AND YOU'RE OUT

P7751,	ERCNT		/ERROR COUNT POINTER
P1100,	1100

DIVIDE,	0
	TAD LSECTR	/GET LOGICAL SECTOR NUMBER
	DCA SECTOR
	TAD P7740	/SET THE BIT COUNTER
	DCA TRACKN
	TAD M26X64	/GET THE DIVISOR
CDF0,	CDF 0
	JMP DVENTR	/ENTER DIVIDE LOOP

DVLOOP,	RAL		/SHIFT IN THE QUOTIENT
	DCA TRACKN	/UPDATE TRACK AND BIT COUNTER
	TAD TRNSFR	/SHIFT THE DIVISOR ONE PLACE
DVENTR,	STL RAR
	DCA TRNSFR	/THIS ALSO CLEARS THE LINK

	TAD TRNSFR	/SUBTRACT THIS POWER
	TAD SECTOR
	SMA
	DCA SECTOR	/SAVE THE REMAINDER

P7750,	SPA SNA CLA	/CLEAR AC IF NECESSARY
	TAD TRACKN	/GET THE TRACK NUMBER
	SPA		/DONE?
	JMP DVLOOP	/NO

DVDONE,	TAD TRACKN	/AC=2*TRACK NO.,L=HALFTRACK
	TAD TRACKN	/THIS MAKES 3X THE TRACK NO.
	TAD SECTOR	/PLUS REMAINDER FROM DIVIDE
	NOP		/'TAD SECTOR' FOR 6100 VERS.
	RAL		/SHIFT IN THE HALFTRACK BIT

	TAD M32		/NOW REDUCE MODULO 26(10)
	SMA
	JMP .-2
	TAD P33		/RESTORE REMAINDER (PLUS 1)
	DCA SECTOR	/SAVE FOR NEXT DISK OPER

P7102,	CLL BSW		/CLEAR LINK FOR READ CALLS
	TAD M201
	DCA I P7750	/RESET THE BYTE COUNTER
	JMP I DIVIDE	/DF=0

/THE LAST FOUR LOCATIONS ON THIS PAGE ARE USED BY BATCH

RELOC;	$