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
/
rx50sy.pa
< prev
next >
Wrap
Text File
|
1992-09-18
|
12KB
|
538 lines
/RX50SY.PA OS/78 V4 RX50 SYSTEM HANDLER
/
/
/
/
/
/
/
/
/COPYRIGHT (C) 1982 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.
/
/
/
/
/
/
/
/
/
/
VERSION=0262 /VERSION = B2
AC0001=CLL CLA IAC
AC0002=CLL CLA CML RTL
AC0006=CLL CLA CML IAC RTL
AC4000=CLL CLA CML RAR
AC3777=CLL CLA CMA RAR
AC7775=CLL CLA CMA RTL
/
/ DEVICE IOT 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
/ HEADER BLOCK
/RX50 DEVICE # IS 30
*0
-1
DEVICE RX50
DEVICE SYS
4300 /MULTI-TYPE RX HANDLER
SYS&177+6000 /TWO PAGE HANDLER
0 /UNUSED
DECIMAL
767 /SIZE OF RX50 = 770 DECIMAL
OCTAL
STBOOT-NDBOOT+12 /-SIZE (+12 FOR GAP)
/
/ PRIMARY BOOT
/
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.......
AC0006 /COMMON TO READ DISK
TAD UNIT /UNIT AND DENSITY
LCD /COMMAND TO CONTROLLER
AC0001 /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 A LITERAL
START, SDN /HAS DONE COME UP? CODE STARTS HERE!
JMP LOAD+1 /NO, GO CHECK FOR READY TO TRANSFER
SER /SKIP ON ERROR, TRY ANOTHER DENSITY ECT.
SNA /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 ONLY DENSITY BIT
TAD LITRAL /ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS
DCA RX1SAV /OLD SECONDARY BOOT MOVES IT TO HANDLER
CON360, 0360 /LITERAL; EXECUTES IN LINE AS A NO-OP
/FALLS INTO NEXT PAGE OF LISTING
JMS LOAD /GRAB NEXT ITEM FROM SILO
DCA 2 /TRADITION; SECONDARY BOOT STARTS AT 2
ISZ 50 /INCREMENT LOAD ADDRESS
JMP 47 /GO BACK FOR ANOTHER
/
/SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOC 47 IS LOADED,
/THEN CONTROL PASSES TO SECONDARY BOOT
LOAD, 0 /SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER
STR /IS RX READY
JMP START /NO, PERHAPS DONE WITH SILO, OR ERROR
XDR /YES,DATA IN OR OUT;IF DATA TO CONTROLLER,AC UNCHANGED
JMP I LOAD /NO MAGIC, JUST EXIT FROM SUBROUTINE
/
/61 GOES TO 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
/
RELOC 2 /SECTION LOADING OVER PRIMARY BOOT 2 - 47
STBOOT=.
0000 /SAVE ROOM FOR DISK ID.
0000
0000
0000
0000
0000
0000
0000
/
/ONLY-ONCE CODE AFTER FIRST SECTOR IS TRANSFERED
/
/SET UP AUTO INDEX REGISTERS
XR, 61 /CONTINUE TO LOAD FIRST SECTOR AT 62
YR, DAT02 /POINTER TO DATA AREA FOR NOW
ZR, 0 /ACCOUNT FOR THIS LOCATION USED BY MOVE
/
/SECTOR DONE, SETUP FOR NEXT
/
NEXSEC, JMP ONCE /END OF FIRST SECTOR, DO SET-UP CODE
CDF 0 /DATA FIELD HERE TO USE AUTO INCR REGISTERS
TAD I YR /GET DATA FIELD FOR PLACEMENT
SMA /SKIP IF MORE TO DO
JMP MOVE2 /MOVE SECOND HALF OF BLOCK 66 TO FIELD 2
DCA XFIELD /PLACE IN LINE TO SET DATA FIELD
AC0006 /GET AC OF 6 TO SET UP FLOPPY READ
TAD UNIT /ADD DENSITY AND UNIT
LCD
TAD I YR /SECTOR FOR NEXT READ
JMS LOAD /LOAD LEAVES AC ALONE
TAD I YR /TRACK-SECTOR FOR NEXT READ
JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT
TAD I YR /ADDRESS - TRACK - 1 FOR NEXT READ
/FALL TO HANGGG WITH AC NON0 TO SHWO READ
/
/THE FOLLOWING TWO LOCATIONS MUST MATCH PRIMARY BOOT
/
HANGGG, SDN /!! REQUIRED AT 33!! SKIP IF DONE
JMP LOAD+1 /NO, GO CHECK FOR TRANSFER READY
/SORT OUT ERROR, SILO DONE, READ DONE
SER /SKIP IF ERROR
SKP /IS GOOT, CHECK WHETHER READ OR SILO
HLT /******* FATAL ERROR *******
SNA /SKIP IF READY TO SILO (AC HAS LOAD ADDR)
JMP NEXSEC /DONE WITH SILO AC=0 GOTO NEXT SECTOR
DCA XR /USE AUTO INCR TO LOAD CORE
JMP OVRFLW /GO TO LOCATIONS NOT FITTING UNDER 47
/CODE TO EMPTY SILO INTO CORE
XFIELD, CDF 0 /FIELD FOR TRANSFER PLACED HERE
JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT
DCA I XR /PLACE NEXT WORD
JMP XFIELD /WHEN THIS LOCATION IS PLACED, SECONDARY BOOT
/TAKES CONTROL, CONTINUE FIRST SECTOR AT 62
/PRIMARY BOOT LOCATIONS 50-61 REMAIN INTACT
STATUS=. /REUSE FOR TEMPORY
/REST OF SECONDARY BOOT
RELOC 62 /SECTION LOADING 62 - 213
/LOCATIONS NO FITTING WITHIN 2-47 SPACE
OVRFLW, XDR /FETCH READ STATUS FOR LATER
DCA STATUS /TO FIGURE OUT IF A DOUBLE SIDED FLOPPY
AC0002 /CODE FOR SILO OPERATION
TAD UNIT /UNIT AND DENSITY
LCD /SET TO EMPTY SILO
JMP XFIELD /GO TO SILO UNLOADING LOOP
ONCE, JMS MOVE1 /TO MOVE SECOND HALF OF BLOCK 0 TO 07600 ON.
JMS NEXSEC /DESTROY LINKAGE TO ONCE ONLY CODE
MOVE1, 0 /MOVE 214-413 TO 7600-7777
TAD MOV1
DCA ZR
TAD K7577
DCA XR
TAD I ZR /FROM
DCA I XR /TO
TAD XR /TEST DONE
IAC /ENDS AT 7777
SZA CLA
JMP .-5
JMP I MOVE1
MOVE2, CLA CMA /MOVING FROM 10000-10177
DCA ZR
TAD K7577 /TO27600-27777
DCA XR
MOVE3, CDF 10
TAD I ZR
CDF 20
DCA I XR
TAD XR
IAC
SZA CLA
JMP MOVE3
TAD K12
CDF 0
JMP EBOOT
/DOUBLE DENSITY LOADING DATA
DAT02, 1374 /MAKE 400_UNIT WHEN ADDED TO 70X4
CDF 10
11 /LOAD BLOCK 66
6-11 /SECTOR 11 TRACK 6
7600-6-1
K12, 12 /MARKER TO STOP WHOLE THING, ALSO LITERAL 12
/I/O DONE GO TO HANDLER
EBOOT, CLA
TAD UNIT /REST OF CONTROL WORD
DCA I MAGIC /TO BOOTYP OF SYSTEM HANDLER
JMP I L7605 /START SYSTEM
MAGIC, BOOTYP
L7605, 7605
K7577, 7577
MOV1, 213
NDBOOT=.
/ CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS
QUO=7750 /QUOTIENT FOR DIVIDE == TRACK
REMD=7751 /REMAINDER FOR DIVIDE == SECTOR
REC=7752 /CURRENT LOGICAL SECTOR NUMBER
RETRY=7753 /RETRIES COUNT
RELOC
*0200
RELOC 7600
/USUALLY THE FIRST 7 LOCATIONS ARE FILLED WITH A ZBLOCK 7
/ALTHOUGH THESE COMMANDS ARE COMPILED WITH THE HANDLER THE
/SYSTEM WILL OVER WRITE THESE LOCATIONS WITH THE SAME INFORMATION
/THIS WAS DONE FOR CONVIENCE
JMS SYS /CALL SYSTEM HANDLER
5000 /WRITE 10 PAGES -- 5 BLOCKS
0000 /START AT MEM ADDRESS 0
0033 /PUT INFO INTO SYSTEM SCRATCH AREA BLK 33
CLA HLT
CIF CDF 10 /CHANGE FIELD TO 1
JMP 7667 /THIS JMP IS A CALL TO LOAD THE KEYBOARD MONITOR
/ENTRY
SYS, VERSION
CLL CLA
L12, 12
3 /!!REQUIRED AT 7612!! TO SHOW OS78 2 PAGE HANDLER
TAD LM6
DCA RETRY
RDF /GET FIELD OF CALLING ROUTINE
TAD LLCDF0 /MAKE A CDF OUT OF IT
DCA RESTOR /PUT IT BACK, GO TO I/O ROUTINE ON PAGE 2
JMP RSTART /GO CALL SECOND PAGE, IOTYP FALLS THRU TO HERE
IOTYP, 0
LLCDF0, CDF 0
BOOTYP, 0 /!!MUST BE AT 7623 GETS HIT BY SECONDARY BOOT
LM12, -12
L6, 6
LM6, -6
*7635
RSTART, AC3777 /MAKE A WORD WITH DENSITY AND UNIT BITS ONLY
AND BOOTYP /FOR CONSTRUCTING LCD ARGUMENTS
DCA IOTYP /ALSO SHUTS OFF PATH TO ONCE-ONLY CODE!
TAD SYS /AC HAS THE CALL ADDR
RESTOR, HLT /SET DATA FIELD TO CALLING ROUTINE
CIF 20 /!! CDF,CIF OR CID MUST BE AT 7642
JMP PAGE2 /FOR FRTS TO WORK
/
/ ERROR RECOVERY ROUTINE
/ RETRACT HEAD TO TRACK 0
/ RETRY HANDLER CALL FROM SCRATCH
/
RECOVR, TAD L6 /DO A READ
TAD IOTYP /ADD DRIVE NUMBER
LCD /LOAD IT
STR
JMP .-1
CLA IAC /READ SECTOR 1
XDR
STR
JMP .-1
CLL CLA /TRACK 0
XDR
SDN /WAIT FOR OPERATION TO FINISH
JMP .-1
SER /CLEAR ANY ERROR CONDITIONS
NOP
JMP RSTART /RETRY LAST OPERATION
*7677
/ CALL WITH AC <> 0 TO DO DIVIDE
/ CALL WITH AC = 0 TO DO I/O RETRY (WHOLE OPERATION)
DIVSUB, 0
SKP /!!FAULTY USR CALL DOES JMS HERE (7700)!!
HLT /****************************************
SNA CLA /SKIP IF REALLY A DIVIDE REQUEST
JMP RECOVR /NO, IT WAS AN ERROR RETRY!!
RAR
DCA SAVL /SAVE THE LINK
DCA QUO /CLEAR DIVIDE QUOTIENT
TAD REC /THIS FOR TRACK-SECTOR
DIVLOO, ISZ QUO /MAIN DIVIDE BY 12 TO GET TRACK
TAD LM12 /DIVIDE BY 12 TO GET TRACK
SMA /SKIP IF DONE
JMP DIVLOO
TAD L12 /REMAINDER 0-11
DCA REMD /USE AS TEMPORY UNTIL FINAL VALUE
TAD REMD /*2 FOR INTERLEAVE
TAD REMD
CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0
TAD LM12 /DIVIDE BY 12 TO GET SECTOR
SMA SZA /SKIP IF DONE
JMP .-2
TAD L12 /RESTORE POSITIVE VALUE TO BE SECTOR
DCA REMD
SNL CLA
ISZ REMD /COMPENSATE FOR ODD SECTOR
TAD SAVL /RESTORE LINK
CLL RAL
CIF 20 /GO BACK TO OTHER PAGE
JMP I DIVSUB
SAVL, 0
ZBLOCK 7744-. /!! 7743 IS THE LAST USABLE LOCATION
/7744-7777 IS USED BY THE MONITOR
/ SECOND PAGE
RELOC
*400
RELOC 7600
/
/ FETCH ARGUMENTS, ETC.
/
PAGE2, DCA FETCH /ENTER WITH ARGUMENT LIST ADDR IN AC
RDF /SAFE HERE?
TAD LCDIF0 /SET UP EXIT TO CALLER
DCA EXFLD
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 RTL /0=WRITE, 2=READ
DCA FN
TAD I FETCH /MAKE CONTROL COUNT FOR TRANSFER
RAL
AND L7600 /COUNT OF WORDS
CIA /0 FOR WHOLE FIELD
DCA BC
ISZ FETCH /NEXT ARGUMENT
TAD I FETCH /BUFFER ADDRESS
DCA BUF
ISZ FETCH /NEXT
TAD I FETCH /BLOCK ADDRESS
ISZ FETCH /MOVING POINTER TO ERROR EXIT
CDF 0 /INDIRECT TO FIRST PAGE FOR CONSTANTS
DCA I LREC /SAVE BLOCK #
CLA IAC /DIVSUB WANTS A NON ZERO AC FOR DIVIDE
LCDIF0, CIF CDF 0 /GO BACK TO FIRST PAGE
JMS DIVSUB /SET UP TRACK AND SECTOR
AC0002
AND FN /SPLIT READ AND WRITE
SZA CLA /WRITE SKIPS
JMP STREAD /READ STARTS IN MIDDLE OF LOOP
/WRITE FALLS TO NEXT LISTING PAGE
/WRITE FALLS THRU TO THIS LOOP
/ TOP OF MAIN LOOP
TOP, TAD FN /SET SILO TO LOAD-UNLOAD
JMS LDCMD /COMMAND TO CONTROLLER
TAD DENSW /MAKE SILOCOUNT TO 7400
DCA FLPWC
CLL /FOR HALF BLOCK TRANSFERS
BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE
TRLOOP, JMS WAIT /WAIT UNTIL READY TO PASS DATA
SKP /STR NORMAL RETRUN
JMP ERROR /ERROR TRY AGAIN
TAD I BUF /IN CASE OF WRITE, FETCH A WORD
XDR /TO OR FROM AC
SZL
JMP INCWC
DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME
ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP)
L70, 70
ISZ BC /FOR HALF PAGE
SKP
STL
INCWC, CLA
ISZ FLPWC /DONE YET
JMP TRLOOP
JMS WAIT /WAIT FOR SDN
JMP ERROR
TAD BC /LOOP CONTROL TO FINISH READ
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
/
/ MIDDLE OF MAIN LOOP
/
STREAD, TAD FN /READ STARTS HERE
TAD L4 /TURN SILO COMMAND INTO READ-WRITE COMMAND
JMS LDCMD /I/O COMMAND TO CONTROLLER
JMS WAIT /WAIT FOR STR
SKP
JMP ERROR
TAD I LREMD /PRECOMPUTED SECTOR #; LDCMD SET FIELD TO 0
XDR
L7600, 7600 /CLEAR AC, AND IS LITERAL
JMS WAIT /WAIT FOR STR
SKP
JMP ERROR
TAD I LQUO /TRACK #
XDR /TRACK # IS ALWAYS NON0 !!
ISZ I LREC /MOVE TO NEXT RECORD NUMBER
BACKER, CDF CIF 0 /GO BACK TO FIRST PAGE
JMS DIVSUB /FOR TRACK AND SECTOR AC=0 SAYS RETRY
JMS WAIT /WAIT FOR SDN
JMP ERROR
SNL CLA
JMP TOP /STILL MORE
EXIT, ISZ FETCH /KICK TO OK EXIT
EXFLD, HLT /CDF CIF TO CALLER
JMP I FETCH /OUT
/ LDCMD SUBROUTINE
FLPWC=. /ENTRY POINT A SAFE COUNT TEMPORARY
LDCMD, 0 /CALL TO GIVE COMMAND TO CONTROLLER
LCDF0, CDF 0 /INDIRECTS BACK TO FIRST PAGE
TAD I LIOTYP /PUT IN UNIT, DENSITY, HEAD
LCD /COMMAND
JMP I LDCMD
WAIT, 0
STR /TEST XFER FLAG
SKP
JMP I WAIT /IF XFER FLAG SET GOTO CALLER +1
SDN /TEST DONE FLAG
JMP WAIT+1 /LOOP UNTIL STR OR SDN HAVE COMPLETED
ISZ WAIT /DONE SET SET UP RETURN TO CALLER +2
SER /SKIP IF AN ERROR
JMP I WAIT /RETURN
ERROR, CDF 0
CLA
ISZ I LRETRY /TRIED ENOUGH TIMES ALREADY?
JMP BACKER /TO DIVSUB WITH AC=0 TO RETRY !!!!!
AC4000 /HARD ERROR, GIVE BACK MINUS RESULT
JMP EXFLD
/
/ VARIABLES ETC.
/
BUF, 0 /POINTER TO CALLER'S BUFFER
FETCH, 0 /POINTER TO CALL
BC, 0 /CONTROL COUNT, WORDS TO TRANSFER
FN, 0 /0 FOR WRITE, 2 FOR READ
DENSW, 7400
/
/ LITERALS
/
L4, 4
LIOTYP, IOTYP /POINTERS BACK TO FIRST PAGE
LRETRY, RETRY
LQUO, QUO
LREC, REC
LREMD, REMD