ASMB,R,L,C FH-RTGEN DRIVER SECTION. HED FH RTGEN DRIVER SECTION * NAME: FHDVR * SOURCE: 92001-18017 * RELOC: 92001-16017 * PGMR: G.A.A. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM FHGEN 92001-16017 REV 1529 DATE CODE 750630 SUP * * CONSTANTS ARE EXTERNAL ON BASE PAGE * EXT N1,N2,N3,N4,N5,N6,N8,N9,N10,N16,N27 EXT N64,P2,P3,P4,P5,P6,P7,P8,P9,P11,P12,P13,P14 EXT P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25 EXT P28,P29,P31,P33,P60,P64,P99,P202,P6K,L60,L2000 EXT M60,M77,M120,M177,M377,M777,M400,D128,M200,M0760 EXT M1740,M1600,M1777,M2000,M1377,M7400,M7000,M7600 EXT M7700,M7777,M0300,M1177 EXT DPWRS,P0100,P1000,P100,P10,P1 EXT OPWRS,M0100,M1000,M100,M10 EXT LWASM,PPREL,PPREL,BLANK,UBLNK,MSIGN,RPARB EXT DSKA,MOVW * * ENTRY POINTS FOR THIS MODULE * * VARIABLES ... * ENT SYSCH SYSTEM SUBCHANNEL ENT AUXCH AUX DISC SUBCHANNEL ENT DSIZE SYSTEM DISC SIZE (TRACKS) ENT DAUXN AUX DISC SIZE (TRACKS) ENT DSETU INITILIZE SUBROUTINE ENT DSKSC SCRATCH DISC ADDRESS ENT LSSYS,LSAUX LAST SEEK FLAGS ENT DISKA INCREMENT DISC ADDRESS SUBROUTINE ENT DISKO DISC OUTPUT ROUTINE ENT DISKI DISC INPUT ROUTINE ENT DSTBL GENERATE DISC TABLE SUBROUTINE ENT TRTST TEST CURRENT TRACK SUBROUTINE ENT DTSET SET UP TAT SUBROUTNE ENT SDS# SYSTEM DISC SECTORS/TRACK ENT ADS# AUX DISC SECTORS/TRACK ENT FSECT FLUSH FINAL SECTOR FROM CORE ENT DERCN DISC ERROR COUNT ENT DBPO ORG OF DUMMY BASE PAGE ENT DSKAB INITIAL ABS DISC ADDRESS ENT PTBOT CONFIGURE DISC/ PUNCH BOOT * * UTILITY SUBROUTINES * EXT DOCON,SPACE,READ,GETNA,GINIT,GETOC,GETAL EXT INERR,YE/NO,LSTS,ERROR,LSTE,LABDO,IRERR EXT OUTID,CONVD * A EQU 0 B EQU 1 DRKEY EQU 102B TTY ADDRESS SPC 3 BEGIN EQU * START OF PROG. SPC 1 TBUF BSS 5 TEMP BUFFER TBCHN BSS 1 TEMP DRHSP EQU 103B PUNCH ADDRESS * * DEFINE LST ADDRESSES * LST EQU 7 LST IS FIXED ON BASE PAGE LST1 EQU LST LST2 EQU LST+1 LST3 EQU LST+2 LST4 EQU LST+3 LST5 EQU LST+4 DSKAB OCT 4 INITIAL DISC ADDRESS FOR SYS CODE ASBUF DEF ASPBF+1 ADDRESS OF 9-WORD BUFFER IN BOOT ABOOT DEF START ADDRESS OF BOOTSTRAP LOADR LSAUX NOP LSSYS EQU *-1 DSIZE BSS 1 DISK SIZE - NO. OF TRACKS DSKSC BSS 1 ADDRESS OF DISK SCRATCH AREA DAUXN BSS 1 AUXILIARY DISK SIZE SDS# BSS 1 # SECTORS/TRACK FOR SYSTEM DISC$ ADS# OCT 0 # SECTORS/TRACK FOR AUX. DISC DERCN BSS 1 DISK ERROR COUNTER SYSCH NOP SUBCHANNEL OF SYSTEM UNIT AUXCH NOP SUBCHANNEL OF AUX UNIT PTRAK NOP NUMBER OF PROTECTED TRACKS * DBP EQU * START OF DUMMY BASE PAGE DBPO EQU DBP DEFINE ENTRY POINT * INTMP BSS 1 TEMP FOR INITILIZATION ROUTINES * MES50 DEF *+1 ASC 7,START SCRATCH? MES40 DEF *+1 ASC 8,# SECTORS/TRACK? * HED FH RTGEN DRIVER SECTION INTERACTIVE CODE * * DSETU NOP ENTRY POINT FOR QUESTION SECESSION. CHNLD LDA P13 LDB MESS2 MESS2 = ADDR: DISK CHNL? JSB READ PRINT MESSAGE, GET REPLY LDA P2 SET FOR 2 OCTAL DIGITS INPUT JSB DOCON GET DIGITS, RETURN OCTAL JMP CHNLD REPEAT INPUT * STA DCHNL SET DISK CHANNEL NUMBER * SPC 1 JSB SPACE ISYSC LDA P14 SEND MESSAGE: LDB MESS1 SYS DISK SIZE? JSB READ GET ANSWER LDA N3 THREE DIGIT DECIMAL JSB DOCON GO CONVERT JMP ISYSC ERROR - TRY AGAIN * STA DSIZE SET SYSTEM SIZE SPC 1 JSB SPACE STREL LDA P14 LDB MES50 MES50 = ADDR: START SCRATCH? JSB READ PRINT MESSAGE, GET REPLY LDA N3 SET FOR 3 DECIMAL DIGITS INPUT JSB DOCON GET DIGITS, RETURN OCTAL JMP STREL REPEAT INPUT * LDB DSIZE GET DISC SIZE CMB,INB IF INPUT NOT GREATER ADB A THAN DISC SSB SIZE JMP STREM SKIP * JSB INERR ELSE ERROR JMP STREL TRY AGAIN * STREM SZA IF SYSTEM AND ZERO SKIP RAL,SLA ELSE MULTIPLY BY TWO LDA DSIZE ZERO ON SYSTEM - USE UPPER HALF SYSTEM ALF,ALF ROTATE TO RAR,RAR TRACK LOCATION AND M7600 MASK TO TRACK STA DSKSC SET START SCRATCH * JSB SPACE SET NO. PROTECTED PROTD LDA P14 LDB MES21 'NO. PROTECTED?' JSB READ PRINT MESSAGE, GET REPLY LDA N2 SET FOR 2 DIGIT DECIMAL INPUT JSB DOCON GET DIGITS JMP PROTD IF ERROR REPEAT * STA PTRAK SET NO. PROTECTED TRACKS * * JSB SPACE GET # SECTORS FOR SYSTEM DISC #SEC1 LDA P16 LDB MES40 '# SECTORS/TRACK?' JSB READ PRINT MESSAGE, READ REPLY LDA N3 SET FOR 3 DECIMAL DIGIT INPUT JSB DOCON GET DIGITS JMP #SEC1 IF ERROR REPEAT * STA SDS# SET # SECTORS FOR SYSTEM DISC * * GET AUXILIARY DISK SIZE JSB SPACE NEW LINE AUXDS LDA P14 LDB MES33 MES33 = ADDR: AUX DISK SIZE? JSB READ PRINT MESSAGE, GET READ LDA N3 SET FOR 3 DECIMAL DIGITS INPUT JSB DOCON GET DIGITS, RETURN OCTAL JMP AUXDS REPEAT INPUT * STA DAUXN SET AUXILIARY DISK SIZE SZA,RSS IF AUX. DISC NOT PRESENT, JMP DSETU,I SKIP # OF SECTORS INPUT. * * GET # SECTORS FOR AUX. DISC JSB SPACE NEW LINE #SEC2 LDA P16 LDB MES40 REPEAT JSB READ # SECTORS LDA N3 MESSAGE AND JSB DOCON INPUT. JMP #SEC2 STA ADS# SET # SECTORS OF SYSTEM DISC JMP DSETU,I RETURN TO MAIN GENERATOR * HED FH RTGEN DRIVER SECTION CONFIGURE DRIVERS AND BOOTSTRAPS PTBOT NOP * * CONFIGURE DISK I/O INSTRUCTIONS * LDA N5 LDB HPDSK GET HIGH PRIORITY ADDRESSES JSB STDSK SET HIGH PRIORITY CHANNEL NOS. * ISZ DCHNL SET DISK CHNL NO. TO L.P. * LDA N9 JSB STDSK SET LOW PRIORITY DISK ADDRESSES * CLA DSK5 OTA 0 SET DISK ADDRESS = 0,0 DSK6 LIA 0 GET STATUS WORD AND P4 ISOLATE PROTECT BIT SZA SKIP - TRACK IS PROTECTED JMP PTB1 * JSB SPACE NEW LINE LDA P33 LDB MES32 MES32 = ADDR: TURN OFF DISK ETC. JSB DRKEY,I PRINT: TURN OFF DISK PROTECT HLT 32B WAIT FOR OPERATOR JMP DSK6 REPEAT CHECK * PTB1 LDA ASPBF GET ADDRESS OF BOOTSTRAP BUFFER AND M1777 ISOLATE PAGE BITS STA B LDA LWASM GET LWA SYSTEM MEMORY AND M0760 ISOLATE PAGE NUMBER STA TBUF SAVE PAGE NO. OF BOOTSTRAP LDR IOR B SET A = NEW BUFFER ADDRESS STA ASPBF SET BUFFER ADDR IN BOOTSTRAP LDA SDS# SET # OF SECTORS -1 FOR ADA N1 SYSTEM DISC IN STA #SECT BOOTSTRAP LOADER. CPA M177 IF 128 SECTORS/TRACK JSB FS128 MAKE A FAST BOOT CMA,INA AND M177 CONSTRUCT AND SET UPDATE TRACK STA #MASK # WITH SECTOR 0 VALUE. CLA,INA SET DISK ADDRESS = 0,1 LDB ABOOT GET ADDRESS OF BOOTSTRAP JSB DISKO OUTPUT BOOTSTRAP TO 0,1 * CLA SET DISK ADDRESS = 0,0 LDB ADBUF GET ADDRESS OF DBUF JSB DISKI READ DISK 0,0 LDB ADBUF GET ADDRESS OF DBUF ADB P3 ADJUST FOR 4TH WORD IN 0,0 LDA B,I GET WORD 4 OF 0,0 (BASIC ENT PT) STA DMS SET BASIC ENTRY PT. IN NEW LDR LDA B1600 GET PAGE OFFSET OF BOOTSTRAP IOR TBUF ADD PAGE NO. STA RT/TS SET RT LOADER ENTRY PT. IN LDR CLA SET DISK ADDRESS = 0,0 LDB BLODR GET ADDRESS OF 0,0 BOOTSTRAP JSB DISKO PUT OUT 0,0 BOOT JMP PTBOT,I RETURN TO MAIN * * FS128 NOP FAST BOOT ROUTINE LDB JMPST THIS ROUTINE STB ADP64 MODIFIES THE BOOT LDB JMPPL TO LOAD THE WHOLE AREA IF STB LDAB THE CONTROLER SUPPORTS END OF JMP FS128,I TRACK SWITCHING (IT DOES IF 128 SECT/TR) * BLODR DEF RLOAD ADDRESS OF 0,0 LOADER DCHNL NOP DISC CHANNEL WDCNT NOP TEMP SKP * * INSERT CHNL NO. IN INSTRUCTION * * THE STDSK SUBROUTINE SETS THE CURRENT DISK CHANNEL * NOS. IN THE I/O INSTRUCTIONS. * * CALLING SEQUENCE: * A = NO. WORDS TO BE CONFIGURED (NEG.) * B = ADDRESS OF INSTRUCTION ADDR LIST * JSB STDSK * * RETURN: * A = DESTROYED * B = NEXT INSTRUCTION ADDRESS * STDSK NOP STA WDCNT SAVE NO. OF INSTRUCTIONS LDA B,I GET INSTRUCTION AND M7700 ISOLATE INSTRUCTION CODE IOR DCHNL INSERT CHANNEL NO. STA B,I SET INSTRUCTION IN CODE INB INCR INSTRUCTION ADDRESS ISZ WDCNT SKIP - ALL INSTRUCTIONS CONFIG. JMP *-6 CONFIGURE NEXT INSTRUCTION JMP STDSK,I RETURN SPC 3 B1600 OCT 1600 MESS1 DEF *+1 ASC 7,SYS DISC SIZE? MESS2 DEF *+1 ASC 7,FH DISC CHNL? MES21 DEF *+1 ASC 7,NO. PROTECTED? MES32 DEF *+1 ASC 17,TURN OFF DISC PROTECT - PRESS RUN MES33 DEF *+1 ASC 7,AUX DISC SIZE? * * HPDSK DEF *+1,I HIGH PRIORITY CHANNEL NOS. DEF LINKG DEF DMAC DEF DSK3 DEF DSK8 DEF DSKB * LOW PRIORITY CHANNEL NOS. DEF DSK2 DEF DSK4 DEF DSK5 DEF DSK6 DEF DSK7 DEF DSK9 DEF DSKAG DEF DSKC HED FH RTGEN DRIVER SECTION** TRACK 0, SECTOR 0 BOOTSTRAP ** * ADBUF DEF *+1 BSS 64 BUFFER TO PUSH BOOT 0,0 AROUND IN BSS BEGIN+1000B-* MAKE CODE EASY TO READ * THE FOLLOWING IS THE FORMAT FOR THE PORTION OF THE * BOOTSTRAP LOADER TO BE SET IN 0,0. THIS SECTION OF THE * BOOTSTRAP IS LOADED INTO 2 TO 77B BY THE PROTECTED BINARY * LOADER. WHEN IT IS READ COMPLETELY INTO CORE IT CHECKS FOR * READ PARITY ERRORS DURING ITS INPUT. FOLLOWING THIS A HALT * INSTRUCTION PERMITS THE OPERATOR TO PROTECT THE BASIC * BINARY LOADER AND SET SWITCH 0 OF THE SWITCH REGISTER * TO 0 (EITHER REAL TIME EXECUTIVE OR TIME-SHARED BASIC) * OR 1 (DISC MONITOR SYSTEM). PRESSING 'RUN' READS THE * SELECTED SYSTEM LOADER FROM 0,1 OR 0,2 RESPECTIVELY. THIS * PORTION OF THE BOOTSTRAP OPERATION WILL THEN LOAD INTO * CORE THE SELECTED SYSTEM AND TRANSFER CONTROL TO IT. * BSBSO EQU * * RLOAD OCT 0,0 DON'T USE (A) AND (B) RT/TS OCT 0 REAL TIME EXEC/TIME-SHARED BASIC DMS OCT 0 HLT 4,C IN CASE OF POWER FAIL * BSLD0 STA BSLD2-BSBSO+1 CHANGE IRRECOVERABLE HLT 0 ISZ BSLD2-BSBSO INTO RECOVERABLE HLT 1 HLT 77B PROTECT BBL, SET SWR FOR SYSTEM LDA LINKG-BSBSO SET UP DISC/DMA OTA 6 LINKAGE * BSLD1 LIA 1 SELECT SYSTEM LOADER CLB,INB FROM SWITCH REGISTER: SLA SWR = 0 IMPLIES SECTOR 1 INB SWR = 1 IMPLIES SECTOR 2 DSK7 OTB 0 OUTPUT DISC ADDRESS CCE,INB SAVE LDA 1,I CHOSEN LOADER'S STA CORAD-BSBSO ENTRY POINT RAL,ERA OUTPUT 'READ' FORM CLC 2 OF LOADER'S OTA 2 CORE ADDRESS LDA .N64-BSBSO OUTPUT STC 2 TRANSFER OTA 2 LENGTH STC 6,C START DMA DSK8 STC 0 START DISC TRANSFER JSB TSTAT-BSBSO VALIDATE READ JMP CORAD-BSBSO,I TRANSFER TO SYSTEM LOADER * TSTAT DEF BSLD0-BSBSO (INITIAL EXIT) DSK9 LIA 0 WAIT FOR SLA TRANSFER JMP *-BSBSO-2 COMPLETION AND BSB32-BSBSO TRANSFER SZA,RSS OK? JMP TSTAT-BSBSO,I YES BSLD2 HLT 0 NO (HLT 1, NOP AFTER CHECK JMP *-BSBSO-1 JMP BSLD1-BSBSO RETRY LOAD * CORAD OCT 0 SYSTEM LOADER ENTRY ADDRESS LINKG OCT 20000 DISC/DMA LINKAGE TEMPLATE BSB32 OCT 32 TRANSFER VALIDATION MASK .N64 DEC -64 * BSS 77B-*+BSBSO PUT JUMP IN LOCATION 77B * JMP DSK9-BSBSO TEST BOOTSTRAP LOAD SPC 2 BSS BEGIN+1600B-* SKIP TO 1600B TO AVOID PROBLEMS WITH * 'O EQU START-1600B' HED FH RTGEN DRIVER SECTION ** TRACK 0, SECTOR 1 BOOTSTRAP** * * THE FOLLOWING LOADER PERMITS LOADING OF THE RESIDENT PORTIONS * OF THE REAL TIME MONITOR. THE LOADER IS LOCATED ON SECTOR 1, * TRACK 0 OF THE SYSTEM DISC. IT IS GENERATED BY THE SYSTEM * GENERATOR AND CONSISTS OF: * * (1) THE INSTRUCTIONS REQUIRED FOR LOADING THE SYSTEM * (2) THE DISK AND CORE ADDRESSES SPECIFYING LOADING * * * THE ADDRESSES REQUIRED FOR LOADING ARE THE FOLLOWING: * * (A) BASE PAGE LINKAGES * (1) LOW CORE ADDRESS * (2) HIGH CORE ADDRESS * (3) DISK ADDRESS OF ABSOLUTE CODE * * (B) SYSTEM, RT RESIDENT MAIN * (1) LOW CORE ADDRESS * (2) HIGH CORE ADDRESS * (3) DISK ADDRESS OF ABSOLUTE CODE * * (C) BG RESIDENT MAIN * (1) LOW CORE ADDRESS * (2) HIGH CORE ADDRESS * (3) DISK ADDRESS OF ABSOLUTE CODE * * THE PROGRAM IS ASSUMED TO BE LOADED IN THE 64 WORDS PRECEDING * THE PROTECTED LOADER. * START ABS LDB-O+ASPBF GET ADDR OF DISK SPEC. BUFFER ABS STB-O+SPCAD SET CURRENT SPBUF ADDRESS ABS JSB-O+PLOAD LOAD MAIN SYSTEM, RT RESIDENTS ABS JSB-O+PLOAD LOAD MAIN BG RESIDENTS ABS JSB-O+PLOAD LOAD BP LINKAGES JMP 3B,I TRANSFER TO RT MONITOR ENTRY PT. * PLOAD NOP ABS LDB-O+SPCAD+I+I GET LOW CORE ADDRESS ABS ISZ-O+SPCAD INCR CURRENT SPBUF ADDRESS ABS LDA-O+SPCAD+I+I GET HIGH CORE ADDRESS ABS ISZ-O+SPCAD INCR CURRENT SPBUF ADDRESS CMA,CCE,INA COMPLEMENT, SET DIRECTION BIT ADA B SET A = TOTAL WORD COUNT RBL,ERB SET DIRECTION BIT IN CORE ADDR CLC 2 OTB 2 SET MEMORY ADDRESS REGISTER ABS LDB-O+SPCAD+I+I GET DISK ADDRESS OF ABSOLUTE CODE ABS ISZ-O+SPCAD INCR CURRENT SPBUF ADDRESS * SLOAD SSA,RSS SKIP - MORE SECTORS TO LOAD JMPPL ABS JMP-O+PLOAD+I+I RETURN - THIS SECTION LOADED ADP64 ABS ADA-O+P.64 ADJUST FOR NEXT COUNT ABS STA-O+RECNT SET REMAINING COUNT SSA SKIP - LESS THAN 64 WORDS CLA ABS ADA-O+N.64 SET A = CURRENT SECTOR COUNT STC2 STC 2 OTA 2 SET WORD COUNT REGISTER DSKAG OTB 0 OUTPUT CURRENT DISK ADDRESS STC 6,C INITIATE DMA DSKB STC 0 INITIATE DATA TRANSFER DSKC LIA 0 GET STATUS WORD SLA SKIP - TRANSFER COMPLETE ABS JMP-O+*-2 WAIT FOR COMPLETION RAR,SLA,RAL SKIP - NO READ PARITY ERROR HLT 0B WAIT FOR OPERATOR - READ PARITY LDAB LDA B GET CURRENT DISK ADDRESS ABS AND-O+M.177 ISOLATE SECTOR NO. ABS CPA-O+#SECT LAST SECTOR READ? RSS YES - CONTINUE ON NEXT TRACK CLA,INA,RSS NO - SET COUNT FOR NEXT SECTOR ABS LDA-O+#MASK SET COUNT FOR NEXT TRACK ADB A SET B = NEXT DISK ADDRESS ABS LDA-O+RECNT GET REMAINING COUNT ABS JMP-O+SLOAD LOAD NEXT SECTOR * * DATA AREA M.177 OCT 177 #SECT NOP # SECTORS - 1 FOR SYSTEM DISC #MASK NOP INCREMENT TRACK # VALUE N.64 DEC -64 P.64 DEC 64 RECNT OCT 0 CURRENT REMAINING COUNT SPCAD OCT 0 CURRENT DISK SPEC. BUFFER ADDR ASPBF DEF -O+*+1 BSS 9 SYSTEM LOADING SPECIFICATIONS BTEND EQU *-START LENGTH OF BOOT (100B OR LESS PLS) * JMPST ABS JMP-O+STC2 * * * THE FOLLOWING EQU SECTION ALLOWS THE BOOTSTRAP * TO BE LOCATED ANYWHERE IN CORE WHEN OUTPUT TO * DISK, BUT EXECUTABLE FROM THE LAST PAGE OF CORE. * * O EQU START-1600B SET FOR START AT 1600 PAGE RELATIVE * LDB EQU 066000B LDB CPA EQU 052000B CPA STB EQU 076000B STB ADB EQU 046000B ADB JSB EQU 016000B JSB ISZ EQU 036000B ISZ LDA EQU 062000B LDA STA EQU 072000B STA ADA EQU 042000B ADA AND EQU 012000B AND XOR EQU 022000B XOR JMP EQU 026000B JMP I EQU 040000B INDIRECT BIT (CODE AS I+I) HED FH RTGEN DRIVER SECTION GENERATOR DRIVER CODE BSS 2000B+DBP-* RESERVE 1K FOR DUMMY BP. * * INCREMENT DISK ADDRESS * * THE DISKA SUBROUTINE INCREMENTS THE CURRENT DISK ADDRESS * TO PROVIDE THE ADDRESS OF THE SUCCEEDING SECTOR, * WHETHER THAT SECTOR IS ON THE SAME TRACK OR THE FOLLOWING * TRACK. IN ADDITION, THE DISKA SUBROUTINE CHECKS THAT * THE NEXT DISK ADDRESS IS VALID. * * CALLING SEQUENCE: * A = CURRENT DISK ADDRESS * B = IGNORED * JSB DISKA * * RETURN: * A = NEXT DISK ADDRESS * B = DESTROYED * DISKA NOP STA B SAVE CURRENT ADDRESS AND M177 ISOLATE SECTOR NUMBER INA ADD 1. CPA SDS# IF = TO MAX NO. ON SYS. DISC, CLA SET # = 0, STA DISKT AND SAVE NEW SECTOR #. LDA B ISOLATE ALF,ALF TRACK RAL ADDRESS AND M377 IN LOW A. CLB IF NEW CPB DISKT SECTOR # = 0, INA ADD 1 TO TRACK #. CPA DSIZE CHECK FOR OVERFLOW. JMP DKERR -YES. ALF,RAL RESTORE TRACK # TO 14-07, RAL,RAL AND IOR DISKT INSERT SECTOR #. JMP DISKA,I -RETURN. * DKERR LDA ERR17 SET CODE FOR INSUFFICIENT DISK JSB IRERR IRRECOVERABLE ERROR EXIT * DISKT NOP -TEMPORARY STORAGE DCMND NOP DISC ADDRESS SAVE AREA EDCNT NOP DISC ERROR COUNTER MADDR NOP DISC XFER CORE ADDRESS SAVE AEBUF DEF *+1 DISC SCAN OUT AREA BSS 64 ERR17 ASC 1,17 ERR22 ASC 1,22 SKP * * DISK INPUT DRIVER * * THE DISKI SUBROUTINE CONTROLS THE INPUT FROM THE DISK. * IT ADDS THE DIRECTION BIT TO THE CORE ADDRESS, AND * CONTAINS THE ERROR RECOVERY PROCEDURE IF READ PARITY * OR DECODE ERRORS ARE DETECTED ON READ. FOLLOWING DETECTION * OF SUCH AN ERROR, 9 ADDITIONAL ATTEMPTS TO READ THE * SPECIFIED SECTOR WILL BE MADE. IF THESE FAIL, THE DISK ADDRESS * AND THE CORE ADDRESS ARE DISPLAYED IN THE A AND B REGISTERS * AND THE COMPUTER HALTS. BY PRESSING RUN, 10 ADDITIONAL * ATTEMPTS TO READ THE SECTOR WILL BE MADE. * * CALLING SEQUENCE: * A = DISK ADDRESS * B = CORE ADDRESS * JSB DISKI * * RETURN: CONTENTS OF A AND B ARE DESTROYED. * DISKI NOP ADB MSIGN SET SIGN = 1 STA DCMND SAVE DISK ADDRESS STB MADDR SAVE MEMORY ADDRESS REPR1 LDA N10 SET DISK READ ERROR COUNT STA EDCNT SET ERROR COUNTER REPR2 LDA DCMND GET DISK ADDRESS LDB MADDR GET CORE ADDRESS JSB DISKD READ 64-WORD RECORD JMP DISKI,I RETURN ISZ EDCNT SKIP - 10 READ ATTEMPTS FAILED JMP REPR2 TRY AGAIN LDA ERR22 GET DISK READ ERROR CODE JSB ERROR PRINT ERROR MESSAGE LDA DCMND GET DISK ADDRESS LDB MADDR GET CORE ADDRESS HLT 22B WAIT FOR OPERATOR INTERVENTION JMP REPR1 TRY 10 MORE TIMES SKP * * DISK OUTPUT DRIVER * * THE DISKO SUBROUTINE CONTROLS ALL OUTPUT TO THE * DISK. IT ADDS THE DIRECTION BIT TO THE CORE ADDRESS, AND CONTAINS * THE ERROR RECOVERY PROCEDURE IF DISK ERRORS ARE DETECTED. * FOLLOWING EXECUTION OF THE DISK WRITE, THE SECTOR IS * IMMEDIATELY READ BACK TO TEST FOR ERRORS. IF ERRORS ARE DETECTED, * THIS PROCEDURE IS REPEATED (SEE RECOVERY FOR DISKI). * * CALLING SEQUENCE: * A = DISK ADDRESS * B = CORE ADDRESS * JSB DISKO * * RETURN: CONTENTS OF A AND B ARE DESTROYED. * DISKO NOP STB MADDR SAVE MEMORY ADDRESS LDB DSKA GET CURRENT HIGH CMB,INB AND SUBTRACT ADB A FROM CURRENT ADDRESS SSB,RSS IF NEW HIGH STA DSKA SET NEW HIGH IOR MSIGN SET SIGN OF DISK ADDR = WRITE STA DCMND SAVE DISK ADDRESS REPW1 LDA N10 SET DISK READ ERROR COUNT STA EDCNT SET ERROR COUNTER REPW2 LDA DCMND GET DISK ADDRESS LDB MADDR GET CORE ADDRESS JSB DISKD WRITE 64-WORD RECORD LDA DCMND GET DISK ADDRESS RAL,CLE,ERA CLEAR WRITE BIT LDB AEBUF GET ADDRESS OF SCANOUT AREA JSB DISKD READ RECORD FROM DISK JMP DISKO,I RETURN ISZ EDCNT SKIP - 10 READ ATTEMPTS FAILED JMP REPW2 TRY AGAIN LDA ERR22 GET DISK READ ERROR CODE JSB ERROR PRINT ERROR MESSAGE LDA DCMND GET DISK ADDRESS LDB MADDR GET CORE ADDRESS HLT 22B WAIT FOR OPERATOR INTERVENTION JMP REPW1 TRY 10 MORE TIMES SKP * * COMMON I/O DISK DRIVER * * THE DISKD SUBROUTINE IS THE MAIN DISK INPUT/OUTPUT * DRIVER. IT SETS UP THE MEMORY ADDRESS REGISTER, THE * WORD COUNT REGISTER, AND THE DISK ADDRESS. FOLLOWING THESE, * IT INITIATES THE TRANSFER, AND WAITS UNTIL THE TRANSFER * IS COMPLETE (BY TESTING THE DISK STATUS WORD). IN THE CASE OF * A DISK READ, IT TESTS FOR READ PARITY AND DECODE ERRORS. * * CALLING SEQUENCE: * A = DISK ADDRESS (WITH DIRECTION BIT) * B = CORE ADDRESS (WITH DIRECTION BIT) * JSB DISKD * * RETURN: CONTENTS OF A AND B ARE DESTOYED. * (N+1): READ - A READ PARITY OR DECODE ERROR IS DETECTED * WRITE - ALL * (N+2): NORMAL READ * DISKD NOP CCE,SSA,RSS SET E = 1 (DISK WRITE) CLE SET E FOR DISK READ CLC 2 PREPARE TO SET MEM ADDR REGISTER OTB 2 SET MEM ADDR IN MAR LDB DMAC ASSIGN THE DMA OTB 6 TO THE DISK * STC 2 PREPARE TO SET WORD COUNT REG LDB N64 SET WORD COUNT = 64 OTB 2 SET WORD COUNT IN WCR * DSK2 OTA 0 SET DISK ADDR IN COMMAND CHNL * STC 6,C INITIATE DMA 1 DSK3 STC 0 INITIATE DATA TRANSFER DSK4 LIA 0 GET STATUS WORD SLA SKIP IF TRANSFER COMPLETE JMP *-2 WAIT SEZ SKIP - DISK READ JMP DISKD,I WRITE RETURN AND P18 ISOLATE BITS 1,4 SZA,RSS SKIP - READ PARITY OR DECODE ERR JMP DISKD,I NORMAL READ RETURN ISZ DERCN INCR TOTAL DISK ERROR COUNT ISZ DISKD INCR RETURN ADDRESS (ERROR) JMP DISKD,I DISK READ ERROR RETURN * DMAC OCT 20000 HED FH RTGEN DRIVER SECTION GENERAL SUBROUTINES? * SET DISK TRACK TABLE * * DTSET SETS UP THE DISK TRACK TABLE FOR BOTH THE SYSTEM * AND AUXILIARY DISK. IT USES THE ID SEGMENT BUFFER FOR * PUTTING OUT THE TRACK TABLES. * * CALLING SEQUENCE: * A = NO. USED TRACKS * JSB DTSET * RETURN: CONTENTS OF A AND B ARE DESTROYED. * DTSET NOP LDB PTRAK GET THE NUMBER OF PROTECTED TRACKS CMB,INB AND CKECK IF ALL USED ADB A IF A < 0 THEN IT IS NO. OF STB TBUF UNUSED PROTECTED TRACKS SSB,RSS IF NONE JMP DTSET,I JUST RETURN (TAT IS ALREADY ZERO) * DTSE1 LDA MSIGN ASSIGN REST OF JSB OUTID PROTECTED TRACKS ISZ TBUF TO THE SYSTEM JMP DTSE1 LOOP TILL DONE * JMP DTSET,I THEN RETURN SPC 2 DSTBL NOP DUMMY ROUTINES FOR SETTING TRACK MAP TRTST EQU *-1 AND TESTING A TRACK LDB A SET B TO EQUAL A AND JMP DSTBL,I JUST RETURN SPC 2 * FSECT IS A ROUTINE TO SET LOAD SPECS IN THE LOAD SPEC. * TABLE IN THE DISC RESIDENT BOOT EXTENSION. * * CALLING SEQUENCE: * LDA SPEC BUFFER ADDRESS I.E. ADDRESS OF THE NINE WORDS * JSB FSECT * RETURN REGS. MEANINGLESS * FSECT NOP STA DTSET SAVE THE ADDRESS FOR A BIT LDB ABOOT GET THE CLA,INA BOOT FROM JSB DISKI THE DISC LDA DTSET GET THE FROM ADDRESS LDB ASBUF AND THE TO ADDRESS JSB MOVW AND MOVE THE WORDS DEC -9 LDB ABOOT NOW WRITE CLA,INA THE BOOT JSB DISKO BACK TO THE DISC JMP FSECT,I RETURN * END