home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
pdp8
/
os278-src.tar.Z
/
os278-src.tar
/
rx5a.pa
< prev
next >
Wrap
Text File
|
1992-09-18
|
10KB
|
427 lines
/RX5A.PA NON-SYSTEM HANDLER FOR RX50 DRIVE PAIR A
/
/
/
/
/
/
/
/
/COPYRIGHT (C) 1982, 1984 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION. DIGITAL EQUIPMENT CORPORATION 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 DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
/DEFINITIONS OF RX8/E IOT'S
RXVER= 0262 /VERSION = B2
NOCHK= 0 / 0 = NO CTRL C CHECK, 1 = CTRL C CHECK
DEVCOD= 750 /DEVICECODE
SEL= 6000+DEVCOD /SELECT DRIVE PAIR A OR B WITH AC<11>
LCD= 6001+DEVCOD /LOAD COMMAND REGISTER
XDR= 6002+DEVCOD /TRANSFER DATA REGISTER
STR= 6003+DEVCOD /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG
SER= 6004+DEVCOD /SKIP ON ERROR FLAG, CLEAR FLAG
SDN= 6005+DEVCOD /SKIP ON DONE FLAG, CLEAR FLAG
INTR= 6006+DEVCOD /INTERRUPT ENABLE/DISABLE
INIT= 6007+DEVCOD /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES
/NOTES ON THIS HANDLER:
/THIS HANDLER READS AND WRITES THE DISK IN "12-BIT" MODE, IN WHICH
/ ONE RX50 SECTOR CONTAINS 256 WORDS. THIS INVOLVES SOME COMPLICATION
/TO SUPPORT THE ABILITY OF OS/8 TO READ AND WRITE AN ODD NUMBER OF PAGES
/( 256*N + 128 WORDS ). IN THE CASE OF AN ODD PAGE COUNT, THE HANDLER
/FILLS THE SECOND HALF OF THE LAST SECTOR WITH THE LAST DATA WORD ON WRITE
/AND DISCARDS THE SECOND HALF OF THE LAST SECTOR ON READING.
/THE ENTIRE DISK CONTAINS 800 OS/8 BLOCKS.
/ONLY 770 OF THE BLOCKS ARE USED. THE REMAINING 30 BLOCKS HAVE BEEN ALOCATED
/TO DECMATE II FIRMWARE.
/TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES
/ON A TRACK WITH A TWO-WAY INTERLEAVE.
/TRACK-SECTOR COMPUTATION IS DONE DURING I/O TO/FROM THE SILO
AC4000=CLL CLA CML RAR /SET AC TO 4000
AC7776=CLL CLA CMA RAL /SET AC TO 7776
AC0002=CLL CLA CML RTL /SET AC TO 0002
AC7775=CLL CLA CMA RTL /SET AC TO 7775
/BUILD DATA
*0
-2 /TWO ENTRY POINTS
DEVICE RX5A /DEVICE GROUP NAME
DEVICE RX50 /ENTRY POINT NAME
4300 /CODE FOR MULTI-RX
RX50&177+4000 /ENTRY POINT OFFSET
0
0
DEVICE RX5A /DEVICE GROUP NAME
DEVICE RX51 /ENTRY POINT NAME
4300
RX51&177+4000 /ENTRY POINT OFFSET
0
0
*200
/
/
/ INIT CODE
/
POINT, HLT /ADDR OF SECOND PAGE AT INIT TIME
UNIT, JMS I POINT /GO TO SECOND PAGE TO INIT
/
/ LIST OF VECTORS TO SECOND PAGE
/
LQUO, QUO-. /LQUO MUST LEAD OFF LIST
LRETRY, RETRY-.
LREC, REC-.
LREMD, REMD-.
LFN, FN-.
LDENSW, DENSW-.
LENTRY, ENTRY-.
LWAIT, WAIT-.
LERROR, ERRSET-.
VCOUNT=LQUO-.
JMP WHICH
L6, 6
LM6, -6
DECIMAL
L79, 79
SEEK, 79
OCTAL
/ ENTRY POINTS ARE AT 30, 34
/
*.&7600+30
RX50, RXVER
JMS ZOO /COMMON ENTRY ROUTINE
0 /UNIT 0
-1 /MINUS SAYS STILL HAVE TO INIT IT;
RX51, 0
JMS ZOO
20 /DRIVE 1
DOOR, JMP WHICH /INIT TIME LITERAL (MUST BE MINUS)
/GETS SAME TYPE CODE AS OTHER ENTRY POINT
/
/ COME HERE FROM ZOO
/
/ PROCESS ENTRY POINT, DEVICE TYPE
/
WHICH, CLL CLA
TAD LM6 /INIT RETRY COUNT
DCA I LRETRY
TAD I ZOO /GET DRIVE # (0 OR 1)
DCA UNIT /HOLD FOR LATER
ISZ ZOO /MOVE TO TYPE CODE
TAD I ZOO /HAS THIS DRIVE BEED INIT'ED
SMA CLA /SKIP IF NO
JMP NORMAL /GO TO NORMAL PATH
RSTART, SKP CLA
20
TAD .-1
DCA I ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT
L12, 12 /MAY SKIP
NORMAL, TAD L7400 / 256 WORDS PER SECTOR
DCA I LDENSW /PLACE FOR LOOP CONTROL
TAD UNIT /RX50
DCA I LFN /PLACE INTO FUNCTION CONTROL WORD
AC7775 /BACK UP ZOO TO FETCH CALLING ADDR
TAD ZOO
DCA T1 /HOLD TEMPORARY
TAD I T1 /HERE IS CALLING ADDR
CLLFLD, HLT /PUT CDF TO CALLING FIELD HERE
JMS I LENTRY /GO TO SECOND PAGE, LEAVING POINTER TO DIVSUB
/
/ DIVSUB SUBROUTINE !!MUST!! FOLLOW IMMEDIATELY
/
/ DIVSUB
/
/ CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR #
/ ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE
/
/ CALL WITH AC <0 IF IT IS REALLY AN ERROR RETRY
/ CALL WITH AC >=0 IF CALL TO DIVSUB
DIVSUB, 0
CDF 0 /AND DATA FIELD MUST BE TO HERE
SPA CLA /SKIP IF REALLY A DIVIDE REQUEST
JMP RECOVR /NO, IT WAS AN ERROR RETRY!!
DCA I LQUO /CLEAR DIVIDE QUOTIENT
RAR
DCA SAVL /SAVE THE CONTENTS OF THE LINK
TAD I LREC /THIS FOR TRACK-SECTOR
DIVLOO, ISZ I LQUO /MAIN DIIVIDIE LOOP
TAD LM12 /DIVIDE BY 10 TO GET TRACK
SMA /SKIP IF DONE
JMP DIVLOO
TAD L12 /REMAINDER 0-9
DCA T1 /HOLD IT IN TEMPORARY
TAD T1 /CALCULATE BLOCK NUMBER FOR AN
TAD T1 /INTERLEAVE OF 2
CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0
TAD LM12 /DIVIDE BY 10 TO GET SECTOR
SMA SZA /SKIP IF DONE
JMP .-2
TAD L12 /RESTORE POSITIVE VALUE TO BE SECTOR
DCA I LREMD
SNL CLA
ISZ I LREMD /COMPENSATE FOR ODD SECTOR
TAD SAVL
CLL RAL /RESTORE LINK
JMP I DIVSUB /OUT
SAVL, 0 /TEMPORARY SO WE CAN SAVE LINK THROUGH ALL THE
/EVIL ARITHMETIC
RECOVR, TAD SEEK /ERROR RETRY ROUTINE
SNA CLA /THIS WILL ALTERNATE BETWEEN TRACKS 1 AND 79
TAD L79
DCA SEEK
TAD UNIT /GET UNIT NUMBER
TAD L6
LCD /AND LOAD IT
JMS I LWAIT /WAIT FOR OPERATION TO COMPLETE
SKP /STR NORMAL RETURN
JMP I LERROR /DONE ERROR RETURN
IAC /SELECT SECTOR 1
XDR
JMS I LWAIT /WAIT FOR OPERATION TO FINISH
SKP
JMP I LERROR
TAD SEEK /SEEK TO TRACK 1 OR 79
XDR
JMS I LWAIT /WAIT FOR OPERATION TO COMPLETE
JMP I LERROR
JMP RSTART
LM12, -12
L7400, 7400
/
/
/
*.&7600+167 /FORCE TO END OF PAGE
/ ZOO SUBROUTINE
/
/ TO SET UP ENTRY POINT PROCESSING, AND INIT CODE
/
ZOO, 0 /ADDR OF 'HIT' ENTRY POINT +2 COMES HERE
CLA /FOR SAFETY
RDF /SAVE CALLERS FIELD SETTING
TAD LCDF0 /ADD IN CDF 0
DCA CLLFLD /RESET WHEN GOING TO I/O SUB
LCDF0, CDF 0 /DATA FIELD HERE FOR INDIRECTS
CLOSE, TAD DOOR /CLOSE DOOR TO ONCE ONLY CODE (JMP WHICH
T1, DCA CLOSE /USE ONCE-ONLY FOR TEMPORARY LOCATION
JMS POINT /LEAVE ADDR OF SECOND PAGE
/
/
/ VARIABLES, ALSO INIT CODE LIVES HERE
/
/
BUF, 0 /POINTER TO CALLER'S BUFFER
RETRY, 0 /RETRY COUNT
SYS, 0 /POINTER TO CALL
QUO, 0 /DIVIDE QUOTIENT, WHICH IS TRACK NUMBER
REC, 0 /SECTOR NUMBER OF FLOPPY
BC, 0 /CONTROL COUNT, WORDS TO TRANSFER
FN, 0 /0 FOR WRITE; 2 FOR READ; HEAD, DENSITY, UNIT
DENSW, 0 /GETS SET TO 7400 FOR SILO COUNT
ENTRY, 0 /ENTRY POINT, LEAVE ADDR OF DIVSUB HERE
/
IFNZRO .&177-10&4000 <_ERROR> /ENOUGH ROOM FOR INIT?
/
*.&7600
/
/ INIT TIME: FILL VECTOR TABLE
/
THERE, 0 /FILLED BY JMS, POINTS TO VECTOR
ILOOP, TAD THERE /POINTER IS ALSO OFFSET!
TAD I THERE /MAKING VECTOR
DCA I THERE
ISZ THERE /MOVE TO NEXT VECTOR
ISZ FLPWC /CONTROL COUNT ON THIS PAGE
JMP ILOOP
JMP I THERE /BACK TO FIRST PAGE
/
/ IO SUBROUTINE
/
/ ENTRY POINT AT END OF LAST LISTING PAGE
/
/
*ENTRY+1 /RESUME RUNTIME CODE
/
DCA SYS /POINTER TO ARG'S, EXIT
RDF /DATA FIELD OF USER CALL
TAD (CDF CIF 0 /MAKE CDF CIF TO CALLER'S FIELD
DCA EXFLD /SET UP FOR CALL
AC4000 /SET LINK=0, AC=4000
TAD I SYS /CARRY READ-WRITE BIT TO LINK
AND L70 /KEEP FIELD FOR BUFFER
TAD LLCDF0 /MAKE CDF TO BUFFER FIELD
DCA BUFCDF /PLACE INTO I/O LOOP
CML RTL /MAKE FUNCTION CODE, 0=WRITE, 2=READ
TAD FN /START-UP CODE HAS SET HEAD, DENSITY, UNIT ETC.
DCA FN
TAD I SYS /MAKE LOOP CONTROL COUNT
RAL
AND L7600
CIA /0 FOR WHOLE FIELD
DCA BC /MINUS TOTAL NUMBER OF WORDS
ISZ SYS
TAD I SYS /BUFFER ADDRESS
DCA BUF
ISZ SYS
TAD I SYS /STARTING BLOCK NUMBER
DCA REC
ISZ SYS /MOVE POINTER TO ERROR EXIT
JMS I ENTRY /CALL DIVISION SUBROUTINE OTHER PAGE
AC0002 /MASK OUT READ WRITE BIT
AND FN /SPLIT READ AND WRITE
SZA CLA /SKIP IF WRITE
JMP STREAD /READ GOES TO START IN MIDDLE OF LOOP
/WRITE FALLS THRU TO NEXT LISTING PAGE
/WRITE FALLS THRU TO THIS LOOP
/
/ TOP OF MAIN LOOP
/
TOP, TAD FN /SET SILO TO LOAD-UNLOAD
LCD /COMMAND TO CONTROLLER
TAD DENSW /MAKE SILO LOOP COUNT, 7400 FOR RX50
DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY
CLL /FLAG FOR BC OVERFLOW
BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE
TRLOOP, JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
TAD I BUF /IN CASE WRITE, FETCH A WORD
XDR /TO OR FROM AC
SZL /LINK SET IF BLOCK COUNT EXPIRED, ODD PAGE THING
JMP INCWC /THROUGH AWAY DATA, JUST COUNT TRANSFERS
DCA I BUF /STILL WORDS TO GET
ISZ BUF
REMD, 0 /HOME FOR SECTOR NUMBER, ALWAYS 00XY, HENCE NOP
ISZ BC /TEST FOR END OF TRANSFER
SKP /NO, GO ON
STL /YES
INCWC, CLA
ISZ FLPWC /256 WORD COUNTER
JMP TRLOOP
JMS WAIT /WAIT FOR SDN
JMP ERRSET
TAD BC /WENT TO ZERO IF TRANSFER COMPLETE
SZA CLA
JMP STREAD
AC0002 /SET AC = 2
AND FN /IF BC=0 AND DOING A READ THEN WERE DONE
SZA CLA
JMP EXIT
STL /INDICATES THAT BLOCK COUNT HAS EXPIRED
/
/ MIDDLE OF MAIN LOOP
/
STREAD, TAD K4 /LEAVE THE LINK ALONE
TAD FN /TURNING SILO COMMAND INTO READ-WRITE COMMAND
LCD /I/O COMMAND TO CONTROLLER
JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
TAD REMD /PRECOMPUTED SECTOR #
XDR
L7600, 7600 /CLEAR AC, AND IS LITERAL
JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
TAD QUO /TRACK #
XDR /TRACK # IS ALWAYS NON0 !!
ISZ REC /MOVE TO NEXT RECORD NUMBER
JMS I ENTRY /DO TRACK SECTOR FOR NEXT OPERATION
JMS WAIT /WAIT FOR SDN
JMP ERRSET
SNL CLA /EXIT IF LINK SET, DIVIDE ROUTINE MUST PRESERVE !!
JMP TOP /STILL MORE
EXIT, ISZ SYS /KICK TO OK EXIT
EXFLD, HLT /CDF CIF TO CALLER
JMP I SYS /OUT
K4, 4 /MAKES 0 GO TO 4 AND 2 GO TO 6
WAIT, 0
CLA
STR /TEST FOR XFER FLAG
SKP
JMP I WAIT /IF XFER FLAG SET RETURN TO CALLER +1
SDN /TEST DONE FLAG
JMP WAIT+2 /LOOP UNTIL STR OR SDN HAS SET
ISZ WAIT /DONE SET, SET UP RETURN TO CALLER +2
SER /IS THERE AN ERROR
JMP MONCHK /NO, CHECK KEYBOARD
ERRSET, AC4000 /ERROR CODE FOR HARD ERROR
ISZ RETRY
JMS I ENTRY /NO, -AC SAYS TO RETRY NOT DIVIDE!!!
JMP EXFLD /ERROR RETURN OUT
MONCHK,
RAR /SAVE THE LINK
DCA SAVLNK
IFNZRO NOCHK < KSF /IS K.B. FLAG SET > / Test for ctrl c
IFZERO NOCHK < NOP > / Don't test for ctrl c
JMP MONLEV /NO
KRB /YES
TAD M3 /LOOK FOR CTRL C
SZA CLA
JMP MONLEV /NOT CTRL C
LLCDF0, CDF 0 /CTRL C FOUND
JMP I L7600 /RETURN TO SYSTEM
MONLEV, TAD SAVLNK /RESTORE LINK
RAL
JMP I WAIT /RETURN TO CALLER
SAVLNK, 0
FLPWC, VCOUNT
L70, 70
M3, -3
PAGE