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
/
r1ab.pa
< prev
next >
Wrap
Text File
|
1992-09-18
|
12KB
|
536 lines
/R1AB.PA RL02 DRIVE 1 DEV A & B NON-SYSTEM HANDLER FOR OS78 V4
/RL20: RL02 DRIVE 0 NON-SYSTEM HANDLER
/
/
/
/
/
/
/
/
/
/COPYRIGHT (C) 1977, 1981, 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.
/
/
/
/
/
/
/
/
/
/
/RL02 DRIVE 0 NON-SYSTEM HANDLER
VERSION="B&77^100!61 //V4 OS78 IS B1
NOCHK= 0 / 0 = No ctrl c test, 1 = test
/NOTES:
/1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED.
/EDIT HISTORY:
/13-OCT-77 CREATION
/10-MAY-79 MODIFY FOR RL02 SUPPORT
/DEC 80 MODIFY TO SUPPORT DRIVES 2 & 3
/13-AUG-84 ADDED CTRL C CHECK CONDITIONAL
/INSTRUCTIONS THAT GENERATE CONSTANTS
AC0001=CLA IAC
AC0002=CLA CLL CML RTL
AC0003=CLA CLL CML IAC RAL /*
AC0004=CLA CLL IAC RTL /*
AC0006=CLA CLL CML IAC RTL /*
AC0100=CLA IAC BSW /*
AC2000=CLA CLL CML RTR
AC3777=CLA CLL CMA RAR
AC4000=CLA CLL CML RAR
AC5777=CLA CLL CMA RTR
AC6000=CLA CLL CML IAC RTR /*
AC7775=CLA CLL CMA RTL
AC7776=CLA CLL CMA RAL
/* USE ONLY ON VT-78 AND PDP-8E,F,M,A
/ID CODE AT START OF BAD BLOCK LIST (BBL)
ID=123
/BAD BLOCK LIST FORMAT:
/WORD CONTENTS
/0 ID (IDENTIFICATION CODE)
/1 BAD BLOCKS FOR DEVICE A (ASCENDING ORDER)
/... ...
/10 0 (TERMINATOR FOR LIST A)
/11 BAD BLOCKS FOR DEVICE B (ASCENDING ORDER)
/... ...
/20 0 (TERMINATOR FOR LIST B)
/21 BAD BLOCKS FOR DEVICE C (ASCENDING ORDER)
/... ...
/30 0 (TERMINATOR FOR LIST C)
/31 BAD BLOCKS FOR DEVICE D (ASCENDING ORDER)
/... ...
/40 0 (TERMINATOR FOR LIST D)
/ DEFINITIONS
RLIOT=6600
RLDC=RLIOT 0 /CLEAR DEVICE
RLSD=RLIOT 1 /SKIP IF DONE
RLMA=RLIOT 2 /LOAD MEM ADDR
RLCA=RLIOT 3 /LOAD REGISTER "A"
RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE
RLSA=RLIOT 5 /LOAD SECTOR ADDR
/RLIOT 6 UNUSED
RLWC=RLIOT 7 /LOAD WORD COUNT
RRER=RLIOT 10 /READ ERROR REG
RRWC=RLIOT 11 /READ WORD COUNT
RRCA=RLIOT 12 /READ REG "A"
RRCB=RLIOT 13 /READ REG "B"
RRSA=RLIOT 14 /READ SECTOR ADDR
RRSI=RLIOT 15 /READ SILO BYTE
/RLIOT 16 UNUSED
RLSE=RLIOT 17 /SKIP IF ERROR
/RLCB FUNCTION BITS:
RLMT=0 /MAINTENANCE MODE
RLRE=1 /RESET DRIVE ERRORS
RLST=2 /READ STATUS REGS INTO SILO
RLSK=3 /SEEK
RLRH=4 /READ HEADER
RLWR=5 /WRITE
RLRD=6 /READ
RLRN=7 /READ WITH NO HEADER CHECK
/BIT DEFINITIONS IN REGISTERS:
BYTE=1000 /BYTE TRANSFER MODE
/LOGICAL DEVICE (RELATIVE) ENTRY POINTS FOR RL02 HANDLERS:
/DEVICE A B C D E
/DRIVE 0 117 113 106 77 145
/ 1 120 114 107 100 151
/ 2 121 115 110 101 155
/ 3 122 116 111 102 161
/OS78 V4 RELEASE DIVIDES THE DRIVES INTO THREE LOGICAL DRIVES OF TWO
/LOGICAL DEVICES EACH. ENTRY POINTS REMAIN THE SAME AS ABOVE.
/ HANDLER DEVICES
/ R0AB A & B DRIVE 0
/ R0CD C & D
/ R1AB A & B DRIVE 1
/ R1CD C & D
/ R01E DRIVE 0 DEV E, DRIVE 1 DEV E (THE "THIRD" DRIVE)
/HEADER BLOCK FOR USE BY "BUILD"
*0
-2 /- NUMBER OF LOGICAL DEVICES PER HANDLER
/FORMAT OF ENTRIES IN HEADER BLOCK:
/WORD DESCRIPTION
/0 GROUP NAME (4 CHAR)
/2 DEVICE NAME (4 CHAR)
/4 DCB WORD FOR AN RL02 (TYPE 37); IS A DIRECTORY DEVICE.
/5 OFFSET TO ENTRY POINT; 2-PAGE INDICATOR.
/6 0 (UNUSED WORD)
/7 0 TO REPRESENT NON-SYSTEM DEVICE
DRIVE=1
DEVICE R1AB;DEVICE R21A;4370;RLA&177+4000;0;0
DEVICE R1AB;DEVICE R21B;4370;RLB&177+4000;0;0
/DEVICE R1CD;DEVICE R21C;4370;RLC&177+4000;0;0
/DEVICE R1CD;DEVICE R21D;4370;RLD&177+4000;0;0
/HANDLER CODE
*200 /FIRST PAGE
/THIS LOC IS SET TO ADDR OF NEXT PAGE BY ONCE-ONLY CODE
GO, 0 /ADDR OF MAIN
BBL, /-----BOUNDARY OF BAD BLOCK LIST-----
/ONCE-ONLY CODE, REPLACED BY BAD BLOCK LIST
/READ IN BAD BLOCK LIST (BBL)
/SAVE CALLING DATA FIELD
RDF
TAD OOCDF
DCA BACK
OOCDF, CDF 00 /SET TO CURRENT FIELD
/REPLACE ONCE-ONLY JUMP INSTRUCTION
TAD JMPSET
DCA ONCE
LOOP, TAD LIST /RELOCATE CROSS-PAGE REFERENCES;
/SCAN "LIST" FOR RELATIVE LOCATIONS
/OF VALUES TO BE RELOCATED
SNA /0 ACTS AS TERMINATOR
JMP OUT
TAD GO /RELOCATE RELATIVE ADDRESS
DCA ONLY /"ONLY" IS NOW TEMP STORAGE
ISZ LOOP /NEXT VALUE
TAD GO
TAD I ONLY /RELOCATE THE CONTENTS
DCA I ONLY
JMP LOOP /CONTINUE UNTIL DONE
/LIST OF RELATIVE ADDRESSES TO MODIFY
LIST, BARG-MAIN
ABLOCK-MAIN
BBBL-MAIN
AMA-MAIN
ASECT-MAIN
ATRACK-MAIN
MA-MAIN
AERROR-MAIN
ZBLOCK 10+DRIVE /POSITION ENTRY POINTS TO BE UNIQUE FOR EACH
/LOGICAL DEVICE. MUST HAVE AT LEAST ONE 0
/HERE FOR TERMINATOR TO LIST.
OUT, JMS I GO /READ BAD BLOCK LIST
OK, CLA /COULD TAKE THESE NEXT 2 OUT SINCE BBL READ-IN
BACK, CDF /IS INITIALIZED TO THE SAME THING. (THIS IS 1 SHOT)
JMPSET, JMP SET /SETUP FOR TRANSFER
/END OF ONCE ONLY CODE. OK MUST BE HIGHER THAN 41 FOR RETURN
/SETUP ARGS FOR CALL TO 2ND PAGE SUBROUTINE
/CALCULATE TRACK AND SECTOR FROM BLOCK.
/ - - - ! - - - ! - - - ! - - -
/ 0-6 BECOME CYL ! 8-11 BECOME SECTOR, AFTER FUDGING TO SKIP FOR E DEVICE
/ !
/ 7 BECOMES THE "HEAD" BIT (1=UPPER)
MAPPED, TAD I ABLOCK
RTR
RTR
AND A377
TAD OFFSET /DEVICE OFFSET (0 OR 400)
DCA I ATRACK
TAD I ABLOCK /CALCULATE SECTOR FROM BLOCK
AND A17 /SECTOR CODE
CLL RTL
TAD A7751
SPA
TAD A47
BSW
DCA I ASECT
/TRANSFER 1ST PAGE OF BLOCK
JMS I GO
TAD A200 /INCREMENT MA
TAD I AMA
DCA I AMA
/INCREMENT SECTOR
TAD A200
TAD I ASECT
DCA I ASECT
/TRANSFER 2ND PAGE OF BLOCK
JMS I GO
TAD A200 /INCREMENT MA
TAD I AMA
DCA I AMA
/CONTINUE WITH NEXT BLOCK
JMP NEXT
/ENTRY POINT FOR DEVICE D
RLD, VERSION
CLA CLL
TAD RLD
DCA RLB
AC0004 /TRACK OFFSET WILL BE 1400
CENT, TAD A10
JMP START /SKIP AROUND RLA ENTRY POINT
/ENTRY POINT FOR DEVICE C
RLC, VERSION
CLA CLL
TAD RLC
DCA RLB
JMP CENT /TRACK OFFSET WILL BE 1000
/ENTRY POINT FOR DEVICE B
RLB, VERSION
AC0004 /TRACK OFFSET WILL BE 400
JMP START /SKIP AROUND RLA ENTRY POINT
OFFSET, 0 /TRACK OFFSET FOR DEVICE (0 OR 400)
/ENTRY POINT FOR DEVICE A
RLA, VERSION
A7600, 7600 /=CLA
TAD RLA /TRANSFER CALLING ADDR
DCA RLB
START, BSW /SET OFFSET TO 0 IF DEV A, 400 IF DEV B
DCA OFFSET
TAD A7600 /RETURN TO KEYBOARD MONITOR
IFNZRO NOCHK < KRS > /IF CTRL,C TYPED
IFZERO NOCHK < NOP >
TAD A175 /-CTRL,C
SNA CLA
KSF
ONCE, JMP ONLY /THIS INSTRUCTION IS DONE ONCE ONLY. IT IS
/THEN CHANGED TO "JMP SET" AFTER HANDLER RELOCATION
/IS DONE AND THE BAD BLOCK LIST IS READ IN.
ACDIF, CIF CDF 00
JMP I A7600 /CALL KB MONITOR
/SET UP ARGUMENTS BY CALLING 2ND PAGE SUBROUTINE
SET, TAD OFFSET /INITIALIZE MAPPING (BELOW)
BSW
CLL RAL /0=DEV A, 10=B, 20=C, 30=D
TAD BASE
DCA MAP
TAD RLB /ADDR OF ARGS
JMS I GO /SETUP (AC NON-ZERO)
/MAP NEXT BLOCK AROUND ANY BAD BLOCKS BELOW IT
MAP, TAD /INITIALIZED ABOVE
SNA /0 TERMINATES LIST
JMP MAPPED
STL CIA /13-BIT NEGATE
TAD I ABLOCK /COMPARE WITH BLOCK
SZL CLA
JMP MAPPED /BAD BLOCK IS ABOVE CURRENT BLOCK
ISZ MAP /TRY NEXT BAD BLOCK ALSO
NEXT, ISZ I ABLOCK /INCREMENT CURRENT BLOCK NUMBER,
/EITHER DURING
/BAD BLOCK MAPPING OR AFTER SUCCESSFUL TRANSFER
/OF TWO SECTORS (PAGES) WITH MORE TO GO
JMP MAP /CONTINUE MAPPING
JMP I AERROR /ERROR ON BLOCK OVERFLOW
/DATA
A10, 10
A17, 17
A47, 47
A175, 175
A200, 200
A377, 377
A7751, 7751
BASE, TAD BBL+1
ABLOCK, BLOCK-MAIN
AMA, MA-MAIN /RELATIVE ADDR OF MA
ASECT, SECTOR-MAIN
ATRACK, TRACK-MAIN
AERROR, ERROR-MAIN
ZBLOCK 377-.
/ONCE-ONLY CODE AT END OF PAGE
ONLY, JMS GO /SET UP CROSS-PAGE LINK USED ON INITIALIZATION.
/2ND PAGE IN LOC "GO"
*400
/2ND PAGE OF HANDLER
/SUBROUTINE TO SETUP AND TRANSFER
/AC=0 FOR TRANSFER ELSE SETUP
MAIN, 0
SNA
JMP TRANS
/GET HANDLER ARGUMENTS
SETUP, DCA BARG /ADDR OF HANDLER ARGS
AC4000 /SET "OLDTRK" TO INVALID TRACK
DCA OLDTRK /TO FORCE READING NEXT HEADER.
TAD B7600 /SET FOR FULL PAGE TRANSFERS
DCA WC /(WAS SMALLER FOR BBL READ)
TAD I BARG /NOW GET HANDLER ARGUMENTS
/FUNCTION WORD
/NOTE: THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT
B377, AND B4070 /CONVERT TO RLCB FORMAT
SPA
TAD B3777
TAD BRLRD
DCA FNC
TAD I BARG /FUNCTION WORD
RAL /CONVERT TO PAGE COUNT IN BITS [7600]
AND B7600
DCA PAGES
ISZ BARG
TAD I BARG /MA
DCA MA
ISZ BARG
TAD I BARG /BLOCK
DCA BLOCK
ISZ BARG
/SAVE CALLING FIELD FOR RETURN
RDF
TAD BCDIF
DCA BRTN
/RESET DATA FIELD AND RETURN FROM SETUP WITH AC=BLOCK
BCDIF, CIF CDF 00
/GET DEVICE OFFSET FROM 1ST PAGE
TAD I BBBL /CHECK FOR BBL VALIDITY -
TAD CHECK /1ST LOC OF BBL CONTAINS AN
SZA CLA /IDENTIFICATION CODE ("ID")
JMP ERROR /TAKE ERROR RETURN FROM HANDLER
/IF BBL IS INVALID.
JMP I MAIN
/TRANSFER ONE OR MORE PAGES TO/FROM DISK
/GET INTERPAGE ARGUMENTS
/RESET RETRY COUNT FOR 2 RETRIES ON I/O ERRORS
TRANS, AC7775 /AC=-3
DCA ERRCNT
/CALCULATE CYLINDER AND SURFACE FROM TRACK
TAD TRACK
CLL RAR
DCA CYL
RTR
DCA SURF
/COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER
JMS TRKCMP
/IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK
/RESET DRIVE (FUNCTION=1)
RETRY, RLDC /CLEAR CONTROLLER, AC
/SEEK (FUNCTION=3) WHEN CALLED FROM BELOW
SEEK, IAC /AC=(1 OR 3)
JMS IO /RESET DRIVE OR SEEK
/READ NEXT HEADER TO FIND OUT ACTUAL CURRENT TRACK
TAD HEADER
JMS IO /READ NEXT HEADER
RRSI /GET HEADER BYTE #1
BSW
AND B3
DCA OLDTRK /SAVE 2 LSB
RRSI /GET HEADER BYTE #2
AND B377
CLL RTL
TAD OLDTRK /ADD IN MSB
DCA OLDTRK
/COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER
JMS TRKCMP
/IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK
/CALCULATE DIFFERENCE WORD FOR SEEK FROM TRACK DIFFERENCE
SPA /IF POSITIVE, LINK WILL BE SET
CLL CIA /IF NEGATIVE, CLEAR LINK
RAR /DELETE SURFACE, INCLUDE DIRECTION
TAD SURF /ADD SURFACE
RLCA /LOAD DIFFERENCE WORD
AC0002 /PREPARE FOR SEEK
/LOOP BACK AND PERFORM SEEK; THIS ENSURES THAT THE TRACK
/REACHED IS THE CORRECT ONE IN SPITE OF POSSIBLE RL
/SEEK UNRELIABILITY
JMP SEEK
/SUBROUTINE TO COMPARE REQUESTED TRACK WITH OLD (REMEMBERED)
/TRACK; IF SAME, DO TRANSFER. IF DIFFERENT, RETURN WITH AC=
/REQUESTED-OLD, AND LINK=1
TRKCMP, 0
TAD OLDTRK /CALCULATE DIFFERENCE
CIA
TAD TRACK
STL /LINK MUST BE SET WHEN
/DIFFERENCE IS POSITIVE.
SZA
JMP I TRKCMP /DIFFERENT; RETURN
/ON TRACK: DO TRANSFER
/LOAD ALL REGISTERS
TAD SECTOR
RLSA
TAD WC
RLWC
TAD SURF
TAD CYL
RLCA
TAD MA
RLMA
/DO THE READ OR WRITE
TAD FNC
JMS IO
/COUNT REQUESTED NUMBER OF PAGES
TAD B7600
TAD PAGES
SNA
JMP DONE
DCA PAGES
JMP I MAIN /RETURN FOR MORE
/SUBROUTINE TO DO THE ACTUAL I/O
IO, 0 /AC=MODE,FIELD,FUNCTION
TAD BDRIVE
RLCB /DO THE OPERATION
RLSD /WAIT UNTIL DONE
JMP .-1
RLSE /TEST FOR I/O ERROR(S)
JMP I IO /NONE; RETURN
/IF ERROR, RETRY TWICE
ISZ ERRCNT /MORE RETRIES LEFT?
JMP RETRY /YES
/AFTER THREE TRIES, TAKE HANDLER ERROR RETURN
/WITH AC=4000
ERROR, AC4000
SKP
/NORMAL RETURN FROM HANDLER
DONE, ISZ BARG /SKIP ERROR RETURN
BRTN, CIF CDF 00 /RETURN TO CALLING FIELD
/BBL READ: NOP (FIELD 0)
JMP I BARG /RETURN TO CALLING PROGRAM
DLAY, 0 /***
/DATA
BLOCK, 0
TRACK, 0 /BBL READ: TRACK 0
WC, -41 /BBL READ: -BBL LENGTH
SECTOR, 1400 /BBL READ: SECTOR 14
CYL, 0
SURF, 0
ERRCNT, 0 /COUNT OF RETRIES
OLDTRK, 2000 /FORCE INITIAL SEEK
PAGES, 200 /BBL READ: ONE PAGE
FNC, RLRD /BBL READ: READ FUNCTION
/RELOCATED RELATIVE ADDRESSES
BARG, OK-MAIN /BBL READ: RETURN FROM READ
/ADDRESS OF HANDLER ARGUMENTS
MA, BBL-MAIN /BBL READ: ADDR OF BBL
BBBL, BBL-MAIN
B3, 3
B3777, 3777
B7600, 7600
BRLRD, RLRD
HEADER, BYTE RLRH
BDRIVE, DRIVE^100 /DRIVE BITS FOR RLCB
CHECK, -ID
/THIS CONSTANT MUST BE AT END OF PAGE
ZBLOCK 577-.
B4070, 4070
$