/ OS-278 RX50 SYSTEM HANDLER / LAST EDIT: 15-JAN-1986 02:00:00 CJL / RX50 SYSTEM HANDLER FOR OS-278. / DISASSEMBLED BY HAND BY: / CHARLES J. LASNER / CHARLES LASNER ASSOCIATES, 1986 / SOURCE COPYRIGHT 1986, CHARLES LASNER ASSOCIATES / BASED ON CORE IMAGE OF DECUS DM-101 OS-278 FOR DECMATE II / SYSTEM HANDLER. / NOTE: THIS IS THE DEC VERSION, NOT THE OPTIMAL VERSION! / EQUATED SYMBOLS. BOOT= 7600 /BOOTSTRAP ADDRESS DEVNUM= 30 /LOGICAL DEVICE NUMBER NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 VERSHI= "B /HIGH VERSION LETTER VERSLO= "2&77 /LOW VERSION LETTER / RX50 EQUATED SYMBOLS. DEVCODE=75^10+6000 /SKELETON IOT CODE OF DISK SEL= DEVCODE+0 /LOAD DRIVE PAIR PER AC[11] LCD= DEVCODE+1 /LOAD COMMAND REGISTER XDR= DEVCODE+2 /TRANSFER DATA REGISTER STR= DEVCODE+3 /SKIP ON, CLEAR TRANSFER FLAG SER= DEVCODE+4 /SKIP ON, CLEAR ERROR FLAG SDN= DEVCODE+5 /SKIP ON, CLEAR DONE FLAG INTR= DEVCODE+6 /INTERRUPT ENABLE/DISABLE PER AC[11] INIT= DEVCODE+7 /INITIALIZE CONTROLLER, RECALIBRATE DRIVES / BUILD HEADER BLOCK. *0 /BUILD WANTS IT THAT WAY -1 /ONE ENTRY IN THIS HANDLER DEVICE RX50 /GROUP NAME DEVICE SYS /PERMANENT NAME DEVNUM^10+4000 /DCB WORD SYSENT&177+6000 /ENTRY POINT WORD; SYSTEM ENTRY + TWO-PAGE 0 /BUILD WANTS IT THIS WAY 1377 /DEVICE LENGTH FOR ZEROING SYS: STBOOT-NDBOOT+PASTBUT-PART1 /-(BOOTSTRAP SIZE) ADJUSTED FOR GAP / THE BOOTSTRAP CODE FOLLOWS (WHEN BINARY OUTPUT RESUMES). / PRIMARY BOOTSTRAP THAT LOADS THIS IN (GUESSWORK!). NOPUNCH /FOOL THE ASSEMBLER *20 /WHERE IT STARTS SBREAD, TAD SRXU /GET CURRENT UNIT^20+DENSITY WORD TAD SGDCON /UPDATE TO NEXT CANDIDIATE AND SBU/(420) /KEEP ONLY NEW DENSITY AND UNIT BITS DCA SRXU /STORE BACK SRBOOT, NL0006 /SET AC TO SIX TAD SRXU /ADD ON DENSITY AND UNIT BITS LCD /LOAD "READ SECTOR" COMMAND CLA CLL IAC /SET AC TO ONE AND CLEAR LINK JMS SLODE /ASK FOR SECTOR ONE JMS SLODE /ASK FOR TRACK ONE SRAL, RAL /AC NOW 0002 SHANGG, SDN /BOOTSTRAP STARTS HERE; DONE FLAG UP? JMP SLODE1 /NO, TRY TRANSFER FLAG SER /SKIP IF ANY ERRORS SNA /FIRST TIME THROUGH? JMP SBREAD /JUMP IF FIRST TIME THROUGH OR ERRORS TAD SRXU /GET CURRENT DENSITY SETTING; UNIT IS IGNORED LCD /LOAD "EMPTY SECTOR" COMMAND TAD SRXU /GET GOOD DRIVE AND SGDCON/(360) /REMOVE DENSITY BIT TAD SRAL/(RAL) /ADD ON "RAL" INSTRUCTION DCA SBU /STORE FOR COMPATIBILIY WITH RX01 ONLY BOOTSTRAP SGDCON, 0360 /CONSTANT 0360 SLP, JMS SLODE /GET A WORD SLPSTR, DCA BOOT&177+2 /PUT A WORD ISZ SLPSTR /PUT TO NEXT JMP SLP /KEEP GOING UNTIL OVERLAYED / THE FOLLOWING WORDS ARE NEVER OVERLAYED. ALL OPERATING SYSTEMS PRIMARY BOOT / BLOCKS MUST ASSUME THEIR PRESENCE IN ORDER TO LOAD AT ALL. / DEPENDENCE ON THESE WORDS PREVENTS SIGNIFICENT IMPROVEMENT OR / ALTERATION OF THE BOOTSTRAP CONVENTION IN THE FUTURE. SLODE, .-. /LOAD A WORD ROUTINE SLODE1, STR /TRANSFER FLAG UP? JMP SHANGG /NO, BUT DONE FLAG MAY BE UP XDR /DO TRANSFER IN PREVAILING DIRECTION JMP I SLODE /RETURN SBU, 0420 /DENSITY AND UNIT MASK /WILL BE UNIT^20+7004 ON SUCCESSFULL BOOT SRXU, 0020 /WILL BE UNIT^20+DENSITY^400 ON SUCCESSFULL BOOT ENPUNCH /UN-FOOL THE ASSEMBLER RELOC 2 /WHERE THIS LOADS STBOOT, ZBLOCK 10 /EMPTY SPACE FOR ILL-DESIGNED PURPOSES XR, PASTBUT-1 /WHERE TO LOAD REST OF CODE ONCE WE GAIN CONTROL YR, DATA01-1 /POINTER TO LOAD DATA AREA ZR, .-. /MOVING AUTO-INDEX REGISTER / SETUP FOR NEXT SECTOR. NEXSECT,JMP ONCE /INITIALIZED FOR STARTUP CDF 00 /ENSURE FIELD ZERO TAD I YR /GET DATA FIELD FOR NEXT SECTOR TRANSFER SMA /SKIP IF A CDF INSTRUCTION JMP EBOOT /JUMP IF AT END OF LIST DCA XFIELD /STORE AS TRANSFER CDF INSTRUCTION NL0006 /SETUP READ FUNCTION TAD SRXU /ADD ON UNIT AND DENSITY LCD /LOAD THE COMMAND TAD I YR /GET SECTOR NUMBER JMS SLODE /LOAD IT TAD I YR /ADD ON TRACK-SECTOR JMS SLODE /LOAD IT TAD I YR /ADD ON ADDRESS-1-TRACK; FALL THROUGH WITH /NON-ZERO AC AS THE EMPTYING FLAG SHANGG, SDN /DONE FLAG UP? JMP SLODE1 /NO, TRY TRANSFER FLAG SER /SKIP IF THERE WAS AN ERROR SKP /ELSE SKIP THE HALT HLT /BARF ON ERROR SNA /ARE WE READING? JMP NEXSEC /NO, GO DO NEXT SECTOR DCA XR /YES, STASH PASSED TRANSFER ADDRESS JMP PASTBUT /CONTINUE THERE / THIS CODE EMPTIES THE SILO AND LOADS MEMORY. XFIELD, CDF 00 /WILL BE PROPER TRANSFER FIELD JMS SLODE /GET A WORD DCA I XR /STORE IT JMP XFIELD /KEEP GOING 'TIL DONE FLAG COMES UP PART1= . /END OF PART ONE RELOC SRXU+1 /WHERE THE REST LOADS PASTBUT,XDR /GET THE STATUS NOW DCA SLPSTR/STATUS /SAVE IT FOR LATER NL0002 /SETUP EMPTYING VALUE TAD SRXU /ADD ON UNIT AND DENSITY LCD /LOAD THE COMMAND JMP XFIELD /GO EMPTY IT THERE / ONCE-ONLY CODE COMES HERE TO GET IT GOING. ONCE, JMS MOVSEC /MOVE THE SECTOR TO ITS PROPER PLACE JMS NEXSEC /GO DO ANOTHER ONE MOVSEC, .-. /SECTOR MOVE ROUTINE TAD FROM/(BUTFROM-1)/GET "FROM" ADDRESS DCA ZR /STASH IT TAD L7577/(BOOT-1) /GET "TO" ADDRESS DCA XR /STASH IT MWDLUP, TAD I ZR /GET A WORD DCA I XR /PUT IT WHERE IT BELONGS TAD XR /GET THE POINTER IAC /COMPARE TO UPPER LIMIT SZA CLA /SKIP IF DONE JMP MWDLUP /ELSE KEEP GOING JMP I MOVSEC /RETURN WHEN THROUGH / COMES HERE WHEN ALL SECTORS ARE LOADED. EBOOT, NL7777 /GET "FROM" ADDRESS DCA ZR /STASH IT TAD L7577/(BOOT-1) /GET "TO" ADDRESS DCA XR /STASH IT EMVLUP, CDF 10 /GOTO "FROM" FIELD TAD I ZR /GET A WORD CDF 20 /GOTO "TO" FIELD DCA I XR /PUT A WORD TAD XR /GET THE POINTER IAC /COMPARE TO UPPER LIMIT SZA CLA /SKIP IF DONE JMP EMVLUP /ELSE KEEP GOING TAD L12/(12) /GET "READ STATUS" FUNCTION CDF 00 /ENSURE FIELD ZERO JMP EMORE /CONTINUE THERE 1374 /LEFT-OVER WORD (JUNK) / SECTOR LOADING DATA. DATA01, CDF 10 /TRANSFER FIELD 11 /SECTOR 6-11 /TRACK-SECTOR BOOT-1-6 /ADDRESS-1-TRACK L12, 12 /"READ STATUS" CONSTANT; THIS ENDS THE LIST / CONTINUES HERE (SLOPPILY). EMORE, CLA /THROW AWAY FUNCTION! TAD SRXU /GET UNIT AND DENSITY DCA I MAGIC/(BOOTYP) /STORE IN THE HANDLER JMP I L7605/(BOOT+5) /GO START IT UP MAGIC, BOOTYP /WHERE TO STORE UNIT AND DENSITY L7605, BOOT+5 /WHERE TO START IT UP L7577, BOOT-1 /BOOT ADDRESS CONSTANT FROM, BUTFROM-1 /WHERE BOOTSTRAP CODE IS NOW NDBOOT= . /END OF BOOTSTRAP CODE NOPUNCH /FOOL THE ASSEMBLER ZBLOCK 200-.+PASTBUT-PART1+2 /GET PAST REST OF OUR SECTOR BUTFROM=. /WHERE HANDLER IS NOW ENPUNCH /UN-FOOL THE ASSEMBLER / MAIN HANDLER CODE. RELOC /TURN OFF RELOCATION FOR NOW *200 /BUILD WANTS IT THIS WAY RELOC BOOT /WHERE IT GOES LATER ZBLOCK 7 /BUILD WANTS IT THIS WAY / HANDLER ENTRY HERE. SYSENT, VERSHI^100+VERSLO /HANDLER ENTRY POINT CLA CLL /CLEAN UP S12, 12 /CONSTANT 0012 S3, 3 /INDICATE TO BUILD TWO-PAGE HANDLER! TAD M6/(-6) /RESET THE DCA RETRY /RETRY COUNTER RDF /GET CALLING FIELD TAD LCDF/(CDF) /MAKE IT CDF CALLING FIELD DCA RESTORE /STORE IN-LINE FOR LATER JMP RSTART /CONTINUE THERE IOTYP, .-. /I/O TYPE FOR LCD ARGUMENTS LCDF, CDF 00 /CDF CONSTANT BOOTYP, .-. /BOOTSTRAP TYPE WORD M12, -12 /CONSTANT 7766 L6, 6 /CONSTANT 0006 M6, -6 /CONSTANT 7772 2203 /? 5333 /? 1751 /? 3751 /? 2351 /? 4574 /? / COMES HERE FIRST TIME THROUGH AND ALSO ON ERRORS. RSTART, NL3777 /SETUP MASK AND BOOTYP /GET GOOD BITS DCA IOTYP /SAVE FOR LCD ARGUMENTS TAD SYSENT /GET CALLER RESTORE,HLT /WILL BE CDF CALLING FIELD CIF 20 /GOTO OUR CODE FIELD JMP PAGE2 /CONTINUE THERE / STRANGE RECALIBRATE(?) CODE. RECALIB,TAD L6/(6) /GET READ FUNCTION TAD IOTYP /ADD ON UNIT, DENSITY BITS LCD /LOAD READ COMMAND STR /WAIT FOR JMP .-1 /TRANSFER FLAG NL0001 /INDICATE SECTOR ONE XDR /SEND IT STR /WAIT FOR JMP .-1 /TRANSFER FLAG CLA CLL /INDICATE TRACK ZERO XDR /SEND IT SDN /WAIT FOR JMP .-1 /READ TO FINISH SER /ERROR FLAG UP? NOP /JUST IGNORE IT! JMP RSTART /CONTINUE THERE 1057 /? 1331 /? 7430 /? 1332 /? 4272 /? 5263 /? 0247 /? 7100 /? 1332 /? 7430 /? 5273 /? / DIVIDE ROUTINE. / CALL WITH: / AC= NON-ZERO: NORMAL DIVIDE / AC= ZERO: COMPLETE I/O RETRY DIVSUB, .-. /DIVIDE SUBROUTINE SKP /SKIP PAST FAULTY USR CALL HLT /WILL HALT IF ILLEGAL CALL SNA CLA /NORMAL DIVIDE? JMP RECALIBRATE /NO, ERRORS MUST BE HANDLED RAR /GET THE LINK DCA LINK /SAVE IT DCA QUO /CLEAR QUOTIENT TAD REC /GET CURRENT LOGICAL RECORD DIVLOOP,ISZ QUO /BUMP UP QUOTIENT TAD M12/(-12) /SUBTRACT TEN SMA /TOO FAR? JMP DIVLOOP /NO, KEEP GOING TAD S12/(12) /YES, RESTORE IT DCA REM /SAVE REMAINDER TAD REM /GET IT AGAIN TAD REM /*2 CLL IAC /CLEAR LINK AND ADD ONE REMLOOP,TAD M12/(-12) /SUBTRACT TEN SMA SZA /SKIP IF TOO FAR JMP REMLOOP /ELSE KEEP GOING TAD S12/(12) /YES, RESTORE IT DCA REM /SAVE REMAINDER SNL CLA /UNDERFLOW? ISZ REM /YES, SO BUMP IT TAD LINK /GET PASSED LINK CLL RAL /RESTORE IT CIF 20 /GOING TO FIELD TWO JMP I DIVSUB /RETURN LINK, .-. /LINK STORED HERE QUO= 7750 /QUOTIENT FOR DIVIDE: TRACK REC= 7752 /CURRENT LOGICAL DISK RECORD REM= 7751 /REMAINDER FOR DIVIDE: SECTOR RETRY= 7753 /RETRY COUNTER / SECOND PAGE OF HANDLER. RELOC /TURN OFF RELOCATION *400 /BUILD WANTS IT THIS WAY NOPUNCH /FOOL THE ASSEMBLER FIELD 2 /WHERE THIS RUNS *400 /RESET ORIGIN SETTING ENPUNCH /UN-FOOL THE ASSEMBLER RELOC 7600 /WHERE THIS EXECUTES PAGE2, DCA FETCH /SAVE PASSED ARGUMENT ADDRESS RDF /GET CALLING FIELD TAD LCIDF0/(CIF CDF)/MAKE INTO CIF CDF CALLING FIELD INSTRUCTION DCA EXFLD /STORE IN-LINE NL4000 /SETUP WRITE BIT TAD I FETCH /FLIP LINK IF WRITING AND L70/(70) /JUST FIELD BITS TAD LCDF0/(CDF 00) /TURN INTO CDF INSTRUCTION DCA BUFCDF /STORE IN-LINE CML RTL /AC=2 IF READING, 0 IF WRITING DCA FUNCT /STASH THE FUNCTION TAD I FETCH /GET ARGUMENT AGAIN RAL /MOVE UP AND L7600/(7600) /JUST PAGE BITS CIA /INVERT FOR COUNTING DCA WRDCNT /SAVE AS WORD COUNT ISZ FETCH /BUMP TO ADDRESS TAD I FETCH /GET TRANSFER ADDRESS DCA ADDRESS /STASH IT ISZ FETCH /BUMP TO NEXT TAD I FETCH /GET RECORD NUMBER ISZ FETCH /BUMP TO ERROR RETURN CDF 00 /GOTO FIELD ZERO DCA I LREC/(REC) /SAVE AS LOGICAL RECORD NL0001 /INDICATE NORMAL DIVIDE LCIDF0, CIF CDF 00 /GOING TO FIELD ZERO JMS DIVSUB /GO CALCULATE FIRST SECTOR AND TRACK NL0002 /SETUP MASK AND FUNCT /GET THE WRITE BIT SZA CLA /SKIP IF WRITING JMP STREAD /JUMP IF READING TOP, TAD FUNCT /GET THE FUNCTION JMS LOADCMD /LOAD FILL (OR EMPTY) COMMAND TAD L7400/(-400) /SETUP THE DCA SECTWC /ONE SECTOR COUNT CLL /START WITH LINK CLEAR BUFCDF, HLT /WILL BE CDF BUFFER FIELD TRLOOP, JMS TESTFLAGS /CHECK RX FLAGS NOW SKP /SKIP IF OK JMP FLGERROR /BARF IF NOT TAD I ADDRESS /GET A WORD IF WRITING XDR /TRANSFER IT (MAY HAVE READ IT) SZL /ARE WE WRITING TO THE FIFO? JMP BUFILL /YES DCA I ADDRESS /NO, STORE THE READ WORD ISZ ADDRESS /BUMP TO NEXT L70, 70 /CONSTANT 0070; HERE IN CASE IT SKIPS ISZ WRDCNT /DONE ALL WORDS? SKP /SKIP IF NOT STL /SET LINK TO INDICATE WE'RE ALMOST DONE BUFILL, CLA /CLEAN UP ISZ SECTWC /DONE WITH THIS SECTOR? JMP TRLOOP /NO, KEEP GOING JMS TESTFLAGS /CHECK FOR TRANSFER DONE JMP FLGERROR /BARF IF IT CAME UP INSTEAD OF DONE TAD WRDCNT /GET WORD COUNT SZA CLA /SKIP IF DONE JMP STREAD /ELSE KEEP GOING NL0002 /SETUP MASK AND FUNCT /GET THE FUNCTION SZA CLA /SKIP IF WRITING JMP FINISH /JUMP IF READING STL /INDICATE LAST TIME STREAD, TAD FUNCT /GET FUNCTION TAD L4/(4) /MAKE IT READ (OR WRITE) JMS LOADCMD /LOAD THE COMMAND JMS TESTFLAGS /CHECK FOR TRANSFER DONE SKP /SKIP IF OK JMP FLGERROR /BARF IF NOT TAD I LREM/(REM) /GET SECTOR XDR /SEND IT L7600, CLA!400 /CLEAN UP JMS TESTFLAGS /CHECK FOR TRANSFER DONE SKP /SKIP IF OK JMP FLGERROR /JUMP IF NOT TAD I LQUO/(QUO) /GET THE TRACK XDR /SEND IT ISZ I LREC/(REC) /BUMP TO NEXT LOGICAL SECTOR ERRETRY,CIF CDF 00 /GOING TO FIELD ZERO JMS DIVSUB /GO CALCULATE NEXT (OR RETRY IF ERRORS) JMS TESTFLAGS /CHECK FOR TRANSFER DONE JMP FLGERROR /JUMP IF IT CAME UP INSTEAD OF DONE SNL CLA /END OF WRITE? JMP TOP /NO, KEEP GOING FINISH, ISZ FETCH /BUMP TO GOOD RETURN EXFLD, HLT /WILL BE CIF CDF RETURN FIELD JMP I FETCH /RETURN TO CALLER SECTWC, /ONE SECTOR WORD COUNTER LOADCMD,.-. /LOAD COMMAND ROUTINE LCDF0, CDF 00 /ENSURE FIELD ZERO TAD I LIOTYP /GET UNIT AND DENSITY WORD LCD /LOAD THE COMMAND JMP I LOADCMD /RETURN TESTFLA,.-. /FLAG TEST ROUTINE FLGLOOP,STR /TRANSFER FLAG UP? SKP /SKIP IF NOT JMP I TESTFLAGS /YES, JUST RETURN SDN /DONE FLAG UP? JMP FLGLOOP /NO, JUST KEEP GOING ISZ TESTFLAGS /BUMP RETURN ON DONE FLAG SER /ERROR FLAG? JMP I TESTFLAGS /NO, JUST RETURN BECAUSE OF DONE FLAG FLGERRO,CDF 00 /ENSURE FIELD ZERO CLA /CLEAN UP ISZ I LRETRY/(RETRY) /TOO MANY ERRORS? JMP ERRETRY /NO, TRY TRY AGAIN NL4000 /YES, SET ERROR VALUE JMP EXFLD /TAKE ERROR RETURN ADDRESS,.-. /TRANSFER ADDRESS POINTER FETCH, .-. /ARGUMENT FETCH POINTER WRDCNT, .-. /WORD COUNT FUNCT, .-. /READ/WRITE FUNCTION L7400, -400 /CONSTANT 7400 L4, 4 /CONSTANT 0004 LIOTYP, IOTYP /POINTER TO UNIT AND DENSITY WORD LRETRY, RETRY /POINTER TO RETRY COUNT LQUO, QUO /POINTER TO QUOTIENT LREC, REC /POINTER TO LOGICAL RECORD LREM, REM /POINTER TO REMAINDER $ /THAT'S ALL FOLK!