File XHR21N.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/ DSD HIGH REL. 3 DRIVE FLOPPY NON-SYSTEM OS-8 DRIVER
/ S0:XHR21N.PA	9/8/76

/ THIS IS A 2 PAGE HANDLER WITH ASCII DUMP TO CONSOLE DEVICE
/ OF COMPLETE ERROR STATUS WHENEVER ANY ERRORS ARE DETECTED.
/ PRINTS "<CRLF>UT=<UNIT#+FUNC>  BK=<OS/8 BLK#>  ST= <XDR STT>
/	 "EC= <FUNCTION 7 DEFINITIVE ERROR CODE (PAGE 2)>
/	<UNIT+FUNC> LOW DIGIT=FUNCTION, 2ND FROM RIGHT = UNIT#
/	<OS/8 BLK > SAME FORMAT AS DIRECTORY LISTINGS.
/	<XDR STT  > SEE XDR - BIT 10=>PARITY, BIT11 =>CRC ERROR
/	<	    SEE PAGE 2 TABLE FOR CODE INTERPRETATION.

/ STANDARD OS/8 CALL SEQUENCE USED BY DRIVER.

/	JMS ENTDX(0,1,2) / AC CLEARED ON ENTRANCE AND NORMAL RETURN
/	 FUNCTION WORD	/ W P P  P P P  F F F  X X X
/			/ W = 1 FOR WRITE.
/			/ PPPPP = #128. WD PAGES XFERRED.
/			/ FFF = DATA TRANSFER MEMORY FIELD.
/	STARTING CORE TRANSFER ADDRESS.
/	STARTING LOGICAL DISK BLOCK (0-755) (2 PAGES/BLOCK)
/	ERROR RETURN	/ AC = 4000
/	NORMAL RETURN	/ NO ERRORS DETECTED

/ DEFS FOR INTERFACE OPERATION.

LCDR=6751	/ LOAD COMMAND REG: CLEAR AC.

/ X X X  X MA SZ  DH DR FN  FN FN X
/	MA = 1 FOR MAINTAINANCE MODE.
/	SZ = DATA WORD SIZE: 0=>12 BITS, 1=>8 BITS.
/	DH = HIGH DRIVE'S SELECT FOR DRIVE # 2.
/	DR = DRIVE SELECT. 0=>DRIVE 0, 1=>DRIVE 1
/	FN = FUNCTION (0 - 7)
/	 0=FILL BUFFER: GET 64 12 BIT WDS OR 128 8 BIT WDS
/	 1=EMPTY BUFFER(VERIFIES DATA: DOESEN'T CHANGE BUF)
/	 2=WRITE SECTOR	3 = READ SECTOR
/	 4= NOP		5 = READ STATUS (250 MSEC.) SEE XDR DEFS
/	 6= WRITE DELETED DATA SECTOR
/	 7= READ ERROR REG: SEE PAGE 2 FOR ERROR CODES.

XDR=6752	/ TRANSFER DATA REGISTER: BIDIRECTIONAL.
		/ IF READ JAMS DATA INTO AC
		/ IF WRITE LOADS FROM AC, AC UNCHANGED.
/  NOTE:  AFTER A LCD COMMAND FINISHED STATUS IS AVAILABLE
/		BY DOING AN XDR.
/		AC4= DRIVE READY
/		AC5= DELETED DATA MARK DETECTED IN ID
/		AC9= INITIALIZE COMPLETE.
/		AC10=PARITY ERROR ON CONTROL INF.
/		AC11=CRC ERROR DETECTED IN DATA.

STRF=6753	/ SKIP ON TRANSFER REQUEST.
		/ AN XDR INSTRUCTION IS DESIRED.

SERF=6754	/ SKIP ON ERROR FLAGS SET.
		/ DONE FLAG ALSO SET WHEN TRUE.

SDNF=6755	/ SKIP ON DONE FLAG SET AND CLEAR DONE.
		/ ATTACHED TO INTERRUPT LINE.

SINTR=6756	/ SET INTERRUPT STATE
		/ AC11=1 ENABLES INTERRUPT ON DONE FLAG SET.
		/ AC11=0 DISABLES FLOPPY INTERRUPT.

INIT=6757	/ INIT THE FLOPPY CONTROLLER - INTERFACE.

/ ERROR CODES GIVEN BY READ ERROR STATUS FUNCT (MODE 7) / CODE LIGHT # MEANING / 10 2 DRIVE 0 FAILED TO HOME ON INIT, OR DIDN'T SELECT / 20 2 DRIVE 1 FAILED TO HOME ON INIT, OR DIDN'T SELECT / 30 2 FOUND HOME WHEN STEPPING OUT 10 TRACKS FOR INIT. / 40 2 TRACK GREATER THAN 77. OR UNIT SELECT ERROR. / 50 2 HOME BEFORE DESIRED TRACK FOUND. / 70 2 DESIRED SECTOR COULD NOT BE FOUND AFTER 2 REVS. / / 100 3 WRITE PROTECT ERROR. / 110 MORE THAN 40 USEC AND NO SEPERATED CLOCK FOUND. / 120 0 NO PREAMBLE WAS FOUND ( 24 BITS OF 0'S) / 130 0 PREAMBLE FOUND BUT NO I/O MARK WITHIN WINDOW / 140 0 CRC ERROR ON WHAT APPEARED TO BE HEADER. / 150 2 HEADER TRACK ADDRESS OF A GOOD HEADER DIDN'T / MATCH DESIRED TRACK. / 160 0 TOO MANY TRIES FOR AN I.D. ADDRESS MARK. / 170 0 DATA ADDRESS MARK NOT FOUND IN ALLOTED TIME. / 200 0 CRC ERROR ON READING SECTOR FROM DISK. / RXES STATUS BIT 11 ALSO SET. / 210 1 PARITY ERROR (INTERFACE <=> CONTROLLER) / RXES STATUS BIT 10 ALSO SET. / 220 2 DRIVE 2 FAILED TO HOME ON INIT. / 230 2 DRIVE 3 FAILED TO HOME ON INIT. / 240 3 FORMATTER ENABLE ERROR. / 250 0 EXPECTED HEADER NOT FOUND AFTER TRACK FORMAT / 260 0 INDEX MARK NOT FOUND IN EXPECTED RANGE. / (FORMAT NOT BEGUN) / 270 0 INDEX MARK NOT FOUND IN EXPECTED RANGE. / (FORMAT HAS OCCURED) / LIGHTS MEANING / 0 FRONT DATA TYPE ERROR / 1 FRONT PARITY ERROR BETWEEN CONTROLLER-INTERFACE. / 2 FRONT SEEK TYPE ERRORS / 3 FRONT SWITCH CONFLICT ERROR OR CONTROLLER ERROR. / INCLUDES WRITE PROTECT OR FORMAT INHIBIT ERRORS. / BOARD LIGHTS / 4 UP-LEFT CONTROLLER WAITING FOR BUS INTERFACE READY. / 5 UP-RGHT INIT IN PROGRESS. / 6 LW-LEFT READ IN PROGRESS / 7 LW-RGHT WRITE IN PROGRESS.
/ TABLE FORMAT FOR OS/8 BUILD ENTRIES. / WORD 1-2 DEVICE TYPE / WORD 3-4 OS/8 DEVICE NAME / WORD 5 DEVICE CONTROL BLOCK ENTRY / BIT 0 =1 FILE STRUCTURED DEVICE / BIT 1 =1 READ ONLY / BIT 2 =1 WRITE ONLY / BITS 3-8 DEVICE TYPE. SEE TABLE 2-12 OS/8 / BITS 9-11 USED BY MONITOR / WORD 6 ENTRY POINT WORD. / BIT 0 = 1 2 PAGE HANDLER / BIT 1 = 1 ENTRY POINT = SYS: / BIT 2 = 1 ENTRY POINT CORESIDENT WITH SYS: / BIT 5-11 ENTRY POINT OFFSET FROM PAGE BEG. / WORD 7 MUST BE 0 / WORD 8 MUST BE 0 UNLESS SYSTEM HANDLER. / THEN = BLOCK LENGTH OF DEVICE. *0 -3 / 3 ENTRY POINTS, DX0, DX1, DX2 DEVICE HN21; DEVICE DX0; 4250; 4000+ENTDX0-UNITCD; 0; 0 DEVICE HN21; DEVICE DX1; 4250; 4000+ENTDX1-UNITCD; 0; 0 DEVICE HN21; DEVICE DX2; 4250; 4000+ENTDX2-UNITCD; 0; 0
SAM3=CLL STA RAL / SET AC = -3 *200 / NON-SYSTEM HANDLER FOR RX01-RX8 FLOPPY SYSTEM. UNITCD, 0 DSKADR, 0 / 4 * OS/8 BLOCK #. JMP CDFRET / FATAL ERROR RETURN FROM XEQSUB FUNCT, 0 / 0 = WRITE, 2 = READ. / CMDSUB - WAITS FOR DONE THEN DOES LOAD COMMAND. CMDSUB, 0 DCA CALADR / ABORT KLUDGE. TAD B7600 KRS / OR IN LAST CHAR TYPED. TAD MCTRLC / 7603+175 = 0 SZA CLA / CTRL C TYPED? JMP .+3 / NO: NOT RECENT CTRL C CDIFZR, CDF CIF 0 / RESTORE DATA AND INSTRUCT FIELDS. JMP I B7600 / GO TO MONITOR. / START OF ACTUAL CMDSUB SDNF JMP CMDSUB+2 / INCLUDE CTRL C CHECKER. TAD CALADR / RESTORE COMMAND. LCDR / LOAD IT. JMP I CMDSUB / CALADR - CALCULATE PAGE ADDRESS AND OFFSETS. CALADR, 0 TAD CALADR; AND B7600 TAD (ERRCNT-200; DCA JXEQSUB JMP I CALADR / DRIVER ENTRANCE FOR DRIVE # 0. ENTDX0, 0 B7600, CLA+400 JMP DRV0ENT IFNZRO ENTDX0-230 <?!*ERROR*!?> MCTRLC, 175 / DRIVER ENTRANCE FOR DRIVE # 1. ENTDX1, 0 CLA TAD ENTDX1; DCA ENTDX0 STL RTL / AC = 2, L=0 JMP DRV0EN IFNZRO ENTDX1-234 <?!*ERROR*!?> /DRIVER ENTRANCE FOR DRIVE # 2. DSKADL, / OVERLAP THIS ENTRANCE WITH 4*BLOCK # ENTDX2, 0 CLA; TAD ENTDX2; DCA ENTDX0 CLA IAC CLL RTL / AC=4, L=0 DRV0EN, STL RTL / AC = 2, 12, 22 FOR DRV 0, 1, 2. RAL / DRIVE 0 = 4, DRIVE 1 = 24, DRIVE 3 = 44 DCA UNITCD / UNIT CODE RDF / GET CALLING FIELD. TAD CDIFZR DCA CDFRET / SET UP RETURN FIELD. CLA STL RAR / AC = 4000, L=0 TAD I ENTDX0 / FUNCTION WORD AND P70 / GET TRANSFER FIELD. TAD CDFDAT DCA XFRFLD / SET DATA TRANSFER FIELD. CML RTL / AC=0 IF WRITE, =2 IF READ. DCA FUNCT TAD FUNCT; TAD UNITCD; DCA UNITCD /SET UP FOR XEQSUB TAD I ENTDX0 / GET PAGE COUNT RAL / MAKE INTO WORD COUNT. AND B7600 CIA / MAKE INTO - WORD COUNT. DCA WRDCNT ISZ ENTDX0 TAD I ENTDX0 / GET TRANSFER ADDRESS. DCA TRNADR ISZ ENTDX0 TAD I ENTDX0 / GET FLOPPY BLOCK #. MQL / DISPLAY IT. TAD I ENTDX0 / SET UP FOR SECTOR MAPPING. CLL RTL / 4 * BLOCK #. DCA DSKADR ISZ ENTDX0 CDF 0 / INIT TO FIELD 0 FOR PTR LOAD JMS CALADR / CALCULATE PAGE ADDRESS. TAD RETRYC; DCA I JXEQSUB / SET RETRY COUNTER. ISZ JXEQSUB / BUMP TO SUBROUTINE ENT. / PRESERVE TRNADR, WRDCNT FOR RESTORE ON RETRY. TAD DSKADR; DCA DSKADL / DO TOTAL RETRY ON ERROR. TAD WRDCNT; DCA WRDCNL / SAVE INITIAL WRDCNT TAD TRNADR; DCA TRNADL / SAVE INITIAL TRANSFER ADDR. / DO THE READ OR WRITE. DORDWT, TAD FUNCT; SNA CLA; JMP RDWRITE / 2 => READ. TRNDTL, TAD WRDCNT; AND B77 / NEW SECTOR ? SZA CLA; JMP XFDTA / NO - TRANSFER DATA. CDFDAT, CDF 0 JMS I JXEQSUB JMP RETRY / RESTORE WRDCNT, TRNADR ISZ DSKADR RDWRIT, TAD FUNCT JMS CMDSUB / DO FILL OR EMPTY BUFFER CMD. XFRFLD, CDF 0 / LOADED IN CALL SEQ. DECODE. XFDTA, TAD I TRNADR STRF; JMP .-1 XDR / TRANSFER A WORD OF DATA. DCA I TRNADR ISZ TRNADR P70, 70 ISZ WRDCNT; JMP TRNDTL CDF 0 / DATA FIELD 0 FOR XEQSUB TAD FUNCT; SZA CLA; JMP .+3 JMS I JXEQSUB; JMP RETRY / DO FINAL WRITE. ISZ ENTDX0 / DO OK RETURN CDFRET, CDF CIF 0 JMP I ENTDX0 / RETRY - RESET PARAMS BACK TO BEGIN OF SECTOR AND DO-RD-WT RETRY, TAD DSKADL; DCA DSKADR / RE-INIT VARIABLES FOR RETRY TAD TRNADL; DCA TRNADR / TRANSFER ADDRESS. TAD WRDCNL; DCA WRDCNT / AND WORD COUNT JMP DORDWT / RELOAD SECTOR BUFF AND RETRY. TRNADL, 0 WRDCNL, 0 RETRYC, -6 / RETRY 5 TIMES AFTER INITIAL ERROR. B77, 77 TRNADR, 0 / CORE TRANSFER ADDRESS. WRDCNT, 0 / - # WORDS TO BE TRANSFERRED. JXEQSUB, XEQSUB / CALCULATED RUN-TIME PTR TO XEQSUB PAGE
/ XEQSUB - XEQUTE A READ OR WRITE SECTOR. ERRCNT, 0 / RETRY COUNTER SET BEFORE CALL. XEQSUB, 0 TAD XEQSUB; AND P7600 / GET CALLING PAGE DCA JFNCTU / POINTER TO FUNCTION WORD + UNIT TAD JFNCTU; IAC; DCA JDSKADR TAD I JFNCTU / 2=READ, 0=WRITE. JMS WLCDSB / WAIT TILL PREVIOUS OPERATION FIN. DCA TRACK STL TAD I JDSKADR CNVLP, SZL ISZ TRACK TAD M13D / SECTORS / TRACK REVOLUTION. SMA; JMP CNVLP CML RAL / 2*(-#SECTORS+LINK VAL) TAD P27 / MAKE INTO SECTOR OFFSET. STRF; JMP .-1 XDR / LOAD THE SECTOR CLA / AC UNCHANGED BY XDR IN TAD TRACK STRF; JMP .-1 XDR / LOAD THE TRACK P7600, CLA+400 TAD P7130 / DO A NOP COMMAND TO RAISE DONE AGAIN JMS WLCDSB SERF; JMP NOERRT / DO NORMAL SKIP RETURN / ERROR DETECTED - PRINT COMPLETE STATUS. PNTERR, TAD P155; JMS PCHAR / CR TAD P152; JMS PCHAR / LF JMS PRINTC; 6564 / "UT= " TAD I JFNCTU / 4, 24, 44 ( + 2 IF READ) CLL RAR / 0 0 0 0 0 0 0 U U 0 1 R JMS PNTOCT / UNIT+2 IF WRITE, UNIT+3 IF RD JMS PRINTC; 4253 / "BK= " TAD I JDSKAD / 4 * OS/8 BLK # CLL RAR; CLL RAR JMS PNTOCT JMS PRINTC; 6364 / "ST= " XDR / STATUS FLAGS JMS PNTOCT TAD CMDERF; JMS WLCDSB / DO A "READ DEFINITIVE STT JMS PRINTC; 4543 / "EC= " XDR JMS PNTOCT INIT ISZ ERRCNT; JMP I XEQSUB / DIRECT RETURN = ERROR P7130, STL RAR ISZ JFNCTU / BUMP FOR FATAL ERR RETURN JMP I JFNCTU / RETURN TO FATERR EXIT NOERRT, ISZ XEQSUB; JMP I XEQSUB / DO SKIP RETURN. JFNCTU, 0 / POINTER TO UNIT CODE + FUNCTION JDSKAD, 0 TRACK, 0 CMDERF, 116 / DEFINITIVE ERROR STATUS FUNCTION. (8 BIT MODE) P27, 33 M13D, -15 / WLCDSB - WAIT AND LOAD COMMAND SUB WLCDSB, 0 SDNF; JMP .-1 LCDR JMP I WLCDSB
*525 PNTOCT, 0 DCA TEMPC P152, TAD M4; DCA TEMP1 JMS PRINTC; 3500 / PRINT "= " PNTOLP, TAD TEMPC; CLL RTL; RAL; DCA TEMPC TAD TEMPC; RAL; AND P7 / GET A DIGIT. TAD P20; JMS PCHAR ISZ TEMP1; JMP PNTOLP JMS PRINTC TEMP1, 0 / USE AS 0 FOR 2 SPACES JMP I PNTOCT TEMPC, 0 / OCTPNT TEMPORARY OFR NUMBER SAVE. M4, -4 P7, 7 P77, 77 P240, 240 P20, 20 PRINTC, 0 TAD I PRINTC; BSW / CAUTION ON NON 8-E MACHINES AND P77; JMS PCHAR TAD I PRINTC; AND P77; JMS PCHAR ISZ PRINTC JMP I PRINTC PCHAR, 0 P155, TAD P240 TLS TSF; JMP .-1 CLA JMP I PCHAR $ $ $ $ $ $ $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search