/ P?S/8 FLOPPY SYSTEM HANDLER / LAST EDIT: 23-FEB-1988 18:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 SYSTEM HANDLER FOR HIGH-DENSITY FLOPPY DISKS. / SUPPORTED HARDWARE: / CESI MDC8 HOST ADAPTER (MINIMUM FIRMWARE REVISION 02). / OMTI 20-D OR 5000 SERIES DISK CONTROLLER (5200, 5400). / TEAC FD55G 80 TRACK HIGH-DENSITY FLOPPY DRIVES (2, 3). / REQUIRES PDP-8/E PROCESSOR (OR BETTER). / EACH HANDLER UNIT (0 AND 1) ADDRESSES UP TO 4096 BLOCKS (0000-7777). / UNITS 2 AND 3 ARE TYPICALLY ONLY 64 BLOCKS LONG (0000-0077), AND ARE PROVIDED / FOR TOTAL COMPATIBILITY WITH OS/8 USAGE ONLY. / THIS HANDLER CAN BE BOOTSTRAPPED TO EITHER PHYSICAL DRIVE UNIT (2 OR 3). / PHYSICAL DRIVE 2 ADDRESSES LOGICAL UNIT 0 (AND THE VESTIGIAL UNIT 2 BLOCKS / 0000-0077 ONLY); PHYSICAL DRIVE 3 ADDRESSES LOGICAL UNIT 1 (AND THE VESTIGIAL / UNIT 3 BLOCKS 0000-0077 ONLY). SINCE THE HIGH-ORDER UNIT BIT IS IGNORED, / UNITS 4-7 CORRESPOND TO UNITS 0-3 RESPECTIVELY. // P?S/8 EQUATED SYMBOLS. ADRLST= 7603 /ZAP ADDRESS LIST BBLEN= 0043 /SLURP LOADER BOOTSTRAP LENGTH BINADR= 0020 /"%" BLOCK BINIT= 0020 /SLURP INITIALIZE ROUTINE BINITLN=0020 /LENGTH OF SLURP INITIALIZE CODE BINIT2= 0031 /SECONDARY SLURP INITIALIZE ADDRESS CALADR= 0020 /CALLING ADDRESS CALFLD= 0021 /CALLING FIELD CNTLST= 7615 /CONTENTS LIST FOR ZAPPED ADDRESSES DEVSIZE=6760 /DEVICE SIZE WORD IN SYSGEN ROUTINE DSPBLB= 0024 /BLURB DISPLAY ROUTINE ERRTRP= 0046 /ERROR TRAP POINTER ESTATUS=0077 /ERROR STATUS FILBLB= 0023 /BLURB FILL ROUTINE GENAD1= 7400 /SYSIO GENERATION ADDRESS HIDWRD= 7600 /SYSTEM HANDLER ID WORD IOTRAP= 0045 /I/O TRAP POINTER MONSTRT=0353 /KEYBOARD MONITOR STARTUP ADDRESS MOVBLB= 0022 /ERROR BLURB MOVE ROUTINE PCHLOOP=0162 /POINTER TO CHARACTER INPUT ROUTINE REWIND= 1335 /REWIND ROUTINE ADDRESS SBLOCK= 7635 /SYSTEM LOADER BLOCK ARGUMENT SBOOT= 7600 /MONITOR RESTART ADDRESS SBTFUN= 7602 /SYSTEM BOOTSTRAP FUNCTION SCORE= 7633 /SYSTEM LOADER TRANSFER ADDRESS SCRSIZE=7611 /SYSTEM MEMORY SIZE, ETC. WORD SDATE= 7610 /SYSTEM LOW-ORDER DATE WORD SFILES= 7757 /FILE LIST PASSED HERE SFUN= 7634 /SYSTEM LOADER FUNCTION WORD SLOAD= 7632 /SYSTEM LOADER ADDRESS SLPGEN= 4420 /SLURP LOADER GENERATION FIELD AND ADDRESS SLPSA= 7777 /SLURP LOADER STARTING ADDRESS WORD SLUPAGE=2600 /SLURP LOADING PAGE SOUTFLS=7607 /OUTPUT FILE COUNT PASSED HERE SPARM= 7756 /EQUALS PARAMETER PASSED HERE SWAL= 7604 /SWITCHES /A-/L SWMX= 7605 /SWITCHES /M-/X SWY9= 7606 /SWITCHES /Y-/9 SYSIO= 7640 /SYSTEM I/O ENTRY POINT SYSTART=7637 /SYSTEM LOADER STARTUP ADDRESS TRAPIO= 1041 /ENTRY POINT FOR I/O TRAPS TRPERR= 1200 /ENTRY POINT FOR I/O ERROR TRAPS TRPGEN= 1020 /TRAP ROUTINE GENERATION FIELD AND ADDRESS WRITE= 4000 /SYSIO WRITE BIT ZAPLST= 7627 /REPLACEMENT LIST FOR ZAPPED ADDRESSES // END OF P?S/8 EQUATED SYMBOLS. / MDC8 IOT DEFINITIONS. IFNDEF DEVCODE /USES 670X BY DEFAULT DSEI= DEVCODE^10+6000 /INTERRUPT ENABLE/DISABLE PER AC[11] DSSF= DEVCODE^10+6001 /SKIP ON DONE FLAG DSCF= DEVCODE^10+6002 /CLEAR DONE FLAG DSHI= DEVCODE^10+6003 /LOAD HIGH-ORDER COMMAND ADDRESS DSGO= DEVCODE^10+6004 /LOAD LOW-ORDER COMMAND AND GO / = DEVCODE^10+6005 /UNUSED DSRS= DEVCODE^10+6006 /READ STATUS DSIM= DEVCODE^10+6007 /INTERFACE MAINTENANCE INSTRUCTION / MISCELLANEOUS DEFINITIONS. DMA= 4000 /DMA INDICATOR FLPSIZE=10000 /LOGICAL UNIT SIZE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 SBOFF= SLUPAGE-SBOOT /OFFSET VALUE SYSNUM= 0010 /SYSTEM ID NUMBER **** MUST BE UNIQUE **** / MANUAL BOOTSTRAP FOR FLOPPY SYSTEM. NOPUNCH /TURN OFF BINARY OUTPUT *21 /GET TO TOGGLE-IN REGION CAF /POWER CLEAR IS GOOD ENOUGH TO CLEAR AC TAD BTUNIT /GET BOOTSTRAP VALUE DSIM /START IT UP DSKWAIT,JMP . /WAIT FOR OVERLAY BTUNIT, 1001 /BOOTSTRAP VALUE; 1401 FOR UNIT 3 / IT IS ALSO POSSIBLE TO BOOTSTRAP THE SYSTEM BY EXECUTING A BOOT COMMAND / FROM AN EXTERNAL LOCATION: *400 /ANYWHERE PAST 377 WILL DO EXTRNBU,CAF /POWER CLEAR IS GOOD ENOUGH TO CLEAR AC TAD EXTUNIT /GET BOOTSTRAP VALUE DSIM /START IT UP ISZ .-2 /WAIT FOR JMP .-1 /AWHILE DSRS /GET STATUS NOW SPA /SKIP IF NOT BUSY JMP .-2 /ELSE WAIT FOR IT SZA /SKIP IF OK HLT /ELSE COMPLAIN TAD EXTUNIT /GET UNIT BITS AGAIN JMP SEXTBUT&177 /CONTINUE THERE EXTUNIT,1001 /BOOTSTRAP VALUE; 1401 FOR UNIT 3 ENPUNCH /RESTORE BINARY OUTPUT / THE CAF INSTRUCTIONS CAN BE DELETED FOR A SHORTER BOOTSTRAP ONLY IF THE / FRONT PANEL CLEAR KEY IS USED INSTEAD. / P?S/8 MONITOR COMPONENTS. / REWIND/UNLOAD ROUTINE. *REWIND-1 /DEFINE REWIND/UNLOAD ROUTINE ZBLOCK 1377-. /EMPTY SPACE JMP I PCHLOOP/[CHLOOP]/CONTINUE THERE / DEVICE SIZE. *DEVSIZE /OVER SYSGEN ROUTINES FLPSIZE /DEFINE OUR DEVICE SIZE / P?S/8 BINARY SLURP LOADER. FIELD SLPGEN&70%10 /GENERATION FIELD *SLPGEN&7600 /GENERATION ADDRESS SLPCORE,NOPUNCH /FOOL THE ASSEMBLER FIELD 0 /WHERE IT LOADS *SLPCORE /RESET ORIGIN ENPUNCH /UN-FOOL THE ASSEMBLER RELOC SBOOT /WHERE IT EXECUTES SBOOT, CLA /CLEAN UP TAD JMPDSKW/(JMP DSKWAIT)/GET WAIT INSTRUCTION DCA DSKWAIT /STORE IT IN PROPER PLACE TAD BUNIT /GET UNIT VALUE DSIM /START THE BOOTSTRAP JMPDSKW,JMP DSKWAIT /GO WAIT FOR IT THERE BUNIT, 1001 /BOOTSTRAP UNIT VALUE; 1401 FOR DRIVE 3 / ALL BOOTSTRAP CODE MUST BE WITHIN 7600-7642. / ENSURE THIS SIZE CONVENTION IS MET. IFNZRO SBOOT+BBLEN-.&4000 / BOOTSTRAP UNIT SETUP ROUTINE. / THIS CODE WILL BE AVAILABLE TO THE BINARY LOADER (AND SYSGEN ROUTINES) WHEN / IT IS LOADED INTO "SLUPAGE". IT INITIALIZES THE SLURP LOADER BOOTSTRAP AND / THEN RETURNS TO THE BINARY LOADER INITIALIZE ROUTINE. BUTSETU,.-. /BOOTSTRAP UNIT SETUP ROUTINE NL0001 /SET MASK AND I BNUNIT/[SBTFUN] /GET BOOTSTRAP UNIT CLL RTR;RTR;RAR /MOVE UP TAD BUNIT /GET REST OF BITS DCA BUNIT /STORE BACK JMP I BUTSETUP /RETURN BNUNIT, SBTFUN /SYSTEM BOOTSTRAP UNIT POINTER / SLURP INITIALIZE CODE. ZBLOCK SFILES-. /EMPTY SPACE SFILES, RELOC BINIT2 /WHERE THIS EXECUTES BINIT2, JMS I BNSETUP/[BUTSETUP+SBOFF]/SETUP THE BOOTSTRAP UNIT STUFF JMP I BINIT /RETURN BNSETUP,BUTSETUP+SBOFF /BOOTSTRAP UNIT SETUP ROUTINE POINTER ZBLOCK BINIT2+BINITLN-. /EMPTY SPACE RELOC SFILES+BINITLN /RESET ORIGIN SLPSA, 0000 /NO SLURP LOADER HENCE NO STARTING ADDRESS RELOC /TURN OFF RELOCATION / MONITOR I/O INTERCEPT BLOCKS FOR FLOPPY DISK SYSTEM. / PAGE AND FIELD RELOCATABLE CODE TO BE LOADED BY CONSOLE OVERLAY, ETC. FOR / I/O AND ERROR TRAP PURPOSES. FIELD TRPGEN&70%10 /GENERATES HERE *TRPGEN&7600 /SYSGEN WANTS IT HERE NOPUNCH /FOOL THE ASSEMBLER FIELD 1 /WHERE IT MIGHT LOAD *TRPGEN&7600 /RESET ORIGIN ENPUNCH /UN-FOOL THE ASSEMBLER RELOC SBOOT /FOOL THE ASSEMBLER HIDWRD, SYSNUM /SYSTEM DEVICE HANDLER ID NUMBER DEVICE FLPY /SYSTEM DEVICE NAME / I/O ADDRESSES. ADRLST, SERR /NORMALLY HLT OR 7401 SERR+1 /NORMALLY JMP SRETRY SYSIO+2 /NORMALLY RDF SYSIO+3 /NORMALLY TAD SCIF/(CIF) 0 /THIS ENDS THE SHORT LIST ZBLOCK ADRLST+12-. /EMPTY SPACE / I/O NORMAL CONTENTS. CNTLST, HLT/OR 7401 /SERR JMP SRETRY /SERR+1 RDF /SYSIO+2 TAD SCIF/(CIF) /SYSIO+3 0 /THIS ENDS THE SHORT LIST ZBLOCK CNTLST+12-. /EMPTY SPACE / I/O REPLACEMENT CONTENTS. ZAPLST, CIF 10 /WILL BE TO CORRECT FIELD JMP ERRTRP /JMP THERE ON ANY ERROR CIF 10 /WILL BE TO CORRECT FIELD JMP IOTRAP /JMP THERE ON ANY CALL 0 /THIS ENDS THE SHORT LIST ZBLOCK ZAPLST+12-. /EMPTY SPACE RELOC /UN-FOOL THE ASSEMBLER / I/O TRAPS COME HERE. TRAPIO, RDF /GET CALLING FIELD TAD TRPCDF/(CDF) /MAKE INTO CDF CALLING FIELD DCA TRPINST /STORE IN-LINE TRPCDF, CDF 00 /GOTO MONITOR FIELD TAD I (SYSIO) /GET CALLING ADDRESS DCA CALADR /SAVE FOR ERROR HANDLER TRPINST,.-. /GOTO CALLING FIELD TAD TRPINST /GET CDF CALLING FIELD DCA CALFLD /SAVE FOR ERROR HANDLER NL0001 /SET CIF BIT TAD TRPINST /NOW HAVE CIF CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (SYSIO+4) /CONTINUE THERE / ERROR BLURB. TYPCODE,TEXT " CODE " /TYPE CODE ERROR BLURB BLBLEN= .-TYPCODE /LENGTH OF ERROR BLURBS PAGE / ERRORS COME HERE. TRPERR, DSRS /GET ERROR STATUS DCA ESTATUS /SAVE ERROR STATUS RIF /GET OUR FIELD TAD ERRCDF/(CDF) /FORM CDF OUR FIELD DCA EINLINE /STORE IN-LINE EINLINE,.-. /WILL BE CDF OUR FIELD JMS ERLOC8 /FIND OURSELVES ERLOC8, .-. /OUR ADDRESS STORED HERE TAD ERLOC8 /GET OUR ADDRESS TAD (TYPCODE+3-ERLOC8) /ADJUST TO DIGIT FIELD IN BLURB DCA ETEMP /STASH THE POINTER TAD ESTATUS /GET ERROR STATUS RTR;RAR /MOVE DOWN AND (700) /JUST HIGH-DIGIT DCA I ETEMP /STORE IN BLURB FOR NOW TAD ESTATUS /GET ERROR STATUS AGAIN AND (700) /JUST SECOND DIGIT CLL RTR;RTR;RTR /MOVE DOWN TAD I ETEMP /ADD ON FIRST DIGIT TAD ("0^100+"0-200) /MAKE IT ASCII DCA I ETEMP /STORE BACK IN BLURB ISZ ETEMP /BUMP TO NEXT PAIR TAD ESTATUS /GET ERROR STATUS AGAIN RTL;RAL /MOVE UP AND (700) /ISOLATE THIRD DIGIT DCA I ETEMP /STORE IN BLURB FOR NOW TAD ESTATUS /GET ERROR STATUS AGAIN AND (7) /JUST FOURTH DIGIT TAD I ETEMP /ADD ON THIRD DIGIT TAD ("0^100+"0-200) /MAKE IT ASCII DCA I ETEMP /STORE BACK IN BLURB ERRCDF, CDF 00 /GOTO FIELD ZERO TAD ERLOC8 /GET OUR ADDRESS TAD (TYPCODE-ERLOC8) /ADJUST TO BLURB ADDRESS JMS I MOVBLB /MOVE IT INTO ERROR MESSAGE -BLBLEN /PASSED BLURB LENGTH IN WORDS JMS I FILBLB /FILL IN I/O PARTICULARS JMS I DSPBLB /DISPLAY BLURB AND POSSIBLY COME BACK TAD CALFLD /GET CALLING FIELD DCA ETEMP /STORE IN-LINE ETEMP, .-. /GOTO CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (SRETRY) /TRY, TRY AGAIN PAGE / MDC8 FLOPPY DISK SYSTEM HANDLER. FIELD 0 /WHERE IT GENERATES *GENAD1 /WHERE SYSGEN WANTS IT RELOC SBOOT /WHERE IT EXECUTES SBOOT, DCA SBOOT&177 /SAVE PASSED UNIT VALUE; WILL BE JMP SBOOT2 SCIF, CIF 00 /CONSTANT 6202 SBTFUN, DSRS /GET STATUS; WILL BE 17^100+BOOTSTRAP UNIT SPA /SKIP IF NOT BUSY SWAL, JMP .-2&177 /SWITCHES /A-/L; ELSE WAIT FOR IT SWMX, SZA /SWITCHES /M-/X; SKIP IF NO ERROR SWY9, HLT /SWITCHES /Y-/9; ELSE BARF SOUTFLS,JMP SFILES&177 /OUTPUT FILE COUNT; GO MOVE THE CODE DOWN SDATE, .-. /SYSTEM DATE WORD SCRSIZE,.-. /SOFTWARE CORE SIZE SWAIT, .-. /DISK WAIT ROUTINE DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA /SKIP IF ANY ERRORS JMP I SWAIT /ELSE RETURN SERR, HLT /HALT WITH BAD BITS IN AC JMP SRETRY /TRY, TRY AGAIN / OVERLAY LOCATION. IFNZRO .&177-24 SOVRLAY,JMP SBOOT&177 /GO WAIT THERE / EXTERNAL BOOTSTRAP LOCATION. IFNZRO .&177-25 SEXTBUT,JMP SPARM&177 /CONTINUE THERE S100, 100 /CONSTANT 0100 S37, 37 /CONSTANT 0037 S40, 40 /CONSTANT 0040 S70, 70 /CONSTANT 0070 SLOAD, JMS SYSIO /SYSTEM LOADER HAS DEFAULTS TO SAVE CORE SCORE, 0000 /CORE ARGUMENT SFUN, WRITE /NUMBER OF BLOCKS TO READ OR WRITE, FIELD, UNIT SBLOCK, BINADR /STARTING BLOCK NUMBER JMP I .+1/(SYSTART) /START AT SYSTART,SBOOT /THIS STARTING ADDRESS / I/O ROUTINES ENTER HERE. SYSIO, .-. /I/O ENTRY POINT S7600, CLA!400 /CLEAN UP RDF /GET CALLING FIELD TAD SCIF/(CIF) /TURN INTO CIF CALLING FIELD DCA SEXIT /STORE IN-LINE FOR EXIT LATER TAD I SYSIO /GET TRANSFER ADDRESS DCA TRADDR /STASH IT ISZ SYSIO /BUMP TO FUNCTION WORD TAD I SYSIO /GET FUNCTION WORD AND S70/(70) /JUST FIELD BITS CLL RTR;RAR /MOVE DOWN DCA TRFLD /STORE (BANK AND) FIELD BITS NL4000 /SET READ/WRITE MASK AND I SYSIO /GET READ/WRITE BIT CLL IAC RTL;RAL /10 IF READING, 12 IF WRITING DCA RWCOM /STASH COMMAND TAD I SYSIO /GET FUNCTION AGAIN BSW /RTR;RTR;RTR /MOVE DOWN PAGE COUNT AND S37/(37) /JUST PAGE BITS SNA /SKIP IF ANY TAD S40/(40) /ELSE USE MAXIMUM DCA SCTCNT /STASH SECTOR COUNT NL0001 /SET LOWER UNIT BIT MASK AND I SYSIO /GET THE BIT SZA CLA /SKIP IF OFF TAD S40/(40) /ELSE SET ODD UNIT BIT TAD S100/(100) /GET PAIR BIT DCA SECTHI /STORE HIGH-ORDER ADDRESS AND UNIT NL0002 /SET MIDDLE UNIT MASK AND I SYSIO /GET THE BIT CLL RTL;RAL /MOVE UP DCA SECTMD /STORE FOR NOW ISZ SYSIO /BUMP TO BLOCK TAD I SYSIO /GET THE BLOCK NUMBER DCA SECTLO /STORE AS LOW-ORDER ADDRESS TAD I SYSIO /GET IT AGAIN AND S7600/(7400) /JUST HIGH-ORDER BITS BSW;RTR /RTL;RTL;RAL /MOVE DOWN TAD SECTMD /ADD ON UNIT OFFSET BIT DCA SECTMD /STORE AS MIDDLE ADDRESS ISZ SYSIO /BUMP PAST BLOCK NUMBER DCA CONTRL /CLEAR CONTROL WORD SRETRY, DSRS /GET STATUS SPA CLA /SKIP IF CONTROLLER IS IDLE JMP .-2 /ELSE WE MIGHT AS WELL WAIT DSHI /SEND HIGH-ORDER COMMAND ADDRESS DSRS /GET STATUS SMA CLA /SKIP IF BUSY JMP .-2 /ELSE KEEP WAITING DSCF /CLEAR DONE FLAG NOW TAD STABLE/(TABLE) /POINT TO COMMAND TABLE DSGO /GO START IT UP JMS SWAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS SWAIT /WAIT FOR COMMAND TO COMPLETE SEXIT, CIF 00 /WILL BE CIF RETURN FIELD JMP I SYSIO /RETURN TO CALLER / COMES HERE TO CONTINUE THE WARM BOOTSTRAP. SBOOT2, JMS SYSIO /CALL I/O ROUTINES 0000 /TRANSFER TO 00000 SBTFN2, 17^100+.-. /BOOTSTRAP UNIT WILL BE FILLED IN 1 /STARTING AT BLOCK 0001 JMP I .+1/(MONSTRT) /GO START IT UP MONSTRT /THROUGH HERE STABLE, TABLE /COMMAND TABLE POINTER / COMMAND TABLE; NON-VOLATILE LOCATIONS MUST BE BEFORE 7750. TABLE, 6!DMA /TABLE LENGTH PLUS DMA INDICATOR RWCOM, .-.&377 /0010 IF READING, 0012 IF WRITING SECTHI, .-.&377 /UNIT BITS AND HIGH-ORDER SECTOR ADDRESS SECTMD, .-.&377 /MIDDLE SECTOR ADDRESS SECTLO, .-.&377 /LOW-ORDER SECTOR ADDRESS SCTCNT, .-.&377+SBOOT /SECTOR COUNTER (1-40); INITIALIZED FOR COLD BOOTSTRAP CONTRL, 0&377+400 /CONTROL WORD; INITIALIZED FOR COLD BOOTSTRAP TRFLD, .-.&377 /BANK (0000) AND TRANSFER FIELD (0-7) TRADDR, JMP SBOOT2 /TRANSFER ADDRESS; INITIALIZED FOR COLD BOOTSTRAP ZBLOCK SPARM-. /EMPTY SPACE / COMES HERE TO STORE PASSED UNIT VALUE FROM EXTERNAL BOOTSTRAP. SPARM, DCA SBOOT&177 /EQUALS PARAMETER; SAVE PASSED UNIT VALUE / COMES HERE TO MOVE THE CODE TO 07600. SFILES, TAD SBOOT&177 /FILE LIST STARTS HERE; GET PASSED UNIT VALUE AND CONTRL&177/[400] /JUST ODD UNIT BIT SZA /SKIP IF EVEN (0) IAC /ELSE SET UNIT ONE TAD SBTFN2&177 /ADD ON PAGE BITS DCA SBTFN2&177 /STORE ALL BACK TAD SBTFN2&177 /GET IT AGAIN DCA SBTFUN&177 /STORE IN BOOTSTRAP UNIT WORD TAD TRADDR&177/(JMP SBOOT2) /GET FIXUP VALUE DCA SBOOT&177 /RESTORE IT SLOOP, TAD SBOOT&177 /GET A WORD DCA I SCTCNT&177 /PUT A WORD ISZ SLOOP&177 /BUMP TO NEXT ISZ SCTCNT&177 /ANY MORE TO MOVE? JMP SLOOP&177 /NO, GO BACK JMP I S7600&177/[SBOOT] /YES, NO GO DO A WARM BOOTSTRAP RELOC /TURN OFF RELOCATION $ /THAT'S ALL FOLK!