PD1827 CSY/ C01 P€1_%NAM D1827_(DECK-ID C01 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$1827 LINE PRINTER KERNEL DRIVER_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1* **********************************************************************_^1*_1LINE PRINTER DRIVER (INTERFACE TO USER)_^1* **********€€************************************************************_^1_%SPC 2_^1*_]_^1*_2FUNCTION_^1*_2--------_^1*_]_^1*_(HANDLES REQUESTS FOR OPERATION OF THE 1827 LINE PRINTER_^1*_]_^1*_]_^1*_2GENERAL DESCRIPTION_^1*_1-------------------_^1*_]_^1*_(THE (KERNEL) DRIVER IS THE INTERFACE OR 'FRONT END'_^1*_(BETWEEN THE OPERATING SYSTEM AND THE KERNEL FOR_^1*_(THE 1827 LINE PRINTER. SPEC€€IFICALLY, THE DRIVER_^1*_(HANDLES FINDING NEXT REQUEST, RETURN OF CONTROL_^1*_(TO SYSTEM, COMPLETING REQUESTS,_^1*_(LOGGING_!ERRORS IN ENGINEERING LOG, ALT. DEVICES,_^1*_(AND PASSING CONTROL TO KERNEL AFTER REQUEST IS_^1*_(SET IN THE APPROPRIATE PHYSICAL DEVICE TABLE(PDT)._^1*_]_^1*_]_^1*_(IF THE FLAG IN THE PHYS TAB, DBLBUF,IS EQUAL TO 1, THEN THE_^1*_(THAN THE MAXIMUM ALLOWED, MA€€XBUF IN THE PHYS TAB._^1*_(DRIVER DOUBLE-BUFFERS OUTPUT TO THE PRINTER. THIS MEANS THAT_^1*_(IF THE NUMBER OF WORDS IN THE REQUEST IS LESS THAN MAXBUF,_^1*_(THEN THE DRIVER WILL MOVE THE USER'S DATA TO AN INTERNAL_^1*_(BUFFER. IT WILL THEN COMPLETE THE REQUEST BEFORE IT IS_^1*_(ACTUALLY PROCESSED. THIS WILL ALOW THE USER TO ISSUE A_^1*_(SECOND REQUEST BEFORE THE FIRST ONE IS COMP€€LETED._^1*_(THIS MEANS THAT THE USER CAN PROCESS THE SECOND REQUEST WHILE_^1*_(THE FIRST REQUEST IS BEING OUTPUT TO THE PRINTER._^1*_]_^1*_(NO DOUBLE BUFFERING WILL OCCUR IF THE FLAG DBLBUF IN THE_^1*_(PHYSICAL DEVICE TABLE IS SET TO 0 OR IF THE REQUEST IS GREATER_^1*_(THAN THE MAXIMUM ALLOWED, MAXBUF IN THE PHYS TAB._^1*_]_^1****_]_^1_%EJT_]_^1****_]_^1*E_]_^1*_]_^1*_2INPUT REQUIR€€EMENTS_^1*_2------------------_^1*_]_^1*_]_^1*_((Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_2DRIVER SCHEDULED FOR REQUEST INITIATION OR_^1*_2TIME OUT INTERRUPT HAS OCCURRED_^1*_]_^1*_]_^1*_2OUTPUT_^1*_2------_^1*_(IF ERROR, A REG CONTAINS FAULT CODE:_^1*_2TIMEOUT_!0_^1*_2ALARM_#2_^1*_2PARITY_"3_^1*_2INT REJ_!5_^1*_2EXT REJ_!6_^1*_(FAULT CODE ALSO IN PDT_^1*_(PDT IS UPDATED €€TO INDICATE COMPLETED OR CURRENT STATUS_^1*_(OF REQUEST_^1*_]_^1*_]_^1*_2ENTRY/EXIT_^1*_2----------_^1*_]_^1*_]_^1*_2ENTRY -_^1*_]_^1*_(ENTRY IS BY SIMPLE JUMP TO ENTRY POINT I1827_^1*_(WITH THE ADDRESS OF THE PDT IN THE Q REGISTER_^1*_]_^1*_]_^1*_2EXIT -_^1*_2A. DISPATCHER WHEN THERE ARE NO FURTHER_^1*_2REQUESTS TO PROCESS_^1*_2B. ALTDEV WHEN ERROR OCCURS ON_^1*_2NON-DIAGNOSTIC €€LU._^1*_]_^1****_]_^1_%EJT_]_^1****_]_^1*E_]_^1*_]_^1*_2FLOW_^1*_2----_^1*_]_^1*_(PROGRAM SAVES PDT ADDRESS IN I_^1*_(RETURN JUMPS TO FIND NEXT REQUEST ROUTINE._^1*_2GOES TO DISPATCHER IF THERE ARE NO_^1*_2FURTHER REQUESTS FOR THIS UNIT._^1*_2OTHERWISE GO TO THE LINE PRINTER KERNEL._^1*_(ON RETURN, GO TO COMPLETE REQUEST IF NO ERROR_^1*_(OR IF THIS IS A REQUEST TO DIAGNOSTIC LOGICA€€L_^1*_(UNIT NUMBER. OTHERWISE FETCH FAULT CODE AND_^1*_(EXIT TO ALTERATE DEVICE HANDLER._^1*_]_^1*_]_^1*_]_^1*_2SUBROUTINES_^1*_2-----------_^1*_]_^1*_(ALTDEV - ALTERNATE DEVICE HANDLER_^1*_(DISPAT - SYS ROUTINE TO TO PASS CONTROL TO NEXT PROGRAM_^1*_(K1827 - KERNEL, 1827 LINE PRINTER_^1*_(LOG_"- LOG ERROR IN ENGINEERING LOG_^1*_(MAS300 - EXIT WHEN NO MORE REQUESTS_^1*_(RCMAKQ €€- REDUCED CORE MONITOR MAKE Q_^1*_(RCMFNR - REDUCED CORE MONITOR FIND NEXT REQUEST_^1*_(RCMPRQ - REDUCED CORE MONITOR COMPLETE REQUEST_^1*_]_^1*_]_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1****_]_^1*E_]_^1*_2PARAMETERS_^1*_]_^1*_(PDT EQUATES_^1*_]_^1_%EQU ELVL(0)_%00 SCHEDULER CALL WITH DRIVER LEVEL_^1_%EQU EDIN(1)_%01 DRIVER INITIATOR ENTRY_^1_%EQU EDCN(2)_%02 DRIVER CONTINUATOR E€€NTRY_^1_%EQU EDPGM(3)_$03 DRIVER DIAGNOSTIC ENTRY_^1_%EQU EDCLK(4)_$04 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'05 LOGICAL UNIT_^1_%EQU EPTR(6)_%06 PARAMETER LOCATION_^1_%EQU EWES(7)_%07 CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#08 REQUEST STATUS_^1_%EQU ESTAT1(9)_#09 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 CURRENT LOCATION_^1_%EQU ELSTWD(11)_"11 LAST LOCATION PLUS ONE€€_^1_%EQU ESTAT2(12)_"12 DEVICE STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH (IF MASS MEMORY)_^1_%EQU MASSEC(14)_"14 NAME ASSOCIATED WITH SECTOR NUMBER_^1_%EQU RETURN(15)_"15 RESERVED FOR FNR AND CMR_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF A REQUEST ERROR OCCURS_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(€€19)_"19 MICRO-INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 TIMEOUT PERIOD TO WAIT FOR AN INTERRUPT_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU FTNLU(24)_#24 FORTRAN LOGICAL UNIT NUMBER_^1_%EQU MOTCMD(25)_"25_!PAPER MOTION COMMAND WORD_^1_%EQU BLNKCT(26)_"26 COU€€NT FOR SPACE FILL_^1_%EQU CHARCT(27)_"27 CHARACTER OUTPUT COUNT_^1_%EQU LINLEN(28)_"28_"NUMBER OF CHARACTERS PER LINE_^1_%EQU LINCT(29)_#29 LINE COUNT_^1_%EQU MAXLIN(30)_"30_!MAX NUMBER OF LINES PER PAGE_^1_%EQU MTNREQ(31)_"31 MOTION REQUEST WORD SAVED HERE_^1_%EQU BLNKDT(32)_"32 ZERO IF LINE IS ALL BLANKS_^1_%EQU ADTTBL(33)_"33-36 ADT TABLE_^1_%EQU ADTBUF(37)_"37 ADT B€€UFFER ADDRESS_^1_%EQU DBLBUF(38)_"38 DOUBLE BUFFERING FLAG(1=DBL BUFFERING,0=NO)_^1_%EQU REQCFL(39)_"39 REQUEST COMPLETED FLAG_^1_%EQU NEWBUF(40)_"40 NEW BUFFER ADDRESS_^1_%EQU SVFLTC(41)_"41 SAVED FAULT CODE_^1_%EQU SVEST1(42)_"42 SAVED ESTAT1_^1****_]_^1_%EJT_]_^1****_]_^1*_]_^1*_2MESSAGES_^1*_]_^1*_]_^1*_(ALTERNATE DEVICE HANDLER WILL PRINT FAULT CODE FOR_^1*_(NON-DIAGNOSTI€€C UNITS_^1*_]_^1*_]_^1*_2MISCELLANEOUS_^1*_2-------------_^1*_]_^1*_(NONE_^1****_]_^1_$EJT_]_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_2MISCELLANEOUS EQUATES_^1*_]_^1_%EQU ADISP($EA) CELL CONTAINING DISPATCHER ADDRESS_^1_%EQU RCMFNR($B5) CELL CONTAINING FIND NEXT REQUEST ADDR_^1_%EQU RCMPRQ($B6) CELL CONTAINING COMPLETE REQ ADDRESS_^1_%EQU TOERR($0)_!TIME OUT ERROR CODE_^1_%EQU H0002($€€24)_"HEX 0002_^1_%EQU H000F(6)_$HEX 000F_^1_%EQU H001F(7)_$HEX 001F_^1_%EQU MAXBUF(72)_"MAXIMUM BUFFER LENGTH FOR DOUBLE BUFFERING_^1_%EQU AMONI($F4)_"MONITOR LOW MEMORY ADDRESS CELL_^1_%SPC 3_^1_%ENT I1827_(INITIATOR ENTRY POINT FOR MSOS/RTOS_^1_%ENT BUFADT_'ADT BUFFER ADDRESS - 1_^1_%ENT ILP408_'INITIATOR ENTRY POINT FOR ODS_^1_%SPC 3_^1_%EXT ALTDEV ALTERNATE DEVICE HA€€NDLER_^1_%EXT* K1827_(INITIAL ENTRY TO KERNEL OF LINE PRINTER_^1_%EXT* C1827R_'RELATIVE CONTINUATOR ENTRY POINT IN KERNEL_^1_%EXT* E1827R_'RELATIVE ERROR ENTRY POINT IN KERNEL_^1_%EXT LOG_#ENGINEERING LOG ENTRY ROUTINE_^1_%EXT MAKEQ_!SYSTEM ROUTINE TO SET REQUEST STATUS_^1_%EXT MAS300_'MASS EXEC EXIT HANDLER_^1_%EJT_]_^1****_]_^1*_]_^1*_'CODE TO ABSOLUTIZE I,C,E ADDRESSES IN PDT€€ IF DRIVER_^1*_'IS MASS-RESIDENT-ENTRY WITH FWA ADDR IN A,PDT ADDR IN Q_^1*_]_^1DSTART STQ- I_,CONTROL COMES HERE FROM MMEXEC-SAVE PDT ADDR_^1_%ENQ I1827-DSTART GET INITIATOR ADDRESS_^1_%AAQ Q_^1_%STQ- EDIN,I_^1_%LDQ =XC1827R_$GET CONTINUATOR ADDRESS_^1_%INQ *-DSTART-1_^1_%AAQ Q_^1_%STQ- EDCN,I_^1_%SPC 4_^1***_"CALCULATE INTERNAL BUFFER ADDRESS_^1_%SPC 2_^1_%LDQ =XBUFR1-DS€€TART BUFFER 1 RELATIVE ADDRESS TO Q_^1_%AAQ Q_,ADD DSTART ABSOLUTE ADDRESS_^1_%STQ- NEWBUF,I_$SAVE Q AS ADDRESS OF NEW BUFFER_^1_%INQ ADTBFR-BUFR1-1 GET ADT BUFFER ADDRESS-1_^1_%STQ- ADTBUF,I_$STUFF IT IN PDT_^1_%LDQ =XREQCOM-DSTART REQUEST COMPLETION RELATVE ADDRESS_^1_%AAQ Q_,Q HAS ABSOLUTE ADDRESS_^1_%STQ* COMPAD_'SAVE IN REQUEST_^1_%ADD =XE1827R_$GET TIME OUT (ERROR) ADD€€RESS_^1_%INA *-DSTART-1_^1_%STA- EDPGM,I_^1_%JMP* I10_*GO TO FIND A REQUEST_^1MS300 ADC MAS300_'MMEXEC EXIT WHEN DRIVER IS THROUGH_^1CURADR NUM 0_,CURRENT BUFFER ADDRESS_^1_%EJT_]_^1***_"INTERNAL REQUEST_^1IREQST RTJ- (AMONI)_^1REQCDE NUM 0_,REQUEST CODE_^1COMPAD NUM 0_,COMPLETION ADDRESS_^1THREAD NUM 0_,THREAD_^1LUNIT NUM 0_,LOGICAL UNIT_^1WORDNO NUM 0_,NO. OF WORDS_^1ST€€RTAD NUM 0_,STARTING ADDRESS_^1_%EJT_]_^1I05_"EQU I05(*)_'NO MORE REQUESTS_^1_%ENA 0_,RESET SAVED ESTAT1_^1_%STA- SVEST1,I_$*_^1_%JMP* (MS300)_%ELSE EXIT MASS EXEC_^1_%EJT_]_^1_%SPC 2_^1I1827 STQ- I_,SAVE FWA OF PHYSICAL DEVICE TABLE (PDT)_^1_%EQU ILP408(I1827) DEFINE ENTRY FOR ODS_^1I10_"EQU I10(*)_^1_%ENA 0_,RESET REQUEST COMPLETED FLAG_^1_%STA- REQCFL,I_$*_^1_%RTJ- (RCMF€€NR)_$FIND NEXT REQUEST_^1_%JMP* I05_*NO MORE REQUESTS_^1_%SPC 2_^1_%LDA- DBLBUF,I_$GET DOUBLE BUFFERING FLAG_^1_%SAN I101_)SKIP IF DOUBLE BUFFERING_^1_%JMP* I19415_'JUMP IF NOT_^1_%SPC 4_^1I101_!EQU I101(*)_%DOUBLE BUFFERING_^1_%LDA- DIAGLU,I_$IF DIAGNOSTIC LOGICAL UNIT_!THEN_^1_%SUB- ELU,I_(*_^1_%SAN I11_**_^1_%JMP* I19415_'GO PROCESS REQUEST_^1I11_"EQU I11(*)_'ELSE_^1_%LDA-€€ SVEST1,I_$IF ERROR ON PREVIOUS REQUEST THEN_^1_%SAP I111_)*_^1_%STA- ESTAT1,I_$PLUG IT IN PDT_^1_%LDA- SVFLTC,I_$GET SAVED FAULT CODE_^1_%STA- FLTCOD,I_$PLUG IT IN PDT_^1_%ENA 0_,CLEAR SAVED ESTAT1_^1_%STA- SVEST1,I_$*_^1I110_!EQU I110(*)_^1_%RTJ- (RCMPRQ)_$COMPLETE THE REQUEST_^1_%JMP* I10_*GO TO FIND NEXT REQUEST_^1_%SPC 4_^1I111_!EQU I111(*)_%ELSE_^1***_"CHECK FOR MOTION C€€OMMAND_^1_%SPC 2_^1_%LDQ- EPTR,I_'PARAMETER POINTER TO Q_^1_%LDA+ 0,Q_*GET REQUEST CODE_^1_%ARS 9_^1_%AND- H001F_^1_%INA -14_*IF IT IS A MOTION REQUEST THEN_^1_%SAN I12_^1_%JMP* I19415_'GO TO PROCESS REQUEST_^1_%SPC 4_^1I12_"EQU I12(*)_'ELSE_^1***_"COMPUTE USER'S BUFFER LENGTH_^1_%SPC 2_^1_%LDA- ELSTWD,I_$CALCULATE BUFFER LENGTH_^1_%SUB- ECCOR,I_%A = NO. OF WORDS_^1_%STA* WO€€RDNO_'AND PLUG IN IN INTERNAL REQUEST_^1_%INA -MAXBUF_%IF BUF. GREATER THAN MAXIMUM BUF LENGTH THEN_^1_%SAM I17_**_^1_%JMP* I19415_'DO NOT DOUBLE BUFFER_^1_%SPC 4_^1***_"MOVE USER'S BUFFER BUFFER TO AN INTERNAL BUFFER_^1_%SPC 2_^1I17_"EQU I17(*)_^1_%LDA- ECCOR,I_%CURRENT ADDRESS TO Q_^1_%STA* CURADR_'SAVE IT_^1_%ENQ 0_,INITIALIZE COUNTER_^1I182_!EQU I182(*)_^1_%LDA* (CURADR)€€_$GET ONE WORD FROM USER'S BUFFER_^1_%STA* BUFR1,Q_%STORE IT IN NEW BUFFER_^1_%RAO* CURADR_'INCREMENT ADDRESS_^1_%LDA* CURADR_'IF DONE THEN_^1_%SUB- ELSTWD,I_$*_^1_%SAZ I19_*SKIP DOWN_^1_%INQ 1_,ELSE INCREMENT Q_^1_%JMP* I182_)AND LOOP_^1_%SPC 4_^1***_"PATCH PDT WITH INTERNAL BUFFER POINTRS_^1_%SPC 2_^1I19_"EQU I19(*)_^1_%LDA- NEWBUF,I_$INTRNAL BUFFER ADDRESS TO Q_^1_%STA- ECC€€OR,I_%SAVE AS ECCOR IN PDT_^1_%STA* STRTAD_'SAVE IT IN REQUEST_^1_%ADD* WORDNO_'A = LAST WORD ADDRESS_^1_%STA- ELSTWD,I_$SAVE AS LAST WORD ADDRESS_^1_%LDA- ELU,I_(GET LOGICAL UNIT_^1_%STA* LUNIT_(PLUG IT IN REQUEST_^1_%LDA- (I)_*DRIVER PRIORITY TO A_^1_%AND- H000F_(*_^1_%TRA Q_,Q = DRIVER'S PRIORITY_^1_%ALS 4_,SHIFT IT_^1_%EAQ Q_,Q= REQUEST PRIORITY, COMPLETION PRIORITY_^1_%LDA€€- ESTAT1,I_$ESTAT1 TO A_^1_%AND- H0002_(GET REQUEST TYPE (FORMATED, UNFORMATED)_^1_%SAZ I193_)SKIP DOWN IF UNFORMATED_^1_%ENA 6_,FORMATED REQUEST CODE TO A_^1_%JMP* I194_)JUMP DOWN_^1I193_!EQU I193(*)_^1_%ENA 2_,UNFORMATED REQUEST CODE TO A_^1I194_!EQU I194(*)_^1_%ALS 9_,SHIFT LEFT TO PROPER POSITION_^1_%EAQ A_,ADD PRIORITIES_^1_%STA* REQCDE_'STORE IN REQUEST_^1_%SPC 4_^1**€€*_"COMPLETE THE REQUEST_^1_%SPC 2_^1_%RTJ- (RCMPRQ)_$COMPLETE THE REQUEST_^1_%ENA 1_,SET REQUEST COMPLETED FLAG_^1_%STA- REQCFL,I_$*_^1_%SEF- EREQST,15,1,I SET DRIVER ACTIVE BIT IN EREQST_^1_%LDA* LUNIT_(RESTORE LOGICAL UNIT INTO PDT_^1_%STA- ELU,I_(*_^1_%LDA- I_,GET PDT ADDRESS_^1_%STA PDTADR_'SAVE INTERNALLY_^1_%SPC 4_^1****_!PROCESS THE REQUEST_^1_%SPC 2_^1I19415 EQU I1941€€5(*)_^1_%RTJ_!K1827_"GO TO KERNEL, PROCESS REQUEST_^1_%SAM I1942_^1_%LDA- REQCFL,I_$IF REQUEST ALREADY COMPLETED THEN_^1_%SAN I19418_'SKIP DOWN_^1_%JMP* I110_)ELSE GO TO COMPLETE THE REQUEST_^1I19418 EQU I19418(*)_^1_%SET A_,IDLE THE CLOCK_^1_%STA- EDCLK,I_%*_^1_%STA- ELU,I_(SET LOGICAL UNIT IN PDT TO FFFF_^1_%CLF- EREQST,15,1,I CLEAR DRIVER ACTIVE BIT IN EREQST_^1_%JMP* I10_*€€CONTINUE_^1I1942 EQU I1942(*)_^1_%RTJ MAKEQ_^1_%LDA- DIAGLU,I_^1_%SUB- ELU,I_"COMPARE PRESENT AND DIAGNOSTIC LU_^1_%SAN I1943_^1_%JMP* I110_^1I1943 EQU I1943(*)_^1_%LDA- REQCFL,I_$REQUEST COMPLETED FLAG TO A_^1_%SAZ I195_)SKIP IF REQUEST HAS NOT BEEN COMPLETED_^1_%LDA* COMPAD_'COMPUTE REQUEST ADDRESS_^1_%SUB =XREQCOM-REQCDE_^1_%STA- EPTR,I_'*_^1I195_!EQU I195(*)_^1_%LDQ- E€€LU,I_(SET UP FAULT CODE FOR THE ALTERNATE DEVICE_^1_%QLS 6_,HANDLER (LU/CODE) - (15-6,5-0)_^1_%ADQ- FLTCOD,I_^1_%RTJ LOG_*LOG ERROR IN ENGINEERING FILE_^1_%JMP ALTDEV_!ALTDEV REASSIGNS REQUEST OR REPORTS ERR_^1_%SPC 2_^1_%SPC 4_^1BUFR1 BZS BUFR1(MAXBUF) INTERNAL BUFFER (NEW BUFFER)_^1ADTBFR BZS ADTBFR(69)_"ADT BUFFER_^1PDTADR NUM 0_,PDT ADDRESS SAVED INTERNALLY_^1_%EQU B€€UFADT(ADTBFR-1) ADT BUFFER ADDRESS - 1_^1_%EJT_]_^1***_"INTERNAL REQUEST COPLETION (IN CASE OF AN ERROR)_^1_%SPC 4_^1REQCOM EQU REQCOM(*)_^1_%LDA* PDTADR_'GET SAVED PDT ADDRESS_^1_%STA- I_,RESTORE IT IN I-REG._^1_%LDA- ESTAT1,I_$IF REQUEST HAS COMPLETED WITH AN ERROR THEN_^1_%SAM I80_*SKIP DOWN_^1_%ENA 0_-CLEAR SAVED ESTAT1_^1_%STA- SVEST1,I_$*_^1_%JMP- (ADISP)_'GO TO THE DISPA€®TCHER_^1I80_"EQU I80(*)_^1_%STA- SVEST1,I_$SAVE ESTAT1_^1_%LDA- FLTCOD,I_$SAVE FAULT CODE TOO_^1_%STA- SVFLTC,I_$*_^1_%JMP- (ADISP)_'GO TO THE DISPATCHER_^1_%END ILP408_^__®PK1827 CSY/ C02 P€1_%NAM K1827_(DECK-ID C02 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$1827 LINE PRINTER KERNEL_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 5_^1****_]_^1*E_]_^1* **********************************************************************_^1*_1K1827 - KERNEL FOR 1827 LINE PRINTER_^1* ********************€€**************************************************_^1_%SPC 5_^1*_]_^1*_]_^1*_]_^1*_2FUNCTION_^1*_2--------_^1*_]_^1*_(THE LINE PRINTER KERNEL IS THE PROGRAM THAT ACTUALLY_^1*_(PERFORMS THE OUTPUT TO THE PRINTER._^1*_]_^1*_2GENERAL DESCRIPTION_^1*_2-------------------_^1*_]_^1*_(THE PRINTER KERNEL K1827 HANDLES FETCHING, SAVING_^1*_(AND CHECKING STATUSES , INITIATING OUTPUT, CONTIN€€UING_^1*_(OUTPUT, TIMEOUT ERRORS, AND FAULT CODES. IT ALSO_^1*_(EDITS CHARACTERS AS THEY ARE PASSED TO THE PRINTER_^1*_(CONTROLLER FOR PRINTING AND FORMATTING DIRECTIVES._^1*_(WHEN A PRINT OR FORMATTING COMMAND IS ENCOUNTERED,_^1*_(THE KERNEL SENDS THE APPROPRIATE COMMAND TO THE_^1*_(CONTROLLER AND THEN PASSES CONTROL TO THE WAIT_^1*_(SUBROUTINE. THE WAIT SUBROUTINE NORMALLY PASSE€€S_^1*_(CONTROL TO THE DISPATCHER SO WORK MAY PROCEED ON_^1*_(OTHER PROGRAMS WHILE THE PRINTER IS PERFORMING ITS_^1*_(OPERATION. ALL DATA TRANSFERS ARE DONE IN ADT MODE._!123*4589_^1*_(UNEXPECTED CALLS TO THE CONTINUATOR ARE RECORDED AS_^1*_(GHOST INTERRUPTS AND NOT PROCESSED FURTHER._^1*_]_^1*_2INPUT REQUIREMENTS_^1*_]_^1*_(ENTRY IS BY ONE OF THE ENTRY POINTS K1827, C1827,_^1*_(OR €€E1827, THE INITIAL, CONTINUATOR, AND TIME OUT_^1*_(ENTRIES RESPECTIVELY. FOR K1827 THE ADDRESS OF THE_^1*_(PDT IS EXPECTED IN THE I REGISTER, OTHER ENTRY POINTS_^1*_(EXPECT IT IN THE Q REGISTER. IN EVERY CASE THE STATUS_^1*_(OF THE CURRENT REQUEST SHOULD BE INDICATED BY THE_^1*_(ENTRIES IN THE PHYSICAL DEVICE TABLE._^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1****_]_^1*E_]_€€^1*_]_^1*_]_^1*_2OUTPUT_^1*_2------_^1*_]_^1*_(THE OUTPUTS OF THE PRINTER KERNEL ARE:_^1*_]_^1*_2A. STATUS_^1*_5INITIATOR STATUS TO PDT_^1*_5CONTINUATOR STATUS TO PDT_^1*_5TIME OUT STATUS TO PDT_^1*_]_^1*_2B. FAULT CODE (FLTCOD) IS SET IF ERROR_^1*_5OCCURS AS FOLLOWS:_^1*_50_!TIME OUT_^1*_52_!ALARM_^1*_53_!PARITY_^1*_55_!INTERNAL REJECT_^1*_56_!EXTERNAL REJECT_^1*_]_^1*_5ALSO BIT 1€€4 OF EREQST_^1*_]_^1*_2C._^1*_5DATA IN CALLER'S BUFFER IS SENT TO_^1*_5BUFFER_^1*_]_^1*_2D. GHOST INTERRUPT COUNTER IS STEPPED IF_^1*_5GHOST INTERRUPT HAS OCCURED_^1*_]_^1*_]_^1*E_]_^1*_2ENTRY/EXIT_^1*_2----------_^1*_2ENTRY -_^1*_]_^1*_2A. K1827 - ENTERED BY RETURN JUMP BY DRIVER_^1*_5INITIATOR_^1*_]_^1*_2B. C1827 - ENTERED BY THE INTERRUPT_^1*_5PROCESSOR WHENEVER AN INTERRUPT OC€€CURS._^1*_]_^1*_2C. E1827 - TIME OUT ADDRESS, ENTERED_^1*_5WHEN DIAGNOSTIC CLOCK COUNTER BECOMES_^1*_5NEGATIVE_^1*_]_^1*_2EXIT_!-_^1*_2A. EXITS TO CALLING ROUTINE (DRIVER)_^1*_5ON:_^1*_123*4589_^1INI020 EQU INI020(*)_J123*4589_^1_%RTJ DMI_*ENABLE MICRO INTERRUPT_/123*4589_^1INI030 EQU I€€NI030(*)_J123*4589_^1_%JMP* (INITIO)_^1_%EJT_]_^1* **********************************************************************_^1*_1NEXTIO NEXT INPUT/OUTPUT SUBROUTINE_^1* **********************************************************************_^1NEXTIO NOP 0_%ENTRY/EXIT CONTINUES REQUEST PROCESSING_^1_%ENA FINISH_'BIT SHOWING REQUEST PROCESSED_^1_%AND- ESTAT1,I_$CHECK IF REQ IS DONE_€€^1_%SAZ NEX002_'NOT DONE, CONTINUE_^1_%JMP* NEX040_^1NEX002 LDA- MTNREQ,I_$CHECK IF MOTION REQUEST_^1_%SAZ NEX005_'NO_^1_%RTJ MOTREQ_'CHECK IF ANYTHING LEFT TO DO_^1_%SAN NEX003_'A MOTION REQ TO BE DONE_^1_%JMP* NEX040_'MOTION REQUEST FINISHED_^1_%RTJ OUT1_)OUTPUT MOTION REQUEST CHARACTER_^1NEX003 EQU NEX003(*)_J123*4589_^1_%JMP* NEX026_^1NEX005 LDA- MOTCMD,I_$CHECK IF PAPER €€MOTION NEEDED_^1_%SAZ NEX010_^1_%CLR Q_,RESET THE MOTION REQUEST CONTROL WORD_^1_%STQ- MOTCMD,I_^1NEX010 RTJ PAGE_)CHECK FOR PAGE CONTROL_^1_%RTJ* FILL_)FILL ONE CHARACTER INTO ADT BUFFER_"123*4589_^1_%RTJ SPFILL_'FILL WITH BLANKS IF NECESSARY_(123*4589_^1_%RTJ* CHARPR_^1_%STA* ASAVE_)SAVE A VALU_^1_%TRA Q_,TRANSFER FUNCTION TO Q_^1_%INQ -$3A_)IS IT PRINT COMMAND?_^1_%SQN NE€€X020_'SKIP IF IT IS NOT_^1_%LDA- CHARCT,I_$CHARACTER COUNT TO A_^1_%INA -1_+IF CHARACTER COUNT IS MORE THAN ONE THEN_^1_%SAN NEX028_'GO TO PRINT_^1*_8ELSE_^1_%STA* ASAVE_(CLEAR SAVED FUNCTION_^1NEX020 EQU NEX020(*)_^1_%LDQ- ADTBUF,I_$Q = ADT BUFFER -1_4123*4589_^1_%LDA- 1,Q_*GET THE CHARACTER FROM BUFFER_(123*4589_^1_%ARS 8_,RIGHT JUSTIFY IT_5123*4589_^1_%RTJ OUT1_)OUTPUT FIR€€ST CHACTER_1123*4589_^1_%LDA* ASAVE_(GET FUNCTION RETURNED FROM CHARPR_^1_%SAN NEX027_'SKIP DOWN IF NOT ZERO_^1NEX026 EQU NEX026(*)_J123*4589_^1_%ENA RESET_(RESET FUNCTION IF ZERO_^1NEX027 EQU NEX027(*)_^1_%RTJ* FUNCTN_'DO THE FUNCTN_^1_%JMP* NEX030_'GO EXIT_>123*4589_^1NEX028 EQU NEX028(*)_J123*4589_^1_%RTJ DMI_*ENABLE MICR INTERRUPT_0123*4589_^1NEX030 EQU NEX030(*)_J123*45€€89_^1_%RTJ LPWAIT SET DIAGNOSTIC TIME CLOCK AND EXIT TO DISP_^1NEX040 JMP* (NEXTIO)_$LEAVE THE CONTINUATOR_^1*_]_^1*_]_^1ASAVE NUM 0_,FUNCTION SAVED HERE_^1_%EJT_]_^1* **********************************************************************_^1*_1CKSTAT SUBROUTINE CHECK STATUS_^1* **********************************************************************_^1_%SPC 2_^1CKSTAT NOP 0_%E€€NTRY/EXIT TO CHECK STATUS ROUTINE_^1_%RTJ* STATUS FETCH AND RECORD STATUS_^1CKS010 AND* CKSA,Q SAVE ONLY BITS TO BE CHECKED_^1_%EOR* CKSB,Q TEST FOR UNEXPECTED CONDITIONS_^1_%SAZ CKS030 IF NO ALARM OR PARITY ERRORS_^1_%STA- BLNKCT,I SAVE BAD BITS_^1_%ALS 9_^1_%SAM CKS020 IF PARITY ERROR_^1_%ENA ALARM_!ENTER ALARM CONDITION INDICATOR_^1_%JMP* CKS015_^1CKS020 ENA PARITY €€ ENTER PARITY ERROR ERROR INDICATOR_^1CKS015 EQU CKS015(*)_^1_%JMP F1827_(EXIT VIA FAULT ROUTINE_^1CKS030 JMP* (CKSTAT)_^1*_]_^1*_(PRINTER CONTROLLER STATUS BITS_^1*_]_^1_%EQU RDYBIT(1)_'READY BIT_^1_%EQU BSYBIT(2)_'BUSY BIT_^1_%EQU INTBIT($4)_%INTERRUPT BIT_^1_%EQU DATBIT($8)_%DATA BIT, READY FOR DATA_^1_%EQU EOPBIT($10)_%END OF OPERATION BIT_^1_%EQU ALMBIT($20)_$ALARM BIT€€ PAPER OUT,MALFUNCTION_^1_%EQU ERRBIT($40)_$ERROR BIT_^1_%EQU PRTBIT($80)_$PROTECT BIT_^1_%EQU ADTBIT($200)_#ADT BIT_^1_%EQU PPOBIT($400)_#PAPER OUT BIT_^1_%EQU BOFBIT($800)_#BUFFER OVERFLOW BIT_^1*_]_^1*_(BITS REQUIRED FOR STATUS CHECK_^1*_]_^1_%EQU BITS2(EOPBIT+DATBIT+INTBIT+BSYBIT+RDYBIT)_^1_%EQU BITS3(PPOBIT+ADTBIT+ERRBIT+ALMBIT)_^1*_]_^1_%EQU BITS1(BOFBIT+PPOBIT+ADTBIT€€+ERRBIT+ALMBIT)_^1*_]_^1CKSA_!ADC BITS1+BITS2 BITS REQUIRED FOR INITIATOR CKSTAT_^1_%ADC BITS2+BITS3 BITS REQUIRED FOR CONTINUATOR CKSTAT_^1*_(THESE BITS EXPECTED ON, OTHERS MUST BE OFF_^1*_(AT INITIATOR, CONTINUATOR CKSTAT RESPECTIVELY_^1CKSB_!ADC DATBIT+RDYBIT+EOPBIT THESE BITS EXPECTED ON,OTHERS OFF_^1_%ADC EOPBIT+DATBIT+RDYBIT THESE BITS EXPECTED_*123*4589_^1_%EJT_]_^1* €€**********************************************************************_^1*_$STATUS SUBROUTINE_N*_^1* **********************************************************************_^1*_]_'*_^1*_(SAVES STATUS IN ESTAT2 AND SENTRY OR SINTER OR STIMEO_^1*_$ACCORDING TO INDEX IN Q REG._B*_^1_%SPC 2_^1STATUS NOP 0_%ENTRY/EXIT TO STATUS ROUTINE_^1_%SET A_^1_%STA- SENTRY,B CLEAR STATUS IN CA€€SE OF REJECT_^1_%STQ* STA010 SAVE Q REG CONTENTS_^1_%LDQ- EWES,I FETCH EQUIPMENT ADDRESS_^1_%INP REJECT-*_^1_%STA- ESTAT2,I SAVE CURRENT STATUS_^1_%LDQ* STA010 RESET Q WITH INDEX_^1_%STA- SENTRY,B RECORD STATUS_^1_%JMP* (STATUS)_^1STA010 NUM 0_%TEMP FOR CONTENTS OF Q REGISTER_^1_%SPC 2_^1* **********************************************************************_^1*_1CHARPR €€CHARACTER PROCESSOR ROUTINE_^1* **********************************************************************_^1_%SPC 2_^1CHARPR NOP 0_%ENTRY/EXIT TO CHARACTER PROCESSING ROUTINE_^1CHA010 LDA- ECCOR,I_^1_%SUB- ELSTWD,I_^1_%SAP CHA015_'END OF BUFFER_^1_%LDA- CHARCT,I_$NUMBER OF CHARS IN LINE_^1_%SUB- LINLEN,I_^1_%INA -1_+DECREMENT FOR CONTROL CHARACTER_%123*4589_^1_%SAM CHA020_'LINE €€NOT FULL_^1_%ENQ 1_^1_%RTJ FTNFMT_'CHAR CALL TO FTNFMT_^1_%SAZ CHA020_'UNFORMATTED, KEEP LOOKING FOR CONTROL_^1_%ENQ 1_,FORMATTED,DO AN UPSPACE_^1_%STQ- MOTCMD,I_%FTER PRINTING BUFFER_0123*4589_^1_%JMP* (CHARPR)_^1CHA015 ENA FINISH_'BIT SHOWING REQUEST PROCESSED_^1_%EOR- ESTAT1,I_$SET THE BIT_^1_%STA- ESTAT1,I_$SO IT WILL TERMINATE AFTER INTERRUPT_^1_%ENQ 1_^1_%RTJ FTNFMT_'C€€HARACTER PROCESSING CALL_^1_%JMP* (CHARPR)_^1CHA020 RTJ* NXTCHR_!FETCH NEXT CHARACTER FROM BUFFER_^1_%TRA Q_%DUPLICATE THE CHARACTER_^1_%INQ -$20_^1_%SQM CHA030 IF THIS CHARACTER IS SPECIAL_^1_%INQ -$40_)CHECK FOR LARGER THAN $5F_^1_%SQM CHA025_'SKIP IF IN RANGE $20-$5F_^1_%INQ -$1F_)IS IT AN $7F_^1_%SQZ CHA027_'YES, IGNORE IT_^1_%INA -$20_)NO, IN RANGE $60-$7E, MAKE $40-$€€5E_"126*4722_^1CHA025 RTJ* FILL_)FILL PRINTER BUFFER WITH A CHARACTER_^1CHA027 JMP* CHA010_'TRY ANOTHER CHARACTER_^1CHA030 RTJ EDIT_^1_%SAN CHA040 IF EDIT FOUND A PRINT COMMAND._^1_%JMP* CHA010 SPECIAL CHAR WAS UNRECOGNIZED, RESUME PROCESSING_^1CHA040 JMP* (CHARPR)_^1_%EQU CHAA(2)_!MASK FOR FORMATTED/UNFORMATTED REQUEST BIT_^1_%EJT_]_^1* **************************************€€********************************_^1*_1FUNCTN FUNCTION DEVICE SUBROUTINE_^1* **********************************************************************_^1_%SPC 2_^1FUNCTN NOP 0_%ENTRY/EXIT_!FUNCTIONS CONTROLLER_^1_%LDQ- EWES,I_^1_%OUT REJECT-*_^1_%CLR A_,YES, RESET BLNKDT TO ZERO_^1_%STA- BLNKDT,I_^1_%STA- CHARCT,I_$RESET CHARACTER COUNT PER LINE_^1_%JMP* (FUNCTN)_$RETURN TO CALLER€€_^1* **********************************************************************_^1_%SPC 2_^1*_1REJECT SECTION_^1* **********************************************************************_^1REJECT JMP* REJ010 COMES HERE FOR INTERNAL REJECT_^1_%ENA EXTREJ_!EXTERNAL REJECT FAULT CODE_^1_%JMP* REJ020_^1REJ010 ENA INTREJ INTERNAL REJECT FAULT CODE_^1REJ020 ENQ -1_^1_%STQ- EDCLK,I STOP €€THE DIAGNOSTIC CLOCK_^1_%JMP F1827_(GO TO FAULT ROUTINE_^1_%EJT_]_^1* **********************************************************************_^1*_1NXTCHR FETCH NEXT CHARACTER SUBROUTINE_^1* **********************************************************************_^1_%SPC 2_^1NXTCHR NOP 0_%ENTRY/EXIT FETCHES NEXT CHAR FROM USER BUF TO A_^1_%ENA NXTA_^1_%EOR- ESTAT1,I_^1_%STA- ESTA€€T1,I_^1_%AND- FOURHX SAVE ONLY THE FLAG BIT_^1_%LDQ- ECCOR,I_^1_%LDQ* (NXTZ),Q FETCH NEXT WORD FROM USER'S BUFFER_^1_%SAN NXT010 IT'S UPPER CHAR_^1_%RAO- ECCOR,I BUMP TO NEXT WORD, USERS BUFFER_^1_%LLS 8_^1NXT010 LLS 8_^1_%AND* NXTB_^1_%JMP* (NXTCHR)_^1_%SPC 2_^1NXTA_!EQU NXTA($4) MASK BIT 4 EXTRACTS UPPER/LOWER CHAR BIT_^1NXTB_!NUM $7F_#MASK FOR CHARACTERS_^1NXTZ_!NUM 0€€_^1_%SPC 2_^1_%EQU FOURHX($25)_!MASK FOR UPPER/LOWER CHAR FLAG_^1* **********************************************************************_^1*_2FILL SUBROUTINE_^1*_*FILLS ADT BUFFER WITH ONE CHARACTER_0123*4589_^1* **********************************************************************_^1FILL_!NUM 0_R123*4589_^1_%LDQ- CHARCT,I_$CHARACTER COUNT TO Q_1123*4589_^1_%SBQ- LINLEN,I_$IF €€LINE IS FULL THEN_1123*4589_^1_%INQ -1_+DECREMENT FOR CONTROL CHARACTER_%123*4589_^1_%SQM FIL008_^1_%JMP* FIL020_'SKIP FILLING BUFFER_^1FIL008 ENQ $20_*CHECK IF A BLANK JUST SENT_^1_%EAQ Q_^1_%SQZ FIL010_'A BLANK_^1_%RAO- BLNKDT,I_$SHOW A NON-BLANK WAS SENT_^1FIL010 EQU FIL010(*)_J123*4589_^1_%LDQ- CHARCT,I_$ADT CHARACTER POSITION TO Q_*123*4589_^1_%LR1- ADTBUF,I_$R1 = ADT BU€€FFER ADDRESS -1_+123*4589_^1_%SCA- 1,Q,1_(STORE THE CHARACTER IN ADT BUFFER_#123*4589_^1_%ENA $20_*BLANK TO A_;123*4589_^1_%INQ 1_,INCREMENT CHARACTER POINTER_*123*4589_^1_%SCA- 1,Q,1_(STORE THE CHARACTER IN ADT BUFFER_#123*4589_^1_%RAO- CHARCT,I_$INCRMENT CHARACTER COUNT_^1FIL020 EQU FIL020(*)_J123*4589_^1_%JMP* (FILL)_^1_%SPC 5_^1* ********************************************€€**************************_^1*_1SPFILL SPACE FILL SUBROUTINE_^1* **********************************************************************_^1_%SPC 2_^1SPFILL NOP 0_$SPACE FILL SUBROUTINE_^1_%ENA $20_^1SPF010 LDQ- BLNKCT,I_^1_%SQP SPF020 IF BLANK COUNT EXHAUSTED_^1_%RTJ* FILL_"SEND BLANK TO PRINTER_^1_%RAO- BLNKCT,I ADJUST COUNT OF BLANKS STILL REQ'D_^1_%JMP* SPF010 CONTINUE_^1S€€PF020 JMP* (SPFILL)_$SPACE FILL ACCOMPLISHED_^1_%EJT_U123*4589_^1*_$SUBROUTINE TO OUTPUT THE FIRST CHARACTER TO THE PRINTER 123*4589_^1OUT1_!NUM 0_R123*4589_^1_%LDQ- EWES,I_'EQUIPMENT CODE TO Q_2123*4589_^1_%INQ -1_+*_D123*4589_^1_%OUT REJECT-*_$OUTPUT THE FIRST CHARACTER_+123*4589_^1_%ENA RESET_(CLEAR, EOP, ALARM_4123*4589_^1_%RTJ* FUNCTN_'DO IT_@123*4589_^1_%JMP* (OUT1)_'EXI€€T_A123*4589_^1_%EJT_U123*4589_^1*_] 123*4589_^1*_$SUBROUTINE TO SET ADT TABLE AND ENABLE MICRO INTERRUPT_!123*4589_^1*_] 123*4589_^1*_] 123*4589_^1DMI_"NUM 0_R123*4589_^1_%LDA- ADTBUF,I_$ADT BUFFER ADDRESS- 1 TO A_+123*4589_^1_%STA- ADTTBL+1,I_"SAVE IN ADT TABLE, WORD 2_,123*4589_^1_%LDA- CHARCT,I_$GET CHARACTER COUNT_2123*4589_^1_%INA -1_+SUBTRACT CONTROL CHARACTER_^1_%ARS 1_,D€€IVIDE BY 2_:123*4589_^1_%INA 1_,ADD 1 FOR A POSSIBLE ODD CHAR_(123*4589_^1_%ADD- ADTTBL+1,I_"A = LAST WORD ADDRESS_0123*4589_^1_%STA- ADTTBL+2,I_"SOTRE IN WORD 3 OF ADT TABLE_)123*4589_^1_%LDA- EWES,I_'GET EQUIPMENT ADDRESS_0123*4589_^1_%INA -1_+RESET BIT 0 TO INDICATE DATA_)123*4589_^1_%EOR* CHRWRT_'SET CHARACTER MODE AND WRITE OPERATION123*4589_^1_%STA- ADTTBL,I_$SAVE IN ADT TA€€BLE_4123*4589_^1_%LDA- MICROI,I_$GET MICRO INTERRUPT NO._.123*4589_^1_%EOR- HX8000_'SET BIT 15 TO ENABLE MICRO INTERRUPT 123*4589_^1_%TRA Q_,Q = MICRO INTERRUPT LINE NO + BIT 15 123*4589_^1_%LDA- I_,PDT ADDRESS TO A_5123*4589_^1_%INA ADTTBL_'A = ADT TABLE ADDRESS_0123*4589_^1_%DMI_/DEFINE MICRO INTERRUPT_/123*4589_^1_%ENA $41_*ADT, CLEAR CONTROLLER_0123*4589_^1_%RTJ* FUNCTN_'D€òO IT_@123*4589_^1_%ENA $58_*ADT MODE, INTERRUPT ON ALARAM AND EOP 123*4589_^1_%RTJ* FUNCTN_'DO IT_@123*4589_^1_%JMP* (DMI)_(EXIT_A123*4589_^1_%SPC 3_R123*4589_^1CHRWRT NUM $2800_(CHARACTER MODE, WRITE OPERATION BITS 123*4589_^1_%END_]_^__òPLPWAIT CSY/ C03 P€1_%NAM LPWAIT_'DECK-ID C03 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$1827 LINE PRINTER WAIT ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1* **********************************************************************_^1*_1WAIT_!ANCILLARY ROUTINE_^1* ********************************€€**************************************_^1_%SPC 2_^1_%EQU ADISP($EA) CELL CONTAINING DISPATCHER ADDRESS_^1_%EQU EDCLK(4) CLOCK ENTRY TO PHYSICAL DEVICE TABLE_^1_%EQU TIMOUT(20) PDT WORD OF DIAGNOSTIC TIME INTERVAL_^1*_]_^1*_]_^1_%ENT LPWAIT WAIT SUBROUTINE_^1LPWAIT NOP 0_%ENTRY/EXIT_^1*_]_^1_%LDA- TIMOUT,I DIAGNOSTIC TIME INTERVAL_^1_%STA- EDCLK,I SET DIAGNOSTIC CLOCK_^1_%€<JMP- (ADISP) EXIT TO DISPATCHER, WAIT INTERUPT_^1_%END_]_^__<PCKGINT CSY/ C04 P€1_%NAM CKGINT_'DECK-ID C04 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$1827 LINE PRINTER CHECK GHOST INTERRUPT ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1* **********************************************************************_^1*_1CKGINT CHECK GHOST INTERRUPT ANCILLARY ROU€€TINE_^1* **********************************************************************_^1_%SPC 2_^1_%ENT CKGINT_^1_%EXT* STATUS STATUS SUBROUTINE_^1_%EXT CGHOST_'GHOST INT/CONSTANT INT SUBROUTINE_^1_%EQU CLRINT(1) CLEAR INTERRUPTS COMMAND_^1_%EQU CONTST(1) INDEX FOR CONTINUATOR STATUS_^1_%EQU EDCLK(4)_$04 DIAGNOSTIC CLOCK_^1_%EQU EREQST(8) REQUEST WORD OF PHYSICAL DEVICE TABLE€€_^1_%EQU EWES(7) CONVERTER, EQUIPMENT, STATION_^1_%EQU GHOSTI(18)_!GHOST INTERRUPT COUNTER_^1CKGINT NOP 0_%ENTRY/EXIT_^1_%LDA- EREQST,I CHECK FOR GHOST INTERRUPT_^1_%SAM CKG020 IF NOT A GHOST INTERRUPT_^1CKG010 RAO- GHOSTI,I INCREMENT COUNT OF GHOST INTERRUPTS_^1_%ENQ CONTST INDEX TO PLACE STATUS IN CONTINUATOR WORD_^1_%RTJ STATUS SAVE STATUS IN PHYSICAL DEVICE TABLE_^1_%E€ÚNA CLRINT_^1_%LDQ- EWES,I EQUIPMENT ADDRESS_^1_%OUT 1_^1_%NOP 0_^1_%RTJ CGHOST_'GO CHECK FOR CONSTANT OR OVER 100 GHOST INTS._^1CKG020 ENA -1_^1_%STA- EDCLK,I STOP DIAGNOSTIC CLOCK_^1_%JMP* (CKGINT)_^1_%END_]_^__ÚPEDIT CSY/ C05 P€1_%NAM EDIT_)DECK-ID C05 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$1827 LINE PRINTER EDIT SPECIAL CHARACTERS ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1* **********************************************************************_^1*_$EDIT EDIT SPECIAL CHARACTERS ROUTINE_^1* *€€*********************************************************************_^1_%SPC 5_^1*_]_^1*_]_^1*_(PDT EQUATES_^1*_]_^1_%EQU ELVL(0)_%00 SCHEDULER CALL WITH DRIVER LEVEL_^1_%EQU EDIN(1)_%01 DRIVER INITIATOR ENTRY_^1_%EQU EDCN(2)_%02 DRIVER CONTINUATOR ENTRY_^1_%EQU EDPGM(3)_$03 DRIVER DIAGNOSTIC ENTRY_^1_%EQU EDCLK(4)_$04 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'05 LOGICAL UNIT_€€^1_%EQU EPTR(6)_%06 PARAMETER LOCATION_^1_%EQU EWES(7)_%07 CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#08 REQUEST STATUS_^1_%EQU ESTAT1(9)_#09 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 CURRENT LOCATION_^1_%EQU ELSTWD(11)_"11 LAST LOCATION PLUS ONE_^1_%EQU ESTAT2(12)_"12 DEVICE STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH (IF MASS MEMORY)_^1_%EQU MASSEC(14)_"14 NAME €€ASSOCIATED WITH SECTOR NUMBER_^1_%EQU RETURN(15)_"15 RESERVED FOR FNR AND CMR_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF A REQUEST ERROR OCCURS_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO-INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 TIMEOUT PERIOD TO WAIT FOR AN INTERRUPT_^1_%EQU SENTRY(21)_"21 STAT€€US AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU FTNLU(24)_#24 FORTRAN LOGICAL UNIT NUMBER_^1_%EQU MOTCMD(25)_#25 PAPER MOTION COMMAND WORD_^1_%EQU BLNKCT(26)_"26 COUNT FOR SPACE FILL_^1_%EQU CHARCT(27)_"27 CHARACTER OUTPUT COUNT_^1_%EQU LINLEN(28)_"28_"NUMBER OF CHARACTERS PER LINE_^1_%E€€QU LINCT(29)_#29 LINE COUNT_^1_%EQU MAXLIN(30)_#30 MAX NUMBER OF LINES PER PAGE_^1_%EQU MTNREQ(31)_"31 MOTION REQUEST WORD SAVED HERE_^1_%EQU BLNKDT(32)_"32 ZERO IF LINE IS ALL BLANKS_^1_%EQU TABCT(20)_'NUMBER OF SPACES TO TAB_^1*_]_^1*_]_^1_%SPC 3_^1_%ENT EDIT_^1_%SPC 3_^1_%EXT* NXTCHR_^1_%EXT* SPFILL SPACE FILL SUBROUTINE_^1_$EJT_]_^1EDIT_!NOP 0_%ENTRY/EXIT TRANSLAT€€ES FORMAT CHARACTERS_^1_%INA -3_+$03 EOT -END OF TEXT- PRINT,SPACE 1 LINE,_^1*_BTERMINATE REQUEST_^1_%SAZ EDI025_'SKIP IF = $03_^1_%INA -1_+$04 EOT -END OF TEXT- SAME AS $03_^1_%SAN EDI030_'SKIP IF NOT = $04_^1EDI025 LDQ- ELSTWD,I_$TERMINATE REQUEST FOR $03,$04_^1_%STQ- ECCOR,I_^1EDI027 ENA 1_,SET UP FOR SINGLE SPACE_^1EDI028 STA- MOTCMD,I_^1EDI029 ENA $3A_*SET UP FOR PRINT,E€€OP AND ALARM INTS, CLEAR INT_^1_%JMP* (EDIT)_'RETURN TO CALLER_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1EDI030 INA -5_+$09 HTAB -HORIZONTAL TAB- BLANK OUT UP TO TAB_^1_%SAN EDI080_'SKIP IF NOT = $09_^1_%CLR Q_,CALCULATE AMOUNT OF TAB-FILL OF BLANKS_^1_%LDA- CHARCT,I_^1_%DVI =XTABCT_^1_%INQ -TABCT_'GET DIFFERENCE BETWEEN CHARCT AND NEXT TAB_^1€€_%STQ- BLNKCT,I_$PDT SLOT FOR COUNT_^1_%RTJ SPFILL_'SPACE FILL SUBROUTINE_^1_%JMP* EDI125_'RETURN - NO I/O_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1EDI080 INA -2_+$OB VTAB -VERTICAL TAB- SELECT CHANNEL 2,_^1*_APRINT, AND CONTINUE_^1_%SAN EDI100_'SKIP IF NOT = $0B_^1_%ENA $41_*CHANNEL 2 SELECTION_^1_%JMP* EDI105_'SET UP HTABING TO CONTINUE_^1* €€* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1EDI100 INA -1_+$0C TOF -TOP OF FORM- SELECT CHANNEL 1_^1_%SAN EDI110_'SKIP IF NOT = $0C_^1_%ENA $40_*CHANNEL 1 SELECTION_^1EDI105 STA- MOTCMD,I_^1_%RTJ* EDI200_'SET UP SPACE FILL COUNT_^1_%JMP* EDI029_'SET UP PRINT AND LEAVE_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1EDI110 I€€NA -1_+$0D CARRIAGE RETURN -PRINT AND SPACE 1 LINE_^1_%SAN EDI120_'SKIP IF NOT = $0D_^1_%JMP* EDI027_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1EDI120 INA -14_*$1B ESCAPE -LOOK AT NEXT CHARACTER_^1_%SAZ ESCAPE_'SKIP IF = $1B_^1EDI125 CLR A_,SET UP FOR NO I/O_^1_%JMP* (EDIT)_^1EDI200 NOP 0_^1_%LDA- CHARCT,I_$SET UP FILL COUNT TO CONTINUE_^1_%IN€€A -1_+DECREMENT FOR CONTROL CHARACTER_^1_%TCA A_^1_%INA 0_^1_%STA- BLNKCT,I_^1_%JMP* (EDI200)_^1* **********************************************************************_^1*_1ESCAPE ROUTINE PROCESS PAPER CONTROL CHAR_^1* **********************************************************************_^1_%SPC 3_^1ESCAPE RTJ NXTCHR_'GET NEXT CHARACTER_^1_%INA -$30_)< $30 IF SO, IGNORE, €€NO I/O_^1_%SAP ESC020_'SKIP IF >= $30_^1_%JMP* EDI125_'LEAVE, NO I/O_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1ESC020 INA -$F_*$3F SELECT 8 LINES PER INCH (IGNORE - N/A)_^1_%SAN ESC030_'SKIP IF NOT = $3F_^1_%JMP* EDI125_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1ESC030 INA -1_+$40 CLEAR CONTROLLER AND CONTINUE_^€€1_%SAN ESC040_'SKIP IF NOT = $40_^1_%RTJ* EDI200_'SET UP SPACE FILL TO CONTINUE_^1_%ENA $19_*CLEAR CONTROLLER + INTERRUPTS_^1_%JMP* (EDIT)_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1ESC040 SAM ESC050_'SKIP IF LESS THAN $3F_^1_%JMP* EDI125_'UNRECOGNIZABLE CONTROL CHARACTER - IGNORE_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * €€* * * *_^1ESC050 INA $10_*$30 PRINT, NO UPSPACING, START AT BEGINNING_^1_%SAN ESC070_'SKIP IF NOT = $30_^1_%JMP* EDI029_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1ESC070 INA -1_+$31 PRINT, SINGLE SPACE, START AT BEGINNING_^1_%SAN ESC080_'SKIP IF NOT = $31_^1_%ENA 1_,SINGLE SPACE_^1_%JMP* EDI028_^1* * * * * * * * * * * * * * * * * * * * * * * * €N* * * * * * * * * * * *_^1ESC080 INA -1_+$32 PRINT, DOUBLE SPACE, START AT BEGINNING_^1_%SAN ESC090_(SKIP IF NOT = $32_^1_%ENA 2_,DOUBLE SPACE_^1_%JMP* EDI028_^1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *_^1ESC090 INA $3F_*$33-$3E PRINT, SELECT FORMAT LEVEL 1-12,_^1_%JMP* EDI105_/CONTINUE_^1_%END_]_^__NPDUMMY CSY/ C06 P€1_%NAM DUMMY_(DECK-ID C06 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$1827 LINE PRINTER MOTION - LINE COUNT/PAGE ANCILLARY ROUTINES_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1_%ENT MOTREQ_^1_%ENT FTNFMT_'FORTRAN/FORMATTING ROUTINE_^1_%ENT PAGE_)LINE COUNT/PAGE ROUTINE_^1_%SPC 4_^1_%EXT* NXTCHR_'€€ROUTINE TO GET NEXT CHAR FROM USER_^1_%SPC 6_^1_%EQU H8000($21)_"CONSTANT TO PLUG IN MTNREQ_^1_%EJT_]_^1*_]_^1*_'PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_%00 SCHEDULER CALL WITH DRIVER LEVEL_^1_%EQU EDIN(1)_%01 DRIVER INITIATOR ENTRY_^1_%EQU EDCN(2)_%02 DRIVER CONTINUATOR ENTRY_^1_%EQU EDPGM(3)_$03 DRIVER DIAGNOSTIC ENTRY_^1_%EQU EDCLK(4)_$04 DIAGNOSTIC€€ CLOCK_^1_%EQU ELU(5)_'05 LOGICAL UNIT_^1_%EQU EPTR(6)_%06 PARAMETER LOCATION_^1_%EQU EWES(7)_%07 CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#08 REQUEST STATUS_^1_%EQU ESTAT1(9)_#09 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 CURRENT LOCATION_^1_%EQU ELSTWD(11)_"11 LAST LOCATION PLUS ONE_^1_%EQU ESTAT2(12)_"12 DEVICE STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH (IF MA€€SS RESIDENT)_^1_%EQU MASSEC(14)_"14 NAME ASSOCIATED WITH SECTOR NUMBER_^1_%EQU RETURN(15)_"15 RESERVED FOR FNR AND CMR_^1_%EQU FLTCOD(16)_"16 FAULTCODE IF A REQUEST ERROR OCCURS_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO-INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 TIMEOUT PERIOD TO WAIT FOR €€AN INTERRUPT_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU FTNLU(24)_#24 FORTRAN LOGICAL UNIT NUMBER_^1_%EQU MOTCMD(25)_"25 PAPER MOTION COMMAND WORD_^1_%EQU BLNKCT(26)_"26 COUNT FOR SPACE FILL_^1_%EQU CHARCT(27)_"27 CHARACTER OUTPUT COUNT_^1_%EQU LINLEN(28€€)_"28 NUMBER OF CHARACTERS PER LINE_^1_%EQU LINCT(29)_#29 LINE COUNT_^1_%EQU MAXLIN(30)_"30 MAX NUMBER OF LINES PER PAGE_^1_%EQU MTNREQ(31)_"31 MOTION REQUEST WORD SAVED HERE_^1_%EQU BLNKDT(32)_"32 ZERO IF ALL BLANKS IN LINE_^1_%EJT_]_^1* *********************************************************_^1*_X*_^1*_'FTNFMT - HANDLES FUNCTIONING/PAPER MOTION FOR_"*_^1*_0FORMATTED AN€€D FORTRAN REQUESTS_)*_^1*_X*_^1* *********************************************************_^1_%SPC 2_^1FTNFMT NOP 0_,ENTRY POINT_^1*_]_^1*_'IF UNFORMATTED, RETURN ZERO IN A_^1*_]_^1_%ENA 2_,FORMATTED BIT_^1_%AND- ESTAT1,I_$CHECK IF REQUEST IS FORMATTED_^1_%SAN FTN001_'FORMATTED_^1_%JMP* (FTNFMT)_$UNFORMATTED - RETURN 0_^1FTN001 SQZ FTN010_'INITIAL CALL_^1_%JMP* FTN100_'CHARACT€€ER CALL_^1*_]_^1*_'HANDLE INITAL CARRIAGE CONTROL (PRE-BUFFER)_^1*_]_^1FTN010 LDA- ELU,I_(CURRENT LOGICAL UNIT FOR REQUEST_^1_%EOR- FTNLU,I_^1_%SAN FTN050_'NON-FORTRAN,UPSPACE 1_^1_%RTJ NXTCHR_'GET 1ST CHAR OF USER'S BUFFER_^1_%INA -$30_)CHECK IF IT'S A ZERO_^1_%SAN FTN030_^1_%ENA 2_,DOUBLE SPACE FOR A ZERO_^1_%JMP* FTN060_^1FTN030 INA -1_+CHECK IF IT'S A ONE_^1_%SAN FTN04€€0_^1_%ENA $40_*PAGE EJECT FOR A ONE_^1_%JMP* FTN060_^1FTN040 INA 6_,CHECK IF IT'S A PLUS_^1_%SAZ FTN060_'SUPRESS SPACING IF A PLUS_^1*_]_^1FTN050 ENA 1_,SINGLE SPACE CODE_^1*_]_^1FTN060 JMP* (FTNFMT)_^1_%EJT_]_^1*_]_^1*_'SELECT APPROPRIATE FUNCTION CODE AFTER BUFFER OUTPUT_^1*_]_^1FTN100 ENA $19_*CLEAR PRINTER,EOP,ALARM_^1_%LDQ- BLNKDT,I_$CHECK IF NON-BLANKS IN BUFFER_^1_%SQZ€€ FTN110_'ALL BLANKS,DONT PRINT_^1_%ENA $3A_*CLEAR INTS,EOP,ALARM,PRINT_^1FTN110 JMP* (FTNFMT)_^1_%EJT_]_^1* *********************************************************_^1*_X*_^1*_,MOTREQ - HANDLE MSOS MOTION REQUESTS_'*_^1*_X*_^1* *********************************************************_^1_%SPC 2_^1MOTREQ NOP 0_,ENTRY POINT_^1MOT010 LDA- MTNREQ,I_$PICK UP SHIFTED REQUEST WORD_^1€€_%CLR Q_^1_%LLS 4_^1_%SQZ MOT040_'NO MORE MOTIONS_^1_%SAN MOT015_'STILL HAVE A MOTION COMMAND_^1_%TRQ A_^1_%INA -8_^1_%SAZ MOT050_'DONE_^1_%LDA- H8000_(VALUE TO SHOW MOTION STILL ACTIVE_^1MOT015 STA- MTNREQ,I_$NEW (SHIFTED) VALUE_^1_%INQ -2_+CHECK FOR WRITE EOF_^1_%SQZ MOT020_^1_%INQ -2_+CHECK FOR REW UNLOAD_^1_%SQZ MOT030_^1_%JMP* MOT010_'KEEP CHECKING_^1*_]_^1*_%EOF - €€PAGE EJT, RESET LINE COUNT, CONTINUE MOTION REQ_^1*_]_^1MOT020 STQ- LINCT,I_%SET LINE COUNT TO ZERO_^1_%ENA $40_*TOP-OF-FORMS_^1_%JMP* (MOTREQ)_^1*_]_^1*_%REW/UNL - RESET LINE COUNT, TERMINATE MOT REQ_^1*_]_^1MOT030 STQ- LINCT,I_%SET LINE COUNT TO ZERO_^1MOT040 LDA- H8000_(VALUE TO SHOW STILL A MOTION REQUEST-TILL DONE_^1MOT050 STA- MTNREQ,I_$FOR THIS REQUEST_^1_%JMP* (MOTREQ)_^1_€€%EJT_]_^1* *********************************************************_^1*_X*_^1*_'PAGE - HANDLES LINE COUNTING AND TOP-OF-PAGE_#*_^1*_X*_^1* *********************************************************_^1_%SPC 2_^1PAGE_!NOP 0_,ENTRY POINT_^1_%TRA Q_,SAVE PAPER MOTION CHAR_^1_%INA -$40_^1_%SAZ PAG020_'PAGE EJT-RESET LINE COUNT_^1_%INA $3F_^1_%SAZ PAG011_'SINGLE SPACE-BUMP LINE CO€€UNT_^1_%INA -1_^1_%SAZ PAG010_'DOUBLE SPACE-ADD 2 TO LINE COUNT_^1_%INA -1_^1_%SAN PAG015_'NOT A RECOGNIZABLE PAPER CONTROL_^1_%RAO- LINCT,I_%TRIPLE SPACE-ADD 3 TO LINE COUNT_^1PAG010 RAO- LINCT,I_^1PAG011 RAO- LINCT,I_^1PAG015 LDA- LINCT,I_%CURRENT POSITION ON PAGE_^1_%SUB- MAXLIN,I_$CHECK IF NEED TO SKIP TO NEXT PAGE_^1_%SAM PAG050_'WITHIN PAGE,OK AS IS_^1PAG020 ENA 0_^1_%S€TA- LINCT,I_%RESET LINE COUNT_^1_%LDA- ELU,I_^1_%EOR- FTNLU,I_%CHECK IF FORTRAN LU_^1_%SAZ PAG050_'YES, DONT FORCE A PAGE EJECT_^1_%ENQ $40_*DO A PAGE EJECT_^1PAG050 TRQ A_,APPROPRIATE CARRIAGE CONTROL_^1_%JMP* (PAGE)_^1*_82 CARDS DELETED_^1_%END_]_^__ PD1829 CSY/ C07 P€1_%NAM D1829_(DECK-ID C07 PERIPH. DRIVERS 1.0C SUMMARY-126_^1*_$1829-3 CARD READER KERNEL DRIVER_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 5_^1****_[126*4303_^1*_] 126*4303_^1*_] 126*4303_^1*_] 126*4303_^1*_$THIS DRIVER HAS BEEN MODIFIED TO DO THE FOLLOWING5_%126*4303_^1*_*1. RUN THE CARD €€READER IN ADT MODE._0126*4303_^1*_8(A) RUNNING PRIORITY IS NOW 10_'126*4303_^1*_8(B) DOES NOT USE AQ ALLOCATION_'126*4303_^1*_*2. OPTIONALLY READS IN 026 OR 029 MODE DEPENDING_"126*4303_^1*_-ON A FLAG SET IN WORD 43 OF THE PHYSTB._)126*4303_^1*_*3. RECOGNIZES AND PASSES CODES FOR EOF(6,7,8,9)_#126*4303_^1*_-AND EOR(7,8,9) PUNCHES FOR 200 UT SIMULATOR._#126*4303_^1*_*4. DRIVER CAN N€€OW RUN CORE-RESIDENT IN PART 1_%126*4303_^1*_-DUE TO 15 BIT ADDRESSING ERROR IN -CRPRMS- BY_"126*4303_^1*_-ELLIMINATING THE NEED TO USE THAT ROUTINE._%126*4303_^1*_*5. RECOGNIZES AND PASSES CIDE FOR LACED COLUMN (ALL 126*4303_^1*_-HOLES PUNCHED) FOR HASP WORKSTATION SIMULATOR_"126*4303_^1*_] 126*4303_^1****_[126*4303_^1_%EJT_U126*4303_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8**************€€***_^1*_8* KERNEL DRIVER *_^1*_8*****************_^1*_]_^1*_]_^1*_;FUNCTION_^1*_;--------_^1*_]_^1*_*THE KERNEL DRIVER PROCESSES 1829-3 CARD READER REQUESTS._^1*_]_^1*_]_^1*_6GENERAL DESCRIPTION_^1*_6-------------------_^1*_]_^1*_*THE CARD READER INITIATOR CHECKS FOR A USERS_^1*_*REQUEST. IF NO REQUEST EXIST CONTROL RETURNS TO_^1*_*THE SYSTEM. OTHERWISE THE REQUEST IS EXAMINED_^1*_€€*FOR USING THE DIAGNOSTIC LOGICAL UNIT. WHEN THE_^1*_*DIAGNOSTIC LOGICAL UNIT IS REFERENCE THE KERNEL_^1*_*IS CALLED TO READ RAW DATA (12 BITS/WORD). A MAX_^1*_*OF 80 COLUMNS (ONE CARD) CAN BE READ FOR THE_^1*_*REQUEST. FOR A NON-DIAGNOSTIC REQUEST THE_^1*_*DRIVER CALLS FORMAT TO READ (VIA KERNEL) AND_^1*_*CONVERT DATA AS SPECIFIED BY THE SIZE OF THE_^1*_*REQUESTERS BUFFER. FORMAT€€ WILL ALSO PERFORM_^1*_*ANY ERROR RECOVERY NEEDED BY A NON-DIAGNOSTIC_^1*_*REQUEST. THE KERNEL DRIVER COMPLETES THE REQUEST_^1*_*BY CALLING REMAKQ AND RCMPRQ TO SET UP THE V_^1*_*FIELD AND SCHEDULE THE REQUESTING PROGRAM. THE_^1*_*KERNEL DRIVER NOW LOOKS FOR ANOTHER REQUEST._^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_6INPUT REQUIREMENTS_^1*_6------------------_^1*_]_^1*_*€€Q = ADDRESS TO PDT - PHYSICAL DEVICE TABLE_^1*_]_^1*_]_^1*_(ELSE)_^1*_>ENDIF_^1*_;(ELSE)_^1*_;ENDIF_^1*_8(ELSE)_^1*_8ENDIF_^1CKST40 INQ BADST_^1_%TRQ A_,BAD STATUS FAULT CODE_^1_%JMP* FCARDR_^1_%SPC 2_^1STATNO BSS STATNO_'STAT€€US NUMBER (0-INIT, 2-CONT)_^1SELMSK ADC SLMSK1,SLMSK2,SLMSK3_?116*4303_^1*_*INIT,EOP,TIME OUT_B116*4303_^1BITS_!ADC BITS1,BITS2,BITS3_B116*4303_^1*_*INIT,EOP,TIME OUT_B116*4303_^1ZERO_!EQU ZERO(SELMSK+2)_^1_%EJT 0_^1*_830 CARDS DELETED_5116*4303_^1*_$*****************************************************_^1*_3LOOK FOR GHOST INTERRUPTS_^1*_3*************************_^1*_$********€€*********************************************_^1*_]_^1CKGINT NUM $FFFF_(CHECK FOR GHOST INTERRUPT_^1_%LDA- EREQST,I_^1_%SAM CKGI10_'IF NO ACTIVE REQUEST, THEN_^1_%RAO- GHOSTI,I_$BUMP GHOST COUNT_^1_%ENA CLRINT_'CLEAR INTERRUPTS_^1_%OUT 1_,CAN NOT LOOK FOR REJECTS SINCE_^1*_8INFINITE LOOP COULD OCCUR_^1_%NOP_]_^1_%RTJ CGHOST_*CHECK FOR CONSTANT INTERRUPT_^1*_;CGHOST EXITS TO DI€€SPATCHER_^1*_8(ELSE)_^1*_8ENDIF_^1CKGI10 JMP* (CKGINT)_$RETURN_^1_%SPC 5_^1*_$*****************************************************_^1*__^1*_'10_(0-1_%/_%0-_%0_^1*_'11_(0-3_%T_%0-2_$S_^1*_'12_(0-5_%V_%0-4_$U_^1*_'13_(0-7_%X_%0-6_$W_^1*_'14_(0-9_%Z_%0-8_$Y_^1*_'15_%0-8-3_%,_#0-8-2_$\_^1*_'16_%0-8-5_%%_#0-8-4_$(_^1*_'17_%0-8-7_%@_#0-8-6_$_ _^1*_'20_'11-1_%J_$11-_%-_^1€€*_'21_'11-3_%L_$11-2_$K_^1*_'22_'11-5_%N_$11-4_$M_^1*_'23_'11-7_%P_$11-6_$O_^1*_'24_'11-9_%R_$11-8_$Q_^1*_'25_$11-8-3_%$_"11-8-2_$!_^1*_'26_$11-8-5_%]_"11-8-4_$*_^1*_'27_$11-8-7_%^_"11-8-6_$;_^1*_'30_'12-1_%A_$12-_%+_^1*_'31_'12-3_%C_$12-2_$B_^1*_'32_'12-5_%E_$12-4_$D_^1*_'33_'12-7_%G_$12-6_$F_^1*_'34_'12-9_%I_$12-8_$H_^1*_'35_$12-8-3_%._"12-8-2_$?_^1*_'36_$12-8-5_%[_"12-8-4_$)_^1*€€_'37_$12-8-7_%#_"12-8-6_$<_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_;MESSAGES_^1*_;--------_^1*_]_^1*_$NONE_^1*_]_^1*_]_^1*_=MISC_^1*_=----_^1*_]_^1*_8ENTRY REFERENCES_^1*_8****************_^1*_]_^1_%ENT FORMT_(ENTRY POINT TO FORMAT RAW DATA_^1*_]_^1*_]_^1*_6EXTERNAL REFERENCES_^1*_6*******************_^1*_]_^1*_]_^1_%EXT ALTDEV_'ALTERNATE DEVICE HANDLER_^1_%EXT* CDRDS€€M_'SIM200 CONVERSION TABLE_.116*4374_^1_%EXT* CDRD26_'CARD CONVERSION (026 HOLL-TO ASCII)_!126*4374_^1_%EXT* CDRD29_'CARD CONVERSION (029 HOLL-TO ASCII)_!126*4374_^1_%EXT* FAULTN_'DETERMINE FAULT CODE FROM STATUS_^1_%EXT* K1829_(CARD READER KERNEL_^1_%EXT LOG_*LOG ERROR_^1_%EXT MAKEQ_(DEFINE V FIELD OF USERS REQUEST_^1*_82 CARDS DELETED_6126*4374_^1****_]_^1_%EJT 0_^1****_]_^1*E€€_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7*****************_^1*_]_^1*_]_^1*_$CONVERSION EQUATES:_^1*_]_^1_%EQU COMBN8($10)_!COMBINATION OF 8 PUNCH WITH OTHER PUNCH_^1_%EQU LCHAR(1)_$LEFT CHARACTER POSITION IN TABLE LOOK UP_^1_%EQU ORD0(0)_%RELATIVE ORDINAL OFFSET POSITION FOR WORD 0_^1_%EQU ORD1(2)_%RELATIVE ORDINAL OFFSET POSITION FOR WORD 1_^1_%EQU ORD2(4)_%RELATIVE ORDINAL OFFSE€€T POSITION FOR WORD 2_^1_%EQU ORD3(6)_%RELATIVE ORDINAL OFFSET POSITION FOR WORD 3_^1_%EQU ORD4(8)_%RELATIVE ORDINAL OFFSET POSITION FOR WORD 4_^1_%EQU OVRFLO($40)_!OVERFLOW INDICATOR IN COMBINATION ZONE PUNCHES_^1_%EQU OVRFLW($60)_!OVERFLOW INDICATOR IN COMBINATION PUNCHES_^1_%EQU RCHAR(0)_$RIGHT CHARACTER POSITION IN TABLE LOOK UP_^1_%EQU ZONE0($10)_"BASE OFFSET FOR ZONE PU€€NCH ROW 10_^1_%EQU ZONE11($20)_!BASE OFFSET FOR ZONE PUNCH ROW 11_^1_%EQU ZONE12($30)_!BASE OFFSET FOR ZONE PUNCH ROW 12_^1*_]_^1*_$LOW CORE CONSTANTS:_^1*_]_^1_%EQU ADISP($EA)_"DISPATCHER ADDRESS_^1_%EQU AMONI($F4)_"MONITOR ADDRESS_^1_%EQU LMASK($13)_"MASK OF ZERO BITS RIGHT JUSTIFIED_^1_%EQU MASK($3)_$MASK OF ONE BITS RIGHT JUSTIFIED_^1_%EQU ONEBIT($23)_!ONE BIT MASK_^1_%E€€QU ZERBIT($33)_!ZERO BIT MASK_^1_%EQU ZERO($22)_#REFERENCE TO ZERO WORD_^1*_]_^1*_$MISCELLANEOUS EQUATES:_^1*_]_^1_%EQU BADST(1)_$PSEUDO FAULT CODE OFFSET_^1_%EQU CONTST(1)_#CONTINUATION STATUS_^1_%EQU EOFBIT(5)_#7/9 PUNCHES FOR COLUMN 1_^1_%EQU MOTOPT(4)_#OFFSET TO MOTION OPTIONS WORD_^1_%EQU NOTUSE(0)_#NOT USED_^1*_]_^1*_$OPTION SELECTION BIT EQUATES:_^1*_]_^1_%EQU BINASC€€(8)_#ASCII REQUEST BIT_^1_%EQU FORMTD(2)_#FORMATTED REQUEST BIT_^1_%EQU ORIDE($40)_"OVERRIDE CHECKSUM BIT_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_5STATUS BIT POSITION_^1*_5*******************_^1*_]_^1*_$COMBINED STATUS - ESTAT2 :_^1*_]_^1_%EQU READY(1)_$00 READY_^1_%EQU BUSY(2)_%01 BUSY_^1_%EQU INTRPT(4)_#02 INTERRUPT_^1_%EQU DATAV(8)_$03 DATA_^1_%EQU EOP($10€€)_$04 EOP_^1_%EQU ALARM($20)_"05 ALARM_^1_%EQU LOSTDT($40)_!06 LOST DATA_^1_%EQU PROTCT($80)_!07 PROTECTED_^1_%EQU NREADY($200) 09 NOT READY_^1_%EQU ADT($400)_#10 ADT MODE_^1_%EQU ENDFIL($800) 11 EOF_^1_%EQU HOPPER($1000) 12 HOPPER EMPTY_^1_%EQU STACK($2000) 13 STACKER FULL_^1_%EQU FLFEED($4000) 14 FAILED TO FEED_^1_%EQU JAM($0000)_"15 STACKER JAM + $8000_^1€€*_]_^1*_$STATUS BIT POSTION :_^1*_]_^1_%EQU BREADY(0)_#READY BIT_^1_%EQU BBUSY(1)_$BUSY BIT_^1_%EQU BINTPT(2)_#INTERRUPT BIT_^1_%EQU BDATA(3)_$DATA BIT_^1_%EQU BEOP(4)_%COP BIT_^1_%EQU BALARM(5)_#ALARM BIT_^1_%EQU BLOSTD(6)_#LOST DATA BIT_^1_%EQU BPROT(7)_$PROTECTED_^1_%EQU BNREDY(9)_#NOT READY BIT_^1_%EQU BADT(10)_$ADT BIT_^1_%EQU BEOF(11)_$EOF BIT_^1_%EQU BHOPER(12)_"€€HOPPER EMPTY BIT_^1_%EQU BSTACK(13)_"STACKER FULL BIT_^1_%EQU BFLFED(14)_"FAIL TO FEED BIT_^1_%EQU BJAM(15)_$STACKER JAM BIT_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_$FAULT CODES:_^1*_]_^1_%EQU CKSMER(4)_#FAULT CODE FOR CHECKSUM ERROR_^1_%EQU LENGER(10)_"FAULT CODE FOR POSITIVE BINARY LENGTH_^1_%EQU NO79ER(12)_"FAULT CODE FOR NO 7/9 PUNCH IN COLUMN 1_^1_%EQU PUNCH(8)_$H€€OLLERITH ERROR, CARD PUNCHED WRONG_^1_%EQU SEQERR(9)_#FAULT CODE FOR SEQUENCE ERROR_^1*_]_^1*_$STATUS FAULT CODES :_^1*_]_^1_%EQU FCLOST(1)_#LOST DATA FAULT CODE_^1_%EQU FCALRM(2)_#ALARM FAULT CODE_^1_%EQU FCNRDY(14)_"NOT READY FAULT CODE_^1_%EQU FCSTCK(22)_"STACKER FULL FAULT CODE_^1_%EQU FCHOPR(23)_"HOPPER EMPTY FAULT CODE_^1_%EQU FCFEED(24)_"FALL TO FEED FAULT CODE_^1_%EQ€€U FCJAM(25)_#STACKER JAM FAULT CODE_^1_%EQU FCDATA(34)_"DATA, EXPECTED EOP_^1_%EQU FCEOP(35)_#EOP, EXPECTED NO EOP BEFORE EOP_^1_%EQU FCNEOP(53)_"NO EOP, EXPECTED EOP_^1_%EQU FCNDAT(54)_"NO DATA, EXPECTED DATA BEFORE EOP_^1_%EQU FCINT(61)_#INTERRUPT FAULT CODE_^1_%EQU FCADT(62)_#ADT FAULT CODE_^1_%EQU FCBUSY(63)_"BUSY, EXPECTED NOT BUSY AT EOP_^1_%EQU FCNBSY(64)_"NOT BUSY,€€ EXPECTED BUSY BEFORE EOP_^1_%EQU FCEOF(NOTUSE) EOF FAULT CODE_^1_%EQU FCPROT(NOTUSE) PROTECTED FAULT CODE_^1*_]_^1*_$SELECTIVE STATUS BIT MASK:_^1*_]_^1_%EQU SLMSK1(NREADY+READY)_^1*_8INITIAL STATUS SELECTED BITS_^1_%EQU STAT1(ADT+NREADY+LOSTDT+ALARM+EOP+DATAV+INTRPT+BUSY+READY)_^1_%EQU STAT2(JAM+FLFEED+STACK+HOPPER)_^1_%EQU SLMSK2(STAT2+STAT1)_^1*_8DATA OR EOP SELECTED BITS€€_^1*_]_^1*_$EXPECTED STATUS:_^1*_]_^1_%EQU BITS1(READY)_^1*_8INITIAL STATUS_^1_%EQU BITS2(EOP+INTRPT+READY)_^1*_8EOP CONDITION_^1_%EQU BITS3(DATAV+INTRPT+BUSY+READY)_^1*_8DATA CONDITION_^1****_]_^1_%EJT 0_^1*_3************************_^1*_3* FORMAT RAW CARD DATA *_^1*_3************************_^1*_]_^1FORMT NUM $FFFF_^1*_89 CARDS DELETED_6126*4374_^1_%RTJ* MOTION_'EXECUTE MOT€€ION REQUEST, OTHERWISE RETURN_^1_%ENA FORMTD_^1_%AND- ESTAT1,I_^1_%STA- CYCLE,I_%FOR UNFORMATTED ASCII REQUEST CYCLE IS CLEARED_^1_%INA -FORMTD_^1_%SAZ FOR20_(FORMATTED BINARY OR FORMATTED ASCII_^1_%ENA BINASC_^1_%AND- ESTAT1,I_^1_%SAZ FOR10_^1_%JMP* ASC10_(ASCII REQUEST_^1FOR10 LDA- ECCOR,I_%UNFORMATTED BINARY_^1_%SUB- ELSTWD,I_^1_%INA 1_,DETERMINE NUMBER OF TIMES TO STORE €€DATA_^1FOR20 STA- LENGTH,I_^1_%STA- CHKSUM,I_$CLEAR CHECKSUM FOR FORMATTED BINARY_^1_%SET A_^1_%STA- NEWCRD,I_$INDICATES NEW CARD FIRST TIME IN FBIN_^1_%LDA- SEQ,I_(SAVE EXPECTED SEQUENCE NUMBER_^1_%STA- OLDSEQ,I_^1_%RTJ READB_^1_%LDA- CHKSUM,I_^1_%SAZ FOR40_(NO ERROR IN CHECKSUM_^1_%ENA FORMTD+ORIDE_^1_%AND- ESTAT1,I_^1_%INA -FORMTD_^1_%SAN FOR40_(NOT FORMATTED BINARY OR OV€€ERRIDE BIT SET_^1_%ENA CKSMER_^1FOR30 LDQ- OLDSEQ,I_$RESTORE OLD SEQUENCE NUMBER_^1_%STQ- SEQ,I_^1_%JMP* DAT05_((ERROR EXIT)_^1FOR40 JMP* ASC70_((DONE)_^1_%EJT 0_^1*_6******************_^1*_6* MOTION REQUEST *_^1*_6******************_^1*_]_^1MOTION NUM $FFFF_(ENTRY_^1*_$CHECK FOR MOTION REQUEST_^1_%LDQ- EPTR,I_'PARAMETER LOCATION_^1_%LDA- (ZERO),Q_^1_%ARS 9_^1_%AND- MASK+4_^1€€_%INA -14_^1_%SAN MOT30_^1_%LDA- MOTOPT,Q_$MOTION REQUEST_^1_%AND- LMASK+3_%CLEAR LOWER 4 BITS_^1MOT10 ALS 4_^1_%STA- MOTREQ,I_$MOTION REQUEST_^1_%AND- MASK+3_^1_%SAZ MOT20_(DONE_^1_%INA -4_^1_%SAN MOT40_^1_%STA- SEQ,I_(CLEAR SEQUENCE NUMBER_^1_%JMP* MOT60_(LOOK FOR MORE REQUEST_^1MOT20 JMP CON05_(FINISHED REQUEST (DONE)_-108*3962_^1MOT30 JMP* (MOTION)_$RETURN_^1MOT40 I€€NA -1_^1_%SAN MOT60_^1MOT50 RTJ* DATA_)READ CARD_^1_%RTJ EOFCHK_'CHECK FOR EOF_8108*3962_^1_%JMP* MOT50_(P+1, IF NO EOF FOUND, SLEW TO EOF_^1*_$CONTINUE SEARCH AT P+2, IF EOF FOUND_^1MOT60 LDA- MOTREQ,I_$MOTION REQUEST_^1_%JMP* MOT10_(LOOK FOR ADDITION FIELDS IN REQUEST_^1_%EJT 0_^1*_3*************************_^1*_3* READ A CARD INTERFACE *_^1*_3*************************_^1*_€€]_^1DATA_!NUM $FFFF_^1_%ENA BUFR_^1_%ADD- I_,ABSOLUTE ADDRESS OF RAW DATA BUFFER_^1_%STA- FWA,I_(READ ONE CARD_^1_%INA 80_^1_%STA- LWA,I_^1*_86 CARDS DELETED_6126*3962_^1_%RTJ K1829_(READ ONE CARD_^1*_86 CARDS DELETED_6126*3962_^1_%LDA- EREQST,I_$ERROR FLAG (0= READ OK, 0# BAD READ)_^1_%AND- ONEBIT+14_^1_%SAZ DAT10_(NO ERROR_^1_%RTJ FAULTC_'DETERMINE STATUS FAULT CODE_^1DAT05€€ JMP* CON15_((ERROR EXIT)_^1DAT10 JMP* (DATA)_'RETURN_^1_%EJT 0_^1*_.*********************************_^1*_.* HOLLERITH TO ASCII CONVERSION *_^1*_.*********************************_^1*_]_^1ASC10 RTJ* DATA_)READ A CARD_^1ASC15 ENA BUFR_)INITIALIZE RAW DATA BUFFER_^1_%ADD- I_,ABSOLUTE ADDRESS OF RAW DATA BUFFER_^1ASC20 STA- FWA,I_^1_%TRA Q_^1_%SUB- LWA,I_^1_%SAM ASC40_(UNPRO€€CESS DATA REMAINS_^1_%ENA FORMTD_^1_%AND- ESTAT1,I_^1_%SAN ASC30_(FORMATED READ (MAX 1 CARD PER REQUEST)_^1_%JMP* ASC10_(WORDS PER REQUEST > 40_^1ASC30 JMP* ASC65_(DONE_A113*4254_^1ASC40 LDQ- (ZERO),Q_$PICK UP COLUMN OF DATA_^1_%RTJ* CONVRT_^1_%LDQ- CYCLE,I_^1_%SQN ASC50_(EVEN NUMBER COLUMNS_^1_%ALS 8_^1_%EOR- MASK+7_'FILL WITH ONES FOR ZERO WORD REQUEST_^1_%LDQ- ECCOR,I_^1_%€€JMP* ASC60_^1ASC50 EOR- LMASK+7_%ZERO RIGHT MASK_^1_%LDQ- ECCOR,I_^1_%AND- (ZERO),Q_^1_%RAO- ECCOR,I_%BUMP WORD TO STORE INTO_^1ASC60 STA- (ZERO),Q_^1_%LDA- ECCOR,I_^1_%SUB- ELSTWD,I_^1_%SAP ASC65_(WORD COUNT IS SATISFIED_.113*4254_^1_%ENA 1_^1_%SUB- CYCLE,I_%TOGGLE CYCLE FLAG (0 TO 1, OR 1 TO 0)_^1_%STA- CYCLE,I_^1_%LDA- FWA,I_^1_%INA 1_^1_%JMP* ASC20_(PICK UP MORE RAW DATA_^€€1ASC65 CLR A_,CLEAR SEQUENCE SO FORMATTED BINARY_"113*4254_^1_%STA- SEQ,I_(W/ IMBEDDED ASCII CD. GETS ERROR_$113*4254_^1ASC70 JMP* CON05_((DONE)_^1_%EJT 0_^1*_,**************************************_^1*_,* CONVERSION TABLE ENTRY CALCULATION *_^1*_,**************************************_^1*_]_^1*_$ACCUMULATOR REGISTER -A-_^1*_$BITS 15- 7: ILLEGAL MULTIPLE PUNCH FIELD_^1*_$BITS €€6- 1: OFFSET IN TABLE TO ASCII ENTRY_^1*_$BIT_$0: 0=RIGHT CHAR, 1=LEFT CHAR_^1*_]_^1CONVRT NUM $FFFF_(CONVERT 12 BIT H0LL. COLUMN TO ASCII_^1_%CLR A_^1_%QLS 7_^1_%SQP 1_^1_%INA OVRFLW+COMBN8+ORD0+LCHAR_/ROW 1_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+ORD1+RCHAR_6ROW 2_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+ORD1+LCHAR_6ROW 3_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+ORD2+RCHAR_6ROW 4_^1€€_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+ORD2+LCHAR_6ROW 5_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+ORD3+RCHAR_6ROW 6_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+ORD3+LCHAR_6ROW 7_^1_%QLS 1_^1_%SQP 1_^1_%INA COMBN8+ORD4+RCHAR_6ROW 8_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLW+COMBN8+ORD4+LCHAR_/ROW 9_^1_%AND =N$FF8F_%CLEAR LEGAL MULTIPLE 8+X PUNCHES OVERFLOW AREA_^1_%QLS 5_^1_%SQP 1_^1_%INA OVR€€FLO+ZONE12_:ROW 12_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLO+ZONE11_:ROW 11_^1_%QLS 1_^1_%SQP 1_^1_%INA OVRFLO+ZONE0_;ROW 0_^1_%AND- ZERBIT+6_^1_%CLR Q_^1_%LLS 9_^1_%SQN CON02_N110*3962_^1_%JMP* CON20_(NO ILLEGAL PUNCH_5108*3962_^1CON02 LDQ- FWA,I_N110*3962_^1_%LDA- (ZERO),Q_$PICK UP COLUMN_7108*3962_^1_%ALS 8_,SHIFT TO CHECK FOR 12-0 AND 11-0_$108*3962_^1_%INA -6_+CHECK FOR 1€€1 - 0 PUNCH_/108*3962_^1_%SAN CON03_N110*3962_^1_%ENA $7D_*11 - 0 PUNCH IS ASCII $7D_,108*3962_^1_%JMP* CON30_N110*3962_^1CON03 INA -4_+CHECK FOR 12 - 0 PUNCH_/110*3962_^1_%SAN CON04_N110*3962_^1_%ENA $7B_*12 - 0 PUNCH IS ASCII $7B_,108*3962_^1_%JMP* CON30_N110*3962_^1CON04 EQU CON04(*)_K110*3962_^1_%RTJ* EOFCHK_'SEE IF EOF CARD READ, APPLIES TO COLUMN 1 ONLY_^1_%JMP* CON10€€_(NO EOF_^1CON05 JMP FB05_)EOF FOUND DURING HOLL. READ_*126*3962_^1CON10 ENA $07_*IS IT 7, 8, 9 PUNCH_2126*3962_^1_%EOR- (ZERO),Q_K126*3962_^1_%SAN CON11_(NO_C126*3962_^1_%ENA $04_*YES, SET EOT ($04)_3126*3962_^1_%JMP* CON30_+IN USERS BUFFER._2126*3962_^1CON11 LDA- MASK+11_%IS IT A LACED COLUMN_1126*3962_^1_%EOR- (ZERO),Q_K126*3962_^1_%SAN CON12_(NO_C126*3962_^1_%LDA- MASK+€€7_'YES, SET $FF_9126*3962_^1_%JMP* CON30_+IN USERS BUFFER_3126*3962_^1CON12 ENA PUNCH_(ILLEGAL PUNCH_8126*3962_^1CON15 JMP ERROR_((ERROR EXIT)_^1CON20 LLS 6_,TABLE ORDINAL_^1_%STA* UPLOPO_'SAVE CHARACTER POSITION INDICATOR_#116*4374_^1*_] 116*4374_^1*_8CHECK FOR SIM200 LU FOR DIFFERENT_#116*4374_^1*_8CONVERSION TABLE_5116*4374_^1*_] 116*4374_^1_%LDA- SIM200,I_K116*4374_^1_%SU€€B- ELU,I_N116*4374_^1_%SAN CON21_(SENSE SIM200 LU NOT SET_.126*4374_^1_%LDQ CDRDSM,Q_K126*4374_^1_%JMP* CON23_N126*4374_^1*_8CHECK FOR 026 OR 029 CARD FORMAT_$126*4374_^1CON21 LDA- RMODE,I_L126*4374_^1_%SAZ CON22_(SENSE 026_<126*4374_^1_%LDQ CDRD29,Q_K126*4374_^1_%JMP* CON23_N126*4374_^1CON22 LDQ CDRD26,Q_K126*4374_^1CON23 LDA* UPLOPO_'(RESTORE A)_:126*4374_^1_%SAM 1_,UPPE€€R CHARACTER_^1_%LLS 8_,LOWER CHARACTER_^1_%LLS 8_^1_%AND- MASK+7_^1CON30 EQU CON30(*)_K110*3962_^1_%JMP* (CONVRT)_$RETURN_^1UPLOPO NUM 0_,UPPER/LOWER POSITION INDICATOR_'116*4374_^1_%EJT 0_^1*_4*********************_^1*_4* END OF FILE CHECK *_^1*_4*********************_^1*_]_^1EOFCHK NUM $FFFF_(LOOK FOR EOF PUNCHED IN COLUMN 1_^1_%LDA- EOF,I_(COMPARE REFERENCE EOF VALUE_^1_%€€AND- MASK+11_^1_%EOR- BUFR,I_'RAW DATA BUFFER ADDRESS_^1_%SAN EOF10_(NOT EOF_^1_%LDA- EREQST,I_^1_%AND- ZERBIT+14_#CLEAR ERROR BIT OF V FIELD_^1_%EOR- ONEBIT+14_#SET ERROR BIT OF V FIELD_^1_%STA- EREQST,I_^1_%LDA- ESTAT2,I_^1_%EOR- ONEBIT+11_#SET EOF STATUS BIT_^1_%STA- ESTAT2,I_^1_%LDQ- ECCOR,I_L126*4374_^1_%LDA =N$0220_%SET EOF CODE ($02)_3126*4374_^1_%STA- (ZERO),Q_(IN USERS B€€UFFER._2126*4374_^1_%RAO* EOFCHK_'FOUND EOF_^1EOF10 JMP* (EOFCHK)_$RETURN_^1_%EJT 0_^1*_7***************_^1*_7* PACK BINARY *_^1*_7***************_^1*_]_^1READB NUM $FFFF_^1RB10_!RTJ DATA_)READ CARD_^1_%ENA BUFR_)FWA OF RAW DATA BUFFER_^1_%ADD- I_,ABSOLUTE ADDRESS OF RAW DATA BUFFER_^1RB20_!STA- FWA,I_(REFERENCE POSITION TO FETCH DATA_^1_%SUB- LWA,I_^1_%SAN RB40_)MORE RAW DA€€TA IN BUFFER_^1_%STA- NEWCRD,I_$INDICATE NEW CARD READ_^1_%JMP* RB10_)FETCH MORE RAW DATA_^1RB40_!ENA -3_+PRESET COUNTER TO ZERO FIRST TIME THRU_^1RB50_!INA 3_,INCREMENT COUNTER_^1_%STA- CYCLE,I_^1_%LDQ- FWA,I_(ADDRESS OF 4 WORD PORTION OF BUFFER_^1_%SAN RB60_^1_%LDA- (ZERO),Q_$PACK FIRST WORD_^1_%LDQ- 1,Q_^1_%QLS 4_^1_%LLS 4_^1_%JMP* RB80_^1RB60_!INA -1_^1_%SAN RB70_^1_%LDA€€- 1,Q_*PACK SECOND WORD_^1_%LDQ- 2,Q_^1_%QLS 4_^1_%LLS 8_^1_%JMP* RB80_^1RB70_!LDA- 3,Q_*PACK THIRD WORD_^1_%ALS 4_^1_%LDQ- 2,Q_^1_%LRS 4_^1RB80_!STA- WORD,I_'SAVE 16 BIT DATA_^1_%ADD- CHKSUM,I_^1_%STA- CHKSUM,I_$ACCUMULATE CHECKSUM VALUE_^1_%ENA FORMTD_^1_%AND- ESTAT1,I_^1_%SAZ RB83_^1_%RTJ* FBIN_)CHECK FOR FORMAT NON DATA ITEMS_^1_%JMP* RB87_)NON DATA (7/9 OR LENGTH WORD)_^€€1_%LDQ- LENGTH,I_^1_%SQZ RB86_)DO NOT SAVE CHECKSUM WORD IN USERS BUFFER_^1RB83_!LDA- ECCOR,I_^1_%SUB- ELSTWD,I_^1_%SAZ RB85_)DO NOT SAVE DATA_^1_%LDA- WORD,I_^1_%LDQ- ECCOR,I_^1_%STA- (ZERO),Q_^1_%RAO- ECCOR,I_^1RB85_!LDQ- LENGTH,I_^1RB86_!SQZ RB110_(DONE_^1_%SQP RB100_(UNFORMATTED ZERO WORD BINARY READ REQUEST_^1_%RAO- LENGTH,I_$INDICATE DATA ITEM_^1RB87_!LDA- CYCLE,I_^1_%INA€€ -2_^1_%SAZ RB90_^1_%JMP* RB50_)PACK NEXT WORD_^1RB90_!LDA- FWA,I_^1_%INA 4_^1_%JMP* RB20_)FETCH NEXT 4 WORDS OF RAW DATA_^1RB100 LDQ- ECCOR,I_^1_%LDA- WORD,I_^1_%AND- LMASK+3_^1_%EOR- MASK+3_^1_%STA- (ZERO),Q_^1RB110 JMP* (READB)_%RETURN_^1_%EJT 0_^1*_4********************_^1*_4* FORMATTED BINARY *_^1*_4********************_^1*_]_^1FBIN_!NUM $FFFF_^1_%LDA- NEWCRD,I_$SEE IF €€NEW CARD READ_^1_%SAZ FB25_)NEW CARD, NOT FIRST CARD - VERIFY 7/9 PUNCH_^1_%INA 0_,CHECK FOR FIRST CARD_^1_%SAN FB10_)NO_^1_%ADD- CYCLE,I_%SEE IF FIRST 16 BITS_^1_%SAN FB20_^1_%RTJ* EOFCHK_'CHECK FOR EOF_^1_%JMP* FB30_)NO EOF_^1FB05_!JMP* DONE_)EOF_^1FB10_!RAO* FBIN_)BUMP RETURN ADDRESS_^1_%JMP* FB90_^1FB20_!JMP* FB70_)EXAMINE SECOND 16 BITS_^1FB25_!ENA 1_^1_%STA- NEWCRD,I_$IN€€DICATE DATA ITEMS COMING UP_^1FB30_!LDA- BUFR,I_'VERIFY 7/9 PUNCH_^1_%AND- MASK+3_'MASK OFF 6,7,8,9 PUNCHES_^1_%INA -EOFBIT_^1_%TRA Q_^1_%LDA- ESTAT1,I_^1_%AND- ZERBIT+3_$CLEAR ASCII MODE BIT_^1_%SQZ FB35_)7/9 PUNCH_^1_%INQ -2_+SEE IF OVER RIDE BIT SET_^1_%SQN FB40_)ASCII CARD_^1_%LDQ- BUFR+1,I_$OVERIDE SET, GET 2ND WORD OF BUFFER_!126*4374_^1_%SQZ FB40_)IF ZERO, A 7,8,9 PUNC€€H - ASCII_'126*4374_^1_%AND- ZERBIT+6_$CLEAR OVERIDE BIT IN CASE IT IS SET_^1_%INA ORIDE_(SET OVERRIDE BIT_^1FB35_!STA- ESTAT1,I_$INDICATE BINARY CARD_^1_%LDQ- SEQ,I_(EXPECTED SEQUENCE NUMBER_^1_%LDA- BUFR,I_^1_%ARS 4_^1_%AND- MASK+7_'SEQUENCE NUMBER READ_^1_%SAZ FB60_)RESEQUENCE_^1_%EAQ Q_^1_%SQZ FB60_)CARD IN SEQUENCE_^1_%STA- SEQ,I_(SET SEQ COUNTER FOR READ THRU_^1_%ENA SE€€QERR_'SEQ ERROR_^1_%JMP* ERROR_^1FB40_!LDQ- NEWCRD,I_$MINUS ZERO INDICATES FIRST CARD_^1_%TCQ Q_^1_%SQZ FB50_)FIRST TIME THRU_^1_%ENA NO79ER_'NOT 7/9 PUNCH AFTER INITIAL CARD IN REQUEST_^1_%JMP* ERROR_^1FB50_!INA BINASC_'SET ASCII BIT_^1_%STA- ESTAT1,I_^1_%JMP ASC15_(PROCESS AS ASCII REQUEST (ALREADY READ CARD)_^1FB60_!INA 1_^1_%AND- MASK+7_^1_%STA- SEQ,I_(NEXT EXPECTED SEQ V€€ALUE_^1_%JMP* FB90_^1FB70_!STA- NEWCRD,I_$ALLOW NORMAL PROCESSING TO OCCUR_^1_%LDA- WORD,I_'LENGTH WORD_^1_%SAM FB80_^1_%ENA LENGER_^1_%JMP FOR30_(RESET SEQUENCE NUMBER BEFORE REPORTING ERROR_^1FB80_!STA- LENGTH,I_$LOGICAL RECORD SIZE IN WORDS_^1FB90_!JMP* (FBIN)_'RETURN_^1_%EJT 0_^1*_8**************_^1*_8* ERROR EXIT *_^1*_8**************_^1*_]_^1ERROR STA- FLTCOD,I_$SAVE FAU€€LT CODE_^1_%LDA- EREQST,I_^1_%AND- ZERBIT+14_#CLEAR ERROR BIT IF SET_^1_%EOR- LMASK+13_$TOGGLE BITS 14,15 TO SHOW ERROR AND FINISHED_^1_%STA- EREQST,I_^1_%RTJ MAKEQ_(SET V FIELD_^1_%LDA- FLTCOD,I_^1_%LDQ- ELU,I_^1_%QLS 6_^1_%EAQ Q_,ADD ERROR CODE TO LOGICAL UNIT_^1_%RTJ LOG_*LOG ERROR_^1_%JMP ALTDEV_'TRANSFER TO ALTERNATE DEVICE HANDLER_^1_%SPC 5_^1*_:**********_^1*_:* RETURN€€ *_^1*_:**********_^1*_]_^1DONE_!JMP (FORMT)_%RETURN_^1_%EJT 0_^1*_4*********************_^1*_4* STATUS FAULT CODE *_^1*_4*********************_^1*_]_^1FAULTC NUM $FFFF_^1_%LDA- FLTCOD,I_$CHECK FOR STATUS FAULT CODE_^1_%SAZ FA10_)TIME OUT_^1_%TRA Q_^1_%INQ -CONTST-BADST STATUS FAULT CODE BIASED BY BADST_^1_%SQM FA30_)INITIATOR STATUS BAD_^1_%SQZ FA20_)CONTINUATOR STATUS BAD€€_^1FA10_!JMP* FA60_)NOT BAD STATUS_^1FA20_!LDQ- ADTFW,I_%SEE IF ALL 80 COLUMNS READ_+126*4374_^1_%TCQ Q_R126*4374_^1_%ADQ- ADTLW,I_L126*4374_^1_%SQZ FA30_)EOP BAD STATUS_^1_%ENQ 1_,DATA BAD STATUS_^1FA30_!INQ CONTST_^1*_8Q = 0, INITIATOR CALL_^1*_8Q = 1, EOP_^1*_8Q = 2, DATA (COL 1-80)_^1_%LDA- ESTAT2,I_$COMBINE STATUS WORD_^1_%AND* SELMSK,Q_$SELECT BITS TO BE EXAMINED_^1_%EOR*€€ BITS,Q_'MASK BITS THAT SHOULD BE SET_^1_%STA* BADBIT_^1_%RTJ* HERE_)ABSOLUTIZE PARAMETER POINTERS_(126*4374_^1HERE_!NUM 0_R126*4374_^1_%LDA* HERE_O126*4374_^1_%INA BADBIT-HERE_H126*4374_^1_%STA* ABDBIT_M126*4374_^1_%INA TABLE-BADBIT_G126*4374_^1_%STA* ATABLE_M126*4374_^1_%RTJ FAULTN_'SEARCH FOR FAULT CODE_^1ABDBIT NUM 0_,ABS ADDR OF STATUS WORD_.126*4374_^1ATABLE NUM 0_,ABS €€ADDR OF ERROR BIT AND CODE TABLE 126*4374_^1_%LDQ- ADTFW,I_%SEE IF ALL 80 COLUMNS READ_+126*4374_^1_%TCQ Q_R126*4374_^1_%ADQ- ADTLW,I_L126*4374_^1_%SQZ FA60_)FAULT CORRECT FOR EOP CONDITION_^1_%TRA Q_,FAULT CODE FROM TABLE LOOK UP_^1_%INQ -FCBUSY_^1_%SQN FA40_^1_%ENA FCNBSY_'C.R. NOT BUSY_^1_%JMP* FA60_^1FA40_!INQ -FCDATA+FCBUSY_^1_%SQN FA50_^1_%ENA FCNDAT_'EXPECTED DATA €€BEFORE EOP_^1_%JMP* FA60_^1FA50_!INQ -FCNEOP+FCDATA_^1_%SQN FA60_^1_%ENA FCEOP_(EXPECTED NO EOP BEFORE EOP_^1FA60_!JMP* (FAULTC)_$RETURN_^1_%EJT 0_^1BADBIT BSS BADBIT_'BAD BIT STATUS INDICATOR_^1TABLE VFD X8/FCLOST,X8/BLOSTD_+LOST DATA_+114*4106_^1_%VFD X8/FCJAM,X8/BJAM_*STACKER AREA JAM_^1_%VFD X8/FCFEED,X8/BFLFED_'FEED FAILURE_^1_%VFD X8/FCSTCK,X8/BSTACK_'STACKER FULL_^€€1_%VFD X8/FCHOPR,X8/BHOPER_'HOPPER EMPTY_^1_%VFD X8/FCALRM,X8/BALARM_'ALARM_^1_%VFD X8/FCDATA,X8/BDATA_(DATA_^1_%VFD X8/FCNEOP,X8/BEOP_)NO EOP_^1_%VFD X8/FCBUSY,X8/BBUSY_(BUSY_^1_%VFD X8/FCINT,X8/BINTPT_(INTERRUPT_^1_%VFD X8/FCADT,X8/BADT_*ADT_^1_%VFD X8/FCNRDY,X8/BREADY_+NOT READY_+114*4106_^1_%BZS (1)_7END OF TABLE_^1SELMSK ADC SLMSK1,(SLMSK2),(SLMSK2) INIT.,EOP, DATA €€SELECTIVE BITS_^1*_8PLUS JAM STATUS FOR EOP AND DATA_^1BITS_!ADC BITS1,BITS2,BITS3_#INIT.,EOP, DATA EXPECTED BITS_^1_%END_]_^__€PFAULTN CSY/ C10 P€1_%NAM FAULTN_'DECK-ID C10 PERIPH. DRIVERS 1.0C SUMMARY-126_^1*_$1829-3 CARD READER FAULT CODE ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1*_]_^1***_]_^1*E_]_^1*_]_^1*_]_^1*_5*******************_^1*_5* FAULTN FUNCTION *_^1*_5*******************_^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1*_;F€€UNCTION_^1*_;--------_^1*_$RETURNS FAULT CODE_^1*_]_^1*_]_^1*_6GENERAL DESCRIPTION_^1*_6-------------------_^1*_$THE ENTRY CLOSES TO THE TOP OF THE FAULT TABLE THAT_^1*_$MATCHES A BIT SET IN THE ERROR STATUS WORD IS SELECT-_^1*_$ED. THE FAULT CODE FOR THIS ENTRY IS CONSIDERED THE_^1*_$MOST IMPORTANT._^1*_]_^1*_]_^1*_6INPUT REQUIREMENTS_^1*_6------------------_^1*_$CALLING SEQUENCE_€€^1*_*INDEX = FAULTN (STATUS,TABLE)_^1*_*WHERE_^1*_-STATUS IS STATUS WORD FROM KERNEL_^1*_-TABLE IS COMPARSION FAULT TABLE_^1*_-INDEX IS ERROR INDEX_^1*_]_^1*_$FAULT TABLE - BITS 15-8, FAULT CODE NUMBER_^1*_3BITS 7-0, BIT POSITION CORRESPONDING_^1*_3TO ERROR STATUS WORD._^1*_3ENTRIES ARE ORDERED TOP TO BOTTOM BY_^1*_3MOST IMPORTANT TO LEAST IMPORTANT_^1*_3FAULT CODE THAT SHOULD BE €€RETURNED._^1*_3TABLE ENDS WITH ZERO WORD._^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_ NOISE RECORD_^1CL07_!RTJ RECVRY_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KL15_)EXECUTE RECOVERY FUNCTION_^1_%JMP* CL20_)NO RECOVERY OR RECOVERY COMPLETE_^1*_]_^1CL10_!LDA- SINTER,I_$IS WR€€ITE LOCKOUT SET_^1_%AND- ONEBIT+4_^1_%SAZ 1_^1_%JMP* CL04A_(YES, ERROR_^1_%LDA- SINTER,I_$IF INOP, READ AFTER WRITE_^1_%AND =N$1249_%PROG ERR, TIMEOUT = FATAL_^1_%SAZ CL20_^1_%ENA 2_^1_%JMP* F1860_^1CL20_!RTJ NEXTIO_'CHECK FOR NEXT I/O OPERATION_^1_%JMP* CL30_^1_%JMP* KL15_)EXECUTE REST OF REQUEST_^1CL30_!LDA- SINTER,I_^1_%AND =N$C000_%IS TAPE MARK OR EOT SET_^1_%SAZ CL40_^1€€_%AND- ONEBIT+15_#IS EOT SET_^1_%SAN CL35_)YES, SET THE ERROR BIT_^1_%LDA- MFLG,I_'IS THIS A MOTION REQUEST_^1_%SAZ CL40_)YES, DO NOT SET TM ERROR_^1CL35_!LDA- ONEBIT+14_^1_%ADD- EREQST,I_$YES, SET ERROR BIT IN EREQST_^1_%STA- EREQST,I_^1CL40_!ENA 0_,CLEAR ERROR FLAG_^1_%JMP (K1860)_^1_%EJT_]_^1* DIAGNOSTIC TIME OUT_^1* ENTERED WHEN DIAGNOSTIC CLOCK HAS TIMED OUT_^1*_]_^1E1860 €€ STQ- I_^1_%EQU ELCTT(E1860) DEFINE ENTRY FOR ODS_^1_%LDQ- EWES,I_^1_%NUM $0B04_(SAMPLE STATUS_^1_%STA- ESTAT2,I_$SAVE IN LAST STATUS_^1_%STA- STIMEO,I_$SAVE STATE IN TIMEOUT STATUS_^1_%RTJ FORMIT_'FORMAT COMPOSED STATUS (ESTAT2)_^1_%LDA- ESTAT1,I_$DO NOT CLEAR IF REWIND IN PROGRESS_^1_%AND- ONEBIT+6_^1_%SAZ ELC05_^1_%LDA- ESTAT1,I_$IS SELECT IN PROGRESS_^1_%AND- ONEBIT+7_^1_%€€SAN ELC10_(YES, CONTINUE_^1_%JMP- (DISP)_'NO, REWIND TIMED OUT - REWCKL WILL CALL FAULT_^1ELC05 LDQ- MICROI,I_^1_%NUM $0B06_(CLEAR MICRO INTERRUPT_^1ELC10 ENA 0_,TIMEOUT ERROR CODE_^1*_8FALL THRU TO FLCTT_^1*_]_^1* FAILED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1F1860 STA- FLTCOD,I_$SAVE FAULT CODE_^1_%LDA- EREQST,I_$SET DRIVER DETECTED ERROR_^1_%ADD- ONEBIT+€€14_^1_%STA- EREQST,I_^1_%JMP (K1860)_%RETURN VIA KERNEL_^1*_]_^1*_]_^1* SELECT UNIT - INTERRUPTS INHIBITED FOR SHORT DURATION_^1* WHEN ENTERED FROM REWCKL_^1* ENTRY_]_^1*_$I = PDT ADDRESS_^1* EXIT_]_^1*_$A = STATUS AFTER SELECT_^1*_]_^1SELECT NUM 0_^1_%LDA- ESTAT1,I_$SET SELECT IN PROGRESS FLAG_^1_%AND- ZROBIT+7_^1_%ADD- ONEBIT+7_^1_%STA- ESTAT1,I_^1_%LDQ- EWES,I_'EQUIPT CODE_^1_€Â%INQ 8_,ADD DIRECTION (OUT)_^1_%LDA- UNTMOD,I_$UNIT SELECT INFO_^1_%INA 8_,SELECT FUNCTION_^1_%NUM $0B04_(SET I/O TO SELECT (SIO)_^1_%JMP WAITX_(TURN ON AND WAIT FOR INTERRUPT_^1_%END_]_^__ ÂPCKREQ CSY/ C15 P€1_%NAM CKREQ_(DECK-ID C15 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$CHECK REQUEST - LCTT ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT CHECK REQUEST_^1*_8******************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THE CHECK REQUEST ROUTINE READS ST€€ATUS, CLEARS_^1*_$INTERRUPTS, STORES STATUS IN PDT AND CHECKS FOR_^1*_$GHOST INTERRUPT._^1*_]_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$STATUS WILL FIRST BE TAKEN AND MICRO AND MACRO_^1*_$INTERRUPTS CLEARED. A GHOST CHECK WILL BE PERFORMED_^1*_$AND IF A GHOST THE STATUS WILL BE SAVED AND THE GHOST_^1*_$COUNTER BUMPED IN ALL THE PDTS. IF NOT A GHOST STATUS_^€€1*_$WILL BE SAVED IN CURRENT PDT AND A TEST FOR BUSY WILL_^1*_$BE MADE. IF THE DEVICE IS BUSY THE INTERRUPT IS NOT_^1*_$VALID, CONTROL WILL BE GIVEN UP TO WAIT FOR VALID_^1*_$INTERRUPT._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(I) = INITIAL PDT ADDRESS_^1*_]_^1*_8OUTPUT_^1*_8-----_^1*_]_^1*_$CONTINUATOR STATUS TO PDT (ESTAT2,SINTER)_^1*_$+1 TO PDT (GHOSTI) I€€F GHOST INTERRUPT_^1*_$-1 TO PDT (EDCLK) IF VALID INTERRUPT_^1*_$+0 TO BIT 7 IN ESTAT1 IF SET (SELECT FLAG)_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTER BY RETURN JUMP FROM CONTINUATOR_^1*_$EXITS TO DISPATCHER ON GHOST INTERRUPT AND ON_^1*_*INVALID INTERRUPT. RETURN TO CALLER ON VALID_^1*_*INTERRUPT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. READ STATUS AND SAVE._^1*_$2. CL€€EAR MACRO AND MICRO INTERRUPT._^1*_$3. IF DRIVER NOT BUSY, GHOST INTERRUPT. +1 TO_^1*_(GHOST COUNT AND SAVE STATUS IN ALL PDT'S AND_^1*_(EXIT TO DISPATCHER._^1*_$4. IF NOT GHOST SAVE STATUS, CHECK IF DEVICE BUSY._^1*_(IF BUSY GO TO DISPATCHER, IF NOT CHECK IF REWINDING._^1*_(IF REWINDING GO TO DISPATCHER , INVALID INTERRUPT._^1*_$5. IF NOT REWINDING, RESET DIAGNOSTIC CLOCK. IF SELE€€CT_^1*_(IN PROGRESS CLEAR SELECT FLAG AND RETURN TO SELECT_^1*_(CALLER, IF NOT SELECT RETURN TO CKREQ CALLER._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********************_^1*_6* LCTT CHECK REQUEST *_^1*_6**********************_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1_%ENT CKREQ_^1*_]_^1_%EXT* ISPT_)CURRENT PDT ADDRESS_€€^1_%EXT* SELECT_'SELECT UNIT ROUTINE_^1_%EXT* REWPDT_'REWINDING PDT_^1*_]_^1_%EQU DISP($EA)_#DISPATCHER ADDRESS_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELINK(39)_#39 PDT THREAD_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICR€€OI(19)_"19 MICRO-INTERRUPT NUMBER_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1CKREQ NUM 0_^1_%LDQ- EWES,I_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT_^1_%NUM $0B04_(SAMPLE STATUS_^1_%STA* STAT_)SAVE STATUS_^1_%AND- ONEBIT+1_$IS THE BUSY BIT SET_^1_%SAZ 1_,NO, VALID INTERRUPT_^1_%JMP- (DISP)_'Y€€ES, WAIT FOR REAL INTERRUPT_^1_%LDQ ISPT_)WAS THIS A GHOST INTERRUPT_^1_%SQZ 1_,YES, CHECK FURTHER_^1_%JMP* CK10_)NO_^1_%LDQ REWPDT_'GET REWINDING PDT_^1_%SQP CK03_)IS REWIND GHOST INTERRUPT ALLOWED_^1_%RAO REWPDT_'YES, ADVANCE COUNTER_^1_%JMP- (DISP)_^1CK03_!SQZ 1_,IF ZERO NOT REWINDING_^1_%JMP- (DISP)_'YES, INVALID INTERRUPT_^1_%LDA- I_^1_%STA* CKPDT_(SAVE STARTING PDT_^1CK€€05_!RAO- GHOSTI,I_$YES, BUMP GHOST COUNT IN ALL PDTS_^1_%LDA* STAT_)PICK UP STATUS_^1_%STA- SINTER,I_$AND SAVE STATUS_^1_%LDA- ELINK,I_%GET NEXT PDT_^1_%STA- I_^1_%EOR* CKPDT_(EQUAL TO START_^1_%SAZ 1_,YES, DONE_^1_%JMP* CK05_)NO, DO NEXT ONE_^1_%JMP- (DISP)_^1*_]_^1CK10_!STQ- I_,SAVE ACTUAL PDT ADDRESS_^1_%LDQ- MICROI,I_^1_%NUM $0B06_(CLEAR MICRO INTERRUPT_^1_%LDA* STAT_)PICK UP€€ STATUS_^1_%STA- ESTAT2,I_^1_%STA- SINTER,I_^1_%ENA -1_^1_%STA- EDCLK,I_%RESET DIAGNOSTIC CLOCK_^1_%LDA- ESTAT1,I_$SELECT INTERRUPT_^1_%ALS 8_^1_%SAM 1_,SKIP IF SELECT IN PROGRESS_^1_%JMP* (CKREQ)_^1_%LDA- ESTAT1,I_$YES, CLEAR SELECT FLAG_^1_%AND- ZROBIT+7_^1_%STA- ESTAT1,I_^1_%LDA* STAT_)EXIT WITH STATUS IN A_^1_%JMP (SELECT)_$EXIT VIA SELECT_^1*_]_^1CKPDT NUM 0_^1STAT_!NUM € 0_^1_%END_]_^__ PREWCKL CSY/ C16 P€1_%NAM REWCKL_'DECK-ID C16 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT REWIND CHECK ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT REWIND CHECK_^1*_8*****************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$DETERMINE WHEN TAPE HAS REWOUND._^1*_]€€_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$AFTER A REWIND COMMAND HAS BEEN ISSUED AND THE_^1*_$INTERRUPT PROCESSED THE NEXTIO ROUTINE WILL USE_^1*_$THE SUBROUTINE REWSD CONTAINED IN THIS MODULE._^1*_$REWSD SCHEDULES THE REWIND CHECK PROGRAM AND RETURNS_^1*_$TO THE CALLER. WHEN REWCK IS EXECUTED VIA THE_^1*_$SCHEDULER IT DETERMINES IF THE DRIVER IS BUSY WITH_^1*_$€€THE INTERRUPTS INHIBITED. IF DRIVER BUSY REWCK IS_^1*_$RESCHEDULED AND INTERRUPTS ENABLED, IF NOT DRIVER_^1*_$IS SET BUSY. STATUS IS TAKEN TO DETERMINE IF REWINDING,_^1*_$IF SO RESCHEDULE REWCK, IF NOT SCHEDULE DRIVER._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(Q) = PDT OF REWINDING TRANSPORT_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$SETS ISPT IN DRIVER WITH €€PDT WHILE EXECUTING AND_^1*_$CLEAR WHEN EXITING._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTERED BY THE SCHEDULER WITH Q CONTAINING THE PDT_^1*_*ADDRESS OF THE REWINDING TRANSPORT. REWSD IS_^1*_*ENTERED BY A RETURN JUMP FROM NEXTIO TO SCHEDULE_^1*_*THE REWIND CHECK PROGRAM._^1*_$EXITED BY A JUMP TO THE DISPATCHER AFTER EITHER_^1*_*REWCK OR THE DRIVER IS SCHEDULED._^1*_]_^1€€*_8FLOW_^1*_8----_^1*_]_^1*_$1. INHIBIT INTERRUPTS AND CHECK IF DRIVER BUSY, IF_^1*_(SO RESCHEDULE AND RE-ENABLE INTERRUPTS AND GO_^1*_(TO THE DISPATCHER._^1*_$2. IF DRIVER NOT BUSY SET IT BUSY._^1*_$3. SELECT AND OBTAIN STATUS, CHECK IF REWINDING._^1*_$4. IF REWINDING, RESCHEDULE REWCK, MAKE DRIVER NOT_^1*_(BUSY AND EXIT TO DISPATCHER._^1*_$5. IF NOT REWINDING, GO TO DRIVER TO CON€€TINUE REQUEST._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT REWCKL_^1_%ENT REWSCD_'SCHEDULER ADDRESS_^1_%ENT REWPDT_'REWINDING PDT IN PROGRESS_^1_%ENT REWSD_(SCHEDULE REWIND CHECK_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* F1860_(FAULT ROUTINE_^1_%EXT* FORMIT_'LCTT FORMAT STATUS ANCIL€€LARY ROUTINE_^1_%EXT* INBSY_(DRIVER REENTRY POINT_^1_%EXT* ISPT_)DRIVER BUSY FLAG_^1_%EXT* SELECT_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU DISP($EA)_#DISPATCHER POINTER_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1*_]_^1****_]_^€€1_%EJT_]_^1*_3**********_^1*_3* REWCKL *_^1*_3**********_^1*_]_^1* REWIND CHECK ANCILLARY SUBROUTINE FOR LCTT_^1*_]_^1* ENTERED AS SCHEDULED WHEN REWIND FUNCTION ISSUED. THIS ROUTINE_^1* CHECKS FOR UNIT REWINDING. IF REWIND COMPLETE CLEARS REWIND FLAG_^1* AND SCHEDULES DRIVER, IF NOT SCHEDULES SELF._^1*_]_^1REWCKL IIN 0_,NO INTERRUPTS_^1_%STQ- I_^1_%LDA ISPT_)IS DRIVER BUSY_^1_%S€€AZ REW10_^1_%JMP* REW20_(YES, RESCHEDULE AND RE-ENABLE INTS_^1REW10 STQ ISPT_)NO, MAKE BUSY_^1_%STQ* REWPDT_'SAVE PDT REWINDING_^1_%LDA- EDCLK,I_%SAVE REWIND CLOCK_^1_%STA* REWCLK_^1_%SAP REW15_(HAS REWIND TIMED OUT_^1_%ENA 0_,YES, CALL FAULT_^1_%EIN 0_^1_%JMP F1860_^1REW15 RTJ SELECT_'SELECT AND OBTAIN STATUS_^1_%RTJ FORMIT_'FORMAT COMPOSED STATUS (ESTAT2)_^1_%LDA* REWCL€€K_'RESTORE REWIND CLOCK_^1_%STA- EDCLK,I_^1_%LDA- SINTER,I_$GET STATUS_^1_%AND- ONEBIT+2_$IS REWIND COMPLETE_^1_%SAZ REWEX_(YES, SCHEDULE PDT_^1_%ENQ 0_,MAKE DRIVER NOT BUSY_^1_%STQ ISPT_^1REW20 RTJ* REWSD_^1_%EIN 0_^1_%JMP- (DISP)_^1*_]_^1REWSD NUM 0_^1_%LDQ- I_^1REWSCD EQU REWSCD(*+2)_^1_%SCHDLE REWCKL,3,,1_^1_%JMP* (REWSD)_^1*_]_^1REWEX ENA -4_+INIT REWIND GHOST COUNT€hER_^1_%STA- EDCLK,I_%STOP DIAGNOSTIC CLOCK_^1_%STA* REWPDT_^1_%LDA =N$7F00_%DELAY TO ALLOW EXTRA INTERRUPT_^1REWEXL INA 1_^1_%SAM 1_^1_%JMP* REWEXL_^1_%LDQ- EWES,I_'CLEAR MACRO INTERRUPT_^1_%NUM $0B05_^1_%LDQ- I_^1_%JMP INBSY_(GO TO DRIVER, REWIND NOW COMPLETE_^1*_]_^1REWPDT NUM 0_,PDT REWINDING INFO_^1REWCLK NUM 0_,REWINDING CLOCK VALUE_^1_%END_]_^__hPFORMIT CSY/ C17 P€1_%NAM FORMIT_'DECK-ID C17 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT FORMAT STATUS ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT FORMAT STATUS ROUTINE_^1*_8**************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$CONVERTS ESTAT2 FRO€€M HARDWARE STATUS TO COMPOSED STATUS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS ROUTINE COMPOSES A STATUS WORD BASED ON THE_^1*_$HARDWARE STATUS (SINTER) AND DRIVE CHARACTERISTICS_^1*_$BASED ON DRIVE INFO (UNTMOD). THESE WORDS ARE_^1*_$CONTAINED IN THE PHYSICAL DEVICE TABLE._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(I) REGISTER €€= PDT ADDRESS_^1*_$ESTAT2 = LAST HARDWARE STATUS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$ESTAT2 = COMPOSED STATUS_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY AND EXIT AS FOR NORMAL SUBROUTINE._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. SAVES OLD ESTAT2 (HARDWARE STATUS)._^1*_$2. FORMS NEW ESTAT2 BY CONDENSINS AND REPOSITIONING_^1*_(INFO CONTAINED IN HARDWARE STATUS AND UNI€€T/MODE._^1*_$3. STORES COMPOSED STATUS IN ESTAT2 AND EXITS._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT FORMIT_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1*_$NONE_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS (COMPOSED)_^1_%EQU ONEBIT(€€$23)_!SINGLE BIT MASK_^1_%EQU UNTMOD(24)_"UNIT AND MODE SELECT_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* FORMIT *_^1*_6**********_^1*_]_^1* LCTT FORMAT COMPOSED STATUS ROUTINE_^1*_]_^1FORMIT NUM 0_^1_%LDA- ESTAT2,I_$SAVE STATUS TO BE FORMATTED_^1_%STA* LOCSTA_^1_%AND =N$FA48_%DID ALARM OCCUR_^1_%SAZ 1_^1_%LDA- ONEBIT+5_$YES, SET BIT 5_^1_%STA- ESTAT2,I_^1_%LDA- UNTMOD,I_$€€GET DENSITY_^1_%TCA A_,INVERT DENSITY BITS_^1_%AND =N$300_'MASK AND POSITION_^1_%ALS 1_^1_%TRA Q_^1_%LDA- UNTMOD,I_$GET TRACK BIT_^1_%AND- ONEBIT+11_^1_%AAQ A_^1_%ALS 3_^1_%ADD- ESTAT2,I_$TRACK, UNIT, ALARM_^1_%STA- ESTAT2,I_^1_%LDA* LOCSTA_'PROCESS EOT_^1_%ARS 3_^1_%AND- ONEBIT+12_^1_%TRA Q_^1_%LDA* LOCSTA_'PROCESS TAPE MARK_^1_%AND- ONEBIT+14_^1_%AAQ Q_^1_%LDA* LOCSTA_'P€€ROCESS DATA ERROR_^1_%AND- ONEBIT+13_^1_%ARS 2_^1_%AAQ A_^1_%ARS 3_^1_%TRA Q_^1_%LDA* LOCSTA_'PROCESS BUSY_^1_%AND- ONEBIT+1_^1_%AAQ A_^1_%ADD- ESTAT2,I_^1_%STA- ESTAT2,I_$+ EOT, TM, DATA ERR, BUSY_^1_%LDA* LOCSTA_'PROCESS WRITE LOCK_^1_%AND- ONEBIT+4_^1_%ALS 11_^1_%TRA Q_^1_%LDA* LOCSTA_'PROCESS READY_^1_%AND- ONEBIT+0_^1_%AAQ A_^1_%TCA A_,INVERT BIT SENSE_^1_%AND =N$8001_€ð^1_%ADD- ESTAT2,I_^1_%STA- ESTAT2,I_$+ READY, WRITE LOCK_^1_%LDA* LOCSTA_'PROCESS LOST DATA_^1_%AND =N$A00_^1_%SAZ 1_^1_%LDA- ONEBIT+6_^1_%ADD- ESTAT2,I_^1_%STA- ESTAT2,I_$+ LOST DATA_^1_%JMP* (FORMIT)_^1*_]_^1LOCSTA NUM 0_^1_%END_]_^__ ðPWAIT CSY/ C18 P€1_%NAM WAIT_)DECK-ID C18 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT WAIT ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT WAIT ROUTINE_^1*_8*****************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$SETUP DIAGNOSTIC CLOCK AND RELEASE CONTROL UNTIL€€_^1*_$INTERRUPT OCCURS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$SELECT TIMEOUT VALUE BASED ON FUNCTION TO BE_^1*_$EXECUTED AND PLACES THIS VALUE IN DIAGNOSTIC CLOCK_^1*_$CELL-IN PDT. THE TIMEOUT VALUE CONSISTS OF THE_^1*_$FUNCTIONAL TIME PLUS A PDT TIMEOUT VALUE IF ONE_^1*_$IS SUPPLIED IN THE PDT. THE INTERRUPT WILL BE_^1*_$ENABLED IN CASE WAIT IS CALLED €€BY SELECT TO KEEP_^1*_$FROM PROCESSING THE INTERRUPT BEFORE WAIT IS_^1*_$EXECUTED. THIS CAN OCCUR WHEN SELECT IS EXECUTED_^1*_$AT A LOWER PRIORITY THAN THE DRIVER WHEN EXECUTING_^1*_$THE REWIND CHECK PROGRAM._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(I) = CURRENT PDT ADDRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$EDCLK IN PDT SET TO TIMEOUT VALUE_^1*_]_^1*€€_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTER BY JUMP INSTRUCTION_^1*_$EXITS TO DISPATCHER TO WAIT FOR INTERRUPT_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT WAIT_^1_%ENT WAITX_(ENTRY POINT FOR SELECT_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* MOTCOD_'MOTION CODE ADDRESS_^1*_]€€_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU DISP($EA)_#DISPATCHER POINTER_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* WAIT *_^1*_6********_^1*_]_^1* LCTT WAIT ANCILLARY ROUTINE_^1*_]_^1WAIT_!LDA- MFLG,I_'GET REQUEST TYPE FLAG_^1_%SAN €€WX_+SKIP IF READ/WRITE REQUEST_^1_%LDA MOTCOD_'MOTION, GET CODE_^1_%INA -3_^1_%SAZ WAITX_^1_%INA -1_^1_%SAN WX_^1WAITX ENA 1_,REWIND/UNLOAD OR SELECT, SET TIME_^1_%JMP* WX+1_^1WX_#ENA 20_+READ/WRITE TIMER = 20 SECONDS_^1_%ADD- TIMOUT,I_$ADD PDT TIMEOUT IF ANY_^1_%STA- EDCLK,I_%SET CLOCK VALUE IN PDT_^1_%EIN 0_,RESTORE INTERRUPT DISABLED BY SELECT_^1_%JMP- (DISP)_'WAIT FOR €INTERRUPT_^1_%END_]_^__ PXMOT CSY/ C19 P€1_%NAM XMOT_)DECK-ID C19 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT MOTION ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT MOTION ROUTINES_^1*_8********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE MOTION I/O FUNCTIONS._^1*_]_^1*_€€8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS MODULE WILL DECODE THE MOTION COMMAND AND EXECUTE_^1*_$THE NEXT MOTION COMMAND. THESE COMMANDS ARE ISSUED BY A_^1*_$SERIES OF SMALL SUBROUTINES. BEFORE THE COMMAND IS ISSUED_^1*_$THE CORRECT PARITY WILL FIRST BE DETERMINED. AFTER THE_^1*_$MOTION COMMAND IS ISSUED CONTROL WILL BE PASSED BACK TO_^1*_$THE CALLER. AN UNUED €€FUNCTION WILL BE TREATED AS A NOP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$SEVERAL FLAG BITS IN THE PDT ARE USED BY THIS ROUTINE._^1*_*UNTMOD - BIT 11 - TYPE OF DRIVE (7 OR 9 TRACK)_^1*_*ESTAT1 - BIT 5 - MOTION REQUEST BIT (SET TO 1)_^1*_1- BIT 6 - REWIND FLAG (SET TO 1 IF REWIND)_^1*_1- BIT 8 - RECOVERY IN PROGRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1€€*_$IF A REWIND COMMAND IS EXECUTED BIT 6 OF ESTAT1 WILL_^1*_$BE SET TO INDICATE A REWINDIN PROGRESS. BIT 5 OF ESTAT1_^1*_$WILL BE SET TO INDICATE A MOTION REQUEST IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IF A SEVEN TRACK UNIT IS PRESENT THE ROUTINE TK7RW_^1*_$WILL BE CALLED TO DETERMINE THE PARIT€€Y TO BE USED._^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT ADVRB_(ADVANCE RECORD BUFFER_^1_%ENT MOTCOD_'MOTION TYPE FLAG_^1_%ENT SFUNC_(FUNCTION OUTPUT ROUTINE_^1_%ENT XMOT_)MOTION REQUEST_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* CL40_)CONTINUATOR ENTRY FOR NO OPERATION_^1_%EXT* PRITYC_'PARITY CODE_^1_%EXT* RDADT_(READ SUBROUTINE_^1_%EXT€€* TK7RW_(DETERMINE 7 TRACK PARITY TYPE_^1_%EXT* TK7WEF_'WRITE 7TK FILE MARK_^1_%EXT* XFER_)READ/WRITE ROUTINES_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU EWES(7)_'€€7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE SELECT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XMOT *_^1*_6********_^1*_]_^1* MOTION EXECUTION ANCILLARY ROUTINE_^1* ENTER WITH MOTION REQUEST, I =€€ PDT POINTER_^1*_]_^1XMOT_!NUM 0_^1_%LDA- UNTMOD,I_$IS THIS A 7 TRACK UNIT_^1_%AND- ONEBIT+11_^1_%SAZ XMOT10_'NO, SKIP_^1_%RTJ TK7RW_(DETERMINE TYPE OF PARITY_^1XMOT10 STA PRITYC_^1_%LDA- ESTAT1,I_$SET MOTION REQUEST BIT_^1_%AND- ZROBIT+5_^1_%ADD- ONEBIT+5_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$GET NUMBER OF WORDS_^1_%ARS 12_+SHIFT AND MASK_^1_%AND- LOWBTS+2_^1_%STA* MOTCOD_^1_%€€TRA Q_^1_%INA -8_^1_%SAP SUBMOT_'NOOP, ILLEGAL OPERATION_^1_%JMP* SUBMOT,Q_$EXECUTE FUNCTION_^1*_]_^1SUBMOT JMP* NOOP_)NO OPERATION (USED FOR STATUS)_^1_%JMP* BKSP_)BACKSPACE RECORD_^1_%JMP* WRFM_)WRITE FILE MARK_^1_%JMP* REW_*REWIND_^1_%JMP* REWUN_(REWIND UNLOAD_^1_%JMP* ADVAN_(SEARCH FILE MARK FORWARD_^1_%JMP* ERASE_(ERASE(DLU OR RECOVERY)/SEARCH TM REVERSE_^1_%JMP* ADVAN_(ADV€€ANCE 1 RECORD_^1_%EJT_]_^1* REWIND_]_^1*_]_^1REW_"LDA- ESTAT1,I_$SET REWIND BIT_^1_%AND- ZROBIT+6_^1_%ADD- ONEBIT+6_^1_%STA- ESTAT1,I_^1_%ENA 5_,EXECUTE REWIND FUNCTION_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1REWUN ENA 6_,EXECUTE REWIND UNLOAD_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1BKSP_!ENA 4_,EXECUTE BACKSPACE_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* ERASE_]_^1*_€€]_^1ERASE LDA- ELU,I_(CHECK IF DLU_^1_%EOR- DIAGLU,I_^1_%SAZ ERSX_^1_%LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND- ONEBIT+8_^1_%SAN 1_,YES, EXECUTE ERASE_^1_%JMP* BKSP_)NON-DLU SEARCH TM REVERSE_^1ERSX_!ENA 3_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* WRITE FILE MARK_^1*_]_^1WRFM_!LDA- UNTMOD,I_$GET 7TK BIT_^1_%AND- ONEBIT+11_^1_%SAZ WRFM9_^1_%RTJ TK7WEF_'WRITE 7TK TAPE MARK_^1_%JMP* €€(XMOT)_^1WRFM9 ENA 7_,EXECUTE 9TK FILEMARK_^1DOMOT RTJ* SFUNC_^1_%JMP* (XMOT)_^1*_]_^1*_]_^1* ADVANCE ONE RECORD OR FILE_^1*_]_^1ADVAN RTJ* BLOC+1_'CALCULATE ADDRESS OF BUFFER_^1BLOC_!ADC* ADVRB_^1_%NUM 0_^1_%LDA* BLOC+1_'GET PRESENT CORE ADDRESS_^1_%ADD* BLOC_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_^1_%INA 9_,ALLOW 9 WORDS_^1_%STA- ADTLW,I_%LWA OF BUFFER_^1_%RTJ €€RDADT_(EXECUTE A READ_^1_%JMP* (XMOT)_^1*_]_^1ADVRB BZS ADVRB(9)_$BUFFER FOR ADVANCE RECORD_^1*_]_^1*_]_^1* FUNCTION OUTPUT_^1* ENTER WITH FUNCTION CODE IN A AND PARITY IN PRITYC_^1*_]_^1SFUNC NUM 0_^1_%ADD- UNTMOD,I_$ADD UNIT, DENSITY AND TRACK_^1_%ADD PRITYC_'ADD PARITY_^1_%LDQ- EWES,I_^1_%INQ 8_,SET I/O_^1_%NUM $0B04_(SIO_^1_%JMP* (SFUNC)_^1*_]_^1*_]_^1* NO OPERATION - NO€Š FUNCTION OUTPUT_^1*_]_^1NOOP_!JMP CL40_)ENTER CONTINUATOR AFTER INT PROCESS_^1*_]_^1MOTCOD NUM 0_,MOTION CODE THIS MOTION_^1_%END_]_^__ŠPXFER CSY/ C20 P€1_%NAM XFER_)DECK-ID C20 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT EXECUTE READ/WRITE I/O FUNCTION ANCILLARY ROUTINES_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT READ/WRITE ROUTINES_^1*_8************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUT€€E READ/WRITE I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THESE ROUTINES CHECK IF LEGAL RECORD SIZE AND CALLS_^1*_$FAULT ROUTINE IF NOT. THE CORRECT PARITY IS GENERATED_^1*_$AND THE ADT TABLE IS SET UP. THE TYPE OF TRANSFER IS_^1*_$DETERMINED AND THE CORRECT ROUTINE (READ OR WRITE) IS_^1*_$CALLED. THE READ ROUTINE WILL EITHER EXECUTE A NORMAL_^1€€*_$READ OR A RECOVERY READ DEPENDING ON BIT 4 IN RFLAG IN_^1*_$THE PDT. THE WRITE ROUTINE WILL EITHER DO A WRITE OR_^1*_$A CONTROLLED BACKSPACE DEPENDING ON BIT 3 IN RFLAG._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NORMAL PARAMETERS IN PDT. SPECIAL FLAGS ARE USED IN_^1*_$RFLAG IN THE PDT. THESE FLAG ARE:_^1*_]_^1*_)BIT 2 = 1 = READ IN OPPOSITE PARITY_^1*_)BIT€€ 3 = 1 = EXECUTE CONTROLLED BACKSPACE_^1*_)BIT 4 = 1 = EXECUTE READ RECOVERY_^1*_]_^1*_$THEY ARE USED BY THE RECOVERY ROUTINES AND ARE_^1*_$CLEARED AFTER FUNCTION EXECUTED._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$CLEARS CONTROL FLAGS IN RFLAG AFTER FUNCTION EXECUTED._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP, PARAMETERS NEEDED ARE_^1*_*ALREADY IN THE€€ PDT._^1*_$EXIT IS A NORMAL RETURN TO CALLER._^1*_]_^1*_8FLOW_^1*_8----_^1*_$1. CHECK IF REQUEST SHORT RECORD TYPE, IF SO CALL_^1*_(FAULT ROUTINE._^1*_$2. DETERMINE CORRECT PARITY FOR 7 TRACK._^1*_$3. SETUP ADT TABLE AND CALL READ OR WRITE ROUTINE._^1*_$4. IF READ DETERMINE IF EITHER OPPOSITE PARITY_^1*_(OR RECOVERY READ FLAG SET. ENABLE MICRO INTERRUPT_^1*_(AND EXECUTE FUNCTION._^€€1*_$5. IF WRITE DETERMINE IF CONTROLLED BACKSPACE FLAG_^1*_(SET. ENABLE MICRO INTERRUPT AND EXECUTE FUNCTION_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT FWA_*CURRENT FIRST WORD ADDRESS_^1_%ENT LWA_*CURRENT LAST WORD ADDRESS_^1_%ENT PRITYC_'PARITY STORAGE WORD_^1_%ENT RDADT_(READ ADT SUBROUTINE_^1_%ENT WRADT_(WRITE ADT SUBROUT€€INE_^1_%ENT XFER_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* F1860_(FAULT ROUTINE_^1_%EXT* SFUNC_(I/O FUNCTION ROUTINE_^1_%EXT* TK7RW_(7 TK READ WRITE ROUTINE_^1_%EXT* TK7DAT_'7 TRACK DATA FORMATTING_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU ADTCW(27)_#27 ADT TABLE CONTROL WORD_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU AD€€TLW(29)_#29 ADT TABLE LWA_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU NOISLN(2)_#MINIMUM RECORD SIZE_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU RFLA€€G(34)_#34 RECOVERY FLAGS_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE SELECT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XFER *_^1*_6********_^1*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1XFER_!NUM 0_^1_%LDA- QSTWD4,I_$GET REQUEST PARAMETER_^1_%INA -NOISLN_%CHECK IF LENGTH.GE.NOISE LENGTH_^1_%SAP 1_^1_€€%JMP* NOISRC_'SHORT RECORD ERROR_^1_%LDA- ECCOR,I_%INIT CURRENT WORD POINTERS_^1_%STA* FWA_^1_%LDA- ELSTWD,I_^1_%STA* LWA_^1_%LDA- ESTAT1,I_$READ OR WRITE_^1_%AND- ONEBIT+0_^1_%STA* MOTIDX_'SET R/W FLAG_^1_%LDA- UNTMOD,I_$THIS A 7TK UNIT_^1_%AND- ONEBIT+11_^1_%SAZ TK9RW_^1_%RTJ TK7DAT_'FORMAT 7 TRACK DATA_^1_%RTJ TK7RW_(DETERMINE TYPE OF 7TK PARITY_^1TK9RW STA* PRITYC_'STORE PA€€RITY_^1_%LDA* FWA_*SETUP ADT TABLE BUFFER POINTERS_^1_%INA -1_^1_%STA- ADTFW,I_%FWA-1_^1_%LDA* LWA_^1_%INA -1_^1_%STA- ADTLW,I_%LAST WORD ADDRESS_^1_%LDA* MOTIDX_'R/W FLAG_^1_%SAZ READ_^1_%RTJ* WRADT_(DO THE WRITE_^1_%JMP* (XFER)_^1READ_!RTJ* RDADT_(DO THE READ_^1_%JMP* (XFER)_^1*_]_^1NOISRC ENA 31_+NOISE RECORD ERROR_^1_%JMP F1860_^1*_]_^1*_]_^1FWA_"NUM 0_,CURRENT FIRST WORD€€ ADDRESS_^1LWA_"NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT_]_^1* READ DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1RDADT NUM 0_^1_%LDA- ADTCW,I_%GET AND SET ADT CONTROL WORD_^1_%AND- ZROBIT+11_#MASK OUT WRITE BIT_^1_%STA- ADTCW,I_^1_%LDA* PRITYC_^1_%STA* TPAR_)SAVE PARITY BIT_^1_%LDA- RFLAG,I_^1_%AND- ONEBIT+2_^1_%SAZ RD10A_(OPPOSITE PARITY NOT SET_^1_%TCA A_€€^1_%AND- ONEBIT+10_#COMPIMENT PARITY BIT_^1_%STA* PRITYC_^1RD10A RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%LDA- RFLAG,I_^1_%AND- ONEBIT+4_$RECOVERY READ IN PROGRESS_^1_%SAZ 1_^1_%ENA 8_,YES, SELECT FUNCTION_^1_%INA 1_,OUTPUT READ FUNCTION_^1_%RTJ SFUNC_^1_%LDA- RFLAG,I_^1_%AND- ZROBIT+2_$CLEAR OPPOSITE PARITY FLAG_^1_%AND- ZROBIT+4_$CLEAR RECOVERY READ SWITCH_^1_%STA- RFLAG,I_^1€€_%LDA* TPAR_^1_%STA* PRITYC_'RESTORE PARITY_^1_%JMP* (RDADT)_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1WRADT NUM 0_^1_%LDA- ADTCW,I_%SET AND SET ADT CONTROL WORD_^1_%AND- ZROBIT+11_#ADD WRITE BIT_^1_%ADD- ONEBIT+11_^1_%STA- ADTCW,I_^1_%RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%LDA- RFLAG,I_%CONTROLLED BACKSPACE ENABLED_^1_%AND- ONEBIT+3_^1_%SA€€Z 1_^1_%ENA 8_,YES, EXECUTE ONE_^1_%INA 2_^1_%ADD- HAFWRD,I_$ADD HALF WORD BIT IF SET_^1_%RTJ SFUNC_^1_%LDA- RFLAG,I_^1_%AND- ZROBIT+3_$CLEAR CB FLAG_^1_%STA- RFLAG,I_^1_%JMP* (WRADT)_^1*_]_^1* ENABLE MICRO INTERRUPT_^1*_]_^1ENBMIC NUM 0_^1_%LDA- I_,SET UP POINTER TO ADT TABLE_^1_%INA ADTCW_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ- ONEBIT+15_#ENABLE BIT_^1_%NUM $0B06_(DEFINE €²MICRO INTERRUPT (DMI)_^1_%JMP* (ENBMIC)_^1*_]_^1MOTIDX NUM 0_,READ/WRITE FLAG, 1=WRITE_^1PRITYC NUM 0_,PARITY BIT (POSITIONED)_^1TPAR_!NUM 0_,TEMP PARITY STORAGE_^1_%END_]_^__²PNEXTIO CSY/ C21 P€1_%NAM NEXTIO_'DECK-ID C21 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT NEXT I/O ANCILLARY ROUTINE_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT NEXT I/O ROUTINE_^1*_8*********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THIS ROUTINES DETERMINES IF THERE €€ARE ANY MORE I/O_^1*_$OPERATIONS NECESSARY TO SATISFY THIS REQUEST._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$IF A MOTION REQUEST IS IN PROGRESS THIS ROUTINE WILL_^1*_$UPDATE THE PHYSTAB COPY OF WORD 4 OF THE REQUEST_^1*_$TO INDICATE THAT THE LAST MOTION IS COMPLETED. A_^1*_$CHECK WILL BE MADE IF THE LAST MOTION REQUEST WAS_^1*_$PROCESSED AND RETURN TO KERN€€EL INDICATING IF MOTION_^1*_$REQUEST COMPLETED. IF A READ OR WRITE REQUEST IS_^1*_$IN PROGRESS A CHECK WILL BE MADE TO DETERMINE IF_^1*_$ADDITIONAL TRANSFERS ARE NECESSARY._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$THE PHYSTAB PARAMETERS ARE THE ONLY EXTERNAL INPUTS_^1*_$REQUIRED WITH THE EXCEPTION OF EXTERNAL MOTCOD._^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$THE PH€€YSTAB PARAMETERS EDCLK, QSTWD4 AND ESTAT1_^1*_$ARE MODIFIED BY THIS PROGRAM. THE EXTERAL URW IS ALSO_^1*_$MODIFIED BY THIS PROGRAM._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$NORMAL SUBROUTINE ENTRY. EXIT IS CALL+1 IS REQUEST_^1*_$IS SATISFIED AND EXIT+2 IF ANOTHER MOTION IS NEEDED._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$RETURNS TO CALLER_^1*_]_^1*_8SUBROUTINES_^1*_8-----------€€_^1*_]_^1*_$CALLS REWSD ROUTINE IN REWCKL TO SCHEDULE REWIND_^1*_$CHECK PROGRAM IF REWIND FUNCTION WAS ISSUED. CALLS_^1*_$TK7DAT IF FUNCTION IS A 7 TRACK READ TO CONVERT THE_^1*_$DATA BACK TO ASCII AND PLACE INTO USERS BUFFER._^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT NEXTIO_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* MOTCOD_'MOTION CODE_^1€€_%EXT* REWSD_(REWIND SCHEDULER_^1_%EXT* TK7DAT_'SEVEN TRACK DATA FORMATTING_^1_%EXT* URW_*COUNT OF UNITS REWINDING_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU DISP($EA)_#DISPATCHER ADDRESS_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_€€%EQU ELSTWD(11)_"11 LAST LOC + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST EQUIPTMENT STATUS_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU FIVE($43)_#CONSTANT OF 5_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU QSTWD4(36)_"WORD 4 OF REQUEST_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU TIMOUT(20)_"INTERRUPT €€TIMEOUT VALUE_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE SELECT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* NEXTIO *_^1*_6**********_^1*_]_^1* LCTT NEXT I/O ANCILLARY ROUTINE_^1* ENTER WITH I = PDT ADDRESS_^1*_]_^1NEXTIO NUM 0_^1_%LDA- ESTAT1,I_$IS THIS A MOTION REQUEST_^1_%AND- ONEBIT+5_^1_%SAN NX10_^1_%JMP* NX100_(NO, CHECK READ/WRITE SE€€GMENTATION_^1NX10_!LDA- ESTAT1,I_$IS REWIND IN PROGRESS_^1_%AND- ONEBIT+6_^1_%SAZ NX20_^1_%LDA =N200_(SET TIMEOUT TO 200 SECONDS_^1_%ADD- TIMOUT,I_$ADD PDT TIMEOUT IF ANY_^1_%STA- EDCLK,I_^1_%RAO URW_*INDICATE UNIT REWINDING_^1_%RTJ REWSD_(SCHEDULE REWIND CHECKER_^1_%JMP* NX60_)NORMAL EXIT TO PROCESS NEXT PDT REQUEST_^1NX20_!LDA- ELU,I_^1_%EOR- DIAGLU,I_$IS THIS A DLU_^1_%SAN €€1_,NO, CONTINUE_^1_%JMP* NX60_)YES, EXIT_^1_%LDA- ESTAT1,I_$IS SEARCH REVERSE IN PROGRESS_^1_%AND- ONEBIT+9_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* SRNEXT_'YES, PROCESS NEXT SUB-FUNCTION_^1_%LDA MOTCOD_'IS THIS A SEARCH REVERSE FUNCTION_^1_%INA -6_^1_%SAN 1_^1_%JMP* SRINIT_'YES, INITIALIZE SEARCH REVERSE_^1_%INA 1_,IS THIS AN ADVANCE FILE_^1_%SAN NX30_)NO, CHECK REPEAT MOTION_^1_%LD€€A- SINTER,I_$YES, CHECK IF FILE MARK REACHED_^1_%AND- ONEBIT+14_^1_%SAN NX30_)YES, CHECK IF REPEAT MOTION_^1_%JMP* NX55_)NO, EXIT+2 TO DO ANOTHER OPERATION_^1NX30_!LDA- QSTWD4,I_$IS THIS A REPEAT MOTION_^1_%SAP NX40_)NO, CHECK IF ANOTHER FUNCTION_^1_%INA -1_+DECREMENT COUNTER AND SAVE_^1_%STA- QSTWD4,I_^1_%AND- LOWBTS+11_#ISOLATE COUNT_^1_%SAZ NX50_)SKIP IF DONE, CLEAR MOTION A€€ND EXIT_^1_%JMP* NX55_)EXIT+2, DO ANOTHER OPERATION_^1NX40_!ENQ 0_^1_%LDA- QSTWD4,I_$UPDATE TO NEXT COMMAND_^1_%LLS 4_^1_%STA- QSTWD4,I_^1_%ENQ 0_^1_%LLS 4_,CHECK IF REQUEST COMPLETE_^1_%SQN NX55_)NOT COMPLETE, DO NEXT FUNCTION_^1NX50_!LDA- ESTAT1,I_$NORMAL EXIT, CLEAR MOTION BIT_^1_%AND- ZROBIT+5_^1_%STA- ESTAT1,I_^1_%JMP* NX60_^1NX55_!RAO* NEXTIO_'EXIT+2, DO NEXT MOTION_^1NX€€60_!JMP* (NEXTIO)_^1*_]_^1*_]_^1*_]_^1NX100 LDA- ELU,I_^1_%EOR- DIAGLU,I_$IS THIS A DLU_^1_%SAN 1_,NO, CONTINUE_^1_%JMP* NX60_)YES, EXIT_^1_%LDA- UNTMOD,I_$IS THIS A 9 TRACK UNIT_^1_%AND- ONEBIT+11_^1_%SAN NX200_(NO, SKIP_^1_%LDA- ADTFW,I_%UPDATE ECCOR_^1_%STA- ECCOR,I_^1NX150 LDA- ESTAT1,I_$IS THIS AN UNFORMATTED REQUEST_^1_%AND- ONEBIT+1_^1_%SAZ 1_^1_%JMP* NX60_)NO, DONE_^1_€€%LDA- ECCOR,I_%YES, ARE ALL WORDS READ/WRITTEN_^1_%INA 1_,FWA+1_^1_%SUB- ELSTWD,I_^1_%SAN 1_^1_%JMP* NX60_)YES, DONE_^1_%JMP* NX55_)NO, DO ANOTHER READ_^1*_]_^1NX200 LDA- ESTAT1,I_^1_%AND- ONEBIT+0_$IS THIS A READ REQUEST_^1_%SAN NX210_^1_%RTJ TK7DAT_'YES, CONTINUE 7TK FORMATTING_^1NX210 JMP* NX150_^1*_]_^1* INITIALIZE SEARCH REVERSE FUNCTION_^1*_]_^1SRINIT LDA- ESTAT1,I_$SET€€ SEARCH REVERSE IN PROGRESS FLAG_^1_%AND- ZROBIT+9_^1_%ADD- ONEBIT+9_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$SAVE REQUEST WORD 4_^1_%STA* SVWD4_^1_%JMP* SRN05_(INITIAL ADVANCE RECORD_^1SRI10 LDQ- ONEBIT+12_#BACKSPACE_^1_%JMP* SROUT_^1*_]_^1* SEARCH REVERSE FUNCTION LOGIC_^1*_]_^1SRNEXT LDA* STEP_^1_%INA -4_+STEP = 4_^1_%SAN 1_,NO, CONTINUE_^1_%JMP* SRDONE_'YES, FUNCTION COMPLETE_^1€€_%INA 3_,STEP = 1_^1_%SAZ SRN20_(YES, DO NEXT STEP_^1_%INA -1_+NO, STEP = 2_^1_%SAZ SRN10_(YES, DO NEXT STEP_^1SRN05 ENA 1_,NO, SET STEP TO 1_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP* SROUT_^1SRN10 ENA 3_,STEP 3_^1_%JMP* SRI10_(BACKSPACE_^1SRN20 LDA- ESTAT2,I_^1_%AND- ONEBIT+11_#TAPE MARK FOUND_^1_%SAZ SRN30_(NO, DO NEXT STEP_^1_%ENA 4_,YES, STEP 4_^1_%JMP* SRI10_(BACKSP€€ACE_^1SRN30 ENA 2_,STEP 2_^1_%JMP* SRI10_(BACKSPACE_^1*_]_^1SROUT STA* STEP_)SAVE THE STEP_^1_%STQ- QSTWD4,I_$UPDATE REQUEST_^1_%JMP* NX55_)DO NEXT MOTION_^1STEP_!NUM 0_^1SVWD4 NUM 0_^1*_]_^1* SEARCH REVERSE TAPE MARK COMPLETED_^1*_]_^1SRDONE LDA- ESTAT2,I_$SET TAPE MARK STATUS_^1_%AND- ZROBIT+11_^1_%ADD- ONEBIT+11_^1_%STA- ESTAT2,I_^1_%LDA- SINTER,I_^1_%AND- ZROBIT+14_^1_%AD€ÎD- ONEBIT+14_^1_%STA- SINTER,I_^1_%LDA* SVWD4_(RESTORE WORD 4 OF REQUEST_^1_%STA- QSTWD4,I_^1_%LDA- ESTAT1,I_$CLEAR SEARCH REVERSE IN PROGRESS_^1_%AND- ZROBIT+9_^1_%STA- ESTAT1,I_^1_%JMP* NX30_^1_%END_]_^__ÎPTK7DAT CSY/ C22 P€1_%NAM TK7DAT_'DECK-ID C22 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT 7 TRACK DATA FORMAT ANCILLARY ROUTINES_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT 7 TRACK DATA FORMAT ROUTINES_^1*_8*********************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*€€_$CONVERT 7 TRACK DATA AND PACK AND UNPACK BUFFERS_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS ROUTINES CONVERTS DATA FROM ASCII TO BCD AND_^1*_$UNPACKS FROM USERS BUFFER TO LOCAL BUFFER FOR 7 TRACK_^1*_$WRITE OPERATIONS. FOR READ OPERATIONS DATA IS_^1*_$CONVERTED FROM BCD TO ASCII AND PACKED INTO USERS_^1*_$BUFFER FROM LOCAL BUFFER._^1*_]_^1*_8INPUT REQ€€UIREMENTS_^1*_8------------------_^1*_]_^1*_$ALL INPUTS NECESSARY ARE SUPPLIED BY PARAMETER_^1*_$WORDS IN THE PHYSTAB AND EXTERNAL STORAGE FWA AND LWA._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$NONE_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY AND EXIT ARE NORMAL SUBROUTINES ENTRY AND_^1*_$EXIT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_€€^1*_$A2BCD - ASCII TO BCD CONVERSION_^1*_$BCD2A - BCD TO ASCII CONVERSION_^1*_$PRUCM2- CALULATE PHYSICAL RECORD SIZE_^1*_$ASCBC2 - ASCII TO BCD PREPARATION_^1*_$BCDAS2 - BCD TO ASCII PREPARATION_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT TK7DAT_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* FWA_*CURRENT FIRST WORD ADDRESS_^1_%EXT* LWA_*CURRENT €€LAST WORD ADDRESS_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU ABUFF(38)_#38 PACK/UNPACK BUFFER ADDRESS_^1_%EQU ADTFW(28)_#ADT FWA_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU ECCOR(10)_#NEXT LOCATION TO STOR DATA_^1_%EQU ELSTWD(11)_"LAST WORD + 1 TO STORE DATA_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU H00FF€€($A)_^1_%EQU HFF00($1A)_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU NOISLN(2)_#MINIMUM ACCEPTABLE RECORD SIZE_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU PHSREC(37)_"MAXIMUM PHYSICAL RECORD SIZE(7TRK)_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU ZERO($22)_#LOCATION CONTAINING ZERO_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* TK7D€€AT *_^1*_6**********_^1* LCTT DUMMY 7 TRACK DATA FORMAT ROUTINE_^1*_]_^1TK7DAT NUM 0_^1_%LDA- ELU,I_(CHECK IF THIS IS A DLU_^1_%EOR- DIAGLU,I_^1_%SAN 1_,NO, CONTINUE_^1_%JMP* TK7DEX_'YES, EXIT_^1_%LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND- ONEBIT+8_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* TK7DEX_'YES, EXIT_^1_%LDA- ESTAT1,I_$IS 7TK READ IN PROGRESS_^1_%AND- ONEBIT+4_^1_%SAZ 1_,NO,€€ CONTINUE_^1_%JMP* TK7CON_'YES, CONTINUATION IN PROGRESS_^1_%LDA- ESTAT1,I_$IS THIS A READ REQUEST_^1_%AND- ONEBIT+0_^1_%SAN TK7D05_'NO, DO NOT SET FLAG_^1_%LDA- ESTAT1,I_$YES, SET 7TK READ IN PROGRESS_^1_%AND- ZROBIT+4_^1_%ADD- ONEBIT+4_^1_%STA- ESTAT1,I_^1TK7D05 LDA- ABUFF,I_%INIT FWA FOR LOCAL BUFFER_^1_%STA FWA_^1_%LDA- QSTWD4,I_$INIT RECORD SIZE_^1_%STA NUMBR_^1_%LDA- PHSRE€€C,I_$MAXIMUM PHYSICAL RECORD SIZE_^1_%SUB- QSTWD4,I_$MINUS NUMBER OF WORDS TO TRANSFER_^1_%SAP TK7D10_'WORDS EQUAL OR LESS PHYSREC_^1_%LDA- ESTAT1,I_^1_%AND- ONEBIT+1_^1_%SAZ TK7D06_'SKIP IF FORMAT REQUEST_^1_%LDA- PHSREC,I_^1_%STA NUMBR_^1_%JMP* TK7D10_^1TK7D06 RTJ PRUCM2_'CHECK IF LAST PRU.LT. NOISE RECORD_^1TK7D10 LDA- ESTAT1,I_^1_%AND- ONEBIT+3_$ASCII OR BINARY_^1_%SAN TK7€€D20_'SKIP IF ASCII_^1_%LDA NUMBR_^1_%MUI- ONEBIT+2_$SIZE * 4_^1_%DVI- LOWBTS+1_$/3_^1_%SQZ 1_^1_%INA 1_^1_%STA NUMBR_^1TK7D20 LDA FWA_^1_%ADD NUMBR_^1_%STA LWA_*LWA = FWA + RECORD SIZE_^1_%LDA- ESTAT1,I_^1_%AND- ONEBIT+0_$CHECK IF READ OR WRITE_^1_%SAN TK7D30_'SKIP IF WRITE_^1_%JMP* TK7DEX_^1TK7D30 LDA- ESTAT1,I_^1_%AND- ONEBIT+3_$ASCII OR BINARY_^1_%SAN TK7D40_'SKIP IF AS€€CII_^1_%RTJ UNPK2_(CONVERT TO ASSY/DASSY_^1_%JMP* TK7DEX_^1TK7D40 RTJ ASCBC2_'CONVERT ASCII TO BCD FOR WRITE_^1TK7DEX JMP* (TK7DAT)_^1*_]_^1*_]_^1*_]_^1TK7CON LDA- ADTFW,I_%UPDATE TO LAST WORD READ +1_^1_%INA 1_^1_%STA LWA_^1_%LDA- ESTAT1,I_$CLEAR PROGRESS FLAG_^1_%AND- ZROBIT+4_^1_%STA- ESTAT1,I_^1_%AND- ONEBIT+3_$ASCII OR BINARY MODE_^1_%SAN TK7C10_'SKIP IF ASCII_^1_%RTJ PA€€CK2_(CONVERT ASSY TO BINARY_^1_%JMP* TK7DEX_^1*_]_^1TK7C10 RTJ BCDAS2_^1_%JMP* TK7DEX_^1*_]_^1BUFFER NUM 0_,ADDRESS OF BUFFER_^1SAVEI NUM 0_,TEMPORARY STORAGE OF I_^1TEMP_!NUM 0_,TEMPORARY STORAGE OF PARTIAL CONVERSION_^1_%EJT_]_^1*_*ASCII TO BCD CONVERSION SUBROUTINE_^1*_]_^1*_*THE FOLLOWING SUBROUTINE CONVERTS A BUFFER OF ASCII C_^1*_*(TWO ASCII CHARACTERS PER WORD - BITS 0-€€6, 8-14) TO B_^1*_*CODES (TWO BCD CHARACTERS PER WORD - BITS 0-5, 8-13)._^1*_*ORIGINAL CODES ARE REPLACED BY THE CONVERTED CODES SO_^1*_*THE ORIGINAL ASCII BUFFER IS MODIFIED TO BE A BCD BUF_^1*_]_^1A2BCD NUM 0_^1_%STA* BUFFER_'SAVE STARTING ADDRESS OF BUFFER_^1_%LDA- I_^1_%STA* SAVEI_(SAVE CONTENTS OF I REGISTER_^1LOOPA ENA $7F_*MASK TO A_^1_%INQ -1_+DECREMENT Q BY ONE_^1_%SQ€€P CONVA-*-1_#CONTINUE IF Q IS POSITIVE_^1_%LDA* SAVEI_(DONE IF Q IS NEGATIVE - GET ORIGINAL I_^1_%STA- I_,RESTORE I_^1_%JMP* (A2BCD) EXIT FROM SUBROUTINE WITH BUFFER CONVERTED_^1*_]_^1CONVA STQ- I_,SET UP I AS BUFFER INDEX_^1_%LDQ* (BUFFER),I_"GET WORD FROM BUFFER_^1_%LAQ Q_,MASK TO GET LOWER CHARACTER_^1_%RTJ* LIMCK_(ASSURE CHARACTER BETWEEN 20 AND 5F (BAD_^1_%LDQ* TABLE,Q_%GET€€ BCD CODE - USE ASCII CHARACTER AS I_^1_%LAQ Q_,MASK TO GET BCD CODE (LOWER HALF OF WOR_^1_%STQ* TEMP_)SAVE FIRT CODE_^1_%LDQ* (BUFFER),I_"GET WORD FROM BUFFER_^1_%QLS 8_,SHIFT UPPER CHARACTER INTO POSITION_^1_%LAQ Q_,MASK TO GET CHARACTER_^1_%RTJ* LIMCK_(ASSURE CHARACTER BETWEEN 20 AND 5F (BAD_^1_%LDQ* TABLE,Q_%GET BCD CODE - USE ASCII CHARACTER AS I_^1_%LAQ A_,MASK TO GET BCD€€ CODE (LOWER HALF OF WOR_^1_%ALS 8_,SHIFT CODE TO UPPER HALF_^1_%ADD* TEMP_)ADD LOWER CODE_^1_%STA* (BUFFER),I_"STORE CONVERTED CODES BACK INTO BUFFER_^1_%LDQ- I_,GET I_^1_%JMP* LOOPA_(LOOP BACK FOR NEXT WORD IN BUFFER_^1*_]_^1LIMCK NUM 0_^1_%INQ -$20_^1_%SQP 1_,SKIP IF NOT 0-1F_^1_%ENQ 0_,SET TO 20 FOR SPACE_^1_%INQ -$40_^1_%SQM 1_,SKIP IF NOT 60-7F_^1_%ENQ -$40_)SET TO 2€€0 FOR SPACE_^1_%INQ $60_*RESTORE ORIGINAL CHARACTER_^1_%INA -$40_)MAKE 3F MASK_^1_%LAQ Q_,TRUNCATE Q TO 6 BITS_^1_%INA $40_*RESTORE 7F MASK_^1_%JMP* (LIMCK)_^1_%EJT_]_^1*_*BCD TO ASCII CONVERSION SUBROUTINE_^1*_]_^1*_*THE FOLLOWING SUBROUTINE CONVERTS A BUFFER OF BCD COD_^1*_*(TWO BCD CODES PER WORD - BITS 0-5, 8-13) TO ASCII CO_^1*_*(TWO ASCII CODES PER WORD - BITS 0-6, 8-14).€€ THE ORI_^1*_*CODES ARE REPLACED BY THE CONVERTED CODES SO THAT THE_^1*_*ORIGINAL BCD BUFFER IS MODIFIED TO BE AN ASCII BUFFER_^1*_]_^1BCD2A NUM 0_^1_%STA* BUFFER_'SAVE STARTING ADDRESS OF BUFFER_^1_%LDA- I_^1_%STA* SAVEI_(SAVE CONTENTS OF I REGISTER_^1LOOPB LDA- H00FF_(GET MASK INTO A_^1_%INQ -1_+DECREMENT Q BY ONE_^1_%SQP CONVB-*-1_#CONTINUE IF Q IS POSITIVE_^1_%LDA* SAVEI_€€(DONE IF Q IS NEGATIVE - GET ORIGINAL I_^1_%STA- I_,RESTORE I_^1_%JMP* (BCD2A)_^1*_]_^1CONVB STQ- I_,SET UP I AS INDEX TO BUFFER_^1_%LDQ* (BUFFER),I_"GET WORD FROM BUFFER_^1_%LAQ Q_,MASK TO GET LOWER CHARACTER_^1_%LDQ* TABLE,Q_%GET ASCII CODE - USE BCD CODE AS INDEX_^1_%QLS 8_,SHIFT ASCII CODE TO LOWER HALF OF WORD_^1_%LAQ Q_,MASK TO GET LOWER CODE_^1_%STQ* TEMP_)SAVE FIRST COD€€E_^1_%LDQ* (BUFFER),I_"GET WORD FROM BUFFER_^1_%QLS 8_,SHIFT UPPER CHARACTER INTO POSITION_^1_%LAQ Q_,MASK TO GET CHARACTER_^1_%LDA* TABLE,Q_%GET ASCII CODE - USE BCD CODE AS INDEX_^1_%AND- HFF00_(MASK TO GET UPPER CODE_^1_%ADD* TEMP_)ADD LOWER CODE_^1_%STA* (BUFFER),I_"STORE CONVERTED CODES BACK INTO BUFFER_^1_%LDQ- I_,GET I_^1_%JMP* LOOPB_(LOOP BACK FOR NEXT WORD IN BUFFER_^1_%€€EJT_]_^1*_]_^1* THE FOLLOWING TABLE IS USED TO CONVERT CODES FROM_^1*_#1. TELETYPE ASCII TO EXTERNAL BCD_^1*_#2. EXTERNAL BCD TO TELETYPE ASCII_^1*_5BCD TO ASCII_$**_$ASCII TO BCD_^1*_]_^1TABLE NUM $201F_%00_%3A_^1_%NUM $3131_'01_!1_!31_'**_'41_!A_!31_^1_%NUM $3232_'02_!2_!32_'**_'42_!B_!32_^1_%NUM $3333_'03_!3_!33_'**_'43_!C_!33_^1_%NUM $3434_'04_!4_!34_'**_'44_!D_!34_^1€€_%NUM $3535_'05_!5_!35_'**_'45_!E_!35_^1_%NUM $3636_'06_!6_!36_'**_'46_!F_!36_^1_%NUM $3737_'07_!7_!37_'**_'47_!G_!37_^1_%NUM $3838_'08_!8_!38_'**_'48_!H_!38_^1_%NUM $3939_'09_!9_!39_'**_'49_!I_!39_^1_%NUM $3021_'0A_!0_!30_'**_'4A_!J_!21_^1_%NUM $3D22_'0B_!=_!3D_'**_'4B_!K_!22_^1_%NUM $2723_%0C_%27_'**_'4C_!L_!23_^1_%NUM $3A24_'0D_%26 (3A)_!**_'4D_!M_!24_^1_%NUM $3E25_^1_%NUM $2€€226_^1_%NUM $2027_'10 SPACE 20_'**_'50_!P_!27_^1_%NUM $2F28_'11_!/_!2F_'**_'51_!Q_!28_^1_%NUM $5329_'12_!S_!53_'**_'52_!R_!29_^1_%NUM $5412_'13_!T_!54_'**_'53_!S_!12_^1_%NUM $5513_'14_!U_!55_'**_'54_!T_!13_^1_%NUM $5614_'15_!V_!56_'**_'55_!U_!14_^1_%NUM $5715_'16_!W_!57_'**_'56_!V_!15_^1_%NUM $5816_'17_!X_!58_'**_'57_!W_!16_^1_%NUM $5917_'18_!Y_!59_'**_'58_!X_!17_^1_%NUM $5A18_'19_€€!Z_!5A_'**_'59_!Y_!18_^1_%NUM $5F19_^1_%NUM $2C3D_^1_%NUM $281E_^1_%NUM $252D_^1_%NUM $5C2F_^1_%NUM $401A_^1_%NUM $2D10_'20_!-_!2D_'**_'20 SPACE 10_^1_%NUM $4A2A_'21_!J_!4A_'**_'21_%2A_^1_%NUM $4B0F_^1_%NUM $4C3F_^1_%NUM $4D2B_'24_!M_!4D_'**_'24_!$_!2B_^1_%NUM $4E1D_^1_%NUM $4F1D_^1_%NUM $500C_'27_!P_!50_'**_'27_%0C_^1_%NUM $511C_'28_!Q_!51_'**_'28_!(_!1C_^1_%NUM $523C_'2€€9_!R_!52_'**_'29_!)_!3C_^1_%NUM $212C_'2A_%21_'**_'2A_!*_!2C_^1_%NUM $2430_'2B_!$_!24_'**_'2B_!+_!30_^1_%NUM $2A1B_'2C_!*_!2A_'**_'2C_!,_!1B_^1_%NUM $5D20_^1_%NUM $3B3B_^1_%NUM $5E11_^1_%NUM $2B0A_^1_%NUM $4101_'31_!A_!41_'**_'31_!1_!01_^1_%NUM $4202_'32_!B_!42_'**_'32_!2_!02_^1_%NUM $4303_'33_!C_!43_'**_'33_!3_!03_^1_%NUM $4404_'34_!D_!44_'**_'34_!4_!04_^1_%NUM $4505_'35_!E_!4€€5_'**_'35_!5_!05_^1_%NUM $4606_'36_!F_!46_'**_'36_!6_!06_^1_%NUM $4707_'37_!G_!47_'**_'37_!7_!07_^1_%NUM $4808_'38_!H_!48_'**_'38_!8_!08_^1_%NUM $4909_'39_!I_!49_'**_'39_!9_!09_^1_%NUM $3F0D_^1_%NUM $2E2E_^1_%NUM $293E_^1_%NUM $5B0B_^1_%NUM $3C0E_^1_%NUM $233A_^1_%EJT_]_^1PRUCM2 NUM 0_^1_%LDA- PHSREC,I_$PRU SIZE INSTALLED_^1_%STA* PRUSZ_(PRUSIZE_^1TRYAGN ENQ 0_^1_%LDA* NUMB€€R_(LOGIC RECORD SIZE DIVIDED BY_^1_%DVI* PRUSZ_(PRU SIZE_^1_%SQZ LEAVE_(NO REMAINDER,LOGIC REC#PRU SIZE_^1_%INQ -NOISLN-1_#REMAINDER.GT.NOISE LIMIT_^1_%SQP LEAVE_(YES, EXIT_^1_%LDA* PRUSZ_(NO, LOAD PRU SIZE_^1_%INA -NOISLN-1_#DECR PRUSZ BY NOISE-1_^1_%STA* PRUSZ_^1_%JMP* TRYAGN_'TRY REMAINDERING AGAIN_^1LEAVE LDA* PRUSZ_^1_%STA* NUMBR_(SIZE OF SEGMENT RECORDS_^1_%JMP* (PRUCM2)€€_^1*_]_^1NUMBR NUM 0_^1PRUSZ NUM 0_^1*_]_^1*_]_^1ASCBC2 NUM 0_,ASCII TO BCD PREP._^1_%RTJ SETUP_^1ASCLOP LDQ- ECCOR,I_%GET USER ADDRESS_^1_%LDA- (ZERO),Q_$GET DATA_^1_%STA* (CURR)_^1_%RAO- ECCOR,I_%TALLY USER ADDRESS_^1_%RAO* CURR_)TALLY CURR_^1_%LDA* CURR_^1_%EOR LWA_*CHECK FOR DONE_^1_%SAZ 1_,YES_^1_%JMP* ASCLOP_'NOT DONE_^1_%RTJ* AQGET_(PREP AQ FOR ASC TO BCD_^1_%RTJ A2€€BCD_(CONVERT_^1_%JMP* (ASCBC2)_^1*_]_^1*_]_^1AQGET NUM 0_^1_%LDQ FWA_^1_%TRQ A_,INTO A_^1_%TCQ Q_,COMPLEMENT_^1_%ADQ LWA_^1_%JMP* (AQGET)_^1_%EJT_]_^1* WRITE 7 TRACK DATA - UNPACK INTO LOCAL BUFFER_^1*_]_^1UNPK2 NUM 0_,ENTRY FOR BINARY TO ASSEM/DISASSEM._^1_%RTJ* SETUP_^1_%CLR Q_,0 INTO Q_^1NXTCYC RTJ* GETFST_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%€€RTJ* STRDAT_'GO STORE Q WHICH IS UNPACKED FOR 1732_^1_%LLS 4_,4 BITS_^1_%RTJ* GETFST_'GET ANOTHER 16 BINARY BITS_^1_%LLS 2_,2 BITS MORE FOR 6_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 2_,2 BITS_^1_%RTJ* GETFST_'GET MORE DATA_^1_%LLS 4_,4 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =€€0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%JMP* NXTCYC_'GO THRU ANOTHER CYCLE_^1*_]_^1*_]_^1GETFST NUM 0_^1_%STQ* QSAV_)SAVE Q_^1_%LDA- ELSTWD,I_^1_%SUB- ECCOR,I_%CHECK END OF BUFFER_^1_%SAN 2_^1_%ENA 0_^1_%JMP* (GETFST)_^1_%LDQ- ECCOR,I_%GET CURRENT LOCATION OF DATA_^1_%LDA- (ZERO),Q_$GET NEW DATA_^1_%LDQ- 0_^1QSAV_!NUM 0_^1_%RAO- ECCOR,I_%TALLY CURRENT ADDRESS_^1_%JMP*€€ (GETFST)_^1*_]_^1CURR_!NUM 0_^1_%EJT_]_^1* READ 7 TRACK DATA - PACK INTO USERS BUFFER_^1*_]_^1PACK2 NUM 0_,ENTRY FOR ASSEM/DISSASSEM TO BINARY._^1_%RTJ* SETUP_^1NXTGET RTJ* GETFWA_'GO GET FROM FWA BUFFER_^1_%CLR Q_^1_%LLS 8_,6 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%RTJ* GETFWA_'GET 12 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 4_,4 BITS_^1_%RTJ* STRFST_'GO STORE€€ IN REQUESTOR-S BUFFER_^1_%LLS 2_,2 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%RTJ* GETFWA_'GET 12 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%ALS 2_,PASS 2_^1_%LLS 2_,2 BITS_^1_%RTJ* STRFST_'GO STORE_^1_%LLS 4_,4 BITS_^1_%RTJ* GETFWA_'GET 12_^1_%ALS 2_,PASS 2_^1_%LLS 6_,6 BITS_^1_%ALS 2_,PASS 2_^1_%LLS 6_,6 BITS_^1_%RTJ* STRFST_'STORE_^1_%JMP* NXTGET€€_'NEXT CYCLE_^1*_]_^1*_]_^1GETFWA NUM 0_,ENTRY TO GET NEXT DATA FROM FWA_^1_%LDA* CURR_^1_%EOR LWA_^1_%SAN NOTCUR_^1_%JMP* (PACK2)_^1NOTCUR LDA* (CURR)_^1_%RAO* CURR_^1_%JMP* (GETFWA)_$RETURN_^1*_]_^1*_]_^1STRFST NUM 0_,STORE DATA IN Q INTO USER-S BUFFER_^1_%STA* QSAV1_^1_%TRQ A_,DATA INTO A_^1_%LDQ- ECCOR,I_%GET CORE LOCATION OF USER-S BUFFER_^1_%STA- (ZERO),Q_$STORE DATA_^1_€€%LDA- 0_,2 WORD INSTRUCTION_^1QSAV1 NUM 0_^1_%CLR Q_^1_%RAO- ECCOR,I_%TALLY STORAGE LOCATION_^1_%JMP* (STRFST)_^1_%EJT_]_^1BCDAS2 NUM 0_,BCD TO ASCII._^1_%RTJ* SETUP_^1_%RTJ* AQGET_^1_%RTJ BCD2A_(CONVERT_^1BCDLOP LDQ- ECCOR,I_%GET USER-S LOCATION_^1_%LDA* (CURR)_'GET DATA_^1_%STA- (ZERO),Q_$STORE IN USER_^1_%RAO- ECCOR,I_%TALLY USER_^1_%RAO* CURR_^1_%LDA* CURR_^1_%EOR LWA_*CH€€ECK FOR BUFFER COMPLETE_^1_%SAZ BCDAEX_^1_%JMP* BCDLOP_'MORE TO TRANSFER_^1BCDAEX JMP* (BCDAS2)_^1*_]_^1*_]_^1STRDAT NUM 0_^1_%STQ* (CURR)_'STORE UNPACKED DATA_^1_%TRA Q_,SAVE A_^1_%RAO* CURR_)TALLY INTERMEDIATE STORAGE LOCATION_^1_%LDA* CURR_^1_%EOR LWA_^1_%SAN CURNOT_'CURR NOT EQUAL LWA_^1_%JMP* (UNPK2)_^1CURNOT TRQ A_,RESTORE A_^1_%CLR Q_^1_%JMP* (STRDAT)_$EXIT STORE DATA€b SUBROUTINE_^1*_]_^1*_]_^1SETUP NUM 0_^1_%LDA FWA_^1_%STA* CURR_^1_%JMP* (SETUP)_^1_%END_]_^__ bPTK7 CSY/ C23 P€1_%NAM TK7_*DECK-ID C23 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT 7 TRACK ANCILLARY ROUTINES_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT 7 TRACK ROUTINES_^1*_8*********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$IMPLEMENT FUNCTIONS SPECIAL TO SEVEN €€TRACK DRIVES._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$IMPLEMENTS A SOFTWARE FILE MARK FUNCTION FOR 7 TRACK_^1*_$UNITS AND A SUBROUTINES TO DETERMINE 7 TRACK PARITY._^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$ONE WORD FROM THE PHYSTAB IS USED AS INPUT. IT IS_^1*_$ESTAT1 AND IS USED FOR PARITY TYPE TEST._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^€€1*_$SEVERAL WORDS FROM THE PHYSTAB ARE USED. THESE ARE_^1*_$ETEMP1, ADTFW, ADTLW, HAFWRD. ONE EXTERNAL LOCATION_^1*_$IS USED FOR STORAGE OF THE PARITY BIT._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$NORMAL SUBROUTINE ENTRY/EXIT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$CALL WRADT IN XFER TO WRITE THE FILE MARK._^1*_]_^1*_8ENTRY POINTS_^1*_8€€------------_^1*_]_^1_%ENT TK7RW_(7 TRACK READ/WRITE_^1_%ENT TK7WEF_'WRITE 7 TRACK END OF FILE_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* PRITYC_'PARITY STORAGE WORD_^1_%EXT* WRADT_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_€€^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1*_]_^1****_]_^1_%EJT_]_^1*_6*******_^1*_6* TK7 *_^1*_6*******_^1*_]_^1* SEVEN TRACK SPECIAL ROUTINES_^1*_]_^1* 7 TRACK READ/WRITE - DETERMINES PARITY_^1*_]_^1TK7RW NUM 0_^1_%LDA- ESTAT1,I_^1_%AND- ONEBIT+3_^1_%SAZ 1_^1_%LDA- ONEBIT+10_#BCD USE EVEN PARITY_^1€€_%JMP* (TK7RW)_^1*_]_^1* 7 TRACK WRITE OF END OF FILE ROUTINE_^1*_]_^1TK7WEF NUM 0_^1_%LDA- I_^1_%INA ETEMP1-1_$FORM FWA-1_^1_%STA- ADTFW,I_^1_%INA 1_,FORM LWA_^1_%STA- ADTLW,I_^1_%LDA =N$0F0F_%EOF CODE_^1_%STA- ETEMP1,I_^1_%LDA- ONEBIT+10_#EVEN PARITY_^1_%STA PRITYC_^1_%ENA $20_*HALF WORD WRITE_^1_%STA- HAFWRD,I_^1_%RTJ WRADT_(WRITE SOFTWARE FILEMARK_^1_%ENA 0_^1_%STA- HAF€&WRD,I_^1_%JMP* (TK7WEF)_^1_%END_]_^__ &PRECVRY CSY/ C24 P€1_%NAM RECVRY_'DECK-ID C24 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$LCTT ERROR RECOVERY ANCILLARY ROUTINES_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1****_]_^1*E_]_^1*_8LCTT RECOVERY ROUTINES_^1*_8**********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THIS PROGRAM WILL ATTEMPT€€ TO RECOVER DATA FROM A TAPE_^1*_$RECORD AFTER A DATA ERROR HAS OCCURRED. IT WILL ALSO BYPASS_^1*_$NOISE RECORDS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NONE_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1* READ RECOVERY_^1* -------------_^1* -€€------------_^1*_]_^1*_$NORMAL READ_^1*_$-----------_^1*_$1. SET M = 2 (NOISE RECOVERY RETRY COUNT._^1*_$2. IF NOISE GO TO STEP 3._^1*_(IF AN ERROR GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$NOISE RECOVERY_^1*_$--------------_^1*_$3. BACKSPACE._^1*_(SET M = M-1._^1*_(IF M = 0 GO TO STEP 5._^1*_$4. RECOVERY READ._^1*_(GO TO STEP 2._^1*_]_^1*_$BYPASS NOISE_^1*_$------------_^1*_$5. SET€€ M = 2._^1*_$6. ADVANCE RECORD._^1*_(READ RECORD._^1*_(IF FILE MARK, EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF ERROR GO TO STEP 7_^1*_*ELSE EXIT._^1*_]_^1*_$REREAD THE ERROR BLOCK_^1*_$----------------------_^1*_$7. SET N = 5 (REREAD COUNT)._^1*_(SET C = 5 (CLEANER COUNT)_^1*_$8. BACKSPACE._^1*_(READ RECORD._^1*_(IF FILE MARK DETECTED THEN EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._€€^1*_(IF AN ERROR OCCURRED GO TO STEP 9._^1*_*ELSE EXIT._^1*_$9. SET N = N-1._^1*_(IF N = 0 GO TO STEP 11._^1*_*ELSE GO TO STEP 8._^1*_#10. SET M = 2._^1*_(GO TO STEP 3._^1*_]_^1*_$REREAD IN OPPOSITE PARITY_^1*_$-------------------------_^1*_#11. IF 9 TRACK TAPE GO TO STEP 12._^1*_(BACKSPACE._^1*_(READ RECORD IN OPPOSITE PARITY._^1*_(IF FILE MARK DETECTED, DECLARE THE ERROR IRRECOVE€€RABLE._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR GO TO STEP 12._^1*_*ELSE DECLARE IRRECOVERABLE ERROR IN OPPOSITE PARITY._^1*_]_^1*_$POSITION TAPE PAST TAPE CLEANERS_^1*_$--------------------------------_^1*_#12. SET B = 1 (BACKSPACE COUNTER)._^1*_(SET C = C-1._^1*_#13. BACKSPACE._^1*_(IF BOT GO TO STEP 15._^1*_#14. SET B = B+1_^1*_(IF B = 5 GO TO STEP 15_^1*_*ELSE GO TO€€ STEP 13._^1*_(IF FILE MARK OR EOT DETECTED THEN EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF AN ERROR OCCURRED GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$CLEAN TAPE_^1*_$----------_^1*_#15. IF B = 3 GO TO STEP 17._^1*_(IF B = 2 GO TO STEP 18._^1*_#16. ADVANCE 1 RECORD._^1*_(SET B = B-1_^1*_(GO TO STEP 15._^1*_#17. ADVANCE 1 RECORD (IGNORE FILE MARKS AND DATA ERRORS)_^1*_#18. READ RECOR€€D._^1*_(IF FILE MARK DETECTED EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF ERROR OCCURRED GO TO STEP 8._^1*_(IF C = 0 DECLARE ERROR IRRECOVERABLE_^1*_*ELSE SET N = 5 AND GO TO STEP 8._^1*_]_^1*_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1* --------------_^1* --------------_^1*_]_^1*_$NORMAL WRITE_^1*_$------------_^1*_$1. SET N = 0 (ERASE COUNT)_^1*_$2. WRITE THE BLOCK._^1*_(IF AN E€€RROR GO TO STEP 3_^1*_*ELSE EXIT._^1*_]_^1*_$BACKUP TO LAST GOOD BLOCK_^1*_$-------------------------_^1*_$3. PERFORM A CONTROLLED BACKSPACE._^1*_]_^1*_$ERASE_^1*_$-----_^1*_$4. SET N = N+1._^1*_(IF N = 20 DECLARE ERROR IRRECOVERABLE._^1*_(SET M = N (M = ERASE COUNTER)_^1*_$5. ERASE_^1*_(IF END OF TAPE AND M>1 DECLARE ERROR IRRECOVERABLE._^1*_(IF AN ERASE ERROR DECLARE ERROR IRRECO€€VERABLE._^1*_$6. SET M = M-1_^1*_(IF M = 0 GO TO STEP 7_^1*_*ELSE GO TO STEP 5._^1*_]_^1*_$REWRITE THE BLOCK_^1*_$-----------------_^1*_$7. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3._^1*_]_^1*_$POSITION TAPE TO LAST GOOD BLOCK_^1*_$--------------------------------_^1*_$8. PERFORM CONTROLLED BACKSPACE._^1*_]_^1*_$READ THE BLOCK_^1*_$--------------_^1*_$9. READ_^1*_$10. IF NOISE€€ GO TO STEP 9._^1*_)IF AN ERROR GO TO STEP 13._^1*_+ELSE EXIT._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT RECVRY_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------------------_^1*_]_^1_%EXT* F1860_(FAULT ROUTINE_^1_%EXT* FWA_*CURRENT FIRST WORD ADDRESS_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1_%EQU A€€DTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU FLTCOD(16)_"16 FAULT CODE_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG_^1_%EQU NOISLN(2)_#MINIMUM RECORD SIZE_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU QSTWD4(36)_"36 WORD 4 €€OF REQUEST_^1_%EQU RCNTFG(33)_"33 RECOVERY COUNT FLAG_^1_%EQU RFLAG(34)_#34 RECOVERY FLAG_^1_%EQU RRETAD(31)_"31 RECOVERY RETURN ADDRESS_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU UNTMOD(24)_"24 UNIT MODE SELECT_^1_%EQU ZERO($22)_#LOW CORE CONSTANT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* RECVRY *_^1*_6**********€€_^1*_]_^1* LCTT RECOVERY ROUTINES_^1*_]_^1RECVRY NUM 0_^1_%RTJ* RECLOC_'DETERMINE RECOVERY ABSOLUTE_^1RECLOC NUM 0_,ADDRESS + 2_^1_%LDA- ELU,I_^1_%EOR- DIAGLU,I_$DIAGNOSTIC LOGICAL UNIT_^1_%SAN R01_*NO, CONTINUE_^1_%ENA 3_,YES, DO NOT ATTEMPT RECOVERY_^1R00_"JMP F1860_^1R01_"ENA 0_,CLEAR FAULT INDICATOR_^1_%STA* RFCOD_^1_%LDA- RFLAG,I_%IS RECOVERY ENABLED_^1_%SAP R05_*YES, S€€KIP_^1_%RTJ NOISRC_'NOISE RECORD ENCOUNTERED_^1_%JMP* R00-1_(NO,_^1_%ENA 1_,YES, SHORT RECORD FAULT_^1_%JMP* R00_^1R05_"LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND- ONEBIT+8_^1_%SAZ R10_*NO, SET FLAG AND SAVE PARAMETERS_^1_%LDQ- RRETAD,I_$YES, GO TO NEXT FUNCTION_^1_%JMP- (ZERO),Q_^1R10_"LDA- ESTAT1,I_$SET RECOVERY IN PROGRESS_^1_%AND- ZROBIT+8_^1_%ADD- ONEBIT+8_^1_%STA- ESTA€€T1,I_^1_%LDA- MFLG,I_'SAVE REQUEST PARAMETERS_^1_%STA* RMFLG_^1_%LDA- QSTWD4,I_^1_%STA* RQSTW4_^1_%LDA- ESTAT1,I_$READ OR WRITE_^1_%AND- ONEBIT+0_^1_%SAN RWRIT_^1_%JMP* RREAD_(READ OPERATION_^1_%EJT_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1RWRIT ENA 0_,CLEAR N COUNTER_^1_%STA* NCNT_^1RW05_!LDA- RFLAG,I_%SET CB FLAG_^1_%ADD- ONEBIT+3_^1_%STA- RFLAG,I_^1_%LDA =XRW10-RECLOC SETUP €€NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RW10_!LDA- SINTER,I_$CONTROLLED BACKSPACE ERROR_^1_%AND =N$1E55_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%RAO* NCNT_)UPDATE COUNTER_^1_%LDQ =N$6000_%ERASE_^1_%LDA =XRW20-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW20_!LDA- SINTER,I_$ERASE ERROR OR EOT_^1_%AND =N$9F51_^1_%SA€€Z 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA* NCNT_)MAXIMUM NUMBER OF ERASURES_^1_%SUB =N20_^1_%SAM 1_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA =XRW30-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE A RE-WRITE_^1*_]_^1RW30_!LDA- SINTER,I_$RE-WRITE ERROR_^1_%AND =N$2C00_^1_%SAZ 1_^1_%JMP* RW05_)YES, DO ANOTHER BACKSPACE,ERASE_^1_%JMP* RDONE_(NO, RECOVERED_^1_%EJT_]_€€^1*_]_^1*_]_^1* SUBROUTINE / STORAGE_^1*_]_^1RFAULT LDA- SINTER,I_$ALARM TYPE ERROR_^1_%AND =N$124F_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 2_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%LDA- SINTER,I_^1_%AND =N$2C00_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 3_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%ENA 41_+MAXIMUM ATTEMPTS REACHED_^1RFXIT STA* RFCOD_(SAVE FAULT CODE_^1_%LDA- ESTAT2,I_$SET IRRECOVERABLE ER€€ROR BIT_^1_%AND- ZROBIT+3_^1_%ADD- ONEBIT+3_^1_%STA- ESTAT2,I_^1_%JMP* RDONX_^1RDONE LDA- RFLAG,I_%SET RECOVERED ERROR FLAG_^1_%AND- ZROBIT+1_^1_%ADD- ONEBIT+1_^1_%STA- RFLAG,I_^1_%LDA- ESTAT2,I_$SET RECOVERED BIT IN STATUS_^1_%AND- ZROBIT+2_^1_%ADD- ONEBIT+2_^1_%STA- ESTAT2,I_^1_%RAO- RCNTFG,I_$INDEX RECOVERY COUNT_^1RDONX RAO* RECVRY_'EXIT+2 NO RECOVERY OR IRRECOVERABLE_^1_%LDA€€- ESTAT1,I_$CLEAR FLAGS_^1_%AND- ZROBIT+5_$CLEAR MOTION IF SET_^1_%AND- ZROBIT+8_$CLEAR RECOVERY FLAG IF SET_^1_%STA- ESTAT1,I_^1_%LDA* RMFLG_(RESTORE PDT PARAMETERS_^1_%STA- MFLG,I_^1_%LDA* RQSTW4_^1_%STA- QSTWD4,I_^1_%LDA* RFCOD_(ERROR COMPLETION_^1_%SAZ REXIT_(NO_^1_%JMP F1860_(YES, GO TO FAULT ROUTINE_^1REXIT JMP* (RECVRY)_^1*_]_^1RMFLG NUM 0_^1RQSTW4 NUM 0_^1MCNT_!NUM 0€€_^1NCNT_!NUM 0_,ERASE COUNTER_^1RFCOD NUM 0_,FAULT/CODE FLAG_^1_%EJT_]_^1*_]_^1*_]_^1* READ RECOVERY_^1*_]_^1RREAD ENA 2_^1_%STA* MCNT_^1RD01_!RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD05_)NO, CHECK IF ERROR_^1RD03_!LDA* MCNT_)DECREMENT READ LOGIC_^1_%INA -1_^1_%STA* MCNT_^1_%LDA =XRD20-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ- ONEBIT+12_#BACKSPACE_^1_%JMP RECFUN_'EXECUTE FUNCTION€€_^1*_]_^1RD05_!LDA- SINTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%JMP* RDRERD_'YES, RE-READ_^1*_]_^1RD10_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND- ONEBIT+14_#FILE MARK READ_^1_%SAN 1_^1_%JMP* RD01_)NO, CHECK IF NOISE RECORD_^1_%JMP* RDONE_(YES, EXIT_^1*_]_^1RD20_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA* MCNT_)READ COUNTER ELAPSED_^1_%SAZ 1_^1_%JMP€€* RD25_)NO, DO RECOVERY READ_^1_%ENA 2_,YES, SKIP NOISE RECORD_^1_%STA* MCNT_^1_%LDA =XRD30-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1RD25_!LDA- RFLAG,I_^1_%AND- ZROBIT+4_^1_%ADD- ONEBIT+4_$SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD30_€€!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE READ_^1*_]_^1* RE-READ_]_^1*_]_^1RDRERD ENA 5_,RE-READ RECORD_^1_%STA CCNT_)SET CLEANER COUNT_^1_%STA* NCNT_)SET RE-TRY COUNT_^1RD35_!LDA =XRD40-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ- ONEBIT+12_#BACKSPACE FUNCTION_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD40_!RTJ CKFATE_'F€€ATAL ERROR CHECK_^1_%LDA- RFLAG,I_^1_%AND- ZROBIT+4_^1_%ADD- ONEBIT+4_$SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD50-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD50_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND- ONEBIT+14_#TAPE MARK READ_^1_%SAZ 1_^1_%JMP* RDONE_(YES, DONE_^1_%RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD55_)NO_^1_%ENA 2_,RE-INIT COUNTER€€_^1_%STA* MCNT_^1_%JMP* RD03_)CHECK FURTHER_^1RD55_!LDA- SINTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%LDA* NCNT_)YES, N=N-1_^1_%INA -1_^1_%STA* NCNT_)N=0_^1_%SAZ 1_^1_%JMP* RD35_)NO, LOOP_^1_%LDA- UNTMOD,I_$YES, 9TK TRANSPORT_^1_%AND- ONEBIT+11_^1_%SAN RDOPR_^1_%JMP* RDCLN_^1*_]_^1* READ OPPOSITE POLARITY_^1*_]_^1RDOPR LDA =XRD60-RECLOC BACK€€SPACE FUNCTION_^1_%LDQ- ONEBIT+12_^1_%JMP* RECFUN_^1*_]_^1RD60_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA- RFLAG,I_%SET OPPOSITE PARITY FLAG_^1_%AND- ZROBIT+2_^1_%ADD- ONEBIT+2_^1_%STA- RFLAG,I_^1_%LDA =XRD70-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'READ IN OPPOSITE PARITY_^1*_]_^1RD70_!RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND- ONEBIT+14_^1_%SAZ 2_,FILE MARK_^1_%JMP RFAULT_'YE€€S, IRRECOVERABLR_^1_%RTJ* NOISRC_'NOISE RECORD_^1_%JMP* RD75_)NO_^1_%JMP RREAD_(YES, LOOP_^1RD75_!LDA- SINTER,I_^1_%AND =N$2C00_%READ ERROR_^1_%SAN 2_^1_%JMP RFAULT_'IRRECOVERABLE ERROR_^1_%JMP* RDCLN_(CLEAN TAPE_^1_%EJT_]_^1*_]_^1* CLEAN TAPE_^1*_]_^1RDCLN LDA* CCNT_)CLEAN TAPE_^1_%INA -1_+DECREMENT CLEAN COUNTER_^1_%STA* CCNT_^1_%ENA 1_^1_%STA* BCNT_)INIT BACKSPACE COUNTER€€_^1RD95_!LDA =XRD100-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ- ONEBIT+12_#BACKSPACE_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD100 LDA- SINTER,I_^1_%AND =N$1041_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%RAO* BCNT_)NO, UPDATE BACKUP COUNT_^1_%LDA- SINTER,I_^1_%AND- ONEBIT+9_$TIMED OUT (BOT)_^1_%SAN RD110+1_^1_%LDA* BCNT_^1_%INA -5_+COUNT = 5_^1_%SAZ RD110+1_^1_%JMP* RD€€95_)NO, LOOP_^1RD110 RTJ* CKFATE_^1_%LDA* BCNT_)YES, COUNT = 3_^1_%INA -3_^1_%SAN RD124_^1_%LDA =XRD120-RECLOC YES, ADVANCE RECORD_^1_%LDQ =N$7000_^1_%JMP* RECFUN_^1*_]_^1RD120 RTJ* CKFATE_'FATAL ERROR CHECK_^1RD122 LDA =XRD130-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'EXECUTE READ FUNCTION_^1*_]_^1RD124 INA 1_,BACK COUNT = 2_^1_%SAN 1_^1_%JMP* RD122_(YES, EXECUTE €€READ_^1_%LDA* BCNT_)DECREMENT B COUNTER_^1_%INA -1_^1_%STA* BCNT_^1_%LDA =XRD110-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD130 RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND- ONEBIT+14_#FILE MARK_^1_%SAZ 2_^1_%JMP RDONE_(YES, DONE_^1_%RTJ* NOISRC_'NO, NOISE RECORD_^1_%JMP* RD132_(NO_^1_%ENA 2_,YES, SET M = 2_^1_%STA M€€CNT_^1_%JMP RD03_)RE-READ_^1RD132 LDA- SINTER,I_$READ ERROR_^1_%AND =N$2C00_^1_%SAN 2_^1_%JMP RDONE_(YES, DONE_^1_%LDA* CCNT_)NO, DOES C = 0_^1_%SAN 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE ERROR_^1_%ENA 5_,RESTORE N COUNTER_^1_%JMP RD35-1_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINES / STORAGE_^1*_]_^1RECFUN ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$STORE NEXT RET€€URN ENTRY_^1_%STQ- QSTWD4,I_$SAVE FUNCTION_^1_%ENA 0_^1RECFX STA- MFLG,I_'SET FLAG FOR MOTION REQUEST_^1_%JMP REXIT_^1*_]_^1*_]_^1RECRWF ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$SET UP FOR NEXT RETURN_^1_%LDA RQSTW4_'RESTORE WORD COUNT_^1_%STA- QSTWD4,I_^1_%ENA 1_,SET FLAG FOR R/W REQUEST_^1_%JMP* RECFX_^1*_]_^1*_]_^1NOISRC NUM 0_^1_%LDA- ADTFW,I_%FWA - S€€TART ADDRESS_^1_%SUB FWA_^1_%INA -NOISLN_%- NOISE RECORD SIZE_^1_%SAP NOISEX_^1_%LDA- RFLAG,I_%SET NOISE RECORD FLAG_^1_%AND- ZROBIT+0_^1_%ADD- ONEBIT+0_^1_%STA- RFLAG,I_^1_%LDA- ESTAT2,I_^1_%AND- ZROBIT+7_$SET NOISE IGNORED IN STATUS_^1_%ADD- ONEBIT+7_^1_%STA- ESTAT2,I_^1_%ENA 15_^1_%STA- FLTCOD,I_$PRIME FAULT CODE_^1_%RAO* NOISRC_'YES, NOISE REOCRD_^1NOISEX JMP* (NOISRC)_^1*_€]_^1*_]_^1CKFATE NUM 0_^1_%LDA- SINTER,I_^1_%AND =N$1241_%DID FATAL ERROR OCCUR_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%LDA- SINTER,I_$EXIT WITH STATUS IN A_^1_%JMP* (CKFATE)_$NO, RETURN_^1*_]_^1BCNT_!NUM 0_,BACKSPACE COUNTER_^1CCNT_!NUM 0_,CLEANER COUNT_^1_%END_]_^__ PD1810 CSY/ C25 P€1_%NAM D1810_(DECK-ID C25 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$1810-1 CONVERSATIONAL DISPLAY TERMINAL DRIVER_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*P1810 ADC $520D_(00 SCHEDULER CALL_^1*_%ADC I1810_(01 INITIATOR ADDRESS_^1*_%ADC C1810_(02 CONTINUATOR ADDRESS_^1*_%ADC €€ E1810_(03 TIMEOUT ERROR ADDRESS_^1*_%NUM -1_+04 DIAGNOSTIC CLOCK_^1*_%NUM 0_,05 LOGICAL UNIT_^1*_%NUM 0_,06 PARAMETER LOCATION_^1*_%NUM $0091_(07 CONVERTER, EQUIPMENT, STATION_^1*_%ADC $3006+T1810_!08 REQUEST STATUS_^1*_%NUM 0_,09 DRIVER STATUS_^1*_%NUM 0_,10 CURRENT LOCATION_^1*_%NUM 0_,11 LAST LOCATION PLUS ONE_^1*_%NUM 0_,12 DEVICE STATUS_^1*_%NUM 0_,13 ERR€€OR CODE AND STARTING LOCATION_^1*_%NUM $7FFF_(14 RESERVED_^1*_%NUM 0_,15 RESERVED FOR FNR AND CMR_^1*_%NUM 0_,16 DRIVER FLAGS_^1*_%NUM 1_,17 HARDWARE PARITY CHECK FLAG_^1*_%ADC U1810_(18 DIAGNOSTIC LU_^1 SPC 1_]_^1_%ENT I1810,C1810,E1810_^1_(EXT_%ALTDEV_^1_(EXT_%MAKEQ_^1_%EXT MI_^1_%EXT LOG_*ERROR LOGGING ENTRY_.**MSOS 4.1**_^1_%EXT RQAQ_)REQUEST A/Q ALLOCATOR_181*20€€63_^1_%EXT RLAQ_)RELEASE A/Q ALLOCATOR_181*2063_^1_%SPC 2_^1***_"PHYSICAL DEVICE TABLE WORDS_^1_%SPC 2_^1_%EQU TIME(4)_"DIAG. CLOCK TIME_^1_%EQU LU(5)_$LOGICAL UNIT_^1_%EQU REQAD(6)_!REQUES ADDRESS_^1_%EQU CALL(7)_"HARDWARE ADDRESS_^1_%EQU ERRTAB(8) REQUEST STATUS_^1_%EQU SWITCH(9) SWITCH WORD_^1_%EQU CORE(10)_!CORE ADDRESS_^1_%EQU LASTP1(11) LAST CORE LOCATION + 1_^1_€€%EQU STATUS(12) HARDWARE STATUS_^1_%EQU ERRCOD(13) ERROR CODE (THIS DRIVER NEVER MASS MEM.)_^1_%EQU COREIN(13)_^1_%EQU TEMP(15)_!TEMP STORAGE_^1_%EQU FLAG(16)_^1_%EQU TMPWRD(11)_^1_%EQU PARFLG(17)_"#0=HARDWARE PARITY CHECK_.MSOS4.1_^1_%EQU DIAGLU(18)_"DIAGNOSTIC LU_4**MSOS 4.1**_^1_%SPC 2_^1***_"ERROR CODES_^1_%SPC 2_^1_%EQU TIMERR(0) TIME OUT ERROR_^1_%EQU LOSDAT(1) €€LOST DATA_^1_%EQU ALARM(2)_!ALARM_^1_%EQU PARERR(3) PARITY ERROR_^1_%EQU INTREJ(5) INTERNAL REJECT_6*MSOS V4.0_^1_%EQU EXTREJ(6) EXTERNAL REJECT_6*MSOS V4.0_^1_%EJT_]_^1***_"MASKS_^1_%SPC 2_^1_%EQU XFF00($1A)_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_H*MSOS V4.0_^1_%EQU SWMASK($4)_"MASK TO RESET SWITCH WORD_-MP MSOS_^1_%EQU TFORM(12)_G*MSOS V4.0_^1_%EQU H003F(8)_H*MSOS V4.0_€€^1_%EQU HFFF0($16)_^1_%EQU BIT2($25)_G*MSOS V4.0_^1_%EQU BIT3($26)_G*MSOS V4.0_^1_%EQU BIT7($2A)_KMSOS4.1_^1_%EQU B5A3($28)_^1_%EQU RLSRSV($2B)_!RELEASE RESERVE STATUS MASK_+MP MSOS_^1_%EQU RDMODE($2C)_!READ MODE STATUS MASK_1MP MSOS_^1_%EQU RSRVD($2D)_"RESERVED (PANEL MODE) STATUS_*MP MSOS_^1_%EQU BIT9($2C)_^1_%EQU BIT11($2E)_^1_%EQU BIT14($31)_^1_%EQU BIT15($21)_^1_%S€€PC 1_^1***_"TIME OUT VALUES ARE IN SECONDS_^1_%SPC 1_^1_%EQU INPVAL(60) KEYBOARD INPUT TIMEOUT PERIOD_^1_%EQU OUTVAL(2) KEYBOARD OUTPUT TIMEOUT PERIOD_^1_%SPC 1_^1_%EQU AFNR($B5)_"FIND NEXT REQUEST_^1_%EQU ACOMPR($B6) COMPLETE REQUEST_^1_%EQU DISPAD($EA) DISPATCHER_^1_%EJT_]_^1E1810 STQ- I_,DIAGNOSTIC TIMER ERROR ENTRY_^1_%RTJ* CHKRSV_'CHECK IF PANEL MODE, RETURN..._(MP€€ MSOS_^1_%JMP* TMOUT_(HERE IF NOT IN PANEL MODE_-MP MSOS_^1_%JMP- (DISPAD)_$RETURN HERE IF SO-RESTART LATER_'MP MSOS_^1*_9AT RELEASE RESERVE INTERRUPT_)MP MSOS_^1TMOUT ENA TIMERR_(GOT LEGITIMATE TIMEOUT_0MP MSOS_^1_%JMP* SETCDE_^1_%SPC 2_^1CHKRSV NOP 0_,ENTRY FOR SUBROUTINE_2MP MSOS_^1_%RTJ* GETSTS_'GET DEVICE STATUS IN 'A'_.MP MSOS_^1_%AND- RSRVD_(CHECK IF RESERVED BIT ON_.MP €€MSOS_^1_%SAZ CKOUT_(SKIP IF NOT ON_8MP MSOS_^1_%RAO* CHKRSV_'IS ON, RETURN +1_6MP MSOS_^1CKOUT JMP* (CHKRSV)_$RETURN_@MP MSOS_^1_%SPC 2_SMP MSOS_^1GETSTS NOP 0_,ENTRY FOR SUBROUTINE_2MP MSOS_^1_%LDQ- CALL,I_'GET THE DEVICE_8MP MSOS_^1_%INP 1_,STATUS AND_83*2129_^1_%RTJ RQAQ_)REQUEST A/Q ALLOCATION_083*2129_^1_%STQ- I_S83*2129_^1_%LDQ- CALL,I_N83*2129_^1_%ENA 0_,RESET FLAG_<83*2129_^1_%STA- FLAG,I_N83*2129_^1_%LDA- (I)_*PICKUP SCHEDULER CALL FROM PHYSTB_$83*2129_^1_%STA* SCHCAL_'MAKE UP SCHEDULER CALL_^1_%RTJ- ($€€F4)_(SCHEDULE MI_^1SCHCAL NUM $1200_^1_%ADC MI_^1_%ENA B5A3_^1_%AND- STATUS,I_!CHECK FOR DATA OR ALARM_^1_%SAN JNOMAN_#SKIP IF DATA OR ALARM_^1_%ENA 6_)CLEAR INT - SELECT INT ON DATA_^1_%OUT ERROR-*_^1RELXIT RTJ RLAQ_)RELEASE A/Q_;87*2129_^1_%JMP- (DISPAD)_$EXIT_B83*2129_^1JNOMAN JMP* NOMAN_^1TOCLRO JMP* CLROUT_'CLEAR DEVICE AND EXIT_1MP MSOS_^1_%SPC 2_^1ERROR JMP* INTRNL_€€J*MSOS V4.0_^1_%ENA EXTREJ_#EXTERNAL REJECT 6_4*MSOS V4.0_^1SETCDE JMP* SETCOD_^1INTRNL ENA INTREJ_#INTERNAL REJECT 5_4*MSOS V4.0_^1SETCOD_!LDQ-_$LU,I_^1_(QLS_%6_^1_(EAQ_%A_^1_(STA-_$ERRCOD,I_^1_(LDA-_$BIT14_^1_(EOR-_$ERRTAB,I_^1_(STA-_$ERRTAB,I_^1_%RTJ* CLEAR_(CLEAR DEVICE_^1_%LDA- LU,I_^1_%SAN 1_,EXIT IF NOT ASSIGNED_^1_%JMP- (DISPAD)_^1_%RTJ MAKEQ_^1_(ENA_%-1_^1_(STA-_$TIME,€€I_.CLEAR TIME_^1_%RTJ+ RLAQ_)RELEASE A/Q ALLOCATION_081*2063_^1_%STQ- I_,RESTORE PDT POINTER_381*2063_^1_(LDQ-_$ERRCOD,I_^1_%LDA- LU,I_)DO NOT REPORT ERROR_.**MSOS 4.1**_^1_%SUB- DIAGLU,I_$ON DIAGNOSTIC LU_1**MSOS 4.1**_^1_%SAN LOGIT_J**MSOS 4.1**_^1_%JMP* COMPRQ_I**MSOS 4.1**_^1LOGIT RTJ+ LOG_*LOG ERROR IN EF_2**MSOS 4.1**_^1_(JMP+_$ALTDEV_^1NOMAN RTJ CHKRSV_'CHECK IF IN PANEL€€ MODE_0MP MSOS_^1_%JMP* CKRLS_(RETURN HERE IF NOT_4MP MSOS_^1_%ENA -1_RMP MSOS_^1_%STA- TIME,I_'RESET TIMER VALUE_5MP MSOS_^1SETALM ENA $12_*RETURN HERE IF SO-_^1_%LDQ- CALL,I_'CLEAR INTERRUPTS EXCEPT ALARM_^1_%OUT 1_,BUT NOT CONTROLLER_4MP MSOS_^1_%NOP 0_SMP MSOS_^1_%JMP- (DISPAD)_$EXIT-RESTART AT RELEASE RESERVE INTRPT MP MSOS_^1_%SPC 1_SMP MSOS_^1CKRLS LDA- STATUS,I_$GET D€€EVICE STATUS_5MP MSOS_^1_%AND- RLSRSV_'CHECK IF RELEASE RSV INTERRUPT_(MP MSOS_^1_%SAZ NOTRLS_'NO,SKIP_?MP MSOS_^1_%ENA 2_,CLEAR INTERRUPTS_6MP MSOS_^1_%LDQ- CALL,I_'BUT NOT CONTROLLER_4MP MSOS_^1_%OUT 1_,IN ORDER TO CLEAR THE_1MP MSOS_^1_%NOP 0_,RELEASE RESERVE INTERRUPT_-MP MSOS_^1_%LDA- LU,I_)CHECK IF A REQUEST IN PROGRESS_(MP MSOS_^1_%SAN SRTAGN_'SKIP TO RESTART IT_4MP MSO€€S_^1_%JMP FNR_*NONE IN PROG-GO GET ONE_/MP MSOS_^1SRTAGN LDA- COREIN,I_$GET BUFFER START ADDRESS_.MP MSOS_^1_%STA- CORE,I_'AND RESTORE CURRENT LOCN_.MP MSOS_^1_%LDA- SWITCH,I_$GET SWITCH WORD_7MP MSOS_^1_%AND- SWMASK_'MASK OFF ALL BUT_6MP MSOS_^1_%STA- SWITCH,I_$ORIG SWITCH VALUES_4MP MSOS_^1_%JMP RESTRT_'RESTART THE REQUEST_3MP MSOS_^1_%SPC 1_SMP MSOS_^1NOTRLS LDA- LU,I_)CHECK €€IF REQ IN PROGRESS_.MP MSOS_^1_%SAN NOMAN1-*-1_^1CLROUT RTJ* CLEAR_(CLEAR AND EXIT_^1_%JMP* RELXIT_'RELEASE A/Q AND EXIT_283*2129_^1_%EJT_R*MSOS V4.0_^1NOMAN1 ENA $20_'ALARM BIT_<*MSOS V4.0_^1_%AND- STATUS,I_!CHECK FOR ALARM_6*MSOS V4.0_^1_%SAN ALRINT_#SKIP IF ALARM INTERRUPT_.*MSOS V4.0_^1_%LDA- SWITCH,I_!CHECK FOR MOTION REQUEST_-*MSOS V4.0_^1_%SAP CHKD-*-1_!SKIP IF NOT MOTIO€€N REQUEST_+*MSOS V4.0_^1_%JMP* MOTRTN_#MOTION REQUEST RETURN_0*MSOS V4.0_^1CHKD_!ENA 8_)DATA BIT_=*MSOS V4.0_^1_%AND- STATUS,I_!CHECK FOR DATA INTERRUPT_-*MSOS V4.0_^1_%SAZ DONE_)SKIP IF NOT_;83*2129_^1_%JMP* NOTDON_#PROCESS DATA INTERRUPT_/*MSOS V4.0_^1ALRINT ENA $40_'BIT 6_@*MSOS V4.0_^1_%AND- STATUS,I_!CHECK FOR LOST DATA_^1_%SAN A1_+SKIP IF LOST DATA_^1_%LDA- PARFLG,I_$CHEC€€K FOR HARDWARE PARITY CHECK_^1_%SAZ A0_+SKIP IF NOT_^1_%LDA- BIT7_P83*2468_^1_%AND- STATUS,I_$CHECK FOR PARITY ERROR_^1_%SAN A2_+SKIP IF PARITY ERROR_^1A0_#ENA ALARM_^1_%JMP* SETCOD_J*MSOS V4.0_^1A1_#ENA LOSDAT_#LOST DATA ERROR 1_4*MSOS V4.0_^1_%JMP* SETCOD_J*MSOS V4.0_^1A2_#ENA PARERR_'PARITY ERROR 3_^1_%JMP* SETCOD_^1*_83 CARDS DELETED_783*2129_^1DONE_#LDQ-_$CALL,I_.NO,CLEAR€€_^1_(ENA_%2_3INTERRUPTS_^1_(OUT_%ERROR-*_^1_(ENA_%-1_2CLEAR TIME_^1_(STA-_$TIME,I_^1_(INP_%ERROR-*_-SAVE STATUS_^1_(STA-_$STATUS,I_^1_%RTJ MAKEQ_^1COMPRQ RTJ- (ACOMPR)_$GO TO COMPLETE THE STATUS_(**MSOS 4.1**_^1_%RTJ+ RLAQ_)RELEASE A/Q ALLOCATION_081*2063_^1_%STQ- I_,RESTORE PDT POINTER_381*2063_^1_%JMP I1810+1_H**MSOS 4.1**_^1_%EJT_]_^1***_"PROCESS DATA INTERRUPT_^1_%SPC 2_^1NO€€TDON_!ENA_%1_^1_(AND-_$SWITCH,I_,OPERATION_^1_(SAZ_%1_^1_(JMP*_$AWRITE_.YES_^1_%LDA- RDMODE_'CHECK IF INTO READ YET_0MP MSOS_^1_(AND-_$STATUS,I_^1_%SAZ NFREAD_^1_%JMP READ_^1NFREAD_!LDQ-_$CALL,I_.CLEAR INT.AND_^1_(ENA_%2_3SET READ MODE_^1_(OUT_%ERROR-*_-SELECT INT.ON_^1_(LDA*_$B9A4A2_.DATA AND ALARM_^1_%JMP OUTOUT_^1B9A4A2 NUM $214_^1_%EJT_]_^1***_"PROCESS MOTION REQUEST_^1_%SP€€C 2_^1NXTMCR LDA- SWITCH,I_H*MSOS V4.0_^1_%EOR- BIT15_$CLEAR BIT 15 FROM_4*MSOS V4.0_^1_%STA- SWITCH,I_!PREVIOUS MOTION REQUEST_.*MSOS V4.0_^1MOTREQ LDA- TMPWRD,I_!GET PARAMETER STRING_1*MSOS V4.0_^1_%CLR Q_O*MSOS V4.0_^1_%LLS 4_)GET ONE PARA. FROM STRING_,*MSOS V4.0_^1_%SQZ TRMMCR_#SKIP IF ZERO PARA_4*MSOS V4.0_^1_%STA- TMPWRD,I_!SAVE REMAINDER OF STRING_-*MSOS V4.0_^1_%INQ -€€2_(IS IT WEOF_;*MSOS V4.0_^1_%SQZ TOPFRM_#SKIP IF WEOF_9*MSOS V4.0_^1_%INQ -2_(IS IT REWIND/UNLOAD_2*MSOS V4.0_^1_%SQZ TRMMCR_#SKIP IF YES_:*MSOS V4.0_^1_%JMP* MOTREQ_#GET NEXT PARAMETER_3*MSOS V4.0_^1TRMMCR JMP* DONE_L*MSOS V4.0_^1_%SPC 2_O*MSOS V4.0_^1***_"TOP OF FORM_J*MSOS V4.0_^1_%SPC 1_^1TOPFRM LDA- SWITCH,I_H*MSOS V4.0_^1_%AND- H003F_$SAVE LOWER SWITCHS_3*MSOS V4.0_^1_%€€EOR =N$81C0_"SET BIT 15 AND NULL COUNT FOR 7_%*MSOS V4.0_^1_%STA- SWITCH,I_!INTO SWITCH_:*MSOS V4.0_^1_%ENA TFORM_$ASCII TOP OF FORM (0C)_/*MSOS V4.0_^1_%JMP* TOSND_$OUTPUT TOP OF FORM_3*MSOS V4.0_^1_%EJT_]_^1AWRITE_!ENA_%2_3FORMATTED_^1_(AND-_$SWITCH,I_^1_%TRA Q_,Q = 0 IF UNFORMATTED_^1_(ENA_%$10_11ST CHAR._^1_(AND-_$SWITCH,I_^1_(SAN_%NOT1ST-*-1_^1_(ENA_%$10_1YES,CLEAR 1ST_^1_%€€SQN 1_,SKIP IF FORMATTED_^1_%ENA $30_*RESET LINE FEED FLAGIF UNFORMATTED_^1_(EOR-_$SWITCH,I_,CHAR.SWITCH_^1_(STA-_$SWITCH,I_,SEND OUT A_^1_%SQZ NOT1ST-*-1_"CONTINUE IF UNFORMATTED_^1_%ENA $A_+LINE-FEED CHARACTER_^1TOSND JMP SENDCH_#RETURN_^1NOT1ST SQZ NOCONT-*-1_"SKIP IF UNFORMATTED_/58*1183_^1_%ENA $20_M58*1183_^1_(AND-_$SWITCH,I_,SET_^1_(SAN_%NOCONT-*-1_^1_%LDA* BIT6A7_'D€€ISPLAY9_^1_%INA $20_*TTY._?*MSOS V4.1_^1_(EOR-_$SWITCH,I_,AND SEND OUT_^1_(STA-_$SWITCH,I_,A LINE FEED_^1_%AND* BIT6A7_^1_%TRA Q_^1_%ENA $D_+CARRIAGE RETURN_^1_%SQN 1_^1_(ENA_%$A_^1_%JMP* TOSND_$TO SENDCH_^1_%SPC 2_^1***_"RETURN FROM TOP OF FORM_^1_%EQU MOTRTN(*)_G*MSOS V4.0_^1_%SPC 2_^1NOCONT_!LDA-_$SWITCH,I_,ANY CANCELS_^1_(AND*_$BIT6A7_.TO BE SENT_^1_(SAZ_%NOSPCC-*-1_^1_(€€LDA-_$SWITCH,I_,DECREMENT_^1_(INA_%-$40_0CANCEL COUNT_^1_(STA-_$SWITCH,I_^1_%CLR A_^1_%JMP SENDCH_'GO OUTPUT CHARACTER_^1NOSPCC LDA- SWITCH,I_H*MSOS V4.0_^1_%SAP 1_)SKIP IF NOT MOTION_3*MSOS V4.0_^1_%JMP* NXTMCR_#GET NEXT PARAMETER_3*MSOS V4.0_^1_%AND- BIT3_%CHECK COMPLETION SWITCH BIT_**MSOS V4.0_^1_(SAZ_%1_^1_(JMP*_$DONE_0YES,FINISHED_^1_(LDQ-_$CORE,I_.NO,PICK UP_^1_(LDQ-_$(ZE€€RO),Q_,DATA WORD_^1_(ENA_%4_3UPPER CHAR._^1_(AND-_$SWITCH,I_^1_(SAN_%LOWER-*-1_^1_(QRS_%8_3YES,SHIFT_^1LOWER_"ENA_%$7F_1NO,CLEAR_^1_(LAQ_%A,Q_1UPPER CHAR._^1_%INA -3_+IS IT AN E.O.T._^1_%SAN NOTEOT_'NO_^1_%JMP* DONE_)YES, FINISHED_^1NOTEOT TRQ A_^1_(SAN_%NOTNUL-*-1_*NULL_^1_(ENA_%$7F_1YES,SUBSTITUTE_^1_(ENQ_%$7F_1CANCEL_^1NOTNUL_!INA_%-$D_1CARRIAGE RET._^1_(SAN_%NOTCR-*-1_^1_%LD€€A* BIT1D0_^1_(JMP*_$GOTCR_/CONTROL_^1NOTCR_"INA_%1_3NO,FORM OUT_^1_(SAZ_%GOTTAB-*-1_^1_(INA_%1_3NO,VERTICAL_^1_(SAZ_%GOTTAB-*-1_*TAB_^1_(INA_%2_3NO,HORIZONTAL_^1_(SAN_%NOCR-*-1_,TAB_^1GOTTAB_!LDA*_$BIT6A7_.YES,MODIFY_^1GOTCR_"EOR-_$SWITCH,I_,SWITCH_^1_(STA-_$SWITCH,I_^1NOCR_#TRQ_%A_3OUTPUT_^1_%INA -$7F_)TEST FOR RUBOUT_790*2884_^1_%SAN NOCR1_(SKIP IF NOT A RUBOUT CHARACTER_(90*28€€84_^1_%RAO* ROFLAG_'SET RUBOUT PRESENT FLAG_/90*2884_^1_%JMP* RUBOUT_'DON'T OUTPUT A RUBOUT_190*2884_^1NOCR1 ENA 0_,RESET RUBOUT PRESENT FLAG_-90*2884_^1_%STA* ROFLAG_N90*2884_^1_%TRQ A_,RESTORE ORIGINAL CHARACTER_,90*2884_^1_%LDQ- CALL,I_N90*2884_^1_(INQ_%-1_2CHARACTER_^1_(OUT_%TOEROR-*_^1RUBOUT LDA- CORE,I_'LAST WORD_=90*2884_^1_(SUB-_$LASTP1,I_^1_(SAZ_%COMPLT-*-1_^1_(ENA_%4_3€€NO,REVERSE_^1_(EOR-_$SWITCH,I_,UPPER LOWER_^1_(STA-_$SWITCH,I_,SWITCH_^1_%AND- BIT2_(NOW SET FOR_^1_%SAN GOGODI_%UPPER_^1_(RAO-_$CORE,I_.YES,INCREMENT_^1_(LDA-_$CORE,I_.CORE LOCATION_^1_(SUB-_$LASTP1,I_,NOW LAST_^1_(SAN_%GOGODI-*-1_*NO_^1COMPLT_!ENA_%8_3YES,SET_^1_(EOR-_$SWITCH,I_,COMPLETEO BIT_^1_(STA-_$SWITCH,I_,AND EXIT_^1_%JMP* GOGODO_N90*2884_^1GOGODI LDA* ROFLAG_'RUBOUT PRES€€ENT FLAG SET_/90*2884_^1_%SAZ GOGODO_'NO_D90*2884_^1_%JMP C1810+1_%YES, GO GET THE NEXT CHARACTER_(90*2884_^1GOGODO JMP EXIT_P90*2884_^1ROFLAG NUM 0_,RUBOUT FLAG PRESENT_390*2884_^1BIT6A7 NUM $3C0_^1BIT1D0 NUM $1D0_^1READ_#INQ_%-1_2INPUT A CHAR_^1_(ENA_%0_^1_(INP_%TOEROR-*_^1_%STA- TEMP,I_^1_%LDA- PARFLG,I_^1_%SAN NOPAR_(SKIP IF HARDWARE PARITY CHECK_^1_%LDA- TEMP,I_^1_(SPA-€€_$TEMP,I_^1_(SAN_%NOPAR-*-1_+PARITY OK_^1_%ENA PARERR_#PARITY ERROR 3_7*MSOS V4.0_^1_%JMP SETCOD_J*MSOS V4.0_^1TOEROR JMP* TR5_M*MSOS V4.0_^1_%JMP ERROR+1_"EXTERNAL REJECT_6*MSOS V4.0_^1TR5_"JMP ERROR_$INTERNAL REJECT_6*MSOS V4.0_^1NOPAR_"ENA_%$7F_1YES,STRIP_^1_(AND-_$TEMP,I_.PARITY BIT_^1_(TRA_%Q_^1_(ENA_%2_3FORMATTED_^1_(AND-_$SWITCH,I_^1_(SAZ_%ZIFORM-*-1_^1_(TRQ_%A_3YES,_^1_€€(INA_%-$A_1LINE FEED_^1_(SAZ_%PASSIT-*-1_*YES,IGNORE IT_^1_(INA_%-3_2NO,CARRIAGE_^1_(SAN_%1_3RETURN_^1_(JMP*_$CARRET_.YES_^1_(INA_%-$72_0NO,CANCEL_^1_(SAN_%1_^1_(JMP*_$CANCEL_.YES_^1_(ENA_%$10_1NO,PASS SWITCH_^1_(AND-_$SWITCH,I_,SET_^1_(SAZ_%1_^1PASSIT_!JMP*_$TGODIS_.YES,EXIT_^1ZIFORM TRQ A_O*MSOS V4.1_^1_%INA -$61_)LOWER CASE A_6*MSOS V4.1_^1_%SAM ZIFORN_'SKIP IF LESS THAN LOWE€€R CASE A._"*MSOS V4.1_^1_%INA -$1A_)CHECK RANGE TO LOWER CASE Z._%*MSOS V4.1_^1_%SAP ZIFORN_'SKIP IF ABOVE LOWER CASE CHARACTERS*MSOS V4.1_^1_%INQ -$20_)DROP LOWER CASE BIT._.*MSOS V4.1_^1ZIFORN ENA 4_,CHECK IF UPPER CHARACTER._)*MSOS V4.1_^1_(AND-_$SWITCH,I_^1_(SAN_%LOWLOW-*-1_^1_(ENA_%-0_2YES_^1_(LLS_%24_^1_(JMP*_$TOSTO_^1LOWLOW_!TRQ_%A_3NO_^1_(EOR-_$XFF00_^1_(LDQ-_$CORE,I_^1€€_(AND-_$(ZERO),Q_^1TOSTO_"LDQ-_$CORE,I_^1_(STA-_$(ZERO),Q_^1_(LDA-_$CORE,I_.LAST LOC_^1_(SUB-_$LASTP1,I_^1_(SAZ_%TGETOU-*-1_*YES,GETOUT_^1_(ENA_%4_-+NO,REVERSE_^1_(EOR-_$SWITCH,I_,UPPER-LOWER_^1_(STA-_$SWITCH,I_,SWITCH_^1_%AND- BIT2_%CHECK IF UPPER_7*MSOS V4.0_^1_%SAN TGODIS_#SKIP IF UPPER_8*MSOS V4.0_^1_.RAO-_$CORE,I_.YES,INCREMENT_^1_(LDA-_$CORE,I_.CORE LOCATION_^1_(SUB-_$LASTP1€€,I_,NOW LAST_^1_(SAZ_%NGODIS-*-1_^1TGODIS JMP* GOGODI_#TO EXIT_>*MSOS V4.0_^1NGODIS_!ENA_%2_^1_(AND-_$SWITCH,I_^1_(SAN_%NOG-*-1_^1TGETOU_!ENA_%8_3SELECT EOT_^1_(LDQ-_$CALL,I_.INTERRUPT_^1_(OUT_%TOEROR-*_^1*_81 CARD DELETED_883*2129_^1_%JMP* GOGODI_#TO EXIT_>*MSOS V4.0_^1_%ADC INPVAL_^1NOG_$ENA_%$10_1TURN ON PASS_^1_(EOR-_$SWITCH,I_,SWITCH_^1_(STA-_$SWITCH,I_^1_(JMP*_$TGODIS_^1CARR€€ET_!ENA_%$20_1CANCEL SWITCH_^1_(AND-_$SWITCH,I_,SET_^1_(SAN_%1_^1_(JMP*_$TGETOU_.NO_^1_(ENA_%-$34_0YES,CLEAR PASS_^1_(AND-_$SWITCH,I_,CANCEL AND_^1_(STA-_$SWITCH,I_,LOWER_^1_(LDQ-_$COREIN,I_,INITIALIZE_^1_(STQ-_$CORE,I_.CORE LOCATION_^1MORUB_"SET_%A_3TO ALL ONES_^1_(STA-_$(ZERO),Q_^1MORUB0 EQU MORUB0(*)_K93*2925_^1_(LDA-_$LASTP1,I_^1*_8PSR 89*2925 DELETED_391*2925_^1_(EAQ_%A_^1_%S€:AZ MORUB1_'SKIP IF ALL DATA ERASED_/93*2925_^1_%SET A_S93*2925_^1_%STA- (ZERO),Q_L93*2925_^1_%INQ 1_S93*2925_^1_%JMP* MORUB0_N93*2925_^1MORUB1 EQU MORUB1(*)_^1_(JMP*_$TGODIS_^1CANCEL_!ENA_%-$30_0CANCEL-SET_^1_(AND-_$SWITCH,I_,PASS AND_^1_(INA_%$30_1CANCEL SWITCH_^1_(STA-_$SWITCH,I_^1_(JMP*_$TGODIS_^1_(END_^__:PQ1810 CSY/ C28 P€1_%NAM Q1810_(DECK-ID C28 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$1810-1 DISPLAY TERMINAL INITIALIZER DRIVER_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1_%ENT QCOM_)BASIC ENTRY_6**MSOS 4.1**_^1_%ENT TTYOUT_^1_%ENT TELOUT_^1_%ENT ECOM_)EQUIPMENT CODE_3**MSOS 4.1**_^1_%SPC 2_^1_%EXT* CO€€,TABLE_^1_%EXT* BACKGR_^1_%SPC 2_^1*_82 CARDS DELETED_793*2972_^1_%SPC 2_^1**************************************************************MSOS 4.1**_^1*_$ERROR EXIT CONDITIONS_?**MSOS 4.1**_^1*_*(A) = 0_H**MSOS 4.1**_^1*_*(Q) = ERROR CODE_?**MSOS 4.1**_^1*_13= INPUT PARITY ERROR_3**MSOS 4.1**_^1*_*(I) = LAST HARDWARE STATUS_5**MSOS 4.1**_^1*****************************************€€*********************MSOS 4.1**_^1_%SPC 1_^1QCOM_!NUM 0_^1_%STA* FSTWRD_'SAVE FIRST WORD ADDRESS_^1_%STQ* NUMWDS_'SAVE NUMBER OF WORDS_^1_%SQN LDQCO_^1_%JMP* ISN_+Q ZERO AT QCOM ENTRY IMPLIES READ_^1*_]_^1*******_#ENTRY_^1TELOUT NOP 0_^1_%STA* FSTWRD_'SAVE BUFFER ADDRESS_^1_%STQ* NUMWDS_'SAVE WORD COUNT_^1_%LDA* TELOUT_'SETUP RETURN ADDRESS_^1_%STA* QCOM_^1_%JMP* ISN_^1LDQCO L€€DQ CO_^1_%ADQ TABLE,Q_^1AT_#ADQ =XTABLE_^1_%ADQ =X(AT-RJ)_^1_%STQ* RJ+1_^1_%LDQ* NUMWDS_'RESTORE WORD COUNT_^1_%LDA* FSTWRD_^1RJ_#RTJ AT_^1_%JMP* (QCOM)_^1*_]_^1*******_#ENTRY_^1TTYOUT ADC 0_^1_%LDA* QCOM_^1_%STA* SAVRET_^1_%RTJ* SAVAD_^1_%LDA* SAVRET_^1_%STA* QCOM_^1_%JMP* (TTYOUT)_^1SAVRET ADC 0_^1SAVAD ADC 0_^1_%LDA* SAVAD_^1_%STA* QCOM_^1*_]_^1*_$QCOM - TELOUT - TTYOUT€€ ENTRIES COME TO 'ISN'_^1ISN_"LDA* WRSET_(IF TYPEWRITER OUTPUT_^1_%STA* IOSW+1_%1. SET IOSW TO 'WRITE'_^1_%LDA* WRMODE_^1_%STA* MODSET_'2. SET MODSET TO $100_^1_%SQN SETWR-*-1 SKIP IF WRITE OPERATION_^1*_$SET FOR READ MODE_^1_%LDA* RDMODE_^1_%STA* MODSET_%1. SET MODSET TO $200_^1_%LDA* RDSET_^1_%STA* IOSW+1_%2. SET IOSW TO 'READ'_^1*_$WANT TO SET BREAK LIGHT_^1_%LDA* WRMODE_#TYP€€EWRITER TO WRITE MODE_^1_%LDQ* ECOM_K**MSOS 4.1**_^1_%OUT -1_^1_%INQ -1_^1_%CLR A_^1_%OUT -1_+TWO SUCCESSIVE NULLS (A=0) ARE_^1_%OUT -1_+NEEDED FOR BREAK LIGHT_^1_%JMP* RUNCHK_^1SETWR LDQ* FSTWRD_'CHECK FOR END OF BUFFER_^1_%ADQ* NUMWDS_L62*1337_^1_%INQ -2_P62*1337_^1TSTBL LDA- 1,Q_*GET WORD FROM BUFFER_062*1337_^1_%SAM BCKGND_'SKIP IF BACK GROUNDED_/62*1337_^1_%SUB =N$20€€20_K62*1337_^1_%SAN NOBL_)SKIP IF NOT SPACES_262*1337_^1BCKGND INQ -1_+DECREMENT BUFFER LENGTH_-62*1337_^1_%JMP* TSTBL_(CHECK NEXT_:62*1337_^1NOBL_!LDA* FSTWRD_L62*1337_^1_%TCA A_Q62*1337_^1_%INQ 2_Q62*1337_^1_%AAQ A_Q62*1337_^1_%STA* NUMWDS_L62*1337_^1_%LDQ* ECOM_B62*1337 **MSOS 4.1**_^1_%LDA* WRMODE_^1_%OUT -1_(SET TYPEWRITER TO WRITE MODE_^1RUNCHK LDQ* ECOM_K**MSOS 4.1**_€€^1_%INP -1_(TAKE INITIAL STATUS_^1_%STA* STATUS_'SAVE STATUS_6**MSOS 4.1**_^1_%ALS 14_+CHECK BUSY BIT_884*2443_^1_%SAP START-*-1_#SKIP IF NOT BUSY_684*2443_^1_%JMP* RUNCHK_^1START LDQ* ECOM_K**MSOS 4.1**_^1_%INQ -1_^1_%ENA $D_(SEND CARRIAGE RETURN AND_^1_%OUT -1_*AND LINE FEED_^1_%OUT -1_+DELAY FOR HARD COPY PRINTER_*100*3661_^1_%OUT -1_Q100*3661_^1_%OUT -1_Q100*3661_^1_%€€ENA $A_^1_%OUT -1_^1_%LDA* MODSET_^1_%LDQ* ECOM_K**MSOS 4.1**_^1CSTART OUT -2_(INSTRUCT DEVICE TO BEGIN OPTN._^1RESTRT LDA* PROSET_#SET ERROR SWITCH_^1_%STA* ERSW+1_^1_%ENA 120_*MAXIMUM CHARACTER COUNT_^1_%STA* BUFFUL_'SET READ COUNTER TO MAX_^1_%LDA* FSTWRD_#SET ADDRESS COUNTER TO_^1_%ALS 1_+(FSTWRD)*2_^1_%STA* WRDADD_^1_%LDA* NUMWDS_#SET CHARACTER COUNTER TO_^1_%ALS 1_+-(NU€€MWDS)*2_^1_%TCA A_^1_%STA- 25,I_^1IOSW_!NUM $1800,$FFFF_"GO TO 'READ' OR 'WRITE'_^1FSTWRD NUM $FFFF_^1NUMWDS NUM $FFFF_^1WRDADD NUM $FFFF_(CHARACTER ADDRESS WITH R/L INDICATOR_^1PROSET_!ADC_%CHRPRO-ERSW-1_^1ERRSET_!ADC_%ERSLEW-ERSW-1_^1RDSET_"ADC_%READ-IOSW-1_^1WRSET_"ADC_%WRITE-IOSW-1_^1ECOM_!NUM $91_*W,E,S FUNCTION_3**MSOS 4.1**_^1MODSET NUM -0_^1RDMODE NUM $200_^1WRMODE €€NUM $100_^1WRITE ENQ 0_^1_%LDA* WRDADD_^1_%LLS 15_^1_%INQ -1_(TEST FOR LEFT OR RIGHT CHARACTE_^1_%LDQ- 1,Q_)OF OUTPUT_^1_%SAM 1_)SKIP IF RIGHT CHARACTER_^1_%QLS 8_)SHIFT IF LEFT CHARACTER_^1_%TRQ A_^1_%AND =N$7F_(MASK CHARACTER_7100*3661_^1_%LLS 16_Q100*3661_^1_%INQ -$D_*TEST FOR CARRIAGE RETURN_-100*3661_^1_%SQN WRITE1_'SKIP IF NOT_:100*3661_^1_%LDQ* ECOM_O100*3661_^1_€€%INQ -1_Q100*3661_^1_%NOP 0_S100*3661_^1_%OUT -1_Q100*3661_^1_%OUT -1_+DELAY FOR HARD COPY PRINTER_*100*3661_^1_%OUT -1_Q100*3661_^1WRITE1 LDQ* ECOM_O100*3661_^1_%INQ -1_^1_%NOP 0_^1_%OUT -1_+XFER CHARACTER OF OUTPUT_^1_%RAO* WRDADD_^1_%RAO- 25,I_%PUT (COUNT1) + 1 IN COUNT1_^1_%LDA- 25,I_^1_%SAZ COMXIT_#TEST FOR AND LOOP IF FEWER_^1_%JMP* WRITE_'THAN 120 CHRS TRANSFERRED_^1€€COMXIT ENA -0_^1_%JMP (QCOM)_%EXIT ADDRESS_^1STATUS NUM 0_,LAST HARDWARE STATUS_-**MSOS 4.1**_^1*_85 CARDS DELETED_784*2472_^1READ_!LDQ* ECOM_K**MSOS 4.1**_^1_%INQ -1_^1_%ENA 0_^1INPCOM INP -1_(READ CHARACTER_^1_%AND =N$7F_)DROP PARITY BIT_2**MSOS 4.1_^1*_$NO PARITY CHECK. TTY AND CRT NOT COMPATABLE_***MSOS 4.1_^1_%STA- 11,I_*STORE CHARACTER AT INPREL_(**MSOS 4.1_^1_%INA -$€€61_*LOWER CASE A_5**MSOS 4.1_^1_%SAM NOTLOW_(SKIP IF BELOW LOWER CASE A_'**MSOS 4.1_^1_%INA -$1A_*CHECK RANGE THRU LOWER CASE Z_#**MSOS 4.1_^1_%SAP NOTLOW_(SKIP IF ABOVE LOWER CASE RANGE_"**MSOS 4.1_^1_%LDA- 11,I_L**MSOS 4.1_^1_%INA -$20_*DROP LOWER CASE BIT_.**MSOS 4.1_^1_%STA- 11,I_L**MSOS 4.1_^1NOTLOW LDA- 11,I_*FETCH VALUE FOR FURTHER CHECKS_"**MSOS 4.1_^1ERSW_!NUM $1800,$€€FFFF_"GO TO 'CHRPRO' OR 'ERSLEW'_^1CHRPRO INA -$A_^1_%SAN 1_)TEST FOR AND XFER IF_^1_%JMP* READ_(CHARACTER IS LINE FEED_^1_%INA -3_^1_%SAN 1_)TEST FOR AND XFER IF_^1_%JMP* COMXIT_%CHARACTER IS CARRIAGE RETURN_^1_%INA -$72_^1_%SAN 1_)TEST FOR AND XFER IF_^1_%JMP* DELETE_%CHARACTER IS DELETE_^1_%LDA* BUFFUL_'CHECK MAX BUFFER EXCEEDED_^1_%INA -1_^1_%STA* BUFFUL_^1_%SAN CNTINU-€€*-1_"SKIP IF OK_^1_%JMP* COMXIT_'IF FULL CONTINUE AS IF CARRIAGE RETURN_^1BUFFUL NUM 0_^1CNTINU LDA* WRDADD_'CHECK FOR RIGHT OR LEFT CHARACTER_^1_%ENQ 0_^1_%LLS 15_^1_%INQ -1_^1_%SAP LFTCHR-*-1 SKIP IF LEFT CHARACTER_^1_%LDA- 11,I_%STORE RIGHT CHARACTER_^1_%EOR =N$FF00_%SET BITS 8-15 OF DATA WORD_,93*2972_^1_%AND- 1,Q_^1CHRSTR STA- 1,Q_^1_%RAO* WRDADD_^1_%JMP* READ_^1LFTCHR L€VDA- 11,I_%STORE LEFT CHARACTER_^1_%ALS 8_^1_%EOR =N$FF_(SET BITS 1-7 OF DATA WORD_-93*2972_^1_%JMP* CHRSTR_^1DELETE LDQ* ERRSET_^1_%STQ* ERSW+1_^1ERSLEW INA -$D_^1_%SAZ 1_)TEST FOR AND XFER IF_^1_%JMP* READ_(CARRIAGE RETURN NOT RECEIVED_^1_%RTJ BACKGR_'BACKROUND BUFFER TO ALL ONES_^1_%JMP* RESTRT_#XFER TO REPEAT OPERATION_^1_%END_]_^__VPRCMRQ9 CSY/ C29 P€1_%NAM RCMRQ9_'DECK-ID C29 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$RTOS INITIALIZER SUBROUTINE FOR 9-TRACK LCTT READ REQUESTS_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1****_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_*THIS RTOS SUBROUTINE CALLS THE 9-TRACK LCTT INITIALIZER_^1*_*DRIVER TO INITIATE READ €€REQUESTS. THIS SUBROUTINE_^1*_*MUST NOT BE INCLUDED IF 9-TRACK INPUT IS NOT TO BE_^1*_*PERFORMED AS A PART OF THE INITIALIZATION PROCESS._^1*_]_^1*_8PARAMETERS_^1*_8----------_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1*_]_^1_%ENT QMTAPE_'ENTRY FOR 9-TRACK LCTT READ REQUESTS_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1*_]_^1_%EXT* QMTAPX_'ENTRY TO THE 9-TRACK LCTT €”INITIALIZER DRIVER_^1****_]_^1QMTAPE NOP 0_^1_%RTJ QMTAPX_'CALL 9-TRACK LCTT INITIALIZER DRIVER_^1_%JMP* (QMTAPE)_$RETURN TO CALLER_^1_%END_]_^__ ”PRCMLC9 CSY/ C30 P€1_%NAM RCMLC9_'DECK-ID C30 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$RTOS INITIALIZER DRIVER FOR 9-TRACK LCTT_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1****_]_^1*_8RTOS INITIALIZER LCTT 9-TRACK DRIVER_^1*_8**** *********** **** ******* ******_^1*_]_^1*_*PROGRAM BASE -_^1*_]_^1*_*LCTT KERNAL DRIVER OD€€S LEVEL II - LCTT 07/01/75_$REV 05_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_]_^1*_$THE RTOS INITIALIZER DRIVER PROCESSES ALL READ, WRITE_^1*_$AND MOTION REQUESTS ISSUED BY THE RTOS SYSTEM INITIALIZER._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE PURPOSE OF THIS SUBROUTINE IS TO PROCESS ALL READ,_^1*_$WRITE AND MOTION REQUESTS ISSUED BY THE RTOS S€€YSTEM_^1*_$INITIALIZER. ALL ERRORS DIAGNOSED DURING A READ ARE_^1*_$REPORTED TO THE OPERATOR. ERRORS WHICH OCCUR DURING_^1*_$WRITE OR MOTION OPERATIONS ARE NOT REPORTED._^1*_]_^1*_?NOTE_^1*_?----_^1*_]_^1*_$THIS DRIVER SUPPORTS I/O REQUESTS ON 9-TRACK UNITS ONLY._^1*_$7-TRACK UNITS ARE NOT SUPPORTED BY THE RTOS SYSTEM_^1*_$INITIALIZER._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8---€€---------------_^1*_]_^1*_8READ REQUESTS_^1*_]_^1*_$(A) REGISTER = STARTING BUFFER ADDRESS_^1*_]_^1*_8WRITE REQUESTS_^1*_]_^1*_$(A) REGISTER = STARTING BUFFER ADDRESS_^1*_$(Q) REGISTER = NUMBER OF WORDS REQUESTED_^1*_]_^1*_8MOTION REQUESTS_^1*_]_^1*_$(A) REGISTER = INPUT UNIT/OUTPUT UNIT INDICATOR_^1*_]_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_8READ REQUESTS_^1*_]_^1*_$OUTPUTS ERROR€€ DIAGNOSTICS IF ERRORS OCCUR._^1*_$(A) REGISTER = 0 TO INDICATE AN ERROR HAS OCCURRED._^1*_$(Q) REGISTER = ERROR CODE (SEE OUTPUT SECTION IN KERNAL_^1*_$SUBROUTINE (KLCTT) FOR ERROR CODE DESCRIPTION)._^1*_$(I) REGISTER = LAST HARDWARE STATUS FROM LCTT MAG TAPE DRIVE_^1*_]_^1*_8WRITE AND MOTION REQUESTS_^1*_]_^1*_$NO SPECIFIC OUTPUTS OCCUR AFTER WRITE OR MOTION REQUESTS._^1*_]_^1*E_€€]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_*ENTRY - THE ENTRY POINT 'QMTAPX' IS CALLED_^1*_*TO INITIATE INPUT. THE A-REGISTER CONTAINS_^1*_*THE STARTING ADDRESS INTO WHICH DATA IS TO BE READ,_^1*_*IN ORDER TO FACILITATE THE USE OF THE MSOS LCTT_^1*_*KERNAL DRIVER AS THE BASE OF THIS DRIVER, A PSEUDO_^1*_*MSOS FREAD REQUEST 'REQUEST' IS INCLUDED AS PART_^1*_*OF THIS PROGRAM. A PR€€ESET PHYSICAL DEVICE TABLE_^1*_*'PLCTUO' IS ALSO INCLUDED HERE._^1*_]_^1*_*ENTRY - THE ENTRY POINT 'HSMPDR' IS CALLED_^1*_*TO INITIATE OUTPUT. THE A-REGISTER CONTAINS_^1*_*THE STARTING BUFFER ADDRESS FROM WHICH DATA IS TO_^1*_*BE WRITTEN AND THE Q-REGISTER CONTAINS THE_^1*_*NUMBER OF WORDS TO WRITE. A PSEUDO FWRITE_^1*_*REQUEST 'WEQUST' IS INCLUDED AS PART OF THIS_^1*_*PROGRAM._^€€1*_]_^1*_*ENTRY- THE ENTRY POINT 'HSMADF' IS CALLED_^1*_*TO PERFORM AN ADVANCE FILE FUNCTION. THE_^1*_*A-REGISTER CONTAINS THE INDICATOR FOR WHICH_^1*_*UNIT IS TO BE ADVANCED. A PSEUDO MOTION_^1*_*REQUEST 'MOTREQ' IS INCLUDED AS PART OF THIS_^1*_*PROGRAM._^1*_]_^1*_]_^1*_$2._!EXIT - THIS DRIVER EXITS TO THE USER WHEN THE READ_^1*_*TRANSFER IS COMPLETE. IF NO ERRORS HAVE OCCURRED€€,_^1*_*THE A-REGISTER WILL CONTAIN A 1._^1*_*EXIT FROM WRITE AND MOTION REQUESTS RETURNS TO_^1*_*THE USER WITH NO SPECIFIC ACTION IF AN ERROR_^1*_*OCCURS._^1*_]_^1*_8FLOW FOR 'QMTAPX'_^1*_8---- --- --------_^1*_]_^1*_$1. SAVE THE CONTENTS OF THE I-REGISTER FOR RETURN._^1*_$2. CALCULATE THE ADDRESS OF THE LCTT PHYSICAL DEVICE_^1*_)TABLE AND STORE IN THE I-REGISTER._^1*_$3. CALCUL€€ATE THE ADDRESS OF THE PSEUDO FREAD REQUEST AND_^1*_)STORE IN WORD 6 OF THE PHYSICAL DEVICE TABLE._^1*_$4. CALCULATE THE ADDRESS OF THE PACK/UNPACK BUFFER AND_^1*_)STORE IN WORD 38 OF THE PHYSICAL DEVICE TABLE._^1*_$5. SAVE THE STARTING BUFFER ADDRESS AND ENDING BUFFER_^1*_)ADDRESS IN THE PHYSICAL DEVICE TABLE._^1*_$6. CALL THE KERNAL SUBROUTINE._^1*_$7. UPON RETURN, DETERMINE €€IF ANY ERRORS OCCURRED._^1*_.IF NO ERRORS OCCURRED, RETURN TO THE CALLING_^1*_.PROGRAM WITH THE A-REGISTER SET TO 1 AND THE_^1*_.I-REGISTER SET TO THE VALUE UPON ENTRY._^1*_]_^1*_.IF ERRORS OCCURRED, CLEAR THE ERROR FLAGS,_^1*_.SET THE A-REGISTER TO 0, SET THE Q-REGISTER TO_^1*_.THE ERROR CODE VALUE, AND THE I-REGISTER TO THE_^1*_.LAST STATUS READ ON THE LCTT._^1*_$8. RETURN TO TH€€E CALLING PROGRAM._^1*_]_^1*_]_^1*_8FLOW FOR 'HSMPDR'_^1*_8---- --- --------_^1*_]_^1*_*SAVE THE WRITE FILE MARK AFTER DATA FLAG._^1*_*SAVE THE FIRST WORD ADDRESS OF THE WRITE BUFFER._^1*_*SAVE THE NUMBER OF WORDS TO WRITE._^1*_*SAVE THE ONE OR TWO PASS INITIALIZATION FLAG._^1*_*SAVE THE CONTENTS OF THE I-REGISTER FOR RETURN._^1*_*CALCULATE THE ADDRESS OF THE LCTT PHYSTB AND SAVE_^€€1*_*IN THE I-REGISTER._^1*_*CALCULATE THE ADDRESS OF THE WRITE REQUEST AND_^1*_*SAVE IN THE PHYSTB._^1*_*CALCULATE THE END OF THE USERS BUFFER AND SAVE_^1*_*THE FIRST AND LAST WORD ADDRESSES OF THE BUFFER_^1*_*IN THE PHYSTB._^1*_*FROM THE VALUE OF THE PASS INITIALIZATION FLAG,_^1*_*DETERMINE WHICH UNIT TO CONNECT TO AND STORE THE_^1*_*APPROPRIATE UNIT SELECT CODE IN THE PHYSTB._^1*€€_*SET UP THE ADT CONTROL WORD FOR THIS EQUIPMENT._^1*_*CALL THE KERNAL SUBROUTINE._^1*_*UPON RETURN, DETERMINE IF A FILE MARK IS TO BE_^1*_*WRITTEN. IF NOT, RESTORE THE I-REGISTER AND_^1*_*RETURN TO THE CALLER._^1*_*IF A FILE MARK IS TO BE WRITTEN, CLEAR THE_^1*_*FIEST AND LAST BUFFER ADDRESSES IN THE PHYSTB._^1*_*CALCULATE THE ADDRESS OF THE MOTION REQUEST AND_^1*_*SAVE IN THE PY€€HSTB._^1*_*STORE THE WRITE END OF FILE CODE IN THE MOTION_^1*_*REQUEST._^1*_*CALL THE KERNAL SUBROUTINE._^1*_*UPON RETURN, RESTORE THE I-REGISTER AND RETURN_^1*_*TO THE CALLER._^1*_]_^1*_8FLOW FOR 'HSMADF'_^1*_8---- --- --------_^1*_]_^1*_*SAVE THE INPUT UNIT/OUTPUT UNIT FLAG._^1*_*SAVE THE ONE OR TWO PASS INITIALIZATION FLAG._^1*_*SAVE THE CONTENTS OF THE I-REGISTER FOR RETURN._^1€€*_*CALCULATE THE ADDRESS OF THE LCTT PHYSTB AND SAVE_^1*_*IN THE I-REGISTER._^1*_*CALCULATE THE ADDRESS OF THE MOTION REQUEST AND_^1*_*SAVE IN THE PHYSTB._^1*_*CLEAR THE FIRST AND LAST BUFFER ADDRESSES IN_^1*_*THE PHYSTB._^1*_*FROM THE VALUE OF THE PASS INITIALIZATION FLAG,_^1*_*DETERMINE WHICH UNIT TO CONNECT TO AND STORE THE_^1*_*APPROPRIATE UNIT SELECT CODE IN THE PHYSTB._^1*_*S€€TORE THE ADVANCE FILE CODE IN THE MOTION REQUEST._^1*_*SET UP THE ADT CONTROL WORD IN THE MOTION REQUEST._^1*_*CALL THE KERNAL SUBROUTINE._^1*_*UPON RETURN, RESTORE THE I-REGISTER AND RETURN TO_^1*_*THE CALLER._^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*KLCTT - LCTT KERNEL_^1*_]_^1*_]_^1*_8PARAMETERS_^1*_8----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT €€QMTAPX_'ENTRY TO READ REQUEST PROCESSOR_^1_%ENT EMTAPE_'BASIC W, E, S FUNCTION CODE_^1_%ENT HSMPDR_'ENTRY TO MAG TAPE OUTPUT SUBROUTINE_^1_%ENT HSMADF_'ENTRY TO MAG TAPE ADVANCE FILE SUBROUTINE_^1_%ENT OUTAPE_'DUMMY ENTRY FOR EQUIPMENT CODE INPUT_^1_%ENT OUTAP1_'DUMMY ENTRY FOR EQUIPMENT CODE INPUT_^1*_]_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1*_*MISCELLANE€€OUS EQUATES_^1*_]_^1_%EQU NOISLN(2)_#LENGTH OF NOISE RECORD_^1_%EQU LEWES($0480) EQUIPMENT CODE EQUATE_^1_%EQU MICRIN(9)_#MICRO INTERRUPT LINE EQUATE_^1_%EQU TLCT7(53*$10) TYPE CODE FOR 7 TRACK DRIVES_^1_%EQU TLCT9(54*$10) TYPE CODE FOR 9 TRACK DRIVES_^1*_]_^1*_*SELECT UNIT AND DENSITY EQUATES_^1_%EQU U0TK7($800)_!UNIT/TRACK SELECT - UNIT 0/7 TRACK_^1_%EQU U0TK9(0)_$UNIT/TR€€ACK SELECT - UNIT 0/9 TRACK_^1_%EQU D800($100)_"DENSITY SELECT - 800 BPI_^1_%EQU D556($200)_"DENSITY SELECT - 556 BPI_^1_%EQU PHSREX(0)_#MAXIMUM PHYSICAL RECORD SIZE - NOT USED_^1_%EQU LNLCTT(0)_^1_%EQU SLCTT($7FFF)_^1*_]_^1*_]_^1*_]_^1*E_]_^1*_*PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)€€_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11€€)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUP€€TS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG€€_^1_%EQU ADTCW(27)_#27 ADT TABLE CONTROL WORD_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG(ALSO ADT DUMMY)_^1_%EQU RRETAD(31)_"31 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(32)_"32 RECOVERY CHECKSUM_^1_%EQU RCNTFG(33)_"33 RECOVERY COUNT FLAG_^1_%EQU RFLAG(34)_#34 RECOVERY FLAG, BIT15=1=NO RECOVERY_^1_%E€€QU QSTCOD(35)_"35 REQUEST CODE_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU PHSREC(37)_"37 MAX PHYSICAL RECORD SIZE_^1_%EQU ABUFF(38)_#38 PACK/UNPACK BUFFER ADDRESS_^1_%EQU ELINK(39)_#39 PDT THREAD_^1*E_]_^1*_8MESSAGES_^1*_8--------_^1*_]_^1*_*THE INITIALIZER INPUT CONTROL SUBROUTINE WILL PRINT_^1*_*FAULT CODES FOR ALL DRIVER DIAGNOSED ERRORS._^1*_]_^1*E_]_^1*_8MISCEL€€LANEOUS_^1*_8-------------_^1*_]_^1*_]_^1*_$LCTT HARDWARE REGISTER DEFINITIONS_^1*_]_^1*_/***************************************_^1*_/* FUNCTION AND CONDITION BIT REGISTER *_^1*_/***************************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$FUNCTION_^1*_$1_$FUNCTION_^1*_$2_$FUNCTION_^1*_$3_$FUNCTION_^1*_]_^1*_$4_$SKIP FIRST BYTE_^1*_$5_$SKIP LAST BYTE_^1*_$6_$NO€€T USED_^1*_$7_$NOT USED_^1*_]_^1*_$8_$DENSITY - FORM = BIT8BIT9 = XXX BPI_^1*_$9_$DENSITY - 01 = 800, 10 = 556, 11 = 200 BPI_^1*_$10_#PARITY - 1 = EVEN, 0 = ODD_^1*_$11_#TRACK - 1 = 7 TRACK, 0 = 9 TRACK_^1*_]_^1*_$12_#UNIT NUMBER_^1*_$13_#UNIT NUMBER_^1*_$14_#NOT USED_^1*_$15_#NOT USED_^1*E_]_^1*_/***************************_^1*_/* HARDWARE FUNCTION CODES *_^1*_/*******************€€********_^1*_$CODE_!FUNCTION_^1*_]_^1*_$0_$NOT USED, RESULTS IN PROGRAM ERROR_^1*_$1_$READ_^1*_$2_$WRITE_^1*_$3_$ERASE_^1*_$4_$BACKSPACE_^1*_$5_$REWIND_^1*_$6_$REWIND AND UNLOAD_^1*_$7_$WRITE TAPE MARK_^1*_$8_$SELECT_^1*_$9_$RECOVERY READ_^1*_$A_$CONTROLLED BACKSPACE_^1*_$B_$DIAGNOSTIC CODE_^1*_$C_$DIAGNOSTIC CODE_^1*_$D_$DIAGNOSTIC CODE_^1*_$E_$DIAGNOSTIC CODE_^1*_$F_$DIAGNOSTIC C€€ODE_^1*E_]_^1*_/****************************_^1*_/* HARDWARE STATUS REGISTER *_^1*_/****************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$INOP - DURING SELECTION_^1*_$1_$BUSY_^1*_$2_$REWINDING_^1*_$3_$READ AFTER WRITE COMMAND_^1*_]_^1*_$4_$WRITE LOCKOUT_^1*_$5_$NOT USED_^1*_$6_$PROGRAM ERROR_^1*_$7_$HALF WORD ON READ_^1*_]_^1*_$8_$SHORT BLOCK_^1*_$9_$TIME OUT_^1*_$1€€0_#DROUPOUT/PICKUP_^1*_$11_#OVERLOAD_^1*_]_^1*_$12_#INOP - DURING EXECUTION_^1*_$13_#DATA ERROR_^1*_$14_#TAPE MARK_^1*_$15_#EOT_^1****_]_^1_%EJT_]_^1QMTAPX NOP 0_^1_%LDQ- I_,SAVE IHE I REGISTER FOR RETURN_^1_%STQ* SAVEIX_^1_%RTJ* HERE_)CALCULATE ADDRESS OF LCTT PHYSTB_^1HERE_!NOP 0_^1_%LDQ* HERE_^1_%ADQ =XPLCTU0-HERE_^1_%STQ- I_,AND SAVE IN THE I-REGISTER_^1_%LDQ* HERE_)CALCULAT€€E ADDRESS OF PSEUDO REQUEST_^1_%ADQ =XREQUST-HERE_^1_%STQ- EPTR,I_^1_%ENQ 2_,SET ESTAT1 TO AN FREAD REQUEST_^1_%STQ- ESTAT1,I_^1_%SAP ACTADR_'IF ADDRESS IS NEGATIVE_^1_%TCA A_,COMPLIMENT ADDRESS_^1ACTADR STA- ECCOR,I_%SAVE STARTING BUFFER ADDRESS IN PDT_^1_%STA* STRTAD_'SAVE STARTING ADDRESS IN PSEUDO REQUEST_^1_%ADD* NWORDS_'CALCULATE ENDING BUFFER ADDRESS_^1_%STA- ELSTWD,I_$A€€ND SAVE IN PDT_^1_%LDA- EWES,I_'SET UP ADT CONTROL WORD FOR THIS EQUIPMENT_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1_%RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODE_^1_%ENA $0003_(GET ANY NOISE REC OR RECOVERY TO_^1_%AND- RFLAG,I_%LOG TO THE OPERATOR_^1_%ADD* IERR_)WERE THERE ANY ERRORS TO OUTPUT_^1_%SAN ERRCOD_'YES_^1_%LDQ* SAVEIX_'RESTORE I-REGISTER TO USER_^1_%STQ- I_^1€€_%ENA 1_,NO, A = 1 FOR NORMAL RETURN_^1_%JMP* (QMTAPX)_$RETURN._^1ERRCOD LDQ- FLTCOD,I_$PUT ERROR CODE INTO Q-REGISTER_^1_%LDA- RFLAG,I_%CLEAR RECOVERY FLAGS_^1_%AND =N$8000_^1_%STA- RFLAG,I_^1_%LDA- ESTAT2,I_$STATUS TO I-REG ON ERROR._^1_%STA- I_^1_%ENA 0_,CLEAR ERROR FLAG_^1_%STA* IERR_^1_%JMP* (QMTAPX)_$RETURN. A = 0 FOR ERROR._^1_%EJT_]_^1IERR_!NUM 0_,TEMPORARY HOLD FOR ER€€ROR FLAG_^1SAVEIX NUM 0_,TEMPORARY HOLD FOR I-REGISTER_^1REQUST NUM $0800_(FORMAT READ_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDS NUM $0060_(LENGTH OF REQUEST_^1STRTAD NUM $0000_(STARTING ADDRESS_^1_%EJT_]_^1HSMPDR NOP 0_^1_%STA* TYPE_)SAVE FILEMARK FLAG_^1_%SAP NOEOF_(NO EOF AFTER WRITE_^1_%TCA A_^1NOEOF STA* FSTWRD_'SA€€VE FIRST WORD ADDRESS_^1_%STQ- 25,I_)SAVE NUMBER OF WORDS_^1_%STQ* SIZE_^1_%LDQ- 210,I_(SAVE 1 PASS OR 2 PASS INPUT TYPE FLAG_^1_%STQ* SPECIL_^1_%LDQ- I_,SAVE I-REGISTER_^1_%STQ* SAVEIX_^1_%RTJ* HEREW_^1HEREW NOP 0_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF LCTT PHYSTB_^1_%ADQ =XPLCTU0-HEREW_^1_%STQ- I_,AND SAVE IN I-REGISTER_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF WRITE REQUEST_^1_%ADQ €€ =XWEQUST-HEREW_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%ENQ 3_,SET ESTAT1 TO AN FWRITE REQUEST_^1_%STQ- ESTAT1,I_^1_%STA- ECCOR,I_%SAVE FIRST WORD ADDRESS_^1_%ADD* SIZE_)CALCULATE ENDING BUFFER ADDRESS_^1_%INA 1_^1_%STA- ELSTWD,I_$AND SAVE IN PHYSTB_^1_%LDQ* SPECIL_'UNIT 0 FOR 1 PASS OR 2 PASS WITH CARD INPUT_^1_%SQP SETUNT_'UNIT 1 FOR 2 PASS WITH TAPE INPUT_^1_%CLR Q_,NEG. = 2€€ PASS WITH CARD INPUT_^1SETUNT QLS 12_+ADD IN UNIT BIT (0 OR 1)_^1_%ADQ =N$0100_%TO BASIC UNIT 0, 9 TRACK, 800 BPI_^1_%STQ- UNTMOD,I_$SAVE IN PHYSTB_^1_%LDA- EWES,I_'SET UP ADT CONTROL WORD FOR THIS EQUIPMENT_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1_%RTJ* KLCTT_(CALL KERNAL_^1_%LDA* TYPE_)IS AN END OF FILE SUPPOSED TO BE WRITTEN_^1_%SAP NOWEF_(NO, EXIT_^1_%CLR A_,YES, CLEAR FIRST A€€ND LAST WORD POINTERS_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF MOTION REQUEST_^1_%ADQ =XMOTREQ-HEREW_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%LDQ* WEFCOD_'SET MOTION REQUEST TO WRITE END OF FILE_^1_%STQ* MOCODE_^1_%RTJ* KLCTT_(CALL KERNAL_^1NOWEF LDQ* SAVEIX_'RESTORE I-REGISTER_^1_%STQ- I_^1_%JMP* (HSMPDR)_$RETURN_^1_%EJT_]_^1HSMADF NOP 0_^1_%LDQ- 2€€10,I_(SAVE 1 PASS OR 2 PASS INPUT TYPE FLAG_^1_%STQ* SPECIL_^1_%LDQ- I_,SAVE I-REGISTER_^1_%STQ* SAVEIX_^1_%RTJ* HEREM_^1HEREM NOP 0_^1_%LDQ* HEREM_(CALCULATE ADDRESS OF LCTT PHYSTB_^1_%ADQ =XPLCTU0-HEREM_^1_%STQ- I_,AND SAVE IN I-REGISTER_^1_%LDQ* HEREM_(CALCULATE ADDRESS OF THE MOTION REQUEST_^1_%ADQ =XMOTREQ-HEREM_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%CLR Q_,CLEAR FIRST A€€ND LAST WORD POINTERS_^1_%STQ- ECCOR,I_^1_%STQ- ELSTWD,I_^1_%LDQ =N$0100_%UNIT 0, 800 BPI, 9 TRACK CONNECT_^1_%SAZ SETMOD_'A=0 CONNECT UNIT 0, OTHERWISE CONNECT UNIT 1_^1_%LDQ* SPECIL_'UNIT 0 FOR 1 PASS OR 2 PASS WITH CARD INPUT_^1_%SQP UNTSET_'UNIT 1 FOR 2 PASS WITH TAPE INPUT_^1_%CLR Q_,NEG. = 2 PASS WITH CARD INPUT_^1UNTSET QLS 12_+ADD IN UNIT BIT (0 OR 1)_^1_%ADQ =N$0100_€€%TO BASIC UNIT 0, 9 TRACK, 800 BPI_^1SETMOD STQ- UNTMOD,I_$SAVE IN PHYSTB_^1_%LDQ* ADFCOD_'SET MOTION REQUEST TO ADVANCE FILE_^1_%STQ* MOCODE_^1_%LDA- EWES,I_'SET UP ADT CONTROL WORD FOR THIS EQUIPMENT_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1_%RTJ* KLCTT_(CALL KERNAL_^1_%LDQ* SAVEIX_'RESTORE I-REGISTER_^1_%STQ- I_^1_%JMP* (HSMADF)_$RETURN_^1_%EJT_]_^1TYPE_!NUM $0000_(+ = NO EOF AFTER €€WRITE, - = EOF AFTER WRITE_^1SPECIL NUM $0000_(FLAG FOR 1 OR 2 PASS INITIALIZATION_^1WEFCOD NUM $2000_(WRITE EOF CODE_^1ADFCOD NUM $5000_(ADVANCE FILE CODE_^1OUTAPE NUM $0000_(DUMMY EQUIPMENT CODE_^1OUTAP1 NUM $0000_(DUMMY EQUIPMENT CODE_^1*_]_^1WEQUST NUM $0C00_(FWRITE REQUEST_^1_%NUM $0000_(NO COMPLETION ADDRESS_^1_%NUM $0000_(THREAD_^1_%NUM $0003_(LU 3, BINARY_^1SIZE_!N€€UM $0000_(LENGTH OF REQUEST_^1FSTWRD NUM $0000_(STARTING ADDRESS_^1*_]_^1MOTREQ NUM $1C00_(MOTION REQUEST_^1_%NUM $0000_(NO COMPLETION ADDRESS_^1_%NUM $0000_(THREAD_^1_%NUM $0003_(LU 3_^1MOCODE NUM $0000_(MOTION CODE_^1_%EJT_]_^1*_*L C T T M A G T A P E_^1*_]_^1*_]_^1*_]_^1BFLCTT BZS BFLCTT(PHSREX*4/3+2) PACK/UNPACK BUFFER FOR 7 TK_^1*_]_^1*_]_^1*_*L C T T M A G T A P €€E , U N I T 0_^1*_]_^1* UNIT 0 - 7 TRACK, 556 BPI_^1*_]_^1PLCTU0 ADC $0000_)0 ELVL - SCHEDULER CALL_(NOT USED_^1_%ADC 0_-1 EDIN - INITIATOR ADDRESS_$NOT USED_^1_%ADC 0_-2 EDCN - CONTINUATOR ADDRESS_"NOT USED_^1_%ADC 0_-3 EDPGM - ERROR ADDRESS_(NOT USED_^1_%NUM -1_,4 EDCLK - DIAGNOSTIC CLOCK_^1_%NUM $0003_)5 ELU - LOGICAL UNIT_^1_%NUM 0_-6 EPTR - PARAMETER ADDRESS_^1EMTAPE €€ADC LEWES_)7 EWES - EQUIPT CODE FOR SAMPLE_^1_%ADC $0806+TLCT9_"8 EREQST - REQUEST STATUS_^1_%NUM $0002_)9 ESTAT1 - DRIVER STATUS_^1_%NUM 0_,10 ECCOR - NEXT LOCATION OF DATA_^1_%NUM 0_,11 ELSTWD - LAST LOCATION + 1_^1_%NUM 0_,12 ESTAT2 - LAST EQUIPTMENT STATUS_^1_%ADC LNLCTT_'13 MASLGN - DRIVER LENGTH_^1_%ADC SLCTT_(14 MASSEC - MASS MEMORY ADDRESS OF DRIVER_^1_%NUM 0_,15 R€€ETURN - FNR RETURN ADDRESS_^1_%NUM 0_,16 FLTCOD - FAULT CODE IF REQUEST ERROR_^1_%ADC 0_,17 DIAGLU - DIAGNOSTIC LOGICAL UNIT (NOT USED)_^1_%NUM 0_,18 GHOSTI - COUNT OF GHOST INTERRUPTS_^1_%ADC MICRIN_'19 MICROI - MICRO INTERRUPT LINE_^1_%NUM 0_,20 TIMOUT - INTERRUPT TIMEOUT VALUE_^1_%NUM 0_,21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_%NUM 0_,22 SINTER - STATUS AFTER INTERRUPT_€€^1_%NUM 0_,23 STIMEO - STATUS AFTER INTERRUPT TIMEOUT_^1_%ADC U0TK9+D800_"24 UNTMOD - UNIT AND MODE SELECT_^1_%NUM 0_,25 ETEMP1 - TEMPORARY STORAGE_^1_%NUM 0_,26 HAFWRD - HALF WORD FLAG_^1_%NUM $8480_(27 ADTCW - ADT TABLE CONTROL WORD_^1_%NUM 0_,28 ADTFW - ADT TABLE FWA-1_^1_%NUM 0_,29 ADTLW - ADT TABLE LWA_^1_%NUM 0_,30 MFLG - ADT TABLE DUMMY (ALSO REQUEST FLAG)_^1_%NUM €€0_,31 RRETAD - RECOVERY RETURN ADDRESS_^1_%NUM 0_,32 RCKSUM - RECOVERY CHECKSUM_^1_%NUM 0_,33 RCNTFG - RECOVERY COUNT FLAG_^1_%NUM 0_,34 RFLAG - RECOVERY TEMP STORAGE_^1_%NUM 0_,35 QSTCOD - REQUEST CODE_^1_%NUM 0_,36 QSTWD4 - WORD 4 OF REQUEST_^1_%ADC PHSREX_'37 PHSREC - MAX PHYSICAL RECORD SIZE_^1_%ADC BFLCTT_'38 ABUFF - PACK/UNPACK BUFFER ADDRESS_^1_%ADC PLCTU0_'39 ELINK €€- PDT THREAD_^1_%EJT_]_^1*_$NAM KLCTT_(ODS LEVEL II - LCTT_*07-01-75 REV 06_^1*_$LCTT KERNEL_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1975_^1****_]_^1*E_]_^1*_8LCTT KERNEL_^1*_8***********_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_$THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_$PERFORMS THE I/O BY CALLING ANCILLARY ROUTINES._^1*€€_$IT ALSO PROCESSES ERRORS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE KERNAL IS COMPOSED OF TWO BASIC PARTS._^1*_$ONE TO PROCESS INFORMATION NECESSARY TO EXECUTE THE I/O_^1*_$REQUEST AND ONE TO PROCESS THE INFORMATION FOLLOWING THE I/O._^1*_]_^1*_$PRIOR TO I/O, THE STATUS TO DETERMINE IF THE DEVICE IS_^1*_$OPERATIVE IS TAKEN. THE REQUEST TYPE IS DETERM€€INED,_^1*_$THE INITIAL UNIT CONNECTION IS MADE, AND THE APPROPRIATE I/O_^1*_$SUBROUTINE IS CALLED._^1*_]_^1*_$AFTER COMPLETION OF THE I/O REQUEST, STATUS IS TAKEN TO_^1*_$DETERMINE IF ANY ERRORS HAVE OCCURRED AND IF RECOVERY_^1*_$ACTION IS POSSIBLE. IF THE TRANSFER IS CORRECT AND THE_^1*_$DEVICE IS A 7-TRACK UNIT, THE DATA IS UNPACKED FROM THE_^1*_$INTERNAL BUFFER INTO THE USER BU€€FFER. WHEN THE_^1*_$REQUEST IS SATISFIED CONTROL WILL BE RETURNED TO_^1*_$THE DRIVER._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$INITIATOR (KLCTT)_^1*_)(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*E_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$THE OUTPUTS OF THE KERNEL ARE -_^1*_]_^1*_$1. STATUS_^1*_(PRE-I/O TRANSFER STATUS TO PDT_^1*_(POST-I/O TRANSFER €€STATUS TO PDT_^1*_]_^1*_$2. FAULT CODE IS SET IF ERROR AS FOLLOWS -_^1*_)1 LOST DATA_^1*_)2 ALARM_^1*_)3 PARITY_^1*_(13 NO WRITE RING_^1*_(14 NOT READY_^1*_(15 NOISE RECORD DETECTED AND IGNORED_^1*_(31 WRITE OF SHORT RECORD REQUESTED_^1*_(41 IRRECOVERABLE ERROR_^1*_]_^1*_]_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1. EXITS TO DRIVER (CALLING ROUTINE) ON FAULT_^1*_.DETECTION,€€ COMPLETION OF REQUEST._^1*_]_^1*E_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$PRE-I/O TRANSFER -_^1*_*1. SELECT AND STATUS TRANSPORT; SAVE STATUS._^1*_*2. IF BUSY OR INOPERATIVE CALL FAULT ROUTINE._^1*_*3. DETERMINE TYPE OF REQUEST AND CALL MOTION_^1*_-OR READ/WRITE ANCILLARY ROUTINE._^1*_*4. CALL WAIT SUBROUTINE TO WAIT FOR NOT BUSY_^1*_]_^1*_$POST-I/O TRANSFER -_^1*_*1. SAVES AND CHECKS TH€€E DEVICE STATUS. IF A_^1*_-7-TRACK FILE MARK IS SENSED, THE STATUS WORDS_^1*_-ARE MODIFIED TO REMOVE THE POSSIBLE PARITY ERROR_^1*_-CAUSED BY READING IN THE WRONG MODE._^1*_-IF IT IS 7-TRACK BUT NOT A FILE MARK, THE STATUS_^1*_-IS CORRECTED AND THE DATA TRANSFER CHECK CONTINUES._^1*_*2. IF IT IS A FILE MARK, THE FILE MARK STATUS FLAG IS_^1*_-SET AND A RETURN IS MADE TO THE CALLER.€€_^1*_*3. IF A MOTION REQUEST, CHECK STATUS FOR INOP,_^1*_-READ AFTER WRITE, PROGRAM ERROR, OR TIMEOUT._^1*_-IF ANY OF THESE GO TO FAULT ROUTINE. IF NO_^1*_-ERROR, RETURN TO CALLER WITH NO ERROR_^1*_-INDICATOR (A-REGISTER = 0)._^1*_*4. IF READ/WRITE REQUEST CHECK STATUS FOR DATA_^1*_-ERROR, OVERLOAD, DROPOUT. IF ANY OF THESE GO_^1*_-TO RECOVERY ANCILLARY ROUTINE. IF NO ERROR_^1*_*5.€€ IF 7-TRACK DRIVE, UNPACK DATA TO USER BUFFER._^1*_*6. RETURN TO CALLER._^1*_]_^1*_$FAULT ROUTINE -_^1*_*1. SAVE FAULT CODE IN PDT._^1*_*2. RETURN TO CALLER_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*XMOT - ISSUE I/O FOR MOTION REQUESTS_^1*_*XFER - ISSUE I/O FOR READ/WRITE REQUESTS_^1*_*WAIT - WAIT FOR NOT BUSY_^1*_*RECVRY - EXECUTE RECOVERY ERROR PROCEDURES_^1*_]_^1*_]_^1€€****_]_^1_%EJT_]_^1*_6*********_^1*_6* KLCTT *_^1*_6*********_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1KLCTT NUM 0_^1_%ENA 0_^1_%STA- MFLG,I_'CLEAR REQUEST TYPE FLAG_^1_%STA- SINTER,I_$CLEAR CONTINUATOR AND TIMEOUT STATUS_^1_%STA- SENTRY,I_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%INQ 8_,ADD DIRECTION (OUT)_^1_%LDA- UNTMOD,I_$UNIT SELECT INFO_^1_%INA 8_,SELECT FUNCTIO€€N_^1_%NUM $0B04_(SET I/O SELECT (SIO)_^1_%NOP 0_,DELAY 2 CYCLES_^1_%NOP 0_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%RTJ WAIT_)WAIT FOR NOT BUSY_^1_%STA- SENTRY,I_$SAVE ENTRY STATUS_^1_%ENA $41_^1_%AND- SENTRY,I_$CHECK IF INOP OR PROG ERROR_^1_%SAZ KL10_)NO, CONTINUE_^1_%ENA 14_+YES, REPORT ERROR_^1_%JMP FLCTT_^1*_]_^1KL10_!LDQ- EPTR,I_'€€CHECK IF MOTION REQUEST_^1_%LDA- 4,Q_^1_%STA- QSTWD4,I_$SAVE WD 4 OF REQUEST IN PDT_^1_%LDA 0,Q_*GET REQUEST CODE_^1_%ARS 9_^1_%AND =N$001F_%MASK OFF REQUEST BITS_^1_%INA -14_^1_%STA- MFLG,I_'SAVE REQUEST FLAG_^1KL15_!LDA- MFLG,I_'NEXT I/O FUNCTION_^1_%SAN KL20_)SKIP IF NOT MOTION REQUEST_^1_%RTJ XMOT_)EXECUTE MOTION COMMAND_^1_%JMP* KL30_^1KL20_!RTJ XFER_)EXECUTE READ/WRITE€€_^1KL30_!RTJ* WAIT_)WAIT FOR NOT BUSY_^1_%EJT_]_^1* KERNEL CONTINUATOR_^1*_]_^1CLCTT STA- ESTAT2,I_$SAVE DEVICE STATUS_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$4000_%IS THERE A TAPE MARK STATUS SET_^1_%SAN CKMOT_(YES, CHECK IF EXECUTING MOTION REQUEST_^1_%JMP* CL03_)NO, CHECK FOR RECOVERY IN PROGRESS_^1CKMOT LDA- UNTMOD,I_$IS THIS A 7-TRACK UNIT_^1_%AND =N$0800_€€^1_%SAN EOF7TWAIT_)WAIT FOR NOT BUSY_^1_%EJT_]_^1* KERNEL CONTINUATOR_^1*_]_^1CLCTT STA- ESTAT2,I_$SAVE DEVICE STATUS_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$4000_%IS THERE A TAPE MARK STATUS SET_^1_%SAN CKMOT_(YES, CHECK IF EXECUTING MOTION REQUEST_^1_%JMP* CL03_)NO, CHECK FOR RECOVERY IN PROGRESS_^1CKMOT LDA- UNTMOD,I_$IS THIS A 7-TRACK UNIT_^1_%AND =N$0803(€€TATUS BIT FROM ESTAT2 AND_^1_%STA- ESTAT2,I_$SINTER_^1_%LDA =N$DFFF_^1_%AND- SINTER,I_^1_%STA- SINTER,I_^1_%JMP* CL03_)FILE MARK CONTINUE_^1CL01_!LDA- ESTAT2,I_$ADJUST STATUS FOR NO FILE MARK_^1_%AND =N$BFFF_^1_%STA- ESTAT2,I_^1_%LDA- SINTER,I_^1_%AND =N$BFFF_^1_%STA- SINTER,I_^1_%JMP* CL03_^1*_]_^1CL02_!LDA MOTCOD_'MOTION CODE_^1_%INA -5_+SEARCH FILE MARK_^1_%SAZ 3_,YES, CHE€€CK DATA_^1_%INA -2_+ADVANCE RECORD_^1_%SAN CL03_)NO, CONTINUE_^1_%LDA ADVRB_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAZ 1_,FILE MARK DATA_^1_%JMP* CL01_)NO, ADJUST STATUS_^1CL03_!LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* CL07_)YES, GO TO RECOVERY PROCEDURE_^1_%LDA- MFLG,I_^1_%SAN 1_,SKIP IF NON-MOTION REQUEST_^1_%JMP* CL10_)MOTION REQUES€€T_^1_%LDA- SINTER,I_$READ/WRITE STATUS CHECK_^1_%AND =N$124D_%INOP, REWIND, R/W, TIMEOUT_^1_%SAZ CL04_^1_%ENA 2_^1_%JMP* FLCTT_^1CL04_!ENA $0010_^1_%AND- SINTER,I_^1_%SAZ CL05_)NO, CONTINUE_^1_%ENA 13_+YES, ERROR_^1_%JMP* FLCTT_^1CL05_!LDA- SINTER,I_$ANY OTHERS CHECK RECOVERY_^1_%AND =N$2C00_%DATA ERROR, OVERLOAD, DROPOUT_^1_%SAN CL07_^1_%LDA- SINTER,I_^1_%AND =N$C000_%EOT€€ OR TM SET_^1_%SAZ NOTM_)NO_^1_%CLR Q_,SET TAPE MARK STATUS SET FLAG_^1_%JMP* RQ9TK_(YES, NO RECOVERY_^1NOTM_!LDA- ADTFW,I_%FWA-1 (NOISE RECORD CHECK)_^1_%SUB* FWA_*- STARTING ADDRESS_^1_%INA -NOISLN_^1_%SAP CL08_)RECORD .GT. NOISE RECORD_^1CL07_!RTJ RECVRY_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KL15_)EXECUTE RECOVERY FUNCTION_^1CL08_!JMP* CL20_)NO RECOVERY OR RECOVE€€RY COMPLETE_^1*_]_^1CL10_!LDA- SINTER,I_$IF INOP, READ AFTER WRITE,_^1_%AND =N$1249_%PROG ERR, TIMEOUT = FATAL_^1_%SAZ CL20X_(IF NO ERROR CHECK FOR ADVANCE FILE REQUEST_^1_%ENA 2_^1_%JMP* FLCTT_^1CL20X LDA MOTCOD_'IS THIS AN ADVANCE FILE REQUEST_^1_%INA -5_+MOTCOD = 5_^1_%SAN CL40_)NO, CONTINUE ON AS IS_^1_%LDA- SINTER,I_$YES, IS THERE A FILE MARK STATUS SET_^1_%AND =N$4000€€_^1_%SAN CL25_)YES, SET FILE MARK STATUS FLAG IN Q_^1_%JMP* KL15_)NO, CONTINUE LOOKING FOR FILE MARK_^1CL20_!LDA- SINTER,I_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$C000_%IS TAPE MARK OR EOT SET_^1_%SAZ CL40_^1CL25_!CLR Q_,SET FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_^1CL40_!ENA $0010_(IS A 7-TRACK READ IN PROGRESS_^1_%AND- ESTAT1,I_^1_%SAZ RQ9TK_(NO, DO NOT P€€ACK DATA_^1_%STQ* QSAVX_(SAVE Q-REGISTER TEMPORARILY_^1_%RTJ TK7DAT_'YES, PACK 7 TRACK DATA INTO USER BUFFER_^1_%LDQ* QSAVX_(RESTORE Q-REGISTER_^1RQ9TK ENA 0_,CLEAR ERROR FLAG_^1_%JMP (KLCTT)_^1WAIT_!NOP 0_^1WAIT0X ENA 3_,SET FLAG FOR DELAY_^1WAIT00 STA* BZYCTR_^1_%LDA =N$0FFF_%DELAY APPROX. 10 MS_^1WAIT01 INA -1_^1_%SAZ WAIT02_^1_%JMP* WAIT01_^1WAIT02 LDQ- EWES,I_'EQUIPME€€NT CODE_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%AND =N$0002_%IS IT BUSY_^1_%SAZ WAIT03_'NO_^1_%JMP* WAIT0X_'YES, DELAY AND TRY AGAIN_^1WAIT03 LDA* BZYCTR_'DONE WITH DELAY LOOP YET_^1_%SAZ WAIT04_'YES_^1_%INA -1_+WAIT AGAIN_^1_%JMP* WAIT00_^1WAIT04 NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%STA- SINTER,I_^1_%JMP* (WAIT)_'RETURN_^1*_]_^1* FAIL€€ED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1FLCTT STA- FLTCOD,I_$SAVE FAULT CODE_^1_%JMP (KLCTT)_%RETURN VIA KERNEL_^1QSAVX NUM $0000_(TEMPORARY HOLD FOR Q-REGISTER_^1BZYCTR NUM $0000_(BUSY LOOP COUNTER_^1_%EJT_]_^1*_$NAM XFER_)ODS LEVEL II_106-03-75 REV 01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1€€*E_]_^1*_8LCTT READ/WRITE ROUTINES_^1*_8************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE READ/WRITE I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THESE ROUTINES CHECK IF LEGAL RECORD SIZE AND CALLS_^1*_$FAULT ROUTINE IF NOT. THE CORRECT PARITY IS GENERATED_^1*_$AND THE ADT TABLE IS SET UP. THE TYPE OF TRANSFER IS_^1*_€€$DETERMINED AND THE CORRECT ROUTINE (READ OR WRITE) IS_^1*_$CALLED. THE READ ROUTINE WILL EITHER EXECUTE A NORMAL_^1*_$READ OR A RECOVERY READ DEPENDING ON BIT 4 IN RFLAG IN_^1*_$THE PDT. THE WRITE ROUTINE WILL EITHER DO A WRITE OR_^1*_$A CONTROLLED BACKSPACE DEPENDING ON BIT 3 IN RFLAG._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NORMAL PARAMETERS IN PDT. SPEC€€IAL FLAGS ARE USED IN_^1*_$RFLAG IN THE PDT. THESE FLAG ARE:_^1*_]_^1*_)BIT 2 = 1 = READ IN OPPOSITE PARITY_^1*_)BIT 3 = 1 = EXECUTE CONTROLLED BACKSPACE_^1*_)BIT 4 = 1 = EXECUTE READ RECOVERY_^1*_]_^1*_$THEY ARE USED BY THE RECOVERY ROUTINES AND ARE_^1*_$CLEARED AFTER FUNCTION EXECUTED._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$CLEARS CONTROL FLAGS IN RFLAG AFTER FUNCTION EXECUTED.€€_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP, PARAMETERS NEEDED ARE_^1*_*ALREADY IN THE PDT._^1*_$EXIT IS A NORMAL RETURN TO CALLER._^1*E_]_^1*_8FLOW_^1*_8----_^1*_$1. CHECK IF REQUEST SHORT RECORD TYPE, IF SO CALL_^1*_(FAULT ROUTINE._^1*_$2. DETERMINE CORRECT PARITY FOR 7 TRACK._^1*_$3. SETUP ADT TABLE AND CALL READ OR WRITE ROUTINE._^1*_$4. IF READ DE€€TERMINE IF EITHER OPPOSITE PARITY_^1*_(OR RECOVERY READ FLAG SET. ENABLE MICRO INTERRUPT_^1*_(AND EXECUTE FUNCTION._^1*_$5. IF WRITE DETERMINE IF CONTROLLED BACKSPACE FLAG_^1*_(SET. ENABLE MICRO INTERRUPT AND EXECUTE FUNCTION_^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XFER *_^1*_6********_^1*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1XFER_€€!NUM 0_^1_%LDA- QSTWD4,I_$GET REQUEST PARAMETER_^1_%INA -NOISLN_%CHECK IF LENGTH.GE.NOISE LENGTH_^1_%SAP 1_^1_%JMP* NOISRX_'SHPRT RECORD ERROR_^1_%LDA- ECCOR,I_%INIT CURRENT WORD POINTERS_^1_%STA* FWA_^1_%LDA- ELSTWD,I_^1_%STA* LWA_^1_%ENA $0001_^1_%AND- ESTAT1,I_^1_%STA* MOTIDX_'SET R/W FLAG_^1_%LDA- UNTMOD,I_$THIS A 7TK UNIT_^1_%AND =N$0800_^1_%SAZ TK9RW_^1_%RTJ TK7DAT_'FO€€RMAT 7 TRACK DATA_^1_%RTJ TK7RW_(DETERMINE TYPE OF 7TK PARITY_^1TK9RW STA* PRITYC_'STORE PARITY_^1_%LDA* FWA_*SETUP ADT TABLE BUFFER POINTERS_^1_%SAN TK9RX_(IF THE FIRST WORD ADDRESS IS NOT ZERO, GO ON._^1_%SET A_,SET A TO $FFFF FOR FWA-1 IF THE START_^1_%SAM TK9RY_(ADDRESS IS ZERO._^1TK9RX INA -1_+ALL OTHER ADDRESSES ARE OK TO SET THIS WAY._^1TK9RY STA- ADTFW,I_%STORE FWA €€-1._^1_%LDA* LWA_^1_%INA -1_^1_%STA- ADTLW,I_%LAST WORD ADDRESS_^1_%LDA* MOTIDX_'R/W FLAG_^1_%SAZ READ_^1_%RTJ* WRADT_(DO THE WRITE_^1_%JMP* (XFER)_^1READ_!RTJ* RDADT_(DO THE READ_^1_%JMP* (XFER)_^1*_]_^1NOISRX ENA 31_+NOISE RECORD ERROR_^1_%JMP* FLCTT_^1*_]_^1*_]_^1FWA_"NUM 0_,CURRENT FIRST WORD ADDRESS_^1LWA_"NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT_]_^1* READ DATA ADT MODE_€€^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1RDADT NUM 0_^1_%LDA- ADTCW,I_%GET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%MASK OUT WRITE BIT_^1_%STA- ADTCW,I_^1_%LDA* PRITYC_^1_%STA* TPAR_)SAVE PARITY BIT_^1_%ENA $0004_^1_%AND- RFLAG,I_^1_%SAZ RD10A_(OPPOSITE PARITY NOT SET_^1_%TCA A_^1_%AND =N$0400_%COMPLIMENT PARITY BIT_^1_%STA* PRITYC_^1RD10A RTJ* ENBMIC_'ENABLE MIC€€RO INTERRUPT_^1_%ENA $0010_(RECOVERY READ IN PROGRESS_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, SELECT FUNCTION_^1_%INA 1_,OUTPUT READ FUNCTION_^1_%RTJ* SFUNC_(CLEAR OPPOSITE PARITY FLAG_^1_%ENA -$0014_'AND RECOVERY READ SWITCH_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA* TPAR_^1_%STA* PRITYC_'RESTORE PARITY_^1_%JMP* (RDADT)_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABL€€E WORD COUNT SET UP_^1*_]_^1WRADT NUM 0_^1_%LDA- ADTCW,I_%SET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%ADD WRITE_^1_%ADD =N$0800_^1_%STA- ADTCW,I_^1_%RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0008_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, EXECUTE ONE_^1_%INA 2_^1_%ADD- HAFWRD,I_$ADD HALF WORD BIT IF SET_^1_%RTJ* SFUNC_^1_%ENA -$0008_'CLEAR CB FLAG_^1_%AND- RFLAG,I_^1_€€%STA- RFLAG,I_^1_%JMP* (WRADT)_^1*_]_^1* ENABLE MICRO INTERRUPT_^1*_]_^1ENBMIC NUM 0_^1_%LDA- I_,SET UP POINTER TO ADT TABLE_^1_%INA ADTCW_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ =N$8000_%ENABLE BIT_^1_%NUM $0B06_(DEFINE MICRO INTERRUPT (DMI)_^1_%JMP* (ENBMIC)_^1*_]_^1MOTIDX NUM 0_,READ/WRITE FLAG, 1=WRITE_^1PRITYC NUM 0_,PARITY BIT (POSITIONED)_^1TPAR_!NUM 0_,TEMP PARITY ST€€ORAGE_^1_%EJT_]_^1*_$NAM XMOT_)ODS LEVEL II - LCTT_*07-01-75 REV-04_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT MOTION ROUTINES_^1*_8********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE MOTION I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS MODULE W€€ILL DECODE THE MOTION COMMAND AND EXECUTE_^1*_$THE NEXT MOTION COMMAND. THESE COMMANDS ARE ISSUED BY A_^1*_$SERIES OF SMALL SUBROUTINES. BEFORE THE COMMAND IS ISSUED_^1*_$THE CORRECT PARITY WILL FIRST BE DETERMINED. AFTER THE_^1*_$MOTION COMMAND IS ISSUED CONTROL WILL BE PASSED BACK TO_^1*_$THE CALLER. AN UNUED FUNCTION WILL BE TREATED AS A NOP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8€€------------------_^1*_]_^1*_$SEVERAL FLAG BITS IN THE PDT ARE USED BY THIS ROUTINE._^1*_*UNTMOD - BIT 11 - TYPE OF DRIVE (7 OR 9 TRACK)_^1*_*ESTAT1 - BIT 5 - MOTION REQUEST BIT (SET TO 1)_^1*_1- BIT 6 - REWIND FLAG (SET TO 1 IF REWIND)_^1*_1- BIT 8 - RECOVERY IN PROGRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF A REWIND COMMAND IS EXECUTED BIT 6 OF ESTAT1 WILL_^1*_$BE SET TO€€ INDICATE A REWINDIN PROGRESS. BIT 5 OF ESTAT1_^1*_$WILL BE SET TO INDICATE A MOTION REQUEST IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IF A SEVEN TRACK UNIT IS PRESENT THE ROUTINE TK7RW_^1*_$WILL BE CALLED TO DETERMINE THE PARITY TO BE USED._^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XMOT *_^1*€€_6********_^1*_]_^1* MOTION EXECUTION ANCILLARY ROUTINE_^1* ENTER WITH MOTION REQUEST, I = PDT POINTER_^1*_]_^1XMOT_!NUM 0_^1_%LDA- UNTMOD,I_$IS THIS A 7 TRACK UNIT_^1_%AND =N$0800_^1_%SAZ XMOT10_'NO, SKIP_^1_%RTJ* TK7RW_^1XMOT10 STA* PRITYC_^1_%ENA -$0020_^1_%AND- ESTAT1,I_^1_%ADD =N$0020_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$GET NUMBER OF WORDS_^1_%ARS 12_+SHIFT AND MASK_^1_€€%AND =N$0007_^1_%STA* MOTCOD_^1_%TRA Q_^1_%INA -8_^1_%SAP SUBMOT_'NOOP, ILLEGAL OPERATION_^1_%JMP* SUBMOT,Q_$EXECUTE FUNCTION_^1*_]_^1SUBMOT JMP* NOOP_)NO OPERATION (USED FOR STATUS)_^1_%JMP* BKSP_)BACKSPACE RECORD_^1_%JMP* WRFM_)WRITE FILE MARK_^1_%JMP* REW_*REWIND_^1_%JMP* REWUN_(REWIND UNLOAD_^1_%JMP* ADVAN_(SEARCH FILE MARK FORWARD_^1_%JMP* ERASE_(ERASE (DLU OR RECOVERY ONL€€Y)_^1_%JMP* ADVAN_(ADVANCE 1 RECORD_^1_%EJT_]_^1* REWIND_]_^1*_]_^1REW_"ENA -$0040_^1_%AND- ESTAT1,I_^1_%ADD =N$0040_^1_%STA- ESTAT1,I_^1_%ENA 5_,EXECUTE REWIND FUNCTION_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1REWUN ENA 6_,EXECUTE REWIND UNLOAD_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1BKSP_!ENA 4_,EXECUTE BACKSPACE_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* ERASE_]_^€€1*_]_^1ERASE LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAN 1_,YES, EXECUTE ERASE_^1_%JMP* NOOP_^1ERSX_!ENA 3_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* WRITE FILE MARK_^1*_]_^1WRFM_!LDA- UNTMOD,I_$GET 7TK BIT_^1_%AND =N$0800_^1_%SAZ WRFM9_^1_%RTJ* TK7WEF_'WRITE 7 TRACK TAPE MARK_^1_%JMP* (XMOT)_^1WRFM9 ENA 7_,EXECUTE 9TK FILEMARK_^1DOMOT RTJ* SFUNC_^1_%JMP* (XMOT)_^1*€€_]_^1*_]_^1* ADVANCE ONE RECORD OR FILE_^1*_]_^1ADVAN RTJ* BLOC+1_'CALCULATE ADDRESS OF BUFFER_^1BLOC_!ADC* ADVRB_^1_%NUM 0_^1_%LDA* BLOC+1_'GET PRESENT CORE ADDRESS_^1_%ADD* BLOC_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_^1_%INA 9_,ALLOW 9 WORDS_^1_%STA- ADTLW,I_%LWA OF BUFFER_^1_%RTJ RDADT_(EXECUTE A READ_^1_%JMP* (XMOT)_^1*_]_^1ADVRB BZS ADVRB(9)_$BUFFER FOR ADVAN€€CE RECORD_^1*_]_^1*_]_^1* FUNCTION OUTPUT_^1* ENTER WITH FUNCTION CODE IN A AND PARITY IN PRITYC_^1*_]_^1SFUNC NUM 0_^1_%ADD- UNTMOD,I_$ADD UNIT, DENSITY AND TRACK_^1_%ADD* PRITYC_'ADD PARITY_^1_%LDQ- EWES,I_^1_%INQ 8_,SET I/O_^1_%NUM $0B04_(SIO_^1_%NOP 0_,DELAY_^1_%NOP 0_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%JMP* (SFUNC)_^1*_]_^1*_]_€€^1* NO OPERATION - NO FUNCTION OUTPUT_^1*_]_^1NOOP_!JMP CL40_)ENTER CONTINUATOR AFTER INT PROCESS_^1*_]_^1MOTCOD NUM 0_,MOTION CODE THIS MOTION_^1_%EJT_]_^1*_$NAM TK7_*ODS LEVEL II - LCTT_*06-06-75 REV-01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1*_6*******_^1*_6* TK7 *_^1*_6*******_^1*_]_^1* DUMMY SEVEN-TRACK SPECIAL ROUTINES_€€^1*_]_^1* 7 TRACK READ/WRITE - DETERMINES PARITY_^1*_]_^1TK7RW NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%JMP* (TK7RW)_^1*_]_^1* 7 TRACK WRITE OF END OF FILE ROUTINE_^1*_]_^1TK7WEF NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%JMP* (TK7WEF)_^1*_$NAM TK7DAT_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER S€€YSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1*_6**********_^1*_6* TK7DAT *_^1*_6**********_^1* LCTT DUMMY 7 TRACK DATA FORMAT ROUTINE_^1*_]_^1TK7DAT NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1TK7DEX JMP* (TK7DAT)_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1*_$NAM RECVRY_'ODS LEVEL II - LCTT_*04-15-7€€5 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT RECOVERY ROUTINES_^1*_8**********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_*RECOVERY IS NOT IMPLEMENTED FOR RTOS 3 INITIALIZER._^1*_*-------- -- --- ----------- --- ---- - ------------_^1****_]_^1RECVRY NOP 0_^1_%RAO* RECVRY_'INCREMENT RETURN TO N€2O RECOVERY ADDRESS_^1_%JMP* (RECVRY)_^1_%END_]_^__2PABZLDL CSY/ C31 P€1_%NAM ABZLDL_'DECK-ID C31 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$9 TRACK ABSOLUTIZED SYSTEM LOADER FOR LCTT_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1***_"PURPOSE -_^1*_$-------_^1*_]_^1*_*ABZLD9 IS THE 9 TRACK ABSOLUTIZED LOADER, IT LOADS THE_^1*_*BINARY DATA OF THE RTOS SYSTEM._^1*_]€€_^1*_]_^1****_!*****************************************************************_^1*_$ENTRY POINTS_^1*_$*****************************************************************_^1_%ENT ABZLD9_'9 TRACK ABSOLUTIZED LOADER_^1*_$*****************************************************************_^1*_$EQUIVALENCES_^1*_$*****************************************************************_^1_%EQU D€€EVICE(9)_#MAG TAPE EQUIP CODE_^1****_]_^1_%SPC 2_^1***_]_^1*S2_"GENERAL DESCRIPTION -_^1*_$------- -----------_^1*_]_^1*_$PROGRAM IS ALWAYS LOADED AT LOCATION 0._^1*_]_^1*_$MAGNETIC TAPE UNIT 0, EQUIPMENT CODE 9._^1*_*TAPE RUNS ON ADT._^1*_]_^1*_]_^1*S2_"SUBROUTINE ABZLD9 -_^1*_$---------- ------_^1*_]_^1*_$PURPOSE -_^1*_]_^1*_$ABZLD9 IS THE 9 TRACK ABSOLUTIZED LOADER._^1*_]_^1*_]€€_^1*_$ANALYSIS -_^1*_]_^1*_$ABZLD9 INITIALIZES POINTERS, CALCULATES THE CURRENT CORE_^1*_$ADDRESS INTO WHICH LOCATION THE HEADER DATA WILL START LOADING._^1*_]_^1*_$THE UNIT IS SELECTED AND CHECKED FOR OPERATIVE, NOT BUSY_^1*_$THE SIX WORD HEADER IS READ INTO TYPE ---, AND BINARY DATA_^1*_$IT LOADS THE BINARY DATA STARTING AT LOCATION 0 UNITL A FILE_^1*_$MARK IS DETECTED. IT THEN €€CHECKS THE CHECKSUM AND IF OK, IT_^1*_$STARTS THE SYSTEM; OTHERWISE, THE SYSTEM HANGS._^1*_]_^1_%SPC 1_^1ABZLD9 ENA 0_,INITIALIZE POINTERS_^1_%STA* TYPE_^1_%STA* NORECD_^1_%STA* FNLEN_^1_%STA* RECDRD_^1*_]_^1_%RTJ* SELF_)GENERATE THIS PROGRAM LOCATION_^1SELF_!NOP 0_^1_%LDA* SELF_)SET UP LOCATION FOR HEADER DATA TO BE LOADED_^1_%INA TYPE-SELF_^1_%STA* COREAD_^1*_]_^1_%EQU HERE(€€SELF)_^1_%SPC 1_^1LOOP_!RTJ* UNTSLT_^1_%RTJ* STATUS_^1_%AND* H0003_^1_%SAZ READY-*-1_#SKIP WHEN READY_^1_%JMP* LOOP_^1_%SPC 2_^1READY LDA* COREAD_'ADDRESS_^1_%ENQ 6_,NO. WORDS_^1_%RTJ* READ_^1_%RTJ* WAIT_^1_%ENA 0_^1_%STA* COREAD_'SET TO LOCATION 0 FOR PROGRAM_^1GETSYS LDA* COREAD_^1_%LDQ* FNLEN_(FINAL LENGTH_^1_%RTJ* READ_^1_%RTJ* WAIT_^1_%RAO* COREAD_^1_%RAO* RECDRD_'BUMP R€€ECORD COUNT BY 1_^1_%LDA* RECDRD_'CHECK IF ALL RECORD BEEN READ_^1_%SUB* NORECD_^1_%SAZ CHKFIL_^1_%JMP* GETSYS_'TO REPEAT_^1CHKFIL RTJ* STATUS_'READ STATUS_^1_%ARS 3_,SHIFT TAPE MARK TO BIT 11_^1_%AND* H0800_^1_%SAZ CHKLEN_'IT IS FILE MARK, TO CHECK CHECKSUM_^1_%JMP* STOP_^1CHKLEN LDQ* FNLEN_^1GETSUM INQ -1_+DECREMENT COUNTER BY 1 AND CHECK IF DONE_^1_%SQM ENDSUM_'SKIP WHEN DO€€NE_^1_%ADD* (GO+1),Q_$CALCULATE CHECKSUM_^1_%JMP* GETSUM_^1ENDSUM SUB- I_,SUBTRACT OUT I REGISTER_^1_%TCA A_^1_%INQ -6_+DECREMENT INDEX TO GET CHECKSUM_^1_%ADD* (COREAD),Q_"CHECK IF CHECK SUM OK_^1_%INA 0_^1_%SAZ 1_^1STOP_!NUM $18FF_(CHECKSUM NO GOOD OR TAPE HAS WRONG FORMAT_^1_%LDA* COREAD_^1_%ENQ 1_,1 WORD XFER_^1_%RTJ* READ_)READ TO ADVANCE THE FILE MARK_^1_%RTJ* WAIT_)WAI€€T TILL NOT BUSY_^1GO_#JMP+ 0_^1_%SPC 2_^1TYPE_!NUM 0_,INITIALIZER TYPE_^1NORECD NUM 0_,NO. OF RECORDS IN TAPE_^1FNLEN NUM 0_,TOTAL LENGTH OF SYSTEM_^1DUMMY BZS DUMMY(4)_$ALLOWS 6 WORD HEADER + 1 PAD_^1RECDRD NUM 0_,NO. OF RECORDS READ_^1*_]_^1_%SPC 2_^1H0003 NUM $0003_^1H0800 NUM $0800_(FILE MARK BIT_^1STA_"NUM 0_^1TEMP_!NUM 0_^1_%EJT_]_^1****************************€€***********************_^1*_]_^1*_$COMMON SUBROUTINES FOR THE LCTT_^1*_]_^1***************************************************_^1_%SPC 2_^1*_]_^1*_$UNIT SELECT CODE_^1*_]_^1_%SPC 1_^1UNTSLT NUM 0_^1_%LDQ* EWES_)EQUIP CODE_^1_%INQ 8_,ADD DIRECTION CODE_^1_%LDA* UNTMOD_'UNIT/MODE IN FO_^1_%INA 8_,SELECT BIT_^1_%NUM $B04_)SET I/O SELECT (SIO)_^1_%NOP 0_^1_%NOP 0_^1_%JMP* (UNTS€€LT)_^1_%SPC 2_^1*_]_^1*_$CLEAR MACRO INTERRUPT_^1*_]_^1_%SPC 1_^1CLRMAC NUM 0_^1_%LDQ* EWES_)EQUIP CODE_^1_%NUM $B05_)CLEAR MACRO INT (SPS)_^1_%JMP* (CLRMAC)_^1_%SPC 2_^1*_]_^1*_$READ STATUS_^1*_]_^1_%SPC 1_^1STATUS NUM 0_^1_%LDQ* EWES_)EQUIP CODE_^1_%NUM $B04_)SAMPLE STATUS (SIO)_^1_%JMP* (STATUS)_^1_%SPC 2_^1*_]_^1*_$ENABLE MICRO INTERRUPT_^1*_]_^1_%SPC 1_^1ENBMIC NUM €€0_^1_%LDA* HERE_^1_%ADD =XADTCW-HERE_^1_%LDQ* MICROI_'MICRO INT LINE_^1_%ADQ =N$8000_%ADD ENABLE BIT_^1_%NUM $B06_)DEFINE MICRO INT (DMI)_^1_%JMP* (ENBMIC)_^1_%SPC 2_^1*_]_^1*_$SEND FUNCTION_^1*_]_^1*_$A = FUNCTION_^1*_]_^1*_$RTJ SFUNC_^1_%SPC 1_^1SFUNC NUM 0_^1_%ADD* UNTMOD_'UNIT/MODE IN FO_^1_%ADD* PARITY_'PARITY CODE_^1_%LDQ* EWES_)EQUIP CODE_^1_%INQ 8_,OUT DIRECTION_^1€€_%NUM $B04_)(SIO_^1_%NOP 0_,WAIT_^1_%NOP 0_^1_%LDQ* EWES_)EQUIP CODE_^1_%NUM $B05_)CLR MACRO INT (SPS)_^1_%JMP* (SFUNC)_%RETURN_^1_%SPC 2_^1*_]_^1*_$READ SUB_^1*_]_^1_%SPC 1_^1READ_!NUM 0_^1_%RTJ* ADRESS_'COMPUTE ADDRESSES_^1_%LDA* ADTCW_^1_%AND* HF7FF_(CLEAR WRITE BIT_^1_%STA* ADTCW_^1_%SPC 1_^1_%RTJ* ENBMIC_^1_%SPC 1_^1_%ENA 1_,READ CODE_^1_%RTJ* SFUNC_(SEND FUNCTION_^1€€_%JMP* (READ)_^1_%SPC 2_^1*_]_^1*_$COMPUTE ADDRESSES ROUTINE_^1*_]_^1_%SPC 2_^1ADRESS NUM 0_,ENTRY_^1_%AAQ Q_,FWA + N = LWA+1_^1_%STQ* LWA_*LWA+1_^1_%SET Q_^1_%SAZ STRFWA_'FWA = 0 SO FWA SET TO FFFF_^1_%INA -1_+NORMAL FWA - 1_^1_%TRA Q_^1STRFWA STQ* FWA_^1_%JMP* (ADRESS)_$RETURN CALLER_^1_%SPC 3_^1*_$ADT CONTROL WORDS TABLE_^1*_]_^1_%SPC 1_^1ADTCW NUM $8480_(EQUIP, REA€€D/WRITE, WORD/CHAR_^1FWA_"NUM 0_,FIRST WORD ADDRESS -1_^1_%EQU COREAD(FWA)_^1LWA_"NUM 0_,LAST WORD ADDRESS_^1DUMWRD NUM 0_,DUMMY_^1_%SPC 2_^1*_]_^1*_$WRITE SUBROUTINE_^1*_]_^1_%SPC 1_^1WRITE NUM 0_^1_%RTJ* ADRESS_'COMPUTE ADDRESSES_^1_%LDA* ADTCW_^1_%AND* HF7FF_(CLEAR WRITE BIT_^1_%ADD =N$800_'SET WRITE_^1_%STA* ADTCW_^1_%SPC 1_^1_%RTJ* ENBMIC_^1_%SPC 1_^1_%ENA 2_,WRITE€€ CODE_^1_%RTJ* SFUNC_(SEND FUNCTION_^1_%JMP* (WRITE)_%RETURN_^1_%SPC 2_^1*_]_^1*_$WAIT SUBROUTINE_^1*_]_^1_%SPC 1_^1WAIT_!NOP 0_^1WAIT0X ENA 3_,SET FLAG FOR DELAY_^1WAIT00 STA* BZYCTR_^1_%LDA =N$0FFF_%DELAY APPROX. 10 MS_^1WAIT01 INA -1_^1_%SAZ WAIT02_^1_%JMP* WAIT01_^1WAIT02 LDQ* EWES_)EQUIPMENT CODE_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%AND =N$0002_%IS IT BUSY_^1_%SAZ €€WAIT03_'NO_^1_%JMP* WAIT0X_'YES, DELAY AND TRY AGAIN_^1WAIT03 LDA* BZYCTR_'DONE WITH DELAY LOOP YET_^1_%SAZ WAIT04_'YES_^1_%INA -1_+WAIT AGAIN_^1_%JMP* WAIT00_^1WAIT04 NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%JMP* (WAIT)_'RETURN_^1_%SPC 2_^1BZYCTR NUM $0000_(BUSY LOOP COUNTER_^1UNTMOD NUM $100_)UNIT/MODE/DENSITY_^1EWES_!NUM $480_)EQUIP C€VODE_^1PARITY NUM 0_^1HF7FF NUM $F7FF_^1MICROI NUM 9_,MICRO INT LINE_^1_%END_]_^__ VPABZLDC CSY/ C32 P€1_%NAM ABZLDC_'DECK-ID C32 PERIPH. DRIVERS 1.0C SUMMARY-106_^1*_$RTOS SYSTEM LOADER FOR CARDS_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1***_]_^1*_$FUNCTION_^1*_$--------_^1*S1_]_^1*_$THIS ROUTINE IS USED TO LOAD AN RTOS SYSTEM FROM AN ABSOLUTIZED_^1*_$DECK OF CARDS PRODUCED BY THE CONV€€ERSION PROGRAM CONSYS FROM A_^1*_$7 OF 9 TRACK SYSTEM TAPE THAT WAS PRODUCED BY THE RTOS SYSTEM_^1*_$INITIALIZER._^1_%SPC 2_^1****_]_^1*_$*****************************************************************_^1*_$ENTRY POINTS_^1*_$*****************************************************************_^1_%ENT ABZLDC_^1****_]_^1_%SPC 3_^1***_"GENERAL DESCRIPTION_^1*_$-------------------_^1€€*S1_]_^1*_$THIS PROGRAM WILL INITIATE A FEED, READ A CARD (COLUMN-BY-COLUMN)_^1*_$AND PACK-UNPACK 12-BIT BINARY INTO 16-BIT BINARY IMAGES. EACH_^1*_$16-BIT IMAGE IS PLACED INTO A WORD IN CORE._^1*S2_]_^1*_$THIS LOADER IS USED WITH AN 1829-3 CARD READER._^1*_$THE EQUIPMENT NUMBER OF THE READER IS ASSUMED TO BE 11. 100*3555_^1*_$IF THE EQUIPMENT NUMBER IS 10, THE EQUIPMENT CODE IS_€€#100*3555_^1*_$CHANGED AND THE PROGRAM RETRIES THE OPERATION._*100*3555_^1*S2_]_^1*_$THIS PROGRAM MUST BE ABSOLUTIZED INTO A DEADSTART DECK USING_^1*_$THE CONVERSION PROGRAM DEADS._^1*S2_]_^1*_$DEFINITIONS_^1*_$-----------_^1*S1_]_^1*_$MAXIMG - PROGRAM SIZE_^1*_$LOCATN - CORE ADDRESS OF CURRENT WORD BEING LOADED_^1*_$CARDNO - CARD NUMBER OF CARD BEING READ_^1*_$OLDSNO - NEXT SEQUEN€€CE NUMBER TO BE READ_^1*_$COLCNT - INDEX FOR COLUMN COUNT_^1*_$NOIN4 - COLUMN INDEX WITHIN EACH GROUP OF 4 COLUMNS_^1*_$SEQ1 - NUMBER FOR THE ADDITION OF 1 TO THE SEQUENCE NO_^1*_$FEED - CR FEED REQUEST ONLY_^1*_$EQUIP AND EQUIPD - CARD READER EQUIPMENT CODE_^1*_$SUM - CHECKSUM_^1_%EJT_]_^1ABZLDC ENA 1_,SET CARD NUMBER = 1_^1_%STA* CARDNO_^1_%SLS 0_^1_%ENA $50_^1_%STA* OLDSNO_'S€€ET OLD SEQUENCE NUMBER = 0_^1_%CLR A_^1_%STA* SUM_*CLEAR CHECKSUM_^1_%STA* LOCATN_'CLEAR CORE ADDRESS POINTER_^1_%JMP* DOWHL2_^1CRWHL1 LDA* LOCATN_'CHECK THAT WERE NOT OVER THE MAX CORE ADDRESS_^1_%EOR* MAXIMG_^1_%SAN DOWHL2_^1_%JMP* VERCKS_^1DOWHL2 ENA 1_,SET COLUMN COUNT = 1_^1_%STA* COLCNT_^1_%LDA* FEED_)FEED A CARD_:100*3555_^1_%LDQ =N$5A1_'WES CODE, EQUIP 11_3100*3555_^1FE€€ED1 OUT REJX-*_(FEED_A100*3555_^1_%STQ* EQUIPD_'SAVE WES CODE_8100*3555_^1CRWHL2 LDA* COLCNT_'CHECK IF CARD IS COMPLETE_^1_%INA -81_^1_%SAN CONCR2_^1_%JMP* CRWHL1_'FINISHED WITH CARD - GO GET ANOTHER ONE_^1CONCR2 ENA 1_,SET NO-IN-FOUR = 1_^1_%STA* NOIN4_^1CRWHL3 LDA* NOIN4_(CHECK IF FINISHED WITH THIS GROUP OF 4 COLS_^1_%INA -5_^1_%SAN CONCR3_'SKIP IF STILL IN SAME GROUP OF 4€€_^1_%JMP CRWHL2_^1CONCR3 LDQ* EQUIPD_'READ A COLUMN OF DATA_0100*3555_^1_%INQ -1_Q100*3555_^1_%INP -1_^1_%RTJ PKUNCR_'CALL UNPACK/PACK 12-16_^1_%LDA* COLCNT_'IF FIRST COLUMN, ITS THE SEQUENCE NUMBER_^1_%INA -1_^1_%SAZ 1_^1_%JMP* CONCR5_^1_%TRQ A_,CHECK THAT SEQ NUMBER IS CORRECT_^1_%EOR* OLDSNO_^1_%SAZ CONCR4_^1_%TRQ A_^1_%SUB =N$F0_(CHECK FOR EOF_^1_%SAN 1_^1_%JMP* VERCKS€€_'EOF - GO VERIFY CHECKSUM_^1_%SPC 1_^1_%NUM $18FF_(SEQUENCE ERROR, NOT EOF - STOP_^1REJX_!NOP 0_R100*3555_^1_%LDQ =N$521_'WES CODE, EQUIP 10_3100*3555_^1_%JMP* FEED1_(TRY AGAIN_<100*3555_^1_%SPC 2_^1CONCR4 LDA* SEQ1_)CALC NEXT SEQUENCE NUMBER_^1_%ADD* OLDSNO_^1_%STA* OLDSNO_^1_%TRQ A_4ADD SEQUENCE NO INTO CHECKSUM_^1_%ADD* SUM_^1_%STA* SUM_^1_%JMP* CONCR6_^1CONCR5 LDA* CARDN€€O_'CHECK IF CARD NO =1 AND COL COUNT = 3_^1_%INA -1_^1_%SAN NOCRD1_^1_%LDA* COLCNT_^1_%INA -3_^1_%SAN NOCRD1_^1_%TRQ A_-IT IS - ITS THE LENGTH OF THE FILE_^1_%ADD* SUM_*ADD LENGTH TO CHECKSUM_^1_%STA* SUM_^1_%TCQ Q_,RESET MAX CORE ADDRESS_^1_%INQ 1_,= PROGRAM LENGTH + 1_^1_%STQ* MAXIMG_^1_%RAO* CARDNO_'INCREASE CARDNO_^1_%JMP* CONCR6_^1NOCRD1 LDA* COLCNT_'IF COLUMN IS AT LEAS€€T 3, DO NORMAL PROCESSING_^1_%INA -3_+(NO INFO ENDS IN COLUMN 2)_^1_%SAM CONCR6_^1STRDAT LDA* NOIN4_(CHECK FOR FIRST COLUMN IN GROUP OF 4_^1_%INA -1_^1_%SAZ CONCR6_'IF FIRST-OF-4, HEX WORD ENDS IN COL 2 - DONT_^1*_ESAVE THE WORD_^1_%STQ* (LOCATN)_$NOT FIRST-OF-4 - SAVE THE WORD_^1_%ADQ* SUM_*INCLUDE IT IN THE CHECKSUM_^1_%STQ* SUM_^1_%RAO* LOCATN_'INCREASE CORE LOCATION BY 1_^1€€CONCR6 RAO* NOIN4_(INCREASE NO-IN-FOUR BY 1_^1_%RAO* COLCNT_'INCREASE COLUMN COUNT BY 1_^1_%LDA* LOCATN_'CHECK FOR MAXIMUM LOAD ADDR REACHED_^1_%EOR* MAXIMG_^1_%SAN ENDCR3_'SKIP IF NOT YET_^1_%JMP* VERCKS_'MAX CORE ADDR REACHED - GO VERIFY CHECKSUM_^1*_8(LAST WORD READ WAS CHECKSUM FROM LOAD)_^1ENDCR3 JMP* CRWHL3_^1_%SPC 3_^1VERCKS LDA* SUM_*IF CHECKSUM OK_^1_%SUB- I_,ADJUST TO R€€EMOVE VALUE OF I-REG._^1_%SAN CKSMER_^1_%JMP+ 0_,BEGIN EXECUTION OF SYSTEM_^1CKSMER NUM $18FF_(ENDIF_^1_%SPC 4_^1SEQ1_!NUM $0100_^1COLCNT NUM 0_^1MAXIMG NUM 1_^1CARDNO NUM 1_^1OLDSNO NUM $0050_^1LOCATN NUM 0_^1NOIN4 NUM 1_^1EXECLD NUM 0_^1FEED_!NUM $0080_^1EQUIPD NUM $0521_(W,E,S EQUIP CODE FOR DIRECTOR STATUS_^1*_81 CARD DELETED_7100*3555_^1SUM_"NUM 0_^1_%EJT_]_^1**€€*_]_^1*E_#DETAILS OF OPERATION_^1*_$---------------------_^1*_$PKUNCR IS THE ROUTINE WHICH UNPACKS THE 12-BIT BINARY CODE FROM_^1*_$A CARD AND PACKS IT INTO THE 16-BIT BINARY IMAGE REQUIRED FOR_^1*_$EACH WORD IN MEMORY._^1*S1_]_^1*_$IT WILL PACK A FOUR COLUMN, 12-BIT IMAGE PER COLUMN INPUT INTO_^1*_$THREE 16-BIT IMAGES._^1*S1_]_^1*_$THE BIT BREAKDOWN, BY COLUMN, IS AS FOLLOWS:_^1*S€€1_]_^1*_'COLUMN 1 - HIGH ORDER 12 BITS OF FIRST WORD_^1*_'COLUMN 2 - LOW ORDER 4 BITS OF FIRST WORD AND_^1*_2HIGH ORDER 8 BITS OF SECOND WORD_^1*_'COLUMN 3 - LOW ORDER 8 BITS OF SECOND WORD AND_^1*_2HIGH ORDER 4 BITS OF THIRD WORD_^1*_'COLUMN 4 - LOW ORDER 12 BITS OF THIRD WORD_^1*S2_]_^1*_$EACH TIME THE ROUTINE IS CALLED, IT FIGURES OUT WHICH COLUMN,_^1*_$OUT OF A GROUP OF FOUR CO€€LUMNS, IT PRESENTLY IS IN. IT DOES THIS_^1*_$USING THE FLAG NOIN4. THIS DETERMINES HOW MUCH OF THE PRESENT_^1*_$MEMORY WORD HAS ALREADY BEEN OBTAINED (AND SAVED IN PARTAL) AND_^1*_$HOW MANY BITS FROM THE PRESENT COLUMN ARE NEEDED TO COMPLETE THE_^1*_$PRESENT WORD. THE 16-BIT IMAGE, WHEN COMPLETED, IS PLACED IN_^1*_$THE Q REGISTER WHEN THE ROUTINE EXITS. THE REMAINING BITS IN_^1€€*_$THE PRESENT COLUMN ARE SAVED IN PARTAL, TO BECOME PART OF THE_^1*_$NEXT WORD._^1_%SPC 2_^1PARTAL NUM 0_^1*_]_^1PKUNCR NUM $FFFF_^1_%TRA Q_,SAVE INPUT IMAGE_^1_%LDA NOIN4_(IF NO-IN-FOUR = 1_^1_%INA -1_^1_%SAN CONPK1_^1_%LLS 4_,THEN SAVE 12 BIT IMAGE_^1_%STQ* PARTAL_^1_%JMP* (PKUNCR)_^1CONPK1 INA -1_+ELSE IF NO-IN-FOUR = 2_^1_%SAN CONPK2_^1_%LLS 8_,THEN PACK FIRST 16_^1€:_%JMP* PAK16_(SAVE REMAINING_^1CONPK2 INA -1_+ELSE IF NO-IN-FOUR = 3_^1_%SAN CONPK3_^1_%LLS 12_+THEN PACK SECOND 16_^1_%JMP* PAK16_(SAVE REMAINING_^1CONPK3 TRQ A_-ELSE PACK THIRD 16_^1_%CLR Q_^1PAK16 EOR* PARTAL_^1_%STQ* PARTAL_^1_%TRA Q_,RETURN WITH HEX CHARACTER IN Q_^1_%JMP* (PKUNCR)_^1_%END ABZLDC_^__ :PD18325 CSY/ C33 P€1_%NAM D18325_'DECK-ID C33 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$CASSETTE KERNAL DRIVER_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_8CASSETTE DRIVER_^1*_8***************_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THE KERNEL DRIVER PROCESSES REQUESTS FOR THE_^1*_$CASSETTE MAG TAPE€€_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$THE KERNEL DRIVER IS THE INTERFACE BETWEEN THE_^1*_$OPERATING SYSTEM AND THE CASSETTE KERNEL._^1*_$SPECIFICALLY, THE DRIVER HANDLES FIND NEXT_^1*_$REQUEST, COMPLETE REQUEST, ERROR LOGGING IN THE_^1*_$ENGINEERING FILE, AND ALTERNATE DEVICE HANDLER._^1*_$THE DRIVER HAS THE CAPABILITY OF OPERATING FROM_^1*_$CORE OR MA€€SS MEMORY RESIDENCY._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$1. CALLS MAKEQ TO SET V FIELD IN REQUEST._^1*_$2. CALLS LOG TO OUTPUT LU AND FAULT CODE._^1*_]_^1_%EJT 1_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1. ENTRY - THE ENTRY POINT (ICAS) IS SCHEDULED_^1*_(BY THE €€REQUEST PROCESSOR. THE Q-REGISTER_^1*_(CONTAINS THE ADDRESS OF THE PDT WITH THE REQUEST._^1*_]_^1*_$2. EXIT - THE DRIVER EXITS TO THE DISPATCHER WHEN_^1*_(THERE ARE NO FURTHER REQUESTS TO PROCESS._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. SAVE PDT ADDRESS IN I REGISTER._^1*_$2. IF THE DRIVER IS BUSY THEN_^1*_*RETURN TO DISPATCHER._^1*_(ELSE_^1*_*SET THE DRIVER BUSY._^1*_$3. CALL FIN€€D NEXT REQUEST._^1*_$4. IF NO REQUEST FOUND THEN_^1*_$4A. GET NEXT PDT_^1*_*IF THIS IS STARTING PDT THEN_^1*_,EXIT_^1*_*ELSE_^1*_,GO TO 3_^1*_(ELSE_^1*_$5._!CALL KERNEL._^1*_$6._!CALL MAKEQ TO SET UP V FIELD._^1*_$7._!IF NO ERROR OR IF LU IS DIAGNOSTIC THEN_^1*_,CALL COMPRQ TO COMPLETE REQUEST._^1*_*ELSE_^1*_,LOG THE ERROR IN ENGINEERING FILE._^1*_,SCHEDULE ALTERNATE DEVICE HANDLE€€R._^1*_,GO TO 4A._^1*_$8._!GO TO 3._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$FNR_"- FIND NEXT REQUEST_^1*_$KCAS_!- CASSETTE KERNEL_^1*_$MAKEQ - DEFINE V FIELD_^1*_$ALTDEV - ALTERNATE DEVICE HANDLER_^1*_$LOG_"- LOG ERROR IN ENGINEERING FILE_^1*_$COMPRQ - COMPLETE REQUEST_^1*_]_^1_%EJT 1_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT ICAS_^1_%ENT I18325_'INITIATOR ENTRY FO€€R MSOS/RTOS_^1_%ENT ICPDT_(CURRENT PDT ADDRESS (BUSY FLAG)_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1_%EXT ALTDEV_'ALTERNATE DEVICE HANDLER_^1_%EXT CCAS_)KERNEL CONTINUATOR_^1_%EXT ECAS_)KERNEL DIAGNOSTIC TIME OUT_^1_%EXT* KCAS_)KERNEL INITIATOR_^1_%EXT LOG_*ENGINEERING ERROR LOGGER_^1_%EXT MAKEQ_(MSOS ROUTINE_^1_%EXT MAS300_'MASS STORAGE DRIVER_^1_%EJT 1_^1€€*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^€€1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU€€ RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRU€€PT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)€€_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU COMPRQ($B6)_!COMPLETE REQUEST ADDRESS_^1_%EQU DISP($EA)_#DISPATCHER ADDRESS_^1_%EQU FNR($B5€€)_$FIND NEXT REQUEST ADDRESS_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU ZERO($22)_#ZERO WORD CONSTANT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1_%EJT 1_^1*_]_^1*_8MISCELLANEOUS_^1*_8-------------_^1*_]_^1*_$CASSETTE HARDWARE REGISTER DEFINITIONS_^1*_]_^1*_/***************************************_^1*_/*_*CONTROL FUNCTIONS_(*_^1*_/*€€**************************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$CLEAR CONTROLLER_^1*_$1_$CLEAR INTERRUPT_^1*_$2_$ENABLE INTERRUPT ON DATA_^1*_$3_$ENABLE INTERRUPT ON END OF OPERATION_^1*_]_^1*_$4_$ENABLE INTERRUPT ON ALARM_^1*_$5_$ECHO MODE_^1*_$6_$ADT MODE_^1*_$7_$MOTION CONTROL_^1*_]_^1*_$8_$MOTION CONTROL_^1*_$9_$MOTION CONTROL_^1*_$10_#MOTION CONTROL_^1*_$11_#UN€€IT 0/1 SELECTION_^1*_]_^1*_$12_#SELECT ENABLE_^1*_$13_#NOT USED_^1*_$14_#NOT USED_^1*_$15_#NOT USED_^1*_]_^1*_/***************************_^1*_/*_$MOTION CONTROL_#*_^1*_/***************************_^1*_]_^1*_(BITS_+FUNCTION_^1*_]_^1*_$/10/ 9/ 8/ 7/_^1*_'1 0 0 0_%SEARCH TAPE MARK (REVERSE)_^1*_'1 0 0 1_%SEARCH TAPE MARK (FORWARD)_^1*_'1 0 1 0_%WRITE TAPE MARK_^1*_'1 0 1 €€1_%WRITE ONE RECORD_^1*_'1 1 0 0_%BACKSPACE ONE RECORD (OR TAPE MARK)_^1*_'1 1 0 1_%REWIND_^1*_'1 1 1 0_%ERASE_^1*_'1 1 1 1_%READ ONE RECORD_^1*_]_^1_%EJT_]_^1*_/****************************_^1*_/* HARDWARE STATUS REGISTER *_^1*_/****************************_^1*_]_^1*_)BIT ASSIGNMENT_^1*_]_^1*_*0 READY_^1*_*1 BUSY_^1*_*2 WRITE ENABLED_^1*_*3 DATA (AVAILABLE/REQUEST)€€_^1*_]_^1*_*4 EOP (END OF OPERATION)_^1*_*5 ALARM_^1*_*6 LOST DATA (OVERFLOW(READ)/UNDERFLOW(WRITE))_^1*_*7 CONTROLLER PROTECTED (DURING WRITE)_^1*_]_^1*_*8 CRC/FORMAT ERROR_^1*_*9 EOT (END OF TAPE)_^1*_)10 BOT (BEGINNING OF TAPE)_^1*_)11 TAPE MARK_^1*_]_^1*_)12 SIDE A/B (SET = B)_^1*_)13 UNIT 0/1 (SET = 1)_^1*_)14 DATA AVAILABLE_^1*_)15 ADT MODE_^1*_]_^1*_]_^1*_/******€€**********************_^1*_/* ESTAT2 (COMPOSED STATUS) *_^1*_/****************************_^1*_]_^1*_)BIT ASSIGNMENT_^1*_]_^1*_*0 READY_^1*_*1 BUSY_^1*_*2 RECOVERED ERROR_^1*_*3 DATA_^1*_]_^1*_*4 EOP (END OF OPERATION)_^1*_*5 ALARM_^1*_*6 LOST DATA_^1*_*7 PROTECTED_^1*_]_^1*_*8 CRC/FORMAT ERROR_^1*_*9 EOT (END OF TAPE)_^1*_)10 BOT (BEGINNING OF TAPE)_^1*_)11 FILE MARK_^€€1*_]_^1*_)12 IRRECOVERABLE ERROR_^1*_)13 OVERFLOW (DATA BYPASSED)_^1*_)14 SIDE B_^1*_)15 WRITE ENABLE_^1****_]_^1_%EJT 1_^1*_]_^1*_]_^1*_]_^1* ENTRY FROM MASDRV/DBLDRV_^1* ABSOLUTIZE PROGRAM RELOCATABLE ADDRESS_^1*_]_^1*_]_^1MASCAS STQ- I_,SAVE PHYSTAB ADDRESS_^1_%STQ* STRPDT_'SAVE STARTING PDT_^1_%STA* LOCN_)SAVE LOCATION OF DRIVER_^1_%SPC 1_^1_%LDA- (ZERO),Q_^1_%STA* IADEV+€€1_%SET SCHEDULER PRIORITY_^1_%SPC 1_^1MAS05 LDA* LOCN_)GET DRIVER LOCATION_^1_%TRA Q_^1_%INQ ICAS-MASCAS_!GET OFFSET TO INITIATOR_^1_%STQ- 1,I_*STORE INITIATOR ADDRESS IN PDT_^1_%SPC 1_^1_%LDQ =XCCAS_'GET CONTINUATOR ADDRESS_^1_%AAQ Q_,ADD TO STARTING ABS. ADDRESS_^1_%STQ- 2,I_*STORE CONTINUATOR ADDRESS IN PDT_^1_%SPC 1_^1_%LDQ =XECAS_'GET TIMEOUT ADDRESS_^1_%AAQ Q_,ADD S€€TARTING ABSOLUTE ADDRESS_^1_%STQ- 3,I_*STORE TIMEOUT ADDRESS IN PDT_^1_%SPC 1_^1_%LDA- ELINK,I_%CHECK IF ANOTHER PDT ON THREAD_^1_%TRA Q_0*_^1_%SUB* STRPDT_+* SUBTRACT TO TEST EQUALITY_^1_%SAZ ICAS_-* NO MORE PDTS, GO TO INITIATOR_^1_%STQ- I_0* YES, SAVE NEXT PDT ADDRESS IN I_^1_%JMP* MAS05_(GO BACK TO SET UP ADDRESSES IN NEXT PDT_^1_%SPC 2_^1*_]_^1LOCN_!NUM 0_,LOCATION OF DRI€€VER_^1STRPDT NUM 0_,STARTING PDT_^1_%EJT 1_^1*_6********_^1*_6* DCAS *_^1*_6********_^1*_]_^1* ENTERED THROUGH MASCAS BY REQUEST PROCESSOR_^1*_]_^1*_]_^1ICAS_!LDA- 0_,CHECK IF KERNAL BUSY_^1_%EQU I18325(ICAS) INITIATOR ENTRY FOR MSOS/RTOS_^1ICPDT NUM 0_0* ADDRESS OF CURRENT PDT_^1_%SAZ INBSY_,* NOT BUSY_^1_%JMP- (DISP)_+* YES BUSY, GO AWAY_^1_%SPC 2_^1INBSY STQ* ICPDT_(SET€€ BUSY FLAG WITH CURRENT PDT_^1_%STQ- I_,PUT CURRENT PDT IN I-REG_^1_%SPC 1_^1IFNR_!RTJ- (FNR)_(FIND NEXT REQUEST_^1_%JMP* INPT_)1 NO REQUEST THIS PDT_^1_%LDQ- I_,2 FOUND REQUEST_^1_%STQ* ICPDT_(SET BUSY FLAG WITH CURRENT PDT_^1_%SPC 1_^1_%RTJ KCAS_)CALL KERNAL_^1_%STA* IFAIL_(SAVE ERROR FLAG_^1INFO5 LDA- ADTFW,I_%GET ADDRESS OF THE LAST DATA TRANFERRED_^1_%INA 1_,INCREMENT FOR€€ CURRENT LOCATION FOR DATA_^1_%STA- ECCOR,I_%SAVE PDT TABLE_^1_%SPC 1_^1INF10 RTJ MAKEQ_(SET UP V-FIELD_^1_%LDA* IFAIL_(CHECK IF ERROR TO LOG_^1_%SAN ILOG_-* YES, GO LOG_^1_%JMP* ICRQ_-* NO, GO COMPLETE REQUEST_^1_%SPC 1_^1ILOG_!LDA- ELU,I_(GET CURRENT LOGICAL UNIT_^1_%EOR- DIAGLU,I_$CHECK IF DIAGNOSTIC LOGICAL UNIT_^1_%SAZ ICRQ_-* YES, GO COMPLETE REQUEST_^1_%LDQ- ELU,I_(GET€€ LOGICAL UNIT NUMBER_^1_%QLS 6_,POSITION_^1_%ADQ- FLTCOD,I_$ADD FAULT CODE_^1_%RTJ LOG_*LOG THE ERROR_^1_%SPC 1_^1_%LDA- RFLAG,I_%RESTORE RECOVERY FLAG_^1_%AND- ONEBIT+15_**_^1_%STA- RFLAG,I_,*_^1_%SPC 1_^1_%LDA* IFAIL_(CHECK IF ERROR ENCOUNTERED_^1_%SAZ ICRQ_-* NO, COMPLETE REQUEST_^1IADEV SCHDLE ALTDEV,0,,1_#* YES, SCHEDLE ALT. DEVICE HANDLER_^1_%SPC 1_^1_%JMP* INPT_)FIND €€ABOUT NEXT PDT_^1ICRQ_!RTJ- (COMPRQ)_$COMPLETE THE REQUEST_^1_%JMP* IFNR_)FIND NEXT REQUEST_^1_%SPC 1_^1INPT_!LDA- ELINK,I_%GET NEXT PDT ADDRESS_^1_%STA- I_,SAVE IN I-REG_^1_%EOR* ICPDT_(CHECK IF EQUAL TO STARTING PDT_^1_%SAZ IEXIT_,* YES, GO CLEAR BUSY AND EXIT_^1_%LDA- EREQST,I_)* NO, WAS ALTDEV SCHEDULED_^1_%AND- ONEBIT+14_0*_^1_%SAZ INPT1_4*_^1_%JMP* INPT_5* YES, GO LOOK AT €ÐNEXT PDT_^1INPT1 JMP* IFNR_5* NO, GO FIND NEXT REQUEST_^1_%SPC 2_^1IEXIT STA* ICPDT_(CLEAR CURRENT PDT ADDRESS_^1_%JMP MAS300_-*** EXIT ***_!TO MASS STORAGE DRIVER_^1_%SPC 3_^1IFAIL NUM 0_^1_%END_]_^__ÐPK18325 CSY/ C34 P€1_%NAM K18325_'DECK-ID C34 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THE CASSETTE KERNEL SELECTS UNIT, CHECKS STATUS ON_^1*_$ENTRY AND INTERRUPT. IT CALLS THE MODULES TO_^1*_$EXECUTE THE FUNCTION, WAIT FOR THE I€€NTERRUPT, AND_^1*_$HANDLE RECOVERY IF RECOVERABLE ERROR._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_$THE KERNEL IS COMPOSED OF THREE COMPONENTS:_^1*_'INITIATOR, CONTINUATOR AND TIME-OUT._^1*_$INITIATOR - STATUSES THE DEVICE TO DETERMINE IF_^1*_1OPERATIVE. IF SO CALLS THE APPROPRIATE_^1*_1ROUTINE TO EXECUTE THE I/O._^1*_$CONTINUATOR-STATUSES THE DEVICE, CHECKS FOR €€GHOST_^1*_1INTERRUPTS, CHECKS THE STATUS. IF_^1*_1THE STATUS IS BAD RECOVERY IS ATTEMPTED_^1*_1IF INDICATED. IF ADDITIONAL I/O IS_^1*_1IN PRESENT REQUEST, INITIATES NEXT_^1*_1I/O OPERATION. WHEN REQUEST IS SATISFIED_^1*_1RETURNS CONTROL TO DRIVER_^1*_$TIME-OUT - STATUSES DEVICE AND GOES TO FAULT ROUTINE_^1*_1WHICH RETURNS TO DRIVER_^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8-----€€ ------------_^1*_]_^1*_$INITIATOR (KCAS):_^1*_*I-REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*_$CONTINUATOR (CCAS) AND_^1*_$TIME-OUT (ECAS):_^1*_*Q-REGISTER = ADDRESS OF FIRST PHYSICAL DEVICE_^1*_*TABLE IN THE PDT THREAD. LOCATION ICPDT IN_^1*_*THE DRIVER CONTAINS THE ADDRESS OF THE PDT_^1*_*CURRENTLY BEING SERVICED._^1_%EJT 1_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$THE OUTPUTS OF€€ THE KERNEL ARE:_^1*_]_^1*_$1. STATUS_^1*_)INITIATOR STATUS TO PDT_!(SENTRY)_^1*_)CONTINUATOR STATUS TO PDT (SINTER)_^1*_)TIME-OUT STATUS TO PDT_"(STIMEO)_^1*_]_^1*_$2. FAULT CODE IS SET IF ERROR AS FOLLOWS:_^1*_*0 TIME OUT_^1*_*1 LOST DATA_^1*_*2 ALARM_^1*_*3 PARITY_^1*_*5 INTERNAL REJECT_^1*_)13 WRITE NOT ENABLED_^1*_)14 NOT READY_^1*_)21 END OF TAPE_^1*_)31 SHORT RECORD_^1*_)41 €€UNSUCCESSFUL RECOVERY_^1*_)46 EXTERNAL REJECT (ON OUTPUT)_^1*_)47 EXTERNAL REFECT (ON INPUT)_^1*_)53 END OF OPERATION NOT SET_^1*_]_^1*_$3. PDT CHANGES_^1*_)EREQST - BIT 14 SET IF ERROR._^1*_)MFLG_!- ZERO IMPLIES MOTION._^1*_)ESTAT2 - BIT 13 SET IF OVERFLOW._^1*_)FLTCOD - FAULT CODE IF ERROR._^1*_)ESTAT1 - BIT 7 SET WHEN SELECT IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*€€_]_^1*_$KCAS_^1*_)ENTRY - RETURN JUMP FROM DRIVER_^1*_)EXIT - TO WAITCS ON INITIATION OF I/O._^1*_1TO DRIVER IF DEVICE INOPERATIVE OR GHOST INTERRUPT._^1*_$CCAS_^1*_)ENTRY - FROM INTERRUPT PROCESSOR AFTER INTERRUPT_^1*_)EXIT - TO DRIVER IF FAULT DETECTION OR_^1*_>REQUEST COMPLETION_^1*_$ECAS_^1*_)ENTRY - ENTERED WHEN DIAGNOSTIC CLOCK_^1*_1BECOMES NEGATIVE_^1*_)EXIT - TO DRIVER_^€€1_%EJT 1_^1*_8FLOW_^1*_8----_^1*_]_^1*_$INITIATOR_^1*_*1. SELECT AND STATUS DEVICE; SAVE STATUS._^1*_*2. IF BUSY OR INOPERATIVE CALL FAULT ROUTINE._^1*_*3. DETERMINE TYPE OF REQUEST AND CALL MOTION_^1*_-OR READ/WRITE ANCILLARY ROUTINE._^1*_*4. EXIT TO WAITCS TO WAIT FOR INTERRUPT._^1*_$CONTINUATOR_^1*_*1. CALL VCAS TO STATUS AND CHECK FOR GHOST INTERRUPT._^1*_*2. CALL FS2CAS TO FO€€RMAT COMPOSED STATUS (ESTAT2)._^1*_*3. IF STATUS INDICATES NOT READY, RUNAWAY, OR_^1*_-END OF TAPE, EXIT THROUGH FAULT ROUTINE._^1*_*4. IF READ REQUEST AND OVERFLOW INDICATED,_^1*_-SET OVERFLOW BIT IN ESTAT2._^1*_*5. IF READ/WRITE REQUEST AND STATUS INDICATES_^1*_-LOST DATA OR CRC ERROR, CALL RECOVERY ANCILLARY_^1*_-ROUTINE._^1*_*6. IF STATUS INDICATES END-OF-OPERATION NOT SET,_^1*€€_-EXIT THROUGH FAULT ROUTINE._^1*_*7. IF READ REQUEST AND STATUS INDICATES TAPE MARK THEN_^1*_/SET TAPE MARK BIT IN EREQST._^1*_/ADJUST ADT WORD POINTER FOR ZERO LENGTH RECORD._^1*_-ELSE_^1*_/CALL NEXCAS FOR NEXT I/O OPERATION IN THIS REQUEST._^1*_/IF MORE I/O THEN_^1*_1GO TO I/O PROCEDURE IN INITIATOR._^1*_*8. RETURN TO DRIVER._^1*_$TIME-OUT_^1*_*1. SAVE TIMED OUT PDT ADDRESS IN I€€-REGISTER_^1*_*2. SAVE STATUS IN STIMEO._^1*_*3. CALL FS2CAS TO FORMAT COMPOSED STATUS._^1*_*4. CLEAR CONTROLLER_^1*_*5. CLEAR MICRO INTERRUPT._^1*_*6. GO TO FAULT ROUTINE._^1*_]_^1*_$FAULT ROUTINE_^1*_*1. SAVE FAULT CODE (PASSED IN A-REG) IN PDT (FLTCOD)._^1*_*2. SET BIT 14 IN EREQST._^1*_*3. RETURN TO DRIVER_^1*_$SELECT ROUTINE_^1*_*1. SET SELECT IN PROGRESS FLAG IN ESTAT1 (BIT 7€€)_^1*_*2. CALL IOCAS ANCILLARY ROUTINE TO OUTPUT FUNCTION._^1*_*3. GO TO WAITCS ROUTINE TO SET TIMER AND TURN ON INTERRUPT._^1_%EJT 1_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$FS2CAS - CONVERT ESTAT2 TO COMPOSITE STATUS._^1*_$IOCAS - OUTPUT FUNCTIONS / INPUT STATUS._^1*_$MCAS_!- INITIATE MOTION FUNCTIONS._^1*_$NEXCAS - CHECK FOR NEXT I/O OPERATION._^1*_$RECCAS - EXECUTE RECOVE€€RY ERROR PROCEDURES._^1*_$VCAS_!- VERIFY INTERRUPT, REPORT IF GHOST._^1*_$WAITCS - SET DIAGNOSTIC CLOCK (TIMER) AND ENABLE EOP INTERRUPT._^1*_$XCAS_!- DETERMINE IF READ OR WRITE AND SET UP ADT FUNCTION._^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT CC50_)SUB CONTINUATOR ENTRY_^1_%ENT CCAS_)CONTINUATOR ENTRY_^1_%ENT C18325_'CONTINUATOR ENTRY FOR MSOS/RTOS_^1_%ENT E18325_'ERR€€OR ENTRY FOR MSOS/RTOS_^1_%ENT ECAS_)TIME OUT ENTRY_^1_%ENT FCAS_)FAULT ROUTINE_^1_%ENT KCAS_)KERNAL ENTRY_^1_%ENT SELCAS_'SELECT UNIT ROUTINE_^1*_]_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1*_]_^1_%EXT* FS2CAS_'FORMAT ESTAT2_^1_%EXT* MCAS_)EXECUTE MOTION FUNCTION_^1_%EXT* IOCAS_(HARDWARE I/O INTERFACE_^1_%EXT* NEXCAS_'DETERMINE NEXT I/O_^1_%EXT* RECCAS_'RECOVER€€Y_^1_%EXT* VCAS_)VERIFY INTERRUPT_^1_%EXT* WAITCS_'ESTABLISH WAIT TIME_^1_%EXT* XCAS_)EXECUTE READ/WRITE_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU€€ EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATU€€S_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INT€€ERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (L€€WA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1* LOW COR€€E EQUATES_^1*_]_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU ZERO($22)_#ZERO WORD CONSTANT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1****_]_^1_%EJT 1_^1*_8********_^1*_8* KCAS *_^1*_8********_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1KCAS_!NUM 0_^1_%SET A_^1_%STA- SINTER,I_$$FFFF CONTINUATOR AND TIMEOUT STATUS_^1_%STA- SENT€€RY,I_^1_%STA- STIMEO,I_^1_%CLR A_^1_%STA- MFLG,I_'CLEAR REQUEST TYPE FLAG_^1_%STA- QSTCOD,I_$CLEAR MOTION CODE WORD_^1_%STA- ESTAT2,I_$CLEAR FORMATTED STATUS_^1_%SPC 1_^1_%ENA 0_,A = 0 INDICATES STATUS ONLY REQUEST IN IOCAS_^1_%RTJ IOCAS_(GET STATUS TO DETERMINE IF SELECT UNIT NEEDED_^1_%STA- SENTRY,I_$SAVE STATUS_^1_%AND- ONEBIT+13_#GET UNIT BIT FROM STATUS_^1_%ARS 2_,POSITIO€€N TO MATCH UNIT SELECT IN FUNCTION WORD_^1_%EOR- UNTSEL,I_$COMPARE WITH PDT WORD FOR UNIT SELECTED_^1_%AND- ONEBIT+11_#SIFT OUT ONLY UNIT BIT_^1_%SAN KC03_)SKIP IF OTHER UNIT NEEDS TO BE SELECTED_^1_%LDA- SENTRY,I_$GET STATUS SAVED_^1_%JMP* KC05_)BYPASS UNIT SELECT_^1_%SPC 1_^1_%SPC 1_^1KC03_!RTJ* SELCAS_'SELECT AND STATUS_^1_%STA- SENTRY,I_$SAVE ENTRY STATUS_^1KC05_!RTJ FS2CAS€€_'FORMAT COMPOSED STATUS(ESTAT2) FROM A-REG._^1_%ENA 3_^1_%AND- SENTRY,I_^1_%EOR- ONEBIT_'CHECK IF BUSY, NOT READY_^1_%SAZ KC10_)NO, CONTINUE_^1_%ENA 14_+YES, REPORT ERROR NUMBER 14_^1_%JMP* FCAS_G** ERROR EXIT **_^1*_]_^1KC10_!LDQ- EPTR,I_'CHECK IF MOTION REQUEST_^1_%LDA- 4,Q_*GET PARAM WORD 4_^1_%STA- QSTWD4,I_$SAVE WD 4 OF REQUEST IN PDT_^1_%LDA- (ZERO),Q_$GET REQUEST CODE_^1€€_%ARS 9_^1_%AND- LOWBTS+4_$AND WITH 1F_^1_%INA -14_*MOTION REQ CODE IS 14_^1_%STA- MFLG,I_'SAVE REQUEST FLAG, 0=MOTION_^1*_]_^1KC15_!LDA- MFLG,I_'NEXT I/O FUNCTION_^1_%SAN KC20_)SKIP IF NOT MOTION REQUEST_^1_%RTJ MCAS_)EXECUTE MOTION COMMAND_^1_%JMP* KC30_^1*_]_^1KC20_!RTJ XCAS_)EXECUTE READ/WRITE_^1*_]_^1KC30_!JMP WAITCS_^1_%EJT 1_^1* KERNEL CONTINUATOR_^1* ENTER WITH PDT P€€OINTER IN Q REGISTER_^1*_]_^1CCAS_!STQ- I_^1_%EQU C18325(CCAS) CONTINUATOR ENTRY FOR MSOS/RTOS_^1_%RTJ VCAS_)VERIFY INTERRUPT, RETURN STATUS IN A_^1_%RTJ FS2CAS_'FORMAT COMPOSED STATUS(ESTAT2) FROM A-REG._^1*_]_^1CC00_!ENA 3_,CHECK IF BUSY, NOT READY_^1_%AND- SINTER,I_)**_^1_%EOR- ONEBIT_+**_^1_%SAZ CC01_)NO, CONTINUE_^1_%ENA 14_+ERROR CODE = 14, NOT READY_^1_%JMP* FCAS_G** €€ERROR EXIT **_^1*_]_^1CC01_!ENA $20_*CHECK IF ALARM_^1_%AND- SINTER,I_)**_^1_%SAN CC05_)YES, INVESTIGATE FURTHER_^1_%JMP* CC09_)NO, CONTINUE_^1*_]_^1CC05_!LDA- SINTER,I_$CHECK FATAL ERROR CONDITION_^1_%AND =N$0340_** GET ALARM BITS_^1_%SAN CC06_^1_%JMP* CC15_-* NONE SET IMPLIES RUNAWAY_^1CC06_!AND- ONEBIT+9_)* GET EOT BIT_^1_%SAZ CC07_^1_%JMP* CC20_-* EOT SET, FATAL_^1_%SPC 1€€_^1CC07_!ENQ 1_,SET ERROR INDICATOR FOR RECCAS_^1_%LDA- MFLG,I_'GET MOTION FLAG, 0=MOTION_^1_%SAN CC08_^1_%JMP* CC09A_(MOTION, ALARM EXCEPT EOT OR RUNAWAY IRRELEVANT_^1CC08_!LDA- SINTER,I_$IS LOST DATA SET_^1_%AND- ONEBIT+6_^1_%SAZ CC10_)NO, GO TO RECOVERY_^1_%LDA- ESTAT1,I_$READ OR WRITE_^1_%AND- ONEBIT_^1_%SAN CC10_)WRITE, GO TO RECOVERY_^1_%LDA- ADTFW,I_%IS FW = LW_^1_%EOR- €€ADTLW,I_^1_%SAN CC10_)NO, THIS IS A REAL LOST DATA_^1*_8YES, PART OF RECORD BYPASSED_^1*_8INDICATE THIS NON-FATAL CONDITION IN ESTAT2_^1_%LDA- ESTAT2,I_'* GET FORMATTED STATUS_^1_%AND- ZROBIT+13_%* INSURE BIT CLEAR_^1_%EOR- ONEBIT+13_%* SET OVERFLOW BIT_^1_%STA- ESTAT2,I_^1*_]_^1CC09_!CLR Q_,INDICATES NO ERROR FOR RECOVERY_^1CC09A LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND- €€ONEBIT+8_$LOOK AT BIT 8_^1_%SAZ CC30_)NO, CONTINUE_^1*_]_^1CC10_!RTJ RECCAS_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KC15_)EXECUTE RECOVERY FUNCTION_**RETURN1_^1_%JMP* CC30_)RECOVERY COMPLETE_2*RETURN2_^1*_]_^1CC15_!ENA 2_,ERROR CODE = 2 (ALARM - RUNAWAY)_^1_%JMP* FCAS_G** ERROR EXIT **_^1CC20_!ENA 21_+ERROR CODE = 21, EOT_^1_%JMP* FCAS_G** ERROR EXIT **_^1*_]_^1CC30_!E€€NA $10_*CHECK IF END-OF-OPERATION STATUS SET_^1_%AND- SINTER,I_)*_^1_%SAN CC35_)YES, CONTINUE_^1_%ENA 53_+ENTER FAULT CODE (NO EOP AFTER INTERRUPT)_^1_%JMP* FCAS_)NO EOP_7** ERROR EXIT **_^1_%SPC 1_^1CC35_!LDA- ESTAT1,I_$CHECK IF MOTION AND/OR WRITE FUNCTION_^1_%AND =N$41_-* LOOK AT BITS IN FLAG WORD_^1_%SAN CC40_.* YES, MOTION OR WRITE_^1_%LDA- SINTER,I_$CHECK IF TAPE MARK O€€N READ_^1_%AND =N$800_,* GET BIT IN STATUS_^1_%SAZ CC40_.* NO TAPE MARK_^1_%LDA- EREQST,I_$SET ERROR BIT FOR TAPE MARK_^1_%AND- ZROBIT+14_'* CLEAR_^1_%ADD- ONEBIT+14_'* SET_^1_%STA- EREQST,I_(* SAVE_^1_%RAO- ADTFW,I_%ADJUST FOR ZERO LENGTH RECORD(EOF)_^1_%JMP* CC50_)STOP READ WHEN TM, BUT NO SYSTEM ERROR_^1*_]_^1CC40_!RTJ NEXCAS_'CHECK FOR NEXT I/O OPERATION_^1_%JMP* CC50_)NO MO€€RE I/O REQ_*RETURN1_^1_%JMP* KC15_)PROCEDURE WITH NEXT I/O_!RETURN2_^1*_]_^1CC50_!ENA 0_,CLEAR ERROR FLAG_^1_%JMP* (KCAS)_'RETURN TO CALLER_^1_%EJT 1_^1* DIAGNOSTIC TIME OUT_^1* ENTERED WHEN DIAGNOSTIC CLOCK HAS TIMED OUT_^1*_]_^1ECAS_!STQ- I_,SAVE TIMED OUT PDT ADDRESS_^1_%EQU E18325(ECAS) ERROR ENTRY FOR MSOS/RTOS_^1_%LDQ- EWES,I_'GET EQUIPMENT CODE_^1_%INP ECAS1-*_%GET STAT€€US - RETURNED IN A-REG._^1_%STA- STIMEO,I_$SAVE IN PDT TIMEOUT STATUS._^1_%RTJ FS2CAS_'FORMAT COMPOSED STATUS (ESTAT2)_^1_%SPC 1_^1ECAS1 NOP 0_,REJECT ENTRY ON INPUT STATUS_^1*_8TIMEOUT TAKES PRECEDENCE_^1_%LDQ- EWES,I_'GET EQUIPMENT CODE_^1_%ENA 1_^1_%OUT ECAS2-*_%OUTPUT CLEAR CONTROLLER_^1ECAS2 NOP 0_^1_%LDQ- MICROI,I_$GET MICRO INTERRUPT NUMBER_^1_%NUM $0B06_(CLEAR MICR€€O INTERRUPT_^1_%ENA 0_,TIMEOUT ERROR CODE_^1*_]_^1*_]_^1* FAILED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1*_]_^1FCAS_!STA- FLTCOD,I_$SAVE FAULT CODE_^1_%LDA- EREQST,I_$SET DRIVER DETECTED ERROR_^1_%AND- ZROBIT+14_%*_"CLEAR BIT 14_^1_%ADD- ONEBIT+14_%*_"SET BIT 14_^1_%STA- EREQST,I_'*_"STORE IN PDT_^1_%JMP (KCAS)_'RETURN VIA KERNAL_^1*_]_^1*_]_^1* SELECT UNIT_^1*_€€]_^1* ENTRY_]_^1*_$I=PDT ADDRESS_^1* EXIT_]_^1*_$A=STATUS AFTER SELECT IF NO REJECT_^1*_]_^1*_]_^1SELCAS NUM 0_^1_%LDA- ESTAT1,I_$SET SELECT IN PROGRESS FLAG_^1_%AND- ZROBIT+7_'*_!CLEAR BIT 7_^1_%ADD- ONEBIT+7_'*_!SET BIT 7_^1_%STA- ESTAT1,I_'*_!STORE IN PDT_^1_%SPC 1_^1_%LDA- UNTSEL,I_$GET UNIT 0 OR 1 AND ENABLE SELECT_^1_%RTJ IOCAS_(GO OUTPUT FUNCTION_^1_%JMP WAITCS_'WAIT FOR€* INTERRUPT_^1_%SPC 1_^1*_]_^1_%END_]_^__ *PIOCAS CSY/ C35 P€1_%NAM IOCAS_(DECK-ID C35 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$ISSUE I/O FUNCTIONS_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$THE FUNCTION TO BE ISSUED IS PASSED TO IOCAS_^1*_$BY THE €€CALLER. REJECTS CAUSE AN ERROR EXIT._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$I-REGISTER = PHYSICAL DEVICE TABLE ADDRESS_^1*_$A-REGISTER = FUNCTION CODE (OUTPUT ONLY)_^1*_$A-REGISTER = ZERO (FOR STATUS INPUT)_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$INTERRUPTS ARE CLEARED THEN ENABLED._^1*_$FUNCTIONS OUTPUT_^1*_$REJECTS REPORTED_^1*_]_^1*_8ENTRY/EXIT_^1*_8--€€--------_^1*_]_^1*_$RETURN JUMP FROM CALLER_^1*_$EXIT TO CALLER OR IF ERROR TO FCAS._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT IOCAS_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1_%EXT* FCAS_)FAULT ROUTINE_^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TA€€BLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 RE€€QUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE€€ IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTS€€EL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_€€%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1*_]_^1*_]_^1_%EQU_!CLRINT(2)_"CLEAR INTERRUPT FUNCTION_^1_%EQU INTEOP(8)_#ENABLE INTERRUPT ON EOP_^1****_]_^1_%EJT 1_^1*_]_^1* FUNCTION OUTPUT AND INPUT_^1* ENTER WITH_^1*_*A-REG = FUNCTION CODE (O€€UTPUT ONLY)_^1*_*A-REG = ZERO (FOR STATUS INPUT)_^1*_]_^1*_]_^1IOCAS NUM 0_^1_%LDQ- EWES,I_'GET EQUIPMENT CODE_^1_%SAZ IOINP_(IF A = 0, INPUT STATUS_^1_%SPC 1_^1_%INA CLRINT_'ADD CLEAR INTERRUPT TO FUNCTION_^1_%INA INTEOP_'ADD ENABLE EOP INTERRUPT TO FUNCTION_^1_%OUT MOUTRJ-*_$OUTPUT FUNCTION_^1_%JMP* IOEXIT_^1_%SPC 1_^1IOINP INP MINPRJ-*_$INPUT FUNCTION_^1_%SPC 1_^1IOEX€€IT JMP* (IOCAS)_+*** EXIT ***_^1*_]_^1*_]_^1* REJECT ON FUNCTION EXECUTION_^1* GO TO FAULT ROUTINE WITH PROPER ERROR CODE IN A-REG._^1*_]_^1MOUTRJ JMP* MREJIN_^1_%ENA 46_+EXTERNAL REJ ON OUTPUT_^1_%JMP* IOFLT_^1_%SPC 1_^1MINPRJ JMP* MREJIN_^1_%ENA 47_+EXTERNAL REJ ON INPUT_^1_%JMP* IOFLT_^1_%SPC 1_^1MREJIN ENA 5_,INTERNAL REJECT_^1_%SPC 1_^1IOFLT JMP FCAS_G** ERROR EXIT **_€^1_%END_]_^__ PFS2CAS CSY/ C36 P€1_%NAM FS2CAS_'DECK-ID C36 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$FORMAT STATUS FOR COMPOSITE STATUS IN ESTAT2._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$EACH TIME STATUS IS TAKEN IN K€€ERNEL THIS MODULE IS_^1*_$CALLED TO FORMAT THE STATUS FOR ESTAT2. THE RECOVERY_^1*_$BITS IN ESTAT2 ARE SET BY RECCAS AND_^1*_$OVERFLOW BIT IS SET BY KERNEL CONTINUATOR IF NECESSARY._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$FORMATTED STATUS IN PDT(ESTAT2)_^1*_]_^1*_'************_,*******************_^1*_'* HARDWARE *_,*_$ESTAT2_#*_^1*_'*_!STATUS *_,* COMPOSED STATUS *_^1*_'********€€****_,*******************_^1*_]_^1*_!BIT_6BIT_^1*_]_^1*_"0 READY_10 READY_^1*_"1 BUSY_21 BUSY_^1*_"2 WRITE ENABLED_)2 RECOVERED ERROR_^1*_"3 DATA_23 DATA_^1*_]_^1*_"4 EOP_34 EOP_^1*_"5 ALARM_15 ALARM_^1*_"6 LOST DATA_-6 LOST DATA_^1*_"7 PROTECTED_-7 PROTECTED_^1*_]_^1*_"8 CRC/FORMAT ERROR_%8 CRC/FORMAT ERROR_^1*_"9 EOT_39 EOT_^1*_!10 BOT_210 BOT_^1*_!11 FILE €€MARK_,11 FILE MARK_^1*_]_^1*_!12 SIDE B_/12 IRRECOVERABLE ERROR_^1*_!13 UNIT 1_/13 OVERFLOW(DATA BYPASSED)_^1*_!14 DATA AVAILABLE_'14 SIDE B_^1*_!15 ADT MODE_-15 WRITE ENABLE_^1_%EJT 1_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$I-REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_$A-REGISTER = LAST STATUS TAKEN_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_€€$RETURN JUMP FROM CALLER_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. MASK THROUGH ONLY STATUS BITS TO BE INCLUDED_^1*_)IN ESTAT2._^1*_$2. IF SIDE B STATUS SET_^1*_+SET NEW BIT POSITION, CLEAR FORMER BIT._^1*_$3. IF WRITE ENABLE STATUS SET_^1*_+SET NEW BIT POSITION, CLEAR FORMER BIT._^1*_$4. CLEAR STATUS BITS IN PREVIOUS ESTAT2 (RETAIN NON-STATUS)._^1*_$5. ADD CURRENT FORMATTED STA€€TUS BITS._^1*_$6. SAVE IN PDT(ESTAT2)_^1*_$7. EXIT TO CALLER_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT FS2CAS_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)€€_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NE€€XT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU €€GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU €€ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD€€(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU H1FFF($F)_^1_%EQU H1000($2F)_^1_%EQU H0004($25)_^1****_]_^1_%EJT 1_^1*_6************************_^1*_$*_/* FORMAT ESTAT2 STATUS *_^1*_6************************_^1*_]_^1* ENTER WITH A = LAST STATUS TAKEN_^1*_]_^1FS2CAS NUM 0_^1_%AND H1FF€€F_(GET ALL STATUS BITS TO BE FORMATTED IN ESTAT2_^1_%STA* ESTNEW_'SAVE CURRENT STATUS_^1_%SPC 1_^1*_8LOOK AT STATUS BITS NEEDING REFORMATTING_^1_%AND- H1000_+* GET "SIDE B" STATUS (BIT 12)_^1_%SAZ FS2C10_** SKIP IF "SIDE B" STATUS NOT SET_^1_%LDA* ESTNEW_/* GET CURRENT STATUS_^1_%EOR =N$5000_.* CLEAR BIT 12, SET BIT 14_^1_%STA* ESTNEW_/* SAVE_^1*_]_^1FS2C10 LDA* ESTNEW_** GET CU€€RRENT STATUS_^1_%AND- H0004_+* GET "WRITE ENABLE" STATUS (BIT 2)_^1_%SAZ FS2C20_** SKIP IF "WRITE ENABLE" STATUS NOT SET_^1_%LDA* ESTNEW_/* GET CURRENT STATUS_^1_%EOR =N$8004_.* CLEAR BIT 2, SET BIT 15_^1_%STA* ESTNEW_/* SAVE_^1_%SPC 2_^1FS2C20 LDA- ESTAT2,I_$GET EXISTING FORMATTED STATUS_^1_%AND =N$3004_(* CLEAR STATUS BITS, RETAIN NON-STATUS BITS_^1_%SPC 2_^1_%ADD* ESTNEW_'A€ÖDD CURRENT FORMATTED STATUS TO ESTAT2_^1_%STA- ESTAT2,I_$SAVE IN PHYSICAL DEVICE TABLE_^1_%SPC 1_^1_%JMP* (FS2CAS)_E*** EXIT ***_^1ESTNEW NUM 0_,WORD TO HOLD CURRENT STATUS BITS FOR FORMATING_^1*_]_^1_%END_]_^__ ÖPMCAS CSY/ C37 P€1_%NAM MCAS_)DECK-ID C37 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$INITIATE MOTION FUNCTIONS_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$THE MOTION BIT IN ESTAT1 IS SET._^1*_$THE MOTION COD€€E IN PDT(QSTWD4) IS USED TO SET UP_^1*_$MOTION FUNCTION. A MOTION CODE OF ZERO IS TREATED_^1*_$AS A NOP. FOR SOME FUNCTIONS, SET UP INCLUDES_^1*_$ERROR CHECKING. IOCAS IS CALLED TO OUTPUT THE_^1*_$MOTION FUNCTION, AND THE CALLER RETURNED TO._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$PDT ADDRESS IS IN I-REGISTER ON ENTRY._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]€€_^1*_$OUTPUTS TO THE PDT ARE:_^1*_'ESTAT1 - BIT 6 IS SET TO INDICATE MOTION REQUEST_^1*_'QSTCOD - CURRENT MOTION CODE EXTRACTED FROM QSTWD4_^1*_'ADTFW - ADT TABLE FWA-1, USED FOR MINIMUM READ TO ADVANCE REC._^1*_'ADTLW - ADT TABLE LWA, USED FOR MINIMUM READ TO ADVANCE REC._^1*_]_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP FROM CALLING ROUTINE(KCAS)._^€€1*_$EXIT TO CALLER, OR IF ERROR TO FCAS._^1*_]_^1_%EJT 1_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. SET MOTION BIT IN ESTAT1 (BIT 6)._^1*_$2. GET CURRENT MOTION CODE FROM PDT(QSTWD4) AND_^1*_(SAVE IN PDT(QSTCOD)._^1*_$3. USE MOTION CODE TO INDEX INTO FUNCITON TABLE._^1*_$4. FOR MOTION CODE_^1*_)0 DO A NOP (GO TO KERNEL CONTINUATOR TO EXIT)_^1*_)1 PUT BACKSPACE FUNCTION IN A-REG._^1*_)2 €€IF WRITE IS NOT ENABLED ERROR EXIT TO FCAS._^1*_,ELSE PUT WRITE TAPE MARK FUNCTION IN A-REG._^1*_)3 PUT REWIND FUNCTION IN A-REG._^1*_)4 IF RECOVERY IN PROGRESS OR DIAGNOSTIC LU_^1*_.PUT ERASE FUNCTION IN A-REG._/(REW/UNLOAD)_^1*_,ELSE_^1*_.PUT REWIND IN A-REG._^1*_)5 PUT SEARCH TAPE FORWARD IN A-REG._^1*_)6 PUT SEARCH TAPE MARK REVERSE IN A-REG._^1*_)7 SET UP ADT TABLE TO REA€€D TWO WORD LOCAL BUFFER._^1*_,CALL READ ROUTINE IN XCAS TO EXECUTE READ._"(ADVANCE)_^1*_,EXIT TO MCAS CALLER._^1*_$5. CALL IOCAS TO OUTPUT FUNCTION._^1*_$6. EXIT TO MCAS CALLER._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IOCAS - OUTPUT FUNCTIONS AND INPUT STATUS._^1*_$FCAS_!- FAULT ROUTINE IN KERNEL_^1*_$XCAS_!- INITIATE READ/WRITE FUNCTION_^1*_-(AT ENTRY POINT XRADT.)_^1€€*_$KCAS_!- KERNEL_^1*_-(AT ENTRY POINT CC50.)_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT MCAS_)MOTION EXECUTION_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1_%EXT* CC50_)CONTINUATOR ENTRY FOR NOP_^1_%EXT* FCAS_(FAULT ROUTINE_^1_%EXT* IOCAS_(HARDWARE I/O INTERFACE_^1_%EXT* XRADT_(WRITE RECORD ENTRY IN XCAS_^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----€€------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE F€€OR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_€€^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AF€€TER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNT€€FG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU ZERO($22)_#ZERO WORD CONSTANT_^1_%EQU ZROBIT($33)_!€€BIT EXCLUSION MASK_^1*_]_^1*_]_^1*_*MOTION CONTROL FUNCTION EQUATES_^1*_]_^1_%EQU TR($400)_$SEARCH TAPE MARK REVERSE_^1_%EQU TF($480)_$SEARCH TAPE MARK FORWARD_^1_%EQU TM($500)_$WRITE TAPE MARK_^1_%EQU BK($600)_$BACKSPACE ONE RECORD_^1_%EQU RW($680)_$REWIND_^1_%EQU ER($700)_$ERASE_^1****_]_^1_%EJT 1_^1*_]_^1*_6********_^1*_6* MCAS *_^1*_6********_^1*_]_^1* MOTION EXECUTION €€ANCILLARY ROUTINE_^1* ENTER WITH MOTION REQUEST, I =PDT POINTER_^1*_]_^1MCAS_!NUM 0_^1_%LDA- ESTAT1,I_$SET MOTION REQUEST BIT_^1_%AND- ZROBIT+6_'* CLEAR BIT_^1_%ADD- ONEBIT+6_'* SET BIT_^1_%STA- ESTAT1,I_'* PUT IN PDT_^1_%SPC 1_^1_%LDA- QSTWD4,I_$GET MOTION CODE_^1_%ARS 12_-* SHIFT_^1_%AND- LOWBTS+2_'* MASK_^1_%STA- QSTCOD,I_'* SAVE_^1_%SPC 1_^1_%TRA Q_,PUT CODE IN Q FOR INDEX€€_^1_%JMP* MTABLE,Q_$EXECUTE FUNCTION_^1_%SPC 1_^1MTABLE JMP* MNOP_)NO OPERATION_^1_%JMP* MBKSP_(BACKSPACE RECORD_^1_%JMP* MWRTM_(WRITE TAPE MARK_^1_%JMP* MREW_)REWIND_^1_%JMP* MREWUN_'REWIND UNLOAD_^1_%JMP* MSTMF_(SEARCH TAPE MARK FORWARD_^1_%JMP* MSTMR_(SEARCH TAPE MARK REVERSE_^1_%JMP* MADVAN_'ADVANCE ONE RECORD_^1_%EJT 1_^1*_]_^1*_]_^1* NO OPERATION, NO FUNCTION OUTPUT_^1*_]_^€€1MNOP_!JMP CC50_)ENTER CONTINUATOR (BYPASS INT. PROCESSING)_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1MBKSP LDA =XBK_)BACKSPACE FUNCTION_^1_%JMP* MC01_^1*_]_^1*_]_^1* WRITE TAPE MARK_^1*_]_^1MWRTM ENA 4_,IS WRITE ENABLED_^1_%AND- SENTRY,I_(*_^1_%SAN MWRTM1_** YES, FUNCTION ALLOWED_^1_%ENA 13_.* NO, REPORT ERROR-WRITE NOT ENABLED_^1_%JMP FCAS_,*_7*** ERROR EXIT ***_^1MWRTM1 LDA =XT€€M_)WRITE TAPE MARK FUNCTION_^1_%JMP* MC01_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1MREWUN LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND- ONEBIT+8_(*_^1_%SAN MERASE_** YES - REWIND/UNLOAD IMPLIES ERASE_^1_%LDA- ELU,I_(GET CURRENT LU_^1_%EOR- DIAGLU,I_$CHECK IF DIAGNOSTIC LU IN USE_^1_%SAN MREW_-* NO, DO REWIND_^1_%SPC 1_^1MERASE CLR A_,ERASE ONLY FOR RECOVERY OR DIAGNOSTIC_^1_%STA€€- QSTCOD,I_$CLEAR MOTION CODE FOR ERASE IN WAITCS_^1_%LDA =XER_-* YES,DO ERASE_'ERASE FUNCTION_^1_%JMP* MC01_^1*_]_^1*_]_^1* REWIND_]_^1*_]_^1MREW_!LDA =XRW_)REWIND FUNCTION_^1_%JMP* MC01_^1*_]_^1*_]_^1* SEARCH TAPE MARK FORWARD_^1*_]_^1MSTMF LDA =XTF_)SEARCH TAPE MARK FORWARD FUNCTION_^1_%JMP* MC01_^1*_]_^1*_]_^1* SEARCH TAPE MARK REVERSE_^1*_]_^1MSTMR LDA =XTR_)SEARCH TAPE €€MARK REVERSE_^1_%JMP* MC01_^1*_]_^1*_]_^1* ADVANCE ONE RECORD_^1*_]_^1MADVAN RTJ* MBLOC+1_%CALCULATE ADDRESS OF BUFFER_^1MBLOC ADC* MADBUF_/* RELATIVE OFFSET TO BUFFER_^1_%NUM 0_4* ABSOLUTE ADDRESS OF MBLOC_^1_%LDA* MBLOC+1_.* GET ADDRESS OF MBLOC_^1_%ADD* MBLOC_0* ADD OFFSET TO BUFFER_^1_%SPC 1_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_%PUT IN ADT TABLE(FWA-1)_^1_%INA €| 2_,ALLOW 2 WORDS_^1_%STA- ADTLW,I_%PUT IN ADT TABLE(LWA)_^1_%SPC 1_^1_%RTJ XRADT_(READ (SIZE ERROR ALARM NOT TAKEN IF MOTION)_^1_%JMP* MEXIT_(GO TO RETURN_^1_%SPC 2_^1MADBUF BZS MADBUF(2)_#BUFFER FOR ADVANCE RECORD_^1_%SPC 3_^1*_]_^1*_]_^1* COMMON JUMP TO OUTPUT FUNCTION_^1*_]_^1MC01_!RTJ IOCAS_(OUTPUT FUNCTION_^1MEXIT JMP* (MCAS)_**** EXIT ***_^1_%SPC 2_^1_%END_]_^__ |PNEXCAS CSY/ C38 P€1_%NAM NEXCAS_'DECK-ID C38 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$CHECK FOR NEXT I/O OPERATION_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$THIS MODULE DETERMINES IF THE CURRENT REQUEST_^€€1*_$REQUIRES MORE I/O. IF SO IT RETURNS APPROPRIATELY_^1*_$AFTER INITIALIZING WHEN NECESSARY. MORE THAN_^1*_$ONE I/O REQUEST CAN BE A RESULT OF:_^1*_$A MOTION REQUEST WITH REPEAT SET;_^1*_$A MOTION REQUEST WITH UP TO 3 MOTION CODES;_^1*_$AN UNFORMATTED READ REQUEST IF LENGTH IS MORE THAN ONE RECORD._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$I-REGISTER = PHY€€SICAL DEVICE TABLE ADDRESS._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$PDT(QSTWD4) - IF REPEAT BIT IS SET DECREMENTED BY 1._^1*_1- IF NO REPEAT, SHIFT COMPLETED_^1*_3MOTION CODE OUT AND NEXT CODE, IF_^1*_3ANY, IN UPPER 4 BITS._^1*_$PDT(ESTAT1) - CLEAR MOTION BIT (6) WHEN ALL MOTION_^1*_3COMPLETED._^1*_$PDT(ECCOR) - UPDATE NEXT DATA LOCATION_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_€€]_^1*_$RETURN JUMP ENTRY_^1*_]_^1*_$EXIT TO CALLER IF FUNCTIONS COMPLETED FOR THIS REQUEST_^1*_*TO CALLER+1 IF ANOTHER FUNCTION._^1*_]_^1_%EJT 1_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. IF MOTION REQUEST THEN_^1*_$2._"IF REPEAT MOTION_^1*_-DECREMENT COUNTER_^1*_-IF DONE_^1*_/CLEAR MOTION FLAG_^1*_/EXIT_^1*_-ELSE_^1*_/EXIT+1_^1*_$3._"ELSE_^1*_-SHIFT OUT COMPLETED MOTION CODE FROM QSTWD4_€€^1*_-IF ANOTHER MOTION FUNCTION_^1*_/EXIT+1_^1*_-ELSE_^1*_/CLEAR MOTION FLAG_^1*_/EXIT_^1*_$4. ELSE (READ/WRITE)_^1*_+UPDATE NEXT DATA AVAILABLE WORD_^1*_+IF FORMATTED READ_^1*_-EXIT_^1*_+ELSE_^1*_-IF ALL WORDS READ_^1*_/EXIT_^1*_-ELSE_^1*_/EXIT+1._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1*_]_^1_%ENT NEXCAS_^1*_8EXTERNAL REFERENCES_^1*_8€€-------- ----------_^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(€€6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14€€ MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQ€€U SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECO€€VERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU LOWBTS($3)_"LOW ORDER BIT MASK_^1_%EQU ONEBIT($€€23)_!SINGLE BIT MASK_^1_%EQU ZERO($22)_#ZERO WORD CONSTANT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_]_^1*_6**********_^1*_6* NEXCAS *_^1*_6**********_^1*_]_^1* CASSETTE NEXT I/O ANCILLARY ROUTINE_^1* ENTER WITH I = PDT ADDRESS_^1*_]_^1NEXCAS NUM 0_^1_%LDA- MFLG,I_'CHECK IF MOTION REQUEST_^1_%SAZ NX10_-*YES, MOTION_^1_%JMP* NX100_,*NO, HANDLE RE€€AD/WRITE_^1_%SPC 1_^1NX10_!LDA- QSTWD4,I_$CHECK IF REPEAT MOTION_^1_%SAP NX20_-*NO,CONTINUE_^1_%SPC 1_^1_%INA -1_/*YES, DECREMENT COUNTER_^1_%STA- QSTWD4,I_$PUT IN PDT_^1_%SPC 1_^1_%AND- LOWBTS+11_#CHECK IF DONE, ISOLATE COUNT_^1_%SAZ NX30_-* YES, GO CLEAR MOTION AND EXIT_^1_%JMP* NX35_-* NO, GO TO EXIT+1 TO REPEAT MOTION_^1_%SPC 1_^1NX20_!ENQ 0_,CLEAR Q_^1_%LDA- QSTWD4,I_$€€CHECK IF ANOTHER MOTION COMMAND_^1_%LLS 4_0* SHIFT OUT COMPLETED MOTION CODE_^1_%STA- QSTWD4,I_)* SAVE IN PDT_^1_%ENQ 0_0* CLEAR Q_^1_%LLS 4_0* PUT NEXT MOTION CODE IN Q_^1_%SQN NX35_-* YES, GO PROCESS ANOTHER MOTION COMMAND_^1_%SPC 1_^1NX30_!LDA- ESTAT1,I_$NORMAL EXIT - CLEAR MOTION BIT_^1_%AND- ZROBIT+6_**_^1_%STA- ESTAT1,I_**_^1_%JMP* NX40_.* GO TO EXIT_^1NX35_!RAO* NEXCAS_€€'INCREMENT RETURN ADDRESS TO DO NEXT FUNCTION_^1NX40_!JMP* (NEXCAS)_+*** EXIT ***_^1_%SPC 3_^1NX100 LDA- ADTFW,I_%UPDATE ECCOR_^1_%STA- ECCOR,I_+*_^1_%SPC 1_^1_%LDA- ESTAT1,I_$CHECK IF FORMATTED READ REQUEST_^1_%AND- LOWBTS+1_)* LOOK AT FORMAT FLAG_^1_%SAZ NX150_,* NO, CONTINUE_^1_%JMP* NX40_-* YES, DONE_^1_%SPC 1_^1NX150 LDA- ELSTWD,I_$CHECK IF ALL WORDS ARE READ_^1_%INA -1€¼_/* GET LAST WORD ADDRESS_^1_%SUB- ECCOR,I_** SUBTRACT CURRENT FROM LAST WORD ADDRESS_^1_%SAN NX160_,*_^1_%JMP* NX40_-* YES, DONE_^1NX160 JMP* NX35_-* NO, DO ANOTHER READ_^1_%END_]_^__ ¼PRECCAS CSY/ C39 P€1_%NAM RECCAS_'DECK-ID C39 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1****_]_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE RECOVERY ERROR PROCEDURES_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$THIS ROUTINE WILL BE ENTERED IF_^1*_'1.€€ LOST DATA OR CRC ERROR DETECTED ON READ/WRITE,OR_^1*_'2. RECOVERY IN PROGRESS BIT (8) IN ESTAT1 IS SET._^1*_$WRITE RECOVERY INVOLVES DOING A_^1*_*BACKSPACE/ERASE/REWRITE SEQUENCE_^1*_*UNTIL EITHER THE SEQUENCE ACCOMPLISHES A GOOD WRITE,_^1*_*OR 7 ATTEMPTS WERE UNSUCCESSFUL._^1*_*THE TAPE IS LEFT WITH THE BAD AREA ERASED._^1*_$READ RECOVERY INVOLVES DOING A_^1*_*BACKSPACE/REREAD €€SEQUENCE_^1*_*UNTIL EITHER A GOOD READ_^1*_*OR 5 ATTEMPTS WERE UNSUCCESSFUL._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$Q-REGISTER = ZERO IF NO STATUS ERROR_^1*_0= NON-ZERO IF ERROR._^1*_$I-REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*_$PDT(RFLAG) - BIT 15 SET INDICATES SKIP RECOVERY_^1*_$PDT(ESTAT1)- BIT 8 SET INDICATES RECOVERY IN PROGRESS_^1*_$PDT(RRETAD€€)- ADDRESS TO CONTINUE PROCESSING_^1*_2IF RECOVERY IN PROGRESS._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$PDT(ESTAT1)- BIT 8 IS SET ON ENTRY IF NOT SET_^1*_8(RECOVERY IN PROGRESS)_^1*_2BIT 8 IS CLEARED WHEN RECOVERY_^1*_8SEQUENCE IS COMPLETED._^1*_$PDT(ESTAT2)- BIT 2 IS SET IF RECOVERY SUCCESSFUL._^1*_2BIT 12 IS SET IF IRRECOVERABLE ERROR._^1*_$PDT(RCNTFG)- RECOVERY COUNTER INCREMEN€€TED IF RECOVERED._^1*_$PDT(RRETAD)- ABSOLUTE ADDRESS IN RECCAS FOR NEXT_^1*_2STEP IN RECOVERY SEQUENCE AFTER RETURN_^1*_2FROM KERNEL._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$FIRST ENTRY FROM KERNEL CONTINUATOR WHEN LOST DATA_^1*_%OR CRC ERROR. RECOVERY PROCEDURES ARE STARTED AND_^1*_%A RECOVERY IN PROGRESS FLAG IS SET SO THAT ON_^1*_$SUBSEQUENT ENTRIES FROM THE KERNEL CON€€TINUATOR WHILE_^1*_%PROCESSING THIS ERROR-RECOVERY-SEQUENCE THE CORRECT_^1*_%STEP IN RECCAS CAN BE JUMPED TO. RECOVERY-IN-PROGRESS_^1*_%FLAG SET TELLS RECCAS TO LOOK IN PDT WORD RRETAD FOR_^1*_%ABSOLUTE ADDRESS OF NEXT LOCATION IN RECCAS TO BE_^1*_%EXECUTED._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT RECCAS_^1*_]_^1*_8EXTERNAL REFERE€€NCES_^1*_8-------- ----------_^1_%EXT* FCAS_(FAULT ROUTINE_^1*_]_^1_%EJT 1_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. SAVE Q REGISTER IN ERROR INDICATOR WORD._^1*_$2. IF DIAGNOSTIC LU OR RECOVERY NOT ENABLED,_^1*_+EXIT TO FCAS._^1*_$3. IF RECOVERY NOT IN PROGRESS,_^1*_+SET RECOVERY IN PROGRESS FLAG._^1*_+SAVE REQUEST PARAMETERS (PDT WORDS MFLAG,QSTWD4)_^1*_+IF READ REQUEST GO TO READ RE€€COVERY_^1*_+ELSE GO TO WRITE RECOVERY._^1*_)ELSE_^1*_+GO TO NEXT STEP ADDRESS PREVIOUSLY SAVED IN RRETAD._^1*_$4. WRITE RECOVERY_^1*_)INITIALIZE RETRY COUNTER_^1*_$4A. SET UP RETURN ADDRESS (RRETAD)_^1*_)GO TO KERNEL TO EXECUTE BACKSPACE FUNCTION_^1*_)SET UP RETURN ADDRESS (RRETAD)_^1*_)GO TO KERNEL TO EXECUTE ERASE FUNCTION_^1*_)INCREMENT RETRY COUNTER_^1*_)IF MAX RETRIES DONE GO €€TO STEP 6._^1*_)IF ERROR ON ERASE GO TO 4A._^1*_)SET UP RETURN ADDRESS (RRETAD)_^1*_)GO TO KERNEL TO DO RE-WRITE._^1*_)IF ERROR ON WRITE GO TO 4A._^1*_)GO TO STEP 7._^1*_$5. READ RECOVERY_^1*_)INITIALIZE RETRY COUNTER_^1*_$5A. SET UP RETURN ADDRESS (RRETAD)._^1*_)GO TO KERNEL TO EXECUTE BACKSPACE FUNCTION_^1*_)SET UP RETURN ADDRESS (RRETAD)_^1*_)GO TO KERNAL TO EXECUTE RE-READ_^1*_€€)IF NO ERROR ON READ GO TO STEP 7._^1*_)DECREMENT RETRY COUNTER._^1*_)IF MAX RETRIES DONE GO TO STEP 6._^1*_)GO TO 5A._^1*_$6. SET IRRECOVERABLE ERROR BIT (12) IN ESTAT2._^1*_)EXIT TO FCAS WITH IRRECOVERABLE ERROR._^1*_$7. SET RECOVERED ERROR BIT (2) IN ESTAT2._^1*_)INCREMENT RECOVERY COUNT IN PDT(RCNTFG)._^1*_)INCREMENT KERNEL RETURN ADDRESS FOR RECOVERED ERROR_^1*_)CLEAR MOTION€€ AND RECOVERY FLAGS IN ESTAT1 (BITS 6,8)_^1*_)RESTORE PDT PARAMETERS (MFLG AND QSTWD4)._^1*_)EXIT TO KERNEL._^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OU€€T)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPT€€MENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20€€)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 AD€€T TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^€€1* LOW CORE EQUATES_^1*_]_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU ZERO($22)_#ZERO WORD CONSTANT_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1*_]_^1* LOCAL EQUATES_^1*_]_^1_%EQU RDTRY(5)_$NUMBER OF RETRIES FOR READ RECOVERY_^1_%EQU WRTRY(8)_$NUMBER OF RETRIES FOR WRITE RECOVERY_^1****_]_^1_%EJT 1_^1*_6**********_^1*_6* RECCAS *_^1*_6**********_^1*_]_^1*_]_^1RECCAS NUM 0_^1_€€%STQ* RERR_)SAVE ERROR INDICATOR_^1_%RTJ* RECLOC_'STORE RECCAS ABSOLUTE ADDRESS+2 IN RECLOC_^1RECLOC NUM 0_^1_%LDA- ELU,I_(GET LOGICAL UNIT_^1_%EOR- DIAGLU,I_$DIAGNOSTIC LOGICAL UNIT_^1_%SAN R01_*NO, CONTINUE_^1_%ENA 3_,YES, DO NOT ATTEMPT RECOVERY_^1R00_"JMP FCAS_)GO TO FAULT HANDLER IN KERNAL_)***_^1R01_"LDA- RFLAG,I_%IS RECOVERY ENABLED_^1_%SAP R05_*YES, SKIP TO CONTINUE_^1€€_%JMP* R00-1_(NO, RETURN WITH FAULT_^1R05_"LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND- ONEBIT+8_^1_%SAZ R10_*NO, SET FLAG AND SAVE PARAMETERS_^1_%LDQ- RRETAD,I_$YES, GO TO NEXT FUNCTION_^1_%JMP- (ZERO),Q_^1R10_"LDA- ESTAT1,I_$SET RECOVERY IN PROGRESS_^1_%AND- ZROBIT+8_^1_%ADD- ONEBIT+8_^1_%STA- ESTAT1,I_^1_%LDA- MFLG,I_'SAVE REQUEST PARAMETERS_^1_%STA* RMFLG_^1_%LDA- QSTWD4,I_€€^1_%STA* RQSTW4_^1_%LDA- ESTAT1,I_$READ OR WRITE_^1_%AND- ONEBIT+0_^1_%SAN RWRIT_^1_%JMP* RREAD_(READ OPERATION_^1_%EJT_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1RWRIT ENA -WRTRY_'MAXIMUM RETRY_^1_%STA* NCNT_)SET RETRY COUNTER_^1RW05_!LDQ- ONEBIT+12_#SET BACKSPACE MOTION CODE_^1_%LDA =XRW10-RECLOC SETUP NEXT RETURN_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW10_!LDQ- ONEBIT+14_#€€ERASE_^1_%LDA =XRW20-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW20_!RAO* NCNT_)UPDATE COUNTER_^1_%LDA* NCNT_)GET NUMBER OF ERASURES_^1_%SAM RW24_+* CHECK IF MAX REACHED_^1_%JMP* RFAULT_)* YES, FATAL_^1RW24_!LDQ* RERR_)GET ERROR INDICATOR_^1_%SQZ RW25_)SKIP IF NO ERROR_^1_%JMP* RW05_)ERASE UNSUCCESSFUL - GO BKSPACE/ERASE AGAIN_^1RW25_!LDA =XRW30-R€€ECLOC SETUP NEXT RETURN ENTRY_^1*_]_^1_%JMP* RECRWF_'EXECUTE A RE-WRITE_^1*_]_^1RW30_!LDQ* RERR_)GET ERROR INDICATOR_^1_%SQZ RW35_)CHECK IF ERROR_^1_%JMP* RW05_+* YES, DO ANOTHER BACKSPACE,ERASE_^1RW35_!JMP* RDONE_** NO, RECOVERED_^1_%EJT_]_^1*_]_^1*_]_^1* READ RECOVERY_^1*_]_^1RREAD ENA -RDTRY_'MAXIMUM RETRY_^1_%STA* NCNT_)SET RE-TRY COUNT_^1RD35_!LDA =XRD40-RECLOC SET UP NEXT€€ RETURN ENTRY_^1_%LDQ- ONEBIT+12_#BACKSPACE FUNCTION_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD40_!LDA =XRD50-RECLOC RETURN ENTRY_^1_%JMP* RECRWF_'EXECUTE RE-READ_^1*_]_^1RD50_!LDA* RERR_)GET ERROR INDICATOR_^1_%SAN RD55_+* CHECK IF ERROR_^1_%JMP* RDONE_** NO, DONE_^1*_]_^1RD55_!RAO* NCNT_)DECREMENT COUNTER_^1_%LDA* NCNT_)CHECK IF MAX RETRIES DONE_^1_%SAP RD60_+*_^1_%JMP* RD35€€_+* NO, LOOP_^1RD60_!JMP* RFAULT_)* YES, FATAL_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINES / STORAGE_^1*_]_^1RECFUN ADD* RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$SAVE NEXT RETURN ADDRESS_^1_%STQ- QSTWD4,I_$SAVE FUNCTION_^1_%ENA 0_^1_%STA- MFLG,I_'SET FLAG FOR MOTION REQUEST_^1_%JMP* REXIT_^1*_]_^1*_]_^1RECRWF ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$€€SETUP FOR NEXT RETURN_^1_%LDA* RQSTW4_'RESTORE WORD COUNT_^1_%STA- QSTWD4,I_^1_%ENA 1_,SET FLAG FOR R/W REQUEST_^1_%STA- MFLG,I_^1_%JMP* REXIT_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINE / STORAGE_^1*_]_^1RFAULT LDA- ESTAT2,I_$SET IRRECOVERABLE ERROR BIT_^1_%AND- ZROBIT+12_^1_%ADD- ONEBIT+12_^1_%STA- ESTAT2,I_^1_%ENA 41_+MAXIMUM ATTEMPTS REACHED_^1_%JMP FCAS_2*** EXIT, GO TO FAULT ROUT€€INE ***_^1*_]_^1*_]_^1RDONE LDA- ESTAT2,I_$SET RECOVERED BIT IN STATUS_^1_%AND- ZROBIT+2_^1_%ADD- ONEBIT+2_^1_%STA- ESTAT2,I_^1_%RAO- RCNTFG,I_$INCREMENT RECOVERY COUNT_^1_%RAO* RECCAS_'INCREMENT RETURN ADDRESS FOR RECOVERED ERROR_^1_%LDA- ESTAT1,I_$CLEAR FLAGS_^1_%AND- ZROBIT+6_$CLEAR MOTION IF SET_^1_%AND- ZROBIT+8_$CLEAR RECOVERY FLAG IF SET_^1_%STA- ESTAT1,I_^1_%LDA* RMFLG_(RE€8STORE PDT PARAMETERS_^1_%STA- MFLG,I_^1_%LDA* RQSTW4_^1_%STA- QSTWD4,I_^1REXIT JMP* (RECCAS)_.*** EXIT ***_^1*_]_^1RMFLG NUM 0_,HOLDER FOR PDT WORD - MFLAG_^1RQSTW4 NUM 0_,HOLDER FOR PDT WORD - QSTWD4_^1NCNT_!NUM 0_,ERASE COUNTER_^1RERR_!NUM 0_,Q-REG ENTRY VALUE, ERROR IF NON-ZERO_^1_%SPC 2_^1_%END_]_^__8PXCAS CSY/ C40 P€1_%NAM XCAS_)DECK-ID C40 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$INITIATE READ AND WRITE FUNCTIONS_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$THIS ROUTINE CHECKS IF THERE IS A SHORT RECO€€RD_^1*_$FAULT, OR A WRITE NOT ENABLED FAULT. IF NO_^1*_$ERRORS ARE FOUND, MICRO-INTERRUPTS ARE ENABLED,_^1*_$THE PARAMETERS IN THE ADT TABLE ARE SET UP FOR_^1*_$THE APPROPRIATE FUNCTION, AND THE SUBROUTINE_^1*_$IOCAS IS CALLED TO OUTPUT THE FUNCTION._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$NEED PDT ADDRESS IN I REGISTER - ACCESSES PDT PARAMS._^1*_]_^1*_8OU€€TPUT_^1*_8------_^1*_]_^1*_$SETS WORDS IN ADT TABLE IN PDT FOR CURRENT_^1*_$READ OR WRITE FUNCTION._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP FROM CALLING ROUTINE(KCAS)._^1*_$EXIT TO CALLER, OR IF ERROR TO FCAS._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_]_^1*_$1. IF SHORT RECORD AND NOT DIAGNOSTIC LU THEN_^1*_*EXIT TO FCAS(FAULT ROUTINE)._^1*_$2. SET UP ADT€€ TABLE BUFFER POINTERS_^1*_$3. IF FUNCTION IS A WRITE AND WRITE NOT ENABLED THEN_^1*_*EXIT TO FCAS._^1*_$4. SET UP ADT CONTROL WORD._^1*_$5. ENABLE MICRO INTERRUPT._^1*_$6. CALL IOCAS TO OUTPUT READ OR WRITE FUNCTION._^1*_$7. EXIT TO CALLER._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$FCAS_!- FAULT ROUTINE IN KERNEL (KCAS)._^1*_$IOCAS - HARDWARE I/O INTERFACE_^1*_]_^1*_8ENT€€RY POINTS_^1*_8----- ------_^1_%ENT XCAS_^1_%ENT XRADT_(WRITE ONE RECORD_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1_%EXT* FCAS_(FAULT ROUTINE_^1_%EXT* IOCAS_(HARDWARE I/O INTERFACE_^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADD€€RESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DA€€TA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 CO€€UNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT€€ TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST €€CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THREAD_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1*_]_^1_%EQU XCMIN(2)_$MINIMUM WORDS IN ONE RECORD_^1_%EQU XWFCN($5C0)_!FUNCTION - WRITE RECORD, ADT_^1_%EQU XRFCN($7C0)_!FUNCTION - READ RECORD, ADT_^1*_]_^1****_]_^1_%EJT 1_^1*_]_^1*_6********_^1*_6* XCAS *_^1*_6********_^1€€*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I-REGISTER_^1*_]_^1XCAS_!NUM 0_^1_%LDA- ELU,I_(CHECK IF DIAGNOSTIC LU IN USE_^1_%EOR- DIAGLU,I_)*_^1_%SAZ XC01_-* YES, ALLOW 1 WORD RECORD_^1_%LDA- QSTWD4,I_$CHECK IF SHORT RECORD_^1_%INA -XCMIN_+* SUBTRACT MINIMUM SIZE_^1_%SAP XC01_-* NO, CONTINUE_^1_%ENA 31_/* YES, SHORT RECORD FAULT CODE = 31_^1_%JMP FCAS_G**€€ ERROR EXIT **_^1_%SPC 1_^1XC01_!LDA- ECCOR,I_%SET UP ADT TABLE BUFFER POINTERS_^1_%STA* XCFWA_^1_%INA -1_-*_^1_%STA- ADTFW,I_(* FWA-1_^1_%SPC 1_^1_%LDA- ELSTWD,I_'*_^1_%STA* XCLWA_^1_%INA -1_-*_^1_%STA- ADTLW,I_(* LWA_^1_%SPC 1_^1_%SPC 1_^1_%SPC 1_^1_%LDA- ESTAT1,I_$CHECK IF READ OR WRITE_^1_%AND- ONEBIT_+*_^1_%SAZ XC05_-* READ_^1_%SPC 1_^1_%RTJ* XWADT_(DO THE WRITE_^1_%J€€MP* XC10_^1_%SPC 1_^1XC05_!RTJ* XRADT_(DO THE READ_^1XC10_!JMP* (XCAS)_**** RETURN ***_^1*_]_^1*_]_^1XCFWA NUM 0_,CURRENT FIRST WORD ADDRESS_^1XCLWA NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT 1_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1XWADT NUM 0_^1_%SPC 1_^1_%ENA 4_,CHECK IF WRITE ENABLED_^1_%AND- SENTRY,I_)* LOOK AT ENTRY STATUS_^1_€€%SAN XWADT1_+* YES, CONTINUE_^1_%ENA 13_/* NO, FAULT CODE = 13 (WRITE NOT ENAB)_^1_%JMP FCAS_G** ERROR EXIT **_^1_%SPC 1_^1XWADT1 LDA- EWES,I_'SET ADT CONTROL WORD_^1_%INA -1_-* SET EQUIPMENT CODE, DIR = 0_^1_%ADD- ONEBIT+11_%* SET WRITE BIT_^1_%ADD- ONEBIT+13_%* SET CHARACTER MODE_^1_%STA- ADTCW,I_(* PUT IN ADT TABLE_^1_%SPC 1_^1_%RTJ* XMICRO_'ENABLE MICRO INTERRUPT_^1_%SPC €€ 1_^1_%LDA =XXWFCN_%GET WRITE FUNCTION_^1_%RTJ IOCAS_(OUTPUT FUNCTION_^1_%JMP* (XWADT)_%RETURN_^1*_]_^1* READ DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1XRADT NUM 0_^1_%LDA- EWES,I_'SET ADT CONTROL WORD_^1_%INA -1_-* SET EQUIPMENT CODE, DIR = 0_^1_%ADD- ONEBIT+13_%* SET CHARACTER MODE_^1_%STA- ADTCW,I_(* PUT IN ADT TABLE_^1_%SPC 1_^1_%RTJ* XMICRO_'ENABLE€€ MICRO INTERRUPT_^1_%SPC 1_^1_%LDA =XXRFCN_%GET READ FUNCTION_^1_%RTJ IOCAS_(OUTPUT FUNCTION_^1_%JMP* (XRADT)_%RETURN_^1*_]_^1* ENABLE MICRO INTERRUPT_^1* ENTER WITH ADT TABLE SET UP_^1*_]_^1XMICRO NUM 0_^1_%LDA- I_,GET PDT TABLE ADDRESS_^1_%INA ADTCW_(GET ADT TABLE ADDRESS_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ- ONEBIT+15_#ENABLE BIT_^1_%NUM $0B06_(DEFINE MICRO INTERRUPT (D€2MI)_^1_%JMP* (XMICRO)_$RETURN_^1*_]_^1_%END_]_^__ 2PVCAS CSY/ C41 P€1_%NAM VCAS_)DECK-ID C41 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$VCAS VERIFIES THAT THE INTERRUPT IS VALID_^1*_$AND SETS PDT WORDS TO INDICATE INTERRUPT_^1*_$CONDITIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8----€€--- -----------_^1*_]_^1*_$IF THE DRIVER IS NOT BUSY A GHOST INTERRUPT IS ASSUMED,_^1*_$INTERRUPTS ARE CLEARED, GHOST COUNT IS INCREMENTED IN PDT_^1*_$AND STATUS SAVED IN PDT._^1*_$FOR A VALID INTERRUPT, INTERRUPTS ARE CLEARED, STATUS_^1*_$IS SAVED, AND THE DIAGNOSTIC CLOCK IS SET TO NEGATIVE 1._^1*_$THE SELECT FLAG IS CHECKED AND CLEARED IF NEEDED, AND_^1*_$THE APPROPRIATE RETURN €€IS SET UP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$I REGISTER = INITIAL PDT ADDRESS_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$PDT(EDCLK) SET TO -1 IF VALID INTERRUPT_^1*_$PDT(ESTAT1) BIT 7 (SELECT FLAG) CLEARED IF SET_^1*_$PDT(GHOSTI) INCREMENTED IF GHOST INTERRUPT_^1*_$A-REGISTER CONTAINS STATUS ON EXIT._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTER BY R€€ETURN JUMP FROM CONTINUATOR_^1*_$EXITS TO CGHOST IF INVALID INTERRUPT,_^1*_+TO CALLER IF VALID INTERRUPT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_$CGHOST - GHOST ERROR CHECKER_^1*_$IOCAS - HARDWARE I/O INTERFACE_^1*_]_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1*_]_^1_%ENT VCAS_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1*_]_^1_%EXT CG€€HOST_'GHOST ERROR CHECKER_^1_%EXT* ICPDT_(CURRENT PDT ADDRESS (BUSY FLAG)_^1_%EXT* SELCAS_'SELECT UNIT ROUTINE_^1_%EXT* IOCAS_(HARDWARE I/O INTERFACE_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU €€EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^€€1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO €€INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE€€ (FWA-1)_^1_%EQU ADTLW(28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU€€ ELINK(36)_#36 PDT THREAD_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU ONEBIT($23)_!SINGLE BIT MASK_^1_%EQU ZROBIT($33)_!BIT EXCLUSION MASK_^1_%EQU CLRINT(-8)_"IN IOCAS THIS CANCELS EOP INT, LEAVES CLR INT_^1*_]_^1****_]_^1_%EJT 1_^1*_]_^1*_6*****************************_^1*_6* VERIFY CASSETTE INTERRUPT *_^1*_6*****************************_^1*_]_^1* ENTER WITH PDT ADDRESS IN I RE€€GISTER_^1*_]_^1VCAS_!NUM 0_^1_%LDQ ICPDT_(CHECK IF DRIVER BUSY_^1_%SQZ VCAS01_+* NO_^1_%STQ- I_0* YES, PUT CURRENT PDT IN I_^1VCAS01 ENA CLRINT_'CLEAR MACRO INTERRUPT_^1_%RTJ IOCAS_(OUTPUT FUNCTION_^1_%SPC 1_^1_%CLR A_,ZERO A TO INDICATE STATUS_^1_%RTJ IOCAS_(INPUT STATUS_^1_%STA* VCSTAT_'SAVE STATUS_^1_%STA- SINTER,I_$SAVE STATUS AFTER INTERRUPT_^1_%SPC 1_^1_%LDQ ICPDT_(€€CHECK IF GHOST INTERRUPT (IS DCAS NOT BUSY)_^1_%SQN VCAS15_'NO, CHECK FURTHER_^1_%SPC 1_^1_%LDA- I_^1_%STA* VCSPDT_^1*_]_^1VCAS05 RAO- GHOSTI,I_$YES, BUMP GHOST COUNT IN ALL PDTS_^1_%LDA* VCSTAT_'PICK UP STATUS_^1_%STA- SINTER,I_$SAVE STATUS IN PDT_^1_%LDA- ELINK,I_%GET NEXT PDT_^1_%STA- I_^1_%EOR* VCSPDT_'CHECK IF EQUAL TO START_^1_%SAZ VCAS10_'YES, DONE_^1_%JMP* VCAS05_'NO, DO€€ NEXT ONE_^1VCAS10 RTJ CGHOST_4GHOST CHECKER AND EXIT ***_^1_%SPC 1_^1*_]_^1VCAS15 LDQ- MICROI,I_$GET MICRO INTERRUPT NUMBER_^1_%NUM $0B06_(CLEAR MICRO INTERRUPT_^1_%ENA -1_^1_%STA- EDCLK,I_%SET DIAGNOSTIC CLOCK NEGATIVE_^1_%SPC 1_^1_%LDA- ESTAT1,I_$GET DRIVER STATUS WORD_^1_%AND- ONEBIT+7_$CHECK IF SELECT IN PROGRESS_^1_%SAN VCAS20_'YES, SET UP SELECT RETURN_^1*_]_^1_%LDA* V€@CSTAT_'PICK UP STATUS_^1_%JMP* (VCAS)_'*** RETURN ***_^1*_]_^1VCAS20 LDA- ESTAT1,I_$CLEAR SELECT FLAG_^1_%AND- ZROBIT+7_)*_^1_%STA- ESTAT1,I_)*_^1_%LDA* VCSTAT_'EXIT WITH STATUS IN A_^1*_]_^1_%JMP (SELCAS)_$*** RETURN (VIA SELECT) ***_^1_%SPC 2_^1VCSPDT NUM 0_,ENTRY PDT ADDRESS_^1VCSTAT NUM 0_,STATUS_^1_%END_]_^__ @PWAITCS CSY/ C42 P€1_%NAM WAITCS_'DECK-ID C42 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$SET UP DIAGNOSTIC CLOCK AND RELEASE CONTROL UNTIL_^1*_$INTERRUPT OCCURS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8------- -----------_^1*_]_^1*_$SEL€€ECT TIMEOUT VALUE CORRESPONDING TO FUNCTION TO_^1*_$BE EXECUTED. ADD TO THIS ADDITIONAL TIME INDICATED_^1*_$IN PDT(TIMOUT) WORD. SET THIS VALUE IN DIAGNOSTIC_^1*_$CLOCK, PDT(EDCLK), AND EXIT._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8----- ------------_^1*_]_^1*_$I-REGISTER = CURRENT PDT ADDRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$PDT(EDCLK) SET TO TIMEOUT VALUE._^1*_]_^1*_8ENTRY/E€€XIT_^1*_8----------_^1*_]_^1*_$ENTERED BY JUMP INSTRUCTION._^1*_$EXITS TO DISPATCHER TO WAIT FOR INTERRUPT._^1*_]_^1_%EJT 1_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. IF REQUEST IS A MOTION REQUEST THEN_^1*_*IF REQUEST IS SELECT OR WRITE TAPE MARK THEN_^1*_,ENTER SHORT FUNCTION TIME._^1*_*IF REQUEST IS SEARCH TAPE MARK THEN_^1*_,ENTER TIME TO SEARCH TAPE MARK THRU ENTIRE TAPE_^1*_*IF REQUE€€ST IS REWIND THEN_^1*_,ENTER TIME FOR ENTIRE TAPE REWIND_^1*_*IF REQUEST IS BACKSPACE OR ADVANCE RECORD_^1*_,GO TO 2_^1*_$2. ELSE_^1*_*ENTER TIME TO PASS THROUGH MAXIMUM RECORD._^1*_$3. ADD ANY ADDITIONAL TIME FROM PDT(TIMOUT)._^1*_$4. SET VALUE IN DIAGNOSTIC CLOCK WORD, PDT(EDCLK)._^1*_$5. EXIT TO DISPATCHER TO WAIT FOR INTERRUPT._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_€€$NONE_^1*_]_^1*_8ENTRY POINTS_^1*_8----- ------_^1_%ENT WAITCS_^1*_]_^1*_8EXTERNAL REFERENCES_^1*_8-------- ----------_^1*_]_^1_%EJT 1_^1*_8EQUATE REFERENCES_^1*_8------ ----------_^1*_]_^1* PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRE€€SS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 €€LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU€€ TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTSEL(24)_"24 UNIT SELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU ADTCW(26)_#26 ADT TABLE (CONTROL WORD)_^1_%EQU ADTFW(27)_#27 ADT TABLE (FWA-1)_^1_%EQU ADTLW(€€28)_#28 ADT TABLE (LWA)_^1_%EQU MFLG(29)_$29 ADT TABLE (DUMMY WORD)_^1_%EQU RRETAD(30)_"30 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(31)_"31_!RECOVERY CHECKSUM_^1_%EQU RCNTFG(32)_"32 RECOVERY COUNT FLAG_^1_%EQU RFLAG(33)_#33 RECOVERY FLAG (BIT 15 = 1, NO RECOVERY)_^1_%EQU QSTCOD(34)_"34 REQUEST CODE_^1_%EQU QSTWD4(35)_"35 WORD 4 OF REQUEST_^1_%EQU ELINK(36)_#36 PDT THR€€EAD_^1*_]_^1* LOW CORE EQUATES_^1*_]_^1_%EQU DISP($EA)_#DISPATCHER ADDRESS_^1*_]_^1_%EQU MAXREC(80)_"MAXIMUM RECORD READ TIME (SEC)_^1_%EQU MAXREW(90)_"MAXIMUM REWIND TIME (SEC)_^1MAXSTM NUM 440_*MAXIMUM SEARCH TAPE MARK TIME (SEC)_^1*_]_^1****_]_^1_%EJT 1_^1*_6**********_^1*_6* WAITCS *_^1*_6**********_^1*_]_^1* CASSETTE WAIT ANCILLARY ROUTINE_^1*_]_^1WAITCS LDA- MFLG,I_'GET €€REQUEST TYPE FLAG (MOTION=0)_^1_%SAN WRW_*SKIP IF READ/WRITE REQUEST_^1_%SPC 1_^1_%LDA- QSTCOD,I_$CHECK WHICH MOTION_^1_%SAZ W3_/* FOR SELECT, ERASE_^1_%INA -1_/*_^1_%SAZ WRW_.* BACKSPACE_^1_%SPC 1_^1_%INA -1_/*_^1_%SAZ W3_/* WRITE TAPE MARK_^1_%SPC 1_^1_%INA -3_/*_^1_%SAM WREW_-* REWIND_^1_%SPC 1_^1_%INA -2_/*_^1_%SAM WSTM_-* SEARCH TAPE MARK_^1_%SPC 1_^1*_<* TIME F€€OR READ/WRITE, BACKSPACE, ADV REC_^1WRW_"ENA MAXREC_'ENTER TIME TO PASS THROUGH MAX RECORD_^1_%JMP* WONE_^1_%SPC 1_^1WSTM_!LDA* MAXSTM_'ENTER TIME TO SEARCH TAPE MARK THRU ENTIRE TP_^1_%JMP* WONE_^1_%SPC 1_^1WREW_!ENA MAXREW_'ENTER TIME FOR ENTIRE TAPE REWIND_^1_%SPC 1_^1W3_#INA 3_,ADD SHORT FUNCTION TIME_^1WONE_!ADD- TIMOUT,I_$ADD ANY ADDITIONAL TIME_^1_%STA- EDCLK,I_%SET CL€POCK VALUE IN PDT_^1_%SPC 1_^1_%JMP- (DISP)_'GO WAIT FOR INTERRUPT_^1_%END_]_^__PPQMLCT7 CSY/ C43 P€1_%NAM QMLCT7_'DECK-ID C43 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_*INITIALIZER DRIVER FOR 7 TRACK LCTT MAGNETIC TAPE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1****_]_^1*_8INITIALIZER LCTT DRIVER_^1*_8***********************_^1*_]_^1*_*PROGRAM BASE -_^1*_]_^1*_*LCTT KERNAL DRIVER ODS LEVEL€€ II - LCTT 07/01/75_$REV 05_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_]_^1*_$THE INITIALIZER DRIVER PROCESSES ALL READ REQUESTS_^1*_$ISSUED BY THE MSOS SYSTEM INITIALIZER._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE PURPOSE OF THIS SUBROUTINE IS TO PROCESS READ_^1*_$REQUESTS ISSUED BY THE SYSTEM INITIALIZER. THE_^1*_$MAXIMUM RECORD SIZE IS 96 WO€€RDS AND THE BUFFER IS_^1*_$SPECIFIED BY THE USER. THE 7-TRACK VERSION OF THIS_^1*_$DRIVER HAS AN INTERMEDIATE BUFFER WHICH IS USED TO_^1*_$UNPACK THE DATA WHICH HAS BEEN READ. ALL DIAGNOSED_^1*_$ERRORS ARE RETURNED TO THE CALLING PROGRAM (IDRIV)_^1*_$WHICH WILL REPORT THEM TO THE OPERATOR._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(A) REGISTER = START€€ING BUFFER ADDRESS_^1*_]_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$OUTPUTS ERROR DIAGNOSTICS IF ERRORS OCCUR._^1*_$(A) REGISTER = 0 TO INDICATE AN ERROR HAS OCCURRED._^1*_$(Q) REGISTER = ERROR CODE (SEE OUTPUT SECTION IN KERNAL_^1*_$SUBROUTINE (KLCTT) FOR ERROR CODE DESCRIPTION)._^1*_$(I) REGISTER = LAST HARDWARE STATUS FROM LCTT MAG TAPE DRIVE_^1*_]_^1*E_]_^1*_8ENTRY/EXIT_^1*_8----€€------_^1*_]_^1*_$1._!ENTRY - THE ENTRY POINT 'QMTAPE' IS CALLED BY THE_^1*_*INITIALIZER SUBROUTINE 'IDRIV' TO INITIATE INPUT_^1*_*FROM A MAGNETIC TAPE UNIT. THE A-REGISTER CONTAINS_^1*_*THE STARTING ADDRESS INTO WHICH DATA IS TO BE READ,_^1*_*IN ORDER TO FACILITATE THE USE OF THE MSOS LCTT_^1*_*KERNAL DRIVER AS THE BASE OF THIS DRIVER, A PSEUDO_^1*_*MSOS FREAD REQUEST 'REQUEST' I€€S INCLUDED AS PART_^1*_*OF THIS PROGRAM. A PRESET PHYSICAL DEVICE TABLE_^1*_*'PLCTUO' IS ALSO INCLUDED HERE._^1*_]_^1*_$2._!EXIT - THIS DRIVER EXITS TO 'IDRIV' WHEN THE DATA_^1*_*TRANSFER IS COMPLETE. IF NO ERRORS HAVE OCCURRED,_^1*_*THE A-REGISTER WILL CONTAIN A 1._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. SAVE THE CONTENTS OF THE I-REGISTER FOR RETURN._^1*_$2. CALCULATE THE ADD€€RESS OF THE LCTT PHYSICAL DEVICE_^1*_)TABLE AND STORE IN THE I-REGISTER._^1*_$3. CALCULATE THE ADDRESS OF THE PSEUDO FREAD REQUEST AND_^1*_)STORE IN WORD 6 OF THE PHYSICAL DEVICE TABLE._^1*_$4. CALCULATE THE ADDRESS OF THE PACK/UNPACK BUFFER AND_^1*_)STORE IN WORD 38 OF THE PHYSICAL DEVICE TABLE._^1*_$5. SAVE THE STARTING BUFFER ADDRESS AND ENDING BUFFER_^1*_)ADDRESS IN THE PHYS€€ICAL DEVICE TABLE._^1*_$6. CALL THE KERNAL SUBROUTINE._^1*_$7. UPON RETURN, DETERMINE IF ANY ERRORS OCCURRED._^1*_.IF NO ERRORS OCCURRED, RETURN TO THE CALLING_^1*_.PROGRAM WITH THE A-REGISTER SET TO 1 AND THE_^1*_.I-REGISTER SET TO THE VALUE UPON ENTRY._^1*_]_^1*_.IF ERRORS OCCURRED, CLEAR THE ERROR FLAGS,_^1*_.SET THE A-REGISTER TO 0, SET THE Q-REGISTER TO_^1*_.THE ERROR CODE V€€ALUE, AND THE I-REGISTER TO THE_^1*_.LAST STATUS READ ON THE LCTT._^1*_$8. RETURN TO THE CALLING PROGRAM._^1*_]_^1*_]_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*KLCTT - LCTT KERNEL_^1*_]_^1*_]_^1*_8PARAMETERS_^1*_8----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT QMTAPE_'COMMON ENTRY TO INITIALIZER MAGNETIC TAPE_^1_%ENT EMTAPE_'BASIC W, E, S FUNCTION CO€€DE_^1*_]_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1*_*MISCELLANEOUS EQUATES_^1*_]_^1_%EQU NOISLN(2)_#LENGTH OF NOISE RECORD_^1_%EQU LEWES($0480) EQUIPMENT CODE EQUATE_^1_%EQU MICRIN(9)_#MICRO INTERRUPT LINE EQUATE_^1_%EQU TLCT7(53*$10) TYPE CODE FOR 7 TRACK DRIVES_^1_%EQU TLCT9(54*$10) TYPE CODE FOR 9 TRACK DRIVES_^1*_]_^1*_*SELECT UNIT AND DENSITY EQUATES_^€€1_%EQU U0TK7($800)_!UNIT/TRACK SELECT - UNIT 0/7 TRACK_^1_%EQU U0TK9(0)_$UNIT/TRACK SELECT - UNIT 0/9 TRACK_^1_%EQU D800($100)_"DENSITY SELECT - 800 BPI_^1_%EQU D556($200)_"DENSITY SELECT - 556 BPI_^1_%EQU PHSREX(192)_!MAXIMUM PHYSICAL RECORD SIZE - 7 TRACK_^1_%EQU LNLCTT(0)_^1_%EQU SLCTT($7FFF)_^1*_]_^1*_]_^1*_]_^1*E_]_^1*_*PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU €€ ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_€€$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGL€€U(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE SELECT€€_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG_^1_%EQU ADTCW(27)_#27 ADT TABLE CONTROL WORD_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG(ALSO ADT DUMMY)_^1_%EQU RRETAD(31)_"31 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(32)_"32 RECOVERY CHECKSUM_^1_%EQU RCNTFG(33)_"33 R€€ECOVERY COUNT FLAG_^1_%EQU RFLAG(34)_#34 RECOVERY FLAG, BIT15=1=NO RECOVERY_^1_%EQU QSTCOD(35)_"35 REQUEST CODE_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU PHSREC(37)_"37 MAX PHYSICAL RECORD SIZE_^1_%EQU ABUFF(38)_#38 PACK/UNPACK BUFFER ADDRESS_^1_%EQU ELINK(39)_#39 PDT THREAD_^1*E_]_^1*_8MESSAGES_^1*_8--------_^1*_]_^1*_*THE INITIALIZER INPUT CONTROL SUBROUTINE WI€€LL PRINT_^1*_*FAULT CODES FOR ALL DRIVER DIAGNOSED ERRORS._^1*_]_^1*E_]_^1*_8MISCELLANEOUS_^1*_8-------------_^1*_]_^1*_]_^1*_$LCTT HARDWARE REGISTER DEFINITIONS_^1*_]_^1*_/***************************************_^1*_/* FUNCTION AND CONDITION BIT REGISTER *_^1*_/***************************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$FUNCTION_^1*_$1_$FUNCTION_^1*_$2_$FUNCTI€€ON_^1*_$3_$FUNCTION_^1*_]_^1*_$4_$SKIP FIRST BYTE_^1*_$5_$SKIP LAST BYTE_^1*_$6_$NOT USED_^1*_$7_$NOT USED_^1*_]_^1*_$8_$DENSITY - FORM = BIT8BIT9 = XXX BPI_^1*_$9_$DENSITY - 01 = 800, 10 = 556, 11 = 200 BPI_^1*_$10_#PARITY - 1 = EVEN, 0 = ODD_^1*_$11_#TRACK - 1 = 7 TRACK, 0 = 9 TRACK_^1*_]_^1*_$12_#UNIT NUMBER_^1*_$13_#UNIT NUMBER_^1*_$14_#NOT USED_^1*_$15_#NOT USED_^1*E_]_^1*_/**€€*************************_^1*_/* HARDWARE FUNCTION CODES *_^1*_/***************************_^1*_$CODE_!FUNCTION_^1*_]_^1*_$0_$NOT USED, RESULTS IN PROGRAM ERROR_^1*_$1_$READ_^1*_$2_$WRITE_^1*_$3_$ERASE_^1*_$4_$BACKSPACE_^1*_$5_$REWIND_^1*_$6_$REWIND AND UNLOAD_^1*_$7_$WRITE TAPE MARK_^1*_$8_$SELECT_^1*_$9_$RECOVERY READ_^1*_$A_$CONTROLLED BACKSPACE_^1*_$B_$DIAGNOSTIC CODE_^1*_$C_$D€€IAGNOSTIC CODE_^1*_$D_$DIAGNOSTIC CODE_^1*_$E_$DIAGNOSTIC CODE_^1*_$F_$DIAGNOSTIC CODE_^1*E_]_^1*_/****************************_^1*_/* HARDWARE STATUS REGISTER *_^1*_/****************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$INOP - DURING SELECTION_^1*_$1_$BUSY_^1*_$2_$REWINDING_^1*_$3_$READ AFTER WRITE COMMAND_^1*_]_^1*_$4_$WRITE LOCKOUT_^1*_$5_$NOT USED_^1*_$6_$PROGRA€€M ERROR_^1*_$7_$HALF WORD ON READ_^1*_]_^1*_$8_$SHORT BLOCK_^1*_$9_$TIME OUT_^1*_$10_#DROUPOUT/PICKUP_^1*_$11_#OVERLOAD_^1*_]_^1*_$12_#INOP - DURING EXECUTION_^1*_$13_#DATA ERROR_^1*_$14_#TAPE MARK_^1*_$15_#EOT_^1****_]_^1_%EJT_]_^1QMTAPE NOP 0_^1_%LDQ- I_,SAVE IHE I REGISTER FOR RETURN_^1_%STQ* SAVEIX_^1_%RTJ* HERE_)CALCULATE ADDRESS OF LCTT PHYSTB_^1HERE_!NOP 0_^1_%LDQ* HERE_^1€€_%ADQ =XPLCTU0-HERE_^1_%STQ- I_,AND SAVE IN THE I-REGISTER_^1_%LDQ* HERE_)CALCULATE ADDRESS OF PSEUDO REQUEST_^1_%ADQ =XREQUST-HERE_^1_%STQ- EPTR,I_^1_%LDQ* HERE_)CALCULATE ADDRESS OF PACK/UNPACK BUFFER_^1_%ADQ =XBFLCTT-HERE_^1_%STQ- ABUFF,I_^1_%SAP ACTADR_'IF ADDRESS IS NEGATIVE_^1_%TCA A_,COMPLIMENT ADDRESS_^1ACTADR STA- ECCOR,I_%SAVE STARTING BUFFER ADDRESS IN PDT_^1_%STA* €€STRTAD_'SAVE STARTING ADDRESS IN PSEUDO REQUEST_^1_%ADD* NWORDS_'CALCULATE ENDING BUFFER ADDRESS_^1_%STA- ELSTWD,I_$AND SAVE IN PDT_^1_%LDA- EWES,I_'SET UP ADT CONTROL WORD FOR THIS EQUIPMENT_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1_%RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODE_^1_%ENA $0003_(GET ANY NOISE REC OR RECOVERY TO_^1_%AND- RFLAG,I_%LOG TO THE OPERATOR_^1_%ADD*€€ IERR_)WERE THERE ANY ERRORS TO OUTPUT_^1_%SAN ERRCOD_'YES_^1_%LDQ* SAVEIX_'RESTORE I-REGISTER TO USER_^1_%STQ- I_^1_%ENA 1_,NO, A = 1 FOR NORMAL RETURN_^1_%JMP* (QMTAPE)_$RETURN_^1ERRCOD LDQ- FLTCOD,I_$PUT ERROR CODE INTO Q-REGISTER_^1_%LDA- RFLAG,I_%CLEAR RECOVERY FLAGS_^1_%AND =N$8000_^1_%STA- RFLAG,I_^1_%LDA- ESTAT2,I_$STATUS TO I-REG ON ERROR._^1_%STA- I_^1_%ENA 0_,CLEAR E€€RROR FLAG_^1_%STA* IERR_^1_%JMP* (QMTAPE)_$RETURN. A = 0 FOR ERROR._^1_%EJT_]_^1IERR_!NUM 0_,TEMPORARY HOLD FOR ERROR FLAG_^1SAVEIX NUM 0_,TEMPORARY HOLD FOR I-REGISTER_^1REQUST NUM $0800_(FORMAT READ_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDS NUM $0060_(LENGTH OF REQUEST_^1STRTAD NUM $0000_(STARTING ADDRESS_^1_%EJT_]_^1*_€€*L C T T M A G T A P E_^1*_]_^1*_]_^1*_]_^1BFLCTT BZS BFLCTT(PHSREX*4/3+2) PACK/UNPACK BUFFER FOR 7 TK_^1*_]_^1*_]_^1*_*L C T T M A G T A P E , U N I T 0_^1*_]_^1* UNIT 0 - 7 TRACK, 556 BPI_^1*_]_^1PLCTU0 ADC $0000_)0 ELVL - SCHEDULER CALL_(NOT USED_^1_%ADC 0_-1 EDIN - INITIATOR ADDRESS_$NOT USED_^1_%ADC 0_-2 EDCN - CONTINUATOR ADDRESS_"NOT USED_^1_%ADC 0_-3 EDPGM - ERR€€OR ADDRESS_(NOT USED_^1_%NUM -1_,4 EDCLK - DIAGNOSTIC CLOCK_^1_%NUM $0003_)5 ELU - LOGICAL UNIT_^1_%NUM 0_-6 EPTR - PARAMETER ADDRESS_^1EMTAPE ADC LEWES_)7 EWES - EQUIPT CODE FOR SAMPLE_^1_%ADC $806+TLCT7_#8 EREQST - REQUEST STATUS_^1_%NUM $0002_)9 ESTAT1 - DRIVER STATUS_^1_%NUM 0_,10 ECCOR - NEXT LOCATION OF DATA_^1_%NUM 0_,11 ELSTWD - LAST LOCATION + 1_^1_%NUM 0_,12 ESTA€€T2 - LAST EQUIPTMENT STATUS_^1_%ADC LNLCTT_'13 MASLGN - DRIVER LENGTH_^1_%ADC SLCTT_(14 MASSEC - MASS MEMORY ADDRESS OF DRIVER_^1_%NUM 0_,15 RETURN - FNR RETURN ADDRESS_^1_%NUM 0_,16 FLTCOD - FAULT CODE IF REQUEST ERROR_^1_%ADC 0_,17 DIAGLU - DIAGNOSTIC LOGICAL UNIT (NOT USED)_^1_%NUM 0_,18 GHOSTI - COUNT OF GHOST INTERRUPTS_^1_%ADC MICRIN_'19 MICROI - MICRO INTERRUPT LINE_^€€1_%NUM 0_,20 TIMOUT - INTERRUPT TIMEOUT VALUE_^1_%NUM 0_,21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_%NUM 0_,22 SINTER - STATUS AFTER INTERRUPT_^1_%NUM 0_,23 STIMEO - STATUS AFTER INTERRUPT TIMEOUT_^1_%ADC U0TK7+D556_"24 UNTMOD - UNIT AND MODE SELECT_^1_%NUM 0_,25 ETEMP1 - TEMPORARY STORAGE_^1_%NUM 0_,26 HAFWRD - HALF WORD FLAG_^1_%NUM $8480_(27 ADTCW - ADT TABLE CONTROL WORD€€_^1_%NUM 0_,28 ADTFW - ADT TABLE FWA-1_^1_%NUM 0_,29 ADTLW - ADT TABLE LWA_^1_%NUM 0_,30 MFLG - ADT TABLE DUMMY (ALSO REQUEST FLAG)_^1_%NUM 0_,31 RRETAD - RECOVERY RETURN ADDRESS_^1_%NUM 0_,32 RCKSUM - RECOVERY CHECKSUM_^1_%NUM 0_,33 RCNTFG - RECOVERY COUNT FLAG_^1_%NUM 0_,34 RFLAG - RECOVERY TEMP STORAGE_^1_%NUM 0_,35 QSTCOD - REQUEST CODE_^1_%NUM 0_,36 QSTWD4 - WORD 4 O€€F REQUEST_^1_%ADC PHSREX_'37 PHSREC - MAX PHYSICAL RECORD SIZE_^1_%ADC BFLCTT_'38 ABUFF - PACK/UNPACK BUFFER ADDRESS_^1_%ADC PLCTU0_'39 ELINK - PDT THREAD_^1_%EJT_]_^1*_$NAM KLCTT_(ODS LEVEL II - LCTT_*07-01-75 REV 06_^1*_$LCTT KERNEL_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1975_^1****_]_^1*E_]_^1*_8LCTT KERNEL_^1*_8********€€***_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_$THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_$PERFORMS THE I/O BY CALLING ANCILLARY ROUTINES._^1*_$IT ALSO PROCESSES ERRORS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE KERNAL IS COMPOSED OF TWO BASIC PARTS._^1*_$ONE TO PROCESS INFORMATION NECESSARY TO EXECUTE THE I/O_^1*_$REQUEST AND ONE TO PROCESS THE INFO€€RMATION FOLLOWING THE I/O._^1*_]_^1*_$PRIOR TO I/O, THE STATUS TO DETERMINE IF THE DEVICE IS_^1*_$OPERATIVE IS TAKEN. THE REQUEST TYPE IS DETERMINED,_^1*_$THE INITIAL UNIT CONNECTION IS MADE, AND THE APPROPRIATE I/O_^1*_$SUBROUTINE IS CALLED._^1*_]_^1*_$AFTER COMPLETION OF THE I/O REQUEST, STATUS IS TAKEN TO_^1*_$DETERMINE IF ANY ERRORS HAVE OCCURRED AND IF RECOVERY_^1*_$ACTION IS€€ POSSIBLE. IF THE TRANSFER IS CORRECT AND THE_^1*_$DEVICE IS A 7-TRACK UNIT, THE DATA IS UNPACKED FROM THE_^1*_$INTERNAL BUFFER INTO THE USER BUFFER. WHEN THE_^1*_$REQUEST IS SATISFIED CONTROL WILL BE RETURNED TO_^1*_$THE DRIVER._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$INITIATOR (KLCTT)_^1*_)(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*E_]_^1€€*_8OUTPUT_^1*_8------_^1*_]_^1*_$THE OUTPUTS OF THE KERNEL ARE -_^1*_]_^1*_$1. STATUS_^1*_(PRE-I/O TRANSFER STATUS TO PDT_^1*_(POST-I/O TRANSFER STATUS TO PDT_^1*_]_^1*_$2. FAULT CODE IS SET IF ERROR AS FOLLOWS -_^1*_)1 LOST DATA_^1*_)2 ALARM_^1*_)3 PARITY_^1*_(13 NO WRITE RING_^1*_(14 NOT READY_^1*_(15 NOISE RECORD DETECTED AND IGNORED_^1*_(31 WRITE OF SHORT RECORD REQUESTED_^1*_(€€41 IRRECOVERABLE ERROR_^1*_]_^1*_]_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1. EXITS TO DRIVER (CALLING ROUTINE) ON FAULT_^1*_.DETECTION, COMPLETION OF REQUEST._^1*_]_^1*E_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$PRE-I/O TRANSFER -_^1*_*1. SELECT AND STATUS TRANSPORT; SAVE STATUS._^1*_*2. IF BUSY OR INOPERATIVE CALL FAULT ROUTINE._^1*_*3. DETERMINE TYPE OF REQUEST AND CALL MOTION_^€€1*_-OR READ/WRITE ANCILLARY ROUTINE._^1*_*4. CALL WAIT SUBROUTINE TO WAIT FOR NOT BUSY_^1*_]_^1*_$POST-I/O TRANSFER -_^1*_*1. SAVES AND CHECKS THE DEVICE STATUS. IF A_^1*_-7-TRACK FILE MARK IS SENSED, THE STATUS WORDS_^1*_-ARE MODIFIED TO REMOVE THE POSSIBLE PARITY ERROR_^1*_-CAUSED BY READING IN THE WRONG MODE._^1*_-IF IT IS 7-TRACK BUT NOT A FILE MARK, THE STATUS_^1*_-IS CORRECT€€ED AND THE DATA TRANSFER CHECK CONTINUES._^1*_*2. IF IT IS A FILE MARK, THE FILE MARK STATUS FLAG IS_^1*_-SET AND A RETURN IS MADE TO THE CALLER._^1*_*3. IF A MOTION REQUEST, CHECK STATUS FOR INOP,_^1*_-READ AFTER WRITE, PROGRAM ERROR, OR TIMEOUT._^1*_-IF ANY OF THESE GO TO FAULT ROUTINE. IF NO_^1*_-ERROR, RETURN TO CALLER WITH NO ERROR_^1*_-INDICATOR (A-REGISTER = 0)._^1*_*4. IF R€€EAD/WRITE REQUEST CHECK STATUS FOR DATA_^1*_-ERROR, OVERLOAD, DROPOUT. IF ANY OF THESE GO_^1*_-TO RECOVERY ANCILLARY ROUTINE. IF NO ERROR_^1*_*5. IF 7-TRACK DRIVE, UNPACK DATA TO USER BUFFER._^1*_*6. RETURN TO CALLER._^1*_]_^1*_$FAULT ROUTINE -_^1*_*1. SAVE FAULT CODE IN PDT._^1*_*2. RETURN TO CALLER_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*XMOT - ISSUE I/O FOR MOTION RE€€QUESTS_^1*_*XFER - ISSUE I/O FOR READ/WRITE REQUESTS_^1*_*WAIT - WAIT FOR NOT BUSY_^1*_*RECVRY - EXECUTE RECOVERY ERROR PROCEDURES_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_6*********_^1*_6* KLCTT *_^1*_6*********_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1KLCTT NUM 0_^1_%ENA 0_^1_%STA- MFLG,I_'CLEAR REQUEST TYPE FLAG_^1_%STA- SINTER,I_$CLEAR CONTINUATOR AND TIMEOUT STATUS€€_^1_%STA- SENTRY,I_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%INQ 8_,ADD DIRECTION (OUT)_^1_%LDA- UNTMOD,I_$UNIT SELECT INFO_^1_%INA 8_,SELECT FUNCTION_^1_%NUM $0B04_(SET I/O SELECT (SIO)_^1_%NOP 0_,DELAY 2 CYCLES_^1_%NOP 0_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%RTJ WAIT_)WAIT FOR NOT BUSY_^1_%STA- SENTRY,I_$SAVE ENTRY STATUS_^1_%ENA $41_^1_€€%AND- SENTRY,I_$CHECK IF INOP OR PROG ERROR_^1_%SAZ KL10_)NO, CONTINUE_^1_%ENA 14_+YES, REPORT ERROR_^1_%JMP FLCTT_^1*_]_^1KL10_!LDQ- EPTR,I_'CHECK IF MOTION REQUEST_^1_%LDA- 4,Q_^1_%STA- QSTWD4,I_$SAVE WD 4 OF REQUEST IN PDT_^1_%LDA 0,Q_*GET REQUEST CODE_^1_%ARS 9_^1_%AND =N$001F_%MASK OFF REQUEST BITS_^1_%INA -14_^1_%STA- MFLG,I_'SAVE REQUEST FLAG_^1KL15_!LDA- MFLG,I_'NEXT€€ I/O FUNCTION_^1_%SAN KL20_)SKIP IF NOT MOTION REQUEST_^1_%RTJ XMOT_)EXECUTE MOTION COMMAND_^1_%JMP* KL30_^1KL20_!RTJ XFER_)EXECUTE READ/WRITE_^1KL30_!RTJ* WAIT_)WAIT FOR NOT BUSY_^1_%EJT_]_^1* KERNEL CONTINUATOR_^1*_]_^1CLCTT STA- ESTAT2,I_$SAVE DEVICE STATUS_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$4000_%IS THERE A TAPE MARK STATUS SET_^1_%SAN CKMOT_(YES, CHE€€CK IF EXECUTING MOTION REQUEST_^1_%JMP* CL03_)NO, CHECK FOR RECOVERY IN PROGRESS_^1CKMOT LDA- UNTMOD,I_$IS THIS A 7-TRACK UNIT_^1_%AND =N$0800_^1_%SAN EOF7TK_'YES, CHECK FOR 7-TRACK EOF DATA_^1_%JMP* CL03_)NO, CONTINUE ON_^1EOF7TK LDA- MFLG,I_'IS THIS A MOTION REQUEST_^1_%SAN 1_,SKIP IF NON MOTION_^1_%JMP* CL02_^1_%LDQ- ABUFF,I_%GET FIRST DATA WORD_^1_%LDA 0,Q_*IS IT A FILE MA€€RK DATA WORD_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAN CL01_)SKIP IF NOT A FILE MARK_^1_%LDA =N$DFFF_%REMOVE POSSIBLE DATA ERROR_^1_%AND- ESTAT2,I_$STATUS BIT FROM ESTAT2 AND_^1_%STA- ESTAT2,I_$SINTER_^1_%LDA =N$DFFF_^1_%AND- SINTER,I_^1_%STA- SINTER,I_^1_%JMP* CL03_)FILE MARK CONTINUE_^1CL01_!LDA- ESTAT2,I_$ADJUST STATUS FOR NO FILE MARK_^1_%AND =N$BFFF_^1_%STA- ESTAT2,I_^1_%LDA- SI€€NTER,I_^1_%AND =N$BFFF_^1_%STA- SINTER,I_^1_%JMP* CL03_^1*_]_^1CL02_!LDA MOTCOD_'MOTION CODE_^1_%INA -5_+SEARCH FILE MARK_^1_%SAZ 3_,YES, CHECK DATA_^1_%INA -2_+ADVANCE RECORD_^1_%SAN CL03_)NO, CONTINUE_^1_%LDA ADVRB_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAZ 1_,FILE MARK DATA_^1_%JMP* CL01_)NO, ADJUST STATUS_^1CL03_!LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ €€ 1_,NO, CONTINUE_^1_%JMP* CL07_)YES, GO TO RECOVERY PROCEDURE_^1_%LDA- MFLG,I_^1_%SAN 1_,SKIP IF NON-MOTION REQUEST_^1_%JMP* CL10_)MOTION REQUEST_^1_%LDA- SINTER,I_$READ/WRITE STATUS CHECK_^1_%AND =N$124D_%INOP, REWIND, R/W, TIMEOUT_^1_%SAZ CL04_^1_%ENA 2_^1_%JMP* FLCTT_^1CL04_!ENA $0010_^1_%AND- SINTER,I_^1_%SAZ CL05_)NO, CONTINUE_^1_%ENA 13_+YES, ERROR_^1_%JMP* FLCTT_^1CL0€€5_!LDA- SINTER,I_$ANY OTHERS CHECK RECOVERY_^1_%AND =N$2C00_%DATA ERROR, OVERLOAD, DROPOUT_^1_%SAN CL07_^1_%LDA- SINTER,I_^1_%AND =N$C000_%EOT OR TM SET_^1_%SAZ NOTM_)NO_^1_%CLR Q_,SET TAPE MARK STATUS SET FLAG_^1_%JMP* RQ9TK_(YES, NO RECOVERY_^1NOTM_!LDA- ADTFW,I_%FWA-1 (NOISE RECORD CHECK)_^1_%SUB* FWA_*- STARTING ADDRESS_^1_%INA -NOISLN_^1_%SAP CL08_)RECORD .GT. NOISE REC€€ORD_^1CL07_!RTJ RECVRY_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KL15_)EXECUTE RECOVERY FUNCTION_^1CL08_!JMP* CL20_)NO RECOVERY OR RECOVERY COMPLETE_^1*_]_^1CL10_!LDA- SINTER,I_$IF INOP, READ AFTER WRITE,_^1_%AND =N$1249_%PROG ERR, TIMEOUT = FATAL_^1_%SAZ CL20X_(IF NO ERROR CHECK FOR ADVANCE FILE REQUEST_^1_%ENA 2_^1_%JMP* FLCTT_^1CL20X LDA MOTCOD_'IS THIS AN ADVANCE F€€ILE REQUEST_^1_%INA -5_+MOTCOD = 5_^1_%SAN CL40_)NO, CONTINUE ON AS IS_^1_%LDA- SINTER,I_$YES, IS THERE A FILE MARK STATUS SET_^1_%AND =N$4000_^1_%SAN CL25_)YES, SET FILE MARK STATUS FLAG IN Q_^1_%JMP* KL15_)NO, CONTINUE LOOKING FOR FILE MARK_^1CL20_!LDA- SINTER,I_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$C000_%IS TAPE MARK OR EOT SET_^1_%SAZ CL40_^1CL25_!CLR Q€€_,SET FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_^1CL40_!ENA $0010_(IS A 7-TRACK READ IN PROGRESS_^1_%AND- ESTAT1,I_^1_%SAZ RQ9TK_(NO, DO NOT PACK DATA_^1_%STQ* QSAVX_(SAVE Q-REGISTER TEMPORARILY_^1_%RTJ TK7DAT_'YES, PACK 7 TRACK DATA INTO USER BUFFER_^1_%LDQ* QSAVX_(RESTORE Q-REGISTER_^1RQ9TK ENA 0_,CLEAR ERROR FLAG_^1_%JMP (KLCTT)_^1WAIT_!NOP 0_^1WAIT0X ENA 3_,SET FLAG FO€€R DELAY_^1WAIT00 STA* BZYCTR_^1_%LDA =N$0FFF_%DELAY APPROX. 10 MS_^1WAIT01 INA -1_^1_%SAZ WAIT02_^1_%JMP* WAIT01_^1WAIT02 LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%AND =N$0002_%IS IT BUSY_^1_%SAZ WAIT03_'NO_^1_%JMP* WAIT0X_'YES, DELAY AND TRY AGAIN_^1WAIT03 LDA* BZYCTR_'DONE WITH DELAY LOOP YET_^1_%SAZ WAIT04_'YES_^1_%INA -1_+WAIT AGAIN_^1_%JMP* WAI€€T00_^1WAIT04 NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%STA- SINTER,I_^1_%JMP* (WAIT)_'RETURN_^1*_]_^1* FAILED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1FLCTT STA- FLTCOD,I_$SAVE FAULT CODE_^1_%JMP (KLCTT)_%RETURN VIA KERNEL_^1QSAVX NUM $0000_(TEMPORARY HOLD FOR Q-REGISTER_^1BZYCTR NUM $0000_(BUSY LOOP COUNTER_^1_%EJT_]_^1*_€€$NAM XFER_)ODS LEVEL II_106-03-75 REV 01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT READ/WRITE ROUTINES_^1*_8************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE READ/WRITE I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THESE ROUTINES CHECK IF LEGA€€L RECORD SIZE AND CALLS_^1*_$FAULT ROUTINE IF NOT. THE CORRECT PARITY IS GENERATED_^1*_$AND THE ADT TABLE IS SET UP. THE TYPE OF TRANSFER IS_^1*_$DETERMINED AND THE CORRECT ROUTINE (READ OR WRITE) IS_^1*_$CALLED. THE READ ROUTINE WILL EITHER EXECUTE A NORMAL_^1*_$READ OR A RECOVERY READ DEPENDING ON BIT 4 IN RFLAG IN_^1*_$THE PDT. THE WRITE ROUTINE WILL EITHER DO A WRITE OR_^1*_$A €€CONTROLLED BACKSPACE DEPENDING ON BIT 3 IN RFLAG._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NORMAL PARAMETERS IN PDT. SPECIAL FLAGS ARE USED IN_^1*_$RFLAG IN THE PDT. THESE FLAG ARE:_^1*_]_^1*_)BIT 2 = 1 = READ IN OPPOSITE PARITY_^1*_)BIT 3 = 1 = EXECUTE CONTROLLED BACKSPACE_^1*_)BIT 4 = 1 = EXECUTE READ RECOVERY_^1*_]_^1*_$THEY ARE USED BY THE RECOVERY ROUTI€€NES AND ARE_^1*_$CLEARED AFTER FUNCTION EXECUTED._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$CLEARS CONTROL FLAGS IN RFLAG AFTER FUNCTION EXECUTED._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP, PARAMETERS NEEDED ARE_^1*_*ALREADY IN THE PDT._^1*_$EXIT IS A NORMAL RETURN TO CALLER._^1*E_]_^1*_8FLOW_^1*_8----_^1*_$1. CHECK IF REQUEST SHORT RECORD TYPE, IF SO €€CALL_^1*_(FAULT ROUTINE._^1*_$2. DETERMINE CORRECT PARITY FOR 7 TRACK._^1*_$3. SETUP ADT TABLE AND CALL READ OR WRITE ROUTINE._^1*_$4. IF READ DETERMINE IF EITHER OPPOSITE PARITY_^1*_(OR RECOVERY READ FLAG SET. ENABLE MICRO INTERRUPT_^1*_(AND EXECUTE FUNCTION._^1*_$5. IF WRITE DETERMINE IF CONTROLLED BACKSPACE FLAG_^1*_(SET. ENABLE MICRO INTERRUPT AND EXECUTE FUNCTION_^1*_]_^1****_€€]_^1_%EJT_]_^1*_6********_^1*_6* XFER *_^1*_6********_^1*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1XFER_!NUM 0_^1_%LDA- QSTWD4,I_$GET REQUEST PARAMETER_^1_%INA -NOISLN_%CHECK IF LENGTH.GE.NOISE LENGTH_^1_%SAP 1_^1_%JMP* NOISRX_'SHPRT RECORD ERROR_^1_%LDA- ECCOR,I_%INIT CURRENT WORD POINTERS_^1_%STA* FWA_^1_%LDA- ELSTWD,I_^1_%STA* LWA_^1_%€€ENA $0001_^1_%AND- ESTAT1,I_^1_%STA* MOTIDX_'SET R/W FLAG_^1_%LDA- UNTMOD,I_$THIS A 7TK UNIT_^1_%AND =N$0800_^1_%SAZ TK9RW_^1_%RTJ TK7DAT_'FORMAT 7 TRACK DATA_^1_%RTJ TK7RW_(DETERMINE TYPE OF 7TK PARITY_^1TK9RW STA* PRITYC_'STORE PARITY_^1_%LDA* FWA_*SETUP ADT TABLE BUFFER POINTERS_^1_%INA -1_^1_%STA- ADTFW,I_%FWA-1_^1_%LDA* LWA_^1_%INA -1_^1_%STA- ADTLW,I_%LAST WORD ADDRES€€S_^1_%LDA* MOTIDX_'R/W FLAG_^1_%SAZ READ_^1_%RTJ* WRADT_(DO THE WRITE_^1_%JMP* (XFER)_^1READ_!RTJ* RDADT_(DO THE READ_^1_%JMP* (XFER)_^1*_]_^1NOISRX ENA 31_+NOISE RECORD ERROR_^1_%JMP* FLCTT_^1*_]_^1*_]_^1FWA_"NUM 0_,CURRENT FIRST WORD ADDRESS_^1LWA_"NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT_]_^1* READ DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1RDADT NUM €€0_^1_%LDA- ADTCW,I_%GET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%MASK OUT WRITE BIT_^1_%STA- ADTCW,I_^1_%LDA* PRITYC_^1_%STA* TPAR_)SAVE PARITY BIT_^1_%ENA $0004_^1_%AND- RFLAG,I_^1_%SAZ RD10A_(OPPOSITE PARITY NOT SET_^1_%TCA A_^1_%AND =N$0400_%COMPLIMENT PARITY BIT_^1_%STA* PRITYC_^1RD10A RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0010_(RECOVERY READ IN PROGRESS_^1_%AND-€€ RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, SELECT FUNCTION_^1_%INA 1_,OUTPUT READ FUNCTION_^1_%RTJ* SFUNC_(CLEAR OPPOSITE PARITY FLAG_^1_%ENA -$0014_'AND RECOVERY READ SWITCH_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA* TPAR_^1_%STA* PRITYC_'RESTORE PARITY_^1_%JMP* (RDADT)_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1WRADT NUM 0_^1_%LDA- ADTCW,I_%SET€€ AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%ADD WRITE_^1_%ADD =N$0800_^1_%STA- ADTCW,I_^1_%RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0008_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, EXECUTE ONE_^1_%INA 2_^1_%ADD- HAFWRD,I_$ADD HALF WORD BIT IF SET_^1_%RTJ* SFUNC_^1_%ENA -$0008_'CLEAR CB FLAG_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%JMP* (WRADT)_^1*_]_^1* ENABLE MICRO INTERRUPT€€_^1*_]_^1ENBMIC NUM 0_^1_%LDA- I_,SET UP POINTER TO ADT TABLE_^1_%INA ADTCW_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ =N$8000_%ENABLE BIT_^1_%NUM $0B06_(DEFINE MICRO INTERRUPT (DMI)_^1_%JMP* (ENBMIC)_^1*_]_^1MOTIDX NUM 0_,READ/WRITE FLAG, 1=WRITE_^1PRITYC NUM 0_,PARITY BIT (POSITIONED)_^1TPAR_!NUM 0_,TEMP PARITY STORAGE_^1_%EJT_]_^1*_$NAM XMOT_)ODS LEVEL II - LCTT_*07-01-75 €€REV-04_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT MOTION ROUTINES_^1*_8********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE MOTION I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS MODULE WILL DECODE THE MOTION COMMAND AND EXECUTE_^1*_$THE NEXT MOTION €€COMMAND. THESE COMMANDS ARE ISSUED BY A_^1*_$SERIES OF SMALL SUBROUTINES. BEFORE THE COMMAND IS ISSUED_^1*_$THE CORRECT PARITY WILL FIRST BE DETERMINED. AFTER THE_^1*_$MOTION COMMAND IS ISSUED CONTROL WILL BE PASSED BACK TO_^1*_$THE CALLER. AN UNUED FUNCTION WILL BE TREATED AS A NOP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$SEVERAL FLAG BITS IN THE PDT ARE €€USED BY THIS ROUTINE._^1*_*UNTMOD - BIT 11 - TYPE OF DRIVE (7 OR 9 TRACK)_^1*_*ESTAT1 - BIT 5 - MOTION REQUEST BIT (SET TO 1)_^1*_1- BIT 6 - REWIND FLAG (SET TO 1 IF REWIND)_^1*_1- BIT 8 - RECOVERY IN PROGRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF A REWIND COMMAND IS EXECUTED BIT 6 OF ESTAT1 WILL_^1*_$BE SET TO INDICATE A REWINDIN PROGRESS. BIT 5 OF ESTAT1_^1*_$WILL BE SET€€ TO INDICATE A MOTION REQUEST IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IF A SEVEN TRACK UNIT IS PRESENT THE ROUTINE TK7RW_^1*_$WILL BE CALLED TO DETERMINE THE PARITY TO BE USED._^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XMOT *_^1*_6********_^1*_]_^1* MOTION EXECUTION ANCILLARY ROUTINE_^1* ENT€€ER WITH MOTION REQUEST, I = PDT POINTER_^1*_]_^1XMOT_!NUM 0_^1_%LDA- UNTMOD,I_$IS THIS A 7 TRACK UNIT_^1_%AND =N$0800_^1_%SAZ XMOT10_'NO, SKIP_^1_%RTJ* TK7RW_^1XMOT10 STA* PRITYC_^1_%ENA -$0020_^1_%AND- ESTAT1,I_^1_%ADD =N$0020_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$GET NUMBER OF WORDS_^1_%ARS 12_+SHIFT AND MASK_^1_%AND =N$0007_^1_%STA* MOTCOD_^1_%TRA Q_^1_%INA -8_^1_%SAP S€€UBMOT_'NOOP, ILLEGAL OPERATION_^1_%JMP* SUBMOT,Q_$EXECUTE FUNCTION_^1*_]_^1SUBMOT JMP* NOOP_)NO OPERATION (USED FOR STATUS)_^1_%JMP* BKSP_)BACKSPACE RECORD_^1_%JMP* WRFM_)WRITE FILE MARK_^1_%JMP* REW_*REWIND_^1_%JMP* REWUN_(REWIND UNLOAD_^1_%JMP* ADVAN_(SEARCH FILE MARK FORWARD_^1_%JMP* ERASE_(ERASE (DLU OR RECOVERY ONLY)_^1_%JMP* ADVAN_(ADVANCE 1 RECORD_^1_%EJT_]_^1* REWIND_]_^1*_€€]_^1REW_"ENA -$0040_^1_%AND- ESTAT1,I_^1_%ADD =N$0040_^1_%STA- ESTAT1,I_^1_%ENA 5_,EXECUTE REWIND FUNCTION_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1REWUN ENA 6_,EXECUTE REWIND UNLOAD_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1BKSP_!ENA 4_,EXECUTE BACKSPACE_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* ERASE_]_^1*_]_^1ERASE LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =€€N$0100_^1_%SAN 1_,YES, EXECUTE ERASE_^1_%JMP* NOOP_^1ERSX_!ENA 3_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* WRITE FILE MARK_^1*_]_^1WRFM_!LDA- UNTMOD,I_$GET 7TK BIT_^1_%AND =N$0800_^1_%SAZ WRFM9_^1_%RTJ* TK7WEF_'WRITE 7 TRACK TAPE MARK_^1_%JMP* (XMOT)_^1WRFM9 ENA 7_,EXECUTE 9TK FILEMARK_^1DOMOT RTJ* SFUNC_^1_%JMP* (XMOT)_^1*_]_^1*_]_^1* ADVANCE ONE RECORD OR FILE_^1*_]_^1ADVAN RTJ* BLO€€C+1_'CALCULATE ADDRESS OF BUFFER_^1BLOC_!ADC* ADVRB_^1_%NUM 0_^1_%LDA* BLOC+1_'GET PRESENT CORE ADDRESS_^1_%ADD* BLOC_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_^1_%INA 9_,ALLOW 9 WORDS_^1_%STA- ADTLW,I_%LWA OF BUFFER_^1_%RTJ RDADT_(EXECUTE A READ_^1_%JMP* (XMOT)_^1*_]_^1ADVRB BZS ADVRB(9)_$BUFFER FOR ADVANCE RECORD_^1*_]_^1*_]_^1* FUNCTION OUTPUT_^1* ENTER WITH FUNCTI€€ON CODE IN A AND PARITY IN PRITYC_^1*_]_^1SFUNC NUM 0_^1_%ADD- UNTMOD,I_$ADD UNIT, DENSITY AND TRACK_^1_%ADD* PRITYC_'ADD PARITY_^1_%LDQ- EWES,I_^1_%INQ 8_,SET I/O_^1_%NUM $0B04_(SIO_^1_%NOP 0_,DELAY_^1_%NOP 0_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%JMP* (SFUNC)_^1*_]_^1*_]_^1* NO OPERATION - NO FUNCTION OUTPUT_^1*_]_^1NOOP_!JMP CL40_)€€ENTER CONTINUATOR AFTER INT PROCESS_^1*_]_^1MOTCOD NUM 0_,MOTION CODE THIS MOTION_^1_%EJT_]_^1*_$NAM TK7_*ODS LEVEL II - LCTT_*06-06-75 REV-01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*_8LCTT 7 TRACK ROUTINES_^1*_8*********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$IMPLEMENT FUNCTIONS SPECIAL TO SEVEN TR€€ACK DRIVES._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$IMPLEMENTS A SOFTWARE FILE MARK FUNCTION FOR 7 TRACK_^1*_$UNITS AND A SUBROUTINES TO DETERMINE 7 TRACK PARITY._^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$ONE WORD FROM THE PHYSTAB IS USED AS INPUT. IT IS_^1*_$ESTAT1 AND IS USED FOR PARITY TYPE TEST._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*€€_$SEVERAL WORDS FROM THE PHYSTAB ARE USED. THESE ARE_^1*_$ETEMP1, ADTFW, ADTLW, HAFWRD. ONE EXTERNAL LOCATION_^1*_$IS USED FOR STORAGE OF THE PARITY BIT._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$NORMAL SUBROUTINE ENTRY/EXIT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$CALL WRADT IN XFER TO WRITE THE FILE MARK._^1*_]_^1****_]_^1_%EJT_]_^1*_6*€€******_^1*_6* TK7 *_^1*_6*******_^1*_]_^1* SEVEN TRACK SPECIAL ROUTINES_^1*_]_^1* 7 TRACK READ/WRITE - DETERMINES PARITY_^1*_]_^1TK7RW NUM 0_^1_%ENA $0008_^1_%AND- ESTAT1,I_^1_%SAZ NOBCD_^1_%LDA =N$0400_%BCD USE EVEN PARITY_^1NOBCD JMP* (TK7RW)_^1*_]_^1* 7 TRACK WRITE OF END OF FILE ROUTINE_^1*_]_^1TK7WEF NUM 0_^1_%LDA- I_^1_%INA ETEMP1-1_$FORM FWA-1_^1_%STA- ADTFW,I_^1_%I€€NA 1_,FORM LWA_^1_%STA- ADTLW,I_^1_%LDA =N$0F0F_%EOF CODE_^1_%STA- ETEMP1,I_^1_%LDA =N$0400_%EVEN PARITY_^1_%STA* PRITYC_^1_%ENA $20_*HALF WORD WRITE_^1_%STA- HAFWRD,I_^1_%RTJ WRADT_(WRITE SOFTWARE FILEMARK_^1_%ENA 0_^1_%STA- HAFWRD,I_^1_%JMP* (TK7WEF)_^1_%EJT_]_^1*_$NAM TK7DAT_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$C€€OPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT 7 TRACK DATA FORMAT ROUTINES_^1*_8*********************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$CONVERT 7 TRACK DATA AND PACK AND UNPACK BUFFERS_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS ROUTINE UNPACKS DATA FROM THE USERS BUFFER TO_^1*_$A LOCAL BUFFER FOR 7-TRACK WRITE OPERATIO€€NS. FOR_^1*_$READ OPERATIONS, DATA IS PACKED INTO THE USERS BUFFER_^1*_$FROM THE LOCAL BUFFER._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$ALL INPUTS NECESSARY ARE SUPPLIED BY PARAMETER_^1*_$WORDS IN THE PHYSTAB AND EXTERNAL STORAGE FWA AND LWA._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$NONE_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY AND EXIT ARE NO€€RMAL SUBROUTINES ENTRY AND_^1*_$EXIT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* TK7DAT *_^1*_6**********_^1* LCTT DUMMY 7 TRACK DATA FORMAT ROUTINE_^1*_]_^1TK7DAT NUM 0_^1_%LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* TK7DEX_'YES, EXIT_^1_%ENA $0010_^1_%AND- ESTAT1,I_^1_%SAZ 1_,NO, CONTINUE_^1_%JM€€P* TK7CON_'YES, CONTINUATION IN PROGRESS_^1_%ENA $0001_(IS THIS A READ REQUEST_^1_%AND- ESTAT1,I_^1_%SAN TK7D05_'NO, DO NOT SET FLAG_^1_%ENA -$0010_'YES, SET 7-TRACK READ IN PROGRESS FLAG_^1_%AND- ESTAT1,I_^1_%ADD =N$0010_^1_%STA- ESTAT1,I_^1TK7D05 LDA- ABUFF,I_%INIT FWA FOR LOCAL BUFFER_^1_%STA FWA_^1_%LDA- QSTWD4,I_$INIT RECORD SIZE_^1_%STA* NUMBR_^1TK7D10 LDA* NUMBR_^1_%MUI€€ =N$0004_%SIZE * 4_^1_%DVI =N$0003_%/ 3_^1_%SQZ 1_^1_%INA 1_^1_%STA* NUMBR_^1TK7D20 LDA FWA_^1_%ADD* NUMBR_^1_%STA LWA_*LWA = FWA + RECORD SIZE_^1_%ENA $0001_(CHECK IF READ OR WRITE_^1_%AND- ESTAT1,I_^1_%SAN TK7D30_'SKIP IF WRITE_^1_%JMP* TK7DEX_^1TK7D30 RTJ* UNPK2_(CONVERT TO ASSY/DASSY_^1_%JMP* TK7DEX_^1TK7DEX JMP* (TK7DAT)_^1*_]_^1*_]_^1*_]_^1TK7CON LDA- ADTFW,I_%UPDATE €€TO LAST WORD READ +1_^1_%INA 1_^1_%STA LWA_^1_%ENA -$0010_^1_%AND- ESTAT1,I_^1_%STA- ESTAT1,I_^1_%RTJ* PACK2_^1_%JMP* TK7DEX_^1*_]_^1*_]_^1BUFFER NUM 0_,ADDRESS OF BUFFER_^1SAVEI NUM 0_,TEMPORARY STORAGE OF I_^1TEMP_!NUM 0_,TEMPORARY STORAGE OF PARTIAL CONVERSION_^1NUMBR NUM 0_,NUMBER OF WORDS TO TRANSFER_^1_%EJT_]_^1_%EJT_]_^1* WRITE 7 TRACK DATA - UNPACK INTO LOCAL BUFFE€€R_^1*_]_^1UNPK2 NUM 0_,ENTRY FOR BINARY TO ASSEM/DISASSEM._^1_%RTJ* SETUP_^1_%CLR Q_,0 INTO Q_^1NXTCYC RTJ* GETFST_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'GO STORE Q WHICH IS UNPACKED FOR 1732_^1_%LLS 4_,4 BITS_^1_%RTJ* GETFST_'GET ANOTHER 16 BINARY BITS_^1_%LLS 2_,2 BITS MORE FOR 6_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'€€STORE Q_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 2_,2 BITS_^1_%RTJ* GETFST_'GET MORE DATA_^1_%LLS 4_,4 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%JMP* NXTCYC_'GO THRU ANOTHER CYCLE_^1*_]_^1*_]_^1GETFST NUM 0_^1_%STQ* QSAV_)SAVE Q_^1_%LDA- ELSTWD,I_^1_%SUB- ECCOR,I_%CHECK END OF BUFFER_^1_%SAN 2_€€^1_%ENA 0_^1_%JMP* (GETFST)_^1_%LDQ- ECCOR,I_%GET CURRENT LOCATION OF DATA_^1_%LDA 0,Q_*GET NEW DATA_^1_%LDQ- 0_^1QSAV_!NUM 0_^1_%RAO- ECCOR,I_%TALLY CURRENT ADDRESS_^1_%JMP* (GETFST)_^1*_]_^1CURR_!NUM 0_^1_%EJT_]_^1* READ 7 TRACK DATA - PACK INTO USERS BUFFER_^1*_]_^1PACK2 NUM 0_,ENTRY FOR ASSEM/DISSASSEM TO BINARY._^1_%RTJ* SETUP_^1NXTGET RTJ* GETFWA_'GO GET FROM FWA BUFFER€€_^1_%CLR Q_^1_%LLS 8_,6 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%RTJ* GETFWA_'GET 12 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 4_,4 BITS_^1_%RTJ* STRFST_'GO STORE IN REQUESTOR-S BUFFER_^1_%LLS 2_,2 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%RTJ* GETFWA_'GET 12 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%ALS 2_,PASS 2_^1_%LLS 2_,2 BITS_^1_%RT€€J* STRFST_'GO STORE_^1_%LLS 4_,4 BITS_^1_%RTJ* GETFWA_'GET 12_^1_%ALS 2_,PASS 2_^1_%LLS 6_,6 BITS_^1_%ALS 2_,PASS 2_^1_%LLS 6_,6 BITS_^1_%RTJ* STRFST_'STORE_^1_%JMP* NXTGET_'NEXT CYCLE_^1*_]_^1*_]_^1GETFWA NUM 0_,ENTRY TO GET NEXT DATA FROM FWA_^1_%LDA* CURR_^1_%EOR LWA_^1_%SAN NOTCUR_^1_%JMP* (PACK2)_^1NOTCUR LDA* (CURR)_^1_%RAO* CURR_^1_%JMP* (GETFWA)_$RETURN_^1*_]_^1*_]_€€^1STRFST NUM 0_,STORE DATA IN Q INTO USER-S BUFFER_^1_%STA* QSAV1_^1_%TRQ A_,DATA INTO A_^1_%LDQ- ECCOR,I_%GET CORE LOCATION OF USER-S BUFFER_^1_%STA 0,Q_*STORE DATA_^1_%LDA- 0_,2 WORD INSTRUCTION_^1QSAV1 NUM 0_^1_%CLR Q_^1_%RAO- ECCOR,I_%TALLY STORAGE LOCATION_^1_%JMP* (STRFST)_^1STRDAT NUM 0_^1_%STQ* (CURR)_'STORE UNPACKED DATA_^1_%TRA Q_,SAVE A_^1_%RAO* CURR_)TALLY INTER€€MEDIATE STORAGE LOCATION_^1_%LDA* CURR_^1_%EOR LWA_^1_%SAN CURNOT_'CURR NOT EQUAL LWA_^1_%JMP* (UNPK2)_^1CURNOT TRQ A_,RESTORE A_^1_%CLR Q_^1_%JMP* (STRDAT)_$EXIT STORE DATA SUBROUTINE_^1*_]_^1*_]_^1SETUP NUM 0_^1_%LDA FWA_^1_%STA* CURR_^1_%JMP* (SETUP)_^1_%EJT_]_^1*_$NAM RECVRY_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_€€$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT RECOVERY ROUTINES_^1*_8**********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THIS PROGRAM WILL ATTEMPT TO RECOVER DATA FROM A TAPE_^1*_$RECORD AFTER A DATA ERROR HAS OCCURRED. IT WILL ALSO BYPASS_^1*_$NOISE RECORDS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8---€€---------------_^1*_]_^1*_$NONE_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_!READ RECOVERY_^1*_!-------------_^1*_!-------------_^1*_]_^1*_$NORMAL READ_^1*_$-----------_^1*_$1. SET M = 2 (NOISE RECOVERY RETRY COUNT._^1*_$2. IF NOISE GO TO STEP 3._^1*_(IF AN ERROR GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$NOISE RECOVERY_^1*_€€$--------------_^1*_$3. BACKSPACE._^1*_(SET M = M-1._^1*_(IF M = 0 GO TO STEP 5._^1*_$4. RECOVERY READ._^1*_(GO TO STEP 2._^1*_]_^1*_$BYPASS NOISE_^1*_$------------_^1*_$5. SET M = 2._^1*_$6. ADVANCE RECORD._^1*_(READ RECORD._^1*_(IF FILE MARK, EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF ERROR GO TO STEP 7_^1*_*ELSE EXIT._^1*_]_^1*_$REREAD THE ERROR BLOCK_^1*_$----------------------_€€^1*_$7. SET N = 5 (REREAD COUNT)._^1*_(SET C = 5 (CLEANER COUNT)_^1*_$8. BACKSPACE._^1*_(READ RECORD._^1*_(IF FILE MARK DETECTED THEN EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR OCCURRED GO TO STEP 9._^1*_*ELSE EXIT._^1*_$9. SET N = N-1._^1*_(IF N = 0 GO TO STEP 11._^1*_*ELSE GO TO STEP 8._^1*_#10. SET M = 2._^1*_(GO TO STEP 3._^1*_]_^1*_$REREAD IN OPPOSITE PARITY_^1€€*_$-------------------------_^1*_#11. IF 9 TRACK TAPE GO TO STEP 12._^1*_(BACKSPACE._^1*_(READ RECORD IN OPPOSITE PARITY._^1*_(IF FILE MARK DETECTED, DECLARE THE ERROR IRRECOVERABLE._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR GO TO STEP 12._^1*_*ELSE DECLARE IRRECOVERABLE ERROR IN OPPOSITE PARITY._^1*_]_^1*_$POSITION TAPE PAST TAPE CLEANERS_^1*_$--------------------------€€------_^1*_#12. SET B = 1 (BACKSPACE COUNTER)._^1*_(SET C = C-1._^1*_#13. BACKSPACE._^1*_(IF BOT GO TO STEP 15._^1*_#14. SET B = B+1_^1*_(IF B = 5 GO TO STEP 15_^1*_*ELSE GO TO STEP 13._^1*_(IF FILE MARK OR EOT DETECTED THEN EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF AN ERROR OCCURRED GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$CLEAN TAPE_^1*_$----------_^1*_#15. IF B = 3 GO TO STEP 17€€._^1*_(IF B = 2 GO TO STEP 18._^1*_#16. ADVANCE 1 RECORD._^1*_(SET B = B-1_^1*_(GO TO STEP 15._^1*_#17. ADVANCE 1 RECORD (IGNORE FILE MARKS AND DATA ERRORS)_^1*_#18. READ RECORD._^1*_(IF FILE MARK DETECTED EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF ERROR OCCURRED GO TO STEP 8._^1*_(IF C = 0 DECLARE ERROR IRRECOVERABLE_^1*_*ELSE SET N = 5 AND GO TO STEP 8._^1*_]_^1*_]_^1*_]_^€€1*_]_^1*_!WRITE RECOVERY_^1*_!--------------_^1*_!--------------_^1*_]_^1*_$NORMAL WRITE_^1*_$------------_^1*_$1. SET N = 0 (ERASE COUNT)_^1*_$2. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3_^1*_*ELSE EXIT._^1*_]_^1*_$BACKUP TO LAST GOOD BLOCK_^1*_$-------------------------_^1*_$3. PERFORM A CONTROLLED BACKSPACE._^1*_]_^1*_$ERASE_^1*_$-----_^1*_$4. SET N = N+1._^1*_(IF N = 20 DE€€CLARE ERROR IRRECOVERABLE._^1*_(SET M = N (M = ERASE COUNTER)_^1*_$5. ERASE_^1*_(IF END OF TAPE AND M>1 DECLARE ERROR IRRECOVERABLE._^1*_(IF AN ERASE ERROR DECLARE ERROR IRRECOVERABLE._^1*_$6. SET M = M-1_^1*_(IF M = 0 GO TO STEP 7_^1*_*ELSE GO TO STEP 5._^1*_]_^1*_$REWRITE THE BLOCK_^1*_$-----------------_^1*_$7. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3._^1*_]_^1*_$POSITION €€TAPE TO LAST GOOD BLOCK_^1*_$--------------------------------_^1*_$8. PERFORM CONTROLLED BACKSPACE._^1*_]_^1*_$READ THE BLOCK_^1*_$--------------_^1*_$9. READ_^1*_$10. IF NOISE GO TO STEP 9._^1*_)IF AN ERROR GO TO STEP 13._^1*_+ELSE EXIT._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* RECVRY *_^1*_6**********_^1*_]_^1* LCTT R€€ECOVERY ROUTINES_^1*_]_^1RECVRY NUM 0_^1_%RTJ* RECLOC_'DETERMINE RECOVERY ABSOLUTE_^1RECLOC NUM 0_,ADDRESS + 2_^1R01_"ENA 0_,CLEAR FAULT INDICATOR_^1_%STA* RFCOD_^1_%LDA- RFLAG,I_%IS RECOVERY ENABLED_^1_%SAP R05_*YES, SKIP_^1_%RTJ NOISRC_'NOISE RECORD ENCOUNTERED_^1_%ENA 3_,NO,_^1_%JMP* ROX_^1_%ENA 1_,YES, SHORT RECORD FAULT_^1ROX_"JMP FLCTT_^1R05_"LDA- ESTAT1,I_$IS RECOVER€€Y IN PROGRESS_^1_%AND =N$0100_^1_%SAZ R10_*NO, SET FLAG AND SAVE PARAMETERS_^1_%LDQ- RRETAD,I_$YES, GO TO NEXT FUNCTION_^1_%JMP 0,Q_^1R10_"LDA- ESTAT1,I_$SET RECOVERY IN PROGRESS_^1_%AND =N$FEFF_^1_%ADD =N$0100_^1_%STA- ESTAT1,I_^1_%LDA- MFLG,I_'SAVE REQUEST PARAMETERS_^1_%STA* RMFLG_^1_%LDA- QSTWD4,I_^1_%STA* RQSTW4_^1_%ENA $0001_^1_%AND- ESTAT1,I_^1_%SAN RWRIT_^1_%JMP* RRE€€AD_(READ OPERATION_^1_%EJT_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1RWRIT ENA 0_,CLEAR N COUNTER_^1_%STA* NCNT_^1RW05_!ENA $0008_(SET CB FLAG_^1_%ADD- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA =XRW10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RW10_!LDA- SINTER,I_$CONTROLLED BACKSPACE ERROR_^1_%AND =N$1E55_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATA€€L_^1_%RAO* NCNT_)UPDATE COUNTER_^1_%LDQ =N$6000_%ERASE_^1_%LDA =XRW20-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW20_!LDA- SINTER,I_$ERASE ERROR OR EOT_^1_%AND =N$9F51_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA* NCNT_)MAXIMUM NUMBER OF ERASURES_^1_%INA -20_^1_%SAM 1_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA =XRW30-RECLOC SETUP NEXT R€€ETURN ENTRY_^1_%JMP RECRWF_'EXECUTE A RE-WRITE_^1*_]_^1RW30_!LDA- SINTER,I_$RE-WRITE ERROR_^1_%AND =N$2C00_^1_%SAZ 1_^1_%JMP* RW05_)YES, DO ANOTHER BACKSPACE,ERASE_^1_%JMP* RDONE_(NO, RECOVERED_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINE / STORAGE_^1*_]_^1RFAULT LDA- SINTER,I_$ALARM TYPE ERROR_^1_%AND =N$124F_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 2_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%LDA- €€SINTER,I_^1_%AND =N$2C00_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 3_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%ENA 41_+MAXIMUM ATTEMPTS REACHED_^1RFXIT STA* RFCOD_(SAVE FAULT CODE_^1_%JMP* RDONX_^1RDONE ENA -$0002_^1_%AND- RFLAG,I_^1_%ADD =N$0002_^1_%STA- RFLAG,I_^1_%RAO- RCNTFG,I_$INDEX RECOVERY COUNT_^1RDONX RAO* RECVRY_'EXIT+2 NO RECOVERY OR IRRECOVERABLE_^1_%LDA- ESTAT1,I_$CLEAR FLAGS_€€^1_%AND =N$FEDF_%CLEAR MOTION IF SET, AND RECOVERY FLAG IF SET_^1_%STA- ESTAT1,I_^1_%LDA* RMFLG_(RESTORE PDT PARAMETERS_^1_%STA- MFLG,I_^1_%LDA* RQSTW4_^1_%STA- QSTWD4,I_^1_%LDA* RFCOD_(ERROR COMPLETION_^1_%SAZ REXIT_(NO_^1_%JMP FLCTT_(YES, GO TO FAULT ROUTINE_^1REXIT JMP* (RECVRY)_^1*_]_^1RMFLG NUM 0_^1RQSTW4 NUM 0_^1MCNT_!NUM 0_^1NCNT_!NUM 0_,ERASE COUNTER_^1RFCOD NUM €€0_,FAULT/CODE FLAG_^1_%EJT_]_^1*_]_^1*_]_^1* READ RECOVERY_^1*_]_^1RREAD ENA 2_^1_%STA* MCNT_^1RD01_!RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD05_)NO, CHECK IF ERROR_^1RD03_!LDA* MCNT_)DECREMENT READ LOGIC_^1_%INA -1_^1_%STA* MCNT_^1_%LDA =XRD20-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD05_!LDA- SINTER,I_$ERROR ON READ_^1_€€%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%JMP* RDRERD_'YES, RE-READ_^1*_]_^1RD10_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK READ_^1_%SAN 1_^1_%JMP* RD01_)NO, CHECK IF NOISE RECORD_^1_%JMP* RDONE_(YES, EXIT_^1*_]_^1RD20_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA* MCNT_)READ COUNTER ELAPSED_^1_%SAZ 1_^1_%JMP* RD25_)NO, DO RECOVERY READ_^1_%ENA 2_,YES, SKI€€P NOISE RECORD_^1_%STA* MCNT_^1_%LDA =XRD30-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1RD25_!ENA -$0010_^1_%AND- RFLAG,I_^1_%ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD30_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA =XRD10-RECL€€OC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE READ_^1*_]_^1* RE-READ_]_^1*_]_^1RDRERD ENA 5_,RE-READ RECORD_^1_%STA CCNT_)SET CLEANER COUNT_^1_%STA* NCNT_)SET RE-TRY COUNT_^1RD35_!LDA =XRD40-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE FUNCTION_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD40_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$0010_^1_%AND- RFLAG,I_^1_%€€ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD50-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD50_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%TAPE MARK READ_^1_%SAZ 1_^1_%JMP* RDONE_(YES, DONE_^1_%RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD55_)NO_^1_%ENA 2_,RE-INIT COUNTER_^1_%STA* MCNT_^1_%JMP* RD03_)CHECK FURTHER_^1RD55_!LDA- SI€€NTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%LDA* NCNT_)YES, N=N-1_^1_%INA -1_^1_%STA* NCNT_)N=0_^1_%SAZ 1_^1_%JMP* RD35_)NO, LOOP_^1_%LDA- UNTMOD,I_$YES, 9TK TRANSPORT_^1_%AND =N$0800_^1_%SAN RDOPR_^1_%JMP* RDCLN_^1*_]_^1* READ OPPOSITE POLARITY_^1*_]_^1RDOPR LDA =XRD60-RECLOC BACKSPACE FUNCTION_^1_%LDQ =N$1000_^1_%JMP* RECFUN_^1*_]_^1RD60_€€!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$0004_^1_%AND- RFLAG,I_^1_%ADD =N$0004_^1_%STA- RFLAG,I_^1_%LDA =XRD70-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'READ IN OPPOSITE PARITY_^1*_]_^1RD70_!RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_^1_%SAZ 2_,FILE MARK_^1_%JMP RFAULT_'YES, IRRECOVERABLR_^1_%RTJ* NOISRC_'NOISE RECORD_^1_%JMP* RD75_)NO_^1_%JMP RREAD_(YES, LOOP_^1R€€D75_!LDA- SINTER,I_^1_%AND =N$2C00_%READ ERROR_^1_%SAN 2_^1_%JMP RFAULT_'IRRECOVERABLE ERROR_^1_%EJT_]_^1*_]_^1* CLEAN TAPE_^1*_]_^1RDCLN LDA* CCNT_)CLEAN TAPE_^1_%INA -1_+DECREMENT CLEAN COUNTER_^1_%STA* CCNT_^1_%ENA 1_^1_%STA* BCNT_)INIT BACKSPACE COUNTER_^1RD95_!LDA =XRD100-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_€€^1RD100 LDA- SINTER,I_^1_%AND =N$1041_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%RAO* BCNT_)NO, UPDATE BACKUP COUNT_^1_%LDA- SINTER,I_^1_%AND =N$0200_%TIMED OUT (BOT)_^1_%SAN RD110+1_^1_%LDA* BCNT_^1_%INA -5_+COUNT = 5_^1_%SAZ RD110+1_^1_%JMP* RD95_)NO, LOOP_^1RD110 RTJ* CKFATE_^1_%LDA* BCNT_)YES, COUNT = 3_^1_%INA -3_^1_%SAN RD124_^1_%LDA =XRD120-RECLOC YES, ADVA€€NCE RECORD_^1_%LDQ =N$7000_^1_%JMP* RECFUN_^1*_]_^1RD120 RTJ* CKFATE_'FATAL ERROR CHECK_^1RD122 LDA =XRD130-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'EXECUTE READ FUNCTION_^1*_]_^1RD124 INA 1_,BACK COUNT = 2_^1_%SAN 1_^1_%JMP* RD122_(YES, EXECUTE READ_^1_%LDA* BCNT_)DECREMENT B COUNTER_^1_%INA -1_^1_%STA* BCNT_^1_%LDA =XRD110-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =€€N$7000_%ADVANCE RECORD_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD130 RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK_^1_%SAZ 2_^1_%JMP RDONE_(YES, DONE_^1_%RTJ* NOISRC_'NO, NOISE RECORD_^1_%JMP* RD132_(NO_^1_%ENA 2_,YES, SET M = 2_^1_%STA MCNT_^1_%JMP RD03_)RE-READ_^1RD132 LDA- SINTER,I_$READ ERROR_^1_%AND =N$2C00_^1_%SAN 2_^1_%JMP RDONE_(YES, DONE_^1_%LDA* C€€CNT_)NO, DOES C = 0_^1_%SAN 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE ERROR_^1_%ENA 5_,RESTORE N COUNTER_^1_%JMP RD35-1_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINES / STORAGE_^1*_]_^1RECFUN ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$STORE NEXT RETURN ENTRY_^1_%STQ- QSTWD4,I_$SAVE FUNCTION_^1_%ENA 0_^1RECFX STA- MFLG,I_'SET FLAG FOR MOTION REQUEST_^1_%JMP REXIT_^1*_]_^€€1*_]_^1RECRWF ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$SET UP FOR NEXT RETURN_^1_%LDA RQSTW4_'RESTORE WORD COUNT_^1_%STA- QSTWD4,I_^1_%ENA 1_,SET FLAG FOR R/W REQUEST_^1_%JMP* RECFX_^1*_]_^1*_]_^1NOISRC NUM 0_^1_%LDA- ADTFW,I_%FWA - START ADDRESS_^1_%SUB FWA_^1_%INA -NOISLN_%- NOISE RECORD SIZE_^1_%SAP NOISEX_^1_%ENA -$0001_^1_%AND- RFLAG,I_^1_%ADD =N$0€€001_^1_%STA- RFLAG,I_^1_%ENA 15_^1_%STA- FLTCOD,I_$PRIME FAULT CODE_^1_%RAO* NOISRC_'YES, NOISE REOCRD_^1NOISEX JMP* (NOISRC)_^1*_]_^1*_]_^1CKFATE NUM 0_^1_%LDA- SINTER,I_^1_%AND =N$1241_%DID FATAL ERROR OCCUR_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%LDA- SINTER,I_$EXIT WITH STATUS IN A_^1_%JMP* (CKFATE)_$NO, RETURN_^1*_]_^1BCNT_!NUM 0_,BACKSPACE COUNTER_^1CCNT_!NUM €0_,CLEANER COUNT_^1_%END_]_^__PQMLCT9 CSY/ C44 P€1_%NAM QMLCT9_'DECK-ID C44 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_*INITIALIZER DRIVER FOR 9-TRACK MAGNETIC TAPE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1****_]_^1*_8INITIALIZER LCTT DRIVER_^1*_8***********************_^1*_]_^1*_*PROGRAM BASE -_^1*_]_^1*_*LCTT KERNAL DRIVER ODS LEVEL II -€€ LCTT 07/01/75_$REV 05_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_]_^1*_$THE INITIALIZER DRIVER PROCESSES ALL READ REQUESTS_^1*_$ISSUED BY THE MSOS SYSTEM INITIALIZER._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE PURPOSE OF THIS SUBROUTINE IS TO PROCESS READ_^1*_$REQUESTS ISSUED BY THE SYSTEM INITIALIZER. THE_^1*_$MAXIMUM RECORD SIZE IS 96 WORDS A€€ND THE BUFFER IS_^1*_$SPECIFIED BY THE USER. THE 7-TRACK VERSION OF THIS_^1*_$DRIVER HAS AN INTERMEDIATE BUFFER WHICH IS USED TO_^1*_$UNPACK THE DATA WHICH HAS BEEN READ. ALL DIAGNOSED_^1*_$ERRORS ARE RETURNED TO THE CALLING PROGRAM (IDRIV)_^1*_$WHICH WILL REPORT THEM TO THE OPERATOR._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(A) REGISTER = STARTING B€€UFFER ADDRESS_^1*_]_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$OUTPUTS ERROR DIAGNOSTICS IF ERRORS OCCUR._^1*_$(A) REGISTER = 0 TO INDICATE AN ERROR HAS OCCURRED._^1*_$(Q) REGISTER = ERROR CODE (SEE OUTPUT SECTION IN KERNAL_^1*_$SUBROUTINE (KLCTT) FOR ERROR CODE DESCRIPTION)._^1*_$(I) REGISTER = LAST HARDWARE STATUS FROM LCTT MAG TAPE DRIVE_^1*_]_^1*E_]_^1*_8ENTRY/EXIT_^1*_8---------€€-_^1*_]_^1*_$1._!ENTRY - THE ENTRY POINT 'QMTAPE' IS CALLED BY THE_^1*_*INITIALIZER SUBROUTINE 'IDRIV' TO INITIATE INPUT_^1*_*FROM A MAGNETIC TAPE UNIT. THE A-REGISTER CONTAINS_^1*_*THE STARTING ADDRESS INTO WHICH DATA IS TO BE READ,_^1*_*IN ORDER TO FACILITATE THE USE OF THE MSOS LCTT_^1*_*KERNAL DRIVER AS THE BASE OF THIS DRIVER, A PSEUDO_^1*_*MSOS FREAD REQUEST 'REQUEST' IS INC€€LUDED AS PART_^1*_*OF THIS PROGRAM. A PRESET PHYSICAL DEVICE TABLE_^1*_*'PLCTUO' IS ALSO INCLUDED HERE._^1*_]_^1*_$2._!EXIT - THIS DRIVER EXITS TO 'IDRIV' WHEN THE DATA_^1*_*TRANSFER IS COMPLETE. IF NO ERRORS HAVE OCCURRED,_^1*_*THE A-REGISTER WILL CONTAIN A 1._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1. SAVE THE CONTENTS OF THE I-REGISTER FOR RETURN._^1*_$2. CALCULATE THE ADDRESS €€OF THE LCTT PHYSICAL DEVICE_^1*_)TABLE AND STORE IN THE I-REGISTER._^1*_$3. CALCULATE THE ADDRESS OF THE PSEUDO FREAD REQUEST AND_^1*_)STORE IN WORD 6 OF THE PHYSICAL DEVICE TABLE._^1*_$4. CALCULATE THE ADDRESS OF THE PACK/UNPACK BUFFER AND_^1*_)STORE IN WORD 38 OF THE PHYSICAL DEVICE TABLE._^1*_$5. SAVE THE STARTING BUFFER ADDRESS AND ENDING BUFFER_^1*_)ADDRESS IN THE PHYSICAL €€DEVICE TABLE._^1*_$6. CALL THE KERNAL SUBROUTINE._^1*_$7. UPON RETURN, DETERMINE IF ANY ERRORS OCCURRED._^1*_.IF NO ERRORS OCCURRED, RETURN TO THE CALLING_^1*_.PROGRAM WITH THE A-REGISTER SET TO 1 AND THE_^1*_.I-REGISTER SET TO THE VALUE UPON ENTRY._^1*_]_^1*_.IF ERRORS OCCURRED, CLEAR THE ERROR FLAGS,_^1*_.SET THE A-REGISTER TO 0, SET THE Q-REGISTER TO_^1*_.THE ERROR CODE VALUE,€€ AND THE I-REGISTER TO THE_^1*_.LAST STATUS READ ON THE LCTT._^1*_$8. RETURN TO THE CALLING PROGRAM._^1*_]_^1*_]_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*KLCTT - LCTT KERNEL_^1*_]_^1*_]_^1*_8PARAMETERS_^1*_8----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT QMTAPE_'COMMON ENTRY TO INITIALIZER MAGNETIC TAPE_^1_%ENT EMTAPE_'BASIC W, E, S FUNCTION CODE_^1€€*_]_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------------_^1*_]_^1*_*MISCELLANEOUS EQUATES_^1*_]_^1_%EQU NOISLN(2)_#LENGTH OF NOISE RECORD_^1_%EQU LEWES($0480) EQUIPMENT CODE EQUATE_^1_%EQU MICRIN(9)_#MICRO INTERRUPT LINE EQUATE_^1_%EQU TLCT7(53*$10) TYPE CODE FOR 7 TRACK DRIVES_^1_%EQU TLCT9(54*$10) TYPE CODE FOR 9 TRACK DRIVES_^1*_]_^1*_*SELECT UNIT AND DENSITY EQUATES_^1_%EQ€€U U0TK7($800)_!UNIT/TRACK SELECT - UNIT 0/7 TRACK_^1_%EQU U0TK9(0)_$UNIT/TRACK SELECT - UNIT 0/9 TRACK_^1_%EQU D800($100)_"DENSITY SELECT - 800 BPI_^1_%EQU D556($200)_"DENSITY SELECT - 556 BPI_^1_%EQU PHSREX(0)_#MAXIMUM PHYSICAL RECORD SIZE - NOT USED_^1_%EQU LNLCTT(0)_^1_%EQU SLCTT($7FFF)_^1*_]_^1*_]_^1*_]_^1*E_]_^1*_*PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_%EQU ELVL(€€0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_'7 EQUIPTMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT1(9)_$9 DR€€IVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU DIAGLU(17)_€€"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE SELECT_^1_%E€€QU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG_^1_%EQU ADTCW(27)_#27 ADT TABLE CONTROL WORD_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG(ALSO ADT DUMMY)_^1_%EQU RRETAD(31)_"31 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(32)_"32 RECOVERY CHECKSUM_^1_%EQU RCNTFG(33)_"33 RECOVER€€Y COUNT FLAG_^1_%EQU RFLAG(34)_#34 RECOVERY FLAG, BIT15=1=NO RECOVERY_^1_%EQU QSTCOD(35)_"35 REQUEST CODE_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU PHSREC(37)_"37 MAX PHYSICAL RECORD SIZE_^1_%EQU ABUFF(38)_#38 PACK/UNPACK BUFFER ADDRESS_^1_%EQU ELINK(39)_#39 PDT THREAD_^1*E_]_^1*_8MESSAGES_^1*_8--------_^1*_]_^1*_*THE INITIALIZER INPUT CONTROL SUBROUTINE WILL PRI€€NT_^1*_*FAULT CODES FOR ALL DRIVER DIAGNOSED ERRORS._^1*_]_^1*E_]_^1*_8MISCELLANEOUS_^1*_8-------------_^1*_]_^1*_]_^1*_$LCTT HARDWARE REGISTER DEFINITIONS_^1*_]_^1*_/***************************************_^1*_/* FUNCTION AND CONDITION BIT REGISTER *_^1*_/***************************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$FUNCTION_^1*_$1_$FUNCTION_^1*_$2_$FUNCTION_^1*€€_$3_$FUNCTION_^1*_]_^1*_$4_$SKIP FIRST BYTE_^1*_$5_$SKIP LAST BYTE_^1*_$6_$NOT USED_^1*_$7_$NOT USED_^1*_]_^1*_$8_$DENSITY - FORM = BIT8BIT9 = XXX BPI_^1*_$9_$DENSITY - 01 = 800, 10 = 556, 11 = 200 BPI_^1*_$10_#PARITY - 1 = EVEN, 0 = ODD_^1*_$11_#TRACK - 1 = 7 TRACK, 0 = 9 TRACK_^1*_]_^1*_$12_#UNIT NUMBER_^1*_$13_#UNIT NUMBER_^1*_$14_#NOT USED_^1*_$15_#NOT USED_^1*E_]_^1*_/********€€*******************_^1*_/* HARDWARE FUNCTION CODES *_^1*_/***************************_^1*_$CODE_!FUNCTION_^1*_]_^1*_$0_$NOT USED, RESULTS IN PROGRAM ERROR_^1*_$1_$READ_^1*_$2_$WRITE_^1*_$3_$ERASE_^1*_$4_$BACKSPACE_^1*_$5_$REWIND_^1*_$6_$REWIND AND UNLOAD_^1*_$7_$WRITE TAPE MARK_^1*_$8_$SELECT_^1*_$9_$RECOVERY READ_^1*_$A_$CONTROLLED BACKSPACE_^1*_$B_$DIAGNOSTIC CODE_^1*_$C_$DIAGNOS€€TIC CODE_^1*_$D_$DIAGNOSTIC CODE_^1*_$E_$DIAGNOSTIC CODE_^1*_$F_$DIAGNOSTIC CODE_^1*E_]_^1*_/****************************_^1*_/* HARDWARE STATUS REGISTER *_^1*_/****************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$INOP - DURING SELECTION_^1*_$1_$BUSY_^1*_$2_$REWINDING_^1*_$3_$READ AFTER WRITE COMMAND_^1*_]_^1*_$4_$WRITE LOCKOUT_^1*_$5_$NOT USED_^1*_$6_$PROGRAM ERRO€€R_^1*_$7_$HALF WORD ON READ_^1*_]_^1*_$8_$SHORT BLOCK_^1*_$9_$TIME OUT_^1*_$10_#DROUPOUT/PICKUP_^1*_$11_#OVERLOAD_^1*_]_^1*_$12_#INOP - DURING EXECUTION_^1*_$13_#DATA ERROR_^1*_$14_#TAPE MARK_^1*_$15_#EOT_^1****_]_^1_%EJT_]_^1QMTAPE NOP 0_^1_%LDQ- I_,SAVE IHE I REGISTER FOR RETURN_^1_%STQ* SAVEIX_^1_%RTJ* HERE_)CALCULATE ADDRESS OF LCTT PHYSTB_^1HERE_!NOP 0_^1_%LDQ* HERE_^1_%ADQ €€ =XPLCTU0-HERE_^1_%STQ- I_,AND SAVE IN THE I-REGISTER_^1_%LDQ* HERE_)CALCULATE ADDRESS OF PSEUDO REQUEST_^1_%ADQ =XREQUST-HERE_^1_%STQ- EPTR,I_^1_%LDQ* HERE_)CALCULATE ADDRESS OF PACK/UNPACK BUFFER_^1_%ADQ =XBFLCTT-HERE_^1_%STQ- ABUFF,I_^1_%SAP ACTADR_'IF ADDRESS IS NEGATIVE_^1_%TCA A_,COMPLIMENT ADDRESS_^1ACTADR STA- ECCOR,I_%SAVE STARTING BUFFER ADDRESS IN PDT_^1_%STA* STRTAD€€_'SAVE STARTING ADDRESS IN PSEUDO REQUEST_^1_%ADD* NWORDS_'CALCULATE ENDING BUFFER ADDRESS_^1_%STA- ELSTWD,I_$AND SAVE IN PDT_^1_%LDA- EWES,I_'SET UP ADT CONTROL WORD FOR THIS EQUIPMENT_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1_%RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODE_^1_%ENA $0003_(GET ANY NOISE REC OR RECOVERY TO_^1_%AND- RFLAG,I_%LOG TO THE OPERATOR_^1_%ADD* IERR_€€)WERE THERE ANY ERRORS TO OUTPUT_^1_%SAN ERRCOD_'YES_^1_%LDQ* SAVEIX_'RESTORE I-REGISTER TO USER_^1_%STQ- I_^1_%ENA 1_,NO, A = 1 FOR NORMAL RETURN_^1_%JMP* (QMTAPE)_$RETURN_^1ERRCOD LDQ- FLTCOD,I_$PUT ERROR CODE INTO Q-REGISTER_^1_%LDA- RFLAG,I_%CLEAR RECOVERY FLAGS_^1_%AND =N$8000_^1_%STA- RFLAG,I_^1_%LDA- ESTAT2,I_$STATUS TO I-REG ON ERROR._^1_%STA- I_^1_%ENA 0_,CLEAR ERROR F€€LAG_^1_%STA* IERR_^1_%JMP* (QMTAPE)_$RETURN. A = 0 FOR ERROR._^1_%EJT_]_^1IERR_!NUM 0_,TEMPORARY HOLD FOR ERROR FLAG_^1SAVEIX NUM 0_,TEMPORARY HOLD FOR I-REGISTER_^1REQUST NUM $0800_(FORMAT READ_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDS NUM $0060_(LENGTH OF REQUEST_^1STRTAD NUM $0000_(STARTING ADDRESS_^1_%EJT_]_^1*_*L C T€€ T M A G T A P E_^1*_]_^1*_]_^1*_]_^1BFLCTT BZS BFLCTT(PHSREX*4/3+2) PACK/UNPACK BUFFER FOR 7 TK_^1*_]_^1*_]_^1*_*L C T T M A G T A P E , U N I T 0_^1*_]_^1* UNIT 0 - 7 TRACK, 556 BPI_^1*_]_^1PLCTU0 ADC $0000_)0 ELVL - SCHEDULER CALL_(NOT USED_^1_%ADC 0_-1 EDIN - INITIATOR ADDRESS_$NOT USED_^1_%ADC 0_-2 EDCN - CONTINUATOR ADDRESS_"NOT USED_^1_%ADC 0_-3 EDPGM - ERROR ADD€€RESS_(NOT USED_^1_%NUM -1_,4 EDCLK - DIAGNOSTIC CLOCK_^1_%NUM $0003_)5 ELU - LOGICAL UNIT_^1_%NUM 0_-6 EPTR - PARAMETER ADDRESS_^1EMTAPE ADC LEWES_)7 EWES - EQUIPT CODE FOR SAMPLE_^1_%ADC $0806+TLCT9_"8 EREQST - REQUEST STATUS_^1_%NUM $0002_)9 ESTAT1 - DRIVER STATUS_^1_%NUM 0_,10 ECCOR - NEXT LOCATION OF DATA_^1_%NUM 0_,11 ELSTWD - LAST LOCATION + 1_^1_%NUM 0_,12 ESTAT2 - €€LAST EQUIPTMENT STATUS_^1_%ADC LNLCTT_'13 MASLGN - DRIVER LENGTH_^1_%ADC SLCTT_(14 MASSEC - MASS MEMORY ADDRESS OF DRIVER_^1_%NUM 0_,15 RETURN - FNR RETURN ADDRESS_^1_%NUM 0_,16 FLTCOD - FAULT CODE IF REQUEST ERROR_^1_%ADC 0_,17 DIAGLU - DIAGNOSTIC LOGICAL UNIT (NOT USED)_^1_%NUM 0_,18 GHOSTI - COUNT OF GHOST INTERRUPTS_^1_%ADC MICRIN_'19 MICROI - MICRO INTERRUPT LINE_^1_%NU€€M 0_,20 TIMOUT - INTERRUPT TIMEOUT VALUE_^1_%NUM 0_,21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_%NUM 0_,22 SINTER - STATUS AFTER INTERRUPT_^1_%NUM 0_,23 STIMEO - STATUS AFTER INTERRUPT TIMEOUT_^1_%ADC U0TK9+D800_"24 UNTMOD - UNIT AND MODE SELECT_^1_%NUM 0_,25 ETEMP1 - TEMPORARY STORAGE_^1_%NUM 0_,26 HAFWRD - HALF WORD FLAG_^1_%NUM $8480_(27 ADTCW - ADT TABLE CONTROL WORD_^1_%€€NUM 0_,28 ADTFW - ADT TABLE FWA-1_^1_%NUM 0_,29 ADTLW - ADT TABLE LWA_^1_%NUM 0_,30 MFLG - ADT TABLE DUMMY (ALSO REQUEST FLAG)_^1_%NUM 0_,31 RRETAD - RECOVERY RETURN ADDRESS_^1_%NUM 0_,32 RCKSUM - RECOVERY CHECKSUM_^1_%NUM 0_,33 RCNTFG - RECOVERY COUNT FLAG_^1_%NUM 0_,34 RFLAG - RECOVERY TEMP STORAGE_^1_%NUM 0_,35 QSTCOD - REQUEST CODE_^1_%NUM 0_,36 QSTWD4 - WORD 4 OF REQ€€UEST_^1_%ADC PHSREX_'37 PHSREC - MAX PHYSICAL RECORD SIZE_^1_%ADC BFLCTT_'38 ABUFF - PACK/UNPACK BUFFER ADDRESS_^1_%ADC PLCTU0_'39 ELINK - PDT THREAD_^1_%EJT_]_^1*_$NAM KLCTT_(ODS LEVEL II - LCTT_*07-01-75 REV 06_^1*_$LCTT KERNEL_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1975_^1****_]_^1*E_]_^1*_8LCTT KERNEL_^1*_8***********_^€€1*_]_^1*_8FUNCTION_^1*_8--------_^1*_$THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_$PERFORMS THE I/O BY CALLING ANCILLARY ROUTINES._^1*_$IT ALSO PROCESSES ERRORS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE KERNAL IS COMPOSED OF TWO BASIC PARTS._^1*_$ONE TO PROCESS INFORMATION NECESSARY TO EXECUTE THE I/O_^1*_$REQUEST AND ONE TO PROCESS THE INFORMATI€€ON FOLLOWING THE I/O._^1*_]_^1*_$PRIOR TO I/O, THE STATUS TO DETERMINE IF THE DEVICE IS_^1*_$OPERATIVE IS TAKEN. THE REQUEST TYPE IS DETERMINED,_^1*_$THE INITIAL UNIT CONNECTION IS MADE, AND THE APPROPRIATE I/O_^1*_$SUBROUTINE IS CALLED._^1*_]_^1*_$AFTER COMPLETION OF THE I/O REQUEST, STATUS IS TAKEN TO_^1*_$DETERMINE IF ANY ERRORS HAVE OCCURRED AND IF RECOVERY_^1*_$ACTION IS POSS€€IBLE. IF THE TRANSFER IS CORRECT AND THE_^1*_$DEVICE IS A 7-TRACK UNIT, THE DATA IS UNPACKED FROM THE_^1*_$INTERNAL BUFFER INTO THE USER BUFFER. WHEN THE_^1*_$REQUEST IS SATISFIED CONTROL WILL BE RETURNED TO_^1*_$THE DRIVER._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$INITIATOR (KLCTT)_^1*_)(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*E_]_^1*_8OU€€TPUT_^1*_8------_^1*_]_^1*_$THE OUTPUTS OF THE KERNEL ARE -_^1*_]_^1*_$1. STATUS_^1*_(PRE-I/O TRANSFER STATUS TO PDT_^1*_(POST-I/O TRANSFER STATUS TO PDT_^1*_]_^1*_$2. FAULT CODE IS SET IF ERROR AS FOLLOWS -_^1*_)1 LOST DATA_^1*_)2 ALARM_^1*_)3 PARITY_^1*_(13 NO WRITE RING_^1*_(14 NOT READY_^1*_(15 NOISE RECORD DETECTED AND IGNORED_^1*_(31 WRITE OF SHORT RECORD REQUESTED_^1*_(41 IR€€RECOVERABLE ERROR_^1*_]_^1*_]_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1. EXITS TO DRIVER (CALLING ROUTINE) ON FAULT_^1*_.DETECTION, COMPLETION OF REQUEST._^1*_]_^1*E_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$PRE-I/O TRANSFER -_^1*_*1. SELECT AND STATUS TRANSPORT; SAVE STATUS._^1*_*2. IF BUSY OR INOPERATIVE CALL FAULT ROUTINE._^1*_*3. DETERMINE TYPE OF REQUEST AND CALL MOTION_^1*_-O€€R READ/WRITE ANCILLARY ROUTINE._^1*_*4. CALL WAIT SUBROUTINE TO WAIT FOR NOT BUSY_^1*_]_^1*_$POST-I/O TRANSFER -_^1*_*1. SAVES AND CHECKS THE DEVICE STATUS. IF A_^1*_-7-TRACK FILE MARK IS SENSED, THE STATUS WORDS_^1*_-ARE MODIFIED TO REMOVE THE POSSIBLE PARITY ERROR_^1*_-CAUSED BY READING IN THE WRONG MODE._^1*_-IF IT IS 7-TRACK BUT NOT A FILE MARK, THE STATUS_^1*_-IS CORRECTED AN€€D THE DATA TRANSFER CHECK CONTINUES._^1*_*2. IF IT IS A FILE MARK, THE FILE MARK STATUS FLAG IS_^1*_-SET AND A RETURN IS MADE TO THE CALLER._^1*_*3. IF A MOTION REQUEST, CHECK STATUS FOR INOP,_^1*_-READ AFTER WRITE, PROGRAM ERROR, OR TIMEOUT._^1*_-IF ANY OF THESE GO TO FAULT ROUTINE. IF NO_^1*_-ERROR, RETURN TO CALLER WITH NO ERROR_^1*_-INDICATOR (A-REGISTER = 0)._^1*_*4. IF READ/W€€RITE REQUEST CHECK STATUS FOR DATA_^1*_-ERROR, OVERLOAD, DROPOUT. IF ANY OF THESE GO_^1*_-TO RECOVERY ANCILLARY ROUTINE. IF NO ERROR_^1*_*5. IF 7-TRACK DRIVE, UNPACK DATA TO USER BUFFER._^1*_*6. RETURN TO CALLER._^1*_]_^1*_$FAULT ROUTINE -_^1*_*1. SAVE FAULT CODE IN PDT._^1*_*2. RETURN TO CALLER_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*XMOT - ISSUE I/O FOR MOTION REQUEST€€S_^1*_*XFER - ISSUE I/O FOR READ/WRITE REQUESTS_^1*_*WAIT - WAIT FOR NOT BUSY_^1*_*RECVRY - EXECUTE RECOVERY ERROR PROCEDURES_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_6*********_^1*_6* KLCTT *_^1*_6*********_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1KLCTT NUM 0_^1_%ENA 0_^1_%STA- MFLG,I_'CLEAR REQUEST TYPE FLAG_^1_%STA- SINTER,I_$CLEAR CONTINUATOR AND TIMEOUT STATUS_^1_%€€STA- SENTRY,I_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%INQ 8_,ADD DIRECTION (OUT)_^1_%LDA- UNTMOD,I_$UNIT SELECT INFO_^1_%INA 8_,SELECT FUNCTION_^1_%NUM $0B04_(SET I/O SELECT (SIO)_^1_%NOP 0_,DELAY 2 CYCLES_^1_%NOP 0_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%RTJ WAIT_)WAIT FOR NOT BUSY_^1_%STA- SENTRY,I_$SAVE ENTRY STATUS_^1_%ENA $41_^1_%AND-€€ SENTRY,I_$CHECK IF INOP OR PROG ERROR_^1_%SAZ KL10_)NO, CONTINUE_^1_%ENA 14_+YES, REPORT ERROR_^1_%JMP FLCTT_^1*_]_^1KL10_!LDQ- EPTR,I_'CHECK IF MOTION REQUEST_^1_%LDA- 4,Q_^1_%STA- QSTWD4,I_$SAVE WD 4 OF REQUEST IN PDT_^1_%LDA 0,Q_*GET REQUEST CODE_^1_%ARS 9_^1_%AND =N$001F_%MASK OFF REQUEST BITS_^1_%INA -14_^1_%STA- MFLG,I_'SAVE REQUEST FLAG_^1KL15_!LDA- MFLG,I_'NEXT I/O €€FUNCTION_^1_%SAN KL20_)SKIP IF NOT MOTION REQUEST_^1_%RTJ XMOT_)EXECUTE MOTION COMMAND_^1_%JMP* KL30_^1KL20_!RTJ XFER_)EXECUTE READ/WRITE_^1KL30_!RTJ* WAIT_)WAIT FOR NOT BUSY_^1_%EJT_]_^1* KERNEL CONTINUATOR_^1*_]_^1CLCTT STA- ESTAT2,I_$SAVE DEVICE STATUS_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$4000_%IS THERE A TAPE MARK STATUS SET_^1_%SAN CKMOT_(YES, CHECK IF€€ EXECUTING MOTION REQUEST_^1_%JMP* CL03_)NO, CHECK FOR RECOVERY IN PROGRESS_^1CKMOT LDA- UNTMOD,I_$IS THIS A 7-TRACK UNIT_^1_%AND =N$0800_^1_%SAN EOF7TK_'YES, CHECK FOR 7-TRACK EOF DATA_^1_%JMP* CL03_)NO, CONTINUE ON_^1EOF7TK LDA- MFLG,I_'IS THIS A MOTION REQUEST_^1_%SAN 1_,SKIP IF NON MOTION_^1_%JMP* CL02_^1_%LDQ- ABUFF,I_%GET FIRST DATA WORD_^1_%LDA 0,Q_*IS IT A FILE MARK DA€€TA WORD_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAN CL01_)SKIP IF NOT A FILE MARK_^1_%LDA =N$DFFF_%REMOVE POSSIBLE DATA ERROR_^1_%AND- ESTAT2,I_$STATUS BIT FROM ESTAT2 AND_^1_%STA- ESTAT2,I_$SINTER_^1_%LDA =N$DFFF_^1_%AND- SINTER,I_^1_%STA- SINTER,I_^1_%JMP* CL03_)FILE MARK CONTINUE_^1CL01_!LDA- ESTAT2,I_$ADJUST STATUS FOR NO FILE MARK_^1_%AND =N$BFFF_^1_%STA- ESTAT2,I_^1_%LDA- SINTER,€€I_^1_%AND =N$BFFF_^1_%STA- SINTER,I_^1_%JMP* CL03_^1*_]_^1CL02_!LDA MOTCOD_'MOTION CODE_^1_%INA -5_+SEARCH FILE MARK_^1_%SAZ 3_,YES, CHECK DATA_^1_%INA -2_+ADVANCE RECORD_^1_%SAN CL03_)NO, CONTINUE_^1_%LDA ADVRB_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAZ 1_,FILE MARK DATA_^1_%JMP* CL01_)NO, ADJUST STATUS_^1CL03_!LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ 1_,N€€O, CONTINUE_^1_%JMP* CL07_)YES, GO TO RECOVERY PROCEDURE_^1_%LDA- MFLG,I_^1_%SAN 1_,SKIP IF NON-MOTION REQUEST_^1_%JMP* CL10_)MOTION REQUEST_^1_%LDA- SINTER,I_$READ/WRITE STATUS CHECK_^1_%AND =N$124D_%INOP, REWIND, R/W, TIMEOUT_^1_%SAZ CL04_^1_%ENA 2_^1_%JMP* FLCTT_^1CL04_!ENA $0010_^1_%AND- SINTER,I_^1_%SAZ CL05_)NO, CONTINUE_^1_%ENA 13_+YES, ERROR_^1_%JMP* FLCTT_^1CL05_!LD€€A- SINTER,I_$ANY OTHERS CHECK RECOVERY_^1_%AND =N$2C00_%DATA ERROR, OVERLOAD, DROPOUT_^1_%SAN CL07_^1_%LDA- SINTER,I_^1_%AND =N$C000_%EOT OR TM SET_^1_%SAZ NOTM_)NO_^1_%CLR Q_,SET TAPE MARK STATUS SET FLAG_^1_%JMP* RQ9TK_(YES, NO RECOVERY_^1NOTM_!LDA- ADTFW,I_%FWA-1 (NOISE RECORD CHECK)_^1_%SUB* FWA_*- STARTING ADDRESS_^1_%INA -NOISLN_^1_%SAP CL08_)RECORD .GT. NOISE RECORD_^€€1CL07_!RTJ RECVRY_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KL15_)EXECUTE RECOVERY FUNCTION_^1CL08_!JMP* CL20_)NO RECOVERY OR RECOVERY COMPLETE_^1*_]_^1CL10_!LDA- SINTER,I_$IF INOP, READ AFTER WRITE,_^1_%AND =N$1249_%PROG ERR, TIMEOUT = FATAL_^1_%SAZ CL20X_(IF NO ERROR CHECK FOR ADVANCE FILE REQUEST_^1_%ENA 2_^1_%JMP* FLCTT_^1CL20X LDA MOTCOD_'IS THIS AN ADVANCE FILE R€€EQUEST_^1_%INA -5_+MOTCOD = 5_^1_%SAN CL40_)NO, CONTINUE ON AS IS_^1_%LDA- SINTER,I_$YES, IS THERE A FILE MARK STATUS SET_^1_%AND =N$4000_^1_%SAN CL25_)YES, SET FILE MARK STATUS FLAG IN Q_^1_%JMP* KL15_)NO, CONTINUE LOOKING FOR FILE MARK_^1CL20_!LDA- SINTER,I_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$C000_%IS TAPE MARK OR EOT SET_^1_%SAZ CL40_^1CL25_!CLR Q_,SET€€ FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_^1CL40_!ENA $0010_(IS A 7-TRACK READ IN PROGRESS_^1_%AND- ESTAT1,I_^1_%SAZ RQ9TK_(NO, DO NOT PACK DATA_^1_%STQ* QSAVX_(SAVE Q-REGISTER TEMPORARILY_^1_%RTJ TK7DAT_'YES, PACK 7 TRACK DATA INTO USER BUFFER_^1_%LDQ* QSAVX_(RESTORE Q-REGISTER_^1RQ9TK ENA 0_,CLEAR ERROR FLAG_^1_%JMP (KLCTT)_^1WAIT_!NOP 0_^1WAIT0X ENA 3_,SET FLAG FOR DEL€€AY_^1WAIT00 STA* BZYCTR_^1_%LDA =N$0FFF_%DELAY APPROX. 10 MS_^1WAIT01 INA -1_^1_%SAZ WAIT02_^1_%JMP* WAIT01_^1WAIT02 LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%AND =N$0002_%IS IT BUSY_^1_%SAZ WAIT03_'NO_^1_%JMP* WAIT0X_'YES, DELAY AND TRY AGAIN_^1WAIT03 LDA* BZYCTR_'DONE WITH DELAY LOOP YET_^1_%SAZ WAIT04_'YES_^1_%INA -1_+WAIT AGAIN_^1_%JMP* WAIT00_^€€1WAIT04 NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%STA- SINTER,I_^1_%JMP* (WAIT)_'RETURN_^1*_]_^1* FAILED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1FLCTT STA- FLTCOD,I_$SAVE FAULT CODE_^1_%JMP (KLCTT)_%RETURN VIA KERNEL_^1QSAVX NUM $0000_(TEMPORARY HOLD FOR Q-REGISTER_^1BZYCTR NUM $0000_(BUSY LOOP COUNTER_^1_%EJT_]_^1*_$NAM €€ XFER_)ODS LEVEL II_106-03-75 REV 01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT READ/WRITE ROUTINES_^1*_8************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE READ/WRITE I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THESE ROUTINES CHECK IF LEGAL REC€€ORD SIZE AND CALLS_^1*_$FAULT ROUTINE IF NOT. THE CORRECT PARITY IS GENERATED_^1*_$AND THE ADT TABLE IS SET UP. THE TYPE OF TRANSFER IS_^1*_$DETERMINED AND THE CORRECT ROUTINE (READ OR WRITE) IS_^1*_$CALLED. THE READ ROUTINE WILL EITHER EXECUTE A NORMAL_^1*_$READ OR A RECOVERY READ DEPENDING ON BIT 4 IN RFLAG IN_^1*_$THE PDT. THE WRITE ROUTINE WILL EITHER DO A WRITE OR_^1*_$A CONTR€€OLLED BACKSPACE DEPENDING ON BIT 3 IN RFLAG._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NORMAL PARAMETERS IN PDT. SPECIAL FLAGS ARE USED IN_^1*_$RFLAG IN THE PDT. THESE FLAG ARE:_^1*_]_^1*_)BIT 2 = 1 = READ IN OPPOSITE PARITY_^1*_)BIT 3 = 1 = EXECUTE CONTROLLED BACKSPACE_^1*_)BIT 4 = 1 = EXECUTE READ RECOVERY_^1*_]_^1*_$THEY ARE USED BY THE RECOVERY ROUTINES A€€ND ARE_^1*_$CLEARED AFTER FUNCTION EXECUTED._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$CLEARS CONTROL FLAGS IN RFLAG AFTER FUNCTION EXECUTED._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP, PARAMETERS NEEDED ARE_^1*_*ALREADY IN THE PDT._^1*_$EXIT IS A NORMAL RETURN TO CALLER._^1*E_]_^1*_8FLOW_^1*_8----_^1*_$1. CHECK IF REQUEST SHORT RECORD TYPE, IF SO CALL_€€^1*_(FAULT ROUTINE._^1*_$2. DETERMINE CORRECT PARITY FOR 7 TRACK._^1*_$3. SETUP ADT TABLE AND CALL READ OR WRITE ROUTINE._^1*_$4. IF READ DETERMINE IF EITHER OPPOSITE PARITY_^1*_(OR RECOVERY READ FLAG SET. ENABLE MICRO INTERRUPT_^1*_(AND EXECUTE FUNCTION._^1*_$5. IF WRITE DETERMINE IF CONTROLLED BACKSPACE FLAG_^1*_(SET. ENABLE MICRO INTERRUPT AND EXECUTE FUNCTION_^1*_]_^1****_]_^1_€€%EJT_]_^1*_6********_^1*_6* XFER *_^1*_6********_^1*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1XFER_!NUM 0_^1_%LDA- QSTWD4,I_$GET REQUEST PARAMETER_^1_%INA -NOISLN_%CHECK IF LENGTH.GE.NOISE LENGTH_^1_%SAP 1_^1_%JMP* NOISRX_'SHPRT RECORD ERROR_^1_%LDA- ECCOR,I_%INIT CURRENT WORD POINTERS_^1_%STA* FWA_^1_%LDA- ELSTWD,I_^1_%STA* LWA_^1_%ENA €€$0001_^1_%AND- ESTAT1,I_^1_%STA* MOTIDX_'SET R/W FLAG_^1_%LDA- UNTMOD,I_$THIS A 7TK UNIT_^1_%AND =N$0800_^1_%SAZ TK9RW_^1_%RTJ TK7DAT_'FORMAT 7 TRACK DATA_^1_%RTJ TK7RW_(DETERMINE TYPE OF 7TK PARITY_^1TK9RW STA* PRITYC_'STORE PARITY_^1_%LDA* FWA_*SETUP ADT TABLE BUFFER POINTERS_^1_%INA -1_^1_%STA- ADTFW,I_%FWA-1_^1_%LDA* LWA_^1_%INA -1_^1_%STA- ADTLW,I_%LAST WORD ADDRESS_^1_€€%LDA* MOTIDX_'R/W FLAG_^1_%SAZ READ_^1_%RTJ* WRADT_(DO THE WRITE_^1_%JMP* (XFER)_^1READ_!RTJ* RDADT_(DO THE READ_^1_%JMP* (XFER)_^1*_]_^1NOISRX ENA 31_+NOISE RECORD ERROR_^1_%JMP* FLCTT_^1*_]_^1*_]_^1FWA_"NUM 0_,CURRENT FIRST WORD ADDRESS_^1LWA_"NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT_]_^1* READ DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1RDADT NUM 0_^1_€€%LDA- ADTCW,I_%GET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%MASK OUT WRITE BIT_^1_%STA- ADTCW,I_^1_%LDA* PRITYC_^1_%STA* TPAR_)SAVE PARITY BIT_^1_%ENA $0004_^1_%AND- RFLAG,I_^1_%SAZ RD10A_(OPPOSITE PARITY NOT SET_^1_%TCA A_^1_%AND =N$0400_%COMPLIMENT PARITY BIT_^1_%STA* PRITYC_^1RD10A RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0010_(RECOVERY READ IN PROGRESS_^1_%AND- RFLA€€G,I_^1_%SAZ 1_^1_%ENA 8_,YES, SELECT FUNCTION_^1_%INA 1_,OUTPUT READ FUNCTION_^1_%RTJ* SFUNC_(CLEAR OPPOSITE PARITY FLAG_^1_%ENA -$0014_'AND RECOVERY READ SWITCH_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA* TPAR_^1_%STA* PRITYC_'RESTORE PARITY_^1_%JMP* (RDADT)_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1WRADT NUM 0_^1_%LDA- ADTCW,I_%SET AND €€SET ADT CONTROL WORD_^1_%AND =N$F7FF_%ADD WRITE_^1_%ADD =N$0800_^1_%STA- ADTCW,I_^1_%RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0008_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, EXECUTE ONE_^1_%INA 2_^1_%ADD- HAFWRD,I_$ADD HALF WORD BIT IF SET_^1_%RTJ* SFUNC_^1_%ENA -$0008_'CLEAR CB FLAG_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%JMP* (WRADT)_^1*_]_^1* ENABLE MICRO INTERRUPT_^1*_€€]_^1ENBMIC NUM 0_^1_%LDA- I_,SET UP POINTER TO ADT TABLE_^1_%INA ADTCW_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ =N$8000_%ENABLE BIT_^1_%NUM $0B06_(DEFINE MICRO INTERRUPT (DMI)_^1_%JMP* (ENBMIC)_^1*_]_^1MOTIDX NUM 0_,READ/WRITE FLAG, 1=WRITE_^1PRITYC NUM 0_,PARITY BIT (POSITIONED)_^1TPAR_!NUM 0_,TEMP PARITY STORAGE_^1_%EJT_]_^1*_$NAM XMOT_)ODS LEVEL II - LCTT_*07-01-75 REV-0€€4_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT MOTION ROUTINES_^1*_8********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE MOTION I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS MODULE WILL DECODE THE MOTION COMMAND AND EXECUTE_^1*_$THE NEXT MOTION COMMA€€ND. THESE COMMANDS ARE ISSUED BY A_^1*_$SERIES OF SMALL SUBROUTINES. BEFORE THE COMMAND IS ISSUED_^1*_$THE CORRECT PARITY WILL FIRST BE DETERMINED. AFTER THE_^1*_$MOTION COMMAND IS ISSUED CONTROL WILL BE PASSED BACK TO_^1*_$THE CALLER. AN UNUED FUNCTION WILL BE TREATED AS A NOP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$SEVERAL FLAG BITS IN THE PDT ARE USED €€BY THIS ROUTINE._^1*_*UNTMOD - BIT 11 - TYPE OF DRIVE (7 OR 9 TRACK)_^1*_*ESTAT1 - BIT 5 - MOTION REQUEST BIT (SET TO 1)_^1*_1- BIT 6 - REWIND FLAG (SET TO 1 IF REWIND)_^1*_1- BIT 8 - RECOVERY IN PROGRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF A REWIND COMMAND IS EXECUTED BIT 6 OF ESTAT1 WILL_^1*_$BE SET TO INDICATE A REWINDIN PROGRESS. BIT 5 OF ESTAT1_^1*_$WILL BE SET TO I€€NDICATE A MOTION REQUEST IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IF A SEVEN TRACK UNIT IS PRESENT THE ROUTINE TK7RW_^1*_$WILL BE CALLED TO DETERMINE THE PARITY TO BE USED._^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XMOT *_^1*_6********_^1*_]_^1* MOTION EXECUTION ANCILLARY ROUTINE_^1* ENTER WI€€TH MOTION REQUEST, I = PDT POINTER_^1*_]_^1XMOT_!NUM 0_^1_%LDA- UNTMOD,I_$IS THIS A 7 TRACK UNIT_^1_%AND =N$0800_^1_%SAZ XMOT10_'NO, SKIP_^1_%RTJ* TK7RW_^1XMOT10 STA* PRITYC_^1_%ENA -$0020_^1_%AND- ESTAT1,I_^1_%ADD =N$0020_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$GET NUMBER OF WORDS_^1_%ARS 12_+SHIFT AND MASK_^1_%AND =N$0007_^1_%STA* MOTCOD_^1_%TRA Q_^1_%INA -8_^1_%SAP SUBMOT€€_'NOOP, ILLEGAL OPERATION_^1_%JMP* SUBMOT,Q_$EXECUTE FUNCTION_^1*_]_^1SUBMOT JMP* NOOP_)NO OPERATION (USED FOR STATUS)_^1_%JMP* BKSP_)BACKSPACE RECORD_^1_%JMP* WRFM_)WRITE FILE MARK_^1_%JMP* REW_*REWIND_^1_%JMP* REWUN_(REWIND UNLOAD_^1_%JMP* ADVAN_(SEARCH FILE MARK FORWARD_^1_%JMP* ERASE_(ERASE (DLU OR RECOVERY ONLY)_^1_%JMP* ADVAN_(ADVANCE 1 RECORD_^1_%EJT_]_^1* REWIND_]_^1*_]_^1R€€EW_"ENA -$0040_^1_%AND- ESTAT1,I_^1_%ADD =N$0040_^1_%STA- ESTAT1,I_^1_%ENA 5_,EXECUTE REWIND FUNCTION_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1REWUN ENA 6_,EXECUTE REWIND UNLOAD_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1BKSP_!ENA 4_,EXECUTE BACKSPACE_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* ERASE_]_^1*_]_^1ERASE LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$010€€0_^1_%SAN 1_,YES, EXECUTE ERASE_^1_%JMP* NOOP_^1ERSX_!ENA 3_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* WRITE FILE MARK_^1*_]_^1WRFM_!LDA- UNTMOD,I_$GET 7TK BIT_^1_%AND =N$0800_^1_%SAZ WRFM9_^1_%RTJ* TK7WEF_'WRITE 7 TRACK TAPE MARK_^1_%JMP* (XMOT)_^1WRFM9 ENA 7_,EXECUTE 9TK FILEMARK_^1DOMOT RTJ* SFUNC_^1_%JMP* (XMOT)_^1*_]_^1*_]_^1* ADVANCE ONE RECORD OR FILE_^1*_]_^1ADVAN RTJ* BLOC+1_'€€CALCULATE ADDRESS OF BUFFER_^1BLOC_!ADC* ADVRB_^1_%NUM 0_^1_%LDA* BLOC+1_'GET PRESENT CORE ADDRESS_^1_%ADD* BLOC_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_^1_%INA 9_,ALLOW 9 WORDS_^1_%STA- ADTLW,I_%LWA OF BUFFER_^1_%RTJ RDADT_(EXECUTE A READ_^1_%JMP* (XMOT)_^1*_]_^1ADVRB BZS ADVRB(9)_$BUFFER FOR ADVANCE RECORD_^1*_]_^1*_]_^1* FUNCTION OUTPUT_^1* ENTER WITH FUNCTION CO€€DE IN A AND PARITY IN PRITYC_^1*_]_^1SFUNC NUM 0_^1_%ADD- UNTMOD,I_$ADD UNIT, DENSITY AND TRACK_^1_%ADD* PRITYC_'ADD PARITY_^1_%LDQ- EWES,I_^1_%INQ 8_,SET I/O_^1_%NUM $0B04_(SIO_^1_%NOP 0_,DELAY_^1_%NOP 0_^1_%LDQ- EWES,I_'EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%JMP* (SFUNC)_^1*_]_^1*_]_^1* NO OPERATION - NO FUNCTION OUTPUT_^1*_]_^1NOOP_!JMP CL40_)ENTER€€ CONTINUATOR AFTER INT PROCESS_^1*_]_^1MOTCOD NUM 0_,MOTION CODE THIS MOTION_^1_%EJT_]_^1*_$NAM TK7_*ODS LEVEL II - LCTT_*06-06-75 REV-01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1*_6*******_^1*_6* TK7 *_^1*_6*******_^1*_]_^1* DUMMY SEVEN-TRACK SPECIAL ROUTINES_^1*_]_^1* 7 TRACK READ/WRITE - DETERMINES PARITY_^1*_]_^1TK7RW NUM €€ 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%JMP* (TK7RW)_^1*_]_^1* 7 TRACK WRITE OF END OF FILE ROUTINE_^1*_]_^1TK7WEF NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%JMP* (TK7WEF)_^1*_$NAM TK7DAT_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 197€€5_^1*_6**********_^1*_6* TK7DAT *_^1*_6**********_^1* LCTT DUMMY 7 TRACK DATA FORMAT ROUTINE_^1*_]_^1TK7DAT NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1TK7DEX JMP* (TK7DAT)_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%EJT_]_^1*_$NAM RECVRY_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA,€€ CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT RECOVERY ROUTINES_^1*_8**********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THIS PROGRAM WILL ATTEMPT TO RECOVER DATA FROM A TAPE_^1*_$RECORD AFTER A DATA ERROR HAS OCCURRED. IT WILL ALSO BYPASS_^1*_$NOISE RECORDS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_8INPUT REQUIREMENTS€€_^1*_8------------------_^1*_]_^1*_$NONE_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_!READ RECOVERY_^1*_!-------------_^1*_!-------------_^1*_]_^1*_$NORMAL READ_^1*_$-----------_^1*_$1. SET M = 2 (NOISE RECOVERY RETRY COUNT._^1*_$2. IF NOISE GO TO STEP 3._^1*_(IF AN ERROR GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$NOISE RECO€€VERY_^1*_$--------------_^1*_$3. BACKSPACE._^1*_(SET M = M-1._^1*_(IF M = 0 GO TO STEP 5._^1*_$4. RECOVERY READ._^1*_(GO TO STEP 2._^1*_]_^1*_$BYPASS NOISE_^1*_$------------_^1*_$5. SET M = 2._^1*_$6. ADVANCE RECORD._^1*_(READ RECORD._^1*_(IF FILE MARK, EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF ERROR GO TO STEP 7_^1*_*ELSE EXIT._^1*_]_^1*_$REREAD THE ERROR BLOCK_^1*_$--------------€€--------_^1*_$7. SET N = 5 (REREAD COUNT)._^1*_(SET C = 5 (CLEANER COUNT)_^1*_$8. BACKSPACE._^1*_(READ RECORD._^1*_(IF FILE MARK DETECTED THEN EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR OCCURRED GO TO STEP 9._^1*_*ELSE EXIT._^1*_$9. SET N = N-1._^1*_(IF N = 0 GO TO STEP 11._^1*_*ELSE GO TO STEP 8._^1*_#10. SET M = 2._^1*_(GO TO STEP 3._^1*_]_^1*_$REREAD IN OPPOSITE €€PARITY_^1*_$-------------------------_^1*_#11. IF 9 TRACK TAPE GO TO STEP 12._^1*_(BACKSPACE._^1*_(READ RECORD IN OPPOSITE PARITY._^1*_(IF FILE MARK DETECTED, DECLARE THE ERROR IRRECOVERABLE._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR GO TO STEP 12._^1*_*ELSE DECLARE IRRECOVERABLE ERROR IN OPPOSITE PARITY._^1*_]_^1*_$POSITION TAPE PAST TAPE CLEANERS_^1*_$-----------------€€---------------_^1*_#12. SET B = 1 (BACKSPACE COUNTER)._^1*_(SET C = C-1._^1*_#13. BACKSPACE._^1*_(IF BOT GO TO STEP 15._^1*_#14. SET B = B+1_^1*_(IF B = 5 GO TO STEP 15_^1*_*ELSE GO TO STEP 13._^1*_(IF FILE MARK OR EOT DETECTED THEN EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF AN ERROR OCCURRED GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$CLEAN TAPE_^1*_$----------_^1*_#15. IF B = 3 GO T€€O STEP 17._^1*_(IF B = 2 GO TO STEP 18._^1*_#16. ADVANCE 1 RECORD._^1*_(SET B = B-1_^1*_(GO TO STEP 15._^1*_#17. ADVANCE 1 RECORD (IGNORE FILE MARKS AND DATA ERRORS)_^1*_#18. READ RECORD._^1*_(IF FILE MARK DETECTED EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF ERROR OCCURRED GO TO STEP 8._^1*_(IF C = 0 DECLARE ERROR IRRECOVERABLE_^1*_*ELSE SET N = 5 AND GO TO STEP 8._^1*_]_^1*_€€]_^1*_]_^1*_]_^1*_!WRITE RECOVERY_^1*_!--------------_^1*_!--------------_^1*_]_^1*_$NORMAL WRITE_^1*_$------------_^1*_$1. SET N = 0 (ERASE COUNT)_^1*_$2. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3_^1*_*ELSE EXIT._^1*_]_^1*_$BACKUP TO LAST GOOD BLOCK_^1*_$-------------------------_^1*_$3. PERFORM A CONTROLLED BACKSPACE._^1*_]_^1*_$ERASE_^1*_$-----_^1*_$4. SET N = N+1._^1*_(IF €€N = 20 DECLARE ERROR IRRECOVERABLE._^1*_(SET M = N (M = ERASE COUNTER)_^1*_$5. ERASE_^1*_(IF END OF TAPE AND M>1 DECLARE ERROR IRRECOVERABLE._^1*_(IF AN ERASE ERROR DECLARE ERROR IRRECOVERABLE._^1*_$6. SET M = M-1_^1*_(IF M = 0 GO TO STEP 7_^1*_*ELSE GO TO STEP 5._^1*_]_^1*_$REWRITE THE BLOCK_^1*_$-----------------_^1*_$7. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3._^1*_]_^1*_$€€POSITION TAPE TO LAST GOOD BLOCK_^1*_$--------------------------------_^1*_$8. PERFORM CONTROLLED BACKSPACE._^1*_]_^1*_$READ THE BLOCK_^1*_$--------------_^1*_$9. READ_^1*_$10. IF NOISE GO TO STEP 9._^1*_)IF AN ERROR GO TO STEP 13._^1*_+ELSE EXIT._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* RECVRY *_^1*_6**********_^1*_]_^€€1* LCTT RECOVERY ROUTINES_^1*_]_^1RECVRY NUM 0_^1_%RTJ* RECLOC_'DETERMINE RECOVERY ABSOLUTE_^1RECLOC NUM 0_,ADDRESS + 2_^1R01_"ENA 0_,CLEAR FAULT INDICATOR_^1_%STA* RFCOD_^1_%LDA- RFLAG,I_%IS RECOVERY ENABLED_^1_%SAP R05_*YES, SKIP_^1_%RTJ NOISRC_'NOISE RECORD ENCOUNTERED_^1_%ENA 3_,NO,_^1_%JMP* ROX_^1_%ENA 1_,YES, SHORT RECORD FAULT_^1ROX_"JMP FLCTT_^1R05_"LDA- ESTAT1,I_$I€€S RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ R10_*NO, SET FLAG AND SAVE PARAMETERS_^1_%LDQ- RRETAD,I_$YES, GO TO NEXT FUNCTION_^1_%JMP 0,Q_^1R10_"LDA- ESTAT1,I_$SET RECOVERY IN PROGRESS_^1_%AND =N$FEFF_^1_%ADD =N$0100_^1_%STA- ESTAT1,I_^1_%LDA- MFLG,I_'SAVE REQUEST PARAMETERS_^1_%STA* RMFLG_^1_%LDA- QSTWD4,I_^1_%STA* RQSTW4_^1_%ENA $0001_^1_%AND- ESTAT1,I_^1_%SAN RWRIT_^1_€€%JMP* RREAD_(READ OPERATION_^1_%EJT_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1RWRIT ENA 0_,CLEAR N COUNTER_^1_%STA* NCNT_^1RW05_!ENA $0008_(SET CB FLAG_^1_%ADD- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA =XRW10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RW10_!LDA- SINTER,I_$CONTROLLED BACKSPACE ERROR_^1_%AND =N$1E55_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'€€YES, FATAL_^1_%RAO* NCNT_)UPDATE COUNTER_^1_%LDQ =N$6000_%ERASE_^1_%LDA =XRW20-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW20_!LDA- SINTER,I_$ERASE ERROR OR EOT_^1_%AND =N$9F51_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA* NCNT_)MAXIMUM NUMBER OF ERASURES_^1_%INA -20_^1_%SAM 1_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA =XRW30-RECLOC SET€€UP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE A RE-WRITE_^1*_]_^1RW30_!LDA- SINTER,I_$RE-WRITE ERROR_^1_%AND =N$2C00_^1_%SAZ 1_^1_%JMP* RW05_)YES, DO ANOTHER BACKSPACE,ERASE_^1_%JMP* RDONE_(NO, RECOVERED_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINE / STORAGE_^1*_]_^1RFAULT LDA- SINTER,I_$ALARM TYPE ERROR_^1_%AND =N$124F_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 2_,YES, REPORT IT_^1_%JMP* RFXIT_€€^1_%LDA- SINTER,I_^1_%AND =N$2C00_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 3_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%ENA 41_+MAXIMUM ATTEMPTS REACHED_^1RFXIT STA* RFCOD_(SAVE FAULT CODE_^1_%JMP* RDONX_^1RDONE ENA -$0002_^1_%AND- RFLAG,I_^1_%ADD =N$0002_^1_%STA- RFLAG,I_^1_%RAO- RCNTFG,I_$INDEX RECOVERY COUNT_^1RDONX RAO* RECVRY_'EXIT+2 NO RECOVERY OR IRRECOVERABLE_^1_%LDA- ESTAT1,I_$CLE€€AR FLAGS_^1_%AND =N$FEDF_%CLEAR MOTION IF SET, AND RECOVERY FLAG IF SET_^1_%STA- ESTAT1,I_^1_%LDA* RMFLG_(RESTORE PDT PARAMETERS_^1_%STA- MFLG,I_^1_%LDA* RQSTW4_^1_%STA- QSTWD4,I_^1_%LDA* RFCOD_(ERROR COMPLETION_^1_%SAZ REXIT_(NO_^1_%JMP FLCTT_(YES, GO TO FAULT ROUTINE_^1REXIT JMP* (RECVRY)_^1*_]_^1RMFLG NUM 0_^1RQSTW4 NUM 0_^1MCNT_!NUM 0_^1NCNT_!NUM 0_,ERASE COUNTER_^1RFC€€OD NUM 0_,FAULT/CODE FLAG_^1_%EJT_]_^1*_]_^1*_]_^1* READ RECOVERY_^1*_]_^1RREAD ENA 2_^1_%STA* MCNT_^1RD01_!RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD05_)NO, CHECK IF ERROR_^1RD03_!LDA* MCNT_)DECREMENT READ LOGIC_^1_%INA -1_^1_%STA* MCNT_^1_%LDA =XRD20-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD05_!LDA- SINTER,I_$ERROR ON€€ READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%JMP* RDRERD_'YES, RE-READ_^1*_]_^1RD10_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK READ_^1_%SAN 1_^1_%JMP* RD01_)NO, CHECK IF NOISE RECORD_^1_%JMP* RDONE_(YES, EXIT_^1*_]_^1RD20_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA* MCNT_)READ COUNTER ELAPSED_^1_%SAZ 1_^1_%JMP* RD25_)NO, DO RECOVERY READ_^1_%ENA 2_€€,YES, SKIP NOISE RECORD_^1_%STA* MCNT_^1_%LDA =XRD30-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1RD25_!ENA -$0010_^1_%AND- RFLAG,I_^1_%ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD30_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA =X€€RD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE READ_^1*_]_^1* RE-READ_]_^1*_]_^1RDRERD ENA 5_,RE-READ RECORD_^1_%STA CCNT_)SET CLEANER COUNT_^1_%STA* NCNT_)SET RE-TRY COUNT_^1RD35_!LDA =XRD40-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE FUNCTION_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD40_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$0010_^1_%AND- RFL€€AG,I_^1_%ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD50-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD50_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%TAPE MARK READ_^1_%SAZ 1_^1_%JMP* RDONE_(YES, DONE_^1_%RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD55_)NO_^1_%ENA 2_,RE-INIT COUNTER_^1_%STA* MCNT_^1_%JMP* RD03_)CHECK FURTHER_^1RD55€€_!LDA- SINTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%LDA* NCNT_)YES, N=N-1_^1_%INA -1_^1_%STA* NCNT_)N=0_^1_%SAZ 1_^1_%JMP* RD35_)NO, LOOP_^1_%LDA- UNTMOD,I_$YES, 9TK TRANSPORT_^1_%AND =N$0800_^1_%SAN RDOPR_^1_%JMP* RDCLN_^1*_]_^1* READ OPPOSITE POLARITY_^1*_]_^1RDOPR LDA =XRD60-RECLOC BACKSPACE FUNCTION_^1_%LDQ =N$1000_^1_%JMP* RECFUN_^1*_€€]_^1RD60_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$0004_^1_%AND- RFLAG,I_^1_%ADD =N$0004_^1_%STA- RFLAG,I_^1_%LDA =XRD70-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'READ IN OPPOSITE PARITY_^1*_]_^1RD70_!RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_^1_%SAZ 2_,FILE MARK_^1_%JMP RFAULT_'YES, IRRECOVERABLR_^1_%RTJ* NOISRC_'NOISE RECORD_^1_%JMP* RD75_)NO_^1_%JMP RREAD_(YES,€€ LOOP_^1RD75_!LDA- SINTER,I_^1_%AND =N$2C00_%READ ERROR_^1_%SAN 2_^1_%JMP RFAULT_'IRRECOVERABLE ERROR_^1_%EJT_]_^1*_]_^1* CLEAN TAPE_^1*_]_^1RDCLN LDA* CCNT_)CLEAN TAPE_^1_%INA -1_+DECREMENT CLEAN COUNTER_^1_%STA* CCNT_^1_%ENA 1_^1_%STA* BCNT_)INIT BACKSPACE COUNTER_^1RD95_!LDA =XRD100-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP* RECFUN_'EXECUTE FUNCTI€€ON_^1*_]_^1RD100 LDA- SINTER,I_^1_%AND =N$1041_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%RAO* BCNT_)NO, UPDATE BACKUP COUNT_^1_%LDA- SINTER,I_^1_%AND =N$0200_%TIMED OUT (BOT)_^1_%SAN RD110+1_^1_%LDA* BCNT_^1_%INA -5_+COUNT = 5_^1_%SAZ RD110+1_^1_%JMP* RD95_)NO, LOOP_^1RD110 RTJ* CKFATE_^1_%LDA* BCNT_)YES, COUNT = 3_^1_%INA -3_^1_%SAN RD124_^1_%LDA =XRD120-RECLOC €€YES, ADVANCE RECORD_^1_%LDQ =N$7000_^1_%JMP* RECFUN_^1*_]_^1RD120 RTJ* CKFATE_'FATAL ERROR CHECK_^1RD122 LDA =XRD130-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'EXECUTE READ FUNCTION_^1*_]_^1RD124 INA 1_,BACK COUNT = 2_^1_%SAN 1_^1_%JMP* RD122_(YES, EXECUTE READ_^1_%LDA* BCNT_)DECREMENT B COUNTER_^1_%INA -1_^1_%STA* BCNT_^1_%LDA =XRD110-RECLOC SETUP NEXT RETURN ENTRY_^€€1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD130 RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK_^1_%SAZ 2_^1_%JMP RDONE_(YES, DONE_^1_%RTJ* NOISRC_'NO, NOISE RECORD_^1_%JMP* RD132_(NO_^1_%ENA 2_,YES, SET M = 2_^1_%STA MCNT_^1_%JMP RD03_)RE-READ_^1RD132 LDA- SINTER,I_$READ ERROR_^1_%AND =N$2C00_^1_%SAN 2_^1_%JMP RDONE_(YES, DONE_^€€1_%LDA* CCNT_)NO, DOES C = 0_^1_%SAN 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE ERROR_^1_%ENA 5_,RESTORE N COUNTER_^1_%JMP RD35-1_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINES / STORAGE_^1*_]_^1RECFUN ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$STORE NEXT RETURN ENTRY_^1_%STQ- QSTWD4,I_$SAVE FUNCTION_^1_%ENA 0_^1RECFX STA- MFLG,I_'SET FLAG FOR MOTION REQUEST_^1_%JMP REXI€€T_^1*_]_^1*_]_^1RECRWF ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$SET UP FOR NEXT RETURN_^1_%LDA RQSTW4_'RESTORE WORD COUNT_^1_%STA- QSTWD4,I_^1_%ENA 1_,SET FLAG FOR R/W REQUEST_^1_%JMP* RECFX_^1*_]_^1*_]_^1NOISRC NUM 0_^1_%LDA- ADTFW,I_%FWA - START ADDRESS_^1_%SUB FWA_^1_%INA -NOISLN_%- NOISE RECORD SIZE_^1_%SAP NOISEX_^1_%ENA -$0001_^1_%AND- RFLAG,I_^1_%€€ADD =N$0001_^1_%STA- RFLAG,I_^1_%ENA 15_^1_%STA- FLTCOD,I_$PRIME FAULT CODE_^1_%RAO* NOISRC_'YES, NOISE REOCRD_^1NOISEX JMP* (NOISRC)_^1*_]_^1*_]_^1CKFATE NUM 0_^1_%LDA- SINTER,I_^1_%AND =N$1241_%DID FATAL ERROR OCCUR_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%LDA- SINTER,I_$EXIT WITH STATUS IN A_^1_%JMP* (CKFATE)_$NO, RETURN_^1*_]_^1BCNT_!NUM 0_,BACKSPACE COUNTER_^1CC€(NT_!NUM 0_,CLEANER COUNT_^1_%END_]_^__ (PDTLCT7 CSY/ C45 P€1_%NAM DTLCT7_'DECK-ID C45 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$DTLP DRIVER FOR 7-TRACK LCTT MAGNETIC TAPE DRIVE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1****_]_^1*_5DISK-TO-TAPE LCTT DRIVER_^1*_5************************_^1*_]_^1*_*PROGRAM BASE -_^1*_]_^1*_*LCTT KERNAL DRIVER ODS LEVE€€L II - LCTT 07/01/75_$REV 05_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_]_^1*_$THE DISK-TO-TAPE (DTLP) LCTT DRIVER PROCESSES ALL READ,_^1*_$WRITE AND MOTION REQUESTS ISSUED BY THE DISK-TO TAPE_^1*_$LOAD/DUMP PROGRAM OF MSOS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE PURPOSE OF THIS SUBROUTINE IS TO PROCESS ALL REQUESTS_^1*_$ISSUED BY THE DISK-TO€€-TAPE LOAD/DUMP PROGRAM . THE_^1*_$MAXIMUM RECORD SIZE IS 3072 WORDS AND THE BUFFER IS_^1*_$SPECIFIED BY THE USER. THE 7-TRACK VERSION OF THIS_^1*_$DRIVER HAS AN INTERMEDIATE BUFFER WHICH IS USED TO_^1*_$PACK OR UNPACK THE DATA WHICH IS TO BE WRITTEN OR HAS_^1*_$BEEN READ. ALL DIAGNOSED ERRORS ARE RETURNED TO THE_^1*_$CALLING PROGRAM WHICH WILL REPORT THEM TO THE OPERATOR._^1*_]€€_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(A) REGISTER = STARTING BUFFER ADDRESS MEANS TO INITIATE_^1*_4APPROPRIATE READ OR WRITE._^1*_$(A) REGISTER = $0000 MEANS TO INITIATE THE APPROPRIATE_^1*_4ENDING SEQUENCE FOR READ OR WRITE._^1*_]_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF NO ERRORS HAVE OCCURRED -_^1*_*(A) REGISTER = $FFFF_^1*_*(Q) REGISTER = $FFFF_^€€1*_$IF ERRORS HAVE OCCURRED -_^1*_*(A) REGISTER = $0000_^1*_*(Q) REGISTER = LAST HARDWARE STATUS (ESTAT2)_^1*_$IF AN END-OF-FILE IS READ -_^1*_*(A) REGISTER = $0000_^1*_*(Q) REGISTER = $0000_^1*_]_^1*E_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1._!ENTRY "MGREAD" IS THE READ AND READ COMPLETION ENTRY_^1*_*TO THE DRIVER WHICH WILL INITIATE INPUT OR ON COMPLE-_^1*_*TION OF ALL INPU€€T, REWIND THE UNIT. THE A-REGISTER_^1*_*WILL CONTAIN THE STARTING ADDRESS INTO WHICH DATA IS_^1*_*TO BE READ OR A ZERO TO INITIATE THE READ COMPLETION_^1*_*SEQUENCE._^1*_*ENTRY "MGDRIV" IS THE WRITE AND WRITE COMPLETION_^1*_*ENTRY TO THE DRIVER WHICH WILL INITIATE OUTPUT OR ON_^1*_*COMPLETION OF ALL OUTPUT, WRITE AN END OF FILE AND_^1*_*REWIND THE UNIT. THE A-REGISTER WILL CONTAI€€N THE_^1*_*STARTING ADDRESS FROM WHICH THE DATA IS TO BE WRITTEN OR_^1*_*A ZERO TO INITIATE THE WRITE COMPLETION SEQUENCE._^1*_]_^1*_*IN ORDER TO FACILITATE THE USE OF THE MSOS LCTT_^1*_*KERNAL AS THE BASE OF THIS DRIVER, PSEUDO REQUESTS_^1*_*FOR READ, WRITE AND MOTION ARE BUILT BY THIS_^1*_*PROGRAM. A PRESET PHYSICAL DEVICE TABLE "PLCTU0"_^1*_*IS ALSO INCLUDED HERE._^1*_*THE I-RE€€GISTER CONTAINS THE DISK SECTOR NUMBER AND_^1*_*MUST BE PRESERVED UPON ENTRY TO THIS DRIVER_^1*_]_^1*_*EXIT - ALL REQUESTS EXIT FROM THIS DRIVER TO THE_^1*_*CALLING PROGRAM THROUGH THE COMMON ENTRY "IDRIVE"._^1*_*IF NO ERRORS HAVE OCCURRED, THE A AND Q REGISTERS_^1*_*ARE BOTH SET TO $FFFF_^1*_*IF ERRORS HAVE OCCURRED, THE A-REGISTER IS SET TO_^1*_*$0000 AND THE Q-REGISTER IS SET TO€€ THE LAST STATUS_^1*_*FROM THE LCTT TAPE DRIVE (ESTAT2)._^1*_*ERRORS ARE REPORTED BY THE CALLING PROGRAM TO THE_^1*_*OPERATOR._^1*_$IF AN END-OF-FILE HAS BEEN READ, THE A AND Q REGISTERS_^1*_$ARE BOTH SET TO $0000._^1*_*THE I-REGISTER IS RESTORED TO ITS ORIGINAL VALUE_^1*_*UPON EXIT FROM THIS DRIVER._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1._!READ REQUEST AND INPUT COMPLETION REQUEST€€._^1*_*A. SAVE THE STARTING BUFFER ADDRESS IN THE_^1*_.I/O REQUEST. SAVE THE CONTENTS OF THE I-REGISTER._^1*_*B. CALCULATE THE ADDRESS OF THE LCTT PHYSICAL_^1*_.DEVICE TABLE AND SAVE IN THE I-REGISTER._^1*_*C. CALCULATE THE ADDRESS OF THE READ REQUEST_^1*_.AND STORE IN WORD 6 OF THE PHYSICAL DEVICE_^1*_.TABLE._^1*_*D. CALCULATE THE ADDRESS OF THE PACK/UNPACK_^1*_.BUFFER AND ST€€ORE IN WORD 38 OF THE PHYSICAL_^1*_.DEVICE TABLE._^1*_*E. SET ESTAT1 TO A READ REQUEST AND SET THE READ_^1*_.REQUEST CODE INTO THE REQUEST._^1*_*F. IF THE STARTING BUFFER ADDRESS IS ZERO, THIS_^1*_.IS AN INPUT COMPLETION REQUEST, GO TO STEP H_^1*_.TO COMPLETE THE INPUT._^1*_*G. GO TO STEP F IN WRITE TO EXECUTE COMMON I/O._^1*_*H. BUILD A MOTION REQUEST TO REWIND THE TAPE DRIVE.€€_^1*_*I. CLEAR ECCOR AND ELSTWD IN THE PHYSTAB._^1*_*J. GO TO STEP J IN WRITE TO EXECUTE COMMON MOTION_^1*_.REQUESTS._^1*_$2._!WRITE REQUEST AND OUTPUT COMPLETION REQUEST._^1*_*A. SAVE THE STARTING BUFFER ADDRESS IN THE_^1*_.I/O REQUEST. SAVE THE CONTENTS OF THE I-REGISTER._^1*_.SET THE RETURN ADDRESS INTO THE COMMON EXIT._^1*_*B. CALCULATE THE ADDRESS OF THE LCTT PHYSICAL_^1*€€_.DEVICE TABLE AND SAVE IN THE I-REGISTER._^1*_*C. CALCULATE THE ADDRESS OF THE WRITE REQUEST AND_^1*_.STORE IN WORD 6 OF THE PHYSICAL DEVICE TABLE._^1*_*D. CALCULATE THE ADDRESS OF THE PACK/UNPACK_^1*_.BUFFER AND STORE IN WORD 38 OF THE PHYSICAL_^1*_.DEVICE TABLE._^1*_*E. SET ESTAT1 TO A WRITE REQUEST AND SET THE WRITE_^1*_.REQUEST CODE INTO THE REQUEST._^1*_*F. IF THE STARTIN€€G BUFFER ADDRESS IS ZERO, THIS_^1*_.IS AN OUTPUT COMPLETION REQUEST, GO TO STEP L_^1*_.TO COMPLETE THE OUTPUT._^1*_*G. SAVE THE STARTING BUFFER ADDRESS IN WORD 10_^1*_.OF THE PHYSICAL DEVICE TABLE._^1*_*H. CALCULATE THE ENDING BUFFER ADDRESS AND STORE_^1*_.IN WORD 11 OF THE PHYSICAL DEVICE TABLE._^1*_*I. SAVE THE MAXIMUM NUMBER OF WORDS TO READ OR_^1*_.WRITE IN THE READ AND WRIT€€E REQUESTS._^1*_.SET UP THE ADT CONTROL WORD IN WORD 27 OF THE PHYSTB._^1*_*J. CALL THE KERNAL SUBROUTINE._^1*_*K. UPON RETURN, DETERMINE IF ANY ERRORS OCCURRED._^1*_.(1) IF NO ERRORS OCCURRED, SET THE A AND Q_^1*_1REGISTERS TO $FFFF RESTORE THE I-REGISTER AND_^1*_1RETURN TO THE CALLER._^1*_.(2) IF ERRORS HAVE OCCURRED, SET THE Q-REGISTER_^1*_1TO THE LAST STATUS OBTAINED FROM T€€HE LCTT_^1*_1MAG TAPE DRIVE (ESTAT2), CLEAR THE A-REGISTER_^1*_1RESTORE THE I-REGISTER AND RETURN TO THE CALLER._^1*_.(3) IF NA END-OF-FILE HAS BEEN READ, SET THE_^1*_1A AND Q REGISTERS TO $0000, RESTORE THE I_^1*_1REGISTER AND RETURN TO THE CALLER._^1*_*L. BUILD A MOTION REQUEST TO WRITE AN END OF_^1*_.FILE ON THE LCTT MAG TAPE DRIVE._^1*_*M. CLEAR ECCOR AND ELSTWD IN THE PHYSI€€CAL DEVICE TABLE._^1*_*N. CALL THE KERNAL SUBROUTINE._^1*_*O. UPON RETURN, DETERMINE IF ANY ERRORS OCCURRED._^1*_.(1) IF NO ERRORS OCCURRED, CALCULATE THE ADDRESS_^1*_1OF THE READ REQUEST AND SAVE IN THE PHYSICAL_^1*_1DEVICE TABLE._^1*_1GO TO STEP H IN READ._^1*_.(2) IF ERRORS HAVE OCCURRED, GO TO STEP K(2) IN_^1*_1WRITE._^1*_]_^1*_]_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*€€_]_^1*_*KLCTT - LCTT KERNEL_^1*_]_^1*_]_^1*_8PARAMETERS_^1*_8----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT MGDRIV_'ENTRY TO WRITE PROCESSOR_^1_%ENT MGREAD_'ENTRY TO READ PROCESSOR_^1_%ENT IDRIVE_'COMMON EXIT ADDRESS (READ ENTRY)_^1_%ENT EWES_)EQUIPMENT CODE LOCATION_^1_%ENT EWES1_(DUMMY INTERFACE FOR DTLP_^1*_]_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------€€------_^1*_]_^1*_*MISCELLANEOUS EQUATES_^1*_]_^1_%EQU NOISLN(2)_#LENGTH OF NOISE RECORD_^1_%EQU LEWES($0480) EQUIPMENT CODE EQUATE_^1_%EQU MICRIN(9)_#MICRO INTERRUPT LINE EQUATE_^1_%EQU TLCT7(53*$10) TYPE CODE FOR 7 TRACK DRIVES_^1_%EQU TLCT9(54*$10) TYPE CODE FOR 9 TRACK DRIVES_^1IDRIVE EQU IDRIVE(*)_#COMMON EXIT ADDRESS (READ ENTRY)_^1*_]_^1*_*SELECT UNIT AND DENSITY EQUAT€€ES_^1_%EQU U0TK7($800)_!UNIT/TRACK SELECT - UNIT 0/7 TRACK_^1_%EQU U0TK9(0)_$UNIT/TRACK SELECT - UNIT 0/9 TRACK_^1_%EQU D800($100)_"DENSITY SELECT - 800 BPI_^1_%EQU D556($200)_"DENSITY SELECT - 556 BPI_^1_%EQU PHSREX(3072) MAXIMUM PHYSICAL RECORD SIZE - 7 TRACK_^1_%EQU LNLCTT(0)_^1_%EQU SLCTT($7FFF)_^1*_]_^1*_]_^1*_]_^1*E_]_^1*_*PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_€€%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWESX(7)_%7 EQUIPMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT€€1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU €€DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE S€€ELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG_^1_%EQU ADTCW(27)_#27 ADT TABLE CONTROL WORD_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG(ALSO ADT DUMMY)_^1_%EQU RRETAD(31)_"31 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(32)_"32 RECOVERY CHECKSUM_^1_%EQU RCNTFG(33)_"€€33 RECOVERY COUNT FLAG_^1_%EQU RFLAG(34)_#34 RECOVERY FLAG, BIT15=1=NO RECOVERY_^1_%EQU QSTCOD(35)_"35 REQUEST CODE_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU PHSREC(37)_"37 MAX PHYSICAL RECORD SIZE_^1_%EQU ABUFF(38)_#38 PACK/UNPACK BUFFER ADDRESS_^1_%EQU ELINK(39)_#39 PDT THREAD_^1*E_]_^1*_8MESSAGES_^1*_8--------_^1*_]_^1*_*THE INITIALIZER INPUT CONTROL SUBROUTI€€NE WILL PRINT_^1*_*FAULT CODES FOR ALL DRIVER DIAGNOSED ERRORS._^1*_]_^1*E_]_^1*_8MISCELLANEOUS_^1*_8-------------_^1*_]_^1*_]_^1*_$LCTT HARDWARE REGISTER DEFINITIONS_^1*_]_^1*_/***************************************_^1*_/* FUNCTION AND CONDITION BIT REGISTER *_^1*_/***************************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$FUNCTION_^1*_$1_$FUNCTION_^1*_$2_$F€€UNCTION_^1*_$3_$FUNCTION_^1*_]_^1*_$4_$SKIP FIRST BYTE_^1*_$5_$SKIP LAST BYTE_^1*_$6_$NOT USED_^1*_$7_$NOT USED_^1*_]_^1*_$8_$DENSITY - FORM = BIT8BIT9 = XXX BPI_^1*_$9_$DENSITY - 01 = 800, 10 = 556, 11 = 200 BPI_^1*_$10_#PARITY - 1 = EVEN, 0 = ODD_^1*_$11_#TRACK - 1 = 7 TRACK, 0 = 9 TRACK_^1*_]_^1*_$12_#UNIT NUMBER_^1*_$13_#UNIT NUMBER_^1*_$14_#NOT USED_^1*_$15_#NOT USED_^1*E_]_^1€€*_/***************************_^1*_/* HARDWARE FUNCTION CODES *_^1*_/***************************_^1*_$CODE_!FUNCTION_^1*_]_^1*_$0_$NOT USED, RESULTS IN PROGRAM ERROR_^1*_$1_$READ_^1*_$2_$WRITE_^1*_$3_$ERASE_^1*_$4_$BACKSPACE_^1*_$5_$REWIND_^1*_$6_$REWIND AND UNLOAD_^1*_$7_$WRITE TAPE MARK_^1*_$8_$SELECT_^1*_$9_$RECOVERY READ_^1*_$A_$CONTROLLED BACKSPACE_^1*_$B_$DIAGNOSTIC CODE_^1*_€€$C_$DIAGNOSTIC CODE_^1*_$D_$DIAGNOSTIC CODE_^1*_$E_$DIAGNOSTIC CODE_^1*_$F_$DIAGNOSTIC CODE_^1*E_]_^1*_/****************************_^1*_/* HARDWARE STATUS REGISTER *_^1*_/****************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$INOP - DURING SELECTION_^1*_$1_$BUSY_^1*_$2_$REWINDING_^1*_$3_$READ AFTER WRITE COMMAND_^1*_]_^1*_$4_$WRITE LOCKOUT_^1*_$5_$NOT USED_^1*_$6_$P€€ROGRAM ERROR_^1*_$7_$HALF WORD ON READ_^1*_]_^1*_$8_$SHORT BLOCK_^1*_$9_$TIME OUT_^1*_$10_#DROUPOUT/PICKUP_^1*_$11_#OVERLOAD_^1*_]_^1*_$12_#INOP - DURING EXECUTION_^1*_$13_#DATA ERROR_^1*_$14_#TAPE MARK_^1*_$15_#EOT_^1****_]_^1_%EJT_]_^1MGREAD NOP 0_,ENTRY TO READ SECTION_^1_%STA* STRADR_'SAVE STARTING BUFFER ADDRESS_^1_%LDQ- I_,SAVE THE CONTENTS OF THE I-REGISTER_^1_%STQ* ISAVE_(€€IN A TEMPORARY HOLD AREA_^1_%RTJ* HERER_^1HERER NOP 0_^1_%LDQ* HERER_(CALCULATE ADDRESS OF LCTT PHYSTB_^1_%ADQ =XPLCTU0-HERER_^1_%STQ- I_,AND SAVE IN I-REGISTER_^1_%LDQ* HERER_(CALCULATE ADDRESS OF READ REQUEST_^1_%ADQ =XRRQUST-HERER_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%LDQ* HERER_(CALCULATE ADDRESS OF PACK/UNPACK BUFFER_^1_%ADQ =XBFLCTT-HERER_^1_%STQ- ABUFF,I_%AND SAVE IN €€PHYSTB_^1_%ENQ $0002_^1_%STQ- ESTAT1,I_^1_%LDQ* RRQ_*SET UP REQUEST FOR READ REQUEST_^1_%STQ* RRQUST_^1_%SAN READX_(IF STARTING ADDRESS IS ZERO_^1_%JMP* RRAPUP_'THIS IS A TERMINATION REQUEST_^1READX JMP* WRITE_(GO TO COMMON READ/WRITE CODE_^1MGDRIV NOP 0_,ENTRY TO WRITE SECTION_^1_%STA* STRADW_'SAVE STARTING BUFFER ADDRESS_^1_%LDQ- I_,SAVE THE CONTENTS OF THE I-REGISTER_^1_%STQ€€* ISAVE_(IN A TEMPORARY HOLD AREA_^1_%LDQ* MGDRIV_'MOVE WRITE ENTRY ADDRESS_^1_%STQ* MGREAD_'TO READ ENTRY (COMMON EXIT)_^1_%RTJ* HEREW_^1HEREW NOP 0_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF LCTT PHYSTB_^1_%ADQ =XPLCTU0-HEREW_^1_%STQ- I_,AND SAVE IN I-REGISTER_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF WRITE REQUEST_^1_%ADQ =XWRQUST-HEREW_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%LDQ* HERE€€W_(CALCULATE ADDRESS OF PACK/UNPACK BUFFER_^1_%ADQ =XBFLCTT-HEREW_^1_%STQ- ABUFF,I_%AND SAVE IN PHYSTB_^1_%ENQ $0003_^1_%STQ- ESTAT1,I_^1_%LDQ* WRQ_*SET UP REQUEST FOR WRITE REQUEST_^1_%STQ* WRQUST_^1_%SAN WRITE_(IF THE STARTING ADDRESS IS ZERO_^1_%JMP* WRAPUP_'THIS IS A TERMINATION REQUEST_^1WRITE STA- ECCOR,I_%SAVE STARTING BUFFER ADDRESS IN PHYSTB_^1_%ADD* NWORDS_'CALCULATE €€ENDING BUFFER ADDRESS_^1_%STA- ELSTWD,I_$AND SAVE IN PHYSTB_^1_%LDA* NWORDS_'SAVE NUMBER OF WORDS IN_^1_%STA* NWORDR_'READ AND_^1_%STA* NWORDW_'WRITE REQUESTS_^1_%LDA- EWESX,I_%SET UP ADT CONTROL WORD_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1CALDVR RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODES_^1_%SAN ERRCOD_'YES_^1_%LDA* ISAVE_(RESTORE THE ORIGINAL VALUE_^1_%STA- I_,TO T€€HE I-REGISTER_^1_%SET A_,NO, SET NORMAL RETURN FLAG_^1_%SQM EXITX_(IS THIS EXIT BECAUSE OF END OF FILE_^1_%CLR A_,CLEAR A-REGISTER IF THIS IS AN EOF_^1EXITX JMP* (IDRIVE)_$RETURN_^1ERRCOD LDQ- ESTAT2,I_$RETURN STATUS ON ERROR_^1_%LDA* ISAVE_(RESTORE THE ORIGINAL VALUE_^1_%STA- I_,TO THE I-REGISTER_^1_%CLR A_,SET ERROR RETURN FLAG_^1_%JMP* (IDRIVE)_$RETURN_^1RRAPUP LDA* MOT_*PU€€T MOTION REQUEST CODE_^1_%STA* RRQUST_'INTO REQUEST_^1_%LDA* REWC_)PUT REWIND CODE_^1_%STA* NWORDR_'INTO REQUEST_^1_%CLR A_,CLEAR START AND END BUFFER ADDRESSES_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^1_%JMP* CALDVR_'CALL KERNAL_^1WRAPUP LDA* MOT_*PUT MOTION REQUEST CODE_^1_%STA* WRQUST_'INTO REQUEST_^1_%LDA* EOFC_)PUT WRITE EOF CODE_^1_%STA* NWORDW_'INTO REQUEST_^1_%CLR A_,CLEAR STA€€RT AND END BUFFER ADDRESSES_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^1_%RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODES_^1_%SAZ NOER_)NO_^1_%JMP* ERRCOD_'YES_^1NOER_!LDQ* HEREW_(CALCULATE THE ADDRESS OF THE READ REQUEST_^1_%ADQ =XRRQUST-HEREW_^1_%STQ- EPTR,I_'AND SAVE IN WORD 6 OF THE PHYSTB_^1_%JMP* RRAPUP_'REWIND TAPE UNIT_^1_%EJT_]_^1RRQUST NUM $0800_(FORMAT READ REQUE€€ST_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDR NUM $0000_(NUMBER OF WORDS_^1STRADR NUM $0000_(STARTING ADDRESS_^1*_]_^1WRQUST NUM $0C00_(FORMAT WRITE REQUEST_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDW NUM $0000_(NUMBER OF WORDS_^1STRADW NUM $0000_(STARTING ADDRESS_^1*_]_^€€1NWORDS NUM $0C00_(NUMBER OF WORDS TO READ OR WRITE_^1ISAVE NUM 0_,TEMPORARY HOLD FOR I-REGISTER_^1IERR_!NUM $0000_(TEMPORARY HOLD FOR ERROR FLAG_^1MOT_"NUM $1C00_(MOTION REQUEST CODE_^1REWC_!NUM $3000_(REWIND MOTION CODE_^1EOFC_!NUM $2000_(WRITE EOF MOTION CODE_^1EWES1 NUM $0000_(DUMMY INTERFACE FOR DTLP_^1RRQ_"NUM $0800_(FREAD REQUEST_^1WRQ_"NUM $0C00_(FWRITE REQUEST_^€€1_%EJT_]_^1*_*L C T T M A G T A P E_^1*_]_^1*_]_^1*_]_^1BFLCTT BZS BFLCTT(PHSREX*4/3+2) PACK/UNPACK BUFFER FOR 7 TK_^1*_]_^1*_]_^1*_*L C T T M A G T A P E , U N I T 0_^1*_]_^1* UNIT 0 - 7 TRACK, 556 BPI_^1*_]_^1PLCTU0 ADC $0000_)0 ELVL - SCHEDULER CALL_(NOT USED_^1_%ADC 0_-1 EDIN - INITIATOR ADDRESS_$NOT USED_^1_%ADC 0_-2 EDCN - CONTINUATOR ADDRESS_"NOT USED_^1_%ADC 0_-€€3 EDPGM - ERROR ADDRESS_(NOT USED_^1_%NUM -1_,4 EDCLK - DIAGNOSTIC CLOCK_^1_%NUM $0003_)5 ELU - LOGICAL UNIT_^1_%NUM 0_-6 EPTR - PARAMETER ADDRESS_^1EWES_!ADC LEWES_)7 EWES - EQUIPMENT CODE FOR SAMPLE_^1_%ADC $806+TLCT7_#8 EREQST - REQUEST STATUS_^1_%NUM $0002_)9 ESTAT1 - DRIVER STATUS_^1_%NUM 0_,10 ECCOR - NEXT LOCATION OF DATA_^1_%NUM 0_,11 ELSTWD - LAST LOCATION + 1_^1_%€€NUM 0_,12 ESTAT2 - LAST EQUIPTMENT STATUS_^1_%ADC LNLCTT_'13 MASLGN - DRIVER LENGTH_^1_%ADC SLCTT_(14 MASSEC - MASS MEMORY ADDRESS OF DRIVER_^1_%NUM 0_,15 RETURN - FNR RETURN ADDRESS_^1_%NUM 0_,16 FLTCOD - FAULT CODE IF REQUEST ERROR_^1_%ADC 0_,17 DIAGLU - DIAGNOSTIC LOGICAL UNIT (NOT USED)_^1_%NUM 0_,18 GHOSTI - COUNT OF GHOST INTERRUPTS_^1_%ADC MICRIN_'19 MICROI - MICRO I€€NTERRUPT LINE_^1_%NUM 0_,20 TIMOUT - INTERRUPT TIMEOUT VALUE_^1_%NUM 0_,21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_%NUM 0_,22 SINTER - STATUS AFTER INTERRUPT_^1_%NUM 0_,23 STIMEO - STATUS AFTER INTERRUPT TIMEOUT_^1_%ADC U0TK7+D556_"24 UNTMOD - UNIT AND MODE SELECT_^1_%NUM 0_,25 ETEMP1 - TEMPORARY STORAGE_^1_%NUM 0_,26 HAFWRD - HALF WORD FLAG_^1_%NUM $8480_(27 ADTCW - ADT TAB€€LE CONTROL WORD_^1_%NUM 0_,28 ADTFW - ADT TABLE FWA-1_^1_%NUM 0_,29 ADTLW - ADT TABLE LWA_^1_%NUM 0_,30 MFLG - ADT TABLE DUMMY (ALSO REQUEST FLAG)_^1_%NUM 0_,31 RRETAD - RECOVERY RETURN ADDRESS_^1_%NUM 0_,32 RCKSUM - RECOVERY CHECKSUM_^1_%NUM 0_,33 RCNTFG - RECOVERY COUNT FLAG_^1_%NUM 0_,34 RFLAG - RECOVERY TEMP STORAGE_^1_%NUM 0_,35 QSTCOD - REQUEST CODE_^1_%NUM 0_,36 QS€€TWD4 - WORD 4 OF REQUEST_^1_%ADC PHSREX_'37 PHSREC - MAX PHYSICAL RECORD SIZE_^1_%ADC BFLCTT_'38 ABUFF - PACK/UNPACK BUFFER ADDRESS_^1_%ADC PLCTU0_'39 ELINK - PDT THREAD_^1_%EJT_]_^1*_$NAM KLCTT_(ODS LEVEL II - LCTT_*07-01-75 REV 06_^1*_$LCTT KERNEL_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1975_^1****_]_^1*E_]_^1*_8LCTT KERNE€€L_^1*_8***********_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_$THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_$PERFORMS THE I/O BY CALLING ANCILLARY ROUTINES._^1*_$IT ALSO PROCESSES ERRORS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE KERNAL IS COMPOSED OF TWO BASIC PARTS._^1*_$ONE TO PROCESS INFORMATION NECESSARY TO EXECUTE THE I/O_^1*_$REQUEST AND ONE TO P€€ROCESS THE INFORMATION FOLLOWING THE I/O._^1*_]_^1*_$PRIOR TO I/O, THE STATUS TO DETERMINE IF THE DEVICE IS_^1*_$OPERATIVE IS TAKEN. THE REQUEST TYPE IS DETERMINED,_^1*_$THE INITIAL UNIT CONNECTION IS MADE, AND THE APPROPRIATE I/O_^1*_$SUBROUTINE IS CALLED._^1*_]_^1*_$AFTER COMPLETION OF THE I/O REQUEST, STATUS IS TAKEN TO_^1*_$DETERMINE IF ANY ERRORS HAVE OCCURRED AND IF RECOVERY€€_^1*_$ACTION IS POSSIBLE. IF THE TRANSFER IS CORRECT AND THE_^1*_$DEVICE IS A 7-TRACK UNIT, THE DATA IS UNPACKED FROM THE_^1*_$INTERNAL BUFFER INTO THE USER BUFFER. WHEN THE_^1*_$REQUEST IS SATISFIED CONTROL WILL BE RETURNED TO_^1*_$THE DRIVER._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$INITIATOR (KLCTT)_^1*_)(I) REGISTER = ADDRESS OF PHYSICAL DEVICE T€€ABLE._^1*E_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$THE OUTPUTS OF THE KERNEL ARE -_^1*_]_^1*_$1. STATUS_^1*_(PRE-I/O TRANSFER STATUS TO PDT_^1*_(POST-I/O TRANSFER STATUS TO PDT_^1*_]_^1*_$2. FAULT CODE IS SET IF ERROR AS FOLLOWS -_^1*_)1 LOST DATA_^1*_)2 ALARM_^1*_)3 PARITY_^1*_(13 NO WRITE RING_^1*_(14 NOT READY_^1*_(15 NOISE RECORD DETECTED AND IGNORED_^1*_(31 WRITE OF SHORT RECORD €€REQUESTED_^1*_(41 IRRECOVERABLE ERROR_^1*_]_^1*_]_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1. EXITS TO DRIVER (CALLING ROUTINE) ON FAULT_^1*_.DETECTION, COMPLETION OF REQUEST._^1*_]_^1*E_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$PRE-I/O TRANSFER -_^1*_*1. SELECT AND STATUS TRANSPORT; SAVE STATUS._^1*_*2. IF BUSY OR INOPERATIVE CALL FAULT ROUTINE._^1*_*3. DETERMINE TYPE OF REQUEST AN€€D CALL MOTION_^1*_-OR READ/WRITE ANCILLARY ROUTINE._^1*_*4. CALL WAIT SUBROUTINE TO WAIT FOR NOT BUSY_^1*_]_^1*_$POST-I/O TRANSFER -_^1*_*1. SAVES AND CHECKS THE DEVICE STATUS. IF A_^1*_-7-TRACK FILE MARK IS SENSED, THE STATUS WORDS_^1*_-ARE MODIFIED TO REMOVE THE POSSIBLE PARITY ERROR_^1*_-CAUSED BY READING IN THE WRONG MODE._^1*_-IF IT IS 7-TRACK BUT NOT A FILE MARK, THE STATUS_€€^1*_-IS CORRECTED AND THE DATA TRANSFER CHECK CONTINUES._^1*_*2. IF IT IS A FILE MARK, THE FILE MARK STATUS FLAG IS_^1*_-SET AND A RETURN IS MADE TO THE CALLER._^1*_*3. IF A MOTION REQUEST, CHECK STATUS FOR INOP,_^1*_-READ AFTER WRITE, PROGRAM ERROR, OR TIMEOUT._^1*_-IF ANY OF THESE GO TO FAULT ROUTINE. IF NO_^1*_-ERROR, RETURN TO CALLER WITH NO ERROR_^1*_-INDICATOR (A-REGISTER = 0€€)._^1*_*4. IF READ/WRITE REQUEST CHECK STATUS FOR DATA_^1*_-ERROR, OVERLOAD, DROPOUT. IF ANY OF THESE GO_^1*_-TO RECOVERY ANCILLARY ROUTINE. IF NO ERROR_^1*_*5. IF 7-TRACK DRIVE, UNPACK DATA TO USER BUFFER._^1*_*6. RETURN TO CALLER._^1*_]_^1*_$FAULT ROUTINE -_^1*_*1. SAVE FAULT CODE IN PDT._^1*_*2. RETURN TO CALLER_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*XMOT - ISSUE I/€€O FOR MOTION REQUESTS_^1*_*XFER - ISSUE I/O FOR READ/WRITE REQUESTS_^1*_*WAIT - WAIT FOR NOT BUSY_^1*_*RECVRY - EXECUTE RECOVERY ERROR PROCEDURES_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_6*********_^1*_6* KLCTT *_^1*_6*********_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1KLCTT NUM 0_^1_%ENA 0_^1_%STA- MFLG,I_'CLEAR REQUEST TYPE FLAG_^1_%STA- SINTER,I_$CLEAR CONTINUATOR AND€€ TIMEOUT STATUS_^1_%STA- SENTRY,I_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%INQ 8_,ADD DIRECTION (OUT)_^1_%LDA- UNTMOD,I_$UNIT SELECT INFO_^1_%INA 8_,SELECT FUNCTION_^1_%NUM $0B04_(SET I/O SELECT (SIO)_^1_%NOP 0_,DELAY 2 CYCLES_^1_%NOP 0_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%RTJ WAIT_)WAIT FOR NOT BUSY_^1_%STA- SENTRY,I_$SAVE ENTRY STATUS€€_^1_%ENA $41_^1_%AND- SENTRY,I_$CHECK IF INOP OR PROG ERROR_^1_%SAZ KL10_)NO, CONTINUE_^1_%ENA 14_+YES, REPORT ERROR_^1_%JMP FLCTT_^1*_]_^1KL10_!LDQ- EPTR,I_'CHECK IF MOTION REQUEST_^1_%LDA- 4,Q_^1_%STA- QSTWD4,I_$SAVE WD 4 OF REQUEST IN PDT_^1_%LDA 0,Q_*GET REQUEST CODE_^1_%ARS 9_^1_%AND =N$001F_%MASK OFF REQUEST BITS_^1_%INA -14_^1_%STA- MFLG,I_'SAVE REQUEST FLAG_^1KL15_!€€LDA- MFLG,I_'NEXT I/O FUNCTION_^1_%SAN KL20_)SKIP IF NOT MOTION REQUEST_^1_%RTJ XMOT_)EXECUTE MOTION COMMAND_^1_%JMP* KL30_^1KL20_!RTJ XFER_)EXECUTE READ/WRITE_^1KL30_!RTJ* WAIT_)WAIT FOR NOT BUSY_^1_%EJT_]_^1* KERNEL CONTINUATOR_^1*_]_^1CLCTT STA- ESTAT2,I_$SAVE DEVICE STATUS_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$4000_%IS THERE A TAPE MARK STATUS SET_^1_%SAN€€ CKMOT_(YES, CHECK IF EXECUTING MOTION REQUEST_^1_%JMP* CL03_)NO, CHECK FOR RECOVERY IN PROGRESS_^1CKMOT LDA- UNTMOD,I_$IS THIS A 7-TRACK UNIT_^1_%AND =N$0800_^1_%SAN EOF7TK_'YES, CHECK FOR 7-TRACK EOF DATA_^1_%JMP* CL03_)NO, CONTINUE ON_^1EOF7TK LDA- MFLG,I_'IS THIS A MOTION REQUEST_^1_%SAN 1_,SKIP IF NON MOTION_^1_%JMP* CL02_^1_%LDQ- ABUFF,I_%GET FIRST DATA WORD_^1_%LDA 0,Q€€_*IS IT A FILE MARK DATA WORD_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAN CL01_)SKIP IF NOT A FILE MARK_^1_%LDA =N$DFFF_%REMOVE POSSIBLE DATA ERROR_^1_%AND- ESTAT2,I_$STATUS BIT FROM ESTAT2 AND_^1_%STA- ESTAT2,I_$SINTER_^1_%LDA =N$DFFF_^1_%AND- SINTER,I_^1_%STA- SINTER,I_^1_%JMP* CL03_)FILE MARK CONTINUE_^1CL01_!LDA- ESTAT2,I_$ADJUST STATUS FOR NO FILE MARK_^1_%AND =N$BFFF_^1_%STA- EST€€AT2,I_^1_%LDA- SINTER,I_^1_%AND =N$BFFF_^1_%STA- SINTER,I_^1_%JMP* CL03_^1*_]_^1CL02_!LDA MOTCOD_'MOTION CODE_^1_%INA -5_+SEARCH FILE MARK_^1_%SAZ 3_,YES, CHECK DATA_^1_%INA -2_+ADVANCE RECORD_^1_%SAN CL03_)NO, CONTINUE_^1_%LDA ADVRB_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAZ 1_,FILE MARK DATA_^1_%JMP* CL01_)NO, ADJUST STATUS_^1CL03_!LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND €€ =N$0100_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* CL07_)YES, GO TO RECOVERY PROCEDURE_^1_%LDA- MFLG,I_^1_%SAN 1_,SKIP IF NON-MOTION REQUEST_^1_%JMP* CL10_)MOTION REQUEST_^1_%LDA- SINTER,I_$READ/WRITE STATUS CHECK_^1_%AND =N$124D_%INOP, REWIND, R/W, TIMEOUT_^1_%SAZ CL04_^1_%ENA 2_^1_%JMP* FLCTT_^1CL04_!ENA $0010_^1_%AND- SINTER,I_^1_%SAZ CL05_)NO, CONTINUE_^1_%ENA 13_+YES, ERROR_^1_€€%JMP* FLCTT_^1CL05_!LDA- SINTER,I_$ANY OTHERS CHECK RECOVERY_^1_%AND =N$2C00_%DATA ERROR, OVERLOAD, DROPOUT_^1_%SAN CL07_^1_%LDA- SINTER,I_^1_%AND =N$C000_%EOT OR TM SET_^1_%SAZ NOTM_)NO FILE MARK STATUS_^1_%CLR Q_,SET FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_(YES, NO RECOVERY_^1NOTM_!LDA- ADTFW,I_%(FWA-1) NOISE RECORD CHECK_^1_%SUB* FWA_*- STARTING ADDRESS_^1_%INA -NOISLN_€€^1_%SAP CL08_)RECORD .GT. NOISE RECORD_^1CL07_!RTJ RECVRY_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KL15_)EXECUTE RECOVERY FUNCTION_^1CL08_!JMP* CL20_)NO RECOVERY OR RECOVERY COMPLETE_^1*_]_^1CL10_!LDA- SINTER,I_$IF INOP, READ AFTER WRITE,_^1_%AND =N$1249_%PROG ERR, TIMEOUT = FATAL_^1_%SAZ CL20X_(IF NO ERROR CHECK FOR ADVANCE FILE REQUEST_^1_%ENA 2_^1_%JMP* FLCTT_^1CL20€€X LDA MOTCOD_'IS THIS AN ADVANCE FILE REQUEST_^1_%INA -5_+MOTCOD = 5_^1_%SAN CL40_)NO, CONTINUE ON AS IS_^1_%LDA- SINTER,I_$YES, IS THERE A FILE MARK STATUS SET_^1_%AND =N$4000_^1_%SAN CL25_)YES, SET FILE MARK STATUS FLAG IN Q_^1_%JMP* KL15_)NO, CONTINUE LOOKING FOR FILE MARK_^1CL20_!LDA- SINTER,I_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$C000_%IS TAPE MARK OR €€EOT SET_^1_%SAZ CL40_^1CL25_!CLR Q_,SET FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_^1CL40_!ENA $0010_(IS A 7-TRACK READ IN PROGRESS_^1_%AND- ESTAT1,I_^1_%SAZ RQ9TK_(NO, DO NOT PACK DATA_^1_%STQ* QSAVX_(SAVE Q-REGISTER FOR RETURN_^1_%RTJ TK7DAT_'YES, PACK 7 TRACK DATA INTO USER BUFFER_^1_%LDQ* QSAVX_(RESTORE Q_^1RQ9TK ENA 0_,CLEAR ERROR FLAG_^1_%JMP (KLCTT)_^1WAIT_!NOP 0_^1€€WAIT0X ENA 3_,SET UP FOR DELAY LOOP_^1WAIT00 STA* BZYCTR_^1_%LDA =N$0FFF_%DELAY APPROX. 10 MS_^1WAIT01 INA -1_^1_%SAZ WAIT02_^1_%JMP* WAIT01_^1WAIT02 LDQ- EWESX,I_%EQUIPMENT CODE_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%AND =N$0002_%IS IT BUSY_^1_%SAZ WAIT03_'NO_^1_%JMP* WAIT0X_'YES, DELAY AND START AGAIN_^1WAIT03 LDA* BZYCTR_'DONE WITH DELAY YET_^1_%SAZ WAIT04_'YES GO ON_^1_€€%INA -1_+NO RESTART LOOP_^1_%JMP* WAIT00_^1WAIT04 NUM $0B05_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%STA- SINTER,I_^1_%JMP* (WAIT)_'RETURN_^1*_]_^1* FAILED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1FLCTT STA- FLTCOD,I_$SAVE FAULT CODE_^1_%JMP (KLCTT)_%RETURN VIA KERNEL_^1QSAVX NUM 0_,TEMPORARY HOLDER FOR Q-REGISTER_^1BZYCTR NUM $0000_(DELAY LOOP COUNTER_^1_%EJ€€T_]_^1*_$NAM XFER_)ODS LEVEL II_106-03-75 REV 01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT READ/WRITE ROUTINES_^1*_8************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE READ/WRITE I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THESE ROUTINES CHECK€€ IF LEGAL RECORD SIZE AND CALLS_^1*_$FAULT ROUTINE IF NOT. THE CORRECT PARITY IS GENERATED_^1*_$AND THE ADT TABLE IS SET UP. THE TYPE OF TRANSFER IS_^1*_$DETERMINED AND THE CORRECT ROUTINE (READ OR WRITE) IS_^1*_$CALLED. THE READ ROUTINE WILL EITHER EXECUTE A NORMAL_^1*_$READ OR A RECOVERY READ DEPENDING ON BIT 4 IN RFLAG IN_^1*_$THE PDT. THE WRITE ROUTINE WILL EITHER DO A WRITE OR€€_^1*_$A CONTROLLED BACKSPACE DEPENDING ON BIT 3 IN RFLAG._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NORMAL PARAMETERS IN PDT. SPECIAL FLAGS ARE USED IN_^1*_$RFLAG IN THE PDT. THESE FLAG ARE:_^1*_]_^1*_)BIT 2 = 1 = READ IN OPPOSITE PARITY_^1*_)BIT 3 = 1 = EXECUTE CONTROLLED BACKSPACE_^1*_)BIT 4 = 1 = EXECUTE READ RECOVERY_^1*_]_^1*_$THEY ARE USED BY THE RECOVE€€RY ROUTINES AND ARE_^1*_$CLEARED AFTER FUNCTION EXECUTED._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$CLEARS CONTROL FLAGS IN RFLAG AFTER FUNCTION EXECUTED._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP, PARAMETERS NEEDED ARE_^1*_*ALREADY IN THE PDT._^1*_$EXIT IS A NORMAL RETURN TO CALLER._^1*E_]_^1*_8FLOW_^1*_8----_^1*_$1. CHECK IF REQUEST SHORT RECORD TYPE€€, IF SO CALL_^1*_(FAULT ROUTINE._^1*_$2. DETERMINE CORRECT PARITY FOR 7 TRACK._^1*_$3. SETUP ADT TABLE AND CALL READ OR WRITE ROUTINE._^1*_$4. IF READ DETERMINE IF EITHER OPPOSITE PARITY_^1*_(OR RECOVERY READ FLAG SET. ENABLE MICRO INTERRUPT_^1*_(AND EXECUTE FUNCTION._^1*_$5. IF WRITE DETERMINE IF CONTROLLED BACKSPACE FLAG_^1*_(SET. ENABLE MICRO INTERRUPT AND EXECUTE FUNCTION_^1*_]€€_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XFER *_^1*_6********_^1*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1XFER_!NUM 0_^1_%LDA- QSTWD4,I_$GET REQUEST PARAMETER_^1_%INA -NOISLN_%CHECK IF LENGTH.GE.NOISE LENGTH_^1_%SAP 1_^1_%JMP* NOISRX_'SHPRT RECORD ERROR_^1_%LDA- ECCOR,I_%INIT CURRENT WORD POINTERS_^1_%STA* FWA_^1_%LDA- ELSTWD,I_^1_%STA* €€LWA_^1_%ENA $0001_^1_%AND- ESTAT1,I_^1_%STA* MOTIDX_'SET R/W FLAG_^1_%LDA- UNTMOD,I_$THIS A 7TK UNIT_^1_%AND =N$0800_^1_%SAZ TK9RW_^1_%RTJ TK7DAT_'FORMAT 7 TRACK DATA_^1_%RTJ TK7RW_(DETERMINE TYPE OF 7TK PARITY_^1TK9RW STA* PRITYC_'STORE PARITY_^1_%LDA* FWA_*SETUP ADT TABLE BUFFER POINTERS_^1_%INA -1_^1_%STA- ADTFW,I_%FWA-1_^1_%LDA* LWA_^1_%INA -1_^1_%STA- ADTLW,I_%LAST WOR€€D ADDRESS_^1_%LDA* MOTIDX_'R/W FLAG_^1_%SAZ READ_^1_%RTJ* WRADT_(DO THE WRITE_^1_%JMP* (XFER)_^1READ_!RTJ* RDADT_(DO THE READ_^1_%JMP* (XFER)_^1*_]_^1NOISRX ENA 31_+NOISE RECORD ERROR_^1_%JMP* FLCTT_^1*_]_^1*_]_^1FWA_"NUM 0_,CURRENT FIRST WORD ADDRESS_^1LWA_"NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT_]_^1* READ DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1RDAD€€T NUM 0_^1_%LDA- ADTCW,I_%GET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%MASK OUT WRITE BIT_^1_%STA- ADTCW,I_^1_%LDA* PRITYC_^1_%STA* TPAR_)SAVE PARITY BIT_^1_%ENA $0004_^1_%AND- RFLAG,I_^1_%SAZ RD10A_(OPPOSITE PARITY NOT SET_^1_%TCA A_^1_%AND =N$0400_%COMPLIMENT PARITY BIT_^1_%STA* PRITYC_^1RD10A RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0010_(RECOVERY READ IN PROGRESS_€€^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, SELECT FUNCTION_^1_%INA 1_,OUTPUT READ FUNCTION_^1_%RTJ* SFUNC_(CLEAR OPPOSITE PARITY FLAG_^1_%ENA -$0014_'AND RECOVERY READ SWITCH_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA* TPAR_^1_%STA* PRITYC_'RESTORE PARITY_^1_%JMP* (RDADT)_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1WRADT NUM 0_^1_%LDA- ADTC€€W,I_%SET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%ADD WRITE_^1_%ADD =N$0800_^1_%STA- ADTCW,I_^1_%RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0008_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, EXECUTE ONE_^1_%INA 2_^1_%ADD- HAFWRD,I_$ADD HALF WORD BIT IF SET_^1_%RTJ* SFUNC_^1_%ENA -$0008_'CLEAR CB FLAG_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%JMP* (WRADT)_^1*_]_^1* ENABLE MICRO I€€NTERRUPT_^1*_]_^1ENBMIC NUM 0_^1_%LDA- I_,SET UP POINTER TO ADT TABLE_^1_%INA ADTCW_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ =N$8000_%ENABLE BIT_^1_%NUM $0B06_(DEFINE MICRO INTERRUPT (DMI)_^1_%JMP* (ENBMIC)_^1*_]_^1MOTIDX NUM 0_,READ/WRITE FLAG, 1=WRITE_^1PRITYC NUM 0_,PARITY BIT (POSITIONED)_^1TPAR_!NUM 0_,TEMP PARITY STORAGE_^1_%EJT_]_^1*_$NAM XMOT_)ODS LEVEL II - LCTT_*07€€-01-75 REV-04_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT MOTION ROUTINES_^1*_8********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE MOTION I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS MODULE WILL DECODE THE MOTION COMMAND AND EXECUTE_^1*_$THE NEXT€€ MOTION COMMAND. THESE COMMANDS ARE ISSUED BY A_^1*_$SERIES OF SMALL SUBROUTINES. BEFORE THE COMMAND IS ISSUED_^1*_$THE CORRECT PARITY WILL FIRST BE DETERMINED. AFTER THE_^1*_$MOTION COMMAND IS ISSUED CONTROL WILL BE PASSED BACK TO_^1*_$THE CALLER. AN UNUED FUNCTION WILL BE TREATED AS A NOP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$SEVERAL FLAG BITS IN THE €€PDT ARE USED BY THIS ROUTINE._^1*_*UNTMOD - BIT 11 - TYPE OF DRIVE (7 OR 9 TRACK)_^1*_*ESTAT1 - BIT 5 - MOTION REQUEST BIT (SET TO 1)_^1*_1- BIT 6 - REWIND FLAG (SET TO 1 IF REWIND)_^1*_1- BIT 8 - RECOVERY IN PROGRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF A REWIND COMMAND IS EXECUTED BIT 6 OF ESTAT1 WILL_^1*_$BE SET TO INDICATE A REWINDIN PROGRESS. BIT 5 OF ESTAT1_^1*_$WIL€€L BE SET TO INDICATE A MOTION REQUEST IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IF A SEVEN TRACK UNIT IS PRESENT THE ROUTINE TK7RW_^1*_$WILL BE CALLED TO DETERMINE THE PARITY TO BE USED._^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XMOT *_^1*_6********_^1*_]_^1* MOTION EXECUTION ANCILLARY ROUTINE€€_^1* ENTER WITH MOTION REQUEST, I = PDT POINTER_^1*_]_^1XMOT_!NUM 0_^1_%LDA- UNTMOD,I_$IS THIS A 7 TRACK UNIT_^1_%AND =N$0800_^1_%SAZ XMOT10_'NO, SKIP_^1_%RTJ* TK7RW_^1XMOT10 STA* PRITYC_^1_%ENA -$0020_^1_%AND- ESTAT1,I_^1_%ADD =N$0020_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$GET NUMBER OF WORDS_^1_%ARS 12_+SHIFT AND MASK_^1_%AND =N$0007_^1_%STA* MOTCOD_^1_%TRA Q_^1_%INA -8_^1€€_%SAP SUBMOT_'NOOP, ILLEGAL OPERATION_^1_%JMP* SUBMOT,Q_$EXECUTE FUNCTION_^1*_]_^1SUBMOT JMP* NOOP_)NO OPERATION (USED FOR STATUS)_^1_%JMP* BKSP_)BACKSPACE RECORD_^1_%JMP* WRFM_)WRITE FILE MARK_^1_%JMP* REW_*REWIND_^1_%JMP* REWUN_(REWIND UNLOAD_^1_%JMP* ADVAN_(SEARCH FILE MARK FORWARD_^1_%JMP* ERASE_(ERASE (DLU OR RECOVERY ONLY)_^1_%JMP* ADVAN_(ADVANCE 1 RECORD_^1_%EJT_]_^1* REWIN€€D_]_^1*_]_^1REW_"ENA -$0040_^1_%AND- ESTAT1,I_^1_%ADD =N$0040_^1_%STA- ESTAT1,I_^1_%ENA 5_,EXECUTE REWIND FUNCTION_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1REWUN ENA 6_,EXECUTE REWIND UNLOAD_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1BKSP_!ENA 4_,EXECUTE BACKSPACE_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* ERASE_]_^1*_]_^1ERASE LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1€€_%AND =N$0100_^1_%SAN 1_,YES, EXECUTE ERASE_^1_%JMP* NOOP_^1ERSX_!ENA 3_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* WRITE FILE MARK_^1*_]_^1WRFM_!LDA- UNTMOD,I_$GET 7TK BIT_^1_%AND =N$0800_^1_%SAZ WRFM9_^1_%RTJ* TK7WEF_'WRITE 7 TRACK TAPE MARK_^1_%JMP* (XMOT)_^1WRFM9 ENA 7_,EXECUTE 9TK FILEMARK_^1DOMOT RTJ* SFUNC_^1_%JMP* (XMOT)_^1*_]_^1*_]_^1* ADVANCE ONE RECORD OR FILE_^1*_]_^1ADVAN €€RTJ* BLOC+1_'CALCULATE ADDRESS OF BUFFER_^1BLOC_!ADC* ADVRB_^1_%NUM 0_^1_%LDA* BLOC+1_'GET PRESENT CORE ADDRESS_^1_%ADD* BLOC_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_^1_%INA 9_,ALLOW 9 WORDS_^1_%STA- ADTLW,I_%LWA OF BUFFER_^1_%RTJ RDADT_(EXECUTE A READ_^1_%JMP* (XMOT)_^1*_]_^1ADVRB BZS ADVRB(9)_$BUFFER FOR ADVANCE RECORD_^1*_]_^1*_]_^1* FUNCTION OUTPUT_^1* ENTER WIT€€H FUNCTION CODE IN A AND PARITY IN PRITYC_^1*_]_^1SFUNC NUM 0_^1_%ADD- UNTMOD,I_$ADD UNIT, DENSITY AND TRACK_^1_%ADD* PRITYC_'ADD PARITY_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%INQ 8_,SET I/O_^1_%NUM $0B04_(SIO_^1_%NOP 0_,DELAY_^1_%NOP 0_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%JMP* (SFUNC)_^1*_]_^1*_]_^1* NO OPERATION - NO FUNCTION OUTPUT€€_^1*_]_^1NOOP_!JMP CL40_)ENTER CONTINUATOR AFTER INT PROCESS_^1*_]_^1MOTCOD NUM 0_,MOTION CODE THIS MOTION_^1_%EJT_]_^1*_$NAM TK7_*ODS LEVEL II - LCTT_*06-06-75 REV-01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*_8LCTT 7 TRACK ROUTINES_^1*_8*********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$IMPLEMENT FUN€€CTIONS SPECIAL TO SEVEN TRACK DRIVES._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$IMPLEMENTS A SOFTWARE FILE MARK FUNCTION FOR 7 TRACK_^1*_$UNITS AND A SUBROUTINES TO DETERMINE 7 TRACK PARITY._^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$ONE WORD FROM THE PHYSTAB IS USED AS INPUT. IT IS_^1*_$ESTAT1 AND IS USED FOR PARITY TYPE TEST._^1*_]_^1*_8OU€€TPUT_^1*_8------_^1*_]_^1*_$SEVERAL WORDS FROM THE PHYSTAB ARE USED. THESE ARE_^1*_$ETEMP1, ADTFW, ADTLW, HAFWRD. ONE EXTERNAL LOCATION_^1*_$IS USED FOR STORAGE OF THE PARITY BIT._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$NORMAL SUBROUTINE ENTRY/EXIT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$CALL WRADT IN XFER TO WRITE THE FILE MARK._^1*_]€€_^1****_]_^1_%EJT_]_^1*_6*******_^1*_6* TK7 *_^1*_6*******_^1*_]_^1* SEVEN TRACK SPECIAL ROUTINES_^1*_]_^1* 7 TRACK READ/WRITE - DETERMINES PARITY_^1*_]_^1TK7RW NUM 0_^1_%ENA $0008_^1_%AND- ESTAT1,I_^1_%SAZ NOBCD_^1_%LDA =N$0400_%BCD USE EVEN PARITY_^1NOBCD JMP* (TK7RW)_^1*_]_^1* 7 TRACK WRITE OF END OF FILE ROUTINE_^1*_]_^1TK7WEF NUM 0_^1_%LDA- I_^1_%INA ETEMP1-1_$FORM FW€€A-1_^1_%STA- ADTFW,I_^1_%INA 1_,FORM LWA_^1_%STA- ADTLW,I_^1_%LDA =N$0F0F_%EOF CODE_^1_%STA- ETEMP1,I_^1_%LDA =N$0400_%EVEN PARITY_^1_%STA* PRITYC_^1_%ENA $20_*HALF WORD WRITE_^1_%STA- HAFWRD,I_^1_%RTJ WRADT_(WRITE SOFTWARE FILEMARK_^1_%ENA 0_^1_%STA- HAFWRD,I_^1_%JMP* (TK7WEF)_^1_%EJT_]_^1*_$NAM TK7DAT_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVIS€€ION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT 7 TRACK DATA FORMAT ROUTINES_^1*_8*********************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$CONVERT 7 TRACK DATA AND PACK AND UNPACK BUFFERS_^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS ROUTINE UNPACKS DATA FROM THE USERS BUFFER TO_^1*_$A LOCAL BUFFER €€FOR 7-TRACK WRITE OPERATIONS. FOR_^1*_$READ OPERATIONS, DATA IS PACKED INTO THE USERS BUFFER_^1*_$FROM THE LOCAL BUFFER._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$ALL INPUTS NECESSARY ARE SUPPLIED BY PARAMETER_^1*_$WORDS IN THE PHYSTAB AND EXTERNAL STORAGE FWA AND LWA._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$NONE_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_€€^1*_$ENTRY AND EXIT ARE NORMAL SUBROUTINES ENTRY AND_^1*_$EXIT._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* TK7DAT *_^1*_6**********_^1* LCTT DUMMY 7 TRACK DATA FORMAT ROUTINE_^1*_]_^1TK7DAT NUM 0_^1_%LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* TK7DEX_'YES, EXIT_^1_%ENA $0010_^1_%AND- ESTAT1,I_^1_%S€€AZ 1_,NO, CONTINUE_^1_%JMP* TK7CON_'YES, CONTINUATION IN PROGRESS_^1_%ENA $0001_(IS THIS A READ REQUEST_^1_%AND- ESTAT1,I_^1_%SAN TK7D05_'NO, DO NOT SET FLAG_^1_%ENA -$0010_'YES, SET 7-TRACK READ IN PROGRESS FLAG_^1_%AND- ESTAT1,I_^1_%ADD =N$0010_^1_%STA- ESTAT1,I_^1TK7D05 LDA- ABUFF,I_%INIT FWA FOR LOCAL BUFFER_^1_%STA FWA_^1_%LDA- QSTWD4,I_$INIT RECORD SIZE_^1_%STA* NUMBR_^€€1TK7D10 LDA* NUMBR_^1_%MUI =N$0004_%SIZE * 4_^1_%DVI =N$0003_%/ 3_^1_%SQZ 1_^1_%INA 1_^1_%STA* NUMBR_^1TK7D20 LDA FWA_^1_%ADD* NUMBR_^1_%STA LWA_*LWA = FWA + RECORD SIZE_^1_%ENA $0001_(CHECK IF READ OR WRITE_^1_%AND- ESTAT1,I_^1_%SAN TK7D30_'SKIP IF WRITE_^1_%JMP* TK7DEX_^1TK7D30 RTJ* UNPK2_(CONVERT TO ASSY/DASSY_^1_%JMP* TK7DEX_^1TK7DEX JMP* (TK7DAT)_^1*_]_^1*_]_^1*_]_^1TK€€7CON LDA- ADTFW,I_%UPDATE TO LAST WORD READ +1_^1_%INA 1_^1_%STA LWA_^1_%ENA -$0010_^1_%AND- ESTAT1,I_^1_%STA- ESTAT1,I_^1_%RTJ* PACK2_^1_%JMP* TK7DEX_^1*_]_^1*_]_^1BUFFER NUM 0_,ADDRESS OF BUFFER_^1SAVEI NUM 0_,TEMPORARY STORAGE OF I_^1TEMP_!NUM 0_,TEMPORARY STORAGE OF PARTIAL CONVERSION_^1NUMBR NUM 0_,NUMBER OF WORDS TO TRANSFER_^1_%EJT_]_^1_%EJT_]_^1* WRITE 7 TRACK DATA€€ - UNPACK INTO LOCAL BUFFER_^1*_]_^1UNPK2 NUM 0_,ENTRY FOR BINARY TO ASSEM/DISASSEM._^1_%RTJ* SETUP_^1_%CLR Q_,0 INTO Q_^1NXTCYC RTJ* GETFST_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'GO STORE Q WHICH IS UNPACKED FOR 1732_^1_%LLS 4_,4 BITS_^1_%RTJ* GETFST_'GET ANOTHER 16 BINARY BITS_^1_%LLS 2_,2 BITS MORE FOR 6_^1_%QLS 2_,2 BITS =0_^1_%LLS 6€€_,6 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 2_,2 BITS_^1_%RTJ* GETFST_'GET MORE DATA_^1_%LLS 4_,4 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%LLS 6_,6 BITS_^1_%QLS 2_,2 BITS =0_^1_%LLS 6_,6 BITS_^1_%RTJ* STRDAT_'STORE Q_^1_%JMP* NXTCYC_'GO THRU ANOTHER CYCLE_^1*_]_^1*_]_^1GETFST NUM 0_^1_%STQ* QSAV_)SAVE Q_^1_%LDA- ELSTWD,I_^1_%SUB- ECCOR,I_%CHECK€€ END OF BUFFER_^1_%SAN 2_^1_%ENA 0_^1_%JMP* (GETFST)_^1_%LDQ- ECCOR,I_%GET CURRENT LOCATION OF DATA_^1_%LDA 0,Q_*GET NEW DATA_^1_%LDQ- 0_^1QSAV_!NUM 0_^1_%RAO- ECCOR,I_%TALLY CURRENT ADDRESS_^1_%JMP* (GETFST)_^1*_]_^1CURR_!NUM 0_^1_%EJT_]_^1* READ 7 TRACK DATA - PACK INTO USERS BUFFER_^1*_]_^1PACK2 NUM 0_,ENTRY FOR ASSEM/DISSASSEM TO BINARY._^1_%RTJ* SETUP_^1NXTGET RTJ* GETF€€WA_'GO GET FROM FWA BUFFER_^1_%CLR Q_^1_%LLS 8_,6 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%RTJ* GETFWA_'GET 12 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 4_,4 BITS_^1_%RTJ* STRFST_'GO STORE IN REQUESTOR-S BUFFER_^1_%LLS 2_,2 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%RTJ* GETFWA_'GET 12 BITS_^1_%ALS 2_,PASS 2 0 BITS_^1_%LLS 6_,6 BITS_^1_%ALS 2_,PASS 2€€_^1_%LLS 2_,2 BITS_^1_%RTJ* STRFST_'GO STORE_^1_%LLS 4_,4 BITS_^1_%RTJ* GETFWA_'GET 12_^1_%ALS 2_,PASS 2_^1_%LLS 6_,6 BITS_^1_%ALS 2_,PASS 2_^1_%LLS 6_,6 BITS_^1_%RTJ* STRFST_'STORE_^1_%JMP* NXTGET_'NEXT CYCLE_^1*_]_^1*_]_^1GETFWA NUM 0_,ENTRY TO GET NEXT DATA FROM FWA_^1_%LDA* CURR_^1_%EOR LWA_^1_%SAN NOTCUR_^1_%JMP* (PACK2)_^1NOTCUR LDA* (CURR)_^1_%RAO* CURR_^1_%JMP* (GE€€TFWA)_$RETURN_^1*_]_^1*_]_^1STRFST NUM 0_,STORE DATA IN Q INTO USER-S BUFFER_^1_%STA* QSAV1_^1_%TRQ A_,DATA INTO A_^1_%LDQ- ECCOR,I_%GET CORE LOCATION OF USER-S BUFFER_^1_%STA 0,Q_*STORE DATA_^1_%LDA- 0_,2 WORD INSTRUCTION_^1QSAV1 NUM 0_^1_%CLR Q_^1_%RAO- ECCOR,I_%TALLY STORAGE LOCATION_^1_%JMP* (STRFST)_^1STRDAT NUM 0_^1_%STQ* (CURR)_'STORE UNPACKED DATA_^1_%TRA Q_,SAVE A_€€^1_%RAO* CURR_)TALLY INTERMEDIATE STORAGE LOCATION_^1_%LDA* CURR_^1_%EOR LWA_^1_%SAN CURNOT_'CURR NOT EQUAL LWA_^1_%JMP* (UNPK2)_^1CURNOT TRQ A_,RESTORE A_^1_%CLR Q_^1_%JMP* (STRDAT)_$EXIT STORE DATA SUBROUTINE_^1*_]_^1*_]_^1SETUP NUM 0_^1_%LDA FWA_^1_%STA* CURR_^1_%JMP* (SETUP)_^1_%EJT_]_^1*_$NAM RECVRY_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIV€€ISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT RECOVERY ROUTINES_^1*_8**********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THIS PROGRAM WILL ATTEMPT TO RECOVER DATA FROM A TAPE_^1*_$RECORD AFTER A DATA ERROR HAS OCCURRED. IT WILL ALSO BYPASS_^1*_$NOISE RECORDS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_8I€€NPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NONE_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_!READ RECOVERY_^1*_!-------------_^1*_!-------------_^1*_]_^1*_$NORMAL READ_^1*_$-----------_^1*_$1. SET M = 2 (NOISE RECOVERY RETRY COUNT._^1*_$2. IF NOISE GO TO STEP 3._^1*_(IF AN ERROR GO TO STEP 7._^1*_*ELSE EXIT._^1*_€€]_^1*_$NOISE RECOVERY_^1*_$--------------_^1*_$3. BACKSPACE._^1*_(SET M = M-1._^1*_(IF M = 0 GO TO STEP 5._^1*_$4. RECOVERY READ._^1*_(GO TO STEP 2._^1*_]_^1*_$BYPASS NOISE_^1*_$------------_^1*_$5. SET M = 2._^1*_$6. ADVANCE RECORD._^1*_(READ RECORD._^1*_(IF FILE MARK, EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF ERROR GO TO STEP 7_^1*_*ELSE EXIT._^1*_]_^1*_$REREAD THE ERROR BLOCK_^1€€*_$----------------------_^1*_$7. SET N = 5 (REREAD COUNT)._^1*_(SET C = 5 (CLEANER COUNT)_^1*_$8. BACKSPACE._^1*_(READ RECORD._^1*_(IF FILE MARK DETECTED THEN EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR OCCURRED GO TO STEP 9._^1*_*ELSE EXIT._^1*_$9. SET N = N-1._^1*_(IF N = 0 GO TO STEP 11._^1*_*ELSE GO TO STEP 8._^1*_#10. SET M = 2._^1*_(GO TO STEP 3._^1*_]_^1*_$RE€€READ IN OPPOSITE PARITY_^1*_$-------------------------_^1*_#11. IF 9 TRACK TAPE GO TO STEP 12._^1*_(BACKSPACE._^1*_(READ RECORD IN OPPOSITE PARITY._^1*_(IF FILE MARK DETECTED, DECLARE THE ERROR IRRECOVERABLE._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR GO TO STEP 12._^1*_*ELSE DECLARE IRRECOVERABLE ERROR IN OPPOSITE PARITY._^1*_]_^1*_$POSITION TAPE PAST TAPE CLEANERS_^1*_$€€--------------------------------_^1*_#12. SET B = 1 (BACKSPACE COUNTER)._^1*_(SET C = C-1._^1*_#13. BACKSPACE._^1*_(IF BOT GO TO STEP 15._^1*_#14. SET B = B+1_^1*_(IF B = 5 GO TO STEP 15_^1*_*ELSE GO TO STEP 13._^1*_(IF FILE MARK OR EOT DETECTED THEN EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF AN ERROR OCCURRED GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$CLEAN TAPE_^1*_$----------_^1*_#€€15. IF B = 3 GO TO STEP 17._^1*_(IF B = 2 GO TO STEP 18._^1*_#16. ADVANCE 1 RECORD._^1*_(SET B = B-1_^1*_(GO TO STEP 15._^1*_#17. ADVANCE 1 RECORD (IGNORE FILE MARKS AND DATA ERRORS)_^1*_#18. READ RECORD._^1*_(IF FILE MARK DETECTED EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF ERROR OCCURRED GO TO STEP 8._^1*_(IF C = 0 DECLARE ERROR IRRECOVERABLE_^1*_*ELSE SET N = 5 AND GO TO S€€TEP 8._^1*_]_^1*_]_^1*_]_^1*_]_^1*_!WRITE RECOVERY_^1*_!--------------_^1*_!--------------_^1*_]_^1*_$NORMAL WRITE_^1*_$------------_^1*_$1. SET N = 0 (ERASE COUNT)_^1*_$2. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3_^1*_*ELSE EXIT._^1*_]_^1*_$BACKUP TO LAST GOOD BLOCK_^1*_$-------------------------_^1*_$3. PERFORM A CONTROLLED BACKSPACE._^1*_]_^1*_$ERASE_^1*_$-----_^1*_$4. SET €€N = N+1._^1*_(IF N = 20 DECLARE ERROR IRRECOVERABLE._^1*_(SET M = N (M = ERASE COUNTER)_^1*_$5. ERASE_^1*_(IF END OF TAPE AND M>1 DECLARE ERROR IRRECOVERABLE._^1*_(IF AN ERASE ERROR DECLARE ERROR IRRECOVERABLE._^1*_$6. SET M = M-1_^1*_(IF M = 0 GO TO STEP 7_^1*_*ELSE GO TO STEP 5._^1*_]_^1*_$REWRITE THE BLOCK_^1*_$-----------------_^1*_$7. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO ST€€EP 3._^1*_]_^1*_$POSITION TAPE TO LAST GOOD BLOCK_^1*_$--------------------------------_^1*_$8. PERFORM CONTROLLED BACKSPACE._^1*_]_^1*_$READ THE BLOCK_^1*_$--------------_^1*_$9. READ_^1*_$10. IF NOISE GO TO STEP 9._^1*_)IF AN ERROR GO TO STEP 13._^1*_+ELSE EXIT._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* RECVRY *_^1*_6*€€*********_^1*_]_^1* LCTT RECOVERY ROUTINES_^1*_]_^1RECVRY NUM 0_^1_%RTJ* RECLOC_'DETERMINE RECOVERY ABSOLUTE_^1RECLOC NUM 0_,ADDRESS + 2_^1R01_"ENA 0_,CLEAR FAULT INDICATOR_^1_%STA* RFCOD_^1_%LDA- RFLAG,I_%IS RECOVERY ENABLED_^1_%SAP R05_*YES, SKIP_^1_%RTJ NOISRC_'NOISE RECORD ENCOUNTERED_^1_%ENA 3_,NO,_^1_%JMP* ROX_^1_%ENA 1_,YES, SHORT RECORD FAULT_^1ROX_"JMP FLCTT_^1R05_€€"LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N$0100_^1_%SAZ R10_*NO, SET FLAG AND SAVE PARAMETERS_^1_%LDQ- RRETAD,I_$YES, GO TO NEXT FUNCTION_^1_%JMP 0,Q_^1R10_"LDA- ESTAT1,I_$SET RECOVERY IN PROGRESS_^1_%AND =N$FEFF_^1_%ADD =N$0100_^1_%STA- ESTAT1,I_^1_%LDA- MFLG,I_'SAVE REQUEST PARAMETERS_^1_%STA* RMFLG_^1_%LDA- QSTWD4,I_^1_%STA* RQSTW4_^1_%ENA $0001_^1_%AND- ESTAT1,I_^€€1_%SAN RWRIT_^1_%JMP* RREAD_(READ OPERATION_^1_%EJT_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1RWRIT ENA 0_,CLEAR N COUNTER_^1_%STA* NCNT_^1RW05_!ENA $0008_(SET CB FLAG_^1_%ADD- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA =XRW10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RW10_!LDA- SINTER,I_$CONTROLLED BACKSPACE ERROR_^1_%AND =N$1E55_^1_%SAZ 1_,NO, CONTINUE_€€^1_%JMP* RFAULT_'YES, FATAL_^1_%RAO* NCNT_)UPDATE COUNTER_^1_%LDQ =N$6000_%ERASE_^1_%LDA =XRW20-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW20_!LDA- SINTER,I_$ERASE ERROR OR EOT_^1_%AND =N$9F51_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA* NCNT_)MAXIMUM NUMBER OF ERASURES_^1_%INA -20_^1_%SAM 1_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA €€=XRW30-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE A RE-WRITE_^1*_]_^1RW30_!LDA- SINTER,I_$RE-WRITE ERROR_^1_%AND =N$2C00_^1_%SAZ 1_^1_%JMP* RW05_)YES, DO ANOTHER BACKSPACE,ERASE_^1_%JMP* RDONE_(NO, RECOVERED_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINE / STORAGE_^1*_]_^1RFAULT LDA- SINTER,I_$ALARM TYPE ERROR_^1_%AND =N$124F_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 2_,YES, REPORT I€€T_^1_%JMP* RFXIT_^1_%LDA- SINTER,I_^1_%AND =N$2C00_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 3_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%ENA 41_+MAXIMUM ATTEMPTS REACHED_^1RFXIT STA* RFCOD_(SAVE FAULT CODE_^1_%JMP* RDONX_^1RDONE ENA -$0002_^1_%AND- RFLAG,I_^1_%ADD =N$0002_^1_%STA- RFLAG,I_^1_%RAO- RCNTFG,I_$INDEX RECOVERY COUNT_^1RDONX RAO* RECVRY_'EXIT+2 NO RECOVERY OR IRRECOVERABLE_^1_%L€€DA- ESTAT1,I_$CLEAR FLAGS_^1_%AND =N$FEDF_%CLEAR MOTION IF SET, AND RECOVERY FLAG IF SET_^1_%STA- ESTAT1,I_^1_%LDA* RMFLG_(RESTORE PDT PARAMETERS_^1_%STA- MFLG,I_^1_%LDA* RQSTW4_^1_%STA- QSTWD4,I_^1_%LDA* RFCOD_(ERROR COMPLETION_^1_%SAZ REXIT_(NO_^1_%JMP FLCTT_(YES, GO TO FAULT ROUTINE_^1REXIT JMP* (RECVRY)_^1*_]_^1RMFLG NUM 0_^1RQSTW4 NUM 0_^1MCNT_!NUM 0_^1NCNT_!NUM 0_,ER€€ASE COUNTER_^1RFCOD NUM 0_,FAULT/CODE FLAG_^1_%EJT_]_^1*_]_^1*_]_^1* READ RECOVERY_^1*_]_^1RREAD ENA 2_^1_%STA* MCNT_^1RD01_!RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD05_)NO, CHECK IF ERROR_^1RD03_!LDA* MCNT_)DECREMENT READ LOGIC_^1_%INA -1_^1_%STA* MCNT_^1_%LDA =XRD20-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD05_!LDA- S€€INTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%JMP* RDRERD_'YES, RE-READ_^1*_]_^1RD10_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK READ_^1_%SAN 1_^1_%JMP* RD01_)NO, CHECK IF NOISE RECORD_^1_%JMP* RDONE_(YES, EXIT_^1*_]_^1RD20_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA* MCNT_)READ COUNTER ELAPSED_^1_%SAZ 1_^1_%JMP* RD25_)NO, DO RECOVERY€€ READ_^1_%ENA 2_,YES, SKIP NOISE RECORD_^1_%STA* MCNT_^1_%LDA =XRD30-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1RD25_!ENA -$0010_^1_%AND- RFLAG,I_^1_%ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD30_!RTJ CKFATE_'FATAL ERROR €€CHECK_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE READ_^1*_]_^1* RE-READ_]_^1*_]_^1RDRERD ENA 5_,RE-READ RECORD_^1_%STA CCNT_)SET CLEANER COUNT_^1_%STA* NCNT_)SET RE-TRY COUNT_^1RD35_!LDA =XRD40-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE FUNCTION_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD40_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$€€0010_^1_%AND- RFLAG,I_^1_%ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD50-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD50_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%TAPE MARK READ_^1_%SAZ 1_^1_%JMP* RDONE_(YES, DONE_^1_%RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD55_)NO_^1_%ENA 2_,RE-INIT COUNTER_^1_%STA* MCNT_^1_%JMP* RD03_)CHE€€CK FURTHER_^1RD55_!LDA- SINTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%LDA* NCNT_)YES, N=N-1_^1_%INA -1_^1_%STA* NCNT_)N=0_^1_%SAZ 1_^1_%JMP* RD35_)NO, LOOP_^1_%LDA- UNTMOD,I_$YES, 9TK TRANSPORT_^1_%AND =N$0800_^1_%SAN RDOPR_^1_%JMP* RDCLN_^1*_]_^1* READ OPPOSITE POLARITY_^1*_]_^1RDOPR LDA =XRD60-RECLOC BACKSPACE FUNCTION_^1_%LDQ =N$1000_^1_€€%JMP* RECFUN_^1*_]_^1RD60_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$0004_^1_%AND- RFLAG,I_^1_%ADD =N$0004_^1_%STA- RFLAG,I_^1_%LDA =XRD70-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'READ IN OPPOSITE PARITY_^1*_]_^1RD70_!RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_^1_%SAZ 2_,FILE MARK_^1_%JMP RFAULT_'YES, IRRECOVERABLR_^1_%RTJ* NOISRC_'NOISE RECORD_^1_%JMP* RD75_)NO_^1_€€%JMP RREAD_(YES, LOOP_^1RD75_!LDA- SINTER,I_^1_%AND =N$2C00_%READ ERROR_^1_%SAN 2_^1_%JMP RFAULT_'IRRECOVERABLE ERROR_^1_%EJT_]_^1*_]_^1* CLEAN TAPE_^1*_]_^1RDCLN LDA* CCNT_)CLEAN TAPE_^1_%INA -1_+DECREMENT CLEAN COUNTER_^1_%STA* CCNT_^1_%ENA 1_^1_%STA* BCNT_)INIT BACKSPACE COUNTER_^1RD95_!LDA =XRD100-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP* RECFU€€N_'EXECUTE FUNCTION_^1*_]_^1RD100 LDA- SINTER,I_^1_%AND =N$1041_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%RAO* BCNT_)NO, UPDATE BACKUP COUNT_^1_%LDA- SINTER,I_^1_%AND =N$0200_%TIMED OUT (BOT)_^1_%SAN RD110+1_^1_%LDA* BCNT_^1_%INA -5_+COUNT = 5_^1_%SAZ RD110+1_^1_%JMP* RD95_)NO, LOOP_^1RD110 RTJ* CKFATE_^1_%LDA* BCNT_)YES, COUNT = 3_^1_%INA -3_^1_%SAN RD124_^1_%LDA€€ =XRD120-RECLOC YES, ADVANCE RECORD_^1_%LDQ =N$7000_^1_%JMP* RECFUN_^1*_]_^1RD120 RTJ* CKFATE_'FATAL ERROR CHECK_^1RD122 LDA =XRD130-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'EXECUTE READ FUNCTION_^1*_]_^1RD124 INA 1_,BACK COUNT = 2_^1_%SAN 1_^1_%JMP* RD122_(YES, EXECUTE READ_^1_%LDA* BCNT_)DECREMENT B COUNTER_^1_%INA -1_^1_%STA* BCNT_^1_%LDA =XRD110-RECLOC SETUP NE€€XT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD130 RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK_^1_%SAZ 2_^1_%JMP RDONE_(YES, DONE_^1_%RTJ* NOISRC_'NO, NOISE RECORD_^1_%JMP* RD132_(NO_^1_%ENA 2_,YES, SET M = 2_^1_%STA MCNT_^1_%JMP RD03_)RE-READ_^1RD132 LDA- SINTER,I_$READ ERROR_^1_%AND =N$2C00_^1_%SAN 2_^1_%JMP R€€DONE_(YES, DONE_^1_%LDA* CCNT_)NO, DOES C = 0_^1_%SAN 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE ERROR_^1_%ENA 5_,RESTORE N COUNTER_^1_%JMP RD35-1_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINES / STORAGE_^1*_]_^1RECFUN ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$STORE NEXT RETURN ENTRY_^1_%STQ- QSTWD4,I_$SAVE FUNCTION_^1_%ENA 0_^1RECFX STA- MFLG,I_'SET FLAG FOR MOTION REQU€€EST_^1_%JMP REXIT_^1*_]_^1*_]_^1RECRWF ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$SET UP FOR NEXT RETURN_^1_%LDA RQSTW4_'RESTORE WORD COUNT_^1_%STA- QSTWD4,I_^1_%ENA 1_,SET FLAG FOR R/W REQUEST_^1_%JMP* RECFX_^1*_]_^1*_]_^1NOISRC NUM 0_^1_%LDA- ADTFW,I_%FWA - START ADDRESS_^1_%SUB FWA_^1_%INA -NOISLN_%- NOISE RECORD SIZE_^1_%SAP NOISEX_^1_%ENA -$0001_^1_%€€AND- RFLAG,I_^1_%ADD =N$0001_^1_%STA- RFLAG,I_^1_%ENA 15_^1_%STA- FLTCOD,I_$PRIME FAULT CODE_^1_%RAO* NOISRC_'YES, NOISE REOCRD_^1NOISEX JMP* (NOISRC)_^1*_]_^1*_]_^1CKFATE NUM 0_^1_%LDA- SINTER,I_^1_%AND =N$1241_%DID FATAL ERROR OCCUR_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%LDA- SINTER,I_$EXIT WITH STATUS IN A_^1_%JMP* (CKFATE)_$NO, RETURN_^1*_]_^1BCNT_!NUM 0_,BACKS€8PACE COUNTER_^1CCNT_!NUM 0_,CLEANER COUNT_^1_%END_]_^__8PDTLCT9 CSY/ C46 P€1_%NAM DTLCT9_'DECK-ID C46 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$DTLP DRIVER FOR 9-TRACK LCTT MAGNETIC TAPE DRIVE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1****_]_^1*_5DISK-TO-TAPE LCTT DRIVER_^1*_5************************_^1*_]_^1*_*PROGRAM BASE -_^1*_]_^1*_*LCTT KERNAL DRIVER ODS LEVE€€L II - LCTT 07/01/75_$REV 05_^1*_]_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_]_^1*_$THE DISK-TO-TAPE (DTLP) LCTT DRIVER PROCESSES ALL READ,_^1*_$WRITE AND MOTION REQUESTS ISSUED BY THE DISK-TO TAPE_^1*_$LOAD/DUMP PROGRAM OF MSOS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE PURPOSE OF THIS SUBROUTINE IS TO PROCESS ALL REQUESTS_^1*_$ISSUED BY THE DISK-TO€€-TAPE LOAD/DUMP PROGRAM . THE_^1*_$MAXIMUM RECORD SIZE IS 3072 WORDS AND THE BUFFER IS_^1*_$SPECIFIED BY THE USER. THE 7-TRACK VERSION OF THIS_^1*_$DRIVER HAS AN INTERMEDIATE BUFFER WHICH IS USED TO_^1*_$PACK OR UNPACK THE DATA WHICH IS TO BE WRITTEN OR HAS_^1*_$BEEN READ. ALL DIAGNOSED ERRORS ARE RETURNED TO THE_^1*_$CALLING PROGRAM WHICH WILL REPORT THEM TO THE OPERATOR._^1*_]€€_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$(A) REGISTER = STARTING BUFFER ADDRESS MEANS TO INITIATE_^1*_4APPROPRIATE READ OR WRITE._^1*_$(A) REGISTER = $0000 MEANS TO INITIATE THE APPROPRIATE_^1*_4ENDING SEQUENCE FOR READ OR WRITE._^1*_]_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF NO ERRORS HAVE OCCURRED -_^1*_*(A) REGISTER = $FFFF_^1*_*(Q) REGISTER = $FFFF_^€€1*_$IF ERRORS HAVE OCCURRED -_^1*_*(A) REGISTER = $0000_^1*_*(Q) REGISTER = LAST HARDWARE STATUS (ESTAT2)_^1*_$IF AN END-OF-FILE IS READ -_^1*_*(A) REGISTER = $0000_^1*_*(Q) REGISTER = $0000_^1*_]_^1*E_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1._!ENTRY "MGREAD" IS THE READ AND READ COMPLETION ENTRY_^1*_*TO THE DRIVER WHICH WILL INITIATE INPUT OR ON COMPLE-_^1*_*TION OF ALL INPU€€T, REWIND THE UNIT. THE A-REGISTER_^1*_*WILL CONTAIN THE STARTING ADDRESS INTO WHICH DATA IS_^1*_*TO BE READ OR A ZERO TO INITIATE THE READ COMPLETION_^1*_*SEQUENCE._^1*_*ENTRY "MGDRIV" IS THE WRITE AND WRITE COMPLETION_^1*_*ENTRY TO THE DRIVER WHICH WILL INITIATE OUTPUT OR ON_^1*_*COMPLETION OF ALL OUTPUT, WRITE AN END OF FILE AND_^1*_*REWIND THE UNIT. THE A-REGISTER WILL CONTAI€€N THE_^1*_*STARTING ADDRESS FROM WHICH THE DATA IS TO BE WRITTEN OR_^1*_*A ZERO TO INITIATE THE WRITE COMPLETION SEQUENCE._^1*_]_^1*_*IN ORDER TO FACILITATE THE USE OF THE MSOS LCTT_^1*_*KERNAL AS THE BASE OF THIS DRIVER, PSEUDO REQUESTS_^1*_*FOR READ, WRITE AND MOTION ARE BUILT BY THIS_^1*_*PROGRAM. A PRESET PHYSICAL DEVICE TABLE "PLCTU0"_^1*_*IS ALSO INCLUDED HERE._^1*_*THE I-RE€€GISTER CONTAINS THE DISK SECTOR NUMBER AND_^1*_*MUST BE PRESERVED UPON ENTRY TO THIS DRIVER_^1*_]_^1*_*EXIT - ALL REQUESTS EXIT FROM THIS DRIVER TO THE_^1*_*CALLING PROGRAM THROUGH THE COMMON ENTRY "IDRIVE"._^1*_*IF NO ERRORS HAVE OCCURRED, THE A AND Q REGISTERS_^1*_*ARE BOTH SET TO $FFFF_^1*_*IF ERRORS HAVE OCCURRED, THE A-REGISTER IS SET TO_^1*_*$0000 AND THE Q-REGISTER IS SET TO€€ THE LAST STATUS_^1*_*FROM THE LCTT TAPE DRIVE (ESTAT2)._^1*_*ERRORS ARE REPORTED BY THE CALLING PROGRAM TO THE_^1*_*OPERATOR._^1*_$IF AN END-OF-FILE HAS BEEN READ, THE A AND Q REGISTERS_^1*_$ARE BOTH SET TO $0000._^1*_*THE I-REGISTER IS RESTORED TO ITS ORIGINAL VALUE_^1*_*UPON EXIT FROM THIS DRIVER._^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$1._!READ REQUEST AND INPUT COMPLETION REQUEST€€._^1*_*A. SAVE THE STARTING BUFFER ADDRESS IN THE_^1*_.I/O REQUEST. SAVE THE CONTENTS OF THE I-REGISTER._^1*_*B. CALCULATE THE ADDRESS OF THE LCTT PHYSICAL_^1*_.DEVICE TABLE AND SAVE IN THE I-REGISTER._^1*_*C. CALCULATE THE ADDRESS OF THE READ REQUEST_^1*_.AND STORE IN WORD 6 OF THE PHYSICAL DEVICE_^1*_.TABLE._^1*_*D. CALCULATE THE ADDRESS OF THE PACK/UNPACK_^1*_.BUFFER AND ST€€ORE IN WORD 38 OF THE PHYSICAL_^1*_.DEVICE TABLE._^1*_*E. SET ESTAT1 TO A READ REQUEST AND SET THE READ_^1*_.REQUEST CODE INTO THE REQUEST._^1*_*F. IF THE STARTING BUFFER ADDRESS IS ZERO, THIS_^1*_.IS AN INPUT COMPLETION REQUEST, GO TO STEP H_^1*_.TO COMPLETE THE INPUT._^1*_*G. GO TO STEP F IN WRITE TO EXECUTE COMMON I/O._^1*_*H. BUILD A MOTION REQUEST TO REWIND THE TAPE DRIVE.€€_^1*_*I. CLEAR ECCOR AND ELSTWD IN THE PHYSTAB._^1*_*J. GO TO STEP J IN WRITE TO EXECUTE COMMON MOTION_^1*_.REQUESTS._^1*_$2._!WRITE REQUEST AND OUTPUT COMPLETION REQUEST._^1*_*A. SAVE THE STARTING BUFFER ADDRESS IN THE_^1*_.I/O REQUEST. SAVE THE CONTENTS OF THE I-REGISTER._^1*_.SET THE RETURN ADDRESS INTO THE COMMON EXIT._^1*_*B. CALCULATE THE ADDRESS OF THE LCTT PHYSICAL_^1*€€_.DEVICE TABLE AND SAVE IN THE I-REGISTER._^1*_*C. CALCULATE THE ADDRESS OF THE WRITE REQUEST AND_^1*_.STORE IN WORD 6 OF THE PHYSICAL DEVICE TABLE._^1*_*D. CALCULATE THE ADDRESS OF THE PACK/UNPACK_^1*_.BUFFER AND STORE IN WORD 38 OF THE PHYSICAL_^1*_.DEVICE TABLE._^1*_*E. SET ESTAT1 TO A WRITE REQUEST AND SET THE WRITE_^1*_.REQUEST CODE INTO THE REQUEST._^1*_*F. IF THE STARTIN€€G BUFFER ADDRESS IS ZERO, THIS_^1*_.IS AN OUTPUT COMPLETION REQUEST, GO TO STEP L_^1*_.TO COMPLETE THE OUTPUT._^1*_*G. SAVE THE STARTING BUFFER ADDRESS IN WORD 10_^1*_.OF THE PHYSICAL DEVICE TABLE._^1*_*H. CALCULATE THE ENDING BUFFER ADDRESS AND STORE_^1*_.IN WORD 11 OF THE PHYSICAL DEVICE TABLE._^1*_*I. SAVE THE MAXIMUM NUMBER OF WORDS TO READ OR_^1*_.WRITE IN THE READ AND WRIT€€E REQUESTS._^1*_.SET UP THE ADT CONTROL WORD IN WORD 27 OF THE PHYSTB._^1*_*J. CALL THE KERNAL SUBROUTINE._^1*_*K. UPON RETURN, DETERMINE IF ANY ERRORS OCCURRED._^1*_.(1) IF NO ERRORS OCCURRED, SET THE A AND Q_^1*_1REGISTERS TO $FFFF RESTORE THE I-REGISTER AND_^1*_1RETURN TO THE CALLER._^1*_.(2) IF ERRORS HAVE OCCURRED, SET THE Q-REGISTER_^1*_1TO THE LAST STATUS OBTAINED FROM T€€HE LCTT_^1*_1MAG TAPE DRIVE (ESTAT2), CLEAR THE A-REGISTER_^1*_1RESTORE THE I-REGISTER AND RETURN TO THE CALLER._^1*_.(3) IF NA END-OF-FILE HAS BEEN READ, SET THE_^1*_1A AND Q REGISTERS TO $0000, RESTORE THE I_^1*_1REGISTER AND RETURN TO THE CALLER._^1*_*L. BUILD A MOTION REQUEST TO WRITE AN END OF_^1*_.FILE ON THE LCTT MAG TAPE DRIVE._^1*_*M. CLEAR ECCOR AND ELSTWD IN THE PHYSI€€CAL DEVICE TABLE._^1*_*N. CALL THE KERNAL SUBROUTINE._^1*_*O. UPON RETURN, DETERMINE IF ANY ERRORS OCCURRED._^1*_.(1) IF NO ERRORS OCCURRED, CALCULATE THE ADDRESS_^1*_1OF THE READ REQUEST AND SAVE IN THE PHYSICAL_^1*_1DEVICE TABLE._^1*_1GO TO STEP H IN READ._^1*_.(2) IF ERRORS HAVE OCCURRED, GO TO STEP K(2) IN_^1*_1WRITE._^1*_]_^1*_]_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*€€_]_^1*_*KLCTT - LCTT KERNEL_^1*_]_^1*_]_^1*_8PARAMETERS_^1*_8----------_^1*_]_^1*_8ENTRY POINTS_^1*_8------------_^1*_]_^1_%ENT MGDRIV_'ENTRY TO WRITE PROCESSOR_^1_%ENT MGREAD_'ENTRY TO READ PROCESSOR_^1_%ENT IDRIVE_'COMMON EXIT ADDRESS (READ ENTRY)_^1_%ENT EWES_)EQUIPMENT CODE LOCATION_^1_%ENT EWES1_(DUMMY INTERFACE FOR DTLP_^1*_]_^1*_]_^1*_8EQUATE REFERENCES_^1*_8-----------€€------_^1*_]_^1*_*MISCELLANEOUS EQUATES_^1*_]_^1_%EQU NOISLN(2)_#LENGTH OF NOISE RECORD_^1_%EQU LEWES($0480) EQUIPMENT CODE EQUATE_^1_%EQU MICRIN(9)_#MICRO INTERRUPT LINE EQUATE_^1_%EQU TLCT7(53*$10) TYPE CODE FOR 7 TRACK DRIVES_^1_%EQU TLCT9(54*$10) TYPE CODE FOR 9 TRACK DRIVES_^1IDRIVE EQU IDRIVE(*)_#COMMON EXIT ADDRESS (READ ENTRY)_^1*_]_^1*_*SELECT UNIT AND DENSITY EQUAT€€ES_^1_%EQU U0TK7($800)_!UNIT/TRACK SELECT - UNIT 0/7 TRACK_^1_%EQU U0TK9(0)_$UNIT/TRACK SELECT - UNIT 0/9 TRACK_^1_%EQU D800($100)_"DENSITY SELECT - 800 BPI_^1_%EQU D556($200)_"DENSITY SELECT - 556 BPI_^1_%EQU PHSREX(0000) MAXIMUM PHYSICAL RECORD SIZE - 9 TRACK_^1_%EQU LNLCTT(0)_^1_%EQU SLCTT($7FFF)_^1*_]_^1*_]_^1*_]_^1*E_]_^1*_*PHYSICAL DEVICE TABLE (PDT) EQUATES_^1*_]_^1_€€%EQU ELVL(0)_'0 SCHEDULER CALL_^1_%EQU EDIN(1)_'1 INITIATOR ADDRESS_^1_%EQU EDCN(2)_'2 CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_%3 ERROR ADDRESS (TIME OUT)_^1_%EQU EDCLK(4)_%4 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_(5 LOGICAL UNIT_^1_%EQU EPTR(6)_'6 REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWESX(7)_%7 EQUIPMENT CODE FOR SAMPLE_^1_%EQU EREQST(8)_$8 REQUEST STATUS_^1_%EQU ESTAT€€1(9)_$9 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"11 LAST LOCATION +1 FOR DATA_^1_%EQU ESTAT2(12)_"12 LAST EQUIPTMENT STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"14 MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"15 FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"16 FAULT CODE IF REQUEST ERROR_^1_%EQU €€DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU UNTMOD(24)_"24 UNIT AND MODE S€€ELECT_^1_%EQU ETEMP1(25)_"25 TEMPORARY STORAGE_^1_%EQU HAFWRD(26)_"26 HALF WORD FLAG_^1_%EQU ADTCW(27)_#27 ADT TABLE CONTROL WORD_^1_%EQU ADTFW(28)_#28 ADT TABLE FWA-1_^1_%EQU ADTLW(29)_#29 ADT TABLE LWA_^1_%EQU MFLG(30)_$30 REQUEST TYPE FLAG(ALSO ADT DUMMY)_^1_%EQU RRETAD(31)_"31 RECOVERY RETURN ADDRESS_^1_%EQU RCKSUM(32)_"32 RECOVERY CHECKSUM_^1_%EQU RCNTFG(33)_"€€33 RECOVERY COUNT FLAG_^1_%EQU RFLAG(34)_#34 RECOVERY FLAG, BIT15=1=NO RECOVERY_^1_%EQU QSTCOD(35)_"35 REQUEST CODE_^1_%EQU QSTWD4(36)_"36 WORD 4 OF REQUEST_^1_%EQU PHSREC(37)_"37 MAX PHYSICAL RECORD SIZE_^1_%EQU ABUFF(38)_#38 PACK/UNPACK BUFFER ADDRESS_^1_%EQU ELINK(39)_#39 PDT THREAD_^1*E_]_^1*_8MESSAGES_^1*_8--------_^1*_]_^1*_*THE INITIALIZER INPUT CONTROL SUBROUTI€€NE WILL PRINT_^1*_*FAULT CODES FOR ALL DRIVER DIAGNOSED ERRORS._^1*_]_^1*E_]_^1*_8MISCELLANEOUS_^1*_8-------------_^1*_]_^1*_]_^1*_$LCTT HARDWARE REGISTER DEFINITIONS_^1*_]_^1*_/***************************************_^1*_/* FUNCTION AND CONDITION BIT REGISTER *_^1*_/***************************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$FUNCTION_^1*_$1_$FUNCTION_^1*_$2_$F€€UNCTION_^1*_$3_$FUNCTION_^1*_]_^1*_$4_$SKIP FIRST BYTE_^1*_$5_$SKIP LAST BYTE_^1*_$6_$NOT USED_^1*_$7_$NOT USED_^1*_]_^1*_$8_$DENSITY - FORM = BIT8BIT9 = XXX BPI_^1*_$9_$DENSITY - 01 = 800, 10 = 556, 11 = 200 BPI_^1*_$10_#PARITY - 1 = EVEN, 0 = ODD_^1*_$11_#TRACK - 1 = 7 TRACK, 0 = 9 TRACK_^1*_]_^1*_$12_#UNIT NUMBER_^1*_$13_#UNIT NUMBER_^1*_$14_#NOT USED_^1*_$15_#NOT USED_^1*E_]_^1€€*_/***************************_^1*_/* HARDWARE FUNCTION CODES *_^1*_/***************************_^1*_$CODE_!FUNCTION_^1*_]_^1*_$0_$NOT USED, RESULTS IN PROGRAM ERROR_^1*_$1_$READ_^1*_$2_$WRITE_^1*_$3_$ERASE_^1*_$4_$BACKSPACE_^1*_$5_$REWIND_^1*_$6_$REWIND AND UNLOAD_^1*_$7_$WRITE TAPE MARK_^1*_$8_$SELECT_^1*_$9_$RECOVERY READ_^1*_$A_$CONTROLLED BACKSPACE_^1*_$B_$DIAGNOSTIC CODE_^1*_€€$C_$DIAGNOSTIC CODE_^1*_$D_$DIAGNOSTIC CODE_^1*_$E_$DIAGNOSTIC CODE_^1*_$F_$DIAGNOSTIC CODE_^1*E_]_^1*_/****************************_^1*_/* HARDWARE STATUS REGISTER *_^1*_/****************************_^1*_]_^1*_$BIT_"ASSIGNMENT_^1*_]_^1*_$0_$INOP - DURING SELECTION_^1*_$1_$BUSY_^1*_$2_$REWINDING_^1*_$3_$READ AFTER WRITE COMMAND_^1*_]_^1*_$4_$WRITE LOCKOUT_^1*_$5_$NOT USED_^1*_$6_$P€€ROGRAM ERROR_^1*_$7_$HALF WORD ON READ_^1*_]_^1*_$8_$SHORT BLOCK_^1*_$9_$TIME OUT_^1*_$10_#DROUPOUT/PICKUP_^1*_$11_#OVERLOAD_^1*_]_^1*_$12_#INOP - DURING EXECUTION_^1*_$13_#DATA ERROR_^1*_$14_#TAPE MARK_^1*_$15_#EOT_^1****_]_^1_%EJT_]_^1MGREAD NOP 0_,ENTRY TO READ SECTION_^1_%STA* STRADR_'SAVE STARTING BUFFER ADDRESS_^1_%LDQ- I_,SAVE THE CONTENTS OF THE I-REGISTER_^1_%STQ* ISAVE_(€€IN A TEMPORARY HOLD AREA_^1_%RTJ* HERER_^1HERER NOP 0_^1_%LDQ* HERER_(CALCULATE ADDRESS OF LCTT PHYSTB_^1_%ADQ =XPLCTU0-HERER_^1_%STQ- I_,AND SAVE IN I-REGISTER_^1_%LDQ* HERER_(CALCULATE ADDRESS OF READ REQUEST_^1_%ADQ =XRRQUST-HERER_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%LDQ* HERER_(CALCULATE ADDRESS OF PACK/UNPACK BUFFER_^1_%ADQ =XBFLCTT-HERER_^1_%STQ- ABUFF,I_%AND SAVE IN €€PHYSTB_^1_%ENQ $0002_^1_%STQ- ESTAT1,I_^1_%LDQ* RRQ_*SET UP REQUEST FOR READ REQUEST_^1_%STQ* RRQUST_^1_%SAN READX_(IF STARTING ADDRESS IS ZERO_^1_%JMP* RRAPUP_'THIS IS A TERMINATION REQUEST_^1READX JMP* WRITE_(GO TO COMMON READ/WRITE CODE_^1MGDRIV NOP 0_,ENTRY TO WRITE SECTION_^1_%STA* STRADW_'SAVE STARTING BUFFER ADDRESS_^1_%LDQ- I_,SAVE THE CONTENTS OF THE I-REGISTER_^1_%STQ€€* ISAVE_(IN A TEMPORARY HOLD AREA_^1_%LDQ* MGDRIV_'MOVE WRITE ENTRY ADDRESS_^1_%STQ* MGREAD_'TO READ ENTRY (COMMON EXIT)_^1_%RTJ* HEREW_^1HEREW NOP 0_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF LCTT PHYSTB_^1_%ADQ =XPLCTU0-HEREW_^1_%STQ- I_,AND SAVE IN I-REGISTER_^1_%LDQ* HEREW_(CALCULATE ADDRESS OF WRITE REQUEST_^1_%ADQ =XWRQUST-HEREW_^1_%STQ- EPTR,I_'AND SAVE IN PHYSTB_^1_%LDQ* HERE€€W_(CALCULATE ADDRESS OF PACK/UNPACK BUFFER_^1_%ADQ =XBFLCTT-HEREW_^1_%STQ- ABUFF,I_%AND SAVE IN PHYSTB_^1_%ENQ $0003_^1_%STQ- ESTAT1,I_^1_%LDQ* WRQ_*SET UP REQUEST FOR WRITE REQUEST_^1_%STQ* WRQUST_^1_%SAN WRITE_(IF THE STARTING ADDRESS IS ZERO_^1_%JMP* WRAPUP_'THIS IS A TERMINATION REQUEST_^1WRITE STA- ECCOR,I_%SAVE STARTING BUFFER ADDRESS IN PHYSTB_^1_%ADD* NWORDS_'CALCULATE €€ENDING BUFFER ADDRESS_^1_%STA- ELSTWD,I_$AND SAVE IN PHYSTB_^1_%LDA* NWORDS_'SAVE NUMBER OF WORDS IN_^1_%STA* NWORDR_'READ AND_^1_%STA* NWORDW_'WRITE REQUESTS_^1_%LDA- EWESX,I_%SET UP ADT CONTROL WORD_^1_%EOR =N$8000_^1_%STA- ADTCW,I_^1CALDVR RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODES_^1_%SAN ERRCOD_'YES_^1_%LDA* ISAVE_(RESTORE THE ORIGINAL VALUE_^1_%STA- I_,TO T€€HE I-REGISTER_^1_%SET A_,NO, SET NORMAL RETURN FLAG_^1_%SQM EXITX_(IS THIS EXIT BECAUSE OF END OF FILE_^1_%CLR A_,CLEAR A-REGISTER IF THIS IS AN EOF_^1EXITX JMP* (IDRIVE)_$RETURN_^1ERRCOD LDQ- ESTAT2,I_$RETURN STATUS ON ERROR_^1_%LDA* ISAVE_(RESTORE THE ORIGINAL VALUE_^1_%STA- I_,TO THE I-REGISTER_^1_%CLR A_,SET ERROR RETURN FLAG_^1_%JMP* (IDRIVE)_$RETURN_^1RRAPUP LDA* MOT_*PU€€T MOTION REQUEST CODE_^1_%STA* RRQUST_'INTO REQUEST_^1_%LDA* REWC_)PUT REWIND CODE_^1_%STA* NWORDR_'INTO REQUEST_^1_%CLR A_,CLEAR START AND END BUFFER ADDRESSES_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^1_%JMP* CALDVR_'CALL KERNAL_^1WRAPUP LDA* MOT_*PUT MOTION REQUEST CODE_^1_%STA* WRQUST_'INTO REQUEST_^1_%LDA* EOFC_)PUT WRITE EOF CODE_^1_%STA* NWORDW_'INTO REQUEST_^1_%CLR A_,CLEAR STA€€RT AND END BUFFER ADDRESSES_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^1_%RTJ KLCTT_(CALL KERNAL_^1_%STA* IERR_)SAVE ANY ERROR CODES_^1_%SAZ NOER_)NO_^1_%JMP* ERRCOD_'YES_^1NOER_!LDQ* HEREW_(CALCULATE THE ADDRESS OF THE READ REQUEST_^1_%ADQ =XRRQUST-HEREW_^1_%STQ- EPTR,I_'AND SAVE IN WORD 6 OF THE PHYSTB_^1_%JMP* RRAPUP_'REWIND TAPE UNIT_^1_%EJT_]_^1RRQUST NUM $0800_(FORMAT READ REQUE€€ST_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDR NUM $0000_(NUMBER OF WORDS_^1STRADR NUM $0000_(STARTING ADDRESS_^1*_]_^1WRQUST NUM $0C00_(FORMAT WRITE REQUEST_^1_%NUM $0000_(NO COMPLETION_^1_%NUM $0000_(THREAD_^1_%NUM $0000_(BINARY MODE, NO LU_^1NWORDW NUM $0000_(NUMBER OF WORDS_^1STRADW NUM $0000_(STARTING ADDRESS_^1*_]_^€€1NWORDS NUM $0C00_(NUMBER OF WORDS TO READ OR WRITE_^1ISAVE NUM 0_,TEMPORARY HOLD FOR I-REGISTER_^1IERR_!NUM $0000_(TEMPORARY HOLD FOR ERROR FLAG_^1MOT_"NUM $1C00_(MOTION REQUEST CODE_^1REWC_!NUM $3000_(REWIND MOTION CODE_^1EOFC_!NUM $2000_(WRITE EOF MOTION CODE_^1EWES1 NUM $0000_(DUMMY INTERFACE FOR DTLP_^1RRQ_"NUM $0800_(FREAD REQUEST_^1WRQ_"NUM $0C00_(FWRITE REQUEST_^€€1_%EJT_]_^1*_*L C T T M A G T A P E_^1*_]_^1*_]_^1*_]_^1BFLCTT BZS BFLCTT(PHSREX*4/3+2) PACK/UNPACK BUFFER FOR 7 TK_^1*_]_^1*_]_^1*_*L C T T M A G T A P E , U N I T 0_^1*_]_^1* UNIT 0 - 7 TRACK, 556 BPI_^1*_]_^1PLCTU0 ADC $0000_)0 ELVL - SCHEDULER CALL_(NOT USED_^1_%ADC 0_-1 EDIN - INITIATOR ADDRESS_$NOT USED_^1_%ADC 0_-2 EDCN - CONTINUATOR ADDRESS_"NOT USED_^1_%ADC 0_-€€3 EDPGM - ERROR ADDRESS_(NOT USED_^1_%NUM -1_,4 EDCLK - DIAGNOSTIC CLOCK_^1_%NUM $0003_)5 ELU - LOGICAL UNIT_^1_%NUM 0_-6 EPTR - PARAMETER ADDRESS_^1EWES_!ADC LEWES_)7 EWES - EQUIPMENT CODE FOR SAMPLE_^1_%ADC $0806+TLCT9_"8 EREQST - REQUEST STATUS_^1_%NUM $0002_)9 ESTAT1 - DRIVER STATUS_^1_%NUM 0_,10 ECCOR - NEXT LOCATION OF DATA_^1_%NUM 0_,11 ELSTWD - LAST LOCATION + 1_^1_€€%NUM 0_,12 ESTAT2 - LAST EQUIPTMENT STATUS_^1_%ADC LNLCTT_'13 MASLGN - DRIVER LENGTH_^1_%ADC SLCTT_(14 MASSEC - MASS MEMORY ADDRESS OF DRIVER_^1_%NUM 0_,15 RETURN - FNR RETURN ADDRESS_^1_%NUM 0_,16 FLTCOD - FAULT CODE IF REQUEST ERROR_^1_%ADC 0_,17 DIAGLU - DIAGNOSTIC LOGICAL UNIT (NOT USED)_^1_%NUM 0_,18 GHOSTI - COUNT OF GHOST INTERRUPTS_^1_%ADC MICRIN_'19 MICROI - MICRO €€INTERRUPT LINE_^1_%NUM 0_,20 TIMOUT - INTERRUPT TIMEOUT VALUE_^1_%NUM 0_,21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_%NUM 0_,22 SINTER - STATUS AFTER INTERRUPT_^1_%NUM 0_,23 STIMEO - STATUS AFTER INTERRUPT TIMEOUT_^1_%ADC U0TK9+D800_"24 UNTMOD - UNIT AND MODE SELECT_^1_%NUM 0_,25 ETEMP1 - TEMPORARY STORAGE_^1_%NUM 0_,26 HAFWRD - HALF WORD FLAG_^1_%NUM $8480_(27 ADTCW - ADT TA€€BLE CONTROL WORD_^1_%NUM 0_,28 ADTFW - ADT TABLE FWA-1_^1_%NUM 0_,29 ADTLW - ADT TABLE LWA_^1_%NUM 0_,30 MFLG - ADT TABLE DUMMY (ALSO REQUEST FLAG)_^1_%NUM 0_,31 RRETAD - RECOVERY RETURN ADDRESS_^1_%NUM 0_,32 RCKSUM - RECOVERY CHECKSUM_^1_%NUM 0_,33 RCNTFG - RECOVERY COUNT FLAG_^1_%NUM 0_,34 RFLAG - RECOVERY TEMP STORAGE_^1_%NUM 0_,35 QSTCOD - REQUEST CODE_^1_%NUM 0_,36 Q€€STWD4 - WORD 4 OF REQUEST_^1_%ADC PHSREX_'37 PHSREC - MAX PHYSICAL RECORD SIZE_^1_%ADC BFLCTT_'38 ABUFF - PACK/UNPACK BUFFER ADDRESS_^1_%ADC PLCTU0_'39 ELINK - PDT THREAD_^1_%EJT_]_^1*_$NAM KLCTT_(ODS LEVEL II - LCTT_*07-01-75 REV 06_^1*_$LCTT KERNEL_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1975_^1****_]_^1*E_]_^1*_8LCTT KERN€€EL_^1*_8***********_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_$THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_$PERFORMS THE I/O BY CALLING ANCILLARY ROUTINES._^1*_$IT ALSO PROCESSES ERRORS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THE KERNAL IS COMPOSED OF TWO BASIC PARTS._^1*_$ONE TO PROCESS INFORMATION NECESSARY TO EXECUTE THE I/O_^1*_$REQUEST AND ONE TO €€PROCESS THE INFORMATION FOLLOWING THE I/O._^1*_]_^1*_$PRIOR TO I/O, THE STATUS TO DETERMINE IF THE DEVICE IS_^1*_$OPERATIVE IS TAKEN. THE REQUEST TYPE IS DETERMINED,_^1*_$THE INITIAL UNIT CONNECTION IS MADE, AND THE APPROPRIATE I/O_^1*_$SUBROUTINE IS CALLED._^1*_]_^1*_$AFTER COMPLETION OF THE I/O REQUEST, STATUS IS TAKEN TO_^1*_$DETERMINE IF ANY ERRORS HAVE OCCURRED AND IF RECOVER€€Y_^1*_$ACTION IS POSSIBLE. IF THE TRANSFER IS CORRECT AND THE_^1*_$DEVICE IS A 7-TRACK UNIT, THE DATA IS UNPACKED FROM THE_^1*_$INTERNAL BUFFER INTO THE USER BUFFER. WHEN THE_^1*_$REQUEST IS SATISFIED CONTROL WILL BE RETURNED TO_^1*_$THE DRIVER._^1*_]_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$INITIATOR (KLCTT)_^1*_)(I) REGISTER = ADDRESS OF PHYSICAL DEVICE €€TABLE._^1*E_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$THE OUTPUTS OF THE KERNEL ARE -_^1*_]_^1*_$1. STATUS_^1*_(PRE-I/O TRANSFER STATUS TO PDT_^1*_(POST-I/O TRANSFER STATUS TO PDT_^1*_]_^1*_$2. FAULT CODE IS SET IF ERROR AS FOLLOWS -_^1*_)1 LOST DATA_^1*_)2 ALARM_^1*_)3 PARITY_^1*_(13 NO WRITE RING_^1*_(14 NOT READY_^1*_(15 NOISE RECORD DETECTED AND IGNORED_^1*_(31 WRITE OF SHORT RECORD€€ REQUESTED_^1*_(41 IRRECOVERABLE ERROR_^1*_]_^1*_]_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$1. EXITS TO DRIVER (CALLING ROUTINE) ON FAULT_^1*_.DETECTION, COMPLETION OF REQUEST._^1*_]_^1*E_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_$PRE-I/O TRANSFER -_^1*_*1. SELECT AND STATUS TRANSPORT; SAVE STATUS._^1*_*2. IF BUSY OR INOPERATIVE CALL FAULT ROUTINE._^1*_*3. DETERMINE TYPE OF REQUEST A€€ND CALL MOTION_^1*_-OR READ/WRITE ANCILLARY ROUTINE._^1*_*4. CALL WAIT SUBROUTINE TO WAIT FOR NOT BUSY_^1*_]_^1*_$POST-I/O TRANSFER -_^1*_*1. SAVES AND CHECKS THE DEVICE STATUS. IF A_^1*_-7-TRACK FILE MARK IS SENSED, THE STATUS WORDS_^1*_-ARE MODIFIED TO REMOVE THE POSSIBLE PARITY ERROR_^1*_-CAUSED BY READING IN THE WRONG MODE._^1*_-IF IT IS 7-TRACK BUT NOT A FILE MARK, THE STATUS€€_^1*_-IS CORRECTED AND THE DATA TRANSFER CHECK CONTINUES._^1*_*2. IF IT IS A FILE MARK, THE FILE MARK STATUS FLAG IS_^1*_-SET AND A RETURN IS MADE TO THE CALLER._^1*_*3. IF A MOTION REQUEST, CHECK STATUS FOR INOP,_^1*_-READ AFTER WRITE, PROGRAM ERROR, OR TIMEOUT._^1*_-IF ANY OF THESE GO TO FAULT ROUTINE. IF NO_^1*_-ERROR, RETURN TO CALLER WITH NO ERROR_^1*_-INDICATOR (A-REGISTER = €€0)._^1*_*4. IF READ/WRITE REQUEST CHECK STATUS FOR DATA_^1*_-ERROR, OVERLOAD, DROPOUT. IF ANY OF THESE GO_^1*_-TO RECOVERY ANCILLARY ROUTINE. IF NO ERROR_^1*_*5. IF 7-TRACK DRIVE, UNPACK DATA TO USER BUFFER._^1*_*6. RETURN TO CALLER._^1*_]_^1*_$FAULT ROUTINE -_^1*_*1. SAVE FAULT CODE IN PDT._^1*_*2. RETURN TO CALLER_^1*E_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_*XMOT - ISSUE I€€/O FOR MOTION REQUESTS_^1*_*XFER - ISSUE I/O FOR READ/WRITE REQUESTS_^1*_*WAIT - WAIT FOR NOT BUSY_^1*_*RECVRY - EXECUTE RECOVERY ERROR PROCEDURES_^1*_]_^1*_]_^1****_]_^1_%EJT_]_^1*_6*********_^1*_6* KLCTT *_^1*_6*********_^1*_]_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1KLCTT NUM 0_^1_%ENA 0_^1_%STA- MFLG,I_'CLEAR REQUEST TYPE FLAG_^1_%STA- SINTER,I_$CLEAR CONTINUATOR AN€€D TIMEOUT STATUS_^1_%STA- SENTRY,I_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%INQ 8_,ADD DIRECTION (OUT)_^1_%LDA- UNTMOD,I_$UNIT SELECT INFO_^1_%INA 8_,SELECT FUNCTION_^1_%NUM $0B04_(SET I/O SELECT (SIO)_^1_%NOP 0_,DELAY 2 CYCLES_^1_%NOP 0_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%RTJ WAIT_)WAIT FOR NOT BUSY_^1_%STA- SENTRY,I_$SAVE ENTRY STATU€€S_^1_%ENA $41_^1_%AND- SENTRY,I_$CHECK IF INOP OR PROG ERROR_^1_%SAZ KL10_)NO, CONTINUE_^1_%ENA 14_+YES, REPORT ERROR_^1_%JMP FLCTT_^1*_]_^1KL10_!LDQ- EPTR,I_'CHECK IF MOTION REQUEST_^1_%LDA- 4,Q_^1_%STA- QSTWD4,I_$SAVE WD 4 OF REQUEST IN PDT_^1_%LDA 0,Q_*GET REQUEST CODE_^1_%ARS 9_^1_%AND =N$001F_%MASK OFF REQUEST BITS_^1_%INA -14_^1_%STA- MFLG,I_'SAVE REQUEST FLAG_^1KL15_€€!LDA- MFLG,I_'NEXT I/O FUNCTION_^1_%SAN KL20_)SKIP IF NOT MOTION REQUEST_^1_%RTJ XMOT_)EXECUTE MOTION COMMAND_^1_%JMP* KL30_^1KL20_!RTJ XFER_)EXECUTE READ/WRITE_^1KL30_!RTJ* WAIT_)WAIT FOR NOT BUSY_^1_%EJT_]_^1* KERNEL CONTINUATOR_^1*_]_^1CLCTT STA- ESTAT2,I_$SAVE DEVICE STATUS_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$4000_%IS THERE A TAPE MARK STATUS SET_^1_%SA€€N CKMOT_(YES, CHECK IF EXECUTING MOTION REQUEST_^1_%JMP* CL03_)NO, CHECK FOR RECOVERY IN PROGRESS_^1CKMOT LDA- UNTMOD,I_$IS THIS A 7-TRACK UNIT_^1_%AND =N$0800_^1_%SAN EOF7TK_'YES, CHECK FOR 7-TRACK EOF DATA_^1_%JMP* CL03_)NO, CONTINUE ON_^1EOF7TK LDA- MFLG,I_'IS THIS A MOTION REQUEST_^1_%SAN 1_,SKIP IF NON MOTION_^1_%JMP* CL02_^1_%LDQ- ABUFF,I_%GET FIRST DATA WORD_^1_%LDA 0,€€Q_*IS IT A FILE MARK DATA WORD_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAN CL01_)SKIP IF NOT A FILE MARK_^1_%LDA =N$DFFF_%REMOVE POSSIBLE DATA ERROR_^1_%AND- ESTAT2,I_$STATUS BIT FROM ESTAT2 AND_^1_%STA- ESTAT2,I_$SINTER_^1_%LDA =N$DFFF_^1_%AND- SINTER,I_^1_%STA- SINTER,I_^1_%JMP* CL03_)FILE MARK CONTINUE_^1CL01_!LDA- ESTAT2,I_$ADJUST STATUS FOR NO FILE MARK_^1_%AND =N$BFFF_^1_%STA- ES€€TAT2,I_^1_%LDA- SINTER,I_^1_%AND =N$BFFF_^1_%STA- SINTER,I_^1_%JMP* CL03_^1*_]_^1CL02_!LDA MOTCOD_'MOTION CODE_^1_%INA -5_+SEARCH FILE MARK_^1_%SAZ 3_,YES, CHECK DATA_^1_%INA -2_+ADVANCE RECORD_^1_%SAN CL03_)NO, CONTINUE_^1_%LDA ADVRB_^1_%ARS 8_^1_%EOR =N$000F_^1_%SAZ 1_,FILE MARK DATA_^1_%JMP* CL01_)NO, ADJUST STATUS_^1CL03_!LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND€€ =N$0100_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* CL07_)YES, GO TO RECOVERY PROCEDURE_^1_%LDA- MFLG,I_^1_%SAN 1_,SKIP IF NON-MOTION REQUEST_^1_%JMP* CL10_)MOTION REQUEST_^1_%LDA- SINTER,I_$READ/WRITE STATUS CHECK_^1_%AND =N$124D_%INOP, REWIND, R/W, TIMEOUT_^1_%SAZ CL04_^1_%ENA 2_^1_%JMP* FLCTT_^1CL04_!ENA $0010_^1_%AND- SINTER,I_^1_%SAZ CL05_)NO, CONTINUE_^1_%ENA 13_+YES, ERROR_^1€€_%JMP* FLCTT_^1CL05_!LDA- SINTER,I_$ANY OTHERS CHECK RECOVERY_^1_%AND =N$2C00_%DATA ERROR, OVERLOAD, DROPOUT_^1_%SAN CL07_^1_%LDA- SINTER,I_^1_%AND =N$C000_%EOT OR TM SET_^1_%SAZ NOTM_)NO FILE MARK STATUS_^1_%CLR Q_,SET FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_(YES, NO RECOVERY_^1NOTM_!LDA- ADTFW,I_%(FWA-1) NOISE RECORD CHECK_^1_%SUB* FWA_*- STARTING ADDRESS_^1_%INA -NOISLN€€_^1_%SAP CL08_)RECORD .GT. NOISE RECORD_^1CL07_!RTJ RECVRY_'EXECUTE RECOVERY PROCEDURES IF ENABLED_^1_%JMP* KL15_)EXECUTE RECOVERY FUNCTION_^1CL08_!JMP* CL20_)NO RECOVERY OR RECOVERY COMPLETE_^1*_]_^1CL10_!LDA- SINTER,I_$IF INOP, READ AFTER WRITE,_^1_%AND =N$1249_%PROG ERR, TIMEOUT = FATAL_^1_%SAZ CL20X_(IF NO ERROR CHECK FOR ADVANCE FILE REQUEST_^1_%ENA 2_^1_%JMP* FLCTT_^1CL2€€0X LDA MOTCOD_'IS THIS AN ADVANCE FILE REQUEST_^1_%INA -5_+MOTCOD = 5_^1_%SAN CL40_)NO, CONTINUE ON AS IS_^1_%LDA- SINTER,I_$YES, IS THERE A FILE MARK STATUS SET_^1_%AND =N$4000_^1_%SAN CL25_)YES, SET FILE MARK STATUS FLAG IN Q_^1_%JMP* KL15_)NO, CONTINUE LOOKING FOR FILE MARK_^1CL20_!LDA- SINTER,I_^1_%SET Q_,SET FLAG FOR NO FILE MARK STATUS_^1_%AND =N$C000_%IS TAPE MARK OR€€ EOT SET_^1_%SAZ CL40_^1CL25_!CLR Q_,SET FILE MARK FOUND STATUS FLAG_^1_%JMP* RQ9TK_^1CL40_!ENA $0010_(IS A 7-TRACK READ IN PROGRESS_^1_%AND- ESTAT1,I_^1_%SAZ RQ9TK_(NO, DO NOT PACK DATA_^1_%STQ* QSAVX_(SAVE Q-REGISTER FOR RETURN_^1_%RTJ TK7DAT_'YES, PACK 7 TRACK DATA INTO USER BUFFER_^1_%LDQ* QSAVX_(RESTORE Q_^1RQ9TK ENA 0_,CLEAR ERROR FLAG_^1_%JMP (KLCTT)_^1WAIT_!NOP 0_^€€1WAIT0X ENA 3_,SET UP FOR DELAY LOOP_^1WAIT00 STA* BZYCTR_^1_%LDA =N$0FFF_%DELAY APPROX. 10 MS_^1WAIT01 INA -1_^1_%SAZ WAIT02_^1_%JMP* WAIT01_^1WAIT02 LDQ- EWESX,I_%EQUIPMENT CODE_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%AND =N$0002_%IS IT BUSY_^1_%SAZ WAIT03_'NO_^1_%JMP* WAIT0X_'YES, DELAY AND START AGAIN_^1WAIT03 LDA* BZYCTR_'DONE WITH DELAY YET_^1_%SAZ WAIT04_'YES GO ON_^1€€_%INA -1_+NO RESTART LOOP_^1_%JMP* WAIT00_^1WAIT04 NUM $0B05_^1_%NUM $0B04_(SAMPLE STATUS (SIO)_^1_%STA- SINTER,I_^1_%JMP* (WAIT)_'RETURN_^1*_]_^1* FAILED ROUTINE_^1* ENTER WITH FAILURE CODE IN A REGISTER_^1*_]_^1FLCTT STA- FLTCOD,I_$SAVE FAULT CODE_^1_%JMP (KLCTT)_%RETURN VIA KERNEL_^1QSAVX NUM 0_,TEMPORARY HOLDER FOR Q-REGISTER_^1BZYCTR NUM $0000_(DELAY LOOP COUNTER_^1_%E€€JT_]_^1*_$NAM XFER_)ODS LEVEL II_106-03-75 REV 01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT READ/WRITE ROUTINES_^1*_8************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE READ/WRITE I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THESE ROUTINES CHEC€€K IF LEGAL RECORD SIZE AND CALLS_^1*_$FAULT ROUTINE IF NOT. THE CORRECT PARITY IS GENERATED_^1*_$AND THE ADT TABLE IS SET UP. THE TYPE OF TRANSFER IS_^1*_$DETERMINED AND THE CORRECT ROUTINE (READ OR WRITE) IS_^1*_$CALLED. THE READ ROUTINE WILL EITHER EXECUTE A NORMAL_^1*_$READ OR A RECOVERY READ DEPENDING ON BIT 4 IN RFLAG IN_^1*_$THE PDT. THE WRITE ROUTINE WILL EITHER DO A WRITE O€€R_^1*_$A CONTROLLED BACKSPACE DEPENDING ON BIT 3 IN RFLAG._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$NORMAL PARAMETERS IN PDT. SPECIAL FLAGS ARE USED IN_^1*_$RFLAG IN THE PDT. THESE FLAG ARE:_^1*_]_^1*_)BIT 2 = 1 = READ IN OPPOSITE PARITY_^1*_)BIT 3 = 1 = EXECUTE CONTROLLED BACKSPACE_^1*_)BIT 4 = 1 = EXECUTE READ RECOVERY_^1*_]_^1*_$THEY ARE USED BY THE RECOV€€ERY ROUTINES AND ARE_^1*_$CLEARED AFTER FUNCTION EXECUTED._^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$CLEARS CONTROL FLAGS IN RFLAG AFTER FUNCTION EXECUTED._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_$ENTRY IS BY RETURN JUMP, PARAMETERS NEEDED ARE_^1*_*ALREADY IN THE PDT._^1*_$EXIT IS A NORMAL RETURN TO CALLER._^1*E_]_^1*_8FLOW_^1*_8----_^1*_$1. CHECK IF REQUEST SHORT RECORD TYP€€E, IF SO CALL_^1*_(FAULT ROUTINE._^1*_$2. DETERMINE CORRECT PARITY FOR 7 TRACK._^1*_$3. SETUP ADT TABLE AND CALL READ OR WRITE ROUTINE._^1*_$4. IF READ DETERMINE IF EITHER OPPOSITE PARITY_^1*_(OR RECOVERY READ FLAG SET. ENABLE MICRO INTERRUPT_^1*_(AND EXECUTE FUNCTION._^1*_$5. IF WRITE DETERMINE IF CONTROLLED BACKSPACE FLAG_^1*_(SET. ENABLE MICRO INTERRUPT AND EXECUTE FUNCTION_^1*_€€]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XFER *_^1*_6********_^1*_]_^1* READ AND WRITE SUBROUTINES_^1* ENTER WITH PDT ADDRESS IN I REGISTER_^1*_]_^1XFER_!NUM 0_^1_%LDA- QSTWD4,I_$GET REQUEST PARAMETER_^1_%INA -NOISLN_%CHECK IF LENGTH.GE.NOISE LENGTH_^1_%SAP 1_^1_%JMP* NOISRX_'SHPRT RECORD ERROR_^1_%LDA- ECCOR,I_%INIT CURRENT WORD POINTERS_^1_%STA* FWA_^1_%LDA- ELSTWD,I_^1_%STA*€€ LWA_^1_%ENA $0001_^1_%AND- ESTAT1,I_^1_%STA* MOTIDX_'SET R/W FLAG_^1_%LDA- UNTMOD,I_$THIS A 7TK UNIT_^1_%AND =N$0800_^1_%SAZ TK9RW_^1_%RTJ TK7DAT_'FORMAT 7 TRACK DATA_^1_%RTJ TK7RW_(DETERMINE TYPE OF 7TK PARITY_^1TK9RW STA* PRITYC_'STORE PARITY_^1_%LDA* FWA_*SETUP ADT TABLE BUFFER POINTERS_^1_%INA -1_^1_%STA- ADTFW,I_%FWA-1_^1_%LDA* LWA_^1_%INA -1_^1_%STA- ADTLW,I_%LAST WO€€RD ADDRESS_^1_%LDA* MOTIDX_'R/W FLAG_^1_%SAZ READ_^1_%RTJ* WRADT_(DO THE WRITE_^1_%JMP* (XFER)_^1READ_!RTJ* RDADT_(DO THE READ_^1_%JMP* (XFER)_^1*_]_^1NOISRX ENA 31_+NOISE RECORD ERROR_^1_%JMP* FLCTT_^1*_]_^1*_]_^1FWA_"NUM 0_,CURRENT FIRST WORD ADDRESS_^1LWA_"NUM 0_,CURRENT LAST WORD ADDRESS_^1_%EJT_]_^1* READ DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1RDA€€DT NUM 0_^1_%LDA- ADTCW,I_%GET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%MASK OUT WRITE BIT_^1_%STA- ADTCW,I_^1_%LDA* PRITYC_^1_%STA* TPAR_)SAVE PARITY BIT_^1_%ENA $0004_^1_%AND- RFLAG,I_^1_%SAZ RD10A_(OPPOSITE PARITY NOT SET_^1_%TCA A_^1_%AND =N$0400_%COMPLIMENT PARITY BIT_^1_%STA* PRITYC_^1RD10A RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0010_(RECOVERY READ IN PROGRESS€€_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, SELECT FUNCTION_^1_%INA 1_,OUTPUT READ FUNCTION_^1_%RTJ* SFUNC_(CLEAR OPPOSITE PARITY FLAG_^1_%ENA -$0014_'AND RECOVERY READ SWITCH_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA* TPAR_^1_%STA* PRITYC_'RESTORE PARITY_^1_%JMP* (RDADT)_^1*_]_^1* WRITE DATA ADT MODE_^1* ENTER WITH ADT TABLE WORD COUNT SET UP_^1*_]_^1WRADT NUM 0_^1_%LDA- ADT€€CW,I_%SET AND SET ADT CONTROL WORD_^1_%AND =N$F7FF_%ADD WRITE_^1_%ADD =N$0800_^1_%STA- ADTCW,I_^1_%RTJ* ENBMIC_'ENABLE MICRO INTERRUPT_^1_%ENA $0008_^1_%AND- RFLAG,I_^1_%SAZ 1_^1_%ENA 8_,YES, EXECUTE ONE_^1_%INA 2_^1_%ADD- HAFWRD,I_$ADD HALF WORD BIT IF SET_^1_%RTJ* SFUNC_^1_%ENA -$0008_'CLEAR CB FLAG_^1_%AND- RFLAG,I_^1_%STA- RFLAG,I_^1_%JMP* (WRADT)_^1*_]_^1* ENABLE MICRO €€INTERRUPT_^1*_]_^1ENBMIC NUM 0_^1_%LDA- I_,SET UP POINTER TO ADT TABLE_^1_%INA ADTCW_^1_%LDQ- MICROI,I_$DISABLE CODE_^1_%ADQ =N$8000_%ENABLE BIT_^1_%NUM $0B06_(DEFINE MICRO INTERRUPT (DMI)_^1_%JMP* (ENBMIC)_^1*_]_^1MOTIDX NUM 0_,READ/WRITE FLAG, 1=WRITE_^1PRITYC NUM 0_,PARITY BIT (POSITIONED)_^1TPAR_!NUM 0_,TEMP PARITY STORAGE_^1_%EJT_]_^1*_$NAM XMOT_)ODS LEVEL II - LCTT_*0€€7-01-75 REV-04_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1****_]_^1*E_]_^1*_8LCTT MOTION ROUTINES_^1*_8********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$EXECUTE MOTION I/O FUNCTIONS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_$THIS MODULE WILL DECODE THE MOTION COMMAND AND EXECUTE_^1*_$THE NEX€€T MOTION COMMAND. THESE COMMANDS ARE ISSUED BY A_^1*_$SERIES OF SMALL SUBROUTINES. BEFORE THE COMMAND IS ISSUED_^1*_$THE CORRECT PARITY WILL FIRST BE DETERMINED. AFTER THE_^1*_$MOTION COMMAND IS ISSUED CONTROL WILL BE PASSED BACK TO_^1*_$THE CALLER. AN UNUED FUNCTION WILL BE TREATED AS A NOP._^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*_$SEVERAL FLAG BITS IN THE€€ PDT ARE USED BY THIS ROUTINE._^1*_*UNTMOD - BIT 11 - TYPE OF DRIVE (7 OR 9 TRACK)_^1*_*ESTAT1 - BIT 5 - MOTION REQUEST BIT (SET TO 1)_^1*_1- BIT 6 - REWIND FLAG (SET TO 1 IF REWIND)_^1*_1- BIT 8 - RECOVERY IN PROGRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_$IF A REWIND COMMAND IS EXECUTED BIT 6 OF ESTAT1 WILL_^1*_$BE SET TO INDICATE A REWINDIN PROGRESS. BIT 5 OF ESTAT1_^1*_$WI€€LL BE SET TO INDICATE A MOTION REQUEST IN PROGRESS._^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$IF A SEVEN TRACK UNIT IS PRESENT THE ROUTINE TK7RW_^1*_$WILL BE CALLED TO DETERMINE THE PARITY TO BE USED._^1*_]_^1****_]_^1_%EJT_]_^1*_6********_^1*_6* XMOT *_^1*_6********_^1*_]_^1* MOTION EXECUTION ANCILLARY ROUTIN€€E_^1* ENTER WITH MOTION REQUEST, I = PDT POINTER_^1*_]_^1XMOT_!NUM 0_^1_%LDA- UNTMOD,I_$IS THIS A 7 TRACK UNIT_^1_%AND =N$0800_^1_%SAZ XMOT10_'NO, SKIP_^1_%RTJ* TK7RW_^1XMOT10 STA* PRITYC_^1_%ENA -$0020_^1_%AND- ESTAT1,I_^1_%ADD =N$0020_^1_%STA- ESTAT1,I_^1_%LDA- QSTWD4,I_$GET NUMBER OF WORDS_^1_%ARS 12_+SHIFT AND MASK_^1_%AND =N$0007_^1_%STA* MOTCOD_^1_%TRA Q_^1_%INA -8_^€€1_%SAP SUBMOT_'NOOP, ILLEGAL OPERATION_^1_%JMP* SUBMOT,Q_$EXECUTE FUNCTION_^1*_]_^1SUBMOT JMP* NOOP_)NO OPERATION (USED FOR STATUS)_^1_%JMP* BKSP_)BACKSPACE RECORD_^1_%JMP* WRFM_)WRITE FILE MARK_^1_%JMP* REW_*REWIND_^1_%JMP* REWUN_(REWIND UNLOAD_^1_%JMP* ADVAN_(SEARCH FILE MARK FORWARD_^1_%JMP* ERASE_(ERASE (DLU OR RECOVERY ONLY)_^1_%JMP* ADVAN_(ADVANCE 1 RECORD_^1_%EJT_]_^1* REWI€€ND_]_^1*_]_^1REW_"ENA -$0040_^1_%AND- ESTAT1,I_^1_%ADD =N$0040_^1_%STA- ESTAT1,I_^1_%ENA 5_,EXECUTE REWIND FUNCTION_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* REWIND UNLOAD_^1*_]_^1REWUN ENA 6_,EXECUTE REWIND UNLOAD_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* BACKSPACE_^1*_]_^1BKSP_!ENA 4_,EXECUTE BACKSPACE_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* ERASE_]_^1*_]_^1ERASE LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^€€1_%AND =N$0100_^1_%SAN 1_,YES, EXECUTE ERASE_^1_%JMP* NOOP_^1ERSX_!ENA 3_^1_%JMP* DOMOT_^1*_]_^1*_]_^1* WRITE FILE MARK_^1*_]_^1WRFM_!LDA- UNTMOD,I_$GET 7TK BIT_^1_%AND =N$0800_^1_%SAZ WRFM9_^1_%RTJ* TK7WEF_'WRITE 7 TRACK TAPE MARK_^1_%JMP* (XMOT)_^1WRFM9 ENA 7_,EXECUTE 9TK FILEMARK_^1DOMOT RTJ* SFUNC_^1_%JMP* (XMOT)_^1*_]_^1*_]_^1* ADVANCE ONE RECORD OR FILE_^1*_]_^1ADVAN €€ RTJ* BLOC+1_'CALCULATE ADDRESS OF BUFFER_^1BLOC_!ADC* ADVRB_^1_%NUM 0_^1_%LDA* BLOC+1_'GET PRESENT CORE ADDRESS_^1_%ADD* BLOC_^1_%INA -1_+FWA-1 OF DATA BUFFER_^1_%STA- ADTFW,I_^1_%INA 9_,ALLOW 9 WORDS_^1_%STA- ADTLW,I_%LWA OF BUFFER_^1_%RTJ RDADT_(EXECUTE A READ_^1_%JMP* (XMOT)_^1*_]_^1ADVRB BZS ADVRB(9)_$BUFFER FOR ADVANCE RECORD_^1*_]_^1*_]_^1* FUNCTION OUTPUT_^1* ENTER WI€€TH FUNCTION CODE IN A AND PARITY IN PRITYC_^1*_]_^1SFUNC NUM 0_^1_%ADD- UNTMOD,I_$ADD UNIT, DENSITY AND TRACK_^1_%ADD* PRITYC_'ADD PARITY_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%INQ 8_,SET I/O_^1_%NUM $0B04_(SIO_^1_%NOP 0_,DELAY_^1_%NOP 0_^1_%LDQ- EWESX,I_%EQUIPMENT CODE_^1_%NUM $0B05_(CLEAR MACRO INTERRUPT (SPS)_^1_%JMP* (SFUNC)_^1*_]_^1*_]_^1* NO OPERATION - NO FUNCTION OUTPU€€T_^1*_]_^1NOOP_!JMP CL40_)ENTER CONTINUATOR AFTER INT PROCESS_^1*_]_^1MOTCOD NUM 0_,MOTION CODE THIS MOTION_^1_%EJT_]_^1*_$NAM TK7_*ODS LEVEL II - LCTT_*06-06-75 REV-01_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORP 1975_^1*_6*******_^1*_6* TK7 *_^1*_6*******_^1*_]_^1* DUMMY SEVEN-TRACK SPECIAL ROUTINES_^1*_]_^1* 7 TRACK READ/WRITE - DETER€€MINES PARITY_^1*_]_^1TK7RW NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%JMP* (TK7RW)_^1*_]_^1* 7 TRACK WRITE OF END OF FILE ROUTINE_^1*_]_^1TK7WEF NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1_%JMP* (TK7WEF)_^1*_$NAM TK7DAT_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_€€$COPYRIGHT CONTROL DATA CORP 1975_^1*_6**********_^1*_6* TK7DAT *_^1*_6**********_^1* LCTT DUMMY 7 TRACK DATA FORMAT ROUTINE_^1*_]_^1TK7DAT NUM 0_^1*_8NOT USED FOR 9 TRACK DRIVER_^1*_8--- ---- --- - ----- ------_^1TK7DEX JMP* (TK7DAT)_^1_%EJT_]_^1*_$NAM RECVRY_'ODS LEVEL II - LCTT_*04-15-75 REV-00_^1*_$SMALL COMPUTER SYSTEMS DIVISION - LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA C€€ORP 1975_^1****_]_^1*E_]_^1*_8LCTT RECOVERY ROUTINES_^1*_8**********************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$THIS PROGRAM WILL ATTEMPT TO RECOVER DATA FROM A TAPE_^1*_$RECORD AFTER A DATA ERROR HAS OCCURRED. IT WILL ALSO BYPASS_^1*_$NOISE RECORDS._^1*_]_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_]_^1*€€_$NONE_^1*_]_^1*_8OUTPUT_^1*_8------_^1*_]_^1*_8ENTRY/EXIT_^1*_8----------_^1*_]_^1*_8FLOW_^1*_8----_^1*_]_^1*_!READ RECOVERY_^1*_!-------------_^1*_!-------------_^1*_]_^1*_$NORMAL READ_^1*_$-----------_^1*_$1. SET M = 2 (NOISE RECOVERY RETRY COUNT._^1*_$2. IF NOISE GO TO STEP 3._^1*_(IF AN ERROR GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$NOISE RECOVERY_^1*_$--------------_^1*_$3. B€€ACKSPACE._^1*_(SET M = M-1._^1*_(IF M = 0 GO TO STEP 5._^1*_$4. RECOVERY READ._^1*_(GO TO STEP 2._^1*_]_^1*_$BYPASS NOISE_^1*_$------------_^1*_$5. SET M = 2._^1*_$6. ADVANCE RECORD._^1*_(READ RECORD._^1*_(IF FILE MARK, EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF ERROR GO TO STEP 7_^1*_*ELSE EXIT._^1*_]_^1*_$REREAD THE ERROR BLOCK_^1*_$----------------------_^1*_$7. SET N = 5 (REREAD€€ COUNT)._^1*_(SET C = 5 (CLEANER COUNT)_^1*_$8. BACKSPACE._^1*_(READ RECORD._^1*_(IF FILE MARK DETECTED THEN EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR OCCURRED GO TO STEP 9._^1*_*ELSE EXIT._^1*_$9. SET N = N-1._^1*_(IF N = 0 GO TO STEP 11._^1*_*ELSE GO TO STEP 8._^1*_#10. SET M = 2._^1*_(GO TO STEP 3._^1*_]_^1*_$REREAD IN OPPOSITE PARITY_^1*_$----------------------€€---_^1*_#11. IF 9 TRACK TAPE GO TO STEP 12._^1*_(BACKSPACE._^1*_(READ RECORD IN OPPOSITE PARITY._^1*_(IF FILE MARK DETECTED, DECLARE THE ERROR IRRECOVERABLE._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF AN ERROR GO TO STEP 12._^1*_*ELSE DECLARE IRRECOVERABLE ERROR IN OPPOSITE PARITY._^1*_]_^1*_$POSITION TAPE PAST TAPE CLEANERS_^1*_$--------------------------------_^1*_#12. SET B = 1€€ (BACKSPACE COUNTER)._^1*_(SET C = C-1._^1*_#13. BACKSPACE._^1*_(IF BOT GO TO STEP 15._^1*_#14. SET B = B+1_^1*_(IF B = 5 GO TO STEP 15_^1*_*ELSE GO TO STEP 13._^1*_(IF FILE MARK OR EOT DETECTED THEN EXIT._^1*_(IF NOISE GO TO STEP 3._^1*_(IF AN ERROR OCCURRED GO TO STEP 7._^1*_*ELSE EXIT._^1*_]_^1*_$CLEAN TAPE_^1*_$----------_^1*_#15. IF B = 3 GO TO STEP 17._^1*_(IF B = 2 GO TO STE€€P 18._^1*_#16. ADVANCE 1 RECORD._^1*_(SET B = B-1_^1*_(GO TO STEP 15._^1*_#17. ADVANCE 1 RECORD (IGNORE FILE MARKS AND DATA ERRORS)_^1*_#18. READ RECORD._^1*_(IF FILE MARK DETECTED EXIT._^1*_(IF NOISE RECORD GO TO STEP 10._^1*_(IF ERROR OCCURRED GO TO STEP 8._^1*_(IF C = 0 DECLARE ERROR IRRECOVERABLE_^1*_*ELSE SET N = 5 AND GO TO STEP 8._^1*_]_^1*_]_^1*_]_^1*_]_^1*_!WRITE RECOVERY_€€^1*_!--------------_^1*_!--------------_^1*_]_^1*_$NORMAL WRITE_^1*_$------------_^1*_$1. SET N = 0 (ERASE COUNT)_^1*_$2. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3_^1*_*ELSE EXIT._^1*_]_^1*_$BACKUP TO LAST GOOD BLOCK_^1*_$-------------------------_^1*_$3. PERFORM A CONTROLLED BACKSPACE._^1*_]_^1*_$ERASE_^1*_$-----_^1*_$4. SET N = N+1._^1*_(IF N = 20 DECLARE ERROR IRRECOVERABLE€€._^1*_(SET M = N (M = ERASE COUNTER)_^1*_$5. ERASE_^1*_(IF END OF TAPE AND M>1 DECLARE ERROR IRRECOVERABLE._^1*_(IF AN ERASE ERROR DECLARE ERROR IRRECOVERABLE._^1*_$6. SET M = M-1_^1*_(IF M = 0 GO TO STEP 7_^1*_*ELSE GO TO STEP 5._^1*_]_^1*_$REWRITE THE BLOCK_^1*_$-----------------_^1*_$7. WRITE THE BLOCK._^1*_(IF AN ERROR GO TO STEP 3._^1*_]_^1*_$POSITION TAPE TO LAST GOOD BLOCK_^€€1*_$--------------------------------_^1*_$8. PERFORM CONTROLLED BACKSPACE._^1*_]_^1*_$READ THE BLOCK_^1*_$--------------_^1*_$9. READ_^1*_$10. IF NOISE GO TO STEP 9._^1*_)IF AN ERROR GO TO STEP 13._^1*_+ELSE EXIT._^1*_]_^1*_8SUBROUTINES_^1*_8-----------_^1*_]_^1*_$NONE_^1*_]_^1****_]_^1_%EJT_]_^1*_6**********_^1*_6* RECVRY *_^1*_6**********_^1*_]_^1* LCTT RECOVERY ROUTINES_^1*_]_^1€€RECVRY NUM 0_^1_%RTJ* RECLOC_'DETERMINE RECOVERY ABSOLUTE_^1RECLOC NUM 0_,ADDRESS + 2_^1R01_"ENA 0_,CLEAR FAULT INDICATOR_^1_%STA* RFCOD_^1_%LDA- RFLAG,I_%IS RECOVERY ENABLED_^1_%SAP R05_*YES, SKIP_^1_%RTJ NOISRC_'NOISE RECORD ENCOUNTERED_^1_%ENA 3_,NO,_^1_%JMP* ROX_^1_%ENA 1_,YES, SHORT RECORD FAULT_^1ROX_"JMP FLCTT_^1R05_"LDA- ESTAT1,I_$IS RECOVERY IN PROGRESS_^1_%AND =N€€$0100_^1_%SAZ R10_*NO, SET FLAG AND SAVE PARAMETERS_^1_%LDQ- RRETAD,I_$YES, GO TO NEXT FUNCTION_^1_%JMP 0,Q_^1R10_"LDA- ESTAT1,I_$SET RECOVERY IN PROGRESS_^1_%AND =N$FEFF_^1_%ADD =N$0100_^1_%STA- ESTAT1,I_^1_%LDA- MFLG,I_'SAVE REQUEST PARAMETERS_^1_%STA* RMFLG_^1_%LDA- QSTWD4,I_^1_%STA* RQSTW4_^1_%ENA $0001_^1_%AND- ESTAT1,I_^1_%SAN RWRIT_^1_%JMP* RREAD_(READ OPERATION_^1_%EJ€€T_]_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1RWRIT ENA 0_,CLEAR N COUNTER_^1_%STA* NCNT_^1RW05_!ENA $0008_(SET CB FLAG_^1_%ADD- RFLAG,I_^1_%STA- RFLAG,I_^1_%LDA =XRW10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RW10_!LDA- SINTER,I_$CONTROLLED BACKSPACE ERROR_^1_%AND =N$1E55_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%RAO* NCNT_)UPDATE C€€OUNTER_^1_%LDQ =N$6000_%ERASE_^1_%LDA =XRW20-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RW20_!LDA- SINTER,I_$ERASE ERROR OR EOT_^1_%AND =N$9F51_^1_%SAZ 1_,NO, CONTINUE_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA* NCNT_)MAXIMUM NUMBER OF ERASURES_^1_%INA -20_^1_%SAM 1_^1_%JMP* RFAULT_'YES, FATAL_^1_%LDA =XRW30-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECR€€WF_'EXECUTE A RE-WRITE_^1*_]_^1RW30_!LDA- SINTER,I_$RE-WRITE ERROR_^1_%AND =N$2C00_^1_%SAZ 1_^1_%JMP* RW05_)YES, DO ANOTHER BACKSPACE,ERASE_^1_%JMP* RDONE_(NO, RECOVERED_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINE / STORAGE_^1*_]_^1RFAULT LDA- SINTER,I_$ALARM TYPE ERROR_^1_%AND =N$124F_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 2_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%LDA- SINTER,I_^1_%AND =N$2C00€€_^1_%SAZ 2_,NO, CONTINUE_^1_%ENA 3_,YES, REPORT IT_^1_%JMP* RFXIT_^1_%ENA 41_+MAXIMUM ATTEMPTS REACHED_^1RFXIT STA* RFCOD_(SAVE FAULT CODE_^1_%JMP* RDONX_^1RDONE ENA -$0002_^1_%AND- RFLAG,I_^1_%ADD =N$0002_^1_%STA- RFLAG,I_^1_%RAO- RCNTFG,I_$INDEX RECOVERY COUNT_^1RDONX RAO* RECVRY_'EXIT+2 NO RECOVERY OR IRRECOVERABLE_^1_%LDA- ESTAT1,I_$CLEAR FLAGS_^1_%AND =N$FEDF_%CLEAR M€€OTION IF SET, AND RECOVERY FLAG IF SET_^1_%STA- ESTAT1,I_^1_%LDA* RMFLG_(RESTORE PDT PARAMETERS_^1_%STA- MFLG,I_^1_%LDA* RQSTW4_^1_%STA- QSTWD4,I_^1_%LDA* RFCOD_(ERROR COMPLETION_^1_%SAZ REXIT_(NO_^1_%JMP FLCTT_(YES, GO TO FAULT ROUTINE_^1REXIT JMP* (RECVRY)_^1*_]_^1RMFLG NUM 0_^1RQSTW4 NUM 0_^1MCNT_!NUM 0_^1NCNT_!NUM 0_,ERASE COUNTER_^1RFCOD NUM 0_,FAULT/CODE FLAG_^1_%EJ€€T_]_^1*_]_^1*_]_^1* READ RECOVERY_^1*_]_^1RREAD ENA 2_^1_%STA* MCNT_^1RD01_!RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD05_)NO, CHECK IF ERROR_^1RD03_!LDA* MCNT_)DECREMENT READ LOGIC_^1_%INA -1_^1_%STA* MCNT_^1_%LDA =XRD20-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD05_!LDA- SINTER,I_$ERROR ON READ_^1_%AND =N$2C00_^1_%SAN 1_€€^1_%JMP* RDONE_(NO, DONE_^1_%JMP* RDRERD_'YES, RE-READ_^1*_]_^1RD10_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK READ_^1_%SAN 1_^1_%JMP* RD01_)NO, CHECK IF NOISE RECORD_^1_%JMP* RDONE_(YES, EXIT_^1*_]_^1RD20_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA* MCNT_)READ COUNTER ELAPSED_^1_%SAZ 1_^1_%JMP* RD25_)NO, DO RECOVERY READ_^1_%ENA 2_,YES, SKIP NOISE RECORD_^1_%STA* M€€CNT_^1_%LDA =XRD30-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1RD25_!ENA -$0010_^1_%AND- RFLAG,I_^1_%ADD =N$0010_%SET RECOVERY READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD30_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%LDA =XRD10-RECLOC SETUP NEXT RETURN ENTR€€Y_^1_%JMP RECRWF_'EXECUTE READ_^1*_]_^1* RE-READ_]_^1*_]_^1RDRERD ENA 5_,RE-READ RECORD_^1_%STA CCNT_)SET CLEANER COUNT_^1_%STA* NCNT_)SET RE-TRY COUNT_^1RD35_!LDA =XRD40-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE FUNCTION_^1_%JMP RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD40_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%ENA -$0010_^1_%AND- RFLAG,I_^1_%ADD =N$0010_%SET RECOVER€€Y READ FLAG_^1_%STA- RFLAG,I_^1_%LDA =XRD50-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP RECRWF_'EXECUTE FUNCTION_^1*_]_^1RD50_!RTJ CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%TAPE MARK READ_^1_%SAZ 1_^1_%JMP* RDONE_(YES, DONE_^1_%RTJ NOISRC_'NOISE RECORD_^1_%JMP* RD55_)NO_^1_%ENA 2_,RE-INIT COUNTER_^1_%STA* MCNT_^1_%JMP* RD03_)CHECK FURTHER_^1RD55_!LDA- SINTER,I_$ERROR ON READ_^1_€€%AND =N$2C00_^1_%SAN 1_^1_%JMP* RDONE_(NO, DONE_^1_%LDA* NCNT_)YES, N=N-1_^1_%INA -1_^1_%STA* NCNT_)N=0_^1_%SAZ 1_^1_%JMP* RD35_)NO, LOOP_^1_%LDA- UNTMOD,I_$YES, 9TK TRANSPORT_^1_%AND =N$0800_^1_%SAN RDOPR_^1_%JMP* RDCLN_^1*_]_^1* READ OPPOSITE POLARITY_^1*_]_^1RDOPR LDA =XRD60-RECLOC BACKSPACE FUNCTION_^1_%LDQ =N$1000_^1_%JMP* RECFUN_^1*_]_^1RD60_!RTJ CKFATE_'FATAL ERROR€€ CHECK_^1_%ENA -$0004_^1_%AND- RFLAG,I_^1_%ADD =N$0004_^1_%STA- RFLAG,I_^1_%LDA =XRD70-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'READ IN OPPOSITE PARITY_^1*_]_^1RD70_!RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_^1_%SAZ 2_,FILE MARK_^1_%JMP RFAULT_'YES, IRRECOVERABLR_^1_%RTJ* NOISRC_'NOISE RECORD_^1_%JMP* RD75_)NO_^1_%JMP RREAD_(YES, LOOP_^1RD75_!LDA- SINTER,I_^1_%AN€€D =N$2C00_%READ ERROR_^1_%SAN 2_^1_%JMP RFAULT_'IRRECOVERABLE ERROR_^1_%EJT_]_^1*_]_^1* CLEAN TAPE_^1*_]_^1RDCLN LDA* CCNT_)CLEAN TAPE_^1_%INA -1_+DECREMENT CLEAN COUNTER_^1_%STA* CCNT_^1_%ENA 1_^1_%STA* BCNT_)INIT BACKSPACE COUNTER_^1RD95_!LDA =XRD100-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$1000_%BACKSPACE_^1_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD100 LDA- SINTER,I_^1€€_%AND =N$1041_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%RAO* BCNT_)NO, UPDATE BACKUP COUNT_^1_%LDA- SINTER,I_^1_%AND =N$0200_%TIMED OUT (BOT)_^1_%SAN RD110+1_^1_%LDA* BCNT_^1_%INA -5_+COUNT = 5_^1_%SAZ RD110+1_^1_%JMP* RD95_)NO, LOOP_^1RD110 RTJ* CKFATE_^1_%LDA* BCNT_)YES, COUNT = 3_^1_%INA -3_^1_%SAN RD124_^1_%LDA =XRD120-RECLOC YES, ADVANCE RECORD_^1_%LDQ =N$70€€00_^1_%JMP* RECFUN_^1*_]_^1RD120 RTJ* CKFATE_'FATAL ERROR CHECK_^1RD122 LDA =XRD130-RECLOC SETUP NEXT RETURN ENTRY_^1_%JMP* RECRWF_'EXECUTE READ FUNCTION_^1*_]_^1RD124 INA 1_,BACK COUNT = 2_^1_%SAN 1_^1_%JMP* RD122_(YES, EXECUTE READ_^1_%LDA* BCNT_)DECREMENT B COUNTER_^1_%INA -1_^1_%STA* BCNT_^1_%LDA =XRD110-RECLOC SETUP NEXT RETURN ENTRY_^1_%LDQ =N$7000_%ADVANCE RECORD_^1€€_%JMP* RECFUN_'EXECUTE FUNCTION_^1*_]_^1RD130 RTJ* CKFATE_'FATAL ERROR CHECK_^1_%AND =N$4000_%FILE MARK_^1_%SAZ 2_^1_%JMP RDONE_(YES, DONE_^1_%RTJ* NOISRC_'NO, NOISE RECORD_^1_%JMP* RD132_(NO_^1_%ENA 2_,YES, SET M = 2_^1_%STA MCNT_^1_%JMP RD03_)RE-READ_^1RD132 LDA- SINTER,I_$READ ERROR_^1_%AND =N$2C00_^1_%SAN 2_^1_%JMP RDONE_(YES, DONE_^1_%LDA* CCNT_)NO, DOES C = 0_^1_%S€€AN 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE ERROR_^1_%ENA 5_,RESTORE N COUNTER_^1_%JMP RD35-1_^1_%EJT_]_^1*_]_^1*_]_^1* SUBROUTINES / STORAGE_^1*_]_^1RECFUN ADD RECLOC_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$STORE NEXT RETURN ENTRY_^1_%STQ- QSTWD4,I_$SAVE FUNCTION_^1_%ENA 0_^1RECFX STA- MFLG,I_'SET FLAG FOR MOTION REQUEST_^1_%JMP REXIT_^1*_]_^1*_]_^1RECRWF ADD RECLOC€€_'ADD ABSOLUTE RECOVERY ADDRESS_^1_%STA- RRETAD,I_$SET UP FOR NEXT RETURN_^1_%LDA RQSTW4_'RESTORE WORD COUNT_^1_%STA- QSTWD4,I_^1_%ENA 1_,SET FLAG FOR R/W REQUEST_^1_%JMP* RECFX_^1*_]_^1*_]_^1NOISRC NUM 0_^1_%LDA- ADTFW,I_%FWA - START ADDRESS_^1_%SUB FWA_^1_%INA -NOISLN_%- NOISE RECORD SIZE_^1_%SAP NOISEX_^1_%ENA -$0001_^1_%AND- RFLAG,I_^1_%ADD =N$0001_^1_%STA- RFLAG,I_^1_%€€ENA 15_^1_%STA- FLTCOD,I_$PRIME FAULT CODE_^1_%RAO* NOISRC_'YES, NOISE REOCRD_^1NOISEX JMP* (NOISRC)_^1*_]_^1*_]_^1CKFATE NUM 0_^1_%LDA- SINTER,I_^1_%AND =N$1241_%DID FATAL ERROR OCCUR_^1_%SAZ 2_^1_%JMP RFAULT_'YES, IRRECOVERABLE_^1_%LDA- SINTER,I_$EXIT WITH STATUS IN A_^1_%JMP* (CKFATE)_$NO, RETURN_^1*_]_^1BCNT_!NUM 0_,BACKSPACE COUNTER_^1CCNT_!NUM 0_,CLEANER COUNT_^1_%END_€]_^__ PCP026 CSY/ C47 P€1_%NAM CP026_(DECK-ID C47 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_*HOLLERITH (026) CARD PUNCH TABLE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1_%ENT CDPC_^1_%SPC 2_^1CDPC_!NUM_($000_0$20-SPACE_^1_(NUM_%$482_0$21-EXCLAMATION_^1_(NUM_%$006_0$22-QUOTES_^1_(NUM_%$806_0$23-NUMBER_^1_(NUM_%$442€€_0$24-DOLLAR_^1_(NUM_%$212_0$25-PERCENT_^1_(NUM_%$082_0$26-AMPERSAND_^1_(NUM_%$022_0$27-APOSTROPHE_^1_(NUM_%$222_0$28-OPENING PAREN._^1_(NUM_%$822_0$29-CLOSING PAREN._^1_(NUM_'$422_1$2A-ASTERISK_^1_(NUM_'$800_1$2B-PLUS_^1_(NUM_%$242_0$2C-COMMA_^1_(NUM_%$400_0$2D-MINUS_^1_(NUM_%$842_0$2E-PERIOD_^1_(NUM_%$300_0$2F-SLASH_^1_(NUM_%$200_0$30-ZERO_^1_(NUM_%$100_0$31-ONE_^1_(NUM_%$080_0$3€€2-TWO_^1_(NUM_%$040_0$33-THREE_^1_(NUM_%$020_0$34-FOUR_^1_(NUM_%$010_0$35-FIVE_^1_(NUM_%$008_0$36-SIX_^1_(NUM_%$004_0$37-SEVEN_^1_(NUM_%$002_0$38-EIGHT_^1_(NUM_%$001_0$39-NINE_^1_(NUM_%$012_0$3A-COLON_^1_(NUM_%$40A_0$3B-SEMICOLON_^1_(NUM_%$80A_0$3C-LESS THAN_^1_(NUM_%$042_0$3D-EQUAL_^1_(NUM_%$00A_0$3E-GREATER THAN_^1_(NUM_%$882_0$3F-QUESTION MARK_^1_(NUM_%$206_0$40-AT_^1_(NUM_%$900€€_0$41-A_^1_(NUM_%$880_0$42-B_^1_(NUM_%$840_0$43-C_^1_(NUM_%$820_0$44-D_^1_(NUM_%$810_0$45-E_^1_(NUM_%$808_0$46-F_^1_(NUM_%$804_0$47-G_^1_(NUM_%$802_0$48-H_^1_(NUM_%$801_0$49-I_^1_(NUM_%$500_0$4A-J_^1_(NUM_%$480_0$4B-K_^1_(NUM_%$440_0$4C-L_^1_(NUM_%$420_0$4D-M_^1_(NUM_%$410_0$4E-N_^1_(NUM_%$408_0$4F-O_^1_(NUM_%$404_0$50-P_^1_(NUM_%$402_0$51-Q_^1_(NUM_%$401_0$52-R_^1_(NUM_%$280_0$53-€HS_^1_(NUM_%$240_0$54-T_^1_(NUM_%$220_0$55-U_^1_(NUM_%$210_0$56-V_^1_(NUM_%$208_0$57-W_^1_(NUM_%$204_0$58-X_^1_(NUM_%$202_0$59-Y_^1_(NUM_%$201_0$5A-Z_^1_(NUM_%$812_0$5B-OPENING BRACKET_^1_%NUM_($282_0$5C - REVERSE SLASH_^1_(NUM_%$412_0$5D-CLOSING BRACKET_^1_(NUM_%$406_0$5E-UP ARROW_^1_%NUM_($20A_0$5F - LEFT ARROW_^1_%END_]_^__ HPCP029 CSY/ C48 P€1_%NAM CP029_(DECK-ID C48 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_*EBCDIC (029) CARD PUNCH TABLE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1_%ENT CDPC_^1_%SPC 2_^1CDPC_!NUM_($000_0$20-SPACE_^1_%NUM $806_)$21-EXCLAMATION_^1_%NUM $0006_($22-QUOTES_^1_%NUM $042_)$23-NUMBER_^1_%NUM $442_)€€$24-DOLLAR_^1_%NUM $222_)$25-PERCENT_^1_%NUM $800_)$26-AMPERSAND_^1_%NUM $012_)$27-APOSTROPHE_^1_%NUM $812_)$28-OPENING PAREN._^1_%NUM $412_)$29-CLOSING PAREN._^1_%NUM $422_)$2A-ASTERISK_^1_%NUM $80A_)$2B-PLUS_^1_%NUM $242_)$2C-COMMA_^1_%NUM $400_)$2D-MINUS_^1_%NUM $842_)$2E-PERIOD_^1_%NUM $300_)$2F-SLASH_^1_%NUM $200_)$30-ZERO_^1_%NUM $100_)$31-ONE_^1_%NUM $080_)$32-€€TWO_^1_%NUM $040_)$33-THREE_^1_%NUM $020_)$34-FOUR_^1_%NUM $010_)$35-FIVE_^1_%NUM $008_)$36-SIX_^1_%NUM $004_)$37-SEVEN_^1_%NUM $002_)$38-EIGHT_^1_%NUM $001_)$39-NINE_^1_%NUM $082_)$3A COLON_^1_%NUM $40A_)$3B-COLON_^1_%NUM $822_)$3C-LESS THAN_^1_%NUM $00A_)$3D-EQUAL_^1_%NUM $20A_)$3E-GREATER THAN_^1_%NUM $206_)$3F-QUESTION MARK_^1_%NUM $022_)$40-AT_^1_%NUM $900_)$41-€€A_^1_%NUM $880_)$42-B_^1_%NUM $840_)$43-C_^1_%NUM $820_)$44-D_^1_%NUM $810_)$45-E_^1_%NUM $808_)$46-F_^1_%NUM $804_)$47-G_^1_%NUM $802_)$48-H_^1_%NUM_($801_0$49-I_^1_%NUM $500_)$4A-J_^1_%NUM $480_)$4B-K_^1_%NUM $440_)$4C-L_^1_%NUM $420_)$4D-M_^1_%NUM_($410_0$4E-N_^1_%NUM $408_)$4F-O_^1_%NUM $404_)$50-P_^1_%NUM $402_)$51-Q_^1_%NUM $401_)$52-R_^1_%NUM $280_)$53-S_^1_%€>NUM $240_)$54-T_^1_%NUM $220_)$55-U_^1_%NUM $210_)$56-V_^1_%NUM $208_)$57-W_^1_%NUM $204_)$58-X_^1_%NUM $202_)$59-Y_^1_%NUM $201_)$5A-Z_^1_%NUM $882_)$5B-OPENING BRACKET_^1_%NUM $282_)$5C-REVERSE SLASH_^1_%NUM $482_)$5D-CLOSING BRACKET_^1_%NUM $406_)$5E-UP ARROW_^1_%NUM $212_)$5F-UNDERSCORE_^1_%END_]_^__ >PQCDDMY CSY/ C49 Ph1_%NAM QCDDMY_'DECK-ID C49 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$SYSTEM INITIALIZER DUMMY CARD READER DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1_%ENT QCARD_^1_%ENT ECARD_^1QCARD NUM $FFFF_(DUMMY ENTRY_^1ECARD NUM 0_,DUMMY EQUIPMENT CODE_^1_%END_]_^__hPQMTDMY CSY/ C50 Ph1_%NAM QMTDMY_'DECK-ID C50 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$SYSTEM INITIALIZER DUMMY MAG TAPE DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1_%ENT QMTAPE_^1_%ENT EMTAPE_^1QMTAPE NUM $FFFF_(DUMMY ENTRY_^1EMTAPE NUM 0_,DUMMY EQUIPMENT CODE_^1_%END_]_^__ hPQPRDMY CSY/ C51 P€1_%NAM QPRDMY_'DECK-ID C51 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$SYSTEM INITIALIZER DUMMY LINE PRINTER DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_$SPC 3_^1_%ENT QPRINT_^1_%ENT EPRINT_^1_%ENT FORMFD_^1_%ENT HEADR1_^1QPRINT NUM $FFFF_(DUMMY ENTRY_^1EPRINT NUM 0_,DUMMY EQUIPMENT CODE_^1€.FORMFD NUM 0_^1_%BSS HEADR1(4)_^1_%END_]_^__.PD18335 CSY/ C52 P€1_%NAM D18335_'DECK-ID C52 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1************************************************************************_^1*_]_'*_^1*_*F L E X I B L E_!D I S K_!D R I V E R_3*_^1*_]_'*_^1***************€€*********************************************************_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT DIFFDD_'DRIVER ADDRESS COMPARE ROUTINE_^1_%ENT I18335_'FDD INITIATOR ENTRY_^1_%ENT INCFDD_'INCLUDES $FFFF IN INCREMENT COUNT_^1_%ENT STFDD_(STARTING ENTRY FOR LEVEL I DIAGNOSTIC_^1_%ENT YFDD_)DRIVER SCHEDULE ROUTINE_^1_%ENT ZFDD_)DRIVER EXIT ROUTINE (TO DISPATCHER)_^1*_]_^1*_9** EXTER€€NALS **_^1*_]_^1_%EXT* CFDD_)CONTINUATOR ENTRY_^1_%EXT COMPV4_'16 BIT ADDRESS COMPARE_^1_%EXT* EFDD_)TIME OUT ENTRY_^1_%EXT* HFDD_)FORMAT/UNFORMAT I/O_^1_%EXT* GFDD_)GET ADDERSS OF SECTOR_^1_%EXT* KFDD_)FDD KERNEL ENTRY_^1_%EXT* LOGFDD_'LOG ERROR IN ENGINEERING LOG_^1_%EXT* MFDD_)PROCESS MOTION REQUEST_^1_%EXT MAS300_'RELEASE DRIVER ASSIGNMENT TO PDT_^1_%EXT* OFDD_)OVERLAY PROCES€€SOR_^1_%EXT* PFDD_)ISSUE ILLEGAL CONTROLLER FCNS IF REQUESTED_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*LOW CORE VALUES_^1*_]_^1_%EQU ACMPRQ($B6)_!ADDRESS OF COMPLETE REQUEST_^1_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU AFNR($B5)_#ADDRESS OF FIND NEXT REQUEST_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1_%EQU ANABS($BF)_"ADDRESS OF N ABSOLUTTIZING ROUTINE_^1_%EQU BITFLG($2A)€€_!LOW CORE BIT TABLE_^1_%EQU ZERO(2)_%ADDRESS OF ZERO_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*DEFINE REQUEST OPTIONS IN ESTAT1_^1*_]_^1_%EQU WRITE(1)_$00 WRITE REQUEST_^1_%EQU FORMAT(2)_#01 FORMATTED REQUEST_^1_%EQU PRIMES(4)_#02 PRIMED REQUEST_^1_%EQU ASCII(8)_$03 ASCII REQUEST_^1_%EQU DLU($10)_$04 DIAGNOSTIC LU_^1_%EQU COUNT($20)_"05 WORD COUNT NONZERO_^1*_$EQU ($4€€0)_(06 NOT USED_^1_%EQU DELREC($80)_!07 DELETED RECORD_^1_%EQU ABSSEC($100) 08 ABSOLUTE SECTOR REF._^1_%EQU MMBIT($200)_!09 M. M. BIT_^1_%EQU STATUS($400) 10 STATUS ONLY_^1_%EQU SEEK($800)_"11 SEEK ONLY_^1_%EQU INIT($1000)_!12 INITIALIZATION_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRI€€MER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERR€€OR DETECTED_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*SELECTIVE STATUS BIT MASK:_^1*_]_^1_%EQU SLMSK1(ASCII+PRIMES+WRITE)_/DELETED RECORD_^1_%EQU SLMSK2(0)_@TRACK 0 REF_^1_%EQU SLMSK3(MMBIT)_FLOW_^1*_>----_^1*_]_^1*_*THE ORDER OF PROCESSING BY GFDD IS AS FOLLOWS:_^1*_]_^1*_+1. DETERMINE IF WORD OR SECTOR REQUEST_^1*_+2. FIND ADDRESS OF MASS MEMORY REQUEST_^1*_.PARAMETER INFORMATION_^1*_+3. CONVERT WORD ADDRESS TO SECTOR A€€ND OFFSET_^1*_+4. CHECK FOR BAD PARAMETER VALUE_^1*_+5. BIAS NON ABSOLUTE REQUEST TO TRACK 1_^1*_+6. SAVE LAST SECTOR AND OFFSET_^1*_+7. VERIFY LOGICAL SECTORS DO NOT OVERFLOW UNIT_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*SABS - CALCULATE PARAMETER ENTRY POSITION TO_^1*_1BUFFER ADDRESS_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_;PARAMETERS_^1*_;----------_^1*_*FDD PHYS€€ICAL DEVICE TABLE_^1*_]_^1_%EQU ELVL(0)_%00 SCHEDULER CALL WITH DRIVER LEVEL_^1_%EQU EDIN(1)_%01 DRIVER INITIATOR ENTRY_^1_%EQU EDCN(2)_%02 DRIVER CONTINUATOR ENTRY_^1_%EQU EDPGM(3)_$03 DRIVER DIAGNOSTIC ENTRY_^1_%EQU EDCLK(4)_$04 DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'05 LOGICAL UNIT_^1_%EQU EPTR(6)_%06 PARAMETER LOCATION_^1_%EQU EWES(7)_%07 CONVERTOR, EQUIPMENT, STATION€€_^1_%EQU EREQST(8)_#08 REQUEST STATUS_^1_%EQU ESTAT1(9)_#09 DRIVER STATUS_^1_%EQU ECCOR(10)_#10 CURRENT LOCATION_^1_%EQU ELSTWD(11)_"11 LAST LOCATION PLUS ONE_^1_%EQU ESTAT2(12)_"12 DEVICE STATUS_^1_%EQU MASLGN(13)_"13 DRIVER LENGTH (IF MASS MEMORY)_^1_%EQU MASSEC(14)_"14 NAME ASSOCIATED WITH SECTOR NUMBER_^1_%EQU RETURN(15)_"15 RESERVED FOR FNR AND CMR_^1_%EQU FLT€€COD(16)_"16 FAULT CODE IF A REQUEST ERROR OCCURS_^1_%EQU DIAGLU(17)_"17 DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"18 COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"19 MICRO-INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"20 TIMEOUT PERIOD TO WAIT FOR AN INTERRUPT_^1_%EQU UNITST(21)_"21 START OF UNIT STATUS TABLE_^1_%EQU SENTRY(21)_"21 STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(2€€2)_"22 STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"23 STATUS AFTER INTERRUPT TIMEOUT_^1_%EQU CONLST(24)_"24 START OF CONTROLLER STATUS TABLE_^1_%EQU RAWSI2(24)_"24 CONTROLLER INITIATOR STATUS_^1_%EQU RAWSC2(25)_"25 CONTROLLER CONTINUATOR STATUS_^1_%EQU RAWSE2(26)_"26 CONTROLLER TIME OUT STATUS_^1_%EQU BADTKS(27)_"27 DEFINE BAD TRACKS OF DISKETTE_^1*_*BITS 15-8 : FIRST B€€AD TRACK NUMBER IN EBDIC V_^1*_*BITS 7-0 : SECOND BAD TRACK NUMBER IN EBDIC V_^1_%EQU SECTRK(28)_"28 NUMBER OF SECTORS PER TRACK_^1_%EQU WRDSEC(29)_"29 NUMBER OF WORDS PER SECTOR_^1_%EQU TRKSEC(30)_"30 CURRENT TRACK/SECTOR_^1*_*BITS 15-8 : TRACK NUMBER 0-76_^1*_*BITS 7-0 : SECTOR NUMBER 1-SECTRK_^1_%EQU SECTOR(31)_"31 STARTING LOGICAL SECTOR FOR REQUEST_^1_%EQU LGLSEC(32€€)_"32 LAST LOGICAL SECTOR FOR REQUEST_^1_%EQU WRDFWA(33)_"33 WORD ADDRESSABLE SECTOR OFFSET, 1ST SECTOR_^1_%EQU WRDLWA(34)_"34 SECTOR OFFSET FOR END OF DATA IN REQUEST_^1_%EQU CWABUF(35)_"35 CURRENT 1ST WORD ADDRESS_^1_%EQU FWABUF(36)_"36 FWA WITHIN USER'S BUFFER FOR KERNEL CALL_^1_%EQU LWABUF(37)_"37 LWA WITHIN USER'S BUFFER FOR KERNEL CALL_^1_%EQU CFWA(38)_$38 NFDD C€€URRENT FWA_^1_%EQU CLWA(39)_$39 NFDD CURRENT LWA_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FDD PHYSICAL TABLE (CONTINUED)_^1*_]_^1*_]_^1_%EQU PARLST(40)_"40 SPEUDO COMPLETION PARAMETER LIST_^1*_*PARLST(41)_"41 -43 REMAINDER OF LIST_^1*_*WORD 0 : REQUEST CODE_^1*_/1 : COMPLETION ADDRESS_^1*_/2 : THREAD WORD (SCRATCH LOCATION)_^1*_/3 : LU WORD - V FIELD (SCRATCH LOCATION)_^1_%EQU€€ MOTREQ(42)_"42 MOTION OPTIONS_^1*_*4 BIT BYTE CODE:_^1*_*0 - TERMINATES REQUEST_^1*_*1 - PRIMES REQUEST_^1*_*2 - REQUEST NO DATA COMPARE_^1*_*3 - DATA COMPARE ON WRITE_^1*_*4 - READ AND WRITE MODE DISKETTE_^1*_*5 - READ ONLY DISKETTE_^1*_*6 - NOT USED_^1*_*7 - NOT USED_^1_%EQU BADBIT(42)_"42 SAVED BAD STATUS BITS_^1_%EQU FWA(42)_%42 XFER ROUTINE FWA_^1_%EQU LWA(43)_%43 XFE€€R ROUTINE LWA_^1_%EQU RCVCNT(43)_"43 THRESHOLD RECOVERY COUNT IN LFDD_^1_%EQU RDCNT(44)_#44 READ RECOVERY OPTIONS_^1*_*BITS 15-11: ATTEMPTS TO ZERO SEEK_^1*_/10- 6: NUMBER OF OFF TRACK SEEKS_^1*_05- 0: NUMBER OF CONTINUOUS REREADS_^1_%EQU WRCNT(45)_#45 WRITE RECOVERY OPTIONS_^1*_*BITS 15-11: ATTEMPTS TO ZERO SEEK_^1*_/10- 6: NUMBER OF OFF TRACK SEEKS_^1*_05- 0: NUMBER OF CONT€€INUOUS REWRITES_^1_%EQU ERRCNT(46)_"46 ERROR COUNT OF MEDIA ERRORS WITHIN REQUEST_^1_%EQU ERRCOV(47)_"47 NUMBER OF ERROR RECOVERIES FROM MEDIA ERRS_^1_%EQU LOGRCV(48)_"48 LOGGING RECOVERY INTERVAL_^1_%EQU PASCNT(49)_"49 PASS COUNTER FOR I/O PROGRESSION IN NFDD_^1_%EQU SCRSEC(50)_"50 STARTING SECTOR IN WORD ADDRESSABLE BUFFER_^1_%EQU SECNUM(51)_"51 USEABLE SECTOR COUNT I€€N ABUFF BUFFER_^1_%EQU SECCNT(52)_"52 MAXIMUM SECTOR COUNT FOR ABUFF BUFFER_^1_%EQU ABUFF(53)_#53 ADDRESS OF WORD ADDRESSABLE BUFFER_^1_%EQU BUFSIZ(54)_"54 BUFFER SIZE IN WORDS OF ABUFF_^1_%EQU BUFADR(55)_"55 ADDRESS OF WRITE COMPARE BUFFER_^1_%EQU BUFLEN(56)_"56 BUFFER LENGTH IN WORDS OF BUFADR_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FDD PHYSICAL TABLE (CONTINUED)_^1*_]€€_^1*_]_^1_%EQU PRIME(57)_#57 PRIMED REQUEST FLAG- START OF OPTWRD TABLE_^1_%EQU OPTWRD(PRIME) 57 DISKETTE OPTION TABLE_^1*_*OPTION NOT IN EFFECT IF WORD IS ZERO_^1*_*WORD 0 : PRIMED REQUEST_^1*_/1 : WRITE COMPARE_^1*_/2 : READ ONLY_^1*_/3 : NOT USED (SCRATCH LOCATION)_^1_%EQU FBTBUF(PRIME+1)_!58-63 BAD TRACK SECTOR BUFFER_^1*_*WORDS 1-3 OF OPTWRD TABLE OVERLAP BAD SECTOR BUFFE€€R_^1*_*WORD 3 : 1ST BAD TRACK_^1*_/4 : NOT USED (SCRATCH LOCATION)_^1*_/5 : 2ND BAD TRACK_^1_%EQU SBUFSZ(FBTBUF+2) 60 SCRATCH BUFFER SIZE_^1_%EQU INDENT(FBTBUF+4) 62 SECTOR INDENTATION (OFFSET)_^1_%EQU AQDMAF(64)_"64 KERNEL FLAG BITS OPTION WORD_^1*_*BYTE NAME BIT_+FUNCTION_^1*_+AQDMAM_"0_!0-DMA XFER, 1-A/Q_^1*_+RGFILE_"1_!1-READ/WRITE REG. FILE (FOR DIAGNOSTIC LU)_^1*_90- AB€€OVE OPTION IGNORED_^1*_+IOFLAG_"2_!0- I/O NOT OCCURRING FOR UNIT_^1*_91- I/O IN PROGRESS_^1*_+SUSPND_"3_!0- NOT WAITING FOR I/O TO COMPLETE ON_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT €€ GFDD_)GET LOGICAL SECTOR_^1*_]_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* FFDD_)FAULT ROUTINE_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*LOW CORE EQUATES_^1*_]_^1_%EQU ANABS($BF)_"ADDRESS OF N(REQUEST ADDR) ABSOLUTIZING PGM_^1_%EQU MASK($3)_$MASK OF ONE BITS RIGHT JUSTIFIED_^1_%EQU SABS($BD)_#ADDRESS OF S (REQUEST ADR) ABSOLUTIZING PGM_^1_%EQU ZERO($2)_$LOW CORE ZERO VALUE€€_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BI€€T_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME€€ OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR€€_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"E€€XPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU LSB(2)_'LEAST SIGNIFICANT BITS_^1_%EQU MSB(1)_'MOST SIGNIFICANT BITS_^1_%EQU NUMTRK(75)_"NUMBER OF TRACKS/UNIT_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1_%EQU €€WDCNT(4)_$WORD COUNT OFFSET_^1****_]_^1_%EJT_]_^1GFDD_!NUM $FFFF_^1_%ENA 1_,UNIT DIVISOR IF REQUEST IN SECTORS_^1_%SFN- ESTAT1,FORMT,ONEBIT,I SKIP IF FORMATTED REQUEST_^1_%LDA- WRDSEC,I_$DIVISOR IF REQUEST IN WORDS_^1_%STA- WRDFWA,I_$TEMPORARY STORAGE FOR LOGICAL SECTOR DIVISOR_^1_%LDQ- EPTR,I_^1_%LDA- (ZERO),Q_^1_%AND* REQCOD_'REQUEST CODE_^1_%SAN SEC10_^1_%INQ WDCNT_^1_%JMP*€€ SEC20_(SYSTEM DIRECTORY REQUEST_^1SEC10 RTJ- (SABS)_^1_%TRA Q_^1SEC20 LDA- MSB,Q_^1_%SFN- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* SEC30_(NOT INITIALIZATION FUNCTION_^1_%AND- MASK+7_^1_%STA- SECTRK,I_$DEFINE SECTORS/TRACK_^1_%LDA- MSB,Q_^1_%ALS 8_^1_%AND- MASK+7_^1_%STA- WRDSEC,I_$WORDS/SECTOR_^1_%CLR A_^1SEC30 LDQ- LSB,Q_^1_%QLS 1_^1_%LLS 15_+PUT LOGICAL SECTOR OR WORD ADDRESS IN Q€€A_^1_%SOV 0_,CLEAR OVERFLOW INDICATOR_^1_%DVI- WRDFWA,I_$CONVERT WORDS TO LOGICAL SECTOR,_^1*_8IF REQUEST SPECIFIES WORDS, NOT SECTORS_^1_%SOV SEC40_(LOGICAL SECTOR ADDRESS TOO LARGE_^1_%STQ- WRDFWA,I_$WORD OFFSET (ASSUMES Q=0 IF FORMATTED)_^1*_]_^1*_$VALIDATE REFERENCED SECTORS IN RANGE_^1*_]_^1_%SAP SEC50_(LOGICAL SECTOR IN RANGE_^1SEC40 JMP* SEC100_'1ST SECTOR OUT OF RANGE_^€€1SEC50 STA- SECTOR,I_$1ST SECTOR OFFSET_^1_%LDA- SECTRK,I_^1_%SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* SEC55_(CHECK TRACK LIMITS FOR INITIALIZATION_^1_%LDQ- EPTR,I_^1_%RTJ- (ANABS)_^1_%TRQ A_,NUMBER OF WORDS IN REQUEST_^1_%CLR Q_^1_%DVI- WRDSEC,I_$DETERMINE NO. OF SECTORS USED FOR I/O_^1_%ADQ- WRDFWA,I_^1_%STQ- WRDLWA,I_$LAST WORD OFFSET IF WORD OFFSETS DO NOT OVFLOW_^1_%SBQ- WRDSEC,€€I_^1_%SQM SEC60_^1_%INA 1_,COMBINATION OF WORD OFFSETS OVERFLOW SECTOR_^1*_8BOUNDARY_^1SEC55 STQ- WRDLWA,I_^1SEC60 ADD- SECTOR,I_$LAST LOGICAL SECTOR ADDRESS_^1_%STA- LGLSEC,I_$SAVE LAST LOGICAL SECTOR ADDRESS FOR REQUEST_^1_%SFZ- ESTAT1,DIALU,ONEBIT,I_^1_%JMP* SEC90_(DIAGNOSTIC LU CAN REFERENCE TRACK 77_^1_%SQZ SEC70_(NO WORDS OFFSET IN SECTOR_^1_%INA 1_,ROUND UP TO NEXT SEC€€TOR_^1_%CLR Q_^1SEC70 DVI- SECTRK,I_^1_%SQZ SEC80_(EVEN NUMBER OF TRACKS_^1_%INA 1_,ROUND UP TO NEXT TRACK_^1SEC80 INA -NUMTRK_%IS LAST SECTOR IN UNIT_^1_%SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%INA NUMTRK-77-1_!INITIALIZATION LOGICALLY ADDRESSES ALL TRACKS_^1_%SAP SEC100_'NO, SECTOR TOO LARGE_^1SEC90 JMP* (GFDD)_'RETURN_^1*_]_^1*_]_^1SEC100 ENA RANGE_(SECTOR ADDRESS(S) OUT OF RAN€`GE_^1_%JMP FFDD_)REPORT ERROR_^1_%SPC 5_^1REQCOD NUM $3E00_(REQUEST CODE FIELD_^1_%END_]_^__ `PKFDD CSY/ C54 P€1_%NAM KFDD_)DECK-ID C54 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8**************_^1*_8* FDD KERNEL *_^1*_8**************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE KERNEL PERFORMS THE FOLLOWING:_^1*_+1. SAVE INITIAL STATUS_^1*_+2. EXIT IF STATUS ONLY REQUEST_^1*_+3. READY CONTROLLER TO BEGIN I/O_^1*_+4. DO SEEK OR I/O OPERATION_^1*_+5. WAIT FOR INTERRUPT_^1*_+6. VERIFY THE INTERRUPT_^1*_+7. IF TIME OUT ERROR, TAKE STATUS AND EXIT TO_^1*_.THE FAULT ROUTIN€€E_^1*_+8. IF ANY ERROR, CHECK IF RECOVERY POSSIBLE_^1*_+9. RECOVER IF POSSIBLE, OTHERWISE RETURN_^1*_*10. RETURN IF NO ERRORS_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_.SFDD_$TAKE STATUS AND CHECK FOR ERRORS_^1*_.BFDD_$SELECT EOP AND UNIT INTERRUPT_^1*_.NFDD_$DO NEXT I/O STEP_^1*_.WFDD_$WAIT FOR I/O TO COMPLETE_^1*_.VFDD_$VERIFY INT€€ERRUPT_^1*_.LFDD_$LOG FAULT CODE AND ATTEMPT RECOVERY_^1*_.RFDD_$INPUT STATUS_^1*_.YFDD_$DRIVE SCHEDULER ROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT KFDD_)INITIAL ENTRY OF FDD KERNEL_^1_%ENT E18335_'TIMEOUT ERROR ENTRY OF FDD KERNEL_^1_%ENT EFDD_)TIMEOUT ERROR ENTRY OF FDD KERNEL_^1_%ENT C18335_'CONTINUATOR KERNEL ENTRY_^1_%ENT CFDD_)CONT€€INUATOR KERNEL ENTRY_^1_%ENT FFDD_)FAULT ENTRY OF FDD KERNEL_^1*_]_^1*_*FDD KERNEL COMMON SUBROUTINES_^1_%ENT IOFDD_(START SUSPENED I/O ON OTHER UNIT_^1_%ENT RFDD_)KERNEL RECEIVE (INPUT) DATA SUBROUTINE_^1_%ENT SFDD_)KERNEL DIRECTOR STATUS SUBROUTINE_^1_%ENT TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1*_*FDD KERNEL ANCILLARY SUBROUTINE€€S_^1_%EXT* BFDD_)BEGIN INPUT/OUTPUT OPERATION_^1_%EXT* WFDD_)WAIT UNTIL CURRENT INPUT/OUTPUT IS DONE_^1_%EXT* VFDD_)VERIFY THE INTERRUPT_^1_%EXT* NFDD_)DO NEXT INPUT/OUTPUT OPERATION_^1_%EXT* LFDD_)LOG AND PROCESS THE FAULT_^1_%EXT* YFDD_)DRIVER SCHEDULE ROUTINE_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_*FDD COMMANDS_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDR€€ESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FU€€NCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA WRITE DELETED RECORD_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFF(1)_#FUNCTION - READ FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTIO€€N - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE_^1*_]_^1*_]_^1*_*FDD REQUESTS_^1*_$READ_.BINARY FORMAT READ_^1*_$WRITE_-BINARY FORMAT WRITE_^1*_$WRITE DR_*ASCII FORMAT WRITE_^1*_$INITIALIZE_(ASCII REGULAR WRITE_^1*_]_^1*_]_^1*_5STATUS BIT POSITION_^1*_5*******************_^1*_$COMBINED STA€€TUS:_^1*_]_^1_%EQU UREADY(1)_#00 UNIT READY_^1_%EQU UBUSY(2)_$01 UNIT BUSY_^1_%EQU LOADED(4)_#02 HEAD LOADED_^1_%EQU SEEKZ(8)_$03 SEEKING_^1*_]_^1_%EQU IO($10)_%04 READING/WRITING_^1_%EQU INTRPT($20)_!05 INTERRUPT_^1_%EQU INTSEL($40)_!06 INTERRUPT SELECTED_^1_%EQU PARITY($80)_!07 DMA PARITY ERROR_^1*_]_^1_%EQU PROTCT($100) 08 DMA PROTECT FAULT_^1_%EQU CORE($200)_"09 DMA €€MEMORY ADDRESS FAULT_^1_%EQU LOSTDT($400) 10 LOST DATA_^1_%EQU SEEKER($800) 11 SEEK ERROR_^1*_]_^1_%EQU CRCERR($1000) 12 DATA CRC ERROR_^1_%EQU DELREC($2000) 13 DELETED RECORD_^1_%EQU PROTSW($4000) 14 PROTECT SWITCH ON_^1_%EQU CBUSY($0000) 15 CONTROLLER BUSY (CAN NOT SET BIT 15)_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_$REQUESTED STATUS:_^1*_]_^1_%EQU INITST(1)_#INITIAL ST€€ATUS_^1_%EQU CONTST(2)_#CONTINUATION STATUS_^1_%EQU TIMEST(3)_#TIME OUT STATUS_^1*_]_^1*_]_^1*_$SELECTIVE STATUS BIT MASK:_^1*_]_^1_%EQU SLMSK1(INTRPT+IO+SEEKZ+UBUSY+UREADY)_^1*_8INITIAL STATUS_^1_%EQU SLMSK2(INTSEL+INTRPT+IO+SEEKZ+UBUSY+UREADY)_^1*_8EOP CONDITION_^1_%EQU SLMSK3(0)_^1*_8TIME OUT_^1*_]_^1*_]_^1*_$EXPECTED STATUS:_^1*_]_^1_%EQU BITS1(UREADY)_^1*_8INITIAL STATUS€€_^1_%EQU BITS2(INTSEL+INTRPT+UREADY)_^1*_8EOP CONDITION_^1_%EQU BITS3(0)_^1*_8TIME OUT_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07€€)_"DELETED RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEU€€DO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SE€€CTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_€€^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1*_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WR€€ITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 - I/O IN PROGRESS_^1_%EQU SUSPND(3)_#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDR€€ESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST I/O WAS NOT INITIALIZATION_^1*_81 - LAST I/O WAS FOR INITIALIZATION_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1****_]_^1_%EJT_]_^1*_*INITIAL ENTRY OF FDD KERNEL_^1KFDD_!NUM $FFFF_^1_%LDQ* KFDD_^1_%STQ- RETURN,I_$SAVE RETURN ADDRESS_^1*_]_^1_%CLR A_,CLEAR REQUEST ERROR COUNT_^1_%STA- ERRCNT,I_^1*_]_^1_%LDA€€- PASCNT,I_^1_%SAN K05_*INITIAL STATUS ALREADY TAKEN_^1_%ENQ INITST_'INPUT, SAVE, AND CHECK STARTUP STATUS_^1_%RTJ* SFDD_^1*_]_^1_%SFZ- ESTAT1,STAT,ONEBIT,I CHECK FOR STATUS ONLY_^1_%JMP* K20_*STATUS ONLY_^1*_]_^1_%RTJ BFDD_)BEGIN INPUT/OUTPUT OPERATIONS_^1K05_"LDA- FWABUF,I_$DEFINE FWA/LWA NEEDED IF RECOVERY_^1_%STA- CFWA,I_^1_%STA- CWABUF,I_^1_%LDA- LWABUF,I_^1_%STA- CLWA,I_^€€1K10_"RTJ NFDD_)DO SEEK OR INPUT/OUTPUT OPERATION_^1_%SAM K20_*NO MORE OPERATIONS TO BE DONE_^1*_]_^1_%RTJ WFDD_)WAIT UNTIL CURRENT INPUT/OUTPUT IS DONE_^1*_]_^1*_4*********************_^1*_4* CONTINUATOR ENTRY *_^1*_4*********************_^1*_]_^1CFDD_!STQ- I_^1_%EQU C18335(CFDD) CONTINUATOR ENTRY_^1_%RTJ VFDD_)VERIFY THE INTERRUPT_^1_%JMP* K10_*DO NEXT OPERATION_^1*_]_^1*_6€€******************_^1*_6* TIME OUT ENTRY *_^1*_6******************_^1*_]_^1EFDD_!STQ- I_,SAVE PDT ADDRESS IN I_^1_%EQU E18335(EFDD) TIMEOUT ENTRY_^1_%ENQ TIMEST_'SAVE TIME OUT STATUS_^1_%RTJ* SFDD_^1_%ENA TMEOUT_'TIMEOUT ERROR CODE EQUALS ZERO_^1_%EJT 0_^1*_]_^1*_7***************_^1*_7* FAULT ENTRY *_^1*_7***************_^1*_]_^1FFDD_!RTJ* IOFDD_(SEE IF OTHER UNIT NEEDS TO BE €€SCHEDULED_^1_%RTJ LFDD_)PROCESS FAULT_^1_%JMP* K05_*YES, ATTEMPT RECOVERY_^1K20_"LDQ- RETURN,I_^1_%JMP* (ZERO),Q_$ALL DONE,EXIT KERNEL_^1_%EJT_]_^1*_]_^1*_$INPUT:_^1*_]_^1*_$Q = 1, INITIATOR CALL_^1*_$Q = 2, CONTINUATOR CALL_^1*_$Q = 3, TIME OUT_^1*_]_^1*_]_^1SFDD_!NOP 0_,INPUT, SAVE, AND CHECK STATUS_^1_%STQ* STATNO_'SAVE STATUS CALL NUMBER_^1*_]_^1_%SET A_,PRESET RAW STATUS IN€€ CASE OF REJECT_^1_%STA- UNITST-1,B_"UNIT STATUS_^1_%STA- CONLST-1,B_"CONTROLLER STATUS_^1*_]_^1_%ENQ USTATF_'INPUT FDD UNIT STATUS_^1_%RTJ* RFDD_^1_%LDQ* STATNO_'SAVE UNIT STATUS_^1_%STA- UNITST-1,B_^1*_]_^1_%ENQ CSTATF_'INPUT FDD CONTROLLER STATUS_^1_%RTJ* RFDD_^1_%LDQ* STATNO_'SAVE CONTROLLER STATUS_^1_%STA- CONLST-1,B_^1_%ALS 14_^1_%EOR- UNITST-1,B_^1_%STA- ESTAT2,I_^1*_]_^1€€_%AND* SMASKS-1,Q_"SELECT STATUS BITS TO BE EXAMINED_^1_%EOR* SCHCKS-1,Q_"CHECK FOR STATUS ERROR_^1_%SAZ S10_^1_%STA- BADBIT,I_$SAVE BAD STATUS BITS_^1_%LFA- AQDMAF,RGFILE,ONEBIT,I_^1_%LLS 16_+SWITCH A AND Q_^1_%SFZ- ESTAT1,DIALU,ONEBIT,I_^1_%SQN S10_*BOTH DIAGNOSTIC LU AND EXAMINE REGISTER FILE_^1*_8SET_^1_%JMP* FFDD_)ERROR, GO TO FAULT ROUTINE_^1*_]_^1S10_"JMP* (SFDD)_'OK STAT€€US RETURN_^1_%SPC 5_^1SMASKS ADC SLMSK1,SLMSK2,SLMSK3_^1SCHCKS ADC BITS1,BITS2,BITS3_^1_%EQU ZERO(SCHCKS+2) ZERO WORD_^1STATNO NUM 0_,GROUP STATUS NUMBER_^1_%EJT_]_^1RFDD_!NUM 0_,KERNEL RECEIVE (INPUT) DATA SUBROUTINE_^1_%STQ- FUNC,I_'SAVE FUNCTION CODE_^1_%ADQ- EWES,I_^1_%CLF- AQDMAF,INPOUT,ONEBIT,I_^1_%INP REJECT-*_^1_%JMP* (RFDD)_^1_%SPC 5_^1TFDD_!NUM 0_,KERNEL TRANMSIT€€ (OUTPUT) DATA/FCT SUBROUTINE_^1_%STQ- FUNC,I_'SAVE FUNCTION CODE_^1_%ADQ- EWES,I_^1_%SEF- AQDMAF,INPOUT,ONEBIT,I_^1_%OUT REJECT-*_^1_%JMP* (TFDD)_^1_%SPC 5_^1REJECT JMP* REJ10_(INTERNAL REJECT_^1_%ENA EXTREJ_'EXTERNAL REJECT_^1_%JMP* FFDD_)GO TO FAULT ROUTINE_^1*_]_^1REJ10 ENA INTREJ_'INTERNAL REJECT_^1*_]_^1_%JMP* FFDD_)GO TO FAULT ROUTINE_^1*_]_^1_%EJT 0_^1IOFDD NUM $FFF€€F_(CHECK IF OTHER UNIT NEEDS TO BE SCHEDULED_^1_%STA- RCVCNT,I_$SAVE A REG (MAY CONTAIN FAULT CODE)_^1_%CLF- AQDMAF,IOFLAG,ONEBIT,I CLEAR I/O IN PROGRESS FLAG_^1_%LDQ- FDDPTH,I_$CHECK IF OTHER UNIT WANTS TO DO I/O_^1_%SFN- AQDMAF,SUSPND,ONEBIT,Q_^1_%JMP* IO10_)NOT WAITING FOR I/O_^1_%ENA IO20-IO10_#SCHEDULE OTHER UNIT TO DO I/O_^1_%RTJ YFDD_,(A= RELATIVE ADDRESSTO BE SCHEDULED)_€¨^1IO10_!LDA- RCVCNT,I_$RESTORE A_^1_%JMP* (IOFDD)_%RETURN_^1IO20_!STQ- I_,SAVE PHYSTB IN I AND RESTART I/O OPERATION_^1_%JMP* K10_*DO NEXT OPERATION_^1*_]_^1_%END_]_^__¨PMFDD CSY/ C55 P€1_%NAM MFDD_)DECK-ID C55 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_6******************_^1*_6* MOTION REQUEST *_^1*_6******************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE €€FOLLOWING STEPS ARE DONE BY MFDD:_^1*_,1. CHECK FOR MOTION REQUEST_^1*_,2. IF NOT MOTION RETURN AT P+2_^1*_,3. FLAG OPTION CONDITION IN OPTWRD TABLE_^1*_,4. IF ONLY OPTION 1 SPECIFIED, RETURN P+1_^1*_,5. IF OTHER THAN OPTION 1, REQUEST BAD TRACK_^1*_/SECTOR UPDATED ON MASS MEMORY (CONTAINS_^1*_/OPTIONS). RETURN FROM MFDD AT P+2._^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^€€1*_*NONE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT MFDD_)ENTRY NAME FOR FDD MOTION PROCESSOR_^1*_]_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1*_*NONE_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*DEFINE REQUEST OPTIONS IN ESTAT1_^1*_]_^1_%EQU WRITE(1)_$00 WRITE REQUEST_^1_%EQU FORMAT(2)_#01 FORMATTED REQUEST_^1_%EQU PRIMES(4)_#02 PRIMED REQUE€€ST_^1_%EQU ASCII(8)_$03 ASCII REQUEST_^1_%EQU DLU($10)_$04 DIAGNOSTIC LU_^1_%EQU COUNT($20)_"05 WORD COUNT NONZERO_^1*_$EQU ($40)_(06 NOT USED_^1_%EQU DELREC($80)_!07 DELETED RECORD_^1_%EQU ABSSEC($100) 08 ABSOLUTE SECTOR REF._^1_%EQU MMBIT($200)_!09 M. M. BIT_^1_%EQU STATUS($400) 10 STATUS ONLY_^1_%EQU SEEK($800)_"11 SEEK ONLY_^1_%EQU INIT($1000)_!12 INITIALI€€ZATION_^1*_]_^1*_]_^1*_*LOW CORE EQUATES_^1*_]_^1_%EQU LMASK($13)_"MASK OF ZERO BITS RIGHT JUSTIFIED_^1_%EQU MASK($3)_$MASK OF ONE BITS RIGHT JUSTIFIED_^1_%EQU TWO($24)_$LOW CORE CONSTANT (VALUE 2)_^1_%EQU ZERO(2)_%LOW CORE WORD THAT CONTAINS ZERO_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU BADSEC(5)_#BAD TRACK LOGICAL SECTOR_^1_%EQU MOTOPT(4)_#OFFSET TO MOTION OPTION WORD_^€€1_%EQU WBADSC(6)_#WORDS TO TRANSFER IN BAD SECTOR_^1****_]_^1_%EJT 0_^1MFDD_!NUM $FFFF_^1_%LDQ- EPTR,I_'PARAMETER ADDRESS_^1_%LDA- (ZERO),Q_^1_%ARS 9_,CHECK FOR MOTION REQUEST_^1_%AND- MASK+4_^1_%INA -14_^1_%SAN MOT30_(NOT MOTION REQUEST_^1_%LDA- MOTOPT,Q_^1_%AND- LMASK+3_%CLEAR LOWER 4 BITS OF CODE WORD_^1MOT10 ALS 4_^1_%STA- MOTREQ,I_^1_%AND- MASK+2_'EXTRACT MOTION CODE (€€LOWER 3 BITS ONLY)_^1_%SAZ MOT40_(CHECKED ALL CODE FIELDS_^1_%CLR Q_^1_%DVI- TWO_*0 - CLEARS, 1 - SETS OPTION_^1_%LLS 16_+SWITCH A AND Q_^1_%STA- OPTWRD,B_$SELECT OPTION_^1_%SQZ MOT20_(DO NOT NEED TO UPDATE MASS MEMORY IMAGE_^1_%STQ* IO_^1MOT20 LDA- MOTREQ,I_$LOOK FOR ADDITION MOTION REQUEST_^1_%JMP* MOT10_^1MOT30 RAO* MFDD_)INDICATE: NOT MOTION REQUEST_^1MOT40 LDQ* IO_+SHOU€€LD MASS MEMORY OPTIONS BE UPDATED_^1_%SQN MOT50_^1_%JMP* MOT60_(NO, DONE WITH THE REQUEST_^1MOT50 STA* IO_+CLEAR FLAG FOR NEXT ENTRY TO MOTION_^1*_]_^1*_]_^1*_*DEFINED PARAMETERS FOR ABSOLUTE WRITE OF_^1*_*BAD TRACK SECTOR (UPDATE OPTIONS)_^1*_]_^1*_]_^1_%STA- WRDFWA,I_$STARTING SECTOR OFFSET_^1_%INA WBADSC_^1_%STA- WRDLWA,I_$ENDING SECTOR OFFSET_^1_%ENA BADSEC-1_$BAD TRACK LOG€€ICAL SECTOR_^1_%STA- SECTOR,I_$STARTING LOGICAL SECTOR_^1_%STA- LGLSEC,I_$ENDING LOGICAL SECTOR_^1_%LDA- ESTAT1,I_^1_%AND =X(-DLU-ASCII-PRIMES-FORMAT-WRITE)_^1_%INA FORMAT+WRITE SELECT ABS. BINARY FWRITE_^1_%STA- ESTAT1,I_^1_%ENA FBTBUF_^1_%ADD- I_^1_%STA- ECCOR,I_%SET FWA_^1_%STA- FWABUF,I_^1_%INA WBADSC_^1_%STA- ELSTWD,I_$SET LWA_^1_%STA- LWABUF,I_^1_%RAO* MFDD_)DO I/O_^1MOT€h60 JMP* (MFDD)_'RETURN_^1_%SPC 2_^1IO_#BZS IO_+I/O NEEDED FOR MOTION REQUEST IF NONZERO_^1_%END_]_^__hPNFDD CSY/ C56 P€1_%NAM NFDD_)DECK-ID C56 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_2**************************_^1*_2* CONTROL I/O PROCESSING *_^1*_2**************************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*A STEP BY STEP FLOW OF THIS MODULE IS DESCRIBED_^1*_*IN TABLE NFD2. THIS TABLE IS USED AS A PASS_^1*_*COUNTER IN NFDD._^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_+IOFDD_"START SUSPENDED I/O ON OTHER UNIT_^1*_+QFDD_#A/Q I/O ROUTINE_^1*_+€€RFDD_#KERNEL RECEIVE (INPUT) DATA/STATUS SUBROUTINE_^1*_+TFDD_#KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_+UFDD_#WRITE COMPARE ROUTINE_^1*_+XFDD_#DMA I/O ROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT NFDD_)DO NEXT FDD INPUT/OUTPUT OPERATION_^1_%ENT RFFDD_(READ REGISTER FILE WORD SUBROUTINE_^1*_]_^1*_9** EXTERNALS **_€€^1*_]_^1_%EXT FSTIME_'3.3 MIL SEC TIME COUNTER_^1_%EXT* FFDD_)FAULT ENTRY OF FDD KERNEL_^1_%EXT* IOFDD_(STARTS SUSPENDED I/O_^1_%EXT* RFDD_)KERNEL RECEIVE (INPUT) DATA/STATUS SUBROUTINE_^1_%EXT* QFDD_)A/Q I/O ROUTINE_^1_%EXT* TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1_%EXT* UFDD_)WRITE COMPARE ROUTINE_^1_%EXT* XFDD_)DMA I/O ROUTINE_^1_%EXT* ZFDD_)DRIVER EXIT ROUTINE_^1€€*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*FDD COMMANDS_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(0€€6)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA WRITE DELETED RECORD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFF(1)_#FUNCTION - READ FILE_^1_%EQU CSTATF(02)_"FUNCTION - CON€€TROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FDD REQUESTS_^1*_$READ_.BINARY READ_^1*_$WRITE_-BINARY WRITE_^1*_$WRITE DR_*ASCII WRITE_^1*_$INITIALIZE_(PR€€IMED ASCII FORMATTED WRITE_^1*_$SEEK ONLY_)PRIMED, ZERO WORD DIAGNOSTIC LU READ_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETE€€D RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_5STATUS BIT POSITION_^1*_5*******************_^1*_$COMBINED STATUS:_^1*_]_^1_%EQU UREADY(1)_#00 UNIT READY_^1_%EQU UBUSY(2)_$01 UNIT BUSY_^1_%EQU €€LOADED(4)_#02 HEAD LOADED_^1_%EQU SEEKZ(8)_$03 SEEKING_^1*_]_^1_%EQU IO($10)_%04 READING/WRITING_^1_%EQU INTRPT($20)_!05 INTERRUPT_^1_%EQU INTSEL($40)_!06 INTERRUPT SELECTED_^1_%EQU PARITY($80)_!07 DMA PARITY ERROR_^1*_]_^1_%EQU PROTCT($100) 08 DMA PROTECT FAULT_^1_%EQU CORE($200)_"09 DMA MEMORY ADDRESS FAULT_^1_%EQU LOSTDT($400) 10 LOST DATA_^1_%EQU SEEKER($800) 11 SEE€€K ERROR_^1*_]_^1_%EQU CRCERR($1000) 12 DATA CRC ERROR_^1_%EQU DELREC($2000) 13 DELETED RECORD_^1_%EQU PROTSW($4000) 14 PROTECT SWITCH ON_^1_%EQU CBUSY($0000) 15 CONTROLLER BUSY (CAN NOT SET BIT 15)_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*REGISTER FILE EQUATES_^1*_]_^1_%EQU IEWE(5)_%UNIT REVERSE FLAG WORD IN CONTROLLER_^1_%EQU SFA($12)_$STARTING FILE ADDRESS_^1_%EQU ST0IDX(€€$20)_!SECTORS PER TRACK FOR UNIT 0_^1*_]_'*_^1*_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL€€ REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%E€€QU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)€€_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*NFDD'S PASS OPTION_^1*_]_^1_%EQU BADTRK(0)_#BAD TRACK SEEK_^1_%EQU SUSPD1(1)_#FIRST SUSPEND_^1_%EQU SEC5RD(2)_#SECTOR 5 READ_^1_%EQU STATCK(3)_#STATUS CHECK- DEFINE WRD/SEC AND SEC/TRK_^1_%EQU EBDIC(4)_$CONVERT BAD TRACK INFO TO EBDIC_^1_%EQU EXIT2(5)_$COMPLETE NFDD PROCESSING AND LEAV€€E_^1_%EQU OFFTRK(6)_#OFF TRACK AND TRACK ZERO SEEK_^1_%EQU SCSEEK(7)_#SECTOR SEEK_^1_%EQU SUSPD2(8)_#SECOND SUSPEND_^1_%EQU DOIO(9)_%START THE I/O_^1_%EQU CONTIO(10)_"CONTINUE I/O AND CHECK STATUS_^1_%EQU ENDSP1(11)_"START I/O ON OTHER UNIT_^1_%EQU INITUF(12)_"INITIALIZE WRITE COMPARE_^1_%EQU SNSEEK(13)_"SECOND SECTOR SEEK_^1_%EQU SUSPD3(14)_"THIRD SUSPEND_^1_%EQU DOUFIO(€€15)_"START THE UFDD'S READ_^1_%EQU CONTRD(16)_"CONTINUE UFDD READ AND STATUS CHECK_^1_%EQU UFCMPR(17)_"UFDD CALL FOR WRITE COMPARE_^1_%EQU ENDSP2(18)_"START I/O ON OTHER UNIT_^1_%EQU EXIT1(19)_#COMPLETE NFDD PROCESSING AND LEAVE_^1*_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLA€€G(2)_#1 - I/O IN PROGRESS_^1_%EQU SUSPND(3)_#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#€€0 - LAST I/O WAS NOT INITIALIZATION_^1*_81 - LAST I/O WAS FOR INITIALIZATION_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU BADSEC(5)_#PHYSICAL BAD TRACK, SECTOR ADDRESS_^1_%EQU ONEBIT(1)_#ONE BIT FILED SIZE_^1_%EQU WBADSC(6)_#WORDS TO TRANSFER IN BAD SECTOR_^1****_]_^1_%EJT_]_^1NFDD_!NUM 0_^1NFD1_!LDQ- PASCNT,I_$CHECK FOR NEXT OPERATION_^1_%LDQ* NFD2,Q_'EXECUTE NEXT OPERATION_^1€€_%JMP* NFD2,Q_^1_%SPC 3_^1NFD2_!EQU NFD2(*)_"NEXT OPERATION TABLE_^1_%ADC N000-NFD2 00 SEEK TO TRACK/SECTOR 0/5_^1_%ADC N100-NFD2 01 SUSPEND, WAIT UNTIL I/O DONE ON OTHER UNIT_^1_%ADC N200-NFD2 02 INITIATE READ OF TRACK/SECTOR 0/5_^1_%ADC N300-NFD2 03 CONTINUATOR READ CYCLE_^1_%ADC N400-NFD2 04 SAVE BAD TRACKS FROM TRACK/SECTOR 0/5_^1_%ADC N500-NFD2 05 EXIT_^1_%ADC N€€600-NFD2 06 SEEK TO ZERO OR OFF TRACK (ERROR RECOVERY)_^1_%ADC N700-NFD2 07 SEEK TO DATA'S TRACK/SECTOR_^1_%ADC N800-NFD2 08 SUSPEND, WAIT UNTIL I/O DONE ON OTHER UNIT_^1_%ADC N900-NFD2 09 INITIATE READ, WRITE, OR INITIALIZE_^1_%ADC N1000-NFD2 10 CHECK STATUS, CONTINUE I/O IF A/Q_^1_%ADC N1100-NFD2 11 START SUSPENDED I/O ON OTHER UNIT_^1_%ADC N1200-NFD2 12 UNIT COMPARE IN€€ITIALIZER_^1_%ADC N1300-NFD2 13 SEEK TO DATA'S TRACK/SECTOR_^1_%ADC N1420-NFD2 14 SUSPEND, WAIT UNTIL I/O DONE ON OTHER UNIT_^1_%ADC N1500-NFD2 15 INITIATE READ_^1_%ADC N1600-NFD2 16 CHECK STATUS, CONTINUE I/O IF A/Q_^1_%ADC N1700-NFD2 17 UNIT COMPARE_^1_%ADC N1800-NFD2 18 START SUSPENDED I/O ON OTHER UNIT_^1_%ADC N1900-NFD2 19 EXIT_^1_%EJT_]_^1_%SPC 1_^1N000_!LDA- ESTAT1,I€€_$CHECK IF INITIALIZE FUNCTION_^1_%ALS 15-INITZ_^1_%SAM N010_)YES, SKIP BAD TRACK READ IN_^1*_]_^1_%ENQ DOIO-1_'DO I/O_^1_%SFZ- AQDMAF,RGFILE,ONEBIT,I_^1_%JMP* N015_)SKIP EVERYTHING BUT REG FILE FCN_^1_%LDA- ESTAT2,I_$CHECK IF NEW FDD INSERTED (INTERRUPT NOT SEL)_^1_%ALS 9_^1_%SAP N020_,YES, READ IN BAD TRACK DATA_^1N010_!ENQ SCSEEK-1_$EXECUTE SEEK TO DATA,S TRACK/SECTOR_^1N0€€15_!JMP N1920_(EXIT NFDD AND KERNEL_^1*_]_^1N020_!ENA BADSEC_'SEEK TO TRACK/SECTOR 0/5_^1_%JMP* N1330_^1_%SPC 3_^1*N100 JMP* N1410_(CHECK IF UNIT AT TRACK/SECTOR 0/5_^1_%SPC 3_^1N200_!ENA 1_^1_%XFA 1_,SPECIFY FIRST PASS TO DATA TRANSFER ROUTINE_^1_%LDQ- I_^1_%INQ FBTBUF_'FWA_^1_%TRQ A_^1_%INA WBADSC_'LWA_^1_%JMP N1510_^1*_]_^1*_*DEFINE SECTORS/TRACK AND WORDS/SECTOR_^1*_€€]_^1N300_!ENA IEWE_)LOOK AT UNIT REVERSE FLAG_^1_%RTJ* RFFDD_^1_%ARS 15-4_)PUT UNIT REVERSE FLAG IN BIT POSITION 4_^1_%EOR- EWES,I_'IF UNIT REVERSE, TOGGLE UNIT BIT_^1_%AND =N$10_(LOOK AT ONLY BIT 4_^1_%INA ST0IDX-1_$OFFSET TO PROPER UNIT TABLE_^1_%RTJ* RFFDD_^1_%AND* H00FF_(CLEAR UPPER BYTE_^1_%STA- SECTRK,I_$SAVE SECTORS/TRACK_^1_%ENA SFA-1_^1_%RTJ* RFFDD_(READ START OF DATA€€ AREA IN REGISTER FILE_^1_%AND* H00FF_^1_%TCA A_^1_%ADD =N$100_^1_%ARS 1_^1_%STA- WRDSEC,I_$SAVE WORDS/SECTOR_^1_%JMP* N1600_(WAIT FOR I/O TO FINISH_^1_%SPC 1_^1H00FF NUM $00FF_^1_%SPC 5_^1N400_!LDA- FBTBUF+3,I_"CONVERT FIRST BAD TRACK TO BINARY_^1_%RTJ* CVTBS_^1_%ALS 8_^1_%STA- BADTKS,I_^1*_]_^1_%LDA- FBTBUF+5,I_"CONVERT SECOND BAD TRACK TO BINARY_^1_%RTJ* CVTBS_^1_%EOR- B€€ADTKS,I_^1_%STA- BADTKS,I_$SAVE BAD TRACKS IN PHYSTB_^1*_]_^1_%JMP* N1800_(START I/O ON OTHER UNIT_^1*_]_^1_%EQU STAT1(CRCERR+SEEKER+LOSTDT+CORE+PROTCT+PARITY)_^1_%EQU STAT2(INTSEL+INTRPT+IO+SEEKZ+UBUSY+UREADY)_^1STAMSK ADC STAT1+STAT2_^1TIME_!ADC FSTIME_'3.3 MIL SEC TIME COUNTER_^1_%EJT_]_^1*N500 JMP N1900_(EXIT BAD TRACK LOGIC_^1_%SPC 5_^1*N600 JMP* N1340_(SEEK TO TRACK Z€€ERO OR OFF TRACK_^1_%SPC 5_^1*N700 JMP* N1300_(SEEK TO DATA'S TRACK SECTOR_^1_%SPC 5_^1*N800 JMP* N1400_(SUSPEND, WAIT FOR I/O_^1_%SPC 5_^1*N900 JMP* N1500_(INITIATE I/O_^1_%SPC 5_^1*N1000 JMP* N1600_(CONTINUE I/O, CHECK STATUS_^1_%SPC 5_^1*N1100 JMP* N1800_(START I/O ON OTHER UNIT IF NECESSARY_^1_%SPC 5_^1*N1200 JMP* N1700_(INITIALIZE FOR WRITE COMP+RE_^1_%EJT_]_^1N1300 €€SFN- ESTAT1,RW,ONEBIT,I_^1_%EQU N700(N1300)_^1_%JMP* N1320_(READ ONLY_^1_%ENA IEWE-1_^1_%RTJ* RFFDD_^1_%TRA Q_,INIT. AND WRITE ENABLE FLAGS_^1_%QLS 15-2_^1_%ENA INITER_'INITIALIZATION FAULT CODE_^1_%SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%SQP N1310_(INITIALIZATION NOT ENABLED_^1_%QLS 15-0_^1_%ENA WRITER_'WRITE NOT ALLOWED FAULT CODE_^1_%SQP N1310_(REPORT ERROR_^1_%LDQ- OPTWRD+2,I_^€€1_%SQZ N1320_(NOT READ ONLY REQUEST_^1_%LDQ- SECTOR,I_^1_%INQ -BADSEC+1_^1_%SQZ N1320_(ALLOW UPDATE OF BAD TRACK SECTOR_^1N1310 JMP* N1610_(REPORT FAULT TO FAULT ROUTINE_^1N1320 ENQ DEFBTF_'DEFINE THE BAD TRACKS_^1_%LDA- BADTKS,I_^1_%RTJ TFDD_^1_%LDA- SECTOR,I_$CONVERT SECTOR TO TRACK/SECTOR FORMAT_^1_%CLR Q_^1_%DVI- SECTRK,I_^1_%INQ 1_^1_%ALS 8_^1_%AAQ A_^1N1330 STA- T€€RKSEC,I_$SAVE IN PHYSTB_^1*_]_^1_%ENQ TSTATF_'READ IN TRACK/SECTOR STATUS_^1_%RTJ RFDD_^1_%EOR- TRKSEC,I_$CHECK IF ALREADY AT THAT POSITION_^1_%SAZ N1350_+YES, SKIP SEEK COMMAND_^1*_]_^1_%LDA* (TIME)_'TIME COUNTER AT START OF SEEK_^1_%STA- SEEKT1,I_^1N1340 LDA- TRKSEC,I_$SEEK TO TRACK/SECTOR_^1_%EQU N600(N1340)_^1_%ENQ SEEKF_^1_%RTJ TFDD_^1N1350 JMP* N1930_((A>0, WAIT FOR S€€EEK TO FINISH,_^1*_9A=0, ADVANCE TO NEXT STEP)_^1_%EJT 0_^1N1400 LDA* (TIME)_'TIME COUNTER AT END OF SEEK_^1_%EQU N800(N1400)_^1_%STA- SEEKT2,I_^1_%SFZ- ESTAT1,SEEKS,ONEBIT,I_^1_%JMP* N1915_(DONE - SEEK ONLY OPERATION_^1N1410 ENQ TSTATF_'READ TRACK/SECTOR STATUS_^1_%EQU N100(N1410)_^1_%RTJ RFDD_)TRKSEC DOES NOT CHANGE FOR INITIALIZATION_^1_%EOR- TRKSEC,I_$CHECK IF CORRECT_^1€€_%SAZ N1420_*YES, CONTINUE_^1_%ENA TSERR_(TRACK/SECTOR FAULT_^1_%JMP* N1610_^1*_]_^1N1420 LDQ- FDDPTH,I_$CHECK IF I/O IN PROGRESS ON OTHER UNIT_^1_%SFN- AQDMAF,IOFLAG,ONEBIT,Q CHECK FOR OTHER UNIT DOING I/O_^1_%JMP* N1810_(START I/O_^1_%SEF- AQDMAF,SUSPND,ONEBIT,I SET SUSPEND WAITING ON I/O FLAG_^1*_8REPEAT THIS STEP TO INSURE I/O NOT BUSY_^1_%JMP ZFDD_)WAIT UNTIL I/O DONE ON€€ OTHER UNIT_^1_%EJT_]_^1RFFDD NUM $FFFF_(A = INDEX OF REGISTER FILE WORD TO BE READ_^1_%ENQ SETFAF_^1_%RTJ TFDD_)SET FILE ADDRESS INDEX_^1_%ENQ READFF_^1_%RTJ RFDD_)READ CONTENTS OF REGISTER FILE WORD_^1_%JMP* (RFFDD)_^1_%SPC 3_^1CVTBS NUM $FFFF_(A = BAD SECTOR IN EBDIC_^1_%EOR =N$4040_%CHECK FOR NO BAD TRACKS_^1_%SAZ CV10_,YES, EXIT WITH A = ZERO_^1_%AND =N$0F0F_^1_%EN€€Q $F_+CONVERT FROM EBDIC TO BINARY_^1_%LAQ Q_^1_%ARS 8-3_*8*TENS DIGIT_^1_%AAQ Q_,8*TENS DIGIT + UNIT DIGIT_^1_%ARS 3-1_*2*TENS DIGIT_^1_%AAQ A_,10*TENS DIGIT+UNIT DIGIT_^1CV10_!JMP* (CVTBS)_^1_%EJT_]_^1N1500 ENA 1_^1_%EQU N900(N1500)_^1_%XFA 1_,SPECIFY FIRST PASS TO DATA TRANSFER ROUTINE_^1_%LDQ- CFWA,I_^1_%LDA- CLWA,I_^1N1510 SEF- AQDMAF,IOFLAG,ONEBIT,I INDICATE I/O IN€€ PROGRESS_^1_%CLF- AQDMAF,SUSPND,ONEBIT,I INDICATE I/O NOT SUSPENDED_^1_%JMP* N1630_^1_%SPC 5_^1N1600 LDA- ESTAT2,I_$CHECK IF STATUS OK_^1_%EQU N1000(N1600)_^1_%AND* STAMSK_^1_%INA -INTSEL-INTRPT-UREADY_^1_%SAZ N1620_^1_%STA- BADBIT,I_$SAVE BAD STATUS BITS_^1_%ENA STAERR_'STATUS FAULT(S) AFTER I/O_^1N1610 JMP FFDD_)GO TO FAULT ROUTINE_^1N1620 CLR A_^1_%XFA 1_,CONTINUATOR€€ PASS_^1N1630 SFN- AQDMAF,RGFILE,ONEBIT,I_^1_%JMP* N1640_(DMA OVERRIDE BIT NOT ON_^1_%SFZ- ESTAT1,DIALU,ONEBIT,I_^1_%JMP* N1650_(A/Q TRANSFER IF DIAGNOSTIC LU_^1N1640 SFN- AQDMAF,AQDMAM,ONEBIT,I SELECT TRANSFER MODE_^1_%JMP* N1660_(DMA TRANSFER_^1N1650 RTJ QFDD_)A/Q TRANSFER_^1_%JMP* N1670_^1N1660 RTJ XFDD_)DMA TRANSFER_^1N1670 XF1 A_^1_%JMP* N1940_(WAIT FOR I/O TO COMPLETE€€ OR GO TO NEXT STEP_^1_%SPC 5_^1N1700 RTJ UFDD_)CHECK FOR WRITE COMPARE_^1_%EQU N1200(N1700)_^1_%JMP* N1810_(DO NEXT STEP_^1_%SPC 5_^1N1800 RTJ IOFDD_(START I/O ON OTHER UNIT IF SUSPENED_^1_%EQU N1100(N1800)_^1N1810 CLR A_,DO NEXT OPERATION_^1_%JMP* N1930_^1_%SPC 3_^1N1900 LDA- ERRCNT,I_$CHECK IF ERROR OCCURRED DURING THIS REQUEST_^1_%EQU N500(N1900)_^1_%SAZ N1910_^1_€€%SFN- ESTAT1,DIALU,ONEBIT,I DO NOT RECORD DIAGNOSTIC_^1*_ADETECTED RECOVERIES_^1_%RAO- ERRCOV,I_(YES, INCREMENT ERROR RECOVERY COUNT_^1*_]_^1N1910 LDA- ESTAT2,I_$CHECK IF DELETED RECORD READ_^1_%ALS 2_^1_%SAP N1915_+NO, CONTINUE_^1_%LDA- ESTAT1,I_(YES, SET DELETED RECORD STATUS_^1_%EOR =N$2000_^1_%STA- ESTAT1,I_^1*_]_^1N1915 ENQ SCSEEK-1_$START OF I/O STEP FOR CONTINUATION_^€T1*_8KERNEL CALLS FOR REQUEST_^1N1920 SET A_,SET TO EXIT , ALL OPERATIONS DONE_^1N1925 STQ- PASCNT,I_^1_%SPC 3_^1N1930 RAO- PASCNT,I_$INCREMENT TO NEXT OPERATION_^1N1940 SAN N1960_(CHECK IF INTERRUPT WAIT NECESSARY_^1N1950 JMP NFD1_,NO, CONTINUE WITH NEXT OPERATION_^1N1960 JMP (NFDD)_*YES, WAIT FOR INTERRUPT_^1*_]_^1_%END_]_^__ TPXFDD CSY/ C57 P€1_%NAM XFDD_)DECK-ID C57 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1*_4*********************_^1*_4* DMA DATA TRANSFER *_^1*_4*********************_^1*_]_^1*_]_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE XFDD MODULE DOES THE FOLLOWING:_^1*_+1. CHECKS FOR ADDRESSING ERROR ACROSS BANK BOUNDARY_^1*_+2. DETERMINES BANK NUMBER_^1*_+3. TELLS CONTOLLER THE LAST WORD ADDRESS_^1*_+4. CALCULATES IF READ, WRITE OR DELETED WRITE FUNCTION_^1*_+5. ISS€€UES I/O FUNCTION TO CONTROLLER_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_+AFDD_(DETERMINE BANK NUMBER_^1*_+DIFFDD_%16 BIT COMPARE ROUTINE_^1*_+FFDD_(FAULT ROUTINE_^1*_+RFFDD_'READ REGISTER FILE_^1*_+TFDD_(KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT XFDD_)XFDD ENTRY POINT_^1*_]_'*_^1*_9** EXTERNALS **_^1*_]_^1_€€%EXT* AFDD_)DETERMINE BANK NUMBER_^1_%EXT* DIFFDD_'16 BIT COMPARE ROUTINE_^1_%EXT* FFDD_)FAULT ROUTINE_^1_%EXT* RFFDD_(READ REGISTER FILE_^1_%EXT* TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUES€€T_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1****_]_^€€1_%EJT 0_^1****_]_^1*E_]_^1*_*FDD COMMANDS_^1*_]_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCT€€ION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA WRITE DELETED RECORD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1*_$EQU READFA(0)_#FUNCTION- READ ADDRESS FILE_^1_%EQU READFF(1)_#FUNCTION - READ €€FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE_^1*_]_^1*_]_^1*_*NFDD'S PASS OPTION_^1*_]_^1_%EQU BADTRK(0)_#BAD TRACK SEEK_^1_%EQU SUSPD1(1)_#FIRST SUSPEN€€D_^1_%EQU SEC5RD(2)_#SECTOR 5 READ_^1_%EQU STATCK(3)_#STATUS CHECK- DEFINE WRD/SEC AND SEC/TRK_^1_%EQU EBDIC(4)_$CONVERT BAD TRACK INFO TO EBDIC_^1_%EQU EXIT2(5)_$COMPLETE NFDD PROCESSING AND LEAVE_^1_%EQU OFFTRK(6)_#OFF TRACK AND TRACK ZERO SEEK_^1_%EQU SCSEEK(7)_#SECTOR SEEK_^1_%EQU SUSPD2(8)_#SECOND SUSPEND_^1_%EQU DOIO(9)_%START THE I/O_^1_%EQU CONTIO(10)_"CONTINUE I/O€€ AND CHECK STATUS_^1_%EQU ENDSP1(11)_"START I/O ON OTHER UNIT_^1_%EQU INITUF(12)_"INITIALIZE WRITE COMPARE_^1_%EQU SNSEEK(13)_"SECOND SECTOR SEEK_^1_%EQU SUSPD3(14)_"THIRD SUSPEND_^1_%EQU DOUFIO(15)_"START THE UFDD'S READ_^1_%EQU CONTRD(16)_"CONTINUE UFDD READ AND STATUS CHECK_^1_%EQU UFCMPR(17)_"UFDD CALL FOR WRITE COMPARE_^1_%EQU ENDSP2(18)_"START I/O ON OTHER UNIT_^1_%EQ€€U EXIT1(19)_#COMPLETE NFDD PROCESSING AND LEAVE_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFT€€ER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%€€EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY€€(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU CWAIDX(6)_#CURRENT WORD ADDRESS_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1****_]_^1_%EJT 0_^1XFDD_!NUM $FFFF_(DMA TRANSFER_^1_%RAO- PASCNT,I_^1_%S1N XF03-*-1_^1_%JMP* XF20_)SECOND CALL INDICATES DONE_^1XF03_!STQ- FWA,I_(SAVE FIRST WORD ADDRESS_^1_%XF€€A 2_^1_%INA -1_^1_%S2N XF05-*-1_^1_%SET A_,ADDRESS CROSSING BANKS_^1XF05_!STA- LWA,I_^1_%RTJ DIFFDD_'CHECK IF REQUEST CROSSES BANK BOUNDARY_^1_%INA 0_,LOOK FOR $FFFF TOO_^1_%SAN XF07_)NO_^1_%ENA ERBANK_'DMA TRANSFER ACROSS BANK BOUNDARY NOT ALLOWED_^1_%SFN- ESTAT1,PRIMER,ONEBIT,I CHECK IF REQUEST IS PRIMED_^1_%JMP* FAULT_(FFDD - REQUEST NOT PRIMED_^1XF07_!ENQ LLWAF_(DEFIN€€E LWA OF DATA BUFFER_^1_%LDA- LWA,I_^1_%RTJ TFDD_^1_%RTJ AFDD_)DETERMINE BANK NUMBER_^1_%ENQ DREADF_^1_%SFN- ESTAT1,RW,ONEBIT,I_^1_%JMP* XF10_)READ REQUEST_^1_%LDA- PASCNT,I_$CHECK IF BAD SECTOR READ_^1_%INA -SEC5RD-1_^1_%SAZ XF10_)SECTOR 5 READ_^1_%INA +SEC5RD-DOUFIO_^1_%SAP XF10_)WRITE COMPARE READ CYCLE_^1_%ENQ DWRTDF_^1_%SFZ- ESTAT1,RECDEL,ONEBIT,I_^1_%JMP* XF10_)DELETE€€D RECORD_^1_%ENQ DINITF_*INITIALIZE TRACK_^1_%SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* XF10_)INITIALIZATION_^1_%ENQ DWRITF_^1XF10_!LDA- FWA,I_(FIRST WORD ADDRESS FOR DATA TRANSFER_^1_%RTJ TFDD_)INITATE DMA READ OR WRITE OR INITIALIZE_^1_%JMP* XF60_^1XF20_!ENA CWAIDX_'CHECK IF SHORT/LONG TRANSFER_^1_%RTJ RFFDD_(READ REGISTER FILE_^1_%EOR- LWA,I_^1_%SAZ XF60_,NO, CONTINUE_^1*_]_^1_%€€SFN- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* XF70_)NO INITIALIZATION_^1_%SPC 2_^1XF30_!EOR- LWA,I_(CHECK FOR SPEED DEVIATION_^1_%SUB- ECCOR,I_^1_%SUB =N5208_^1_%SAM XF40_^1_%TCA A_,ABSOLUTIZE_^1XF40_!ADD =N182_(CHECK FOR 3.5% DEVIATION ON INITIALIZE_^1XF50_!SAM XF70_)DEVIATION ERROR_^1*_]_^1*_]_^1XF60_!JMP* (XFDD)_'RETURN_^1_%SPC 3_^1XF70_!ENA LENERR_'SHORT/LONG TRANSFER ERROR_^1FAU€*LT JMP FFDD_)FAULT ROUTINE_^1_%END_]_^__*PAFDD CSY/ C58 P€1_%NAM AFDD_)DECK-ID C58 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_7***************_^1*_7* SELECT BANK *_^1*_7***************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE AFDD ROUTINE ISSUES THE BANK COMMAND_^1*_*INSTRUCTION TO THE FDD CONTROLLER_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*TFDD_)TRA€€NSMIT FUNCTION ROUTINE TO CONTROLLER_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT AFDD_)ESTABLISH BANK NUMBER_^1_%ENT AFDDBN_'LOCATION OF BANK NUMBER PASSED TO AFDD_^1_%ENT BNAFDD_'CORE RESIDENT NAME OF BANK NUMBER_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* TFDD_)TRANSMIT FUNCTION_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*FDD COMMANDS_^1*€€_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(€€07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA WRITE DELETED RECORD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFF(1)_#FUNCTION - READ FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR ST€€ATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE_^1****_]_^1_%EJT 0_^1AFDD_!NUM $FFFF_^1_%LDA* AFDDBN_'BANK NUMBER SELECTED_^1_%ENQ STBANK_^1_%RTJ TFDD_)SELECT BANK_^1_%JMP* (AFDD)_'RETURN_^1AFDDBN BZS AFDDBN_^1_%EQU BNAFDD(AFDDBN) BANK NUMBER IF CORE RE€SIDENT_^1_%END_]_^__POFDD CSY/ C59 P€1_%NAM OFDD_)DECK-ID C59 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_4**********************_^1*_4* OVERLAY PROCESSING *_^1*_4**********************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE OFDD PROCESSOR PERFORMS THE FOLLOWING:_^1*_*1. MOVES FIRST 2 WORDS OF REQUESTER'S PARAMETERS_^1*_,TO PARLST IN PDT_^1*_*2. EXITS IF WRITE REQUEST_^1*_*3. EXITS IF I/O BUFFER STARTS AFTER 4TH WORD_^1*_-OF REQUESTER'S PARAMETER LIST_^1*_*4. EXITS IF PARAMETER LIST STARTS AFTER I/O_^1*_-BUFFER_^1*_*5. IF REQUESTOR'S PARAMETER LIST OVERLAID,_^1€€*_-DEFINE EPTR TO POINT TO PARLST._^1*_*6. RETURN_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*DIFFDD - COMPARE 16 BIT ADDRESSES_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT OFDD_)OVERLAY PROCESSOR_^1*_]_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* DIFFDD_'COMPARE 16 BIT ADDRESSES_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1_%EQU ACAB€€S($BE)_"ABSOLUTIZE COMPLETION ADDRESS ROUTINE_^1_%EQU BITMSK($23)_!ONE BIT FIELD MASK TABLE_^1_%EQU COMPLT(1)_#COMPLETION PARAMETER LIST ENTRY_^1_%EQU REQCOD(0)_#REQUEST CODE PARAMETER LIST ENTRY_^1_%EQU ZERO(2)_%LOW CORE ZERO WORD_^1****_]_^1_%EJT 0_^1OFDD_!NUM $FFFF_^1_%LDQ- EPTR,I_'DEFINE SPEUDO PARAMETER LIST_^1_%RTJ- (ACABS)_%COMPUTE ABS COMPLETION ADDRESS_^1_%STQ- PARLS€€T+COMPLT,I_^1_%LDQ- EPTR,I_^1_%LDA- (ZERO),Q_$CURRENT REQUEST CODE VALUE_^1_%AND =N$BEFF_%CLEAR X AND D BITS_^1_%EOR- BITMSK+14_#SET D BIT INDICATOR FOR ABS COMPLETION ADDR_^1_%STA- PARLST+REQCOD,I_^1_%ALS 15-10_^1_%INQ 7_,THAN MSB WORD._^1_%SAM OF10_)NOT READ REQUEST_^1*_8CHECK TO SEE IF READ REQUEST OVERLAYS_^1*_8FIRST 8 WORDS OF USERS REQUEST ( NEEDED_^1*_8IF REQUEST TO BE R€€EPEATED BECAUSE_^1*_8OF ERROR)._^1_%LDA- ECCOR,I_%CHECK FOR 1ST WORD OF BUFFER GREATER_^1_%RTJ DIFFDD_'COMPV4 (16 BIT COMPARE)_^1_%INA 0_^1_%SAN OF10_)1ST 8 WORDS NOT OVERLAID_^1_%LDA- EPTR,I_^1_%LDQ- ELSTWD,I_^1_%RTJ DIFFDD_'COMPV4 (16 BIT COMPARE)_^1_%SAZ OF10_)BUFFER ENDS WORD BEFORE PARAMETER LIST_^1_%INA 0_^1_%SAN OF10_)USER'S PARAMETER LIST NOT OVERLAID_^1_%ENA PARLST€F_^1_%ADD- I_^1_%STA- EPTR,I_^1OF10_!JMP* (OFDD)_'RETURN_^1_%END_]_^__ FPQFDD CSY/ C60 P€1_%NAM QFDD_)DECK-ID C60 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_4**********************_^1*_4* A/Q DATA TRANSFERS *_^1*_4**********************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE QFDD €€MODULE PERFORMS THE FOLLOWING:_^1*_+1. EXITS WITH FAULT CODE IF ADDRESSING ABOVE 65K_^1*_+2. USES PASCNT TO DETERMINE IF BAD TRACK READ_^1*_+3. USES ESTAT1 TO DECIDE IF READ, WRITE, OR_^1*_.DELETED WRITE_^1*_+4. IF READ_^1*_.A. READ SECTOR INTO REGISTER FILE_^1*_.B. EXIT QFDD TO WAIT FOR READ TO COMPLETE_^1*_.C. READ DATA FROM REGISTER FILE IF SECTOR READ_^1*_.D. DECIDE IF MORE SEC€€TORS TO BE READ_^1*_1I. IF MORE SECTORS GO TO ITEM A_^1*_0II. IF NO MORE SECTORS, EXIT_^1*_+5. IF WRITE:_^1*_.A. TRANSFER DATA TO REGISTER FILE_^1*_.B. PAD OUT UNUSED SECTION OF SECTOR WITH ZEROS_^1*_.C. TRANSFER DATA TO DISKETTE_^1*_.D. CHECK IF ALL DATA TRANSFERED_^1*_1I. IF MORE SECTORS, LEAVE QFDD WAITING FOR_^1*_4COMPLETION OF WRITE_^1*_0II. IF NO MORE SECTORS, EXIT_^1****_]_^€€1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_+DIFFDD_!COMPARES 2 SIXTEEN BIT ADDRESSES_^1*_+FINAL_"DECIDES WHEN I/O TRANSFER IS COMPLETE_^1*_+INCFDD_!INCLUDES $FFFF IN INCREMENT COUNT_^1*_+NEXTAD_!FETCHES NEXT ADDRESS_^1*_+REGADR_!SET REGISTER TO BEGINNING OF DATA AREA_^1*_+RFDD_#CONTROLLER INPUT ROUTINE_^1*_+RFFDD_"READ REGISTER FILE_^1*_+TFDD_#CONTR€€OLLER TRANSMIT ROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT QFDD_)QFDD ENTRY NAME_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* DIFFDD_'16 BIT ADDRESS COMPARE ROUTINE_^1_%EXT* FFDD_)KERNEL FAULT ROUTINE_^1_%EXT* INCFDD_'INCLUDES $FFFF IN INCREMENT COUNT_^1_%EXT* RFDD_)KERNEL RECEIVE €€(INPUT) DATA SUBROUTINE_^1_%EXT* RFFDD_(READ REGISTER FILE WORD SUBROUTINE_^1_%EXT* TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_*FDD COMMANDS_^1*_]_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1€€_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA€€ WRITE DELETED RECORD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFA(0)_#FUNCTION - READ FILE ADDRESS_^1_%EQU READFF(1)_#FUNCTION - READ FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(€€7)_#A/Q BUFFERED DELETED WRITE_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(€€08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_*NFDD'S PASS OPTION_^1*_]_^1_%EQU BADTRK(0)_#BAD TRACK SEEK_^1_%EQU SUSPD1(1)_#FIRST SUSPEND_^1_%EQU SEC5RD(2)_#SECTOR 5 READ_^1_%EQU STATCK(3)_#STATUS CHECK- DEFINE WRD/€€SEC AND SEC/TRK_^1_%EQU EBDIC(4)_$CONVERT BAD TRACK INFO TO EBDIC_^1_%EQU EXIT2(5)_$COMPLETE NFDD PROCESSING AND LEAVE_^1_%EQU OFFTRK(6)_#OFF TRACK AND TRACK ZERO SEEK_^1_%EQU SCSEEK(7)_#SECTOR SEEK_^1_%EQU SUSPD2(8)_#SECOND SUSPEND_^1_%EQU DOIO(9)_%START THE I/O_^1_%EQU CONTIO(10)_"CONTINUE I/O AND CHECK STATUS_^1_%EQU ENDSP1(11)_"START I/O ON OTHER UNIT_^1_%EQU INITUF(12€€)_"INITIALIZE WRITE COMPARE_^1_%EQU SNSEEK(13)_"SECOND SECTOR SEEK_^1_%EQU SUSPD3(14)_"THIRD SUSPEND_^1_%EQU DOUFIO(15)_"START THE UFDD'S READ_^1_%EQU CONTRD(16)_"CONTINUE UFDD READ AND STATUS CHECK_^1_%EQU UFCMPR(17)_"UFDD CALL FOR WRITE COMPARE_^1_%EQU ENDSP2(18)_"START I/O ON OTHER UNIT_^1_%EQU EXIT1(19)_#COMPLETE NFDD PROCESSING AND LEAVE_^1*_]_^1*_]_^1*_*MISC. EQUATES_^€€1*_]_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1_%EQU SFA($12)_$STARTING FILE ADDRESS_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*AQDMAF BIT DEFINITIONS_^1*_]_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 - I/O IN PROGRESS_^1_%EQU SUSPND(3)_#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO€€ ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST I/O WAS NOT INITIALIZATION_^1*_81 - LAST I/O WAS FOR INITIALIZATION_^1*_]_^1*_]_^1*_*FAULT CODES_^1*_]_^1_%EQ€€U TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRIT€€ER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR€€_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1****_]_^1_%EJT 0_^1QFDD_!€€NUM $FFFF_^1_%S1Z XF05-*-1_$NOT FIRST SECTOR_^1_%RAO- PASCNT,I_$INDICATE FOR NEXT PASS NOT FIRST SECTOR_^1_%STA- LWA,I_(SAVE LIMITS OF DATA TRANSFER_^1_%INA 0_,SPECIAL CASE A = FFFF AND Q = 0._^1*_8A-Q = FFFF, WHICH IMPLIES Q>A._^1_%STQ- FWA,I_^1_%SAZ XF05_)LWA IS IN NEXT BANK_^1_%RTJ DIFFDD_'CHECK IF REQUEST CROSSES BANK BOUNDARY_^1_%INA 0_^1_%SAN XF05_)FWA NOT ZERO OR GREA€€TER THAN LWA_^1_%ENA ERBANK_'YES, ADDRESSING NEXT BANK NOT ALLOWED_^1_%JMP* NT10_)REPORT ERROR_^1XF05_!LDQ- PASCNT,I_$CHECK IF BAD SECTOR READ_^1_%INQ -SEC5RD_^1_%S1Z XF07-*-1_^1_%INQ -1_+PASCNT BIASED ON FIRST PASS_^1XF07_!SQZ XF15_)READ BAD TRACK FUNCTION_^1_%INQ SEC5RD-STATCK_^1_%SQZ XF20_)BAD TRACK READ_^1_%INQ STATCK-DOUFIO_^1_%SQP XF10_)READ CYCLE OF WRITE COMPARE_^1€€_%SFZ- ESTAT1,RW,ONEBIT,I CHECK FOR READ OR WRITE REQUEST_^1_%JMP* XF40_)WRITE REQUEST_^1*_]_^1*_*BUFFERRED READ_^1*_]_^1XF10_!S1Z XF20-*-1_$CONTINUATION OF READ FUNCTION_^1_%SFN- AQDMAF,RGFILE,ONEBIT,I_^1XF15_!JMP* XF35_)READ OF FIRST SECTOR TO BE PROCESSED_^1XF20_!RTJ* REGADR_'SET REGISTER FILE ADDRESS TO START OF SECTOR_^1*_]_^1_%SPC 1_^1*_8DETERMINE NUMBER OF WORDS TO MOVE T€€O USER'S_^1*_8DATA BUFFER_^1XF21_!LDA- LWA,I_(LAST WORD + 1 OF DATA TRANSFER_^1_%LDQ- FWA,I_(CURRENT WORD ADDRESS OF DATA TRANSFER_^1_%SAN XF22_)NOT SPCIAL CASE LWA=$10000_^1_%LLS 16_+SWITCH A AND Q_^1XF22_!RTJ DIFFDD_'COMPV4- COMPARE 16 BIT ADDRESS_^1_%LDQ- LWA,I_^1_%SQN XF23_)NOT SPECIAL CASE LWA=$10000_^1_%TCA A_^1_%SAM XF24_)SPECIAL CASE FWA=$1 OR DIFFERENCE GREATER_^1_%I€€NA 1_,THAN $8000_^1XF23_!SAM XF24_)DIFFERENCE GREATER THAN 8K_^1_%SUB- WRDSEC,I_^1_%SAM XF25_)LESS THAN SECTOR OF DATA TO LWA_^1XF24_!CLR A_,AT LEAST ONE SECTOR OF DATA_^1XF25_!ADD- WRDSEC,I_^1_%INA -1_^1_%XFA 2_^1XF30_!RTJ* NEXTAD_'FETCH NEXT ADDRESS_^1_%ENQ READFF_^1_%RTJ RFDD_)MOVE WORD AT A TIME FROM REGISTER FILE_^1_%STA* (ADDRES)_^1_%D2P *-XF30_^1_%RTJ* FINAL_(CHECK €€TO SEE IF DONE_^1XF35_!ENQ AREADF_'BUFFERED READ INTO REGISTER OR FILE_^1_%RTJ RFDD_^1_%JMP* XF70_)GO WAIT FOR INTERRUPT_^1_%EJT 0_^1*_]_^1*_*BUFFERRED WRITE_^1*_]_^1XF40_!RTJ* FINAL_(CHECK IF DONE_^1_%RTJ* REGADR_'SET FILE REGISTER FOR WRITE OPERATION_^1_%LDA- WRDSEC,I_^1_%INA -1_^1_%XFA 2_,LOOP COUNTER OF WORDS/SECTOR_^1XF50_!LDA- FWA,I_(CHECK TO SEE IF ALL DATA BUFFER WORDS€€ STORED_^1_%EOR- LWA,I_^1_%SAZ XF60_)STORE ZEROS FOR UNUSED PART OF LAST SECTOR_^1_%RTJ* NEXTAD_'FETCH NEXT ADDRESS_^1_%LDA* (ADDRES)_$PICK UP WORD FROM USER'S BUFFER_^1XF60_!ENQ BWRITF_'WRITE BUFFER_^1_%RTJ TFDD_^1_%D2P *-XF50_^1_%SFN- AQDMAF,RGFILE,ONEBIT,I_^1_%JMP* XF65_)NOT REGISTER FILE OPERATION_^1_%RAO- PASCNT,I_$DO NOT WANT TO VERIFY STATUS_^1_%CLR A_,INDICATE REGISTER€€ FILE OPERATION COMPLETE_^1_%JMP* XF80_)WRITE REGISTER FILE ONLY_^1XF65_!ENA INITER_'INITIALIZATION NOT ENABLED FAULT_^1_%SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* NT10_)INITIALIZATION NOT ALLOWED_^1_%ENQ AWRITF_'INDICATE BUFFERED WRITE_^1_%SFZ- ESTAT1,RECDEL,ONEBIT,I_^1_%ENQ AWRTDF_'INDICATE DELETED BUFFERED WRITE_^1_%RTJ RFDD_)ISSUE BUFFERRED WRITE OR DELETED WRITE_^1XF70_!ENA 1_,€€INDICATE THAT NFDD MUST WAIT FOR INTERRUPT_^1XF80_!XFA 1_^1XF90_!JMP* (QFDD)_'RETURN_^1_%SPC 3_^1ADDRES BSS ADDRES_'REFERENCE ADDRESS OF DATA BUFFER_^1RFADDR BSS RFADDR_'CURRENT REGISTER FILE ADDRESS_^1_%EJT 0_^1*_-***********************************_^1*_-* DETERMINE REGISTER FILE ADDRESS *_^1*_-***********************************_^1*_]_^1REGADR NUM $FFFF_(DETERMINE OFFSET TO€€ DATA BUFFER_^1_%LDA- SECTOR,I_$STARTING ADDRESS OF ABS. REQUEST_^1_%SFZ- AQDMAF,RGFILE,ONEBIT,I_^1_%JMP* RF10_)CONTROLLER REG. FILE WORDS WANTED_^1_%LDA =N$80_(DETERMINE START OF REG. FILE DATA AREA_^1_%SUB- WRDSEC,I_^1_%ALS 1_^1RF10_!STA* RFADDR_'SAVE CURRENT ADDRESS_^1_%ENQ SETFAF_'SET REGISTER FILE COMMAND_^1_%RTJ TFDD_^1_%JMP* (REGADR)_$RETURN_^1*_]_^1*_4******************€€****_^1*_4* FETCH NEXT ADDRESS *_^1*_4**********************_^1*_]_^1NEXTAD NUM $FFFF_^1_%LDQ- FWA,I_^1_%STQ* ADDRES_'SAVE ADDRESS (SPECIAL CASE FWA = $FFFF)_^1_%RTJ INCFDD_'INCLUDE $FFFF IN COUNT_^1_%STQ- FWA,I_^1_%ENQ READFA_'READ CURRENT WORD ADDRESS_^1_%RTJ RFDD_^1_%SUB* RFADDR_^1_%SAZ NT20_)ADDRESS CORRECT_^1_%ENA CONADR_'CONTROLLER ADDRESS ERROR_^1NT10_!JMP FFDD_)REGIS€€TER FILE ADDRESS BAD_^1NT20_!RAO* RFADDR_^1_%RAO* RFADDR_^1_%JMP* (NEXTAD)_$RETURN_^1_%EJT 0_^1*_]_^1*_7***************_^1*_7* SEE IF DONE *_^1*_7***************_^1*_]_^1FINAL NUM $FFFF_^1_%LDA- FWA,I_^1_%EOR- LWA,I_(CHECK IF ALL WORDS SATISFIED_^1_%SAN FI10_)MORE SECTOR(S) TO TRANSFER_^1_%XFA 1_,NEEDED FOR REG FILE OPERATION_^1_%RAO- PASCNT,I_$ALL SECTORS TRANSFERRED VIA A/Q_€D^1_%JMP* XF90_)EXIT QFDD_^1FI10_!JMP* (FINAL)_%RETURN_^1_%END_]_^__ DPUFDD CSY/ C61 P€1_%NAM UFDD_)DECK-ID C61 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_7*****************_^1*_7* WRITE COMPARE *_^1*_7*****************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE FOLLOWING STEPS ARE ACCOMPLISHED BY UFDD:_^1*_]_^1*_*1. IF NOT INITIAL CALL GO TO STEP 6 TO PERFORM_^1*_-DATA COMPARE_^1*_*2. IF I€€NITIALIZATION, USE LAST PART OF REQUESTER'S_^1*_-BUFFER FOR DATA COMPARE BUFFER_^1*_*3. GO TO STEP 10 IF WRITE COMPARE NOT NEEDED_^1*_*4. IF NOT INITIALIZATION USE SCRATCH BUFFER FOR_^1*_-DATA COMPARE BUFFER. BUFFER IS A MULTIPLE OF_^1*_-SECTOR SIZE._^1*_*5. DETERMINE LWA OF COMPARE BUFFER AND THEN EXIT_^1*_*6. COMPARE SCRATCH BUFFER WITH SECTION OF USER'S_^1*_-BUFFER. FOR INITIA€€LIZATION ONLY, UFDD CAUSES_^1*_-THE SECTOR DATA TO BE READ AND THE CRC CHECKED._^1*_*7. IF DATA DOES NOT COMPARE EXIT TO FAULT ROUTINE._^1*_*8. DETERMINE NEXT LWA OF COMPARE BUFFER_^1*_*9. SET PASCNT TO REFLECT EITHER CONTINUE TO READ_^1*_-OR ALL DONE_^1*_)10. EXIT UFDD_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_+DIFFDD_%16 BIT ADDRESS COMPARE_^€€1*_+INCFDD_%INCREMENT COUNTER (INCLUDE FFFF IN COUNT)_^1*_+LWADR_'DETERMINE LWA OF COMPARE BUFFER_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT UFDD_)WRITE COMPARE ENTRY_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* DIFFDD_'16 BIT ADDRESS COMPARE_^1_%EXT* FFDD_)KERNEL FAULT ROUTINE_^1_%EXT* INCFDD_'INCREME€€NT COUNTER (INCLUDES FFFF IN COUNT)_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU S€€ECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 - I/O IN PROGRESS_^1_%EQU€€ SUSPND(3)_#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST I/O WAS NOT INITIALIZATI€€ON_^1*_81 - LAST I/O WAS FOR INITIALIZATION_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*NFDD'S PASS OPTION_^1*_]_^1_%EQU BADTRK(0)_#BAD TRACK SEEK_^1_%EQU SUSPD1(1)_#FIRST SUSPEND_^1_%EQU SEC5RD(2)_#SECTOR 5 READ_^1_%EQU STATCK(3)_#STATUS CHECK- DEFINE WRD/SEC AND SEC/TRK_^1_%EQU EBDIC(4)_$CONVERT BAD TRACK INFO TO EBDIC_^1_%EQU EXIT2(5)_$COMPLETE NFDD PROCESSING AND LEAVE_^1_%E€€QU OFFTRK(6)_#OFF TRACK AND TRACK ZERO SEEK_^1_%EQU SCSEEK(7)_#SECTOR SEEK_^1_%EQU SUSPD2(8)_#SECOND SUSPEND_^1_%EQU DOIO(9)_%START THE I/O_^1_%EQU CONTIO(10)_"CONTINUE I/O AND CHECK STATUS_^1_%EQU ENDSP1(11)_"START I/O ON OTHER UNIT_^1_%EQU INITUF(12)_"INITIALIZE WRITE COMPARE_^1_%EQU SNSEEK(13)_"SECOND SECTOR SEEK_^1_%EQU SUSPD3(14)_"THIRD SUSPEND_^1_%EQU DOUFIO(15)_"ST€€ART THE UFDD'S READ_^1_%EQU CONTRD(16)_"CONTINUE UFDD READ AND STATUS CHECK_^1_%EQU UFCMPR(17)_"UFDD CALL FOR WRITE COMPARE_^1_%EQU ENDSP2(18)_"START I/O ON OTHER UNIT_^1_%EQU EXIT1(19)_#COMPLETE NFDD PROCESSING AND LEAVE_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIM€€E OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY€€ DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(€€68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1****_]_^1_%EJT 0_^1UFDD_!NUM $FFFF_^1_%LD€€A- PASCNT,I_^1_%INA -INITUF_^1_%SAZ UF10_)INITIALIZE FUNCTION_^1_%JMP* UF50_)COMPARE FUNCTION_^1UF10_!SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* UF30_)INITIALIZATION_^1_%ENQ EXIT1-1_%DONE WITH NFDD I/O_^1_%LDA- OPTWRD+1,I_"CHECK IF UNIT COMPARE OPTION IN EFFECT_^1_%SAZ UF20_)NO UNIT COMPARE_^1_%SFZ- AQDMAF,RGFILE,ONEBIT,I_^1_%JMP* UF20_)READ REGISTER FILE REQUEST (NO COMPARE)_^1_%LDA-€€ BUFLEN,I_^1_%SAZ UF20_)WRITE COMPARE BUFFER NOT SUPPLIED_^1_%SFN- ESTAT1,RW,ONEBIT,I CHECK IF WRITE REQUEST_^1UF20_!JMP* UF100_(NOT WRITE REQUEST (DONE WITH I/0)_^1_%CLR Q_^1_%DVI- WRDSEC,I_^1_%MUI- WRDSEC,I_$TRUNCATE BUFFER TO MULTIPLE OF SECTOR SIZE_^1_%LDQ- BUFADR,I_^1_%JMP* UF40_^1UF30_!RAO- PASCNT,I_$SKIP RESEEK TO CURRENT TRACK_^1_%LDA- SECTRK,I_^1_%MUI- WRDSEC,I_$REQUIRE€€D BUFFER SIZE TO READ ONE TRACK_^1_%TCA Q_^1_%ADQ- CLWA,I_'FWA OF BUFFER (IN CALLING PROGRAM)_^1UF40_!STQ- CFWA,I_'FWA OF COMPARE BUFFER_^1_%AAQ Q_^1_%STQ- CLWA,I_'LWA OF COMPARE BUFFER_^1_%RTJ* LWADR_(DETERMINE LWA OF SCRATCH BUFFER_^1_%JMP* UF110_(LEAVE_^1_%EJT 0_^1*_]_^1*_*WRITE COMPARE_^1*_]_^1UF50_!SFZ- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* UF90_)INITIALIZATION FUNCTION_^1_%LDA- C€€FWA,I_^1UF60_!STA* CWASCR_'CURRENT ADDRESS OF SCRATCH BUFFER TO COMPARE_^1_%EOR- CLWA,I_^1_%SAZ UF80_)DONE COMPARING SCRATCH BUFFER_^1_%LDQ- CWABUF,I_^1_%STQ* CURADR_'CURRENT ADDRESS IN USER'S BUFFER_^1_%RTJ INCFDD_'INCLUDE $FFFF IN COUNT FOR USER'S BUFFER_^1_%STQ- CWABUF,I_$NEXT CURRENT WORD ADDRESS FOR DATA COMPARE_^1_%LDA* (CURADR)_^1_%EOR* (CWASCR)_^1_%SAN UF70_)DATA COMPARE€€ ERROR_^1_%LDA* CWASCR_^1_%INA 1_,CHECK NEXT BUFFER WORD_^1_%JMP* UF60_^1UF70_!ENA DATAER_'DATA COMPARE ERROR_^1_%JMP FFDD_^1UF80_!RTJ* LWADR_(DETERMINE NEW LWA OF SCRATCH BUFFER_^1_%ENQ SUSPD3-1_$DO NEXT I/0 STEP IF NOT DONE_^1_%SAN UF100_(EXIT UFDD_^1UF90_!ENQ ENDSP2-1_$USER'S BUFFER COMPARE COMPLETE_^1UF100 STQ- PASCNT,I_^1UF110 JMP* (UFDD)_'RETURN_^1CWASCR BSS CWASCR_^€€1CURADR BSS CURADR_^1_%EJT 0_^1LWADR NUM $FFFF_^1_%LDA- LWABUF,I_$DETERMINE NUMBER OF WORDS OF USER'S BUFFER_^1_%LDQ- CWABUF,I_$THAT HAVE NOT BEEN COMPARED_^1_%RTJ DIFFDD_'16 BIT ADDRESS COMPARE_^1_%SAN LW05_^1_%JMP* LW40_)DONE WITH COMPARE OF REQUESTER'S BUFFER_^1LW05_!INA 0_^1_%SAN LW10_)BUFFER DOES NOT CROSS BANK BOUNDARY_^1_%LDA- CWABUF,I_^1_%LDQ- LWABUF,I_^1_%RTJ DIFF€€DD_^1_%TCA A_,BUFFER CROSSES BANK BOUNDARY_^1_%SAZ LW30_)SPECIAL CASE LWABUF = FFFF AND CWABUF = 0_^1_%SAM LW20_)SPECIAL CASE WHEN USER'S BUFFER IS $FFFF LONG_^1_%INA 1_,ACTUAL SIZE OF REMAINING BUFFER TO FILL_^1LW10_!SAM LW20_^1_%ADD- CFWA,I_'DETERMINE IF AREA OF USER'S BUFFER NOT YET_^1_%SUB- CLWA,I_'COMPARED IS LESS THAN SCRATCH BUFFER SIZE_^1_%SAM LW30_)UNPROCESSED AREA L€ ESS THAN SCRATCH BUFFER SIZE_^1LW20_!CLR A_,USE AS MUCH OF SCRATCH BUFFER AS POSSIBLE_^1LW30_!ADD- CLWA,I_'CALCULATIONS ASSUME CLWA AND CFWA ARE IN_^1*_8THE SAME BANK_^1_%STA- CLWA,I_'NEW LAST WORD ADDRESS OF SCRATCH BUFFER_^1LW40_!JMP* (LWADR)_%RETURN_^1_%END_]_^__ PLFDD CSY/ C62 P€1_%NAM LFDD_)DECK-ID C62 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_6******************_^1*_6* ERROR RECOVERY *_^1*_6******************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE LFDD ROUTINE PERFORMS THE FOLLOWING:_^1*_*1. PREVENTS TIME OUT INTERRUPT_^1*_*2. LOGS FAULT CODE AND SETS FA€€TAL ERROR INDICATOR_^1*_*3. CLEARS LAST INTERRUPT LEAVING INTERRUPTS SELECTED_^1*_*4. REPORTS GHOST INTERRUPTS THAT HAVE BEEN REJECTED_^1*_*5. EXITS IF NOT MEDIA ERRORS TO STEP 10_^1*_*6. REISSUES I/O IF REPEAT I/O COUNT NOT EXCEEDED_^1*_*7. IF STEP 6 EXCEEDED, SEEK OFF TRACK_^1*_*8. IF STEP 7 EXCEEDED, SEEK TRACK ZERO_^1*_*9. IF STEP 8 EXCEEDED SAVE BAD TRACK IF INITIALIZATION_^1*€€_*10.BUMP RETURN ADDRESS SINCE RECOVERY NOT POSSIBLE, RETURN_^1*_*11.CLEAR KERNEL ERROR FATAL INDICATOR IF RECOVERY ATTEMPTED_^1*_*12.RETURN_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*CGHOST_'CHECK FOR CONSTANT INTERRUPT_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT LFDD_)PROCESS THE FAULT_^1*_]_^1*_9** EXTERNALS **_^1*_€€]_^1_%EXT CGHOST_'CHECK FOR CONSTANT INTERRUPT_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_*FDD COMMANDS_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRAC€€K/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA WRITE DELETED RECORD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFF(1)_#FUNCTION - R€€EAD FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%€€EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_€€#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU €€ INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)€€_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY€€_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*NFDD'S PASS OPTION_^1*_]_^1_%EQU BADTRK(0)_#BAD TRACK SEEK_^1_%EQU SUSPD1(1)_#FIRST SUSPEND_^1_%EQU SEC5RD(2)_#SECTOR 5 READ_^1_%EQU STATCK(3)_#STATUS CHECK- DEFINE WRD/SEC AND SEC/TRK_^1_%EQU EBDIC(4)_$CONVERT BAD TRACK INFO TO EBDIC_^1_%EQU EXIT2(5)_$COMPLETE NFDD€€ PROCESSING AND LEAVE_^1_%EQU OFFTRK(6)_#OFF TRACK AND TRACK ZERO SEEK_^1_%EQU SCSEEK(7)_#SECTOR SEEK_^1_%EQU SUSPD2(8)_#SECOND SUSPEND_^1_%EQU DOIO(9)_%START THE I/O_^1_%EQU CONTIO(10)_"CONTINUE I/O AND CHECK STATUS_^1_%EQU ENDSP1(11)_"START I/O ON OTHER UNIT_^1_%EQU INITUF(12)_"INITIALIZE WRITE COMPARE_^1_%EQU SNSEEK(13)_"SECOND SECTOR SEEK_^1_%EQU SUSPD3(14)_"THIRD SUSP€€END_^1_%EQU DOUFIO(15)_"START THE UFDD'S READ_^1_%EQU CONTRD(16)_"CONTINUE UFDD READ AND STATUS CHECK_^1_%EQU UFCMPR(17)_"UFDD CALL FOR WRITE COMPARE_^1_%EQU ENDSP2(18)_"START I/O ON OTHER UNIT_^1_%EQU EXIT1(19)_#COMPLETE NFDD PROCESSING AND LEAVE_^1*_]_^1*_]_^1*_5STATUS BIT POSITION_^1*_5*******************_^1*_$COMBINED STATUS:_^1*_]_^1_%EQU UREADY(1)_#00 UNIT READY_^1_%EQU€€ UBUSY(2)_$01 UNIT BUSY_^1_%EQU LOADED(4)_#02 HEAD LOADED_^1_%EQU SEEKZ(8)_$03 SEEKING_^1*_]_^1_%EQU IO($10)_%04 READING/WRITING_^1_%EQU INTRPT($20)_!05 INTERRUPT_^1_%EQU INTSEL($40)_!06 INTERRUPT SELECTED_^1_%EQU PARITY($80)_!07 DMA PARITY ERROR_^1*_]_^1_%EQU PROTCT($100) 08 DMA PROTECT FAULT_^1_%EQU CORE($200)_"09 DMA MEMORY ADDRESS FAULT_^1_%EQU LOSTDT($400) 10 LOST €€DATA_^1_%EQU SEEKER($800) 11 SEEK ERROR_^1*_]_^1_%EQU CRCERR($1000) 12 DATA CRC ERROR_^1_%EQU DELREC($2000) 13 DELETED RECORD_^1_%EQU PROTSW($4000) 14 PROTECT SWITCH ON_^1_%EQU CBUSY($0000) 15 CONTROLLER BUSY (CAN NOT SET BIT 15)_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_*RECOVERY OPITIONS_^1*_]_^1_%EQU REPIO(5)_$NUMBER OF CONTINUOUS I/O RETRIES FIELD POSITN_^1_%EQU OF€€FTRC(10)_"NUMBER OF OFF TRACK SEEKS FIELD POSITION_^1_%EQU ZERTRK(15)_"NUMBER OF TRACK ZERO SEEKS FIELD POSITION_^1_%EQU FLDSZ5(5)_#5 BIT FIELD SIZE_^1_%EQU FLDSZ6(6)_#6 BIT FIELD SIZE_^1*_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 - I/O IN PROGRESS_^1_%EQU SUSPND(3)_€€#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST I/O WAS NOT INITIALIZATION_^1*_81 - €€LAST I/O WAS FOR INITIALIZATION_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU ONEBIT(1)_#1 BIT FIELD SIZE_^1_%EQU SELEOP($40)_!SELECT END-OF-OPERATION INTERRUPT_^1*_]_^1****_]_^1_%EJT 0_^1LFDD_!NUM $FFFF_^1_%ENQ -1_+RESET DIAGNOSTIC CLOCK_^1_%STQ- EDCLK,I_((IF REJECT IN VFDD)_^1*_]_^1_%LDQ- FLTCOD,I_$CHECK IF RE-ENTRY TO FAULT SUBROUTINE_^1_%SQN L10_-YES, JUST CLEAR THE INTERR€€UPT_^1*_]_^1_%STA- FLTCOD,I_$SAVE FIRST DETECTED FAULT CODE ONLY_^1*_]_^1L10_"ENQ SELCTF_'CLEAR INTERRUPT AND SELECT EOP INTERRUPT_^1_%ADQ- EWES,I_^1_%ENA SELEOP_^1_%OUT 1_,IGNORE REJECTS_^1_%NOP 0_^1*_]_^1_%LDA- EREQST,I_$CHECK IF UNEXPECTED INTERRUPT_^1_%SAM L20_-(IF ERROR IN VFDD)_^1_%RAO- GHOSTI,I_(YES, INCREMENT GHOST INTERRUPT COUNTER_^1_%RTJ CGHOST_'LOOK FOR CONSTANT I€€NTERRUPT AND EXIT_^1L20_"ENA STAERR_'CHECK FOR MEDIA ERROR_^1_%EOR- FLTCOD,I_^1_%SAN L30_*NOT MEDIA ERROR_^1_%LDA- ESTAT2,I_$CHECK IF MEDIA FAULT STATUS_^1_%AND =XCRCERR+SEEKER_^1_%SAN L40_*MEDIA ERROR_^1L30_"JMP* L90_*NOT MEDIA ERROR, NO RECOVERY_^1L40_"LFA- ESTAT1,RW,ONEBIT,I 0 - READ, 1 - WRITE_^1_%LDQ- I_^1_%AAQ Q_^1_%LFA- RDCNT,REPIO,FLDSZ6,Q MAX NUMBER OF READ/WRITE RET€€RIES_^1_%RAO- ERRCNT,I_$ATTEMPT RECOVERY, INC ERROR COUNT_^1_%SUB- ERRCNT,I_^1_%SAM L50_*I/O REPEAT EXCEEDED_^1_%ENQ SCSEEK_'REPEAT OPERATION AT THIS POINT_^1_%JMP* L120_)RE-EXECUTE LAST READ OR WRITE OPERATION_^1L50_"STA- RCVCNT,I_$TEMPORARY SAVE INTERMEDIATE RESULTS_^1_%LFA- RDCNT,OFFTRC,FLDSZ5,Q NUMBER OF OFF TRACK TRIES_^1_%ADD- RCVCNT,I_$NORMAL+OFF TRACK RETRIES-RECOVERY ATT€€EMPTS_^1_%SAM L80_*NUMBER OF OFF TRACK TRIES EXCEEDED_^1_%LDA- TRKSEC,I_^1_%ARS 8_,TRACK NUMBER_^1_%SAZ L90_*DO NOT ATTEMPT RECOVERY IF AT TRACK 0_^1_%INA 2-70_^1_%SAM L70_*UNLESS ABOVE TRACK 70, THEN GO TWO BACK_^1_%INA -4_^1L70_"INA 70_^1_%ALS 8_^1_%JMP* L110_)SEEK OFF TRACK_^1L80_"STA- RCVCNT,I_$TEMPORARY SAVE INTERMEDIATE RESULTS_^1_%LFA- RDCNT,ZERTRK,FLDSZ5,Q NUMBER OF€€ ZERO TRACK TRIES_^1_%ADD- RCVCNT,I_$NORMAL+OFFTRK+ZERO TRACK-RECOVERY ATTEMPTS_^1_%SAM L90_*RECOVERY LIMIT EXCEEDED_^1_%JMP* L100_)DO ZERO SEEK_^1L90_"RAO* LFDD_)EXIT WITH UNRECOVERABLE ERROR_^1_%CLR A_,CLEAR PRIME FLAG IF SET_^1_%STA- PRIME,I_^1_%SEF- ESTAT1,FLTERR,ONEBIT,I SET KERNEL DETECTED I/O ERROR FLAG_^1_%SFN- ESTAT1,INITZ,ONEBIT,I_^1_%JMP* L130_)NOT INITIALIZATION FUNCT€€ION_^1_%LDQ- TRKSEC,I_(YES, MARK THIS TRACK BAD_^1_%LDA- BADTKS,I_^1_%LLS 8_^1_%STA- BADTKS,I_^1_%LDA- ESTAT1,I_$SET ERROR TO DENOTE BAD TRACK_^1_%EOR* BADTFG_*(CLEAR BIT 15, SET BIT 14)_^1_%STA- ESTAT1,I_^1_%CLF- AQDMAF,INTFCN,ONEBIT,I_!CLEAR IN CASE INIT ABORTS_^1_%JMP* L130_)EXIT_^1L100_!CLR A_,SEEK TO TRACK ZERO_^1L110_!INA 1_,ATTEMPT SEEK OFF DESIRED TRACK_^1_%STA- TRKSEC,I€´_^1_%ENQ OFFTRK_^1L120_!STQ- PASCNT,I_$SET PASS COUNT INDICATOR_^1L130_!JMP* (LFDD)_'RETURN_^1_%SPC 5_^1BADTFG NUM $C000_(BAD TRACK FLAG (CLEAR BIT 15, SET BIT 14)_^1_%END_]_^__´PWFDD CSY/ C63 P€1_%NAM WFDD_)DECK-ID C63 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_4**********************_^1*_4* WAIT FOR INTERRUPT *_^1*_4**********************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*WFDD DOES THE FOLLOWING:_^1*_*1. SET DIAGNOSTIC CLOCK_^1*_*2. EXITS TO DRIVER'S EXIT ROUTINE_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*NONE_^1*_]_^1*_]_^1*€€_MISC_^€>1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT WFDD_)WAIT UNTIL CURRENT OPERATION IS DONE_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* ZFDD_)DRIVER EXIT ROUTINE_^1****_]_^1_%EJT_]_^1WFDD_!NUM 0_^1_%LDA- TIMOUT,I_$SET TIME OUT AND WAIT FOR INTERRUPT_^1_%STA- EDCLK,I_^1_%JMP ZFDD_)GO TO DRIVER EXIT_^1_%END_]_^__ >PVFDD CSY/ C64 P€1_%NAM VFDD_)DECK-ID C64 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_9********************_^1*_9* VERIFY INTERRUPT *_^1*_9********************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE FOLLOWING STEPS ARE PERFORMED BY VFDD:_^1*_*1. FETCH UNIT STATUS FOR UNIT 0_^1*_*2. IF NO INTERRUPT STATUS, ASSUME UNIT 1 INTERRUPT_^1*_*3. IF DRIVER NOT PROCESSING REQUEST CLEAR INTERRUPT STATE_^1*_*4. IF DRIVER IS €€PROCESSING REQUEST, CLEAR/SET INTERRUPT_^1*_*5. IF NO REQUEST, CHECK FOR GHOST INTERRUPT_^1*_*6. RETURN_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*CGHOST_'CHECK FOR CONSTANT INTERRUPT_^1*_*RFDD_)KERNEL RECEIVE (INPUT) DATA SUBROUTINE_^1*_*SFDD_)KERNEL DIRECTOR STATUS SUBROUTINE_^1*_*TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>---€€-_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT VFDD_)VERIFY THE INTERRUPT_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT CGHOST_'CHECK FOR CONSTANT INTERRUPT_^1_%EXT* RFDD_)KERNEL RECEIVE (INPUT) DATA SUBROUTINE_^1_%EXT* SFDD_)KERNEL DIRECTOR STATUS SUBROUTINE_^1_%EXT* TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1_%EXT* ZFDD_)DRIVER EXIT ROUTINE_^1*_]_^1*_]_^1*_:** EQUATES **_^1€€*_]_^1*_*REQUEST STATUS_^1*_]_^1_%EQU INITST(1)_#INITIAL STATUS_^1_%EQU CONTST(2)_#CONTINUATION STATUS_^1_%EQU TIMEST(3)_#TIME OUT STATUS_^1*_]_^1*_]_^1*_*FDD COMMANDS_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STBANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#F€€UNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNCTION - INITIATE DMA WRITE DELETED RECO€€RD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFF(1)_#FUNCTION - READ FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^€€1*_*INTERRUPT STATES_^1*_]_^1_%EQU CLRINT(0)_"CLEAR INTERRUPT_^1_%EQU SELEOP($40)_!SELECT END-OF-OPERATION INTERRUPT_^1*_]_^1****_]_^1_%EJT 0_^1VFDD_!NUM $FFFF_^1_%ENQ USTATF_'GET UNIT STATUS_^1_%RTJ RFDD_^1_%ALS 10_+CHECK IF INTERRUPT PRESENT_^1_%SAM V10_-YES, PROCESS IT_^1*_]_^1_%LDQ- FDDPTH,I_$ASSUME OTHER UNIT_^1_%STQ- I_,IF ONLY ONE UNIT FDDPTH POINTS TO ITSELF_^1*_]_^€€1V10_"ENA -1_+RESET DIAGNOSTIC CLOCK_^1_%STA- EDCLK,I_^1_%ENQ CONTST_'INPUT, SAVE, CHECK CONTINUATOR STATUS_^1_%RTJ SFDD_^1*_]_^1_%ENA CLRINT_'CHECK IF UNEXPECTED INTERRUPT_^1_%LDQ- EREQST,I_^1_%SQP V20_-YES, DESELECT INTERRUPT_^1_%ENA SELEOP_'EXPECTED INTERRUPT, KEEP INT SELECTED_^1V20_"ENQ SELCTF_'SELECT UNIT AND EOP AND CLEAR INTERRUPT_^1_%RTJ TFDD_^1_%SAN V40_*EXIT IF €€EXPECTED INTERRUPT_^1*_]_^1_%ENQ TSTATF_'CHECK IF UNEXPECTED INTERRUPT CAUSED BY_^1_%RTJ RFDD_+NEW DISKETTE BEING INSERTED_^1_%INA -1_^1_%SAN V30_^1_%STA- SECNUM,I_$INDICATE WORD ADDRESSABLE BUFFER DOES NOT_^1*_8CONTAIN USEFUL INFORMATION_^1_%JMP ZFDD_)EXIT KERNEL_^1V30_"RAO- GHOSTI,I_$NO, GHOST INTERRUPT OCCURRED_^1_%RTJ CGHOST_'CHECK FOR CONSTANT INTERRUPT AND EXIT KERNEL_^€J1*_]_^1V40_"JMP* (VFDD)_'INTERRUPT EXPECTED, CONTINUE_^1*_]_^1_%END_]_^__ JPPFDD CSY/ C65 P€1_%NAM PFDD_)DECK-ID C65 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_4**********************_^1*_4* ISSUE BAD FUNCTION *_^1*_4**********************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*TH PFDD PERFORMS THE FOLLOWING:_^1*_*1. RETURNS TO CALLING ROUTINE IF NO BAD FCN TO BE ISSUED_^1*_*2. SELECTS BAD FUNCTION_^1*_*3. DETERMINE IF INPUT OR OUTPUT FUNCTION_^1*_*4. ISSUES EITHER INPUT OR OUTPUT FCN COM€€MAND_^1*_*5. EXITS TO FAULT ROUTINE_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*FFDD_)FAULT PROCESSING ROUTINE_^1*_*RFDD_)KERNEL RECEIVE (INPUT) DATA SUBROUTINE_^1*_*TFDD_)KERNEL TRANSMIT (OUTPUT) DATA/FCN SUBROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT PFDD_)PROCESS ILLEGAL FUNCTIONS_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT€€* FFDD_)FAULT PROCESSING ROUTINE_^1_%EXT* RFDD_)KERNEL RECEIVE(INPUT) DATA SUBROUTINE_^1_%EXT* TFDD_)KERNEL TRANSMIT(OUTPUT) DATA/FCN SUBROUTINE_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(€€3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"P€€ROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NINTSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU N€€OREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1*_]_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 €€- I/O IN PROGRESS_^1_%EQU SUSPND(3)_#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPUT(6)_$0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST €€I/O WAS NOT INITIALIZATION_^1*_81 - LAST I/O WAS FOR INITIALIZATION_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1****_]_^1_%EJT 0_^1PFDD_!NUM $FFFF_^1_%LDQ* PFDD_)SAVE RETURN ADDRESS_^1_%STQ- RETURN,I_$DEFINE PSEUDO RETURN FROM KERNEL WHEN_^1*_8ERROR ENCOUNTERED_^1_%LDQ- DIAFCN,I_$ILLEGAL FUNCTION CODE TO BE ISSUED_^1_%SFZ- AQDMAF,ILLFCN,ONEBIT,I €Ü DETERMINE ILLEGAL FUNCTION REQUEST_^1_%JMP* BF10_^1_%RTJ RFDD_)READ FUNCTION_^1_%JMP* BF20_^1BF10_!RTJ TFDD_)TRANSMIT FUNCTION_^1BF20_!ENA NOREJT_'NO REJECT FUNCTION_^1_%JMP FFDD_)EXIT TO FAULT ROUTINE_^1_%END_]_^__ÜPBFDD CSY/ C66 P€1_%NAM BFDD_)DECK-ID C66 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_6*****************_^1*_6* BEGIN FDD I/O *_^1*_6*****************_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE BFDD MODULE SELECTS EOP INTERRUPT FOR UNIT_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_.TFDD_$KERNEL OUTPUT SUBROUTINE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **€€_^1*_]_^1_%ENT BFDD_)BEGIN FDD INPUT/OUTPUT OPERATION_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* TFDD_)KERNAL TRANSMIT (OUTPUT) DATA/FCT SUBROUTINE_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*FDD COMMANDS_^1*_*OUTPUT FUNCTIONS_^1*_]_^1_%EQU SETFAF(0)_#FUNCTION - SET FILE ADDRESS_^1_%EQU BWRITF(1)_#WRITE BUFFER_^1_%EQU LLWAF(02)_#FUNCTION - LOAD LAST WORD ADDRESS_^1_%EQU STB€€ANK(3)_#SET BANK_^1_%EQU DEFBTF(4)_#FUNCTION - DEFINE BAD TRACKS_^1_%EQU SEEKF(05)_#FUNCTION - LOAD TRACK/SECTOR AND SEEK TO TRACK_^1_%EQU SELCTF(06)_"FUNCTION - SELECT EOP AND CLEAR INTERRUPT_^1_%EQU DINITF(07)_"FUNCTION - INITIATE DMA INITIALIZE TRACK_^1_%EQU DREADF(08)_"FUNCTION - INITIATE DMA READ_^1_%EQU DWRITF(09)_"FUNCTION - INITIATE DMA WRITE_^1_%EQU DWRTDF(10)_"FUNC€€TION - INITIATE DMA WRITE DELETED RECORD_^1*_]_^1*_*INPUT FUNCTIONS_^1*_]_^1_%EQU READFF(1)_#FUNCTION - READ FILE_^1_%EQU CSTATF(02)_"FUNCTION - CONTROLLER STATUS_^1_%EQU TSTATF(03)_"FUNCTION - TRACK/SECTOR STATUS_^1_%EQU USTATF(04)_"FUNCTION - UNIT STATUS_^1_%EQU AREADF(5)_#A/Q BUFFERED READ_^1_%EQU AWRITF(6)_#A/Q BUFFERED WRITE_^1_%EQU AWRTDF(7)_#A/Q BUFFERED DELETED WRITE€€_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%€€EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 - I/O IN PROGRESS_^1_%EQU SUSPND(3)_#1 - WAITING FOR I/O TO €€COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST I/O WAS NOT INITIALIZATION_^1*_81 - LAST I/O WAS FOR INITIAL€€IZATION_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU SELEOP($40)_!SELECT END-OF-OPERATION INTERRUPT_^1_%EQU ONEBIT(1)_#ONEBIT FIELD SIZE_^1****_]_^1_%EJT_]_^1************************************************************************_^1*_]_'*_^1*_*B E G I N_!F D D_!I N P U T / O U T P U T_/*_^1*_]_'*_^1************************************************************************_^1_%SPC €. 1_^1BFDD_!NUM 0_^1_%LFA- ESTAT1,DIALU,ONEBIT,I_^1_%SFZ- AQDMAF,RGFILE,ONEBIT,I_^1_%SAN BF10_)DO NOT SELECT INTERRUPTS SINCE BAD_^1*_8TRACK SECTOR MAY NOT YET BE DEFINED_^1_%ENQ SELCTF_'SELECT UNIT AND END-OF-OPERATION INTERRUPT_^1_%ENA SELEOP_^1_%RTJ TFDD_^1BF10_!JMP* (BFDD)_^1*_]_^1_%END_]_^__ .PHFDD CSY/ C67 P€1_%NAM HFDD_)DECK-ID C67 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_0*****************************_^1*_0* FORMATTED/UNFORMATTED I/O *_^1*_0*****************************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THE FOLLOWING STEPS ARE PERFORMED BY HFDD_^1*_]_^1*_*HFDD:_^1*_*1. IF REQUEST DOES NOT START ON SECTOR BOUNDARY_^1*_-CALL OFFSET TO HANDLE INITIAL PART OF USER_^1*_-BUFFER OR ALL OF REQUEST IF SCR€€ATCH BUFFER_^1*_-IS LARGE ENOUGH TO COMPLETE THE REQUEST_^1*_*2. PERFORM I/O ON FULL SECTOR PORTION OF REQUEST._^1*_-IF REQUEST IS READ OR ZERO FILL ON WRITE,_^1*_-THIS STEP WILL ALSO PERFORM THIS I/O._^1*_-IF THE WRITE REQUEST OVERLAPS THE CURRENT_^1*_-INFORMATION IN THE SCRATCH BUFFER THE BUFFER_^1*_-CONTENTS ARE FLAGGED AS NO LONGER VALID._^1*_*3. OFFSET IS CALLED TO FINISH WRIT€€E REQUEST_^1*_-THAT DO NOT END OF SECTOR BOUNDARIES AND CAN_^1*_-NOT BE COMPLETED BY STEPS 1 AND 2._^1*_]_^1*_*RWFDD:_^1*_*1. CALLS KERNEL TO PERFORM I/O_^1*_*2. CALLS LOGFDD TO ENTER INFORMATION IN ENGINEERING_^1*_-LOG IF ERROR_^1*_*3. EXITS HFDD IF ERRORS DETECTED IN KERNEL_^1*_]_^1*_*SIZE:_^1*_*1. DETERMINES REMAINING WORDS TO BE PROCESSED IN_^1*_-REQUEST. RESULTS ARE SAVED IN €€SVSIZE._^1*_*2. CALCULATES THE NUMBER OF FULL SECTORS NEEDED_^1*_-TO COMPLETE THE REQUEST._^1*_]_^1*_*NEXTAD:_^1*_*1. DETERMINES NEXT MEMORY LOCATION TO TRANSFER_^1*_-DATA_^1*_*2. CALCULATES NEXT SCRATCH BUFFER LOCATION TO_^1*_-TRANSFER DATA_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*OVRLAP:_^1*_*1. DETERMINES IF USER'S REQUEST OVERLAPS SCRATCH_^1*_-BUFFER AREA._^1*_]_^1*_*OFFSET:_^€€1*_*1. DETERMINES NUMBER OF SCRATCH SECTORS THAT_^1*_-THE REQUEST WISHES TO USE_^1*_*2. CALCULATES IF ANY PART OF THE SCRATCH BUFFER_^1*_-SATISFIES THE REQUEST._^1*_*3. IF SCRATCH BUFFER CAN FULLY OR PARTIALLY_^1*_-SATISFY REQUEST, USE SCRATCH BUFFER._^1*_*4. IF SCRATCH BUFFER INFORMATION INVALID, READ_^1*_-DATA INTO SCRATCH BUFFER._^1*_*5. IF READ REQUEST, MOVE DATA FROM SCRATCH_^€€1*_-BUFFER TO USER'S BUFFER_^1*_*6. IF WRITE REQUEST, MOVE DATA TO SCRATCH BUFFER_^1*_-FROM USER'S BUFFER. THEN WRITE THE DATA_^1*_-FROM SCRATCH BUFFER TO THE DISKETTE._^1*_]_^1*_*BUFFIO:_^1*_*1. DEFINE FWA AND LWA FOR SCRATCH BUFFER_^1*_*2. CALL KERNEL TO DO I/O_^1*_*3. DEFINE FWA AND LWA FOR USER'S BUFFER._^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*BUFFIO_'SWITCH F€€WA AND LWA TO USE SCRATCH BUFFER FOR_^1*_8I/O_^1*_*DIFFDD_'16 BIT ADDRESS COMPARE_^1*_*INCFDD_'INCREMENT COUNTER THAT INCLUDES FFFF IN COUNT_^1*_*KFDD_)PERFORMS I/O OPERATIONS_^1*_*LOGFDD_'LOG ANY ERRORS IN ENGINEERING LOG_^1*_*NEXTAD_'DETERMINES NEXT USER'S BUFFER AND SCRATCH_^1*_8BUFFER WORD TO MOVE_^1*_*OFFSET_'PERFORM WORD ADDRESSING OPERATIONS_^1*_*OVRLAP_'CHECK IF USER'S AND €€SCRATCH BUFFER OVERLAP_^1*_*RWFDD_(CALLS KERNEL AND CHECKS FOR FAULT ERRORS_^1*_*SIZE_)DETERMINE REMAINING BUFFER REQUIREMENTS_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT HFDD_)FORMATTED/UNFORMATTED I/O_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* DIFFDD_'16 BIT COMPARE_^1_%EXT* INCFDD_'INCREMENT COUNTER_^1_%EXT* KFDD_)KERNEL ROUTINE_^1_%EXT* LOGF€€DD_'LOG ANY ERRORS IN ENGINEERING LOG_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1€€_%EQU SECABS(08)_"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_*AQDMAF BIT DEFINITIONS_^1_%EQU AQDMAM(0)_#A/Q OR DMA MODE BIT (0-DMA)_^1_%EQU RGFILE(1)_#1 - READ/WRITE REGISTER FILE_^1_%EQU IOFLAG(2)_#1 - I/O IN PROGRESS€€_^1_%EQU SUSPND(3)_#1 - WAITING FOR I/O TO COMPLETE ON OTHER UNIT_^1_%EQU ILLFCN(5)_#00- NO ILLEGAL FUNCTION_^1*_801- ILLEGAL READ FCN CODE ISSUED_^1*_810- ILLEGAL WRITE FCN CODE ISSUED_^1_%EQU INPOUT(6)_#0 - INPUT CONTROLLER FUNCTION_^1*_81 - OUTPUT CONTROLLER FUNCTION_^1_%EQU RWREQ(7)_$SAVE READ/WRITE BIT FOR WORD ADDRESSABLE I/O_^1_%EQU INTFCN(8)_#0 - LAST I/O WAS NOT INIT€€IALIZATION_^1*_81 - LAST I/O WAS FOR INITIALIZATION_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU ONEBIT(1)_#ONE BIT FIELD SIZE_^1_%EQU TWOBIT(2)_#TWO BIT FIELD SIZE_^1_%EQU ZERO(2)_$LOW CORE WORD OF ZERO_^1****_]_^1_%EJT 0_^1HFDD_!NUM $FFFF_((LIKDUM)_^1_%LDA- BUFSIZ,I_^1_%CLR Q_^1_%DVI- WRDSEC,I_^1_%STA- SECCNT,I_$SAVE SCRATCH BUFFER SIZE I€€N SECTORS_^1_%LDQ- WRDFWA,I_^1_%SQZ HF10_)BUFFER STARTS ON SECTOR BOUNDARY_^1_%RTJ* OFFSET_'START OF BUFFER NOT ON SECTOR BOUNDARY_^1_%LDA- ELSTWD,I_$SEE IF DONE_^1_%EOR- FWABUF,I_^1_%SAN HF05_)NOT DONE_^1_%JMP* EXIT_^1HF05_!LDA- SECTOR,I_^1_%ADD- SBUFSZ,I_^1_%STA- SECTOR,I_$NEXT SECTOR TO USE_^1_%CLR A_,INDACATE REMAINDER OF REQUEST STARTS ON_^1_%STA- WRDFWA,I_$SECTOR BOUNDARY_€€^1HF10_!LDQ- ELSTWD,I_^1_%LFA- ESTAT1,FORMT,TWOBIT,I_^1_%INA -1_^1_%SAN HF30_)NOT UNFORMATTED WRITE REQUEST_^1_%LDA- WRDLWA,I_^1_%SAZ HF30_)BUFFER ENDS ON SECTOR BUFFER_^1_%RTJ* SIZE_)NUMBER OF REQUIRED SECTORS REMAINING_^1_%SUB- SECCNT,I_$MINUS TOTAL AVAILABLE SECTORS_^1_%INA -1_^1_%SAP HF20_)REQUEST LARGER THAN SCRATCH BUFFER_^1_%CLR A_^1_%STA- SECNUM,I_$FORCE I/O TO COMPLET€€E WITH OFFSET CALL_^1_%JMP* HF50_)SCRATCH BUFFER WILL COMPLETE REQUEST_^1HF20_!LDQ- ELSTWD,I_^1_%SBQ- WRDLWA,I_^1HF30_!STQ- LWABUF,I_^1*_*CHECK IF INFO IN SCRATCH BUFFER OVERLAPPED BY WRITE_^1_%SFN- ESTAT1,RW,ONEBIT,I_^1_%JMP* HF40_)NOT WRITE REQUEST_^1_%LDA- SECNUM,I_^1_%SAZ HF40_)SCRATCH BUFFER NOT USEABLE_^1_%RTJ* SIZE_)DETERMINE MAX SIZE OF REQUEST_^1_%RTJ* OVRLAP_'SEE IF SCRA€€TCH BUFFER OVERLAPPED_^1_%SAP HF40_)NO OVERLAP_^1_%CLR A_,SINCE WRITE OVERLAPS SCRATCH BUFFER,_^1_%STA- SECNUM,I_$INDICATE SCRATCH BUFFER NOT USEABLE_^1HF40_!RTJ* RWFDD_(DO READ OR WRITE FUNCTION_^1_%LDA- LWABUF,I_$CHECK IF DONE_^1_%STA- FWABUF,I_$NEXT FIRST WORD ADDRESS_^1_%EOR- ELSTWD,I_^1_%SAZ EXIT_)DONE_^1_%LDA- LGLSEC,I_$LAST LOGICAL SECTOR_^1_%STA- SECTOR,I_^1HF50_!RTJ* OF€€FSET_'WRITE LAST PART OF BUFFER NOT ON SECTOR BNDARY_^1EXIT_!JMP* (HFDD)_'RETURN_^1_%SPC 5_^1*_:**********_^1*_:* DO I/O *_^1*_:**********_^1*_]_^1*_]_^1RWFDD NUM $FFFF_(DO I/O_^1_%LDQ* RWFDD_(SAVE RETURN ADDRESS_^1_%STQ- RWRTN,I_^1_%RTJ KFDD_)CALL FDD KERNEL_^1_%RTJ LOGFDD_%IF ERROR, LOG IT AND GO TO_^1*_8ALTERNATE DEVICE HANDLER_^1_%SFZ- ESTAT1,FLTERR,ONEBIT,I_^1_%JMP* EXIT_€€)ERROR DETECTED IN OVERLAY REQUEST_^1_%LDQ- RWRTN,I_%NORMAL RETURN_^1_%JMP- (ZERO),Q_^1_%EJT 0_^1*_5**********************_^1*_5* SIZE REMAINING I/O *_^1*_5**********************_^1*_]_^1*_*OUTPUT: A = SIZE IN SECTORS TO COMPLETE I/O_^1*_]_^1*_]_^1SIZE_!NUM $FFFF_^1_%LDA- ELSTWD,I_$LWA+1 OF REQUEST_^1_%LDQ- FWABUF,I_$CURRENT FWA OF BUFFER TO FILL_^1_%RTJ DIFFDD_'16 BIT COMPARE_^€€1_%INA 0_^1_%SAN SZ10_)NUMBER OF WORDS TO TRANSFER_^1_%LDA- FWABUF,I_^1_%LDQ- ELSTWD,I_^1_%RTJ DIFFDD_^1_%SAZ SZ05_^1_%INA -1_^1SZ05_!TCA A_^1SZ10_!STA- DIAFCN,I_$SCRATCH LOCATION FOR REMAINING WORDS IN REQ_^1_%CLR Q_,DETERMINE NUMBER OF NEEDED SECTORS_^1_%INA -1_+(DO NOT LET A REG. OVERFLOW FROM FFXX TO_^1_%DVI- WRDSEC,I_$00XX BY ADDING FIRST)._^1_%ADQ- WRDFWA,I_^1_%SBQ- W€€RDSEC,I_^1_%SQM SZ20_^1_%INA 1_^1SZ20_!INA 1_,NUMBER OF SECTORS_^1_%JMP* (SIZE)_'RETURN_^1_%SPC 5_^1ADDRES BSS ADDRESS_%NEXT USER'S BUFFER ADDRESS_^1_%EJT 0_^1*_3***********************_^1*_3* OVERLAPPING BUFFERS *_^1*_3***********************_^1*_]_^1*_*INPUT : A = NUMBER OF SECTORS REQUIRED FOR 'SECTOR'_^1*_]_^1*_*OUTPUT: A > 0, SCRATCH BUFFER INFO NOT OVERLAPPED_^1*_2A < 0€€, SCRATCH BUFFER INFO OVERLAPPED_^1*_]_^1*_]_^1OVRLAP NUM $FFFF_(CHECK FOR SCRATCH BUFFER OVERLAP_^1_%ADD- SECTOR,I_^1_%SUB- SCRSEC,I_^1_%INA -1_^1_%TCA A_,A POS INDICATES NO OVERLAP_^1_%SAP OV10_)NO OVERLAP_^1_%LDA- SECTOR,I_^1_%SUB- SCRSEC,I_^1_%SUB- SECNUM,I_^1OV10_!JMP* (OVRLAP)_$RETURN_^1_'EJT 0_^1*_4**********************_^1*_4* SCRATCH BUFFER I/O *_^1*_4****************€€******_^1BUFFIO NUM $FFFF_^1_%LDQ* BUFFIO_'SAVE RETURN ADDRESS_^1_%STQ- BUFRTN,I_^1_%LDQ- FWABUF,I_$SAVE CURRENT FWA OF USER'S BUFFER_^1_%STQ- ECCOR,I_^1_%LDA- SBUFSZ,I_^1_%MUI- WRDSEC,I_$WORDS TO MOVE_^1_%LDQ- ABUFF,I_^1_%ADQ- INDENT,I_$OFFSET TO DATA_^1_%STQ- FWABUF,I_^1_%AAQ Q_,NUMBER OF WORDS IN I/O REQUEST_^1_%STQ- LWABUF,I_^1_%RTJ* RWFDD_^1_%LDQ- ECCOR,I_%CURRENT FWA OF USE€€R'S BUFFER_^1_%STQ- FWABUF,I_^1_%LDQ- BUFRTN,I_$RETURN_^1_%JMP- (ZERO),Q_^1_'EJT 0_^1*_/******************************_^1*_/* WORD ADDRESSING OPERATIONS *_^1*_/******************************_^1*_]_^1*_]_^1OFFSET NUM $FFFF_^1_%LDQ* OFFSET_'SAVE RETURN ADDRESS_^1_%STQ- OFFRTN,I_^1_%RTJ* SIZE_)DETERMINE IF REMAINING WORDS FITS INTO BUFFER_^1_%TRA Q_,SAVE REQUIRED SIZE IN SECTORS_^1€€_%INA -1_^1_%SUB- SECCNT,I_^1_%SAM OF10_)REQUEST FITS BUFFER_^1_%SUB- SECCNT,I_$TO EVEN SECTORS._^1_%LDQ- SECCNT,I_^1_%SAM OF10_^1_%ENQ 1_,USE ONLY ONE SECTOR_^1OF10_!LDA- SECNUM,I_$CURRENT BUFFER NOT USEABLE IF ZERO_^1_%SAZ OF20_^1_%TRQ A_^1_%RTJ* OVRLAP_'CHECK FOR SCRATCH BUFFER OVERLAP (Q UNCHANGED)_^1_%SAP OF20_)NO OVERLAP_^1*_8A = SECTOR-SCRSEC-SECNUM_^1*_8LET:_^1*_8X =€€ SECTOR-SCRSEC_^1*_8X = A+SECNUM_^1*_8WANT:_^1*_8SBUFSZ = SECNUM-X = -A_^1_%TCA A_^1_%STA- SBUFSZ,I_$NEW AMOUNT OF USEABLE SCRATCH BUFFER_^1_%TCA A_^1_%ADD- SECNUM,I_$OFFSET IN Q (SECTORS) TO USEABLE SPACE_^1_%SAM OF20_)STARTING SECTOR NOT IN SCRATCH BUFFER_^1_%MUI- WRDSEC,I_^1_%STA- INDENT,I_$TEMP LOCATION FOR SECTOR OFFSET_^1_%ADD- WRDFWA,I_$OFFSET IN SCRATCH BUFFER TO USEABLE€€ DATA_^1_%STA- WRDFWA,I_^1_%JMP* OF30_)DO NOT READ INTO SCRATCH BUFFER_^1OF20_!STQ- SECNUM,I_$SAVE USEABLE READ SPACE_^1_%STQ- SBUFSZ,I_$NUMBER OF SECTORS FOR I/O OPERATION(S)_^1_%LDA- SECTOR,I_$DEFINE SCRATCH BUFFER SECTOR ADDRESS_^1_%STA- SCRSEC,I_^1_%CLR A_^1_%STA- INDENT,I_$CLEAR SECTOR OFFSET_^1_%LFA- ESTAT1,RW,ONEBIT,I SAVE READ/WRITE MODE OF REQUEST_^1_%SFA- AQDMAF,RWREQ,O€€NEBIT,I_^1_%CLF- ESTAT1,RW,ONEBIT,I FORCE READ COMMAND_^1_%RTJ* BUFFIO_'READ DATA TO SCATCH BUFFER_^1_%LFA- AQDMAF,RWREQ,ONEBIT,I RESTORE READ/WRITE MODE OF REQUEST_^1_%SFA- ESTAT1,RW,ONEBIT,I_^1OF30_!LDA- SBUFSZ,I_^1_%MUI- WRDSEC,I_^1_%SUB- WRDFWA,I_$ADJUST LENGTH TO NOT INCLUDE WORD OFFSET_^1_%ADD- INDENT,I_$ADJUST LENGTH TO NOT INCLUDE SECTOR OFFSET_^1_%SUB- DIAFCN,I_$CHECK IF €€MAX NUMBER OF WORDS TO MOVE LESS_^1*_8THAN SECTOR BOUNDARY_^1_%SAM OF40_)SKIP IF THE REST OF SECTOR IS USEABLE_^1_%CLR A_,USE MAX SIZE TO ELSTWD_^1OF40_!ADD- DIAFCN,I_^1_%INA -1_^1_%XFA 3_^1_%SFZ- ESTAT1,RW,ONEBIT,I_^1_%JMP* OF60_)WRITE REQUEST_^1OF50_!RTJ* NEXTAD_'- READ LOOP -_^1_%LDA- (ZERO),Q_^1_%STA* (ADDRES)_^1_%D3P *-OF50_^1_%JMP* OF70_^1OF60_!RTJ* NEXTAD_'- WRITE LOOP €€-_^1_%LDA* (ADDRES)_^1_%STA- (ZERO),Q_^1_%D3P *-OF60_^1_%RTJ* BUFFIO_'WRITE DATA FROM SCRATCH BUFFER_^1OF70_!LDQ- OFFRTN,I_$RETURN_^1_%JMP- (ZERO),Q_^1_'EJT 0_^1*_3************************_^1*_3* COMPUTE NEXT ADDRESS *_^1*_3************************_^1*_]_^1*_*OUTPUT: ADDRES = USER'S BUFFER ENTRY ADDRESS_^1*_2Q = SCRATCH BUFFER ENTRY ADDRESS_^1*_]_^1*_]_^1NEXTAD NUM $FFFF_(DETERM€ INE NEXT ADDRESS_^1_%LDQ- FWABUF,I_^1_%STQ* ADDRESS_%NEXT ADDRESS IN USER'S BUFFER_^1_%RTJ INCFDD_'INCLUDE $FFFF IN COUNT_^1_%STQ- FWABUF,I_^1_%LDQ- ABUFF,I_^1_%ADQ- WRDFWA,I_$NEXT ADDRESS IN SCRATCH BUFFER_^1_%RAO- WRDFWA,I_^1_%JMP* (NEXTAD)_$RETURN_^1_%END_]_^__ PLOGFDD CSY/ C68 P€1_%NAM LOGFDD_'DECK-ID C68 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_8*************_^1*_8* LOG ERROR *_^1*_8*************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*LOGERR DOES THE FOLLOWING:_^1*_*1. IF FATAL ERROR:_^1*_-A. IF BAD STATUS CALL ISOFLT TO DETERMINE ACTUAL FAULT_^1*_-B. LOG THE FAULT_^1*_-C. EXIT TO ALTERNATE DEVICE HANDLER_^1*_*2. IF RECOVERED ERROR, LOG THIS FAULT IF ENOUGH RECOVERIES_^1*_-HAVE OCCURRED_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*€€_;-----------_^1*_]_^1*_*ISOFLT_'ISOLATE STATUS FAULT CODE_^1*_*LOG_*LOG ERROR IN ENGINEERING LOG_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT LOGFDD_'LOG FAULT CODE_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT ALTDEV_'ALTERNATE DEVICE HANDLER_^1_%EXT LOG_*MAKE ENTRY IN ENGINEERING LOG_€€^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_]_^1*_*FAULT CODES_^1*_]_^1_%EQU TMEOUT(0)_"TIME OUT_^1_%EQU LOSTDA(1)_#LOST DATA_^1_%EQU BADSTI(1)_#BAD INITIATOR PSEUDO STATUS_^1_%EQU BADSTC(2)_#BAD CONTINUATOR PSEUDO STATUS_^1_%EQU BADSTT(3)_#BAD TIME OUT PSEUDO STATUS_^1_%EQU PARERR(3)_#PARITY ERROR_^1_%EQU STAERR(4)_#STATUS FAULT(S) AFTER I/O_^1_%EQU INTREJ(5)_#INTERNAL REJECT€€ FAULT CODE_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT FAULT CODE_^1_%EQU WRITER(13)_"READ ONLY DISKETTE_^1_%EQU NREADY(14)_"UNIT NOT READY_^1_%EQU TSERR(16)_#TRACK/SECTOR FAULT_^1_%EQU RANGE(18)_#INVALID SECTOR ADDRESS_^1_%EQU PRTERR(19)_"PROTECT ERROR_^1_%EQU DATAER(20)_"DATA COMPARE ERROR_^1_%EQU CONADR(48)_"CONTROLLER ADDRESS ERROR_^1_%EQU NOINTR(61)_"NO INTERRUPT_^1_%EQU NIN€€TSL(65)_"NO INTERRUPT SELECTED_^1_%EQU ERBANK(66)_"MEMORY ADDRESS ERROR_^1_%EQU INTRRP(68)_"UNEXPECTED INTERRUPT_^1_%EQU INITER(69)_"INITIALIZATION NOT ENABLED_^1_%EQU RECLIM(76)_"FAULT INDICATOR FOR LOGGING RECOVERED ERRORS_^1_%EQU NOREJT(77)_"EXPECTED REJECT DID NOT OCCUR_^1_%EQU LENERR(78)_"SHORT/LONG TRANSFER ERROR_^1_%EQU UNBUSY(79)_"UNIT BUSY_^1_%EQU UNSEEK(80)_"UNIT €€SEEKING_^1_%EQU UNITIO(81)_"UNIT DOING I/O_^1****_]_^1_%EJT 0_^1****_]_^1*E_]_^1*_*STATUS BIT POSITION_^1*_]_^1_%EQU BIT00(00)_#BIT 0_^1_%EQU BIT01(01)_#BIT 1_^1_%EQU BIT03(03)_#BIT 3_^1_%EQU BIT04(04)_#BIT 4_^1_%EQU BIT05(05)_#BIT 5_^1_%EQU BIT06(06)_#BIT 6_^1_%EQU BIT07(07)_#BIT 7_^1_%EQU BIT08(08)_#BIT 8_^1_%EQU BIT09(09)_#BIT 9_^1_%EQU BIT10(10)_#BIT 10_^1_€€%EQU BIT11(11)_#BIT 11_^1_%EQU BIT12(12)_#BIT 12_^1*_]_^1*_]_^1*_*ESTAT1 FIELD POSITIONS_^1*_]_^1_%EQU RW(00)_'WRITE REQUEST_^1_%EQU FORMT(01)_#FORMATTED REQUEST_^1_%EQU PRIMER(02)_"PRIMED REQUEST_^1_%EQU ASCBIN(03)_"ASCII REQUEST_^1_%EQU DIALU(04)_#DIAGNOSTIC LU_^1_%EQU WRDSIZ(05)_"WORD COUNT_^1*_$EQU (06)_)NOT USED_^1_%EQU RECDEL(07)_"DELETED RECORD_^1_%EQU SECABS(08)_€€"ABSOLUTE SECTOR REF._^1_%EQU BITMM(09)_#M. M. BIT_^1_%EQU STAT(10)_$STATUS ONLY_^1_%EQU SEEKS(11)_#SEEK ONLY_^1_%EQU INITZ(12)_#INITIALIZATION_^1_%EQU FLTERR(15)_"FAULT ERROR DETECTED_^1*_]_^1*_]_^1*_*MISC. EQUATES_^1*_]_^1_%EQU BITFLD(7)_#START OF STATUS BIT FIELD_^1_%EQU BITMSK($23)_!LOW CORE BIT MASK TABLE_^1_%EQU BUSYBT(15)_"START OF OPERATION IN PROCESS FIELD_^1_%EQU €€ BYTE(8)_%SIZE OF BYTE_^1_%EQU FLTFLD(15)_"START OF FAULT CODE FIELD_^1_%EQU ONEBIT(1)_#ONE BIT FIELD_^1_%EQU ZERO(2)_%ZERO LOW CORE VALUE_^1****_]_^1_%EJT 0_^1LOGFDD NUM $FFFF_^1_%LDQ* LOGFDD_'SAVE RETURN ADDRESS_^1_%STQ- CFWA,I_^1*_]_^1_%SFN- ESTAT1,FLTERR,ONEBIT,I SKIP NEXT INSTR. IF ERROR_^1_%JMP* L30_*NO ERROR FOUND_^1_%LDA- FLTCOD,I_^1_%SAZ L20_*NOT STATUS_^1_%INA -5_€€^1_%SAP L20_*NOT STATUS_^1_%RTJ* ISOFLT_'ISOLATE STATUS ERROR (FAULT)_^1*_*BAD INTERRUPT BIT MAY MEAN UNEXPECTED INTERRUPT PRESENT_^1_%INA -NOINTR_^1_%SAN L10_*INTERRUPT STATUS BIT NOT SELECTED_^1_%LDQ- FLTCOD,I_^1_%INQ -BADSTI_^1_%SQZ L10_*INITIALIZATION STATUS FAULT CODE CORRECT_^1_%INA INTRRP-NOINTR INDICATE UNEXPECTED INTERRUPT STATUS ERROR_^1L10_"INA +NOINTR_%UNBIAS FAU€€LT CODE_^1_%STA- FLTCOD,I_^1L20_"ENA PARLST_^1_%ADD- I_^1_%EOR- EPTR,I_^1_%TRA Q_^1_%LDA- FLTCOD,I_$INSERT ERROR CODE WITH LOGICAL UNIT_^1_%SQZ L40_*IF OVERLAY REQUEST DO NOT ATTEMPT TO REPEAT_^1*_8THE REQUEST_^1_%LDQ- ELU,I_^1_%QLS 8_^1_%EOR- BITMSK+15_#SET BIT 15_^1_%EAQ Q_^1_%RTJ* (LOGADR)_$FATAL ERROR, LOG INTO ENG FILE_^1_%CLF- EREQST,BUSYBT,ONEBIT,I CLEAR BUSY BIT IN CA€€SE FDD_^1*_8IS LOADED BEFORE RESPONDING TO ACTION ITEM_^1_%JMP ALTDEV_'GO TO ALTERNATE DEVICE HANDLER_^1L30_"LDA- ERRCOV,I_$HAVE ERROR RECOVERIES REACHED LIMIT_^1_%EOR- LOGRCV,I_^1_%SAN L50_*NO, CONTINUE_^1_%STA- ERRCOV,I_$YES, CLEAR RECOVERY ERROR COUNT_^1*_]_^1_%ENA RECLIM_'LOG INTO THE ENGINEERING FILE_^1L40_"LDQ- ELU,I_^1_%QLS 8_^1_%EOR- BITMSK+15_#SET BIT 15_^1_%EAQ Q_^1_€€%RTJ* (LOGADR)_^1L50_"LDQ- CFWA,I_'RETURN ADDRESS_^1_%JMP- (ZERO),Q_$RETURN_^1*_]_^1LOGADR ADC LOG_*ENGINEERING FILE LOGGING ADDRESS_^1_%EJT 0_^1ISOFLT NUM $FFFF_^1_%ENQ NUMENT_'NUMBER OF TABLE ENTRIES MINUS ONE_^1_%XFQ 1_^1IS10_!LFA* FDDFLT,BITFLD,BYTE,1 EXTRACT STATUS BIT TO EXAMINE_^1_%TRA Q_^1_%LDA- BADBIT,I_$BAD STATUS BITS_^1_%AND- BITMSK,Q_^1_%SAN IS20_)FOUND STATUS B€€IT THAT IS BAD_^1_%D1P *-IS10_^1IS20_!LFA* FDDFLT,FLTFLD,BYTE,1 REPORT FAULT CODE FOUND_^1_%JMP* (ISOFLT)_$RETURN_^1_%SPC 5_^1****_]_^1*E_]_^1*_*FAULT TABLE - FDDFLT_^1*_+BITS 15-8, FAULT CODE NUMBER_^1*_+BITS 7-0, BIT POSITION CORRESPONDING TO ERROR STATUS WORD_^1*_]_^1*_*ENTRIES ARE ORDERED TOP TO BOTTOM BY LEAST IMPORTANT TO_^1*_*MOST IMPORTANT FAULT CODE VALUES THAT SHOULD BE€€ RETURNED._^1*_]_^1****_]_^1FDDFLT VFD X8/NINTSL,X8/BIT06_^1_%VFD X8/NOINTR,X8/BIT05_^1_%VFD X8/UNITIO,X8/BIT04_^1_%VFD X8/UNSEEK,X8/BIT03_^1_%VFD X8/UNBUSY,X8/BIT01_^1_%VFD X8/LOSTDA,X8/BIT10_^1_%VFD X8/PARERR,X8/BIT07_^1_%VFD X8/PRTERR,X8/BIT08_^1_%VFD X8/ERBANK,X8/BIT09_^1_%VFD X8/DATAER,X8/BIT12_^1_%VFD X8/TSERR,X8/BIT11_^1_%VFD X8/NREADY,X8/BIT00_^1*_]_^1_%EQU NUM€@ENT(*-FDDFLT-1) NUMBER OF ENTRIES MINUS ONE_^1*_]_^1_%END_]_^__@PJFDD CSY/ C69 P€1_%NAM JFDD_)DECK-ID C69 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_.***********************************_^1*_.* UNUSED ENTRIES (NON DIAGNOSTIC) *_^1*_.***********************************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*THIS MODULE EXITS TO THE DRIVER'S EXIT ROUTINE_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*NONE_^1*_]_^1*_]_^1*_MISC_^1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT CGHOS€€T_'DUMMY CHECK FOR CONSTANT INTERRUPTS_^1_%ENT FSTIME_'DUMMY RECORD 3.3 MS CLOCK COUNTER_^1_%ENT PFDD_)DUMMY ILLEGAL FUNCTION SUBROUTINE_^1_%ENT QFDD_)DUMMY A/Q TRANSFER ROUTINE_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* ZFDD_)THE DRIVER'S EXIT ROUTINE_^1****_]_^1_%EJT 0_^1DUMMY NUM $FFFF_(COMMON ENTRY POINT_^1_%EQU CGHOST(DUMMY)_^1_%EQU FSTIME(DUMMY)_^1_%EQU PFDD(DUMMY)_^1€N_%EQU QFDD(DUMMY)_^1_%JMP ZFDD_)EXIT TO DRIVER'S EXIT ROUTINE_^1_%END_]_^__ NPDUFDD CSY/ C70 P€1_%NAM DUFDD_(DECK-ID C70 PERIPH. DRIVERS 1.1C SUMMARY-110_^1_%SPC 2_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEM DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP 1976_^1_%SPC 5_^1****_]_^1*E_]_^1*_]_^1*_]_^1*_3***********************_^1*_3* DUMMY WRITE COMPARE *_^1*_3***********************_^1*_]_^1*_]_^1*_FLOW_^1*_>----_^1*_]_^1*_*DUFDD SETS PASCNT TO EXIT NFDD MODULE_^1*_]_^1*_]_^1*_;SUBROUTINES_^1*€€_;-----------_^1*_]_^1*_*NONE_^1*_]_^1*_]_^1*_MISC_^€€1*_>----_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT UFDD_)WRITE COMPARE ENTRY_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1*_*NONE_^1*_]_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_*NFDD'S PASS OPTION_^1*_]_^1_%EQU BADTRK(0)_#BAD TRACK SEEK_^1_%EQU SUSPD1(1)_#FIRST SUSPEND_^1_%EQU SEC5RD(2)_#SECTOR 5 READ_^1_%EQU STATCK(3)_#STATUS CHECK- DEFINE WRD/SEC AND SEC/TRK_^1_%EQU EBDIC(4)_$CONVERT BAD€€ TRACK INFO TO EBDIC_^1_%EQU EXIT2(5)_$COMPLETE NFDD PROCESSING AND LEAVE_^1_%EQU OFFTRK(6)_#OFF TRACK AND TRACK ZERO SEEK_^1_%EQU SCSEEK(7)_#SECTOR SEEK_^1_%EQU SUSPD2(8)_#SECOND SUSPEND_^1_%EQU DOIO(9)_%START THE I/O_^1_%EQU CONTIO(10)_"CONTINUE I/O AND CHECK STATUS_^1_%EQU ENDSP1(11)_"START I/O ON OTHER UNIT_^1_%EQU INITUF(12)_"INITIALIZE WRITE COMPARE_^1_%EQU SNSEEK(13€€)_"SECOND SECTOR SEEK_^1_%EQU SUSPD3(14)_"THIRD SUSPEND_^1_%EQU DOUFIO(15)_"START THE UFDD'S READ_^1_%EQU CONTRD(16)_"CONTINUE UFDD READ AND STATUS CHECK_^1_%EQU UFCMPR(17)_"UFDD CALL FOR WRITE COMPARE_^1_%EQU ENDSP2(18)_"START I/O ON OTHER UNIT_^1_%EQU EXIT1(19)_#COMPLETE NFDD PROCESSING AND LEAVE_^1****_]_^1_%EJT 0_^1UFDD_!NUM $FFFF_^1_%ENQ EXIT1-1_%DONE WITH NFDD I/O_^1€6_%STQ- PASCNT,I_^1_%JMP* (UFDD)_'RETURN_^1_%END_]_^__ 6PDSMD CSY/ C71 P€1_%NAM DSMD_)DECK-ID C71 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$2 CPU 1733/858 DISK DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 3_^1*_*THIS VERSION INCLUDES THE OVERLAY ROUTINE_^1_%SPC 1_^1*_*THE MASS MEMORY ADDRESS GIVEN IN THE CALL_^1*_*IS INTERPRETED AS FOLLOWS_^1*_*FOR READ/WRITE AS A W€€ORD ADDRESS_^1*_*FOR FREAD/FWRITE AS A SECTOR ADDRESS (96 WORDS/SECTOR)_^1_%SPC 3_^1****_]_^1*S3_]_^1*_$THIS STORAGE MODULE DRIVE (SMD) DISK DRIVER, KNOWN AS DSMD, IS_^1*_$A KERNEL STRUCTURED DRIVER AND IS COMPOSED OF THE FOLLOWING 12_^1*_$MODULES AND 5 DUMMY ROUTINES :_^1*_]_^1*_$(1) 'DSMD'_!----- THE SMD KERNEL DRIVER. THIS ROUTINE IS USED_^1*_8TO INTERFACE WITH MSOS AND RTOS€€. IT CONSISTS_^1*_8OF TWO ENTRIES, THE INITIATOR ENTRY AND THE_^1*_8COMPLETION ENTRY. THE INITIATOR IS USED_^1*_8TO DECODE AND SET UP THE NECESSARY DATA_^1*_8FROM THE CALLING SEQUENCE FOR THE OTHER PART_^1*_8OF THIS DRIVER. THE COMPLETION ENTRY IS_^1*_8ENTERED WHEN DATA TRANSFER IS COMPLETED._^1*_8IT RESETS THE PROPER POINTERS AND CLEAR THE_^1*_8CU. UNDER DUAL CPU CONFIGURATION,€€ THE ALTER-_^1*_8NATE DA INTERRUPT IS SET UP IF THE DRIVE IS_^1*_8REQUESTED BY THE OTHER CPU._^1*_]_^1*_]_^1*_$(2) 'CSMD'_!----- THIS MODULE IS USED TO ANALYZE INTERRUPT_^1*_8INFORMATION. THERE ARE 6 DIFFERENT TYPES_^1*_8OF INTERRUPTS, THEY ARE: (A) TRANSFER_^1*_8COMPLETED, (B) ALARM, (C) SEEK END, (D)_^1*_8END OF CYLINDER, (E) ALTERNATE DA INTERRUPT,_^1*_8AND (F) FORCE RELEASE BY€€ OTHER CPU._^1*_8INTERRUPTS ARE SET UP BY ONE OF THESE THREE_^1*_8FUNCTIONS. (A) DATA TRANSFER WITH TRANSFER_^1*_8COMPLETED, ALARM AND END OF CYLINDER INTER-_^1*_8RUPTS SELECTED, (B) SEEK (LOAD ADDRESS)_^1*_8WITH ALARM AND SEEK END INTERRUPTS CHOSEN,_^1*_8AND (C) RE-SELECT DA WITH ALARM, SEEK END,_^1*_8AND ALTERNATE DA INTERRUPTS DESIGNATED._^1*_8INTERRUPT ANALYSIS IS BASED ON THE €€ABOVE SET-_^1*_8UP, AND THE NEXT PROPER MODULE IS GIVEN_^1*_8CONTROL ACCORDINGLY._^1*_]_^1*_]_^1*_$(3) 'ESMD'_!----- THIS IS THE ERROR ROUTINE FOR THE SMD DRIVER._^1*_8IT IS ENTERED EITHER FROM THE DIAGNOSTIC TIMER_^1*_8, OR OTHER I/O ERROR CONDITION, SUCH AS I/O_^1*_8REJECT,ETC. ALL FUNCTNS ARE ALLOWED TO122*4185_^1*_8RETRY WHEN ENTERED FROM THE DIAGNOSTIC TIMER._^1*_8ALL OTHER I/€€O ERRORS ARE LOGGED ON THE122*4185_^1*_8ENGINEER'G FILE IF THE UNIT IS ACTIVE.122*4185_^1*_]_^1*_]_^1*_$(4) 'BSMD'_!----- I/O OPERATION IS COORDINATED BY THIS ROUTINE._^1*_8(A) INITIAL ENTRY, CHECK DRIVE TO ENSURE DA_^1*_8IS CURRENTLY UNUSED FOR DATA TRANSFER. IT_^1*_8CONNECTS THE CU. (B) IT CONNECTS THE DRIVE_^1*_8AND THEN STARTS THE SEEK OPERATION. (C) AFTER_^1*_8COMPLETION OF€€ SEEK OR DATA TRANSFER, THE NEXT_^1*_8EXECUTION SEQUENCE IS DEPENDENT ON THE CONTENT_^1*_8OF THE Q-REGISTER._^1*_]_^1*_]_^1*_$(5) 'XSMD'_!----- I/O OPERATIONS, SEEK (LOAD ADDRESS), AND DATA_^1*_8TRANSFER IS EXECUTED BY THIS ROUTINE._!IT_^1*_8ALSO HANDLES SPLIT TRANSFER (DATA STORED IN_^1*_82 CYLINDERS). IT ALSO SEARCHES FOR A UNIT_^1*_8WAITING FOR A DRIVE._^1*_]_^1*_]_^1*_$(6) 'A€€LMERR' ----- ALARM CONDITION IS ANALYZED BY THIS ROUTINE._^1*_8RECOVERY IS INITIATED, IF REQUIRED, OTHERWISE_^1*_8THE ERROR IS REPORTED._^1*_]_^1*_]_^1*_$(7) 'SSMD'_!----- THIS MODULE IS A COLLECTION OF SUBROUTINES_^1*_8WHOSE FUNCTIONS ARE TO OBTAIN THE DA, CU,_^1*_8AND ASSOCIATED I/O STATUS, CONNECTING DA,_^1*_8CU, ETC., OR CLEAR STATUS._^1*_]_^1*_]_^1*_$(8) 'LIKDUM' ---- THIS MO€€DULE SIMULATES THE DISK TO LOOK LIKE_^1*_8A DRUM TO ALLOW WORD ADDRESSING WITHIN A_^1*_8SECTOR._^1*_]_^1*_]_^1*_$(9) 'ECCALG' ---- THIS ROUTINE IS FOR THE ECC CORRECTION_^1*_8ALOGRITHM CALCULATION WHEN AN ECC ERROR IS_^1*_8DETECTED ON READ OPERATION._^1*_]_^1*_]_^1*_$(10) 'MPDRIV' ---- THIS IS AN OPTIONAL MODULE WHOSE FUNCTION IS_^1*_8TO LOCATE THE HIGHEST COMPLETION PRIORITY_^1*_€€8LEVEL OF ALL COMPLETED SEEK DRIVES. ITS OTHER_^1*_8FUNCTION IS TO CHECK IF THE REQUESTED DRIVE IS_^1*_8AVAILABLE. ALTERNATE CHANNEL REQUEST IS SET IF_^1*_8DRIVE IS CURRENTLY USED BY THE OTHER DA._^1*_]_^1*_]_^1*_$(11) 'DILUSS' ---- FUNCTIONALLY,THIS MODULE PERFORMS THE_^1*_8INITIALIZATION OF THE DIAGNOSTIC STATUS WORD_^1*_8BUFFER WITH $FFFF AT INITIATOR ENTRY AND READS_^1*_8IN AL€€L THE POSSIBLE STATUS WORDS AT THE INTER_^1*_8RUPT ENTRY. THIS IS AN OPTIONAL MODULE._^1*_]_^1*_]_^1*_$(12) 'SMD2DA' ---- THE FUNCTION OF THIS ROUTINE IS TO GET122*4185_^1*_8THE DRIVE OR CU FROM THE OTHER DA (DISK_^1*_8ADAPTER) UNDER MULTIPLE DA CONFIGURATION._^1*_8IT IS AN OPTIONAL MODULE_^1*_]_^1*_]_^1*_$(13) 'SMDNDR' ---- THIS MODULE CONTAINS THE NECESSARY_"122*4185_^1*_8ROUTINE€€S FOR PROCESSING A CONFIGURAT'N122*4185_^1*_8WITH MULTIPLE DRIVES._0122*4185_^1_%SPC 2_R122*4185_^1*_$(14) 'SMD1DA' ---- THIS MODULE CONTAINS DUMMY ENTRIES NOT122*4185_^1*_8REQUIRED FOR A 1 DA CONFIGURATION. IT 122*4185_^1*_8IS USED IN PLACE OF SMD2DA. IF THESE 122*4185_^1*_8ENTRIES ARE CALLED THEY MAY CALL_$122*4185_^1*_8SYSTEM FAIL ENTRY._3122*4185_^1_%SPC 2_R122*4185_^1*_$(15€€) 'SMD1DR' ---- THIS MODULE CONTAINS DUMMY ENTRIES_"122*4185_^1*_8NOT REQ'D FOR A 1 DRIVE CONFIGURATION.122*4185_^1*_8IT IS USED IN PLACE OF SMDNDR._'122*4185_^1_%SPC 2_R122*4185_^1*_$(16) 'DMYCP ' ---- THIS MODULE CONTAINS DUMMY ENTRIES_"122*4185_^1*_8NOT REQ'D FOR A NON-TIMESHARE SYSTEM. 122*4185_^1*_8IT IS USED IN PLACE OF 'SMDCP'._%122*4185_^1_%SPC 2_R122*4185_^1*_$(17) 'NODI€€AS' ---- THIS MODULE CONTAINS DUMMY ENTRIES_"122*4185_^1*_8NOT REQ'D WHEN THE DIAGNOSTIC LOGICAL 122*4185_^1*_8UNIT IS NOT SPECIFIED IN THE SYSTEM. 122*4185_^1*_8IT IS USED IN PLACE OF 'DILUSS'._$122*4185_^1_%SPC 2_R122*4185_^1*_$NOTE - SEE WORD 52 OF PHYSICAL DEVICE TABLE FOR DEFINING 122*4185_^1*_$SYSTEM CONFIGURATION._C122*4185_^1_%SPC 2_R122*4185_^1*_$IN ORDER FOR THE DIAG. €€FEATURE TO BE INCLUDED,IT MUST_"122*4185_^1*_$BE REQUESTED WHEN THE SYSTEM IS ORDERED. THIS WILL_%122*4185_^1*_$SET-UP WORD 17 OF THE PHYSICAL DEVICE TABLE WITH THE_#122*4185_^1*_$DIAGNOSTIC LOGICAL UNIT. WORDS 52(DIAGSP) AND 64(STROBE) 122*4185_^1*_$ARE USED BY THE DIAGNOSTIC PROGRAM TO TELL THE DRIVER_"122*4185_^1*_$TO INITIATE THE FOLLOWING FEATURES._5122*4185_^1*_)1. FORMAT-WRI€€TE (ZERO-OUT TRACK,HARDWARE FEATURE)_"122*4185_^1*_)2. READ ADDRESS TAGS_@122*4185_^1*_)3. WRITE ADDRESS TAGS_?122*4185_^1*_)4. READ WITH STROBE SET_=122*4185_^1*_)5. SEEK ONLY REQUEST_@122*4185_^1*_$SEE PHYSICAL DEVICE TABLE FOR FORMAT OF WORDS 52 AND 64. 122*4185_^1*_]_^1*_]_^1*_]_^1*_*THE STORAGE CAPACITY DEFINED BY THIS DRIVER AS SHOWN_^1*_]_^1*_*(1) 30720 WORDS/CYLINDER_^1*_*(€€2) 6144 WORDS/TRACK_^1*_*(3) 5 TRACKS/CYLINDER_^1*_*(4) 64 SECTORS/TRACK_^1*_*(5) 96 WORDS/SECTOR_^1*_]_^1*_*ALL THESE DATA ARE DEFINED BY A SET OF 'EQUS' AT SYSTEM_^1*_*DEFINITION._^1*_]_^1*_*A 96 WORD BUFFER IS USED (FOR EACH PHYSICAL DEVICE TABLE)_^1*_*FOR UNEVEN SECTOR (UNFORMATTED) DATA TRANSFER. IF IT IS_^1*_*REQUIRED BY A SYSTEM TO ELIMINATE THE NUMBER OF MASS MEMORY_^1*_*O€€PERATIONS FOR A REQUEST, THIS BUFFER CAN BE CHANGED TO A_^1*_*LARGER SIZE BY MODIFYING THE 'PHYTAB' BUFFER SIZE AND THE_^1*_*SYSTEM 'EQU' DEFINITION FOR THIS BUFFER SIZE._^1*_]_^1*_]_^1*_*ERROR CODES USED BY THE DRIVER AND THEIR DEFINITIONS_^1*_]_^1*_]_^1*_+ERROR_#DEFINITION_^1*_,NO._^1*_]_^1*_,00_%I/O HANG UP -- DIAGNOSTIC TIMER EXPIRED ON EITHER_^1*_5SEEK OPERATION OR DATA TRANSF€€ER._^1*_]_^1*_,01_%LOST DATA_^1*_0(ERROR 02 DELETED )_:122*4185_^1*_]_^1*_,03_%STORAGE PARITY_^1*_]_^1*_,05_%INTERNAL REJECT -- I/O OPERATION._^1*_]_^1*_,06_%EXTERNAL REJECT -- I/O OPERATION._^1*_]_^1*_,14_%UNIT IS NOT READY -- RESULTING FROM TRY TO_^1*_5CONNECT DRIVE._^1*_]_^1*_,17_%SEEK OPERATION ERROR -- WHEN SEEK OPERATION ERROR_^1*_5IS ENCOUNTERED, RETURN TO ZERO SEEK IS INITI€€ATED_^1*_5AND, IF RETURN TO ZERO SEEK IS UNABLE TO BE_^1*_5ACCOMPLISHED IN THE MAX. ALLOWED NUMBER OF_^1*_5RETRYS, THIS ERROR IS SET TO INDICATE THE_^1*_5CONDITION._^1*_]_^1*_*TWO CARDS DELETED_B116*4315_^1*_,19_'PROTECT FAULT_^1*_]_^1*_,41_%UNSUCCESSFUL REQUEST -- AFTER THE MAX. NO. OF_^1*_5RETRY IS ATTEMPTED ON DATA TRANSFER._^1*_/(ERROR 44 DELETED,SEE ERROR 82)_/122*4185_^1*_]_^€€1*_,70_%CONNECT ERROR -- FAILURE TO CONNECT THE CU OR_^1*_5THE DRIVE WITH THE MAX. NUMBER OF RETRYS._^1*_]_^1*_,71_%UNCORRECTABLE ECC ERROR -- ECC CORRECTION FAILED._^1*_]_^1*_,72_%GHOST INTERRUPT -- UNACCOUNTED INTERRUPT._^1*_]_^1*_,73_%FORCE RELEASE ERROR FOR MULTIPLE DA SYSTEM._^1*_]_^1*_,74_%DATA XFER LONGER THAN REQUESTED. THIS CAN HAPPEN_^1*_5IF THE REQUEST HAS A FWA OF $FFFE€€ OR IF THE H/W_^1*_5FAILS._^1*_]_^1*_,82_'CU/33 ERROR_^1*_]_^1*_,83_'MEMORY ADDRESS ERROR (DA ADDRESS NON-EXISTENT_^1*_6ADDRESS OF CORE MEMORY)_^1*_]_^1*_]_^1*_$NOTED THAT GHOST INTERRUPT ERROR (WORD 18) AND FORCE RELEASE_^1*_$ERROR (WORD 62) COUNTS ARE NOT RESET BY THE DRIVER. THEREFORE_^1*_$THESE 2 COUNTERS CONTAIN THE ACCUMITATIVE COUNTS FOR THESE 2_^1*_$TYPE OF INTERRUPTS._^1*€€_]_^1*_*MOTION REQUEST ON MASS MEMORY DEVICE IS TREATED AS NO OPER-_^1*_*ATION. OVERLAPPING SEEK IS ALLOWED (OR PERFORMED). FUNC-_^1*_*TIONALY, IT IS ABLE TO HANDLE 2-DA AND MULTIPLE DRIVES._^1*_]_^1*_]_^1*S3_]_^1*_*IN VIEW OF THE COMPLEXITY OF THE MAX. I/O CONFIGURATION,_^1*_*2 CPUS, 2 DISK ADAPTERS AND MULTIPLE DRIVES. THE I/O STEPS_^1*_*EXECUTED BY THIS ROUTINE ARE DESCRIBED I€€N THE FOLLOWING %_^1*_]_^1*_*(A) SEEK OPERATION :_^1*_]_^1*_/(1) CONNECT CU (MAKE SURE IS AVAILABLED)._^1*_/(2) POLL DRIVE AVAILABILITY (NOTED% DRIVE IS DISCON-_^1*_3NECTED AFTER POLL)._^1*_/(3) CONNECT DRIVE WHEN AVAILABLE._^1*_/(4) SELECT ALARM AND SEEK END INTERRUPTS._^1*_/(5) PERFORM SEEK OPERATION (LOAD CYLINDER)._^1*_/(6) GET DA STATUS TO ENSURE NOT ERROR ENCOUNTERED._^1*_/(€€7) DE-SELECT CU (TO INITIATE FIRMWARE TO UPDATE INT-_^1*_3ERRUPT, ETC. STATUS)._^1*_]_^1*_*NO I/O REJECTION IS ACTIVATED ON SEEK OPERATION IF DRIVE_^1*_*IS NOT CONNECTED._^1*_]_^1*_]_^1*_]_^1*_]_^1*_*INTERRUPT PROCESS STEPS_^1*_]_^1*_*GET DA STATUS AND SEPARATE AS ONE OF THE FOUR CASES :_^1*_*(A) SEEK END, (B) DATA TRANSFER COMPLETED/END OF CYLINDER,_^1*_*(C) ALTERNATE DA, AND (D€€) GHOST INTERRUPT._^1*_]_^1*_*(A) SEEK END I/O STEPS :_^1*_.(1) CLEAR DA INTERRUPT_^1*_.(2) CONNECT CU_^1*_.(3) POLL SEEK END CONDITION_^1*_.(4) ISOLATE THE SEEK END DRIVE_^1*_.(5) CONNECT CU_^1*_.(6) CONNECT DRIVE_^1*_.(7) CLEAR SEEK END OF THIS DRIVE_^1*_.(8) READ DRIVE FAULT CONDITION TO ENSURE NO ERROR WAS_^1*_2ENCOUNTERED._^1*_.(9) SEARCH THE HIGHEST REQUEST PRIORITY FROM ALL €€SEEK_^1*_2COMPLETED DRIVES AND GO TO START DATA TRANSFER._^1*_-(10) POLL SOURCE USAGE TO MAKE SURE THIS CPU CAN USE DA_^1*_-(11) CONNECT DRIVE_^1*_-(12) OUTPUT DATA TRANSFER WITH ALARM, TRANSFER COMPLETE,_^1*_2AND END OF CYLINDER INTERRUPTS_^1*_]_^1*_*ITEMS 1-3 ARE CSMD STEPS, ITEMS 4-9 ARE EXECUTION SEGMENT_^1*_*OF 'CHKPRI' (ENTRY INDEX 5 OF XSMD), AND ITEMS 10-12 ARE_^1*_*THE STE€€PS IN 'DATA' OF XSMD (ENTRY INDEX 6)._^1*_]_^1*_*IN VIEW OF THE DIAGNOSTIC REQUIREMENT ON STATUS WORDS DATA,_^1*_*THE DEVICES ARE CONNECTED AT THE INTERRUPT ENTRY POINT ARE_^1*_*LISTED IN THE FOLLOWING:_^1*_*(A) DATA TRANSFER COMPLETED --- DRIVE, CU/33 AND DA ARE_^1*_.CONNECTED_^1*_*(B) SEEK END INTERRUPT --- DA IS NOT NECESSARY CONNECTED_^1*_.TO CU/33._^1*_*(C) ALTERNATE DA INTERR€€UPT --- DA IS NOT NECESSARY CONNECTED_^1*_.TO CU/33_^1*_*(D) FORCE RELEASE INTERRUPT --- DA IS NOT NECESSARY_^1*_.CONNECTED TO CU/33_^1*_*THEREFORE IT IS NOT POSSIBLE TO TAKE ALL INPUT STATUS_^1*_*WORDS AT THE INTERRUPT ENTRY POINT FOR ALL CASES._^1*_]_^1*_]_^1*_]_^1*_*(B) DATA TRANSFER COMPLETED/END OF CYLINDER I/O SEQUENCES :_^1*_]_^1*_.(1) CLEAR DA INTERRUPT_^1*_.(2) POLL ALT. D€€A STATUS TO CHECK IF OTHER CPU NEEDS THE_^1*_2DA_^1*_.(3) CLEAR DRIVE SEEK END INTERRUPT_^1*_.(4) DESELECT CU_^1*_]_^1*_]_^1*_*(C) ALTERNATE DA INTERRUPT PROCESS :_^1*_]_^1*_.(1) CONNECT CU_^1*_.(2) MAKE SURE DRIVE IS AVAILABLE BY POLLING THE DRIVE_^1*_2AVAILABLE STATUS._^1*_.(3) GO TO STEP 3 OF SEEK OPERATION_^1*_]_^1*_]_^1*_]_^1*_*(D) GHOST INTERRUPT :_^1*_]_^1*_.(1) SET ERROR AN€€D USE THE ERROR PROCESSING IF UNIT IS_^1*_2ACTIVE._^1*_]_^1*_]_^1*_]_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_$SAMPLE PHYSICAL DEVICE TABLE_^1*_]_^1*---------------------------------------------------------------------_^1*_$ADC $5209_(00_!SCHEDULER CALL_^1*_$ADC ISMD_)01. DRIVER INITIATOR_^1*_$ADC CSMD_)02. DRIVER CONTINUATOR_^1*_$€€ADC ESMD_)03. DRIVER ERROR ENTRY_^1*_$NUM -1_+04. DIAGNOSTIC CLOCK_^1*_$NUM 0_,05. LOGICAL UNIT_^1*_$NUM 0_,06. PARAMETER ADDRESS_^1*_$NUM $0700_(07. CONVERTER, EQUIPMENT, STATION._^1*_$ADC $1006+T8671_!08. SYSTEM STATUS_^1*_$NUM $0200_(09. REQUEST STATUS_^1*_$NUM 0_,10. NEXT LOCATION TO STORE/OBTAIN DATA_^1*_$NUM 0_,11. LAST LOCATION + 1_^1*_$NUM 0_,12. LAST VALUE OF EQU€€IPMENT STATUS_^1*_$NUM 0_,13. DRIVER LENGTH (IF MM RESIDENT)_^1*_$NUM 0_,14. NAME ASSOCIATED WITH SECTOR NO. (MM RESID._^1*_$NUM 0_,15. SECTOR NUMBER OR FNR RETURN_^1*_$NUM 0_,16. KERNEL FAULT CODE IF AN ERROR OCCURED_^1*_$NUM 0_,17. DIAGNOSTIC UNIT NUMBER_^1*_$NUM 0_,18. GHOST INTERRUPT COUNTS_^1*_$NUM 0_,19. MIRCO INTERRUPT NUMBER IF ANY, FOR DEVICE_^1*_$NUM 0_,20. TIME I€€N SECONDS FOR INTERRUPT WAITING_^1*_$NUM 0_,21. STATUS AFTER THE INITIAL ENTRY INTO KERNEL_^1*_$NUM 0_,22. STATUS AFTER DEVICE HAS INTERRUPTED_^1*_$NUM 0_,23. STATUS AFTER THE DEVICE'S INTERRUPT TIMEOT_^1*_$NUM 0_,24. CYLINDER ADDRESS FOR TRANSFER_^1*_$NUM 0_,25. TRACK AND SECTOR FORMATTED_^1*_$NUM 0_,26. UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1*_$NUM 0_,27. TEMPORARY C€€YLINDER FOR WORD ADDRESSING_^1*_$NUM 0_,28. USED BY WORD ADDRESSING (TRACK/SECTOR)_^1*_$NUM 0_,29. USED BY WORD ADDRESSING (FWA)_^1*_$NUM 0_,30. USED BY WORD ADDRESSING (LWA)_^1*_$NUM 0_,31. USED BY WORD ADDRESSING (WORD IN SECTOR)_^1*_$NUM 0_,32. LAST VALUE OF CU STATUS_^1*_$NUM 0_,33. LAST VALUE OF DRIVE 1 STATUS_^1*_$NUM 0_,34. LAST VALUE OF DRIVE 2 STATUS_^1*_$NUM 0_,35€€. DATA TRANSFER FUNCTION CODE_^1*_$NUM 0_,36. LAST DATA TRANSFER FUNCTION CODE_^1*_$NUM 0_,37. RETURN ADDRESS INDEX FOR DATA TRANSFER_^1*_$NUM 0_,38. DA NUMBER_^1*_$NUM 0_,39. LOGICAL DRIVE NUMBER OF DISK (AUTO LOAD)_^1*_$NUM 0_,40. COUNTER FOR SEEK ERROR_^1*_$NUM 0_,41. RETURN SEEK TO ZERO FLAG_^1*_$NUM 0_,42. ERROR COUNTER_^1*_$NUM 0_,43. REQUEST PRIORITY_^1*_$NUM 0_,44.€€ REQUEST CODE_^1*_$NUM 0_,45. RESERVED FOR OVERLAY_^1*_$NUM 0_,46. RESERVED FOR OVERLAY_^1*_$NUM 0_,47. RESERVED FOR OVERLAY_^1*_$NUM 0_,48. RESERVED FOR OVERLAY_^1*_$NUM 0_,49. NOT USED_^1*_$NUM 0_,50. INDEX THRU OFFSET JUMP TABLE_^1*_$NUM 0_,51. LAST VALUE OF DRIVE FAULT STATUS_^1*_$NUM 0_,52. SPECIAL WORD FOR SPECIFYING SYSTEM122*4185_^1*_9CONFIGURATION AND DIAGNOSTIC PR€€OGRAM 122*4185_^1*_;BIT 15- =0 1 DA_3122*4185_^1*_C=1 2 DA_3122*4185_^1*_?14- =0 1 DRIVE_0122*4185_^1*_C=1 MULTIPLE DRIVES_(122*4185_^1*_?13- =0 NON-TIMESHARE SYSTEM_"122*4185_^1*_C=0 TIMESHARE SYSTEM_'122*4185_^1*_?3-0 SET BY DIAGNOSTIC PROGRAM 122*4185_^1*_E=0 NORMAL_/122*4185_^1*_E=6 F-WRITE_.122*4185_^1*_EOTHER ADDRESS TAGS_%122*4185_^1*_$NUM 1_,53. ECC ERROR RECOVERY FLAG (1€€ = DO RECOVERY)_^1*_$NUM 4_,54. MAX. ERROR RETRIALS FOR SEEK,OPERATION_^1*_$NUM 5_,55. MAX. ERROR RETRIALS FOR DATA TRANSFER_^1*_$NUM 5_,56. MAX. ERROR RETRIALS FOR CU CONNECTION_^1*_$NUM 5_,57. MAX. TIME COUNTS (NO. OF LOOP) FOR CU_^1*_$NUM 1_,58. DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1*_$NUM 5_,59. DIAGNOSTIC TIMER VALUE FOR CU WAIT_^1*_$NUM 3_,60. DIAGNOSTIC TIMER VAL€€UE FOR ALT CHANNEL WAT_^1*_$NUM 1_,61. DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1*_$NUM 0_,62. FORCE RELEASE COUNT_^1*_$NUM 0_,63. TIME SHARE CONTROL POINT (CP) VALUE_^1*_$NUM 0_,64. THESE BITS ARE SET BY LEVEL 2 DIAG122*4185_^1*_;BIT 15-EARLY STROBE_/122*4185_^1*_?14-LATE STROBE_0122*4185_^1*_@2-SEEK ONLY REQUEST_*122*4185_^1*_@1-DO RETRIES ON ALARM ERROR_!122*4185_^1*_@0-DO€€ RECOVERY ON ALARM ERRORS 122*4185_^1*_$ADC BPSMD0_'65. ADDRESS OF 96 WORDS BUFFER_^1*_$ADC PSMD0_(66. LINK FOR MULTIPLE PHYSICAL DEVICE TABLE_^1*_$NUM 0_,67. RETURN FROM CONNECT CU(CONCU) SR 122*4185_^1*_1ONE SECTOR (96 WORDS) BUFFER FOR WORD ADDRESS_^1*_$BZS BPSMD0(96)_^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1*S3_]_^1*_$BESIDE THE PHYSICAL DEVICE TABLE (PHYTAB), THE FOLLOWING SIX_^1*€€_$WORDS ARE USED BY A NUMBER OF SUBROUTINES OF THIS DRIVER._^1*_]_^1*_$(1) 'SEKINP' --- SEEK IN PROGRESS FLAGS_^1*_*EACH BIT REPRESENTS A LOGICAL DRIVE (WORD 39 OF PHYTAB),_^1*_*THE BIT IS SET WHEN IT IS IN SEEK OPERATION AND SET BY_^1*_*ROUTINE 'SETFNS'OF SEEKOP (XSMD). THE BIT IS RESET BY_^1*_*'CHKPRI' (ENTRY INDEX 5) OF XSMD. THIS WORD IS IN THE_^1*_*'XSMD' MODULE._^1*_]_^1*_$€€(2) 'SEKDON' --- SEEK OPERATION COMPLETION (INTERRUPT) FLAGS_^1*_*THE BITS ASSIGNMENTS ARE SAME AS 'SEKINP'. A BIT IS SET_^1*_*AS THE LOGICAL PRODUCT OF SEEK END HARDWARE STATUS AND_^1*_*'SEKINP' BY CSMD. IT IS RESET BY 'CHKPRI' AS THE SEEK_^1*_*END STATUS IS CLEARED. THIS WORD IS IN 'XSMD' MODULE._^1*_]_^1*_$(3) 'SEKCOM' --- SEEK COMPLETION FLAGS_^1*_*BITS ASSIGNMENTS ARE SAME€€ AS 'SEKINP'_!A BIT IS SET WHEN_^1*_*A SEEK OPERATION IS COMPLETED WITHOUT ERROR AND AFTER SEEK_^1*_*END STATUS IS CLEAR. A BIT IS RESET WHEN DATA TRANSFER_^1*_*BEGINS. THE 'CHKPRI' SEGMENT OF XSMD RESPONSABLE OF THE_^1*_*SETTING/RESETTING OF THESE BITS. THIS WORD IS IN 'XSMD'_^1*_*MODULE._^1*_]_^1*_$(4) 'WANTDR' --- REQUEST DRIVE FROM OTHER DA FLAG_^1*_*EACH BIT IS ASSIGNED TO E€€ACH DRIVE. A BIT IS SET WHEN A_^1*_*DRIVE IS REQUESTED BY THIS CPU WHILE THE DRIVE IS CURRENTLY_^1*_*ENGAGED TO THE OTHER CPU. IT IS RESET BY CSMD UNDER ALTER-_^1*_*NATE DA INTERRUPT. IT IS SET BY 'MPDVCK' OF MPDRIV WHEN_^1*_*THE REQUESTED DRIVE IS CONNECTED TO THE OTHER CPU. THIS_^1*_*BIT IS RESET BY CSMD WHEN ALTERNATE DRIVE INTERRUPT. THIS_^1*_*WORD IS IN 'ESMD'._^1*_]_^1*_$€€(5) 'SELFLG' --- REQUEST CU FLAG_^1*_*WHEN CU IS CURRENTLY CONNECTED TO OTHER DA. THE DRIVE'S_^1*_*PHYTAB ADDRESS IS STORED IN THIS WORD. IT IS RESET BY_^1*_*'CONCU' OF SSMD WHEN CU IS CONNECTED. THIS WORD IS IN 'SSMD_^1*_*MODULE._^1*_]_^1*_$(6) 'DATFLG' --- DATA TRANSFER IN PROGRESS FLAG_^1*_*IT CONTAINS THE DRIVE'S PHYTAB ADDRESS WHEN DATA TRANSFER_^1*_*BEGINS. 'DATA' OF XSM€€D SET THIS WORD. IT IS RESET BY CSMD_^1*_*IN THE 'DONE' SEGMENT (DATA XFRER COMPLETED). THIS WORD IS_^1*_*IN 'CSMD' MODULE._^1*_]_^1*E_]_^1*S3_]_^1*_$DESCRIPTION OF ROUTINES :_^1*_]_^1*_]_^1*_]_^1*_]_^1*_%1. DSMD_^1*_]_^1*_*THERE ARE TWO ENTRIES FOR THIS ROUTINE, THEY ARE :_^1*_*(A) ISMD ---- DRIVER INITIATE ENTRY, AND_^1*_*(B) DONE ---- DATA TRANSFER COMPLETION ENTRY._^1*_]_^1*€€_*AT THE INITIATOR, ISMD, THE NORMAL DRIVER FUNCTIONS SUCH AS_^1*_*MAGNITUDE CHECK OF THE DATA BUFFER, SEPARATE REQUEST CODE_^1*_*AS READ, WRITE OR MOTION, FORMATTED OR UNFORMATTED REQUESTS,_^1*_*SYSTEM DIRECTORY OR NORMAL READ/WRITE REQUEST, ETC., ARE_^1*_*PERFORMED FOR FORMATTED OR SYSTEM DIRECTORY REQUESTS, THE_^1*_*MSB AND LSB OF THE MASS MEMORY ADDRESS IS CONVERTED TO_^1*_*CYL€€INDER, TRACK AND SECTOR ADDRESSES BY 'CYLTRK'. THEN THE_^1*_*PROPER TRANSFER FLAGS AND FUNCTION CODE (READ/WRITE) ARE_^1*_*SET UP AND CONTROL IS TRANSFERRED TO 'BSMD' WHICH COORDIN-_^1*_*ATES THE I/O OPERATION. 'LIKDUM' IS CALLED TO SET UP THE_^1*_*PROPER MASS MEMORY AND CONDITIONS FOR THE DATA TRANSFER_^1*_*FOR THE UNFORMATTED REQUEST. 'BSMD' IS USED FOR I/O_^1*_*OPERATION. AT€€ ENTRY, Q-REGISTER CONTAINS THE PHYSICAL_^1*_*DEVICE TABLE ADDRESS OF THE REQUESTED UNIT._^1*_]_^1*_]_^1*_*'DONE' IS ENTERED VIA AN UNCONDITIONAL JUMP WHEN DATA TRANS-_^1*_*FER IS COMPLETED. IT GENERATES AN ALTERNATE DA INTERRUPT_^1*_*IF THERE IS ANOTHER DA AND REQUEST IT. IF MORE THAN 1 DRIVE_^1*_*IT DESELECT THE CU. COMPLETION REQUEST IS CALLED TO FINISH_^1*_*THE REQUEST AND C€€ONTROL IS TRANSFERRED TO THE FIND NEXT_^1*_*REQUEST PORTION OF THE INITIATOR._^1*_]_^1*_]_^1*_*IF THERE IS NO READ/WRITE REQUEST PENDING, IT RELEASE_^1*_*CONTROL TO THE DISPATCHER IF ONLY 1 DA AND 1 DRIVE ARE IN_^1*_*THE SYSTEM. 'LTOFDR' ENTRY OF THE 'MPDRIV' MODULE IS GIVEN_^1*_*CONTROL IF EITHER MULTI-DRIVE OR MULTI-DA IS CONFIGURATED._^1*_]_^1*_]_^1****_]_^1*_]_^1_%SPC 4_^1*_]€€_^1*-----------_%E N T R Y_$N A M E S_^1*_]_^1_%ENT DONE_)COMPLETION ENTRY_^1_%ENT ISMD_)DRIVER INITIATOR_^1_%ENT I18331_'ENTRY POINT FOR MSOS/RTOS_^1_%ENT GETLOS_'ENTRY TO COMPLETE REQUEST_,122*4185_^1_%SPC 2_^1*-----------_%E X T E R N A L S_^1*_]_^1*_]_^1_%EXT SMDCPG_'SUBROUTINE TO GET THE CONTROL POINT_^1_%EXT CKOVRL_'OVERLAY CHECK_^1_%EXT COMPV4_'MAGNITUDE COMPARISON R€€OUTINE (IN TRVEC)_^1_%EXT CYLTRK_'CONVERT TO CYLINDER, TRACK AND SECTOR_^1_%EXT DASTAT_'GET DA STATUS WORD_^1_%EXT FFILBF_'FILL DIAGNOSTIC BUFFER WITH $FFFF IF APPLIED_^1_%EXT SMDRDR_'TO RELEASE THE DRIVE TO THE OTHER DA._^1_%EXT LTOFDR_'TO CHECK OTHER DRIVES STATUS_^1_%EXT RLSECU_'TO RELEASE CU_^1*_]_^1_%EXT BSMD_)BEGINNING I/O_^1_%EXT LIKDUM_'DRUM SIMULATION (CALCULATE MM€€ ADD. AS WORD)_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%S€€PC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"€€ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/C€€YLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%SPC 1_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$IN€€TERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTA€€BLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_€€%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_€€%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STA€€TUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE F€€AULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!€€CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL€€($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION C€€ODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNF€€ORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETUR€€N TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIV€€ALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN D€€ATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT€€_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_€€"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU €€ WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_€€^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"******€€****_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_€€^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^€€1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"THESE BITS ARE SET BY LEVEL 2 DIAG'TIC122*4185_^1*_;BIT 15 - EARLY STROBE_-122*4185_^1*_;BIT 14 - LATE STROBE_-122*4185_^1*_;BIT 2 - SEEK ONLY REQUEST_(122*4185_^1*_;BIT 1 - DO RETRIES ON ERRORS_$122*4185_^1*_;BIT 0 - DO RECOVERY ON ALARM ERROR122*4185_^1_%EQU €€ ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONNECT CU(CONCU) ROUTINE 122*4185_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_$I N I T I A T O R_^1*_]_^1*---------------------------------------------------------------------_^1_%SPC 3_^1ALTOFD ADC L€€TOFDR_'CODE TO CHECK FOR OTHER DRIVES THAT HAVE_^1*_9COMPLETED SEEKS OR ARE STILL SEEKING._^1*_]_^1ISMD_!STQ- I_,SAVE ADDRESS OF PHYSTB_^1_%EQU I18331(ISMD) ENTRY POINT FOR MSOS/RTOS_^1_%SPC 2_^1DK_#RTJ- (AFNR)_'CHECK FOR A REQUEST ON THIS UNIT_^1_%JMP* (ALTOFD)_$SEE IF THERE ARE ANY OTHER DRIVES TO SERVICE._^1_%SPC 2_^1*_]_^1*_,---_!STANDARD KERNNEL FEATURE FOR THESE 3 STATUS €€WORDS_^1*_]_^1_%SET A_-FILLED WITH $FFFF_^1_%STA- SINTER,I_^1_%STA- STIMEO,I_^1_%STA- SENTRY,I_^1_%RTJ DASTAT_'GET DA STATUS WORD AT ENTRY_^1_%STA- SENTRY,I_^1_%RTJ FFILBF_'FILL DIAGNOSTIC BUFFER WITH $FFFF IF APPLIED_^1*_]_^1DKC_"CLR A_,CLEAR ERROR, SEEK ERROR AND RTZ FLAGS_^1_%STA- ERCONT,I_^1_%STA- SEKERR,I_^1_%STA- RTZFLG,I_^1_%STA- FLTCOD,I_^1_%STA- TABIND,I_$CLEAR THE ECC €€RECOVERY TABLE INDEX_^1_%SPC 2_^1*_]_^1*----_-CHECK MAGNITUDES_^1*_]_^1*_]_^1DKC10 LDA- ELSTWD,I_^1_%LDQ- ECCOR,I_^1_%RTJ COMPV4_'CHECK MAGNITUDES_^1_%INA 0_,-0 FROM COMPV4=ECCOR GT ELWSTWD_%119*4528_^1_%SAN LENOK_(LWD.GT.FWD_^1NOTOK LDA- ECCOR,I_%MAKE LWD G.T. FWD_^1_%INA 1_^1_%STA- ELSTWD,I_^1*_]_^1*_1GET THE CONTROL POINT FROM THE REQUEST_^1*_]_^1LENOK RTJ SMDCPG_^1_%SP€€C 1_^1*_]_^1*-----_,DECODE REQUEST TYPE, CHECK FOR_^1*_8(1) MOTION_^1*_8(2) SYSTEM DIRECTORY_^1*_8(3) READ/WRITE_^1*_]_^1_%LDQ- EPTR,I_'PICK UP THE FWA OF THE REQUEST PARAMETERS_^1_%LDA- (ZERO),Q_^1_%STA- TEMREQ,I_$SAVE THE REQ._^1_%ARS 4_,DROP COMPLETION PRIORITY_^1_%AND- LPMSK+4_%$000F - SAVE REQUEST PRIORITY_^1_%STA- PRILVL,I_(FOR DRIVER_^1_%LDA- TEMREQ,I_$RESTORE REQUEST_^1_%€€ARS 9_^1_%AND- LPMSK+5_%UNPACK THE REQUEST CODE_^1_%STA- TEMREQ,I_$SAVE THE REQUEST CODE_^1_%INA -MOTCOD_%CHECK FOR MOTION REQUEST_^1_%SAN NOTMC_(SKIP IF NOT_^1*_]_^1*_1TREAT MOTION REQUEST AS NO OPERATION_^1*_]_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^1_%JMP* GETLOS_'TO COMPLETE THE REQUEST_^1_%SPC 2_^1*_]_^1*----_-CHECK FOR SYSTEM DIRECTORY REQUEST_^1*_]_^1NOTMC EQU NOTMC(*)_^1_€€%INA MOTCOD_'PUT THE ORIGINAL CODE BACK IN A_^1_%SAN CHKREQ_'SKIP IF NOT A SYSTEM DIRECTORY REQUEST_^1_%LDA- EPTR,I_'PUT THE REQUEST ADDRESS INTO A_^1_%INA WDSECM-1_$BIAS TO POINT TO THE MSB -1._^1_%RTJ CYLTRK_'CONVERT TO CYLINDER, TRACK, SECTOR_^1SUBCAD EQU SUBCAD(*-1)_!CONVERT TO CYLINDER, TRACK, SECTOR SUB. ADDRES_^1_%JMP* NO1B_^1_%SPC 1_^1*_1FORMATTED/UNFORMATTED READ/WRI€€TE REQUEST_^1CHKREQ AND- ONEBIT+2_$(4) CHECK IF FORMAT = READ/WRITE_^1_%SAN NORMAL_'YES, NORMAL FOR DISK_^1_%JMP* WORDAD_'ABNORMAL (UNFORMATTED), GO TO DRUM SIMULATION_^1_%SPC 1_^1*_1FURTHER SEPARATE FORMATTED READ/WRITE_^1*_]_^1NORMAL RTJ- (ASABS)_%ABS. S PARAM. (ADDR. OF WHERE TRANSFER BEGINS)_^1*_]_^1*_'A NOW HAS THE ADDRESS OF THE MSB/LSB -1 IN IT._^1*_]_^1_%RTJ* (SUBCAD)_$C€€ONVERT TO CYLINDER, TRACK, SECTOR_^1_%LDQ- ESTAT1,I_$PICK UP WORD 9 OF PHYSTB (BIT 0 1= READ)_^1_%LRS 1_^1_%SAP NO1A_)SKIP IF FREAD REQUEST_^1FWRITE ENQ RETRN1_'SET RETURN POINTER FOR 'DONE'_^1WRITOP ENA DRCO10_'SET A REG. TO WRITE FUNCTION_^1_%JMP* RD2_^1NO1A_!RTJ CKOVRL_'MOVE PARAMETERS IF OVERLAY REQUEST_^1NO1B_!ENQ RETRN1_'CALCULATE RETURN ADDRESS ('DONE')_^1READOP ENA €€DRCO09_'SET A REG. TO READ FUNCTION_^1RD2_"STQ- EXTRA,I_%SAVE RETURN ADDRESS_"(INDEX)_^1_%STA- FUNCT,I_%SAVE DATA XFER FUNCTION FOR ERROR RETRY_^1_%ADD- EWES,I_'ADD EQUIP CODE ($0XX0)_^1_%STA- FDATAF,I_$DATA TRANSFER FUNCTION CODE_^1_%CLR A_,SET FOR INITIAL ENTRY FOR I/O_^1_%JMP BSMD_^1_%SPC 1_^1*_1UNFORMATTED READ/WRITE (WORD ADDRESS FOR DISK)_^1*_1GO TO DRUM SIMULATION TO CALC€€ULATE ADDRESS, ETC._^1WORDAD ENQ RETRN0_'SET FOR INITIAL ENTRY_^1_%RTJ LIKDUM_'NO LOOK LIKE A DRUM - SECTOR = ONE WORD_^1_%SPC 1_^1*_]_^1*_1RETURN FROM 'LIKDUM', Q-REGISTER CONTAINS DATA_^1*_1TRANSFER TERMINATION POINTER. AND IT RETURNS TO ONE_^1*_1OF THE FOLLOWING THREE LOCATIONS_^1*_1(1) P+1 --- FOR WRITE REQUEST_^1*_1(2) P+2 --- FOR READ REQUEST, AND_^1*_1(3) P+3 --- FOR CO€€MPLETION (TO 'DONE')_^1*_1CONDITION 3 IS NOT APPLIED TO INITIAL CALL._^1*_]_^1_%JMP* WRITOP_'CASE 1 --- WRITE OPERATION_^1_%JMP* READOP_'CASE 2 --- READ OPERATION_^1*_8CASE 3 --- COMPLETED (BELOW), NOT FOR INITIAL_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1TRANSFER COMPLETION ENTRY_^1*_]_^1_%SPC 2_^1DONE_!EQU DONE(*)_^1_%RTJ SMD€ØRDR_'RELEASE THE DRIVE TO THE OTHER DA._^1*******------------- 2 CARDS DELETED (WAS RTJ RLSECU )-------**122*4185_^1GETLOS RTJ- (ACOMPC)_$COMPLETE THE REQUEST_^1_%JMP* DK_+GO CHECK FOR ANOTHER REQUEST_^1_%END_]_^__ ØPCSMD CSY/ C72 P€1_%NAM CSMD_)DECK-ID C72 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SMD DRIVER CONTINUATOR_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_%2. CSMD_^1*_]_^1*_*THERE IS ONE ENTRY TO THIS ROUTINE. THIS ROUTINE IS ENTERED_^1*_*WHEN AN INTERRUPT OCCURS ON THE SMD'S INTERRUPT LINE. THE_^€€1*_*ENTRY POINT IS CALLED:_^1*_]_^1*_1. CSMD_^1*_]_^1*_*THERE ARE SIX DIFFERENT INTERRUPTS ASSOCIATED WITH THE_^1*_*SMD. THESE ARE:_^1*_]_^1*_1. CU SELECTED_^1*_1. TRANSFER COMPLETE_^1*_1. END OF CYLINDER_^1*_1. SEEK END_^1*_1. ALARM_^1*_1. ALTERNATE DA_^1*_]_^1*_*DEPENDING ON THE CURRENT OPERATION DIFFERENT COMBINATIONS_^1*_*OF INTERRUPTS WILL HAVE BEEN ENABLED BY THE DRIVER._^1*_€€]_^1*_.INTERRUPT_,INTERRUPT TYPES_^1*_.INITIATED_^1*_1BY_1A B C D E_^1*_]_^1*_]_^1*_*(1) DATA TRANSFER_)X X_#X_^1*_]_^1*_*(2) SEEK (LOAD ADD.)_)X X_^1*_]_^1*_*(3) RE-SELECT_0X X_#X_^1*_]_^1*_]_^1*_*INTERRUPT TYPE CODES_^1*_]_^1*_.A = TRANSFER COMPLETE_^1*_.B = ALARM_^1*_.C = SEEK END_^1*_.D = END OF CYLINDER_^1*_.E = ALTERNATE DA INTERRUPT_^1*_]_^1*_]_^1*_1CONTINUATOR ANALY€€SIS TASKS_^1*_1(BASE ON DA INTERRUPT STATUS)_^1*_]_^1*_1(1) TRANSFER COMPLETE AND/OR END OF CYLINDER MUST BE_^1*_5ASSOCIATED WITH DATA FLAG, 'DATFLG', IS NONZERO._^1*_]_^1*_1(2) SEEK END MUST BE ACCOMPANIED WITH 'SEKINP' (SEEK_^1*_5IN PROGRESS) SET (A BIT CORRESPONDING TO A DRIVE)_^1*_]_^1*_1(3) ALTERNATE DA IS CHECKED IN CONJUNCTION WITH BITS_^1*_5IN DATA FLAGS 'WANTDR'_^1*_]_^1*€€****************_"3 CARDS DELETED_#*****************_$122*4185_^1*_*THE DA STATUS IS TAKEN AND SAVED IN 'SINTER' (OF THE PHYSCI._^1*_*DEVICE TABLE) AT ENTRY. INTERRUPT IS ANALYZED FOR ONE OF_^1*_*THE 3 CASES, THEY ARE : (1) DATA TRANSFER (EITHER END OF_^1*_*CYLINDER OR END OF TRANSFER), (2) SEEK END, AND (3) ALTERNAT_^1*_*DA. GHOST INTERRUPT COUNT IS INCREMENT BY 1 AND CONTROL_^1€€*_*IS TRANSFERRED TO ERROR EXIT IF NONE OF THE ABOVE 3 TYPES_^1*_*OF INTERRUPTS IS FOUND. THE PROCESSING STEPS FOR EACH_^1*_*INTERRUPT TYPE ARE DISCUSSED IN THE FOLLOWING :_^1*_]_^1*_*(1) DATA TRANSFER --- THE DATA TRANSFER FLAG ('DATFLG') MUST_^1*_*BE SET, OTHERWISE IT IS CONSIDERED AS GHOST INTERRUPT_^1*_*(EXCEPT ADDRESS FIELD ERROR IS SET). STATUS WORDS ARE_^1*_*OBTAINED AND S€€AVED IN THE DIAGNOSTIC BUFFER IF OPTION IS_^1*_*SELECTED. INTERRUPT IS CLEAR AND DIAGNOSTIC TIMER IS RESET._^1*_*ALARM PROCESSOR GAINS CONTROL IF ALARM BIT IS SET. SPLITE_^1*_*TRANSFER PROCESSOR (XSMD MODULE) IS GIVEN CONTROL IF END OF_^1*_*CYLINDER BIT IS SET. OTHERWISE CONTROL IS RELEASED TO BSMD_^1*_*FOR NORMAL DATA TRANSFER COMPLETION CONDITION._^1*_]_^1*_*(2) SEEK END --- S€€TATUS WORDS ARE TAKEN AND SAVED IF THE_^1*_*DIAGNOSTIC OPTION IS SO DESIGNATED. ERROR REPORTING IS_^1*_*ACTIVATED IF ALARM IS DETECTED. DA INTERRUPT IS CLEAR AND_^1*_*SEEK STATUS IS POLLED, GHOST INTERRUPT IS DECLEARED IF NO_^1*_*SEEK END STATUS IS DETECTED. UNDER NORMAL CONDITION,_^1*_*'CHKPRI' OF 'XSMD' MODULE GAINS CONTROL TO SET UP NEXT STEP._^1*_]_^1*_*(3) ALTERNATE DA --- €€GHOST INTERRUPT IS DECLEARED IF ONLY_^1*_*ONE DA IS IN THE SYSTEM. DRIVE IS ISOLATED FROM THE WANT_^1*_*DRIVE FLAG ('WANTDR') AND 'BSMD' IS GIVEN CONTROL._^1*_]_^1*S2_]_^1*_]_^1*_,---_!AT ENTRY :_^1*_1DRIVE, CU/33 AND DA ARE CONNECTED FOR SURE ONLY IF_^1*_1THE INTERRUPT IS FOR DATA TRANSFER COMPLETION._^1*_1OTHER INTERRUPT TYPES MAY NOT HAVE CU/33 CONNECTED._^1*_]_^1****_]_^1*_]_^€€1_%SPC 2_^1*-----------_%E N T R Y_$N A M E S_^1_%ENT CSMD_)SMD DRIVER CONTINUATOR_^1_%ENT C18331_'CONTINUATOR ENTRY POINT FOR MSOS/RTOS_^1_%ENT CONTCU_'ENTRY TO CONTINUE CU SELECT_*122*4185_^1*_1DATA FLAG_^1_%ENT DATFLG_'DATA XFER IN PROGRESS FLAG ('PHYTAB' ADD.)_^1_%SPC 2_^1*-----------_%E X T E R N A L S_^1_%EXT CONCU_(CONNECT CU_^1_%EXT CLRDAS_'CLEAR DA INTERRUPT STATU€€S_^1_%EXT CLRINT_'I/O ERROR PROCESSING_^1_%EXT DASTAT_'GET DA STATUS_^1_%EXT DRICHK_'DRIVE AVAILABLE CHECK_^1_%EXT FILSMD_'GET STATUS WORDS FOR DIAGNOSTIC REQUEST_^1_%EXT SMDGDR_'TO GET THE DRIVE FROM THE OTHER DA._^1_%EXT SMDGD1_'ENTRY TO GET DRIVE W/O SET'G DIA TIMER122*4185_^1_%EXT POLCHK_'POLL CHECK ROUTINE_3122*4185_^1_%EXT CLRACR_'CLEAR ALT.CHL. REQ. BIT_.122*4185_^1_€€%EXT USKNPG_'GET LU WITH SEEK-IN-PROGRESS_)122*4185_^1_%EXT EGHOST_'GHOST INT. LOGIC IN ESMD_-122*4185_^1*_]_^1_%EXT BSMD_)I/O PROCESSING_^1_%EXT XSMD_)SEEK/TRANSFER OPERATION_^1_%EXT ALMERR_'ALARM PROCESSING_^1*_1DATA FLAGS_^1_%EXT P83310_(UNIT 0 PHYSTB ADDRESS_^1_%EXT SEKCOM_'DATA FLAG FOR SEEK END UNITS BUT NOT YET PRO._^1_%EXT SEKDON_'SEEK DONE BITS_^1_%EXT WANTDR_'WAN€€T DRIVE WORD_^1_%EXT SELFLG_'WAITING CU SELECT FLAG_/122*4185_^1_%EXT SEKINP_'SEEKS IN PROGRESS FLAG_/122*4185_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($€€33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZI€€NG ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%€€EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR €€CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED A€€DDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_€€]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%E€€QU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^€€1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%E€€QU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INIT€€IATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTE€€RRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WA€€CLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY €€TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN€€(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*------€€-----------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#S€€YSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%€€EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS €€INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"US€€ED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRA€€NSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQ€€U ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"€€MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TI€€MER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCC€€U(67)_"RETURN FROM CONCU_4122*4185_^1_%EJT_]_^1_%SPC 2_^1*---------------------------------------------------------------------_^1*_]_^1*_$C O N T I N U A T O R_^1*_]_^1*---------------------------------------------------------------------_^1_%SPC 3_^1*_]_^1*_$-_$*****_#DA STATUS BITS FOR INTERRUPT_^1*_]_^1*_1BIT 00 BUSY_^1*_501 INTERRUPT_^1*_502 CU SELECTED_^1*_503 TRANSFER COMP€€LETED_^1*_504 ALARM_^1*_505 SEEK END_^1*_506 END OF CYLINDER_^1*_507 ALTERNATE DA_^1*_]_^1_%SPC 3_^1CSMD_!STQ- I_,SAVE 'PHYTAB' ADDRESS_^1_%EQU C18331(CSMD) ENTRY POINT FOR MSOS/RTOS_^1_%RTJ DASTAT_'GET DA STATUS_^1_%STA TMPDA_(SAVE DA STATUS IN TEMPORY STORAGE_#122*4185_^1_%ALS 13_Q122*4185_^1_%SAP C03_*SENSE CU SELECTED NOT SET_,122*4185_^1_%LDA SELFLG_M122*4185_^1_%SAN €€C05_*SENSE WAITING CU SELECT_.122*4185_^1C03_"JMP* C07_P122*4185_^1_%SPC 2_R122*4185_^1*_/CASE 0 - CU SELECT INTERRUPT_2122*4185_^1_%SPC 2_R122*4185_^1C05_"STA- I_R122*4185_^1_%SET A_R122*4185_^1_%STA- EDCLK,I_%RESET DIAGNOSTIC TIMER_/122*4185_^1_%LDA TMPDA_N122*4185_^1_%STA- SINTER,I_$SAVE CONTINUTOR STATUS_/122*4185_^1_%RTJ CLRDAS_'CLEAR DA INTERRUPT_3122*4185_^1*_'NOTE- LA€€BEL CONTCU IS USED BY ESMD AFTER FORCE RELEASE122*4185_^1CONTCU LDA- RTNCCU,I_K122*4185_^1ACONCU STA CONCU_N122*4185_^1_%LDQ* ACONCU+1_K122*4185_^1_%JMP- 1,Q_*GO TO CONCU SR TO CONTINUE PROCESSING 122*4185_^1C07_"LDA TMPDA_N122*4185_^1_%TRA Q_,STATUS TO Q_^1*_]_^1*_8CHECK FOR END OF TRANSFER, END OF CYLINDER_^1*_8AND ALARM BITS. NOTE THAT ALARM CAN ONLY BE_^1*_8SET DURING A DATA€€ TRANSFER (INCLUDING FORCE_^1*_8RELEASE)._^1*_]_^1_%AND =N$58_^1_%SAN C10_^1_%JMP* C100_)FURTHER SEARCH FOR INTERRUPT TYPE_^1_%SPC 2_^1*_1DATA IN PROGRESS FLAG ADDRESSED BY OTHER_^1DATFLG NUM 0_,DATA TRANSFER IN PROGRESS FLAG ('PHYTAB' ADD.)_^1_%SPC 2_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1CASE 1_!------_"XFER COMPLETED OR/AN€€D EOC_^1*_]_^1*_1INTERRUPT FROM EITHER (1) XFER COMPLETE AND/OR_^1*_G(2) END OF CYLINDER_^1*_]_^1*_1CHECK IF 'DATFLG' (DATA XFER IN PROGRESS) SET_^1C10_"LDA* DATFLG_^1_%SAN C20_*SKIP ON DATA XFER IN PROGRESS_^1_%JMP* C100_)GO ON WITH CHECK_5122*4185_^1C20_"STA- I_,SAVE 'PHYTAB' ADDRESS AND STATUS WORD_^1_%SET A_,RESET DIAGNOSTIC TIMER_^1_%STA- EDCLK,I_^1_%CLR A_,CLEAR DATA TRANS€€FER FLAG_^1_%STA* DATFLG_^1_%LDA* TMPDA_(RECALL DA STATUS AND SAVE ACCORDING TO UNIT_^1_%STA- ESTAT2,I_$SAVE AS CURRENT DA STATUS (FOR ALMERR)_^1_%STA- SINTER,I_^1_%RTJ CLRDAS_'CLEAR INTERRUPT (OF DA)_^1_%EQU ADCLDA(*-1)_^1_%LDA* TMPDA_(RECALL DA STATUS AT INTERRUPT_^1_%LLS 11_+SHIFT ALARM BIT TO SIGN BIT_^1*_1A-REGISTER = DA STATUS SHIFTED 11 LEFT_^1*_1ALLARM BIT IS IN BIT 15 O€€F A-REG._^1_%SAP C30_*SKIP ON NO ALARM_^1C25_"JMP ALMERR_'TO ALARM PROCESSING_^1C30_"LRS 2_,SHIFT END OF CYLINDER BIT TO SIGN BIT OF A_^1_%SAP C40_*SKIP ON NO END OF CYLINDER_^1_%ENQ ECRET1_'GO TO SPLIT XFER PROCESS_^1_%JMP* C140_^1_%SPC 2_^1*_1NORMAL DATA XFER WITHOUT ERROR_^1*_'NOTE- CALL TO FILSMD IS HERE TO ALLOW READING_)122*4185_^1*_)DA FILE REGISTERS._B122*4185_^1C40_"€€ENQ 3_,=CODE FOR FILL DIAG. BUFFER SR_'122*4185_^1_%RTJ FILSMD_'FILL DIAGNOSTIC BUFFER_/122*4185_^1_%LDQ- EXTRA,I_%=DATA XFER EXIT INDEX_0122*4185_^1_%ENA 2_,SET ENTRY INDEX FOR END OF A MM OPERATION_^1C50_"JMP BSMD_^1_%SPC 4_^1*_]_^1*_*---_"NOT DATA XFER INTERRUPT_^1*_]_^1C100_!LRS 6_,SHIFT SEEK END BIT TO SIGN BIT (BIT 15) OF A_^1_%SAM C120_)SKIP, SEEK END_^1_%JMP* C200_)N€€OT SEEK END, GO_^1_%SPC 2_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1CASE 2 ---- SEEK END INTERRUPT_^1*_]_^1C120_!RTJ CLRDAS_'CLEAR DA INTERRUPT STATUS_,122*4185_^1_%RTJ USKNPG_'GET LU WITH SEEK-IN-PROGRESS_)122*4185_^1_%SAZ C128_)SENSE NO SEEK-IN-PROGRESS_,122*4185_^1_%RTJ CONCU_(CONNECT CU_;122*4185_^1_%ENA POLSED_'POLL SEE€€K END STATUS_1122*4185_^1_%RTJ POLCHK_M122*4185_^1_%AND SEKINP_'PASS ONLY SEEKS-IN-PROGRESS STATII_"122*4185_^1_%SAN C130_^1C128_!JMP* C300_)ERROR(NO SEEKS-IN-PROGRESS FOR SEEK_!122*4185_^1*_:END INTERRUPT)_5122*4185_^1C130_!STA SEKDON_'SAVE SEEK DONE BIT(S) AND GO PROCESS_^1_%EOR SEKCOM_'ISOLATE THE INTERRUPTED UNIT_^1_%STA* TMPSK_^1_%SPC 2_^1*_]_^1*_1SEARCH FOR THE INTER€€RUPTED DRIVE(S)_^1*_]_^1*_1PHYSICAL DEVICE TABLE ADDRESS IS SET ACCORDING TO_^1*_1THE INTERRUPTED DRIVE, SO THAT STAUS WORD (DA)_^1*_1AND DIAGNOSTIC OPTIONAL BUFFER (IF NEEDED) CAN BE_^1*_1FILLED PROPERLY._^1*_]_^1C130A LDQ- LOGDRV,I_$GET DRIVE UNIT NO. AND CHECK IF ITS SEEK END_^1_%LDA- ONEBIT,Q_^1_%AND* TMPSK_^1_%SAZ C130B_(NO, NOT THIS UNIT, SKIP_^1*_]_^1*_1SEEK END UNIT LOCA€€TED, RESET DIAGNOSTIC TIMER_^1*_1SAVE STATUS WORDS TO 'SINTER' AND/OR DIAGNOSTIC_^1*_1BUFFER_^1*_]_^1_%ENA -1_+RESET DIAGNOSTIC TIMER_^1_%STA- EDCLK,I_^1_%LDA* TMPDA_(RECALL DA STATUS AND SAVE_^1_%STA- SINTER,I_^1*_]_^1C130B LDQ- OTHER,I_%CHECK IF ALL UNIT BEEN CHECKED_^1_%TRQ A_^1_%SUB* ADUNT0_^1_%SAZ C130C_(SKIP ON ALL BEEN CHECKED_^1_%STQ- I_^1_%JMP* C130A_(CHECK FOR NEXT UN€€IT_^1*_]_^1C130C LDA =XP83310_$RESET I TO UNIT 0 PDT ADDRESS_^1_%EQU ADUNT0(*-1)_^1_%STA- I_^1_%SPC 2_^1*_]_^1*_*---_"NO ALARM CHECK IS NEEDED ON SEEK END._^1*_1ENGINEERING DEPARTMENT STATED THAT NO ALARM IS_^1*_1SET ON SEEK END_^1*_]_^1C130F ENA 0_,SET ENTRY INDEX (FOR 'CHKPRI')_^1_%ENQ ECRET5_'SET INDEX TO 'CHKPRI'_^1C140_!JMP XSMD_)TO SEEK/TRANSFER DATA ROUTINE MODULE_^1€€_%SPC 3_^1*_1LAST CHANCE ----- ALTERNATE DA INTERRUPT CHECK_^1C200_!LRS 2_,SHIFT ALT. DA INTERRUPT TO SIGN BIT (BIT 15) A_^1_%SAP C300_)SKIP IF NO ALT. DA INTERRUPT._^1_%LDA* (WANTAD)_$ALT. DA INTERRUPT, MAKE SURE DRIVE REQUESTED_^1_%SAZ C300_)SKIP IF NO DRIVES WERE REQUESTED._^1_%SPC 4_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1€€CASE 3 - ALTERNATE DA INTERRUPT._^1*_]_^1_%SPC 2_^1_%LDQ* UNIT0_(A. OF PDT 0_:122*4185_^1_%LDA- DIAGSP,Q_$CHECK IF MULTIPLE DA IN SYSTEM_^1_%SAM ADA1_)YES,GO_^1_%SPC 2_^1*_]_^1*_1GHOST INTERRUPT BEEN DETECTED_^1*_]_^1C300_!EQU C300(*)_^1_%JMP EGHOST_'GO TO REPORT GHOST INTERRUPT(ESMD)_"122*4185_^1ADA1_!STQ- I_^1_%RTJ* (ADCLDA)_$CLEAR INTERRUPT_^1_%LDQ- LOGDRV,I_$FETCH LOGIC€€AL DRIVE NUMBER_^1_%LDA- ONEBIT,Q_$BIT FOR THIS DRIVE_^1_%AND* (WANTAD)_$CHECK WITH DRIVES WANTED_^1_%SAN ADA2_)SENSE THIS DRIVE IS WANTED_+122*4185_^1_%JMP* ADA3_O122*4185_^1ADA2_!RTJ CONCU_(CONNECT TO CU_8122*4185_^1_%RTJ DRICHK_'SEE IF DRIVE AVAILABLE NOW_^1_%SAN ADA3_)SKIP IF NOT_^1_%LDQ- LOGDRV,I_K122*4185_^1_%LDA- ZROBIT,Q_^1_%AND* (WANTAD)_$CLEAR DRIVE WANTED BIT_^1_%STA€€* (WANTAD)_^1_%RTJ CLRACR_'CLEAR ALT. CHL. REQ. BIT_-122*4185_^1_%SET A_,RESET DIAGNOSTIC TIMER_^1_%STA- EDCLK,I_^1_%LDA* TMPDA_N122*4185_^1_%STA- SINTER,I_%SAVE CONTINUATOR STATUS_-122*4185_^1_%ENA 1_,SET ENTRY INDEX FOR CONNECT DRIVE AND ON_^1_%JMP* C50_*TO 'BSMD' -- I/O OPERATION_^1ADA3_!LDQ- OTHER,I_%FETCH NEXT PDT ADDRESS_^1_%TRQ A_^1_%SUB* UNIT0_^1_%SAZ RESEL_(SKIP IF AL€€L PDTS CHECKED (RE-SELECT)_^1_%JMP* ADA1_^1*_8SET UP TO GET THE DRIVE FROM THE OTHER DA WITH_^1*_9AN ALTERNATE DA INTERRUPT._^1RESEL JMP SMDGD1_'(DO NOT SET DIAG. TIMER)_-122*4185_^1*_]_^1*_1ADDRESSES_^1*_]_^1*_]_^1UNIT0 ADC P83310_'UNIT 0 PHYSTAB ADDRESS_^1WANTAD ADC WANTDR_'DRIVE REQUEST FLAGS WORD ADDRESS_^1_%SPC 4_^1*_]_^1TMPDA NUM 0_,DA STATUS AT INTERRUPT_^1TMPSK NUM€0 0_,INTERRUPTED SEEK END UNIT(S)_^1_%END_]_^__ 0PESMD CSY/ C73 P€1_%NAM ESMD_)DECK-ID C73 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SMD DRIVER ERROR ENTRY_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_%3. ESMD_^1*_]_^1*_*THERE ARE THREE ENTRIES IN THE ROUTINE,THEY ARE-_"122*4185_^1*_*(A) ESMD ---- DIAGNOSTIC TIMER TIMEOUT ENTRY, AND_^1*_*(B) C€€LRINT -- OTHER I/O ERROR ENTRY._^1*_*(C) EGHOST -- GHOST INTEERUPT ENTRY_0122*4185_^1*_]_^1*_*THE DIAGNOSTIC TIMER IS INITIALIZED BY ONE OF THE FOLLOWING_^1*_*FOUR CONDITIONS :_^1*_*(A) ALTERNATE DA (CU) REQUEST,_^1*_*(B) ALTERNATE DA (DRIVE) REQUEST,_^1*_*(C) SEEK OPERATION (LOAD ADDRESS), AND_^1*_*(D) DATA TRANSFER OPERATION._^1*_*I/O OPERATION IS RETRIED IF EITHER WAITING FOR CU€€ SELECTED_^1*_*OR WAITING FOR DRIVE. WHEN CU SELECT OR DATA_'122*4185_^1*_*TRANSFER IS IN PROGRESS,THE TIME-OUT MUST BE_'122*4185_^1*_*ASSOCIATED WITH THAT UNIT,OTHERWISE,THE TIME-OUT_"122*4185_^1*_*CANNOT BE PROCESSED. INSTEAD, THE TIME-OUT PERIOD_!122*4185_^1*_*IS EXTENDED ONE COUNT._=122*4185_^1*_*ANY OTHER ERROR CONDITIONS ARE LOGGED ON THE ENGINEERING_^1*_*FILE IF THE UNIT IS €€ACTIVED._^1*_]_^1****_]_^1*_]_^1_%SPC 2_^1*-----------_%E N T R Y_$N A M E S_^1_%ENT ESMD_)SMD DRIVER ERROR ENTRY_^1_%ENT E18331_'ERROR ENTRY FOR MSOS/RTOS_^1_%ENT CLRINT_'I/O ERROR PROCESSING_^1_%ENT EGHOST_'GHOST INTERRUPT LOGIC_0122*4185_^1*_1DATA FLAG_^1_%ENT WANTDR_'WANT DRIVE WORD_^1_%SPC 2_^1*-----------_%E X T E R N A L S_^1_%EXT LOG_*ERROR LOG ON ENGINEERING FILE_€€^1_%EXT CLRDAS_'CLEAR DA INTERRUPT STATUS_^1*_]_^1_%EXT BSMD_)PROCESS I/O OPERATION_^1_%EXT DONE_)END CONDITION PROCESSING_^1_%EXT XSMD_)SEEK/TRANSFER OPERATION_^1_%EXT DASTAT_'GET DA STATUS_^1_%EXT CONCU_(CONNECT CU SR_8122*4185_^1_%EXT DRICHK_'CHECK DRIVE_:122*4185_^1_%EXT CONTCU_'ENTRY TO CONTINUE CU SELECT_*122*4185_^1_%EXT GETLOS_'ENTRY TO COMPLETE REQUEST(IN DSMD)_"1€€22*4185_^1_%EXT LTOFDR_'TO CHECK OTHER DRIVES_0122*4185_^1_%EXT P83310_'UNIT 0 PHYSTB ADDRESS_0122*4185_^1_%EXT LOG1A_N122*4185_^1_%EXT XSMD_)ENTRY TO XSMD MODULE_1122*4185_^1_%EXT FILSMD_'FILL DIAGNOSTIC BUFFER SR_,122*4185_^1*_1DATA FLAGS_^1_%EXT SELFLG_'WAITING FOR SELECT WORD_^1_%EXT DATFLG_'DATA TRANSFER FLAG_3122*4185_^1_%EXT SEKINP_'SEEK-IN-PROGRESS FLAG_0122*4185_^€€1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%EQU H8000($21)_I122*4185_^1_%SPC 1_^1*_1MS€€OS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU€€ ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)€€_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU€€ ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(7€€1)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUF€€FER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"€€WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI0€€2(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI1€€2(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU €€ WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^€€1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATU€€S FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU €€RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU EC€€RET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVI€€CE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STO€€RE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTI€€C LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQ€€U CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION €€(LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(3€€8)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECAL€€L4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR €€DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SE€€EK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU SUBROUTINE_)122*4185_^1_%EJT_]_^1*-------------------------€€--------------------------------------------_^1*_]_^1*_$E R R O R_!R O U T I N E_^1*_]_^1*---------------------------------------------------------------------_^1_%SPC 2_^1*_]_^1*_1DIAGNOSTIC TIMER IS INITIALIZED BY ONE OF THE FOUR_^1*_1CONDITIONS: (1) ALTERNATE DA (CU) REQUEST,_^1*_>(2) ALTERNATE DA (DRIVE) REQUEST,_^1*_>(3) SEEK OPERATION (LOAD ADDRESS), AND_^1*_>(4) DATA TRANS€€FER._^1*_]_^1_%SPC 2_^1CUSLCT NUM 0_,CU SELECT TIME-OUT COUNT(FOR STATISTIC122*4185_^1*_$ERROR TIMEOUT ENTRY_^1ESMD_!STQ- I_,SAVE ADDRESS OF PHYSTB_^1*_1KERNNEL FEATURE, SAVE DA STATUS AT TIME OUT ENTRY_^1_%EQU E18331(ESMD) ENTRY POINT FOR MSOS/RTOS_^1_%RTJ DASTAT_'GET DA STATUS_^1_%STA- STIMEO,I_$SAVE DA STATUS FOR TIME OUT_^1_%LDA SELFLG_M122*4185_^1_%SAZ E30_*SENSE NOT WA€€ITING FOR CU SELECT_%122*4185_^1_%EOR- I_R122*4185_^1_%SAN E18_*SENSE LU WAITING IS NOT TIME-OUT LU_!122*4185_^1_%RTJ CLRDAS_'CLEAR INTERRUPT STATUS_/122*4185_^1_%LDA- DIAGSP,I_K122*4185_^1_%SAM E20_*SENSE MULTIPLE DA_4122*4185_^1_%JMP* E50_P122*4185_^1E18_"JMP* E48_*GO TO EXTEND TIME-OUT_0122*4185_^1*_'DO FORCE RELEASE FROM OTHER DA_8122*4185_^1E20_"RAO* CUSLCT_'BUMP CU SELECT €€TIME-OUT COUNT_(122*4185_^1_%SPC 1_R122*4185_^1*_)THE FOLLOWING FORCE RELEASE CODE HAS BEEN DELETED._!122*4185_^1*_)IN DAUL CONFIGURATIONS,TIME-OUT MERELY CAUSES A RETRY122*4185_^1*_)TO CONNECT TO CU._C122*4185_^1*_(LDQ- EWES,I_J122*4185_^1*_(INQ DRCO08_J122*4185_^1*_(LDA $2B_*(FORCE RELEASE BIT)_/122*4185_^1*_(OUT DEVERR-*_H122*4185_^1_%SPC 1_R122*4185_^1_%JMP CONTCU_M122*41€€85_^1E30_"LDA DATFLG_M122*4185_^1ADATF EQU ADATF(*-1)_I122*4185_^1_%SAN E31_*SENSE DATA XFER-IN-PROGRESS_*122*4185_^1_%JMP* E40_P122*4185_^1E31_"EOR- I_R122*4185_^1_%SAZ E33_*SENSE THIS DRIVE_5122*4185_^1_%JMP* E48_*GO TO EXTEND TIME-OUT_0122*4185_^1E33_"LDA- STIMEO,I_K122*4185_^1_%ALS 15_Q122*4185_^1_%SAP E35_*SENSE DA NOT BUSY_4122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ D€€RCO08_M122*4185_^1_%ENA 1_,CLEAR DA_=122*4185_^1_%OUT 1_-(IGNORE I/O REJECT)_1122*4185_^1_%NOP 0_R122*4185_^1E35_"ENA 0_R122*4185_^1_%STA* (ADATF)_%CLEAR XFER-IN -PROGRESS FLAG_)122*4185_^1_%RAO- ERCONT,I_$BUMP ERROR COUNT_5122*4185_^1_%LDA- DIADAT,I_K122*4185_^1_%SUB- ERCONT,I_K122*4185_^1_%SAM E37_*SENSE MAX. TRIES_5122*4185_^1_%ENQ ECRET2_((DATA/XSMD ENTRY INDEX)_-122*4185€€_^1_%JMP XSMD_)GO TO REDO XFER_6122*4185_^1AXSMD EQU AXSMD(*-1)_I122*4185_^1E37_"JMP* E50_*GO PROCESS TIME-OUT_2122*4185_^1E40_"LDA SEKINP_M122*4185_^1ASEKI EQU ASEKI(*-1)_I122*4185_^1_%LDQ- LOGDRV,I_K122*4185_^1_%AND- ONEBIT,Q_K122*4185_^1_%SAZ E45_*SENSE SEEK NOT IN PROGFESS_+122*4185_^1_%LDA* (ASEKI)_L122*4185_^1_%AND- ZROBIT,Q_$CLEAR SEEK-IN-PROGRESS BIT_+122*4185_^1_%ST€€A* (ASEKI)_L122*4185_^1_%RAO- SEKERR,I_$BUMP ERROR COUNT_5122*4185_^1_%LDA- DIADAT,I_K122*4185_^1_%SUB- SEKERR,I_K122*4185_^1_%SAM E44_*SENSE MAX. TRIES_5122*4185_^1_%ENQ ECRET6_((SEEKOP/XSMD ENTRY INDEX)_+122*4185_^1_%JMP* (AXSMD)_%GO REDO SEEK_9122*4185_^1E44_"JMP* E50_*GO PROCESS TIME-OUT_2122*4185_^1E45_"LDA* WANTDR_M122*4185_^1_%LDQ- LOGDRV,I_$GET LOGICAL DRIVE NUMBER_^1_%AN€€D- ONEBIT,Q_$SAVE WANT BIT FOR THIS DRIVE_^1_%SAZ E50_*SKIP IF NOT WAITING ON DRIVE_^1_%LDA- DIAGSP,I_K122*4185_^1_%ALS 1_R122*4185_^1_%SAP E50_*SENSE NOT MULTIPLE DRIVES_,122*4185_^1_%RTJ CONCU_N122*4185_^1_%RTJ DRICHK_M122*4185_^1_%SAN E50_*SENSE CANNOT USE DRIVE_/122*4185_^1_%ENA 1_R122*4185_^1_%JMP BSMD_O122*4185_^1*_(EXTEND TIME-OUT WHEN NOT ALLOWED TO PROCESS TIME-OUT€€ 122*4185_^1E48_"ENA 1_R122*4185_^1_%STA- EDCLK,I_L122*4185_^1_%JMP- (ADISP)_L122*4185_^1_%SPC 2_^1*_]_^1*_1EITHER SEEK OPERATION OR DATA TRANSFER CONDITION_^1*_1DIAGNOSTIC TIMER EXPIRED. --- I/O HANG UP_^1*_]_^1E50_"LDQ- NZERO+13_$$E000 SET ERROR BIT FOR STATUS WORD_^1_%ENA IOHGER_'I/O HANG UP ERROR INDICATION_^1_%SPC 2_^1*_$Q HAS ERROR BITS FOR WORD 9 OF PDT_^1_%STA- FLTCOD€€,I_$SAVE ERROR CODE_6122*4185_^1TRYNXT LDA- EREQST,I_$PICK UP REQUEST STATUS WORD. WORD 8 OF PHYSTB_^1_%SAM ACTIVE_'SKIP IF UNIT IS ACTIVE_^1_%JMP- (ADISP)_%IGNORE ERROR ON INACTIVE UNIT_(122*4185_^1ACTIVE AND- NZERO-2_%($3FFF) MASK OFF TOP STATUS BITS_^1_%ADD- ZROBIT-2_$($4000) SET HARDWARE FAILURE BIT_^1_%STA- EREQST,I_$STORE IN REQUEST STATUS WORD_^1_%LDA- ESTAT1,I_$PICK UP €€STATUS WORD. WORD 9 OF PHYSTB_^1_%AND- NZERO-3_%($1FFF) MASK OFF ERROR BITS OF STATUS WORD_^1_%AAQ A_,ADD IN NEW ERROR BITS_^1_%STA- ESTAT1,I_$RESTORE STATUS WORD_^1_%ENQ 0_,=CODE FOR FILL DIAG. BUFFER SR_'122*4185_^1_%RTJ FILSMD_'GO TO FILL DIAGNOSTIC BUFFER_)122*4185_^1_%SPC 1_^1*_1CHECK FOR DIAGNOSTIC UNIT_^1_%LDA- ELU,I_^1_%SUB- DIAGLU,I_^1_%SAZ TODONE_'SKIP ON DIAGNOSTI€€C UNIT, NO LOG_^1_%LDA- ELU,I_(PICKUP LOGICAL UNIT_^1_%ALS 8_^1_%EOR- ONEBIT+15_#SET FLAG, TO INDICATE ERROR CODE WILL BE_^1*_8IN THE Q REGISTER 8 BITS EACH._^1_%LDQ- FLTCOD,I_$GET ERROR CODE_^1_%EAQ Q_,COMBINE LU AND ERROR CODE_^1_%RTJ LOG_*LOG ERROR_^1TODONE JMP GETLOS_'GO COMPLETE REQUEST_2122*4185_^1_%SPC 2_^1DEVERR JMP* INTRJT_'INTERNAL REJECT_^1EXTRJT ENA ERR06_(SET FOR€€ EXTERNAL REJECT ERROR CODE_^1_%SPC 2_^1*---------------------------------------------------------------------_^1*_]_^1*_$-_$*****_#I/O ERROR ENTRY_#*****_^1*_]_^1_%SPC 1_^1CLRINT STA- FLTCOD,I_$SAVE ERROR CODE_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO08_'SET DIRECTOR FUNCTION_^1_%INP 1_,TAKE STATUS_^1_%NOP 0_^1_%STA- ESTAT2,I_$SAVE DA STATUS_^1_%ENA WACRAI_^1_%OUT 1_,CLEAR I€€NTERRUPTS_^1_%NOP 0_^1NOTIEX LDQ- NZERO+14_$$C000 SET UP ERROR CODE FOR WORD 9 OF PHYSTB_^1_%JMP* TRYNXT_^1INTRJT ENA ERR05_(SET FOR INTERNAL REJECT ERROR CODE_^1_%JMP* CLRINT_^1_%SPC 1_R122*4185_^1*_(GHOST INTERRUPT LOGIC_@122*4185_^1*_*GHOST INTERRUPT ARE HANDLED SEPARATELY FROM OTHER_!122*4185_^1*_*ERRORS BECAUSE NO CALL TO COMPLETE REQUEST IS MADE 122*4185_^1*_*EVEN IF THE €€LU IS ACTIVLY PROCESSING A REQUEST._#122*4185_^1_%SPC 1_R122*4185_^1EGHOST RTJ CLRDAS_'CLEAR INTERRUPT_6122*4185_^1_%RAO- GHOSTI,I_$BUMP GHOST INT. COUNT_0122*4185_^1_%LDA- ESTAT2,I_K122*4185_^1_%ALS 5_R122*4185_^1_%SAP EGHO00_(SENSE NOT FORCE RELEASE GHOST INT._!122*4185_^1_%JMP* EGHO03_((IQNORE INTERRUPT DUE TO ASSUMED_#122*4185_^1*_:H/W MALFUNCTION)_3122*4185_^1EGHO00 LDQ* (€€ALOG1A)_K122*4185_^1EGHO01 LDA =XP83310_K122*4185_^1_%SUB LOG1A,Q_L122*4185_^1ALOG1A EQU ALOG1A(*-1)_H122*4185_^1_%SAZ EGHO02_(SENSE FOUND UNIT 0_2122*4185_^1_%INQ -1_Q122*4185_^1_%SQZ EGHO02_(SENSE NONE FOUND(USE LU=0)_*122*4185_^1_%JMP* EGHO01_M122*4185_^1EGHO02 TRQ A_R122*4185_^1_%ALS 8_R122*4185_^1_%EOR- H8000_)(SET FOR 8-BYTE FORMAT)_-122*4185_^1_%EOR =XGIERCD_K122*41€85_^1_%TRA Q_R122*4185_^1_%RTJ LOG_P122*4185_^1EGHO03 JMP LTOFDR_(GO TO CHECK OTHER DRIVES_,122*4185_^1_%SPC 1_R122*4185_^1_%SPC 2_^1*_1REQUEST DRIVES FLAGS WORD_^1*_1IT IS REFERRED BY OTHER ROUTINE_^1WANTDR NUM 0_,BIT WORD FOR WANT DRIVES_^1_%END_]_^__ PBSMD CSY/ C74 P€1_%NAM BSMD_)DECK-ID C74 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$BEGINNING I/O_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1****_]_^1*S3_]_^1*_%4. BSMD_^1*_]_^1*_*THIS ROUTINE IS USED TO COORDINATE AND START I/O OPERATION._^1*_*IT IS ENTERED VIA AN UNCONDITIONAL JUMP WITH THE A-REGISTER_^1*_*CONTAINING THE€€ ENTRY INDEX. THIS ROUTINE IS DIVIDED INTO_^1*_*THREE ENTRY POINTS. ENTRY NO. 1 SERVES AS THE INITIAL ENTRY_^1*_*THE 'WANT-IN' BIT (BIT 2 OF WORD 9 IN 'PHYTAB') IS SET AND_^1*_*EXIT TO DISPATCHER IF CU IS PERFORMING DATA TRANSFER. CU_^1*_*IS CONNECTED WHEN CU IS FREE. ENTRY NO. 2 IS TO CONNECT_^1*_*THE DRIVE AND THEN GO TO SEEK OPERATION. THE LAST ENTRY IS_^1*_*TO COORDINATE €€THE UNFORMATTED REQUEST WHEN A DATA TRANSFER_^1*_*IS COMPLETED. THEN FURTHER I/O OPERATION OR NO MORE I/O_^1*_*IS ANALYZED AND CONTROL IS TRANSFERRED TO THE PROPER_^1*_*ROUTINE._^1*_]_^1****_]_^1*_]_^1_%SPC 3_^1*_]_^1*-----------_%E N T R Y_$N A M E S_^1*_]_^1_%ENT BSMD_)ENTRY FOR BEGINNING I/O_^1_%ENT BSMD4_(ENTRY FOR END-OF-XFER LOGIC_*122*4185_^1_%SPC 2_^1*_]_^1*-----------€€_%E X T E R N A L S_^1*_]_^1_%EXT DONE_)END PROCESSING_^1_%EXT XSMD_)SEEK/TRANSFER OPERATION_^1_%EXT CONCU_(CONNECT CU_^1_%EXT CNDRIV_'CONNECT DRIVE_^1_%EXT DRICHK_'CHECK DRIVE AVAILABLE_^1_%EXT LIKDUM_'DRUM SIMULATION_^1_%EXT SMDGDR_'TO GET THE DRIVE FROM THE OTHER DA._^1_%EXT ECXIT_(ECC EXIT LOGIC IN ECCALG_-122*4185_^1*_1DATA FLAGS_^1_%EXT DATFLG_'DATA TRANSFER FLAG_^1€€_%EXT SELFLG_'CU SELECT FLAG_7122*4185_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC€€ 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUT€€INE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXS€€RTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PAR€€ITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQ€€U UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRC€€O00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU D€€RCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_€€%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_€€%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER =€€ 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONT€€ENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1€€POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE€€'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_€€^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PH€€YSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT €€LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)€€_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME€€ OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRE€€SS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%E€€QU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1€€_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RE€€TRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER V€€ALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU SUBROUTINE_)122*4185_^1_%EJT_]_^1*--------------€€-------------------------------------------------------_^1*_]_^1*_1BEGINNING I/O OPERATION_^1*_]_^1*---------------------------------------------------------------------_^1_%SPC 1_^1*_]_^1*_1AT ENTRY --- A = 0 FOR INITIAL ENTRY_^1*_>A = 1 FOR CONNECT DRIVE, ETC._^1*_>A = 2 FOR RETURNING FROM DATA XFER_^1*_B(Q-REGISTER = NEXT STEP INDEX)_^1*_]_^1*_]_^1_%SPC 2_^1BSMD_!INA -1_+TO€€ LOCATE ENTRY TYPE_^1_%SAM B10_*INITIAL ENTRY, SKIP_^1_%SAZ B24_*CONNECT DRIVE ENTRY_2122*4185_^1_%JMP* B60_*DATA TRANSFER COMPLETION ENTRY_^1_%SPC 2_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1ENTRY 1_!----_!INITIAL ENTRY_^1*_]_^1*_1AT THIS ENTRY, ALL REQUEST PARAMETERS BEEN SET UP BY_^1*_1MONITOR AND BEGINNING OF I/O OPERATION IS€€ READY._^1*_1IF CU IS BUSY ('DATFLG' --- DATA XFER FLAG IS SET),_^1*_1SET 'WAIT-IN' BIT AND EXIT TO DISPATCHER. OTHERWISE_^1*_1START I/O OPERATION BY CONNECTING CU, ETC._^1*_]_^1B10_"LDA SELFLG_M122*4185_^1_%SAN B16_*SENSE DRIVER WAITING FOR CU CONNECT_!122*4185_^1_%LDA* (DATFAD)_K122*4185_^1_%SAZ B20_*SENSE DATA XFER NOT IN PROGRESS_%122*4185_^1B16_"LDA- ESTAT1,I_$SET 'WANT IN€€' BIT (BIT 2)_,122*4185_^1_%AND- ZROBIT+2_^1_%EOR- ONEBIT+2_^1_%STA- ESTAT1,I_^1_%JMP- (ADISP)_%TO DISPATCHER_^1_%SPC 1_^1*_1START CONNECT CU ----- BEGINNING OF I/O_^1B20_"RTJ* (CNCUAD)_$GO SELECT_^1_%RTJ DRICHK_'SEE IF CAN USE THIS DRIVE_^1B24_"SAZ B40_*SENSE CAN USE DRIVE_2122*4185_^1*_8SET UP TO GET DRIVE FROM THE OTHER DA WITH AN_^1*_9ALTERNATE DA INTERRUPT._^1_%JMP SMDGDR_€€^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_]_^1*_1ENTRY 2_!----_!CONNECT DRIVE ENTRY_^1*_]_^1B40_"RTJ CNDRIV_'CONNECT TO DRIVE_^1B50_"ENQ ECRET6_'SET INDEX FOR 'SEEKOP' (LOAD CYLINDER ADD.)_^1_%JMP XSMD_)TO SEEK/TRANSFER DATA ROUTINE MODULE_^1*_1'SEEKOP' IS RELEASED CONTROL TO 'CHECK' (CHECK_^1*_1FOR POSSIBLE MULTIPLE DRIVES)_€€^1*_]_^1_%SPC 1_^1*_]_^1*_1ADDRESSES SET UP IN THIS WAY FOR 'SAZ B40' AS 1 WORD_^1*_]_^1DATFAD ADC DATFLG_'DATA XFER IN PROGRESS FLAG ADDRESS_^1CNCUAD ADC CONCU_(CONNECT CU SUB. ADDRESS_^1_%SPC 2_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_]_^1*_1ENTRY 3_!----_!DATA TRANSFER COMPLETION_^1*_]_^1*_1AT ENTRY --- Q = NEXT OPERATION INDE€€X, ITS VALUE_^1*_81 FOR ALL DONE, GO TO 'DONE',_^1*_82 FOR DATA XFER TO 'PYHTAB' BUFFER, GO TO_^1*_='LKDUM1',_^1*_83 FOR DATA BEEN INSERTED WITHIN A SECTOR,_^1*_=GO TO 'LKDUM5', AND_^1*_84 FOR DATA IN 'PHYTAB' BUFFER AND READY FOR_^1*_=DATA TO BE INSERTED AND WRITE BACK,_^1*_=GO TO 'LKDUM6'._^1*_]_^1B60_"LDA- TABIND,I_K122*4185_^1_%SAZ B62_*SENSE ECC RECOVERY NOT ON_,122*4185_^1*€€_'IF RECOVERY ON,XFER COMP. MUST BE HANDLED BY ECC LOGIC.122*4185_^1_%JMP ECXIT_(GO TO ECC EXIT LOGIC_1122*4185_^1*_''BSMD4' IS AN ENTRY FOR END-OF-XFER LOGIC_-122*4185_^1BSMD4 EQU BSMD4(*)_K122*4185_^1B62_"TRQ A_,=NEXT OPERATION INDEX_0122*4185_^1_%INA -1_+CHECK IF FOR 'DONE'_^1_%SAN B80_*NO, SKIP_^1B70_"JMP DONE_)TO END PROCESSING_^1B80_"RTJ LIKDUM_'TO DRUM SIMULATION_^1*€€_1RETURN FROM 'LIKDUM'_^1*_1A-REG. CONTAINS ZERO_^1*_1Q-REG. CONTAINS NEXT STEP INDEX_^1*_]_^1_%ENA DRCO10-DRCO09 SET FOR WRITE (-READ)_^1_%JMP* B90_*TO READ_^1_%JMP* B70_*TO 'DONE'_^1B90_"INA DRCO09_'BUMP TO READ (WRITE BE WRITE)_^1_%STQ- EXTRA,I_%SAVE RETURN ADDRESS_"(INDEX)_^1_%STA- FUNCT,I_%SAVE DATA XFER FUNCTION FOR ERROR RETRY_^1_%ADD- EWES,I_'ADD EQUIP CODE ($0XX0)_^1_%ST€DA- FDATAF,I_$DATA TRANSFER FUNCTION CODE_^1_%JMP* B50_^1_%END_]_^__ DPALMERR CSY/ C75 P€1_%NAM ALMERR_'DECK-ID C75 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$ALLARM ERROR_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_%6. ALMERR_^1*_]_^1*_*THERE IS 1 ENTRY FOR THIS ROUTINE, IT IS :_^1*_*(A) ALMERR -- ENTERED BY AN UNCONDITIONAL JUMP FROM THE_^1*_.CONTINUATOR WHEN AN A€€LARM IS DETECTED (DATA TRANSFER)._^1*_]_^1*_]_^1*_'ALARM ERROR RECOVERY IS DONE IN TWO PHASES. FIRST_#122*4185_^1*_'HARDWARE RECOVERY IS DONE THEN SOFTWARE RETRIES AND/OR 122*4185_^1*_'RECOVERY._M122*4185_^1*_'HARDWARE RECOVERY CONSISTS OF CLEARING FAULT CONDITIONS122*4185_^1*_'IN THE HARDWARE. NOTE THAT IN THE CASE OF DA BUSY OR 122*4185_^1*_'LOST DATA ERROR,THE DA MUST BE CLEA€€RED THUS_+122*4185_^1*_'PREVENTING THE READING OF ANY DRIVE STATUSES AND DOING 122*4185_^1*_'ANY RECOVERY AS A RESULT OF READING THESE STATUSES._"122*4185_^1*_'SOFTWARE RECOVERY CONSISTS OF RETRIES( NO. OF TIMES_"122*4185_^1*_'SPECIFIED IN DIADAT OF THE PHY. DEV. TBL.) AND RECOVERY122*4185_^1*_'FOR THE FOLLOWING ERROR,_>122*4185_^1*_1ECC ERROR_C122*4185_^1*_1ADDRESS MARK NOT FOUND_€€6122*4185_^1*_1SYNC BYTE NOT FOUND_9122*4185_^1*_'RECOVERY IS SPECIFIED BY SETTING DIAECC IN THE PHY. DEV122*4185_^1*_'TBL. TO A 1._J122*4185_^1*_'THE ERROR CODE RETURNED IS A FUNCTION OF THE ALARM_#122*4185_^1*_'ERROR FOUND IN THE DA STATUS WITH THE EXCEPTION OF THE 122*4185_^1*_'ABOVE THREE ERRORS WHICH ARE GROUPED TOGETHER AS ECC_!122*4185_^1*_'ERROR IF RECOVERY IS SPECIFIED._71€€22*4185_^1*_'REFER TO ECCALG MODULE FOR RECOVERY DEFINITION._'122*4185_^1*_'FOR THE DIAGNOSTIC LOGICAL UNIT,RETRIES AND RECOVERY_!122*4185_^1*_'ARE DONE ONLY IF SPECIFIED IN THE STROBE WORD OF THE_!122*4185_^1*_'PHY. DEV. TBL._H122*4185_^1*_]_^1****_]_^1*_]_^1_%SPC 2_^1*-----------_%E N T R Y_$N A M E S_^1_%ENT ALMERR_'ALARM ERROR_^1_%SPC 2_^1*-----------_%E X T E R N A L S_^1_%€€EXT CONCU_(CONNECT CU_^1_%EXT SEEK9_(CLEAR HEAD ERROR_^1_%EXT CLRDAS_'CLEAR DA STATUS_^1_%EXT CLRSTS_'CLEAR ALL STATUS WORDS_^1_%EXT CLRTDA_'CLEAR DA_^1_%EXT CNDRIV_'CONNECT DRIVE_^1_%EXT SMDSTS_'UPDATE STATUS WORDS_^1_%EXT ECCALG_'ECC ERROR CORRECTION_^1_%EXT CLRINT_'I/O ERROR PROCESSING_^1*_]_^1_%EXT DONE_)TO COMPLETE REQUEST_^1_%EXT XSMD_)SEEK/TRANSFER OPERATION_^1_%S€€PC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3€€)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPA€€TCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDP€€RTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^€€1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^€€1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRI€€VE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"EC€€C CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(€€3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU €€ DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS€€_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNA€€TE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC€€($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETUR€€N FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQ€€U ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*---€€--------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(€€11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)€€_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FO€€R TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY€€ WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_€€"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE€€(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_€€"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"€€FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU SUBROUTINE_)122*4185_^1_%EJT_]_^1*-----------------------------------------------------------€€------_^1*_]_^1*_$PROCESS DATA ALARM ERROR_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1*_]_^1*_1DISK ADAPTER (DA) ERROR BITS ASSIGNMENTS_^1*_]_^1*_1(1) BIT 09 = LOST DATA_^1*_1(2) BIT 10 = FORCE RELEASE_^1*_1(3) BIT 11 = MEMORY ADDRESS ERROR_^1*_1(4) BIT 12 = STORAGE PARITY ERROR_^1*_1(5) BIT 13 = PROTECT FAULT_^1*_1(6) BIT 14 = CU ERROR_€€^1*_]_^1_%SPC 2_^1*_'DO HARDWARE RECOVERY REQUIRED_9122*4185_^1ALMERR LDQ- EWES,I_M122*4185_^1_%INQ DRCI08_M122*4185_^1_%INP 1_R122*4185_^1_%NOP 0_,(IGNORE REJECTS)_5122*4185_^1_%ALS 15_Q122*4185_^1_%SAP ALM005_'SENSE DA NOT BUSY_4122*4185_^1_%JMP* ALMERR_M122*4185_^1ALM005 LDA- ESTAT2,I_K122*4185_^1_%AND- ONEBIT+10_J122*4185_^1_%SAZ ALM010_'SENSE NO LOST DATA_3122*4185_^1_%€€RTJ CLRTDA_'CLEAR DA_=122*4185_^1_%RTJ CONCU_(RECONNECT TO CU_6122*4185_^1_%RTJ CNDRIV_'RECONNECT TO DRIVE_3122*4185_^1_%JMP* ALM030_M122*4185_^1H0018 NUM $18_P122*4185_^1ALM010 RTJ SMDSTS_'READ DRIVE STATUSES_2122*4185_^1_%LDA- DFLTST,I_$=DRIVE FAULT STATUS_2122*4185_^1_%ALS 8_R122*4185_^1_%SAP ALM030_'SENSE NO HEAD FAULT ERROR_,122*4185_^1_%RTJ SEEK9_(CLR HEAD ERROR BY S€€ELECTING VALID HEAD122*4185_^1ALM030 RTJ CLRSTS_'CLEAR DRIVE STATUSES_1122*4185_^1*_'DO SOFTWARE RECOVERY_B122*4185_^1_%LDA- TABIND,I_K122*4185_^1_%SAP ALM040_'SENSE RECOVERY NOT ON_0122*4185_^1_%JMP* ALM090_(GO TO CONTINUE RECOVERY_-122*4185_^1ALM040 LDQ- DIAGLU,I_K122*4185_^1_%TCQ Q_R122*4185_^1_%ADQ- ELU,I_N122*4185_^1_%SQN ALM050_'SENSE NOT DIAGNOSTIC LU_.122*4185_^1_%LDA- €€STROBE,I_K122*4185_^1_%ALS 14_+(BIT 1)_>122*4185_^1_%SAP ALM060_'SENSE NO RETRIES FOR DIAG. LU_(122*4185_^1ALM050 RAO- ERCONT,I_$BUMP ERROR COUNT_5122*4185_^1_%LDA- DIADAT,I_K122*4185_^1_%SUB- ERCONT,I_K122*4185_^1_%SAM ALM060_'SENSE MAX. TRIES_5122*4185_^1_%ENQ ECRET2_'SET INDEX FOR 'DATA'_1122*4185_^1_%JMP XSMD_)(GO TRY DATA TRANSFER AGAIN)_)122*4185_^1ALM060 LDA- ESTAT2,I_K€€122*4185_^1_%AND- ONEBIT+10_J122*4185_^1_%SAN ALM100_'SENSE LOST DATA ERROR_0122*4185_^1_%LDA- CUSTAT,I_$=CU STATUS_;122*4185_^1_%ALS 13_Q122*4185_^1_%SAM ALM070_'SENSE ECC ERROR_6122*4185_^1_%LDA- DSTAT1,I_$=DRIVE STATUS 1_6122*4185_^1_%AND* H0018_(SAVE ADDRESS MARK,SYNC BYTE NOT FOUND 122*4185_^1_%SAZ ALM100_'SENSE NOT RECOVERABLE ERROR_*122*4185_^1ALM070 SQN ALM080_'SENSE N€€OT DIAG. LU_3122*4185_^1_%LDA- STROBE,I_K122*4185_^1_%ALS 15_+(BIT 0)_>122*4185_^1_%SAP ALM100_'SENSE NO RECOVERY FOR DIAG. LU_'122*4185_^1ALM080 LDA- DIAECC,I_K122*4185_^1_%SAZ ALM100_'SENSE RECOVERY NOT SPECIFIED_)122*4185_^1ALM090 JMP ECCALG_'GO DO RECOVERY_7122*4185_^1*_1SEARCH FOR ERROR TYPE_^1*_]_^1*--_/ERROR BITS ASSIGNMENTS OF DA STATUS :_^1*_]_^1*_*ONE CARD DELET€€ED_C116*4315_^1*_514 CU ERROR_^1*_513 PROTECT FAULT_^1*_512 STORAGE PARITY ERROR_^1*_511 MEMORY ADDRESS ERROR_^1*_510 FORCED RELEASE_^1*_509 LOST DATA_^1*_]_^1ALM100 ENQ TSIZ_)SET MAX. ERROR SEARCH SIZE_+122*4185_^1_%LDA- SINTER,I_$RECALL DA STATUS WORD_^1ALMETY ALS 1_R116*4315_^1_%SAM GETAMC_M116*4315_^1_%INQ -1_+CHECK IF ALL DONE_^1_%SQM GETAMC_'ALL DONE, SKIP_^1*_*ONE€€ CARD DELETED_C116*4315_^1_%JMP* ALMETY_'TO REPEAT NEXT ONE_^1GETAMC LDA* AMERTY,Q_$GET ERROR CODE ACCORDING TO TYPE_^1ERPO_!JMP CLRINT_^1_%SPC 2_^1*_]_^1*_1ALARM ERROR TYPE ERROR CODES TABLE_^1*_]_^1_%ADC REQNOG_'-1. UNSUCCESSFUL REQUEST_^1AMERTY ADC LTDACD_'+0. LOST DATA_^1_%ADC FORECD_'+1. FORCE RELEASE_^1_%ADC NEXACD_'+2. MEMORY ADDRESS_^1_%ADC STPACD_'+3. STOR€œAGE PARITY_^1_%ADC PTFTCD_'+4. PROTECT FAULT_^1_%ADC CUERCD_'+5. CU/33 ERROR_^1*_*ONE CARD DELETED_C116*4315_^1TSIZ_!EQU TSIZ(*-AMERTY-1)_^1_%END_]_^__œPXSMD CSY/ C76 P€1_%NAM XSMD_)DECK-ID C76 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SEEK ADDRESS AND TRANSFER DATA_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_%5. XSMD_^1*_]_^1*_*THIS MODULE IS ENTERED BY A UNCONDITIONAL JUMP WITH Q-REG._^1*_*CONTAINS THE NEXT STEP TYPE INDEX. THERE ARE 7 DIFF€€ERENT_^1*_*TYPES, THEY ARE (BY INDEX) :_^1*_*(1) 'SPLITT' --- SPLITE DATA TRANSFER_^1*_*(2) 'DATA'_!--- DATA TRANSFER SET UP_^1*_*(3) 'DATA8' --- SET UP INTERRUPTS AND READ/WRITE FUNCTION_^1*_;OF DATA TRANSFER_^1*_*(4) 'CHECK' --- CHECK FOR ALL UNITS TO LOCATE WHICH ONE_^1*_;WANTS IN_^1*_*(5) 'CHKPRI' --- HOUSE KEEPING FOR SEEK END INTERRUPT_^1*_*(6) 'SEEKOP' --- SET UP SEEK OPER€€ATION_^1*_*(7) 'UPSKER' --- UPDATED SEEK ERROR COUNTS._^1*_]_^1*_]_^1*_*SEEK OPERATION AND DATA TRANSFER ARE TWO HARDWARE I/O OPER-_^1*_*ATIONS PERFORMED BY THIS ROUTINE. IT ALSO HANDLES TWO SOFT-_^1*_*WARE TYPE I/O RELATED TASKS._!THESE ARE SPLIT TRANSFER SET_^1*_*UP AND ISOLATION OF HIGH PRIORITY REQUEST AT SEEK END OPER-_^1*_*ATION (FOR MULTI DRIVES, CALL SUBROUTINE 'MPDRIV')._€€^1*_]_^1*_*SEEK OPERATION IS SET UP TO SEEK THE CYLINDER ADDRESS FOR A_^1*_*DRIVE. IT IS SET UP TO THE INTERRUPT DRIVEN WITH SEEK END_^1*_*AND ALARM INTERRUPTS REQUESTED. THEN THE OTHER SEEK OPER-_^1*_*ATION REQUEST(S) IS SEARCHED. OVERLAPPING SEEK IS DONE IF_^1*_*OTHER REQUEST IS LOCATED. OTHERWISE IT RELEASES TO THE_^1*_*DISPATCHER._^1*_]_^1*_*DATA TRANSFER IS INITIATED AFTER€€ SEEK OPERATION IS COMPLETED_^1*_*AND DRIVE IS AVAILABLE. TRANSFER COMPLETE, ALARM AND END_^1*_*OF CYLINDER INTERRUPTS ARE SELECTED. CONTROL IS RELEASED_^1*_*TO DISPATCHER._^1*_]_^1*_*WHEN DATA IS TRANSFERED TO/FROM MULTIPLE CYLINDERS, THE_^1*_*ENTRY, 'SPLITT', IS ENTERED TO UPDATE CORE AS WELL AS MASS_^1*_*MEMORY ADDRESSES. AFTER CU AND DRIVE ARE RECONNECTED, SEEK_^1*_*OPERATIO€€N IS GIVEN CONTROL TO SEEK THE NEW CYLINDER ADDRESS._^1*_]_^1*_*TO ALLOW OVERLAPPING SEEK, A SEARCH IS USED TO LOCATE THE_^1*_*HIGHEST REQUEST PRIORITY ON ALL COMPLETED SEEK OPERATIONS._^1*_*IT ALSO CHECK FOR ERROR CONDITION. DATA TRANSFER OPERATION_^1*_*IS INITIATED FOR THE HIGHEST REQUEST PRIORITY IF NO ERROR._^1*_]_^1****_]_^1*_]_^1_%SPC 2_^1*-----------_%E N T R Y_$N A M E S_€€^1_%ENT XSMD_)SEEK ADDRESS AND TRANSFER DATA_^1_%ENT SEEK9_(CLEAR A HEAD FAULT_^1_%ENT CLRSKN_'TO CLEAR SEEK END AND CHECK FOR ERROR_^1_%ENT RLSECU_'TO RELEASE CU_^1_%ENT SEKCHK_'CHECK LIMIT ON SEEK ERROR TRIALS_^1_%ENT SETFNS_'SET SEEK FUNCTION_^1_%ENT SKALND_'SET ALRAM + SEEK END INTERRUPT FOR SEEK FUN._^1*_1DATA FLAGS ENTRY NAMES_^1_%ENT SEKCOM_'SEEK COMPLETION BITS_^€€1_%ENT SEKDON_'SEEK DONE FLAG_^1_%ENT SEKINP_'SEEK IN PROGRESS_^1_%SPC 2_^1*-----------_%E X T E R N A L S_^1_%EXT BSMD_)I/O OPERATION_^1*_;*** 1 CARD DELETED ***_*122*4185_^1_%EXT CONCU_(CONNECT CU_^1_%EXT SMDCPA_'LOGICAL TO PHYSICAL ADDRESS CONVERSION_^1_%EXT CLRDAS_'CLEAR DA INTERRUPT_^1_%EXT CLRSTS_'CLEAR ALL STATUS WORDS_^1_%EXT CLRTDA_'CLEAR DA_^1_%EXT CNDRIV_'CON€€NECT DRIVE_^1_%EXT COMPV4_'MAGNITUDE COMPARISION_^1_%EXT DASTAT_'GET DA STATUS_^1_%EXT LTOFDR_'LOOK FOR COMPLETED SEEKS ON DRIVE(S). 112*4229_^1_%EXT MPDRIV_'CHECK FOR PRIORITY FOR MULTIPLE DRIVES_^1_%EXT POLCHK_'POLL STATUS_^1_%EXT ALTDAI_'SET ALT. DA INTERRUPT SR_-122*4185_^1_%EXT ECXIT_(ECC EXIT LOGIC IN ECCALG_-122*4185_^1_%EXT FILSMD_'FILL DIAGNOSTIC BUFFER SR_,122*418€€5_^1_%EXT DONE_)COMPLETE REQUEST ENTRY IN DSMD_'122*4185_^1*_]_^1_%EXT CLRINT_'I/O ERROR PROCESSING_^1*_1DATA FLAG_^1_%EXT DATFLG_'DATA TRANSFER FLAG_^1_%EXT WANTDR_'WANT DRIVES FLAG_5122*4185_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO(€€$12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU €€AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"€€MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ER€€ROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTE€€CT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/3€€3 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE€€_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU E€€CHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR A€€ND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CO€€NTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU €€WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND€€ INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%€€SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION€€ RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' €€OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST€€ PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED€€ WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTE€€R THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_€€%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STAT€€US_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQU€€EST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR€€ 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU €€ DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WO€€RD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU SUBROUTINE_)122*4185_^1_%SPC 3_^1*_]_^1_%EQU FW(6)_(HARDWARE FORMAT WRITE_^1_%EQU CODE12(12)_"CLEAR ATTENTION BIT CODE (SET BY 'RESTOR')_^1_%EQU TAGSDA($2A)_!LOCATION CONTAINS $80 (READ/WRITE ADD. TAGS)_^1*_]_^1_%EJT_]_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^€€1*_]_^1_%SPC 3_^1*_]_^1*_1AT ENTRY --- Q-REGISTER CONTAINS NEXT STEP INDEX_^1*_]_^1_%SPC 2_^1XSMD_!LDQ* XFTAB-1,Q_#PICK UP NEXT STEP ADDRESS_^1_%JMP- (ZERO),Q_$TO NEXT STEP_^1_%SPC 1_^1*_]_^1*_1NEXT STEP ADDRESS TABLE_^1*_]_^1XFTAB ADC SPLITT_'1. FOR SPLIT CYLINDER DATA TRANSFER_^1_%ADC DATA_)2. DATA TRANSFER_^1_%ADC DATA8_(3. DATA TRANSFER CONTINUE_^1_%ADC CHECK_(4. TO €€CHECK FOR POSSIBLE MULTIPLE DRIVES_^1_%ADC CHKPRI_'5. CHECK FOR HIGH PRIORITY LEVEL REQUEST_^1_%ADC SEEKOP_'6. SEEK ADDRESS (LOAD ADDRESS) OPERATION_^1_%ADC UPSKER_'7. UPDATE AND CHECK SEEK ERROR COUNT_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_$HANDLE SPLIT TRANSFER. ONE THAT GOES ACROSS BOUNDARY_^1*_]_^1*-----------------------€€----------------------------------------------_^1*_]_^1*_]_^1*_1ENTRY INDEX -----_"1_^1*_]_^1_%SPC 2_^1SPLITT RTJ CLRDAS_'CLEAR DA INTERRUPT STATUS_^1SUB4A EQU SUB4A(*-1)_^1_%SPC 2_^1*_$NOW COMPUTE NEW FIRST WORD ADDRESS(FWA)_^1*_$NEW FWA = OLD FWA + NO WORDS TRANSFERED(NWT)_^1*_$NWT = ((64-SECTOR)+(4-TRACK)*64)*96_^1_%SPC 2_^1_%LDA- TRASEC,I_$FETCH TRACK/SECTOR_^1_%AND- LP€€MSK+7_%SAVE SECTOR_^1_%TCA Q_,MINUS SECTOR TO Q_^1_%INQ MXSRTK_'64 (MAX.) SECTOR TO Q_^1_%LDA- TRASEC,I_^1_%ARS 8_,SAVE TRACK ONLY_^1_%TCA A_,MINUS TRACK TO A_^1_%INA 0_,GET RID OF MINUS 0 IF THERE_^1_%INA MXTKCY-1_$4_#TRACK TO A_^1_%ALS 6_,MULTIPLY BY 64_^1_%AAQ A_^1_%MUI =XMXWDSR_$COMPUT NO. OF WORDS TO BE TRANSFERED_^1*_$WILL ALWAYS BE LESS THAN ONE CYLINDER(30720 WORDS€€)_^1_%LDQ- ECCOR,I_%FETCH FIRST WORD ADDRESS_^1_%AAQ Q_,ADD TO NUMBER OF WORDS TRANSFERED_^1_%STQ* TEMPW_(TEMP SAVE OF NEW FWA_^1_%LDA- ELSTWD,I_^1*_$CHECK THAT NEW FWA IS NOT PAST CURRENT LWA_^1_%RTJ COMPV4_'COMPARE FWA AGAINST LWA_.122*4185_^1_%INA 0_,-0 FROM COMPV4=ECCOR GT ELSTWD_'121*4736_^1_%SAN SPL3_)SENSE FWA LT LWA_5121*4736_^1ERRORZ RAO- ERCONT,I_$BUMP ERROR COUNT BY €€1_^1_%LDA- DIADAT,I_$CHECK IF MAX. ALLOWED TRIAL BEEN TRIED_^1_%SUB- ERCONT,I_^1_%SAM SPLER_(SKIP ON SPLITE ERROR_^1_%ENQ ECRET2_'TO TRY DATA XFER AGAIN_^1_%JMP* XSMD_^1SPLER ENA LENERR_'SET SPLITE ERROR CODE_^1_%JMP TOERR_N122*4185_^1*_]_^1TEMPW NUM 0_^1_%SPC 2_^1*_]_^1SPL3_!LDA* TEMPW_(FETCH NEW FWA_^1_%STA- ECCOR,I_%SAVE NEW FIRST WORD_^1_%RAO- CYLADR,I_$INCREMENT CYLIND€€ER_^1_%ENA 0_^1_%STA- TRASEC,I_$TRACK/SECTOR NOW BOTH ZERO_^1_%STA DATFLG_'CLEAR DATA TRANSFER FLAG_^1_%RTJ CLRTDA_'CLEAR THE DA_^1_%RTJ* (CONUAD)_$RECONNECT TO THE CU_^1_%RTJ* (CNDRAD)_$CONNECT TO THE DRIVE_^1_%SPC 1_^1*_]_^1*_1CONTROL RELEASE TO 'SEEKOP' --- SEEK OPERATION_^1*_1(SEEK NEXT CYLINDER)_^1*_]_^1_%EJT_]_^1*-----------------------------------------------------------€€----------_^1*_]_^1*_$S E E K_!( L O A D_!A D D R E S S )_!O P E R A T I O N_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1ENTRY INDEX -----_"6_^1*_]_^1_%SPC 3_^1_%SPC 2_^1*_]_^1*_1SEEK OPERATION STEPS_^1*_]_^1*_1(1) CHECK FOR CLEAR ATTENTION BIT FUNCTION_^1*_1(2) FOR ATTENTION FUNCTION, CALL SUBROUTINE TO CLEAR_^1*_6IT AND GO TO S€€ET UP INTERRUPT, ETC_^1*_1(3) FOR NON-CLEAR ATTENTION BIT, EXECTUE SEEK_^1*_6AND MAKE SURE NO ERROR_^1*_1(4) SET UP INTERRUPT, (ALARM + SEEK END)_^1*_1(5) DE-SELECT CU FOR POLL UPDATED._^1*_1(6) TO 'CHECK'_^1*_]_^1*_!---_+THE FIRST 2 ITEMS (ATTENTION BIT FUNCTION) ARE_^1*_1NOT EXECUTABLE AT PRESENT FOR LACK OF HARDWARE_^1*_1DEFINITION. IN THE EVENT THAT IS REQUIRED, CHANGE_^1*_€€1THE FIRST 8 CODINGS (IN *) TO NORMAL CODINGS AND_^1*_1DO THE SAME ON THE 'CHKPRI' PORTION._^1*_]_^1*_]_^1_%SPC 1_^1*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_^1*SEEKOP LDA- DIAGSP,I_$CHECK IF CLEAR ATTENTION BIT FUNCTION_^1*_$AND- LPMSK+4_^1*_$INA -CODE12_^1*_$SAN SEKOP0_'NO, SKIP (ON NORMAL SEEK REQUEST)_^1*_$SPC 1_^1*_$RTJ SEEK8_(TO CLEAR ATTEN€€TION BIT (RETURN TO ZERO SEEK)_^1*_$CLR A_,CLEAR RETURN TO ZERO SEEK FLAG (NO ERROR)_^1*_$STA- RTZFLG,I_^1*_$JMP* SKOP_)TO SET UP INTERRUPT, ETC._^1*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_^1_%SPC 1_^1*_1NORMAL SEEK REQUEST_^1_%SPC 1_^1SEKOP0 LDA- RTZFLG,I_K122*4185_^1SEEKOP EQU SEEKOP(SEKOP0)_^1*_1TAKE THE ABOVE 'EQU' CARD OUT IF ATTENTION BIT€€_^1*_1FUNCTION IS USED_^1_%LDQ- EWES,I_^1_%SAZ SEKOP1_'SENSE NOT RTZ SEEK_3122*4185_^1_%INQ DRCO12_'=READ RECOVERY CONTROL_/122*4185_^1_%JMP* SEKOP2_M122*4185_^1SEKOP1 LDA- CYLADR,I_$=CYLINDER ADDRESS_4122*4185_^1_%INQ DRCO05_'=LOAD ADDRESS FUNCTION_/122*4185_^1SEKOP2 OUT REJA-*_'EXECUTE SEEK(OR RTZ SEEK)_,122*4185_^1_%SPC 2_^1*_1SET UP INTERRUPT AND RELEASE CU_^1SKOP_!RTJ* SE€€TFNS_'SET UP SEEK INTERRUPR STUFF_^1*******---------- 1 CARD DELETED ( RTJ RLSECU ) ---------*****122*4185_^1TOCHCK JMP LTOFDR_'CHECK FOR NEXT OPERATION._,112*4229_^1_%SPC 5_^1*_]_^1*--------------------------------------------------------------------_^1*_]_^1*_1ENTRY INDEX -----_"7_^1*_]_^1*_]_^1*-----_,SEEK ERROR COUNT CHECK (ERROR DETECTED)_^1*_]_^1UPSKER RTJ* SEKCHK_'CHEC€€K FOR SEEK RETRIES_^1UPSK10 RTJ* (SUB4A)_%CLEAR DA INTERRUPT STATUS_,122*4185_^1_%RTJ CLRSTS_'CLEAR OTHER STATUS WORDS_^1CRSTAD EQU CRSTAD(*-1)_^1_%JMP* SEEKOP_'TRY SEEK AGAIN_^1_%SPC 5_^1*_]_^1*_(-------_,-----------_+-----------_^1_%SPC 2_^1*_]_^1*_'---------------------------------------------------------------_^1*_]_^1*_1SUBROUTINE TO RELEASE CU_^1*_]_^1RLSECU NOP 0_,ENTRY€€ FOR RELEASE CU_^1_%LDQ- EWES,I_^1_%INQ DRCO08_'SET Q FOR DIRECTOR FUNCTION_^1_%ENA WARLCU_'SET TO DESELECT THE CU_^1_%OUT REJA-*_'RELEASE THE CU_^1_%JMP* (RLSECU)_$RETURN TO CALLER_^1_%SPC 2_^1*_]_^1*_$SUBROUTINE TO SET UP SEEK FUNCTION_^1*_]_^1SETFNS NOP 0_^1_%RTJ* SKALND_'SET ALRAM + SEEK END INTERRUPT FOR SEEK FUN._^1_%LDA- DIASKT,I_$GET SEEK OPERATION DIAGNOSTIC TIMER VAL€€UE_^1_%STA- EDCLK,I_%STORE IN PHYSTB_^1_%LDQ- LOGDRV,I_$FETCH LOGICAL DRIVE NUMBER_^1_%LDA* SEKINP_'FETCH SEEKS IN PROGRESS_^1_%AND- ZROBIT,Q_$MAKE SURE BIT FOR THIS DRIVE IS CLEARED_^1_%EOR- ONEBIT,Q_$NOW SET IT_^1_%STA* SEKINP_^1_%JMP* (SETFNS)_^1_%SPC 3_^1*_]_^1*_*-------_%ROUTINE TO SET UP ALARM AND SEEK END INTERRUPT_^1*_8FOR SEEK FUNCTION_^1*_]_^1_%SPC 2_^1SKALND NOP 0_,EN€€TRY_^1_%LDQ- EWES,I_^1_%INQ DRCO08_'SET Q FOR DIRECTOR FUNCTION_^1_%ENA WAIALM_^1_%OUT REJA-*_'SELECT ALARM ERROR INTERRUPT_^1_%ENA WAISED_^1_%OUT REJA-*_'SELECT SEEK END INTERRUPT_^1_%JMP* (SKALND)_$RETURN TO CALLER_^1_%SPC 2_^1*_$CHECK FOR LIMIT ON SEEK TRIES_^1SEKCHK ADC 0_^1_%RAO- SEKERR,I_$INCREMENT SEEK ERROR COUNTER_^1_%LDA- DIASEK,I_^1_%SUB- SEKERR,I_^1_%SAP SCHK1_(€€SENSE NOT MAX. NO. OF RETRIES_(122*4185_^1*_$TAKE ERROR EXIT PATH_^1_%ENA SERR_)CODE FOR SEEK ERROR_^1_%JMP* TOERR_(GO REPORT SEEK ERROR_1122*4185_^1SCHK1 JMP* (SEKCHK)_^1_%SPC 2_^1*_$ROUTINE TO CLEAR A HEAD FAULT ERROR_^1*_$MUST BE CLEARED BY SELECTING A VALID HEAD_^1SEEK9 ADC 0_^1_%LDQ- EWES,I_^1_%INQ DRCO07_'SET FUNCTION FOR HEAD SELECT_^1_%ENA 0_,SET FOR HEAD ZERO_^1_%OU€€T DEVERR-*_$SELECT HEAD ZERO TO CLEAR FAULT_^1_%JMP* (SEEK9)_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_'*_^1*_$CHECK THE PRIORITYS ON THE UNITS THAT HAVE COMPLETED SEEKING_"*_^1*_]_'*_^1*---------------------------------------------------------------------_^1*_]_^1*_1ENTRY INDEX -----_"5_^1*_]_^1*_1AT ENTRY :_^1*_1A-REGISTER = IND€€EX_^1*_>0 FROM INTERRUPT ENTRY_^1*_=-1 FROM OTHER_^1*_]_^1_%SPC 3_^1*_1SPECIAL ITEM : CHECK FOR CLEAR ATTENTION BIT REQUEST_^1*_]_^1CHKPRI TRA Q_,SAVE ENTRY TYPE IN Q_^1_%LDA- DIAGSP,I_$CHECK IF MULTIPLE DRIVES_^1_%AND- ONEBIT+14_^1_%SAN PRI2DR_'SKIP ON MULTI-DRIVES_^1_%SQN PRI2DR_'SKIP ON NON-INTERRUPT ENTRY_^1*_1TO HERE IT IS 1 DRIVE AND INTERRUPT ENTRY_^1AS1_"RTJ* CLRSKN_'TO€€ CLEAR SEEK END AND CHECK FOR ERROR_^1_%JMP* SEKHOS_^1*_]_^1PRI2DR RTJ MPDRIV_'CHECK FOR PRIORITY FOR MULTIPLE DRIVES_^1_%JMP* TOCHCK_'RETURN ADD. 1_^1SEKHOS LDQ- LOGDRV,I_$RETURN ADD. 2_^1_%LDA* SEKCOM_^1_%AND- ZROBIT,Q_$RESET SEEK COMPLETE BIT FOR UNIT_^1_%STA* SEKCOM_^1_%SPC 1_^1*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_^1*_$SPC 1_^1*_1CHECK FOR€€ CLEAR ATTENTION BIT REQUEST_^1*_$LDA- DIAGSP,I_^1*_$AND- LPMSK+4_^1*_$INA -CODE12_^1*_$SAZ CLRATN_'YES, SKIP_^1*_$SPC 1_^1*_1FOR CLEAR ATTENTION REQUEST, TO 'DONE'_^1_%JMP* DATA_^1*CLRATN JMP DONE_^1*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_^1_%SPC 1_^1*_]_^1_%SPC 2_^1*_$SEEK ON UNIT IS DONE_^1*_]_^1*_1SEEK IS DONE, CLEAR SEEK END INTERRUPT AND€€ CHECK_^1*_1IF SEEK ERROR IS ENCOUNTERED. IF SO, DO SEEK AGAIN_^1*_]_^1CLRSKN NOP 0_,ENTRY_^1_%RTJ CONCU_(GO CONNECT TO CU_^1CONUAD EQU CONUAD(*-1)_^1_%RTJ CNDRIV_'CONNECT TO THE DRIVE_^1CNDRAD EQU CNDRAD(*-1)_^1_%LDA- RTZFLG,I_K122*4185_^1_%SAN SEEK3A_'SENSE RTZ SEEK COMPLETE_.122*4185_^1_%ENQ 1_,=CODE FOR FILL DIAG. BUFFER SR_'122*4185_^1_%RTJ FILSMD_'FILL DIAGNOSTIC BUF€€FER SR_,122*4185_^1SEEK3A LDQ- LOGDRV,I_K122*4185_^1_%LDA* SEKDON_'FETCH SEEKS DONE_^1_%AND- ZROBIT,Q_$CLEAR BIT FOR THIS DRIVE_^1_%STA* SEKDON_'RESTORE_^1_%ENA -0_Q122*4185_^1_%STA- EDCLK,I_%RESET DIAGNOSTIC CLOCK IN CASE_'122*4185_^1*_9INTERRUPT NOT PROCESSED_-122*4185_^1*_'NOTE- WHEN CLEARING SEEK END STATUS,ALTERNATE CHANNEL 122*4185_^1*_-REQUEST IS ALSO SET OR CLEARED AS PER€€ BIT 4. DO A122*4185_^1*_-POLL CHECK AND SET BIT 4 ACCORDINGLY TO RETAIN_!122*4185_^1*_-ALTERNATE CHANNEL REQUEST STATUS FOR DRIVE._$122*4185_^1_%ENA POLALC_'POLL FOR ALTERNATE CHANNEL REQUEST_"122*4185_^1_%RTJ POLCHK_M122*4185_^1_%LDQ- LOGDRV,I_K122*4185_^1_%AND- ONEBIT,Q_K122*4185_^1_%SAZ SEEK3B_'SENSE NO ALT. CHL. REQUEST_+122*4185_^1_%ENA $10_*SET TO RETAIN ALT. CHL. REQ._)€€122*4185_^1SEEK3B INA WACRSN_'SET SEEK CLEAR BIT_3122*4185_^1_%EOR- LOGDRV,I_$SPECIFY LOGICAL DRIVE NO._,122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO01_'SET DRIVE REQUEST CODE_/122*4185_^1_%OUT DEVERR-*_$CLEAR THE POLL SEEK BIT FOR THIS DRIVE_^1_%LDA- DFLTST,I_$=DRIVE FAULT STATUS_2122*4185_^1_%AND- NZERO+1_%IGNORE WRITE PROTECT ON(BIT 0)_'122*4185_^1_%SAZ SEEK3C_'SKIP IF NO€€ FAULTS ON SEEK_^1_%JMP* SEEK5_^1SEEK3C LDA- RTZFLG,I_$FETCH RTZ IN PROGRESS FLAG_^1_%SAZ SEEK3F_'SKIP IF NOT RTZ SEEK COMPLETE_^1_%ENA 0_^1_%STA- RTZFLG,I_$CLEAR THE RTZ SEEK IN PROGRESS FLAG_^1_%RTJ* SEKCHK_'CHECK SEEK RETRIES_3122*4185_^1_%JMP* TOSKOP_'TO SEEK OPERATION AGAIN_^1_%SPC 1_^1*_$HAVE REGULAR SEEK WITH NO ERRORS_^1SEEK3F STA- SEKERR,I_$CLEAR SEEK ERROR COUNTER_^1_%€€LDQ- LOGDRV,I_$FETCH LOGICAL DRIVE NUMBER_^1_%LDA* SEKINP_'FETCH SEEKS IN PROGRESS_^1_%AND- ZROBIT,Q_$KNOCK DOWN SEEK IN PROGRESS BIT_^1_%STA* SEKINP_^1_%LDA- DIAECC,I_K122*4185_^1_%SAP SEEK3G_'SENSE OFFSET SEEK FLAG NOT SET_'122*4185_^1_%AND- LPMSK+15_$CLEAR OFFSET SEEK FLAG_/122*4185_^1_%STA- DIAECC,I_K122*4185_^1_%JMP SEEKOP_'GO REDO SEEK TO ORIGINAL CYLINDER_#122*4185_^1SEEK3€€G LDA* SEKCOM_'=SEEKS COMPLETE_6122*4185_^1_%AND- ZROBIT,Q_$MAKE SURE BIT IS CLEAR_^1_%EOR- ONEBIT,Q_$THEN SET_^1_%STA* SEKCOM_^1CRSKEX JMP* (CLRSKN)_$RETURN_^1_%SPC 2_^1*_1INTERNAL/EXTERNAL REJECT ERROR_^1DEVERR JMP* DEV1_^1_%ENA ERR06_(EXTERNAL REJECT_^1_%JMP* TOERR_^1REJA_!EQU REJA(DEVERR)_^1DEV1_!ENA ERR05_(INTERNAL REJECT_^1TOERR JMP CLRINT_'TO INTERNAL/EXTERNAL ERROR €€PROCESSING_^1_%SPC 2_^1*_$PROCESS FAULT STATUS ERROR ON DRIVE_^1SEEK5 AND- ONEBIT+7_$SAVE HEAD FAULT BIT_^1_%SAZ SEEK5A_'SKIP IF NO HEAD ERROR_^1_%RTJ* SEEK9_(GO CLEAR HEAD ERROR_^1SEEK5A LDA- DFLTST,I_^1_%AND- ONEBIT+1_$SAVE SEEK ERROR BIT_^1_%SAZ SEEK5D_'SENSE NO SEEK ERROR_2122*4185_^1_%LDA =XWACLRZ_K122*4185_^1_%STA- RTZFLG,I_$SET RTZ SEEK-IN-PROGRESS_-122*4185_^1_%JMP UP€€SK10_'GO DO RTZ W/O CHECKING RETRIES_'122*4185_^1SEEK5D JMP UPSKER_'GO TO UPDATE SEEK ERROR COUNT,DO SEEK 122*4185_^1_%SPC 2_^1*_1DATA FLAGS ADDRESSED BY OTHER ROUTINES_^1*_]_^1SEKINP NUM 0_,SEEKS IN PROGRESS_^1SEKCOM NUM 0_,SEEKS COMPLETE. READY TO TRANSFER DATA_^1SEKDON NUM 0_,SEEK DONE FLAG_^1_%EJT_]_^1*------------------------------------------------------------------€€---_^1*_]_^1*_$D A T A_!T R A N S F E R_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1ENTRY INDEX -----_"2_^1*_]_^1_%SPC 3_^1DATA_!LDA- ECCOR,I_L122*4185_^1_%SAN DATA1_(SENSE FWA NOT = 0_4122*4185_^1*_(IF FWA = 0,LU INACTIVE;ABORT FURTHER PROCESSING_%122*4185_^1_%JMP* CHECK2_M122*4185_^1DATA1 LDA- DIAECC,I_K122*4185_^1_%ALS 1_R122*4€€185_^1_%SAP DATA1A_'SENSE OFFSET RETURN FLAG NOT SET_$122*4185_^1_%LDA- DIAECC,I_K122*4185_^1_%AND- LPMSK+14_$RESET OFFSET RETURN FLAG_-122*4185_^1_%STA- DIAECC,I_K122*4185_^1*_'OFFSET RETURN REQUIRES EXIT VIA ECC LOGIC_-122*4185_^1_%JMP ECXIT_(GO TO ECC EXIT LOGIC_1122*4185_^1DATA1A LDA- DIAGSP,I_K122*4185_^1_%SAP DATA5_(NO, SKIP_^1_%ENA POLSUR_'SET FOR SOURCE USAGE_^1_%RTJ P€€OLCHK_'GO POLL_^1_%LDQ- LOGDRV,I_^1_%AND- ONEBIT,Q_$SAVE BIT FOR THIS DRIVE_^1_%LDQ- FCONN,I_%FETCH DA_^1_%SAZ DATA2_(SKIP IF POLL DA IS 0_^1_%SQZ DATA3_(SKIP IF DAS NOT THE SAME_^1_%JMP* DATA5_(SAME. START TRANSFER_^1DATA2 SQZ DATA5_(SKIP IF SAME_^1DATA3 RTJ* (CNDRAD)_$CONNECT TO THE DRIVE_^1TOSKOP JMP SEEKOP_'GO REDO SEEK_^1DATA5 RTJ* (CNDRAD)_$CONNECT TO THE DRIVE_^1_%SPC€€ 2_^1_%SPC 1_R122*4185_^1*_'DIAGNOSTIC LOGICAL UNIT REQUIREMENTS_2122*4185_^1*_'1. DO HARDWARE F-WRITE IF DIAGSP(BITS 3-0)=6_*122*4185_^1*_'2. EXIT FOR SEEK ONLY IF STROBE(BIT 2)=1_.122*4185_^1*_'3. SET STROBE IF STROBE(BITS 14 OR 15)=1_.122*4185_^1_%SPC 1_R122*4185_^1_%LDA- DIAGLU,I_K122*4185_^1_%SUB- ELU,I_N122*4185_^1_%SAZ D18_*SENSE DIAGNOSTIC LU_2122*4185_^1_%JMP* D20_P122€€*4185_^1D18_"LDA- DIAGSP,I_K122*4185_^1_%AND- LPMSK+4_L122*4185_^1_%INA -DRCO06_L122*4185_^1_%SAN D19_*SENSE NOT H/W F-WRITE_0122*4185_^1_%LDA- TRASEC,I_K122*4185_^1_%AND- NZERO+8_%=TRACK,SECTOR 0_6122*4185_^1_%LDQ- EWES,I_^1_%INQ DRCO07_'SET FOR OUTPUT TRACK_^1_%OUT DEVERR-*_^1_%INQ DRCO06-DRCO07 SET TO OUTPUT FORMAT-WRITE_^1_%JMP* DAT20_^1D19_"LDA- STROBE,I_K122*4185_^1_%AND€€- ONEBIT+2_%($0004)_=122*4185_^1_%SAZ D21_*SENSE NOT SEEK ONLY TYPE REQUEST_$122*4185_^1_%JMP DONE_)GO TO COMPLETE REQUEST_/122*4185_^1D21_"LDA- STROBE,I_K122*4185_^1_%AND- NZERO+14_%($C000)_=122*4185_^1_%SAZ D20_*SENSE NO STROBE REQUIRED(DIAG. LU)_"122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO12_M122*4185_^1_%OUT DEVERR-*_$OUTPUT READ RECOVERY-STROBE_*122*4185_^1D20_"LDA- E€€LSTWD,I_$PICK UP LWA+1_^1_%LDQ- ECCOR,I_%PICKUP FWA_^1_%RTJ COMPV4_'COMPUTE TRANSFER LENGTH_.122*4185_^1_%LDQ- TABIND,I_K122*4185_^1_%SQZ D23_*SENSE ECC RECOVERY NOT ON_,122*4185_^1_%INA -97_P122*4185_^1_%SAM D22_*SENSE LENGTH .LE. 96_1122*4185_^1*_'ECC RECOVERY IS DONE ON ONLY ONE SECTOR_/122*4185_^1_%ENA -1_+SET LENGTH=96(-1+97)_1122*4185_^1D22_"INA 97_Q122*4185_^1D23_"LDQ-€€ EWES,I_M122*4185_^1_%OUT DEVERR-*_$SET BUFFER LENGTH REGISTER_^1_%RTJ SMDCPA_'TRANSLATE LOGICAL TO PHYSICAL ADDRESS_^1DAT10 STQ- MSB256,I_)SAVE MSB ADDRESS_^1_%LDQ- EWES,I_'SET UP Q FOR FWA LOWER OUTPUT_^1_%INQ DRCO13_^1_%OUT DEVERR-*_$SET FWA_^1_%LDA- MSB256,I_$GET FWA UPPER DATA_^1_%INQ DRCO14-DRCO13 SET Q FOR FWA UPPER OUTPUT CODE_^1_%OUT DEVERR-*_$OUTPUT FWA UPPER DATA €€(FIELD ADDRESS)_^1_%INQ DRCO07-DRCO14 SET Q TO SELECT TRACK/SECTOR_^1_%LDA- TRASEC,I_$FETCH TRACK/SECTOR_^1DAT20 OUT DEVERR-*_$SELECT IT_^1_%SPC 3_^1*_]_^1*_1ENTRY INDEX -----_"3_^1*_]_^1DATA8 RTJ CLRDAS_'CLEAR ALL INTERRUPT ENABLES_*122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO08_'SET Q FOR DIRECTOR FUNCTION_^1_%ENA WAIALM_'SELECT ALARM INTERRUPT_^1_%OUT DEVERR-*_^1_%€€ENA WAIXFR_'SELECT TRANSFER COMPLETE INTERRUPT_^1_%OUT DEVERR-*_^1_%ENA WAIECL_'SELECT END OF CYLINDER INTERRUPT_^1_%OUT DEVERR-*_^1_%LDQ- FDATAF,I_$FETCH THE DATA TRANSFER FUNCTION_^1_%SPC 1_R122*4185_^1*_'DIAGNOSTIC LU REQUIREMENTS_<122*4185_^1*_)1. FOR H/W F-WRITE,NO I/O_;122*4185_^1*_)2. FOR READ/WRITE ADDRESS TAGS,A-REG. BIT 7 = 1_$122*4185_^1*_)3. FOR NORMAL XFER,A-REG. €€BIT 7 = 0_1122*4185_^1_%SPC 1_R122*4185_^1_%LDA- DIAGLU,I_K122*4185_^1_%SUB- ELU,I_N122*4185_^1_%SAZ DAT800_'SENSE DIAG. LU_7122*4185_^1_%ENA 0_,SET FOR NORMAL READ_2122*4185_^1_%JMP* DAT810_M122*4185_^1DAT800 LDA- DIAGSP,I_K122*4185_^1_%AND- LPMSK+4_L122*4185_^1_%SAZ DAT810_'SENSE NORMAL READ_4122*4185_^1_%INA -FW_P122*4185_^1_%SAZ DAT820_'SENSE H/W F-WRITE(NO I/O)_,122*4185€€_^1_%LDA- TAGSDA_'SET FOR ADDRESS TAGS XFER_,122*4185_^1DAT810 OUT DEVERR-*_$START THE DATA TRANSFER_^1DAT820 LDA- DIAXFR,I_^1_%STA- EDCLK,I_%SET CLOCK TIME OUT VALUE_^1_%LDQ- I_,FETCH PHYSTB ADDRESS_^1_%STQ DATFLG_'SAVE ADDRES OF UNIT WITH DATA TRANSFER_^1_%ENQ 2_,=CODE FOR FILL DIAG. BUFFER SR_'122*4185_^1_%RTJ FILSMD_'FILL DIAGNOSTIC BUFFER SR_,122*4185_^1_%JMP- (ADISP)_^1_%€€EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_$CHECK ALL PHYSTBS FOR A UNIT THAT WANTS IN_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1ENTRY INDEX -----_"4_^1*_]_^1_%SPC 3_^1CHECK LDQ- I_R122*4185_^1_%JMP* CHECK5_M122*4185_^1CHECK1 TRA Q_^1_%SUB- I_,IS THIS END OF CHAIN_^1_%SAZ CHECK4_'SKI€€P IF YES_^1CHECK5 LDA- ESTAT1,Q_$SEE IF THIS UNIT WANTS IN_,122*4185_^1_%AND- ONEBIT+2_^1_%SAN CHECK3_'IT DOES, GO SERVICE IT_^1_%LDA- OTHER,Q_%GET NEXT UNIT_^1_%JMP* CHECK1_'CHECK IT_^1CHECK4 LDQ* SEKCOM_'SEEKS COMPLETED FLAG_^1_%SQZ CHECK2_'SKIP IF NO DATA TRANSFERS TO START_^1_%ENA -1_+SET ENTRY TYPE_^1_%JMP CHKPRI_'CHECK PRIORITYS ON UNITS DONE SEEKING_^1CHECK2 RTJ ALTDAI_€€'SET ALT. DA INT. IF REQUIRED_)122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO08_M122*4185_^1_%ENA WARLCU_M122*4185_^1_%OUT 1_,RELEASE CU (DONE HERE ONLY)_*122*4185_^1_%NOP 0_,DO NOT DO AN I/O REJECT. WILL_(122*4185_^1*_9TIMEOUT IF REJECTED._0122*4185_^1_%JMP- (ADISP)_%EXIT TO DISPATCHER_3122*4185_^1_%SPC 1_R122*4185_^1CHECK3 STQ- I_,SET I REGISTER TO UNIT THAT WANTS IN_^1_%LD€²A- ESTAT1,I_^1_%AND- ZROBIT+2_$CLEAR WANT IN BIT_^1_%STA- ESTAT1,I_^1_%ENA 0_,SET UP INDEX TO CONNECT CU + DR. THEN SEEK OP._^1_%JMP BSMD_)TO I/O OPERATION MODULE_^1_%END_]_^__²PSSMD CSY/ C77 P€1_%NAM SSMD_)DECK-ID C77 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$GET STATUS AND CONNECT CU/DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_%7. SSMD_^1*_]_^1*_*THIS MODULE CONTAINS A GROUP OF ROUTINES TO PERFORM SOME_^1*_*UTILITY FUNCTIONS. THEY ARE:_^1*_*(A) CONCU -- ITS€€ FUNCTION IS TO CONNECT CU._^1*_.CALLER REGAINS CONTROL WHEN CU IS CONNECTED. RECONNECT_^1*_.IS TRIED TO MAXIMUM TIMES WHEN AN ERROR IS ENCOUNTERED,_^1*_.THE ERROR IS LOGGED IF CONNECT FAILS. FOR MULTIPLE DA_^1*_.CONFIGURATION, THE DISPATCHER GAINS CONTROL IF CU IS_^1*_.USED BY THE OTHER CPU._^1*_]_^1*_*(B) CNDRIV -- IT IS USED TO CONNECT A DRIVE._^1*_.CONTROL IS RELEASED BACK TO€€ THE CALLER WHEN THE DRIVE_^1*_.IS CONNECTED WITHOUT ERROR. THE ERROR IS REPORTED AT_^1*_.ONCE IF IT IS NOT READY. OTHER TYPES OF ERRORS ARE NOT_^1*_.REPORTED UNTIL THE MAXIMUM NUMBER OF RETRIES ARE_^1*_.ATTEMPTED._^1*_]_^1*_*(C) CLRTDA, CLRSTS,CLRDAS,CLRTCU -- THEY ARE USED TO CLEAR_^1*_.DA STATUS ALL STATUS WORDS, DA INTERRUPT STATUS, AND_^1*_.CLEAR CU ONLY RESPECTIVELY. (FOUR€€ DIFFERENT ROUTINES)._^1*_]_^1*_*(D) DASTAT,STATUS -- OBTAIN DA STATUS AND FETCHS CU, DRIVE_^1*_.FAULT, DRIVE1 AS WELL AS DRIVE 2 STATUS. (2 ROUTINES)._^1*_]_^1*_*(E) POLCHK -- READS POLL STATUS AND RETURNS IT IN A-REGISTER_^1*_.(STATUS)._^1*_]_^1*_*(F) DRICHK -- DRIVE AVAILABILITY CHECK ROUTINE. (IT MUST DO_^1*_.A POLL FUNCTION FIRST, SETUP BY THIS ROUTINE). DRIVE IS_^1*_.AVAILAB€€LE TO THIS DA WHEN THE A-REGISTER IS ZERO_^1*_.(CALLING ROUTINE INFORMATION). IF THE OTHER DA IS USING_^1*_.THE DRIVE, IT IS SET UP FOR THE ALTERNATE DRIVE REQUEST_^1*_.AND RETURN TO CALLER WITH A-REGISTER SET TO -0._^1*_]_^1*_*(G) SEKENI -- CLEAR DA INTERRUPTS, CONNECT CU, AND POLL_^1*_.SEEK END STATUS._^1*_]_^1*_*(H) CKOVRL -- CHECK FOR OVERLAY REQUEST AND PARAMETER IS_^1*_.MOVE€€D TO PHYTAB FOR INDIRECT REQUEST IF OVERLAY._^1*_]_^1*_*(I) CYLTRK -- CONVERT MASS MEMORY ADDRESS TO CYLINDER AND_^1*_.TRACK/SECTOR FORMAT FOR I/O OPERATION._^1*_]_^1*_$(J) CLRACR -- CLEAR ALTERNATE REQUEST BIT_/122*4185_^1_%SPC 1_R122*4185_^1*_$(K) USKNPG -- LOCATE FIRST UNIT ON P.D.T. THREAD_(122*4185_^1*_3WITH SEEK-IN-PROGRESS._4122*4185_^1****_]_^1*_]_^1_%SPC 2_^1*-----------€€_%E N T R Y_$N A M E S_^1_%ENT CONCU_(CONNECT CU_^1_%ENT CKOVRL_'CHECK FOR OVERLAY_^1_%ENT CLRDAS_'CLEAR DA INTERRUPT STATUS_^1_%ENT CLRSTS_'CLEAR ALL STATUS WORDS_^1_%ENT CLRTCU_'CLEAR CU_^1_%ENT CLRTDA_'CLEAR DA STATUS_^1_%ENT CNDRIV_'CONNECT DRIVE_^1_%ENT CUCNST_'TO CHECK FOR CU CONNECTED OR ALARM STATUS._^1_%ENT CYLTRK_'CONVERT TO CYLINDER, TRACK + SECTOR_^1_%ENT DAST€€AT_'GET DA STATUS_^1_%ENT DRICHK_'DRIVE AVAILABLE CHECK_^1_%ENT MSBLSB_'GETS ACTUAL MSB/LSB VALUES FROM THE REQUEST_^1_%ENT POLCHK_'POLL STATUS_^1_%ENT CLRACR_M122*4185_^1_%ENT USKNPG_'SR TO LOCATE UNIT WITH SEEK IN PROGRES122*4185_^1_%ENT SMDSTS_'GET ALL STATUS WORDS_^1*_1DATA FLAGS_^1_%ENT SELFLG_'PDT ADDRESS IF WAITING FOR SELECT WORD_^1_%SPC 2_^1*-----------_%E X T E R€€ N A L S_^1*_]_^1_%EXT CLRINT_'I/O ERROR_^1_%EXT COMPV4_'MAGNITUDE COMPARISON ROUTINE (IN TRVEC)_^1_%EXT SMDGCU_'TO GET THE CU FROM THE OTHER DA._^1_%EXT MPDVCK_'MULTIPLE DRIVES AVAILABLE CHECK_^1_%SPC 2_^1*---_.DATA FLAG_^1_%EXT SEKINP_'SEEK IN PROGRESS FLAG_^1_%EXT P83310_'UNIT 0 PHY. DEV. TBL._0122*4185_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^€€1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU MSB(1)_'INDEX FOR THE MSB WORD (USED IN MSBLSB)_^1_%€€EQU LSB(2)_'INDEX FOR THE LSB WORD (USED IN MSBLSB)_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION€€ ROUTINE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU D€€GBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$S€€EEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^€€1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1€€_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LO€€WER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDE€€R ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_€€^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^€€1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU AND DRIVE STATUS €€1 REGISTERS_^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%E€€QU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(€€4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN T€€O 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAG€€NOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASL€€GN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU€€ TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF AD€€DRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTA€€T1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"R€€ETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE €€OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR €€CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)€€_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU SUBROUTINE_)122*4185_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_$CONNECT TO CU/33_^1*_]_^1*-------------------------------------------------€€--------------------_^1_%SPC 2_^1*_1FLAG INDICATING WAITING FOR CU (NON-ZERO)_^1*_1THIS WORD IS REFERRED BY OTHER ROUTINE_^1SELFLG NUM 0_,PDT ADDRESS IF WAITING FOR SELECT_^1_%SPC 2_^1*_1LOCAL STORAGE WORDS_^1ERACNT NUM 0_,SELECT ERROR COUNT_^1CONCNT NUM 0_,CONNECT LOOP COUNTER FOR TIMING_^1_%SPC 2_^1*_]_^1*_1IF CU IS CURRENTLY CONNECTED TO DA WITHOUT_^1*_1ALARM ERROR CHECK€€_^1*_1IN RETURN: P+1 = ALARM IS DETECTED,_^1*_122*4185_^1_%AAQ A_R122*4185_^1_%SAM STO3_)SENSE OK_=122*4185_^1_%JMP* STO4_O122*4185_^1STO2€€_!SAP STO4_)SENSE OUTSIDE BUFFER(Q-,A+)_*122*4185_^1_%TCA A_,(Q-,A-)_>122*4185_^1_%AAQ A_R122*4185_^1_%SAM STO4_)SENSE OUTSIDE BUFFER_1122*4185_^1STO3_!LDA* ECCORR_M122*4185_^1_%EOR- (ZERO),Q_$MAKE CORRECTION_6122*4185_^1_%STA- (ZERO),Q_K122*4185_^1_%JMP* (STOECC)_K122*4185_^1STO4_!JMP* ECXH_)TERMINATE ECC LOGIC IF CORRECTION_#122*4185_^1*_9OUTSIDE BUFFER_6122*4185_^1ECCORR NUM€€ 0_R122*4185_^1_%SPC 1_R122*4185_^1*_'ROUTINE TO GET EXPECTED HEAD/SECTOR FROM DA FILE_%122*4185_^1*_] 122*4185_^1EXPHS 0_"0_R122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO14_M122*4185_^1_%ENA $A_+=FILE ADDRESS FOR SECTOR_-122*4185_^1_%OUT REJC-*_M122*4185_^1_%INQ DRCI00-DRCO14 =READ FILE_;122*4185_^1_%INP REJC-*_M122*4185_^1_%STA* TSA_P122*4185_^1_%INQ DRCO14-DRCI00_F122€€*4185_^1_%ENA $B_+=FILE ADDRESS FOR HEAD_/122*4185_^1_%OUT REJC-*_M122*4185_^1_%INQ DRCI00-DRCO14_F122*4185_^1_%INP REJC-*_'READ FILE_<122*4185_^1_%ALS 8_R122*4185_^1_%EOR* TSA_P122*4185_^1_%STA* TSA_*SAVE HEAD/SECTOR_5122*4185_^1_%JMP* (EXPHS)_L122*4185_^1REJC_!JMP* REJC1_N122*4185_^1REJC0 ENA ERR06_(EXTERNAL REJECT_6122*4185_^1_%JMP* TOERR_N122*4185_^1REJC1 ENA ERR05_(IN€€TERNAL REJECT_6122*4185_^1TOERR JMP CLRINT_M122*4185_^1_%SPC 1_R122*4185_^1*_'CALCULATE START OF ECC ERROR SECTOR IN CORE BUFFER_#122*4185_^1*_)START=ECCOR-96+96*(64*(CURRENT TRACK-INITIAL TRACK-1)122*4185_^1*_/+(CURRENT SECTOR-INITIAL SECTOR+65))_*122*4185_^1*_)TRASEC=INITIAL HEAD SECTOR_:122*4185_^1*_)TSA_!=CURRENT HEAD/SECTOR_:122*4185_^1*_)NEW ECCOR = START_C122*4185_^1_%SPC€€ 1_R122*4185_^1SSECCR 0_"0_R122*4185_^1_%LDA- TRASEC,I_K122*4185_^1_%ARS 8_R122*4185_^1_%TCA Q_,=-INITIAL TRACK_6122*4185_^1_%LDA* TSA_P122*4185_^1_%ARS 8_,=CURRENT TRACK_7122*4185_^1_%AAQ A_R122*4185_^1_%INA -1_Q122*4185_^1_%ALS 6_,*64_B122*4185_^1_%STA* TSB_P122*4185_^1_%LDA- TRASEC,I_K122*4185_^1_%AND- LPMSK+8_L122*4185_^1_%TCA Q_,=-INITIAL SECTOR_5122*4185_^1_%INQ MXSR€€TK_M122*4185_^1_%LDA* TSA_P122*4185_^1_%AND- LPMSK+8_%=CURRENT SECTOR_6122*4185_^1_%INA 1_R122*4185_^1_%AAQ A_R122*4185_^1_%ADD* TSB_P122*4185_^1_%MUI =XMXWDSR_$*96_B122*4185_^1_%ADD- ECCOR,I_L122*4185_^1_%INA -MXWDSR_%-96_B122*4185_^1_%STA- ECCOR,I_%SAVE START OF ECC SECTOR_-122*4185_^1_%JMP* (SSECCR)_K122*4185_^1_%SPC 1_R122*4185_^1_%EJT_]_^1_%SPC 2_^1TSA_"NUM 0_,LAST TRAC€€K/SECTOR THAT WAS READ IN_^1TSB_"NUM 0_,WHOLE TRACKS IN SECTORS_^1TSC_"NUM 0_,BYTE DISPLACEMENT 0 - 198_^1TSE_"NUM 0_^1*_]_^1SUBAD1 ADC CLRDAS_'CLEAR DA STATUS_^1_%SPC 4_^1RDRCON NOP 0_,DO READ/ RECOVERY WITH WHAT IS IN A_^1_%LDQ- EWES,I_^1_%INQ DRCO12_'SET Q TO READ RECOVERY CONTROL_^1_%OUT REJC-*_M122*4185_^1_%JMP* (RDRCON)_^1_%SPC 2_^1*_]_^1*_$THE ERROR WAS NOT CORRECT€€ABLE WITH ECC LOGIC._^1*_$TRY THE NEXT HEAD OFFSET AND STROBE TIMING COMBINATION._^1*_]_^1ECN_"EQU ECN(*)_M122*4185_^1*_8INCREMENT THE COUNTER TO SELECT THE NEXT_^1*_9STROBE AND OFFSET COMBINATION._^1ECN020 RAO- TABIND,I_K122*4185_^1*_8PUT THE RECOVERY INDEX INTO Q._^1_%LDQ- TABIND,I_^1*_8PICK UP THE RECOVERY COMMAND._^1_%LDA* TABLE-1,Q_^1*_8ISOLATE THE CLEAR STATUS BITS_^1_%AND- €€LPMSK+8_^1*_8SAVE THIS AS A FLAG FOR SEEKING_^1_%STA* SEKFLG_^1*_8ISSUE THE CLEAR ERROR FUNCTION_^1_%RTJ* RDRCON_^1*_8CLEAR THE DA'S STATUS_^1_%RTJ* (SUBAD1)_^1*_8PUT THE RECOVERY INDEX INTO Q_^1_%LDQ- TABIND,I_^1*_8PUT THE RECOVERY COMMAND INTO A._^1_%LDA* TABLE-1,Q_^1*_8ISOLATE THE UPPER 8 BITS (STROBE/OFFSET)_^1_%AND- NZERO+8_^1_%SAN ECN030_'SENSE THERE IS RECOVERY TO DO_(122*4€€185_^1*_8NO FURTHER RECOVERY, SO IT IS UNRECOVERABLE._^1_%JMP* ECX026_M122*4185_^1ECN030 LDQ* SEKFLG_M122*4185_^1_%QLS 15-3_O122*4185_^1_%SQM ECN040_'SENSE OFFSET RECOVERY STEP_+122*4185_^1_%RTJ* RDRCON_'ISSUE READ RECOVERY-STROBE_+122*4185_^1_%ENQ ECRET2_'SET FOR XSMD/DATA ENTRY TO RE-READ SEC122*4185_^1_%JMP* ECN060_M122*4185_^1ECN040 LDQ- FUNCT,I_L122*4185_^1_%INQ -DRCO09_L1€€22*4185_^1_%SQZ ECN050_'SENSE READ FUNCTION_2122*4185_^1_%JMP* ECN020_(WRITE WITH OFFSET ILLEGAL,GO TO NEXT 122*4185_^1*_:RECOVERY STEP._5122*4185_^1ECN050 RTJ* RDRCON_'ISSUE READ RECOVERY-OFFSET_+122*4185_^1_%RTJ SETFNS_'ENABLE INT.,SET SEEK-IN-PROGRESS_$122*4185_^1_%ENQ ECRET4_'GO TO XSMD/CHECK TO CHECK FOR OTHER DR122*4185_^1ECN060 JMP XSMD_O122*4185_^1SEKFLG ADC *-*_*STORA€€GE FOR THE SEEK FLAG._^1*_]_^1*_$DATA RECOVERY OFFSET AND STROBE TABLE_^1*_]_^1TABLE ADC (OFSETO+WACRSW)_+STROBE EARLY OFFSET OFF_^1_%ADC STRBL+OFSETO+WACRSW_'STROBE LATE OFFSET OFF_^1_%ADC STRBO+OFSETP+WACRSC_'STROBE OFF_!OFFSET PLUS ***_^1_%ADC (OFSETP+WACRSW)_+STROBE EARLY OFFSET PLUS_^1_%ADC STRBL+OFSETP+WACRSW_'STROBE LATE OFFSET PLUS_^1_%ADC STRBO+OFSETM+WACRSC_'STR€€OBE OFF_!OFFSET MINUS ***_^1_%ADC (OFSETM+WACRSW)_+STROBE EARLY OFFSET MINUS_^1_%ADC STRBL+OFSETM+WACRSW_'STROBE LATE OFFSET MINUS_^1_%ADC STRBO+OFSETO+WACRSC_'STROBE OFF_!OFFSET OFF_!****_^1*_]_^1*_$NOTE THAT THE ENTRYS WITH *** ARE SPECIAL. THEY ARE THE ONES_^1*_$THAT WILL CAUSE A HEAD MOVEMENT. THE ENTRY WITH THE **** WILL_^1*_$CAUSE THE PREVIOUS HEAD OFFSET TO BE CLEARED BU€€T WILL NOT CAUSE_^1*_$THE DRIVER TO WAIT FOR SEEK END. THIS ENTRY ISSUES A CLEAR READ_^1*_$RECOVERY COMMAND WHICH DOES NOT GENERATE THE CORRECT SEEK END_^1*_$INTERRUPT TIMING - WOULD GENERATE AN IMMEDIATE INTERRUPT BECAUSE_^1*_$THE ON CYLINDER STATUS DOES NOT DPOP._^1*_]_^1_%EJT_]_^1*_'EXIT LOGIC FOR ECC CORRECTION AND RECOVERY_,122*4185_^1_%SPC 1_R122*4185_^1ECX_"RTJ CLRTCU_'CLE€€AR THE CU STATUS BYTES_,122*4185_^1_%RTJ* (SUBAD1)_$CLEAR THE DA STATUS_2122*4185_^1_%LDA- TABIND,I_K122*4185_^1_%SAN ECX020_'SENSE ECC RECOVERY ON_0122*4185_^1_%LDA- ESTAT2,I_$=DA STATUS_;122*4185_^1_%AND- ONEBIT+3_K122*4185_^1_%SAN ECX010_'SENSE END-OF-XFER SET_0122*4185_^1_%JMP* ECX060_'GO TO CONTINUE XFER_2122*4185_^1ECX010 JMP ECX056_'GO TO BSMD MODULE ON EOT_-122*4185_^1_%€€SPC 1_R122*4185_^1ECXIT EQU ECXIT(*)_$ENTRY TO EXIT ECC CORRECTION LOGIC_"122*4185_^1ECX020 LDQ- EWES,I_M122*4185_^1_%INQ DRCI09_'=DRIVE STATUS 2_6122*4185_^1_%INP REJC-*_M122*4185_^1_%ALS 14_Q122*4185_^1_%SAM ECX026_'SENSE HEAD OFFSET ACTIVE_-122*4185_^1_%JMP* ECX040_M122*4185_^1ECX026 ENA $73_P122*4185_^1_%RTJ* RDRCON_'CLEAR DRIVE STATUSES_1122*4185_^1*_'NOTE- RETURN TO N€€ORMAL FROM OFFSET DOES NOT GENERATE A 122*4185_^1*_-SEEK COMPLETE INTERRUPT. THEREFORE,A SEEK TO AN 122*4185_^1*_-ADJACENT CYLINDER AND RETURN IS DONE TO_)122*4185_^1*_-GENERATE A PROPER SEQUENCE DURING RETURN_(122*4185_^1*_-TO NORMAL._F122*4185_^1_%LDA- DIAECC,I_K122*4185_^1_%AND- LPMSK+14_K122*4185_^1_%EOR- NZERO+14_$SET OFFSET SEEK,OFFSET RETURN FLAG_"122*4185_^1_%STA- DIAECC,I€€_K122*4185_^1_%LDA- CYLADR,I_$CALC. AN ADJACENT CYLINDER ADDRESS_"122*4185_^1_%INA -1_Q122*4185_^1_%SAP ECX030_'SENSE GOOD CYLINDER ADDRESS_*122*4185_^1_%ENA 1_,(SET TO 1 IF CYLINDER ADDRESS WAS 0) 122*4185_^1ECX030 LDQ- EWES,I_M122*4185_^1_%INQ DRCO05_'=LOAD CYLINDER ADDRESS FUNCTION_%122*4185_^1_%OUT REJC-*_'SEEK TO ADJACENT CYLINDER_,122*4185_^1_%RTJ SETFNS_'ENABLE INT.,S€€ET SEEK-IN-PROGRESS_$122*4185_^1_%ENQ ECRET4_M122*4185_^1_%JMP XSMD_)GO TO XSMD/CHECK ENTRY_/122*4185_^1_%SPC 1_R122*4185_^1*_'ECC EXIT LOGIC WHEN HEAD NOT OFFSET._/122*4185_^1ECX040 ENA $73_P122*4185_^1_%RTJ* RDRCON_'CLEAR DRIVE STATUSES_1122*4185_^1_%LDA- TABIND,I_K122*4185_^1_%INA -9_Q122*4185_^1_%SAN ECX050_'SENSE NOT IRRECOVERABLE(NOT LAST INDEX122*4185_^1_%ENA UNCEC€€C_'UNCORRECTABLE ECC ERROR CODE_)122*4185_^1_%JMP CLRINT_'GO TO ERROR LOGIC(ESMD)_.122*4185_^1_%SPC 1_R122*4185_^1ECX050 ENA 0_R122*4185_^1_%STA- TABIND,I_$TURN OFF RECOVERY_4122*4185_^1_%LDA- ELSTWD,I_K122*4185_^1_%LDQ- ECCOR,I_L122*4185_^1_%RTJ COMPV4_'CALCULATE LENGTH_5122*4185_^1ACOMPV EQU ACOMPV(*-1)_H122*4185_^1_%INA -97_P122*4185_^1_%SAM ECX060_'SENSE NOT END-OF-XFER_€€0122*4185_^1ECX056 LDQ- EXTRA,I_L122*4185_^1_%JMP BSMD4_(GO TO BSMD MODULE ON EOT_-122*4185_^1ECX060 LDA- ECCOR,I_L122*4185_^1_%INA 96_+BUMP START'G ADDR PAST ECC ERROR SECTR122*4185_^1_%STA- ECCOR,I_L122*4185_^1_%LDA- TRASEC,I_K122*4185_^1_%AND- LPMSK+7_L122*4185_^1_%INA -MXSRTK+1_J122*4185_^1_%SAZ ECX080_'SENSE END-OF-TRACK_3122*4185_^1_%LDA- TRASEC,I_K122*4185_^1_%INA 1_,BU€€MP TO NEXT SECTOR_2122*4185_^1_%JMP* ECX100_M122*4185_^1ECX080 LDA- TRASEC,I_K122*4185_^1_%ARS 8_R122*4185_^1_%INA -MXTKCY+1_J122*4185_^1_%SAN ECX090_'SENSE NOT END OF CYLINDER_,122*4185_^1_%ENQ ECRET1_M122*4185_^1_%JMP* ECX110_'GO TO XSMD/SPLITT TO CONTINUE XFER_"122*4185_^1*_9OVER CYLINDER._6122*4185_^1ECX090 LDA- TRASEC,I_K122*4185_^1_%AND- ZMSK+8_'SET SECTOR = 0_7122*4185_^€€1_%ADD- ONEBIT+8_$BUMP TO NEXT TRACK_3122*4185_^1ECX100 STA- TRASEC,I_$SAVE AS TRACK/SECTOR_1122*4185_^1_%ENQ ECRET2_M122*4185_^1ECX110 JMP XSMD_)GO TO XSMD/DATA TO CONTINUE XFER_$122*4185_^1_%SPC 1_R122*4185_^1REJT_!JMP* REJT2_N122*4185_^1REJT1 JMP REJC0_(EXTERNAL REJECT_6122*4185_^1REJT2 JMP REJC1_(INTERNAL REJECT_6122*4185_^1*----------------------------------------------€€-----------------------_^1*_]_^1*_$SUBROUTINE TO COMPUTE ECC OFFSET AND CORRECTION VALUES_^1*_]_^1*---------------------------------------------------------------------_^1_%SPC 1_^1*_]_^1*_]_^1_%SPC 3_^1ECLOOP NUM 0_,ECC ENTRY LOOP COUNTER_^1ECC_"NOP 0_^1_%RAO* ECLOOP_^1_%ENA 22_^1_%STA* ECCK_)INITIALIZE SHIFT COUNT_^1_%ENA 1_^1_%STA* ECCS_)INITIALIZE S SWITCH_^1_%LDA* NUMB0_€€^1_%STA* ECCA2_(INITIALIZE BYTE ACCUMULATOR_^1_%ENA 0_^1_%STA* ECCA0_^1_%STA* ECCA1_^1_%STA* ECCI_^1POHI_!LDQ- EWES,I_'FETCH EQUIPMENT CODE_^1_%INQ DRCI11_'SET Q TO READ ECC CONDITION STATUS_^1_%INP REJT-*_'READ ECC CONDITION STATUS_^1_%AND- ONEBIT+7_$SAVE PO HIGH BITS NOT EQUAL TO ZERO BIT_^1_%SAN SHI_*SKIP IF STILL HIGH BITS_^1_%JMP* NO_+ALL BITS ARE IN 0 - 11_^1SHI_"LDA* ECC€€K_^1_%SAN SHIFT_(SKIP IF NOT 22 SHIFTS YET_^1_%JMP* (ECC)_(NOT CORRECTABLE WITHIN 22 SHIFTS. RETURN P+1_^1*_]_^1SHIFT INA -1_+DECREMENT SHIFT COUNTER_^1_%STA* ECCK_)SAVE DECREMENTED COUNT_^1_%ENA $20_*SHIFT PO COMMAND FUNCTION BITS_^1_%OUT REJT-*_'ECC CONTROL FUNCTION_^1FETCHI LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1ADDA_!RTJ ADD_*FETCH AND ADD POLYNOMIAL CONSTANT_^1_%SQM S1_+SK€€IP IF HAVE CARRY FROM HIGH BYTE_^1_%ENA $60_*INDEX TO FETCH MODULUS FOR ADD_^1_%JMP* ADDA_)GO ADD MODULUS_^1S1_#LDA* ECCS_)FETCH S SWITCH_^1_%SAZ U_^1_%JMP* POHI_)GO CHECK PO AGAIN_^1NO_#ENA $54_^1_%STA* ECCI_)SET NEW POLYNOMIAL INDEX_^1_%ENA 89_^1_%STA* ECCK_)SET NEW SHIFT COUNTER VALUE_^1U_$LDQ- EWES,I_^1_%INQ DRCI11_^1_%INP REJT-*_'READ IN THE ECC CONDITION STATUS_^1_%STA*€€ ECCC_)SAVE CONDITION STATUS_^1*_$COMPUTE U VALUE FOR SWITCH CHECK_^1_%ALS 1_^1_%EOR* ECCC_^1_%AND =N$54_^1_%SAZ UZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. PARITY. RETURN AT P+1_^1_%SPC 2_^1NUME0 NUM $E0_^1NUMB0 NUM $B0_^1ECCK_!NUM 0_,SHIFT COUNTER_^1ECCI_!NUM 0_,INDEX INTO POLYNOMIAL TABLE_^1_%SPC 2_^1UZERO STA* ECCS_)SET S SWITCH TO ZERO_^1_%LDA* ECCI_)FETCH POLYNOMIAL IN€€DEX_^1_%AND* ECCC_)AND WITH CONDITION STATUS_^1_%STA* ECCI_^1_%SAZ IZERO_^1_%LDA* ECCK_^1_%INA -1_+DECREMENT COUNTER_^1_%SAN SH123_(SKIP TO SHIFT IF NOT ZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. RETURN AT P+1_^1SH123 STA* ECCK_)RESTORE K COUNTER_^1_%ENA $10_*COMMAND TO SHIFT P1,2,3 POLYNOMIAL REGISTERS_^1_%OUT REJT-*_'SHIFT P1,2,3_^1_%JMP* FETCHI_'GO FETCH INDEX AND ADD_^1IZERO €€STA* ECCX2_(ZERO OUT X2, X3 SYNDROME BYTES_^1_%STA* ECCX1_(ZERO OUT X0, X1 SYNDROME BYTES_^1_%STA* ECCI_)SET J SWITCH_^1_%LDA* ECCA1_^1_%ALS 8_^1_%EOR* ECCA2_(A HAS LOWER 2 ACCUMULATOR BYTES_^1_%LDQ* ECCA0_(Q HAS HIGH BYTE_^1_%LLS 8_^1_%LRS 7_,LEFT SHIFT ACCUMULATOR 1_^1_%SQP NOCARY_'SKIP IF NO CARRY_^1_%JMP* (ECC)_(ERROR EXIT , NOT CORRECTABLE_^1NOCARY STQ* ECCA0_^1_%ENQ 0_^1€€_%LLS 8_,MOVE MIDDLE BYTE TO Q_^1_%STQ* ECCA1_(RESTORE_^1_%ALS 8_^1_%STA* ECCA2_(SAVE LOW BYTE_^1NEXT_!LDA* ECCA2_^1_%SAZ A2ZRO_^1_%ADD* NUME0_^1_%AND- LPMSK+8_%IGNORE ANY OVERFLOW_^1_%STA* ECCA2_^1_%JMP* SHPO_^1A2ZRO LDA* ECCS_^1_%SAZ S2ZRO_(SKIP IF S SWITCH ZERO_^1_%JMP* END_^1_%SPC 2_^1ECCD_!NUM 0_^1ECCS_!NUM 0_,S SWITCH_^1ECCC_!NUM 0_,ECC_^1ECCX1 NUM 0_,SYNDROME BYTE€€S X0, X1_^1ECCX2 NUM 0_,SYNDROME BYTES X2, X3_^1ECCA0 NUM 0_,HIGH ORDER BYTE_^1ECCA1 NUM 0_,MIDDLE BYTE_^1ECCA2 NUM 0_,LOW BYTE_^1_%SPC 1_^1*_]_^1REJX_!JMP* REJT_^1_%JMP* REJT1_^1*_]_^1_%SPC 2_^1S2ZRO LDA* NUME0_^1_%STA* ECCA2_(SET A 2 TO $E0_^1_%LDQ- EWES,I_^1_%INQ DRCI11_'SET Q TO READ ECC CONDITION STATUS_^1_%INP REJT-*_'READ IN CONDITION STATUS_^1_%ALS 8_,P0 HIGH €€NEQ 0 TO SIGN BIT_^1_%SAP P0HZRO_'SKIP IF P0 HIGH IS ZERO_^1_%JMP* END_*GO DUMP SYNDROME BITS_^1P0HZRO LDA* ECCA0_(DO A0A1 - 1_^1_%ALS 8_^1_%EOR* ECCA1_^1_%INA -1_^1_%ENQ 0_^1_%LLS 8_^1_%STQ* ECCA0_^1_%ALS 8_^1_%STA* ECCA1_^1SHPO_!LDQ- EWES,I_^1_%INQ DRCO11_'SET Q TO ECC CONTROL FUNCTION_^1_%ENA $20_*SET A TO SHIFT PO COMMAND_^1_%OUT REJT-*_'ECC CONTROL. SHIFT PO_^1_%JMP* €€NEXT_^1END_"LDA* NUME0_^1_%STA* ECCA2_^1_%ENA 1_^1_%STA* ECCS_)SET S SWITCH TO 1_^1_%LDQ- EWES,I_^1_%INQ DRCI10_'SET Q TO ECC PATTERN READ_^1_%INP REJX-*_'READ ECC PATTERN_^1_%STA* ECCD_^1*_$BRANCH OFF VALUE OF J SWITCH_^1_%LDA* ECCI_^1_%INA -1_^1_%SAM LOOPA_(GO TO LOOPA IF J = 0_^1_%SAZ LOOPB_(GO TO LOOPB IF J = 1_^1*_$J = 2_^1_%LDA* ECCD_)FETCH ECC PATTERN_^1_%ALS 8_^1_%AN€€D* ECCX2_(AND INTO X2 SYNDROME BYTE. X3 UNCHANGED_^1_%STA* ECCX2_(RESTORE BYTES X2, X3_^1_%RAO ECC_*INCREMENT RETURN FOR P+2_^1_%JMP (ECC)_^1LOOPA LDA* ECCX1_(FETCH X0, X1 BYTES_^1_%ALS 8_,NOW X1, X0_^1_%LDQ* ECCD_)FETCH ECC PATTERN_^1_%LRS 8_,A HAS ECC PATTERN, X1_^1SAVEIT STA* ECCX1_^1_%RAO* ECCI_)INCREMENT SWITCH_^1_%JMP* SHPO_)GO SHIFT PO AGAIN_^1LOOPB LDA- ZMSK+10_^1_%S€€TA* ECCX2_(SET X2 TO $FC, X3 TO ZERO_^1_%LDA* ECCX1_^1_%AND- ZMSK+8_'SAVE X0 BYTE_^1_%EOR* ECCD_)OR IN ECC PATTERN_^1_%JMP* SAVEIT_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_^1*_$ROUTINE TO ADD POLYNOMIAL CONSTANT TO THREE BYTE ACCUMULATOR_^1*_$WILL FIRST CALCULATE INDEX INTO CONSTANT TABLE_^1*_$WILL THEN DO THE BYTE BY BYTE ADDITION_^1€€*_$IF A CARRY OCCURS FROM THE HIGH ORDER BYTE Q WILL BE SET NEGATIVE_^1*_]_^1*---------------------------------------------------------------------_^1_%SPC 3_^1ADD_"NOP 0_,A CONTAINS THE POLYNOMIAL INDEX_^1_%STA* ECIN_)SAVE INDEX SEARCHING FOR_^1_%ENQ 0_,INITIALIZE INDEX_^1FLOOP EOR* ECINDX,Q_$CHECK FOR INDEX MATCH_^1_%SAZ FOUND_(SKIP IF MATCH_^1_%INQ 1_,INCREMENT INDEX_^1_%E€€NA -ECINMX_^1_%AAQ A_,TEST FOR END OF INDEX TABLE_^1_%SAP NOMATH_'SKIP IF NO TABLE MATCH_^1_%LDA* ECIN_)FETCH INDEX SEARCHING FOR_^1_%JMP* FLOOP_^1NOMATH JMP (ECC)_(ASSUME NOT CORRECTABLE_^1FOUND TRQ A_^1_%MUI- LPMSK+2_%MULTIPLY BY THREE_^1_%TRA Q_,SET INDEX FOR CONSTANT TABLE_^1_%LDA* ECCA2_(FETCH LOW BYTE OF ACCUMULATOR_^1_%ADD* ECONST,Q_$ADD TABLE CONSTANT_^1_%ALS 7_^1_%€€ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDM_)SKIP IF NO CARRY_^1_%RAO* ECCA1_(INCREMENT NEXT BYTE FOR CARRY_^1_%AND- LPMSK+8_%SAVE ONLY LOW BYTE_^1ADDM_!STA* ECCA2_^1_%LDA* ECCA1_(FETCH NEXT BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_$ADD CONSTANT_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDB_)SKIP IF NO CARRY_^1_%RAO* ECCA0_(INCREMENT NE€€XT HIGHEST BYTE_^1_%AND- LPMSK+8_%SAVE BYTE ONLY_^1ADDB_!STA* ECCA1_(SAVE IN ACCUMULATOR_^1_%LDA* ECCA0_(FETCH HIGH ACCUMULATOR BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDC_)SKIP IF NO CARRY_^1_%AND- LPMSK+8_^1_%LDQ- LPMSK+16_$SET Q NEGATIVE FOR CARRY FROM HIGH BYTE_^1ADDC_!STA* ECCA0_^1_%JMP* (ADD)_^1€€ECIN_!NUM 0_^1_%SPC 3_^1*_$INDICES TO CONSTANTS, MUST REMAIN IN ORDER_^1ECINDX NUM $60_*0. INDEX FOR MODULUS 1_^1_%NUM $00_*1._32_^1_%NUM $04_*2._33_^1_%NUM $10_*3._34_^1_%NUM $14_*4._35_^1_%NUM $40_*5._36_^1_%NUM $44_*6._37_^1_%NUM $50_*7._38_^1_%NUM $54_*8._39_^1ECINMX EQU ECINMX(*-ECINDX)_%SIZE OF THE ABOVE TABLE_^1*_$CONSTANTS_!MUST REMAIN IN ORDER_^1ECONST NUM $2€€0_*0. INDEX 60 MODULUS 1. LOW_^1_%NUM $EE_*1._%60_(2. MIDDLE_^1_%NUM $8E_*2._%60_(3. HIGH BYTE_^1_%NUM $D0_*3. INDEX 00_(1. L_^1_%NUM $8D_*4._%00_(2. M_^1_%NUM $91_*5._%00_(3. H_^1_%NUM $A0_*6. INDEX 04_(1. L_^1_%NUM $36_*7._%04_(2. M_^1_%NUM $AF_*8._%04_(3. H_^1_%NUM $A0_*9..INDEX 10_(1. L_^1_%NUM $09_*10._$10_(2. M_^1_%NUM $B3_*11._$10_(3. H_^1_%NUM $60_*12.INDEX 14_(€€1. L_^1_%NUM $2E_*13._$14_(2. M_^1_%NUM $F1_*14._$14_(3. H_^1_%NUM $A0_*15.INDEX 40_(1. L_^1_%NUM $55_*16._$40_(2. M_^1_%NUM $EE_*17._$40_(3. H_^1_%NUM $40_*18.INDEX 44_(1. L_^1_%NUM $8C_*19._$44_(2. M_^1_%NUM $9D_*20._$44_(3. H_^1_%NUM $40_*21.INDEX 50_(1. L_^1_%NUM $5F_*22._$50_(2. M_^1_%NUM $A1_*23._$50_(3. H_^1_%NUM $00_*24.INDEX 54_(1. L_^1_%NUM $84_*25._$54_(2. M€D_^1_%NUM $DF_*26_%54_(3. H_^1*_$END OF CONSTANT TABLE_^1_%END_]_^__DPSMDNDR CSY/ C80 P€1_%NAM SMDNDR_'DECK-ID C80 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$FOR A MULTI-DRIVE SMD SYSTEM_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_$10. MPDRIV_^1*_]_^1*_]_^1*_*TO ALLOW OVERLAPPING SEEK, A SEARCH IS USED TO LOCATE THE_^1*_*HIGHEST REQUEST PRIORITY ON ALL COMPLETED SE€€EK OPERATIONS._^1*_*IT ALSO CHECK FOR ERROR CONDITION. DATA TRANSFER OPERATION_^1*_*IS INITIATED FOR THE HIGHEST REQUEST PRIORITY IF NO ERROR._^1*_]_^1****_]_^1*_]_^1_%SPC 2_^1*-----------_%E N T R Y_$N A M E S_^1_%ENT LTOFDR_'TO CHECK OTHER DRIVES STATUS_^1_%ENT MPDRIV_'CHECK FOR PRIORITY LEVELS FOR MULTIPLE DRIVES_^1_%ENT MPDVCK_'MULTIPLE DRIVES AVAILABLE CHECK_^1_%SPC 2_^1€€*-----------_%E X T E R N A L S_^1_%EXT XSMD_)SEEK/TRANSFER OPERATION_^1_%EXT CLRSKN_'TO CLEAR SEEK END AND CHECK FOR ERROR_^1_%EXT POLCHK_'GET SOURCE USAGE POLL STATUS_^1_%EXT RLSECU_'DE-SELECT CU_^1_%EXT CLRDAS_'CLEAR DA INTERRUPT STATUS_,122*4185_^1_%EXT CONCU_(CONNECT CU ROUTINE_3122*4185_^1_%EXT USKNPG_'SR TO LOCATE UNIT WITH SEEK IN PROGRESS_^1_%EXT SKALND_'SET ALRAM €€+ SEEK END INTERRUPT FOR SEEK FUN._^1*_]_^1_%EXT CLRINT_'I/O ERROR PROCESSING_^1*_1DATA FLAG_^1_%EXT P83310_(UNIT 0 PHYSTAB ADDRESS_^1_%EXT SEKCOM_'SEEK COMPLETION BITS_^1_%EXT SEKDON_'SEEK DONE BITS (ONE BIT FOR ONE DRIVE)_^1_%EXT SEKINP_'SEEK IN PROGRESS FLAG_^1_%EXT WANTDR_'BIT WORD FOR WANT DRIVE_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_€€%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6€€)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU €€MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA€€ BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT REA€€DY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FOR€€CE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(€€3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU €€ DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%€€EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRC€€I15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSF€€ER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLE€€AR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL€€ SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO€€ 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1€€_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC €€ 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUI€€PMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, €€IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB€€256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE €€OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERR€€ORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQ€€U DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. €€TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP)€€ VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU SUBROUTINE_)122*4185_^1_%EJT_]_^1*---------------------------------------------------------------------_^1*_]_'*_^1*_$CHECK THE PRIORITYS ON THE UNITS THAT HAVE COM€€PLETED SEEKING_"*_^1*_]_'*_^1*---------------------------------------------------------------------_^1*_]_^1*_]_^1_%SPC 3_^1MPDRIV NOP 0_,ENTRY POINT_^1_%ENA -1_+SET -1 AS CURRENT LEVEL BASE AND INITIALIZE_^1_%STA* PRINUM_,AS HIGHEST PRIORITY LEVEL_^1_%LDQ =XP83310_$SET TO UNIT 0 PHYSTAB ADDRESS_^1UNIT0 EQU UNIT0(*-1)_^1SEEK_!STQ- I_,SET I TO PHYSTB BEING SCANNED_^1_%LDQ- LO€€GDRV,I_$FETCH LOGICAL DRIVE NUMBER FROM PHYSTB_^1_%LDA- ONEBIT,Q_$FETCH BIT CORRESPONDING TO THIS DRIVE_^1_%AND SEKDON_'SAVE SEEK DONE BIT IF SET_^1DONAD EQU DONAD(*-1)_^1_%SAN SEEK3_(SKIP IF UNIT IS DONE_^1_%LDA- ONEBIT,Q_$FETCH MASK BIT FOR DRIVE AGAIN_^1_%AND SEKCOM_'CHECK IF SEEK IS COMPLETE_^1_%SAN SEEK3_(SKIP ON COMPLETED SEEK_^1DRSEAR LDQ- OTHER,I_%FETCH ADDRESS OF NEX€€T PHYSTB_^1_%TRQ A_^1_%SUB* UNIT0_(MINUS ADDRESS OF UNIT 0 PHYSTB_^1_%SAZ SEEK6_(ALL UNITS BEEN CHECKED_^1_%JMP* SEEK_)NOT ALL DONE YET_^1_%SPC 2_^1SEEK3 RTJ CLRSKN_'TO CLEAR SEEK END AND CHECK FOR ERROR_^1_%SPC 2_^1*_$SEEK ON UNIT IS COMPLETE_!DON T WORRY ABOUT FAULT STATUS_^1SEEK4 LDA* PRINUM_'FETCH HIGHEST PRIORITY LEVEL SO FAR_^1_%SUB- PRILVL,I_$MINUS THIS UNITS PRIORITY€€ LEVEL_^1_%SAP SEEK4A_'SKIP IF THIS UNITS PRIORITY NOT HIGHER_^1_%LDA- PRILVL,I_$FETCH PRIORITY FOR THIS REQUEST_^1_%STA* PRINUM_^1_%LDA- I_^1_%STA* PRIADR_'SAVE PHYSTB ADDRESS_^1SEEK4A JMP* DRSEAR_'GO SEE IF DONE_^1_%SPC 3_^1PRINUM NUM 0_,CURRENT HIGHEST PRIORITY NO._^1PRIADR NUM 0_,ADDRESS OF HIGH PRIORITY UNIT PHYSTB_^1_%SPC 2_^1*_$ALL PHYSTBS CHECKED_^1SEEK6 LDA* PRINUM_^€€1_%SAM SEEK6A_^1_%RAO* MPDRIV_'SET EXIT TO P+2_^1*_]_^1SEEK6A LDQ* PRIADR_'ADDRESS OF HIGHEST PRIORITY PHYSTB_^1_%STQ- I_^1_%JMP* (MPDRIV)_$RETURN TO CALLER_^1_%SPC 2_^1*_1INTERNAL/EXTERNAL REJECT ERROR_^1DEVERR JMP* DEV1_^1_%ENA ERR06_(EXTERNAL REJECT_^1_%JMP* TOERR_^1DEV1_!ENA ERR05_(INTERNAL REJECT_^1TOERR JMP CLRINT_'TO INTERNAL/EXTERNAL ERROR PROCESSING_^1_%SPC 5_^1*_€€]_^1*----------------------------------------------------------------------_^1*_]_^1*_1CHECK DRIVE AVAILABLE FOR MULTIPLE DRIVES_^1*_]_^1*----------------------------------------------------------------------_^1*_]_^1_%SPC 2_^1MPDVCK NOP 0_,ENTRY_^1_%ENA POLSUR_'SET FOR SOURCE USAGE POLL_^1_%RTJ POLCHK_'GET SOURCE USAGE POLL STATUS_^1POLAD EQU POLAD(*-1)_^1_%LDQ- LOGDRV,I_^1_€€%AND- ONEBIT,Q_$SAVE STATUS FOR THIS DRIVE_^1_%LDQ- FCONN,I_%FETCH DRIVER DA NUMBER_^1_%SAZ DCK1_)SKIP IF POLLED DA IS 0_^1_%SQZ DCK3_)SKIP IF DRIVER = 1 AND POLLED DA = 0_^1_%JMP* DCK2_)BOTH ARE 1_^1DCK1_!SQN DCK3_)SKIP IF POLLED =0 AND DRIVER = 1_^1DCK2_!ENA 0_^1_%JMP* (MPDVCK)_$RETURN, CAN USE DRIVE_^1DCK3_!ENA POLSIP_'SET FOR SEEK IN PROGRESS POLL_^1_%RTJ* (POLAD)_%GET SEE€€K IN PROGRESS POLL STATUS_^1_%LDQ- LOGDRV,I_^1_%AND- ONEBIT,Q_^1_%SAN DCK5_)SKIP IF SEEK IN PROGRESS_^1_%ENA POLSED_^1_%RTJ* (POLAD)_%GET SEEK END POLL STATUS_^1_%LDQ- LOGDRV,I_^1_%AND- ONEBIT,Q_$SAVE FOR THIS DRIVE ONLY_^1_%SAN DCK5_)SKIP IF SEEK END STILL SET_^1_%JMP* (MPDVCK)_$CAN USE DRIVE. RETURN A = 0_^1*_$OTHER DA IS USING THIS DRIVE_^1DCK5_!LDA* (WNDRAD)_$FETCH WANT DRIV€€E BITS_^1_%AND- ZROBIT,Q_$CLEAR BIT FOR THIS DRIVE_^1_%EOR- ONEBIT,Q_$SET BIT FOR THIS DRIVE_^1_%STA WANTDR_^1WNDRAD EQU WNDRAD(*-1)_^1_%LDA- LOGDRV,I_^1_%INA WARQIN_^1_%LDQ- EWES,I_^1_%INQ DRCO01_'SET DRIVE REQUEST CODE_^1_%OUT DEVERR-*_$SET ALT CHANNEL REQUEST BIT_^1_%LDA- DIAALT,I_^1_%STA- EDCLK,I_%SET CLOCK TIME OUT WORD_^1_%SET A_^1_%JMP* (MPDVCK)_^1_%SPC 5_^1*--------€€--------------------------------------------------------------_^1*_]_^1*_1ROUTINE TO CHECK FOR POSSIBLE COMPLETION IN_^1*_1OVERLAPPING SEEK OR SEEK STILL IN PENDING_^1*_]_^1*----------------------------------------------------------------------_^1*_]_^1*_]_^1_%SPC 2_^1*_1SEARCH IF REQUEST ON OTHER UNIT_^1*_1(1) OVERLAPPING SEEK COMPLETION SEARCH, OR_^1*_1(2) SEEK OPERATION IS STIL€€L IN PROGRESS._^1*_]_^1LTOFDR RTJ CLRDAS_'CLEAR DA INTERRUPT STATUS_,122*4185_^1_%RTJ USKNPG_'LOCATE UNIT WITH SEEK-IN-PROGRESS_#122*4185_^1_%SAN LTO010_'SENSE SEEKS-IN-PROGRESS_.122*4185_^1_%JMP* TOXX_O122*4185_^1LTO010 RTJ CONCU_(CONNECT CU_;122*4185_^1_%ENA POLSED_'POLL SEEK END STATUS_1122*4185_^1_%RTJ POLCHK_M122*4185_^1_%AND SEKINP_'PASS ONLY SEEKS-IN-PROGRESS_*122*418€€5_^1_%SAZ NOSKED_'NO SEEK END STATUS_^1_%STA* (DONAD)_%SAVE SEEK END BIT(S)_^1_%ENQ ECRET5_'SET Q TO GO TO 'CHKPRI' IN 'XSMD'_#112*4229_^1_%ENA -1_+SET A FOR NON-INTERRUPT ENTRY TYPE_"112*4229_^1TOX_"JMP XSMD_O112*4229_^1NOSKED LDA SEKINP_'CHECK IF SEEK IN PROGRESS PENDING STILL_^1_%SAZ TOXX_)SKIP IF NO SEEKS IN PROGRESS_)112*4229_^1_%RTJ SKALND_'SET ALRAM + SEEK END INTERRU€àPT FOR SEEK FUN._^1*******--------------- 1 CARD DELETED ( WAS RTJ RLS5CU ' -----122*4185_^1TOXX_!ENQ ECRET4_'SET Q TO GO TO 'CHECK' IN 'XSMD'_$112*4229_^1_%JMP* TOX_P112*4229_^1*_83 CARDS DELETED_6112*4229_^1_%END_]_^__ àPSMD2DA CSY/ C81 P€1_%NAM SMD2DA_'DECK-ID C81 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$FOR AN SMD SYSTEM WITH 2 DA'S._^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*S3_]_^1*_$8._!SMD2DA_^1*_]_^1*_*THIS IS AN OPTIONAL MODULE. IF WORD 52, DIAGSP, OF THE_^1*_*DEVICE PHYSICAL TABLE IS POSITIVE (BIT 15 = 0), IT D€€EFINES A_^1*_*SINGLE DA IN SYSTEM AND THIS ROUTINE IS NOT CALLED._^1*_*THREE FUNCTIONS ARE PERFORMED BY THIS ROUTINE, NAMELY GET_^1*_*DRIVE FROM OTHER DA , REQUEST CU FROM OTHER DA, AND SET UP_^1*_*ALTERNATE DA INTERRUPT IF THE OTHER CPU WANTS THE DRIVE._^1*_*ALL ARE SET UP TO BE INTERRUPT DRIVEN._^1*_]_^1****_]_^1*_]_^1*_,CPU WANTS DRIVE LOGIC_<122*4185_^1*_] 122*4185_^1*_'CPU 1 W€€ANTS DRIVE. DRIVE IS BUSY SEEKING OR SEEK END_!122*4185_^1*_'BIT SET (DATA XFER IN PROGRESS) FOR CPU 2. CPU 1 SETS 122*4185_^1*_'ALTERNATE CHANNEL REQUEST FOR THE DRIVE AND_+122*4185_^1*_'ALTERNATE DA INTERRUPT IS ENABLED._4122*4185_^1*_'CPU 2 CHECKS ALTERNATE CHANNEL REQUEST. IF SET, CPU 2 122*4185_^1*_'GENERATES ALTERNATE DA UNTERRUPT AND RELEASES CU._$122*4185_^1*_'CPU 1 RECIE€€VES ALTERNATE DA INTERRUPT. CPU 1 SEARCHES 122*4185_^1*_'FOR DRIVES IT WANTED AND CONNECTS TO DRIVE._+122*4185_^1_%SPC 1_R122*4185_^1_%SPC 1_R122*4185_^1*_,CPU WANTS CU LOGIC_?122*4185_^1*_] 122*4185_^1*_'CPU 1 CALLS CONCU TO CONNECT TO CU,NO CONNECT OCCURS. 122*4185_^1*_'CPU 1 SETS SELECT CU INTERRUPT ENABLE. WHEN CPU 2_$122*4185_^1*_'RELEASES CU,CPU 1 WILL GENERATE AN INTERRU€€PT. CPU 1_"122*4185_^1*_'WILL DETERMINE IT IS CU SELECT INTERRUPT AND CONTINUE 122*4185_^1*_'EXECUTION WHERE IT LEFT OFF WHEN IT COULD NOT SELECT CU122*4185_^1_%SPC 2_^1*_]_^1*-----------_%E N T R Y_$N A M E S_^1*_]_^1_%ENT SMDGCU_'TO GET THE CU FROM THE OTHER DA._^1_%ENT SMDGDR_'TO GET THE DRIVE FROM THE OTHER DA._^1_%ENT SMDGD1_'ENTRY TO GET DRV W/O SET'G DIAG TIMER 122*4185€€_^1_%ENT SMDRDR_'TO RELEASE A DRIVE TO THE OTHER DA._^1_%ENT ALTDAI_'TO SET ALTTERNATE DA INTERRUPT_'122*4185_^1_%SPC 2_^1*-----------_%E X T E R N A L S_^1_%EXT XSMD_)SEEK/TRANSFER OPERATION_^1_%EXT CLRDAS_'CLEAR DA INTERRUPT STATUS_^1_%EXT CLRINT_'I/O ERROR PROCESSING_^1_%EXT CUCNST_'CU CONNECTED STATUS CHECK_^1_%EXT DASTAT_'GET DA STATUS_^1_%EXT POLCHK_'POLL STATUS_^1_%€€EXT CONCU_(CONNECT CU_;122*4185_^1_%EXT LTOFDR_'TO CHECK OTHER DRIVES_0122*4185_^1*_1DATA FLAG_^1_%EXT SELFLG_'WAITING FOR CU SELECT FLAG WORD_^1_%EXT WANTDR_'BIT WORD FOR WANT DRIVE_.122*4185_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO(€€$12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU PLU(3)_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ/WRITE REQUEST CALLING SEQUENCE_^1_%EQU €€AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"€€MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU DGBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ER€€ROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$SEEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTE€€CT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/3€€3 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE€€_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LOWER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU E€€CHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDER ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR A€€ND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CO€€NTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU €€WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($03)_!CLEAR CU STATUS (CU AND DRIVE STATUS 1)._^1_%EQU WACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND€€ INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%€€SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION€€ RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECRET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' €€OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST€€ PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH (IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED€€ WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTE€€R THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF DMA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_€€%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STAT€€US_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLAG_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQU€€EST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU ECALL1(45)_"**********_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU ECALL3(47)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(48)_"**********_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR€€ 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.) FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU €€ DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROBE(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WO€€RD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU RTNCCU(67)_"RETURN FROM CONCU_4122*4185_^1_%EJT_]_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1GET DRIVE FROM OTHER DA_^1*_]_^1SMDGDR EQU SMDGDR(*)_^1_%LDA- DIAALT,I_K122*4185_^1_%STA- EDCLK,I_L122*4185_^1SMDGD1 EQU SMDGD1(*)_#ENTRY TO AVOID SETTING DIA€€G. TIMER_"122*4185_^1_%ENA WAISED_^1_%LDQ- EWES,I_'GET EQUIPMENT CODE_^1_%INQ DRCO08_'SET FOR DIRECTOR FUNCTION_^1_%OUT REJECT-*_$SELECT SEEK END INT_^1_%ENA WAIALM_^1_%OUT REJECT-*_$SELECT ALARM INTERRUPT_^1_%ENA WAIALT_^1_%OUT REJECT-*_$SELECT ALTERNATE DA INTERRUPT_^1*******------------ 2 CARDS DELETED (WERE ENA WARLCU,OUT REJEC 122*4185_^1_%JMP LTOFDR_'GO TO CHECK OTHE€€R DRIVES_-122*4185_^1_%EJT_]_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_1GET CU FROM OTHER DA_^1*_]_^1*_*Q MUST BE WES + 8._^1*_*RETURN IS TO CALL+1 IF ALARM, CALL+2 IF SELECTED ,_^1*_*OR TO THE DISPATCHER IF NOT CONNECTED AND NO ERROR._^1*_]_^1SMDGCU ADC *-*_^1_%LDA- I_^1_%STA SELFLG_'SET WAITING FOR CU SELECT_^1ASELFG EQU ASELF€€G(*-1)_^1_%LDA CONCU_N122*4185_^1_%STA- RTNCCU,I_$SAVE RETURN FROM CONCU_/122*4185_^1_%RTJ CLRDAS_'CLEAR INTERRUPTS TO INSURE ONLY CU_"122*4185_^1*_9SELECT INTERRUPT._3122*4185_^1_%LDA- DIAWCU,I_$SET DIAGNOSTIC TIME COUNT FOR CU SELECT WAIT_^1_%STA- EDCLK,I_%SET DIAGNOSTIC TIMEOUT_^1_%ENA WAISEL_^1_%OUT REJECT-*_$SELECT SELECT INTERRUPT_^1_%ENA WAIALM_^1_%OUT REJECT-*_$SELECT€€ ALARM INTERRUPT_^1*_$MAKE SURE CU WASN'T SELECTED WHILE SELECTING INTERRUPT_^1_%RTJ CUCNST_'CHECK FOR CONNECTED AND ALARM ERRORS._^1*_]_^1*_8COMES HERE IF ALARM IS SET._^1_%JMP* ALARM_^1*_]_^1*_8COMES HERE IF NOT SELECTED_^1_%JMP- (ADISP)_^1*_]_^1*_8COMES HERE IF SELECTED_^1_%RAO* SMDGCU_^1ALARM EQU ALARM(*)_^1*_8THERE IS ALARM OR WE ARE CONNECTED, SO_^1*_9CLEAR SELECT WAITING €€FLAG_^1_%CLR A_^1_%STA* (ASELFG)_^1*_9RESET THE TIMEOUT COUNT_^1_%SET A_^1_%STA- EDCLK,I_^1*_9CLEAR THE SELECTED INTERRUPTS_^1_%RTJ CLRDAS_^1*_9RETURN_^1_%JMP* (SMDGCU)_^1_%EJT_]_^1*_]_^1*---------------------------------------------------------------------_^1*_]_^1*_*SET UP ALTERNATE DA INTERRUPT IF THE OTHERE DA NEEDS DRIVE._^1*_]_^1*_]_^1SMDRDR ADC *-*_^1_%ENA POLALC_'POLL €€FOR ALTERNATE CHANNEL REQUESTS_^1_%RTJ POLCHK_^1_%LDQ- LOGDRV,I_^1_%AND- ONEBIT,Q_^1_%SAZ ALDA20_'SKIP IF ALT DA DOES NOT WANT DRIVE_^1_%LDQ- EWES,I_^1_%INQ DRCO08_'SET DIRECTOR FOR INTERRUPT ALTERNATE DA_^1_%LDA- WAFREL_'($200 = INTERRUPT ALTERNATE DA)_^1_%OUT REJECT-*_$GENERATE ALT DA INTERRUPT_^1*_8SET A AS INDICATOR OF NEED TO RELEASE THE CU_^1ALDA20 SET A_^1*_8RETURN_^1_%€€JMP* (SMDRDR)_^1_%SPC 4_^1*_1I/O ERROR (INTERNAL/EXTERNAL REJECT)_^1REJECT JMP* REJCT1_'INTERNAL REJECT_^1_%ENA ERR06_(EXTERNAL REJECT ERROR_^1_%JMP* TOER_^1REJCT1 ENA ERR05_(INTERNAL REJECT ERROR_^1TOER_!JMP CLRINT_'TO ERROR ENTRY_^1_%SPC 2_R122*4185_^1*_] 122*4185_^1*------------------------------------------------------------- 122*4185_^1*_] 122*4185_^1*_(ENABLE ALTERNA€pTE DA INTERRUPT IF REQUIRED_,122*4185_^1*_] 122*4185_^1ALTDAI NUM 0_R122*4185_^1_%LDQ- EWES,I_M122*4185_^1_%INQ DRCO08_M122*4185_^1_%LDA WANTDR_M122*4185_^1_%SAZ ALT010_'SENSE NO DRIVES WANTED_/122*4185_^1_%ENA WAIALT_M122*4185_^1_%OUT 1_,SELECT ALT. DA INTERRUPT_-122*4185_^1*_9TIMEOUT TO REPORT ERROR.)_+122*4185_^1ALT010 JMP* (ALTDAI)_K122*4185_^1_%END_]_^__ pPDILUSS CSY/ C82 P€1_%NAM DILUSS_'DECK-ID C82 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$GET AND SAVE STATUS FOR DIAGNOSTIC_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1****_]_^1*S3_]_^1*_$12. DILUSS_^1*_]_^1*_*THIS MODULE COMPOSES OF 2 ROUTINES, THEY ARC :_^1*_*(1) INITIALIZE DIAGNOSTIC STATUS WORD BUFFER IF DIAGNOSTIC_^1*_.IS€€ DEFINED. BUFFER IS SET TO $FFFF. I-REGISTER IS SET_^1*_.TO PHYSICAL DEVICE TABLE ADDRESS AT ENTRY AND EXIT._^1*_.A AND Q REGISTERS ARE IGNORED AND NOT SAVED._^1*_.THE DIAGNOSTIC STATUS WORD BUFFER IS A OPTIONAL BUFFER_^1*_.AND IS PLACED AFTER THE LAST WORD(I.E. 'OTHER')_^1*_.OF THE PHYSICAL DEVICE TABLE. THIS BUFFER MUST BE_^1*_.REQUESTED AS AN OPTIONAL ITEM DURING ORDERING A S€€YSTEMS._^1*_]_^1*_*(2) THIS ROUTINE IS UESED TO TAKE A SNAPSHOT OF ALL_^1*_.AVAILABLE STATUS WORDS AT INTERRUPT ENTRY FOR DIAGNOSTIC_^1*_.USAGE. ONE MUST KEEP IN MIND THAT NOT ALL STATUS WORDS_^1*_.ARE POSSIBLE TO OBTAIN. MOST OF THE STATUS WORDSCAN_^1*_.BE READ ONLY IF THE DA,CU/33 AND THE DRIVE ARE CONNECTED_^1*_.AT INTERRUPT ENTRY. THERE ARE FOUR INTERRUPT_^1*_.ENTRY TYPES, T€€HEY ARE (1) SEEK END, (2) END OF CYLINDER/_^1*_.DATA TRANSFER COMPLETED, (3) ALTERNATE DA INTERRUPT,_^1*_.AND (4) FORCE INTERRUPT. ONLY CASE 2 HAS THE DRIVE,_^1*_.CU/33 AND THE DA CONNECTION AT ENTRY._^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1*S4_]_^1*_$THE DIAGNOSTIC STATUS WORDS LAY OUT ARE SHOWN IN THE FOLLOWING_^1*_]_^1*_$WORD 00 INTERRUPT TYPE FLAG (2=SEEK END, 1=DATA TRANSFER,_^1*_.3€€=ALARM, AND 4=FORCE INTERRUPT)_^1*_*01 PHYSICAL UNIT_^1*_*02 $FFFF_^1*_*03 SELECT ACKNOWLEDGE_^1*_*04 $FFFF_^1*_*05 CYLINDER ADDRESS STATUS_^1*_*06 CURRENT SECTOR STATUS_^1*_*07 SECTOR AND HEAD STATUS_^1*_*08 DA STATUS_^1*_*09 DRIVE STATUS 2_^1*_*10 ECC PATTERN_^1*_*11 ECC CONDITION STATUS_^1*_*12 DRIVE FAULT STATUS_^1*_*13 CU STATUS_^1*_*14 DRIVE STATUS 1_^1*_*15 $F€€FFF_^1*_*16 FILE 00_^1*_*17 FILE 01_^1*_*18 FILE 02_^1*_*19 FILE 03_^1*_*20 FILE 04_^1*_*21 FILE 05_^1*_*22 FILE 06_^1*_*23 FILE 07_^1*_*24 FILE 08_^1*_*25 FILE 09_^1*_*26 FILE 10_^1*_*27 FILE 11_^1*_*28 FILE 12_^1*_*29 FILE 13_^1*_*30 FILE 14_^1*_*31 FILE 15_^1*_*32 POLL STATUS ALTERNATE CHANNEL REQUESTS (DRIVES 0-7)_^1*_*33 POLL STATUS SOURCE USAGE_.(DRIVES 0-7)€€_^1*_*34 POLL STATUS SEEK END CONDITION_((DRIVES 0-7)_^1*_*35 POLL STATUS PENDING SEEK END_*(DRIVES 0-7)_^1*_*36 POLL STATUS ALTERNATE CHANNEL REQUESTS (DRIVES 8-F)_^1*_*37 POLL STATUS SORUCE USAGE_.(DRIVES 8-F)_^1*_*38 POLL STATUS SEEK END CONDITION_((DRIVES 8-F)_^1*_*39 POLL STATUS PENDING SEEK END_*(DRIVES 8-F)_^1*_]_^1_%SPC 2_^1****_]_^1*_]_^1*_,---_#ENTRY POINTS_^1*_]_€€^1*_]_^1_%ENT FFILBF_'INITIALIZE DIAGNOSTIC BUFFER_^1_%ENT FILSMD_^1_%SPC 2_^1*_]_^1*_]_^1*_,---_#EXTERNALS_^1*_]_^1*_]_^1_%EXT CONCU_(CONNECT CU_^1_%EXT CLRINT_'TO ERROR PROCESSING_^1_%EXT POLCHK_^1*_1DATA FLAG_^1_%EXT WANTDR_'WANT DRIVE_^1****_]_^1_%SPC 2_^1*_]_^1*------------_$E Q U I V A L E N C E_$T A B L E_^1*_]_^1_%SPC 2_^1*_1BIT MASK DATA_^1_%SPC 1_^1_%EQU ZERO($€€22)_^1_%EQU LPMSK(2)_^1_%EQU MASK9($45)_^1_%EQU NZERO($12)_"$FFFF_^1_%EQU ONEBIT($23)_!$0001_^1_%EQU FIXBIT($28)_!$0020_^1_%EQU ZROBIT($33)_!$FFFE_^1_%EQU BITMSK($22)_^1_%EQU ZMSK($12)_#ZERO BIT MASK_^1_%SPC 1_^1*_1MSOS DATA_^1_%SPC 1_^1_%EQU WDSECM(5)_$MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_$LSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU LENPAR(7)_#LENGTH OF READ€€/WRITE REQUEST CALLING SEQUENCE_^1_%EQU CALPA8(8)_#WORD 9 OF REQUEST SEQUEST_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%EQU MOTCOD(14)_"MOTION REQU€€EST CODE_^1_%SPC 2_^1*_1STORAGE CAPACITY DEFINITION_^1_%SPC 1_^1_%EQU MXWDSR(96)_"MAX. NO. OF WORDS PER SECTOR_^1_%EQU MXTKCY(5)_#MAX. NO. OF TRACKS PER CYLINDER_^1_%EQU MXSRTK(64)_"MAX. NO. OF SECTORS PER TRACK_^1_%EQU WDPRCY(MXWDSR*MXSRTK*MXTKCY)_!MAX. WORDS/CYLINDER_^1_%EQU WDPRTK(MXWDSR*MXSRTK)_)MAX. WORDS/TRACK_^1_%EQU PHBFSZ(96)_"'PHYTAB' DATA BUFFER SIZE_^1_%EQU D€€GBFSZ(40)_"DIAGNOSTIC STATUS WORDS BUFFER SIZE IF APPLIED_^1_%SPC 1_^1_%SPC 1_^1*_1ERROR CODES_^1_%EQU IOHGER(0)_#I/O HANG UP ERROR_^1_%EQU LTDACD(1)_#LOST DATA ERROR CODE_^1_%EQU ALMECD(2)_#ALARM ERROR CODE_^1_%EQU STPACD(3)_#STORAGE PARITY_^1_%EQU ERR05(5)_$INTERNAL REJECT CODE_^1_%EQU ERR06(6)_$EXTERNAL REJECT CODE_^1_%EQU ERR14(14)_#UNIT NOT READY_^1_%EQU SERR(17)_$S€€EEK ERROR CODE_^1_%EQU ADFLCD(18)_"ADDRESS FIELD ERROR CODE_^1_%EQU PTFTCD(19)_"PROTECT FAULT_^1_%EQU REQNOG(41)_"UNSUCCESSFUL REQUEST CODE_^1_%EQU GUARD(44)_#GUARDED ADDRESS (PROTECT SWITCH SET)_^1_%EQU CONER(70)_#CONNECT ERROR CODE_^1_%EQU UNCECC(71)_"UNCORRECTABLE ECC ERROR CODE_^1_%EQU GIERCD(72)_"GHOST INTERRUPT ERROR CODE_^1_%EQU FORECD(73)_"FORCE RELEASE ERROR CODE_^€€1_%EQU LENERR(74)_"LENGTH GREATER THAN REQUEST (SPLITE XFER)_^1_%EQU CUERCD(82)_"CU/33 ERROR_^1_%EQU NEXACD(83)_"MEMORY ERROR (DA ADD. NONEXTENT ADD.)_^1_%EJT_]_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(OUTPUT_$Q-REG.)_^1*_]_^1_%EQU DRCO00(0)_#BUFFER LENGTH_^1_%EQU DRCO01(1)_#DRIVE REQUEST CODE_^1_%EQU DRCO02(2)_#INITIATE POLL CODE_^1_%EQU DRCO03(3)_#UNIT SELECT CODE_^1€€_%EQU DRCO04(4)_#DRIVE ECHO OUTPUT CODE_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS CODE_^1_%EQU DRCO06(6)_#FORMAT WRITE CODE_^1_%EQU DRCO07(7)_#SECTOR AND HEAD CODE_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO09(9)_#READ CODE_^1_%EQU DRCO10(10)_"WRITE CODE_^1_%EQU DRCO11(11)_"ECC CONTROL CODE_^1_%EQU DRCO12(12)_"READ RECOVERY CONTROL CODE_^1_%EQU DRCO13(13)_"SET FWA LO€€WER CODE_^1_%EQU DRCO14(14)_"SET FWA UPPER FILE ADDRESS CODE_^1_%EQU DRCO15(15)_"CU ECHO OUTPUT CODE_^1*----_]_^1*_1DIRECTOR FUNCTION CODES_^1*_3(INPUT_$Q-REG.)_^1*_]_^1_%EQU DRCI00(0)_#DA FILE DATA_^1_%EQU DRCI01(1)_#PHYSICAL UNIT NO._^1_%EQU DRCI02(2)_#POLL STATUS_^1_%EQU DRCI03(3)_#SELECT ACKNOWLEDGE STATUS_^1_%EQU DRCI04(4)_#DRIVE ECHO INPUT_^1_%EQU DRCI05(5)_#CYLINDE€€R ADDRESS STATUS_^1_%EQU DRCI06(6)_#CURRENT SECTOR STATUS_^1_%EQU DRCI07(7)_#SECTOR AND HEAD STATUS_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2_^1_%EQU DRCI10(10)_"ECC PATTERN_^1_%EQU DRCI11(11)_"ECC CONDITION STATUS_^1_%EQU DRCI12(12)_"DRIVE FAULT STATUS_^1_%EQU DRCI13(13)_"CU STATUS_^1_%EQU DRCI14(14)_"DRIVE STATUS 1_^1_%EQU DRCI15(15)_"CU ECHO INPUT_€€^1_%SPC 2_^1*_]_^1*_1OUTPUT OPERATION FUNCTION CODE DEFINITION_^1*_3THESE CODES ARE CONTAINED IN A-REGISTER_^1*_]_^1_%SPC 1_^1*_1Q-REGISTER = 1_^1_%EQU WARQIN($10)_!INITIATE DRIVE REQUEST_^1_%EQU WACRSN($20)_!CLEAR SEEK END_^1*_1Q-REGISTER = 8_^1_%EQU WACRAI($02)_!CLEAR ALL INTERRUPTS_^1_%EQU WAISEL($24)_!SELECT CU INTERRUPT_^1_%EQU WAIXFR($28)_!TRANSFER COMPLETE INTERRUPT_^€€1_%EQU WAIALM($2C)_!ALARM INTERRUPT_^1_%EQU WAISED($30)_!SEEK END INTERRUPT_^1_%EQU WAIECL($34)_!SELECT END OF CYLINDER INTERRUPT_^1_%EQU WAIALT($38)_!ALTERNATE DA INTERRUPT_^1_%EQU WARLCU($40)_!RELEASE CU_^1*_1SPECIAL --- USE LOW CORD CONTENT VALUE_^1_%EQU WAFREL($2C)_!FORCE ALTERNATE CHANNEL RELEASE($200)_^1*_1Q-REGISTER = 12_^1_%EQU WACUST($01)_!CLEAR CU STATUS_^1_%EQU W€€ACLRI($02)_!CLEAR INTERRUPT_^1_%EQU WACDAI($03)_!CLEAR DA AND INTERRUPT_^1_%EQU WACRSW($73)_!CLEAR STATUS OF CU/DRIVE/FAULT/ATTENTION_^1_%EQU WACLRZ($F3)_!CLEAR CU/DRIVE/FAULT STATUS, RTZ SEEK + ATTN._^1_%SPC 2_^1*_1POLL STATUS FUNCTION CODES_^1_%EQU POLALC($00)_!POLL ALTERNATE CHANNEL REQUEST STATUS_^1_%EQU POLSUR($10)_!POLL SOURCE USAGE STATUS_^1_%EQU POLSED($20)_!POLL €€SEEK END CODE_^1_%EQU POLSIP($30)_!POLL SEEK IN PROGRESS_^1_%SPC 2_^1*_1DRUM SIMULATION RETURN ADDRESS INDEXES_^1_%EQU RETRN0(0)_#INITIAL ENTRY TO 'LIKDUM'_^1_%EQU RETRN1(1)_#READ/WRITE OPERATION RETURN FLAG TO 'DONE'_^1_%EQU RETRN2(2)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM1'_^1_%EQU RETRN3(3)_#UNFORMATTED READ, RETURN FLAG TO 'LKDUM5'_^1_%EQU RETRN4(4)_#UNFORMATTED READ, €€RETURN FLAG TO 'LKDUM6'_^1_%SPC 2_^1*_1ECC ERROR CORRECTION RETURN POINTERS_^1*_1ALSO THEY ARE THE POINTERS FOR ROUTINE 'XSMD'_^1_%EQU ECRETN(-1)_"RETURN TO 'ALMERR' WITH ERROR_^1_%EQU ECRET0(0)_#RETURN TO 'TCOM'_^1_%EQU ECRET1(1)_#RETURN TO 'SPLITT'_^1_%EQU ECRET2(2)_#RETURN TO 'DATA'_^1_%EQU ECRET3(3)_#RETURN TO 'DATA8'_^1_%EQU ECRET4(4)_#RETURN TO 'CHECK'_^1_%EQU ECR€€ET5(5)_#TO 'CHKPRI' OF 'XSMD'_^1_%EQU ECRET6(6)_#TO 'SEEKOP' OF 'XSMD'_^1_%EQU ECRET7(7)_#TO SEEK ERROR COUNT UPDATE ('XSMD')_^1_%EJT_]_^1*-----------------------------------------------------------------_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1*-----------------------------------------------------------------_^1_%SPC 3_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU €€ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%CONVERTOR, EQUIPMENT, STATION_^1_%EQU EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH €€(IF MASS MEMORY RESIDENT)_^1_%EQU MASSEC(14)_"NAME ASSOCIATED WITH SECTOR NO. (MASS RESIDE.)_^1_%EQU RETURN(15)_"SECTOR NUMBER OR FNR RETURN_^1_%EQU FLTCOD(16)_"KERNEL FAULT CODE IF AN ERROR OCCURS_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"GHOST INTERRUPTS COUNTS_^1_%EQU MICROI(19)_"MICRO-INTERRUPT NUMBER, IF ANY, FOR DEVICE_^1_%EQU TIMOUT(20)_"TIME IN €€SECONDS FOR INTERRUPT WAITING_^1_%EQU SENTRY(21)_"STATUS AFTER THE INITIAL ENTRY INTO THE KERNEL_^1_%EQU SINTER(22)_"STATUS AFTER THE DEVICE HAS INTERRUPTED_^1_%EQU STIMEO(23)_"STATUS AFTER THE DEVICE'S INTERRUPT TIME OUT_^1_%EQU CYLADR(24)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU TRASEC(25)_"TRACK AND SECTOR FORMATTED_^1_%EQU MSB256(26)_"UPPER FIELD OF ADDRESS (BITS 17-16 OF D€€MA)_^1_%EQU TEMCYL(27)_"TEMP CYLINDER FOR WORD ADDRESSING_^1_%EQU TEMSEC(28)_"USED BY WORD ADDRESS PORTION (TRACK/SECTOR)_^1_%EQU TEMFWD(29)_"USED BY WORD ADRESS PORTION - (FWA)_^1_%EQU TEMLWD(30)_"USED BY WORD ADDRESS PORTION (LWA)_^1_%EQU WORDNO(31)_"USED BY WORD ADDRESS PORTION (WORD IN SECTOR)_^1_%EQU CUSTAT(32)_"LAST VALUE OF CU STATUS_^1_%EQU DSTAT1(33)_"LAST VALUE OF €€DRIVE 1 STATUS_^1_%EQU DSTAT2(34)_"LAST VALUE OF DRIVE 2 STATUS_^1_%EQU FDATAF(35)_"DATA TRANSFER FUNCTION CODE_^1_%EQU FUNCT(36)_#LAST DATA TRANSFER FUNCTION_^1_%EQU EXTRA(37)_#RETURN ADDRESS FOR DATA TRANSFER_^1_%EQU FCONN(38)_#DA NUMBER_^1_%EQU LOGDRV(39)_"LOGICAL DRIVE NUMBER OF DISK_^1_%EQU SEKERR(40)_"COUNTER FOR SEEK ERRORS_^1_%EQU RTZFLG(41)_"RETURN SEEK TO ZERO FLA€€G_^1_%EQU ERCONT(42)_"ERROR COUNTER_^1_%EQU PRILVL(43)_"REQUEST PRIORITY_^1_%EQU TEMREQ(44)_"REQUEST CODE_^1_%EQU DUMMYE(49)_"NOT USED_^1_%EQU ECALL2(46)_"* RESERVED FOR_^1_%EQU DFLTST(51)_"LAST VALUE OF DRIVE FAULT STATUS._^1_%EQU ECALL4(48)_"**********_^1_%EQU OFFSET(49)_"INCREMENT VALUE FOR OFFSET RECOVERY_^1_%EQU TABIND(50)_"INDEX THRU OFFSET JUMP TABLE_^1_%EQU OFFVA€€L(51)_"CURRENT OFFSET VALUE_^1_%EQU DIAGSP(52)_"SPECIAL WORD FOR DIAGNOSTIC (BIT15=1 FOR 2 DA)_^1_%EQU DIAECC(53)_"ECC RECOVERY FLAG (1 = DO RECOVERY)_^1_%EQU DIASEK(54)_"MAX. ERROR RETRIALS FOR SEEK OPERATION_^1_%EQU DIADAT(55)_"MAX. ERROR RETRIALS FOR DATA TRANSFER_^1_%EQU DIAMCN(56)_"MAX. ERROR RETRIALS FOR CU/DRIVE CONNECTION_^1_%EQU DIACON(57)_"MAX. TIME COUNT (LOOP NO.)€€ FOR CU CONNECTION_^1_%EQU DIAXFR(58)_"DIAGNOSTIC TIMER VALUE FOR DATA TRANSFER_^1_%EQU DIAWCU(59)_"DIAGNOSTIC TIMER VALUE FOR WAITING CU_^1_%EQU DIAALT(60)_"DIAGNOSTIC TIMER VALUE FOR WAITING ALT CHANNEL_^1_%EQU DIASKT(61)_"DIAGNOSTIC TIMER VALUE FOR SEEK OPERATION_^1_%EQU FORCNT(62)_"FORCE RELEASE COUNTS_^1_%EQU CPVLOC(63)_"TIME SHARE CONTROL POINT (CP) VALUE_^1_%EQU STROB€€E(64)_"EARLY/LATE STROBE + OFF SET TIMING-DIAGNOSTIC_^1_%EQU ABUFF(65)_#ADDRESS OF 96 WORD BUFFER FOR READ/WRITE_^1_%EQU OTHER(66)_#LINK FOR MULTIPLE PHYSTBS_^1_%SPC 3_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1_%SPC 5_^1*_]_^1*_1ROUTINE 1_^1*_]_^1*_]_^1*_,---_#INITIALIZED DIAGNOSTIC WORD BUFFER_^1*_]_^1*_4AT ENTRY : I-REGISTER = PHYTAB ADD._^1*_]_^1*€€_7EXIT : I-REGISTER = SAME AS ENTRY._^1*_]_^1*_]_^1_%SPC 2_^1FFILBF NOP 0_,BUFFER INITIALIZATION ENTRY_^1_%LDA- DIAGLU,I_$CHECK IF DIAGNOSTIC UNIT_^1_%SUB- ELU,I_^1_%SAN F20_*NO, SKIP_^1_%ENQ DGBFSZ_'SET BUFFER SIZE AS INDEX_^1_%SET A_,SET BUFFER WITH $FFFF_^1F10_"STA- OTHER,B_^1_%INQ -1_+DECREMENT INDEX BY 1 AND CHECK IF DONE_^1_%SQZ F20_*DONE, SKIP_^1_%JMP* F10_*NO, REPEA€€T_^1F20_"JMP* (FFILBF)_$RETURN TO CALLER_^1_%SPC 5_^1*_]_^1*_1ROUTINE 2_^1*_]_^1*_]_^1*_,---_#MOVE STATUS WORDS FROM 'PHYTAB' BUFFER TO THE_^1*_4DIAGNOSTIC BUFFER AND READ IN THE REST OF THE_^1*_4DISK SYSTEM STATUS WORDS IF CU IS CONNECTED_^1*_]_^1_%SPC 2_^1*_4ROUTINE IS CALLED AT INTERRUPT ENTRY (CONTINUATOR)_^1*_]_^1*_4I-REGISTER = 'PHYTAB' ADDRESS AT ENTRY + EXIT_^1*_4Q-REGIS€€TER = INTERRUPT TYPE AT ENTRY_^1*_4A-REGISTER = DA STATUS AT ENTRY AND EXIT_^1*_]_^1*_]_^1FILSMD NOP 0_,ENTRY_^1_%STA* TMPDA_(SAVE DA STATUS_^1_%LDA- ELU,I_(CHECK IF DIAGNOSTIC LU_^1_%SUB- DIAGLU,I_^1_%SAN FILC30_'TO EXIT_^1FILC10 STQ- OTHER+1,I_#SAVE INTERRUPT TYPE_^1_%LDA* TMPDA_(RECALL DA STATUS_^1_%STA- OTHER+9,I_^1_%ALS 13_+CHECK IF CU SELECTED_^1_%SAP FILC30_'NO, CU IS NO€€T CONNECTED. GO_^1_%INQ -3_+CHECK FOR INTERRUPT TYPE_^1_%SQM FILC40_'SKIP ON SEEK END OR DATA XFER COMPLETED_^1_%SQN FILC30_'SKIP ON FORCE RELEASE_^1_%LDA WANTDR_'FOR ALTERNATE DA INTERRUPT, MAKE SURE NEED DR._^1_%LDQ- LOGDRV,I_^1_%AND- ONEBIT,Q_^1_%SAN FILC40_'YES, GO GET STATUS WORDS_^1FILC30 JMP* FIL50_(TO EXIT_^1*_]_^1FILC40 RTJ CONCU_(TO CONNECT CU_^1_%SPC 2_^1*_1READ €€SELECT ACKNOWLEDGE STATUS (CODE 3)_^1_%SPC 1_^1_%LDQ- EWES,I_^1_%INQ DRCI03_^1_%INP REJECT-*_^1_%STA- OTHER+4,I_^1_%SPC 2_^1*_1PHYSICAL UNIT NUMBER (CODE 1)_^1_%INQ DRCI01-DRCI03_^1_%INP REJECT-*_^1_%STA- OTHER+2,I_^1_%SPC 2_^1*_]_^1*_1SET UP TO GET CODES 5-14 DATA EXCEPT CODE 8 (DA)_^1*_]_^1_%ENA DRCI05_'INITIALIZED STARTING CODE_^1_%STA* CPU_^1REPGET LDQ* CPU_^1_%TRQ A_^€€1_%INA -DRCI08_%CHECK FOR CODE 8 (DA STATUS)_^1_%SAZ LOP10_(SKIP ON CODE 8_^1_%ADQ- EWES,I_'ADD EQUIPMENT CODE TO FUNCTION_^1_%INP REJECT-*_^1_%LDQ* CPU_*SET INDEX_^1_%STA- OTHER+1,B_#SAVE STATUS ACCORDING TO CODE_^1_%INQ -DRCI14_%CHECK IF LAST ONE_^1_%SQZ FIL00_(YES, SKIP_^1LOP10 RAO* CPU_*BUMP TO NEXT ONE_^1_%JMP* REPGET_'TO GET NEXT STATUS WORD_^1_%SPC 2_^1*_]_^1*_1READ I€€N ALL 16 FILE STATUS (CODE 0)_^1*_]_^1FIL00 STQ* CONTER_^1FIL10 LDA* CONTER_'SETUP FILE NO. TO BE READ_^1_%ALS 8_^1_%LDQ- EWES,I_'SET EQUIPMENT CODE_^1_%INQ DRCO14_^1_%OUT REJECT-*_^1_%INQ DRCI00-DRCO14 SET READ FILE CODE_^1_%INP REJECT-*_$READ THE PROPER FILE DATA_^1_%LDQ* CONTER_'SET UP INDEX BY FILE DATA TO BE STORED BY_^1_%STA- OTHER+17,B_*FILE NO._^1_%RAO* CONTER_'BUMP €€FILE NO. COUNT BY 1_^1_%LDA* CONTER_^1_%INA -16_*CHECK IF ALL 16 FILES BEED READ_^1_%SAZ FIL20_(YES, SKIP_^1_%JMP* FIL10_(NO, REPEAT TO NEXT FILE_^1CONTER EQU CONTER(FFILBF)_^1_%SPC 2_^1*_1POLL STATUS (CODE 2)_^1FIL20 STA* CPU_*ZERO OUT CPU FLAG AND POLL TYPE_^1_%STA* CONTER_^1FIL30 LDA* CONTER_'ASSEMBLE POLL DATA_^1_%ALS 1_^1_%ADD* CPU_^1_%ALS 3_^1_%RTJ POLCHK_'TO GET POL€€L STATUS_^1_%LDQ* CPU_*ASSEMBLE INDEX AND STORE_^1_%QLS 2_^1_%ADQ* CONTER_^1_%STA- OTHER+33,B_^1_%RAO* CONTER_'BUMP TYPE COUNT BY 1 AND CHECK IF ALL DONE_^1_%LDA* CONTER_^1_%INA -4_^1_%SAZ FIL40_(YES, SKIP_^1_%JMP* FIL30_(NO GO REPEAT_^1FIL40 STA* CONTER_^1_%RAO* CPU_*BUMP CPU_^1_%LDA* CPU_^1_%SAN FIL50_(SKIP DOWN_^1_%JMP* FIL30_(GO REPEAT_^1FIL50 LDA* TMPDA_(RESTORE DA STATU€<S IN A-REG._^1_%JMP* (FILSMD)_$RETURN TO CALLER_^1CPU_"NUM 0_^1TMPDA NUM 0_,DA STATUS SAVED (AT ENTRY)_^1_%SPC 2_^1*_]_^1*_1I/O ERROR_^1*_]_^1REJECT JMP* INTJEC_'TO INTERNAL REJECT_^1_%ENA ERR06_(EXTERNAL REJECT ERROR_^1_%JMP* TOERR_^1INTJEC ENA ERR05_(INTERNAL REJECT CODE_^1TOERR JMP CLRINT_^1_%END_]_^__ <PDMYCP CSY/ C83 P€1_%NAM DMYCP_(DECK-ID C83 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$DUMMY ROUTINES FOR NON-TIME SHARE_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1*_]_^1***_]_^1*E_]_^1*_*DMYCP_^1*_]_^1*_*THIS IS A DUMMY MODULE FOR NON-TIME SHARE SYSTEM. ALL THE_^1*_*ENTRY POINTS IN THIS ROUTINE ARE USED TO ALLOW THE SMD_^1*€€_*DRIVER EXECUTES NORMALLY ON A STANDARD MSOS SYSTEM. THUS_^1*_*ONE SMD DRIVER IS USED FOR ALL APPLICATIONS._^1*_]_^1*_*THIS MODULE IS SET UP WHEN SYSTEM IS ORDERED AS NON-TIME_^1*_*SHARE SYSTEM._^1*_]_^1*_]_^1****_!------_^1*_$ENTRY NAMES_^1*_$------_^1*_]_^1_%ENT SMDCPA_'LOGICAL TO PHYSICAL ADDRESS TRANSLATION_^1_%ENT SMDCPS_'CONTROL POINT CHECK/SET ROUTINE_^1_%ENT SMDCPG_'G€€ET THE CONTROL POINT FROM THE REQUEST_^1_%ENT SMDACP_'SET CONTROL POINT TO ABSOLUTE MODE_"122*4185_^1*_]_^1*_1EQUIVALENCES_^1*_]_^1ECCOR EQU ECCOR(10)_#ENTRY IN THE PHYSTAB OF THE FWA_^1*_]_^1****_]_^1*_]_^1*_]_^1*_$SMDCPA - LOGICAL TO PHYSICAL ADDRESS CONVERSION_^1*_]_^1SMDCPA ADC *-*_^1*_8Q IS THE MSB OF THE PHYSICAL ADDRESS_^1_%CLR Q_^1*_8A IS THE LSB OF THE PHYSICAL ADDRES€€S_^1_%LDA- ECCOR,I_^1*_8RETURN_^1_%JMP* (SMDCPA)_^1*_]_^1*_$SMDCPC - CONTROL POINT CHECK_^1*_]_^1SMDCPS ADC *-*_^1*_8DO NOTHING_^1_%JMP* (SMDCPS)_^1*_]_^1*_$SMDCPG - GET THE CONTROL POINT_^1*_]_^1*_1DOES NOTHING BECAUSE THE PHYSTAB IS ALREADY ZERO._^1SMDCPG EQU SMDCPG(SMDCPS)_^1*_] 122*4185_^1*_$SMDACP - SET CONTROL POINT TO ABSOLUTE MODE_-122*4185_^1*_'(DO NOTHING)_J122*4185_^1*€@_] 122*4185_^1SMDACP EQU SMDACP(SMDCPS)_E122*4185_^1_%END_]_^__@PSMD1DA CSY/ C84 P€1_%NAM SMD1DA_'DECK-ID C84 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$FOR A SINGLE DA SMD SYSTEM_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1****_]_^1*_*THIS MODULE REPLACES 'SMD2DA' WHEN THERE IS ONLY ONE DA._^1*_*IN INCLUDES THREE DUMMY MODULES THAT HANDLE THE FUNCTIONS_^1*_*OF A DUAL DA SYSTEM W€€HEN THERE IS ONLY ONE DA._^1*_]_^1*_]_^1*_*SMDGCU WILL RETURN WITH AN ERROR INDICATION._^1*_*SMDGDR WILL GO TO SYFAIL. THERE SHOULD BE NO NEED TO GET_^1*_1THE DRIVE WITH ONLY ONE DA._^1*_*SMDRDR WILL RETURN WITH THE A REGISTER ZERO IF THERE IS_^1*_1ONLY ONE DRIVE OR NON-ZERO IF THERE ARE MORE THAN 1._^1*_]_^1***_]_^1_%SPC 1_^1*_1E N T R Y_#N A M E_^1*_]_^1_%ENT SMDGCU_'TO GET THE€€ CU (ERROR)_^1_%ENT SMDGDR_'TO GET THE DRIVE (FATAL ERROR)_^1_%ENT SMDGD1_'ENTRY TO GET DRV W/O SET'G DIAG TIMER 122*4185_^1_%ENT SMDRDR_'TO RELEASE A DRIVE (DOES NOTHING)._^1_%ENT ALTDAI_'TO SET ALTERNATE DA INTERRUPT_(122*4185_^1_%SPC 2_^1*_1E X T E R N A L_^1*_]_^1_%EXT SYFAIL_'SYSTEM FAIL_^1*_]_^1*_8E Q U I V A L E N C E S_^1*_]_^1_%EQU DIAGSP(52)_"SPECIAL FLAG WORD IN T€€HE PHYSTAB._^1_%EQU ONEBIT($23)_!TABLE OF SINGLE BITS IN LOW CORE._^1*_]_^1****_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1*_]_^1*_(SMDGCU,ALTDAI_H122*4185_^1*_] 122*4185_^1ALTDAI EQU ALTDAI(*)_J122*4185_^1SMDGCU ADC *-*_^1*_8RETURN AT CALL+1 TO INDICATE ERROR_^1_%JMP* (SMDGCU)_^1*_]_^1*_$SMDGDR_^1*_]_^1SMDGDR EQU SMDGDR(*)_^1SMDGD1 EQU S€$MDGD1(*)_J122*4185_^1*_8THIS IS A SYSTEM FAILURE_^1_%RTJ SYFAIL_^1*_]_^1*_$SMDRDR_^1*_]_^1SMDRDR ADC *-*_^1*_8RETURN A ZERO IF THERE IS ONE DRIVE, ELSE_^1*_9RETURN A NON-ZERO NUMBER._^1_%LDA- DIAGSP,I_^1_%AND- ONEBIT+14_#MASK OUT MULTI-DRIVE BIT._^1*_8RETURN_^1_%JMP* (SMDRDR)_^1_%END_]_^__$PSMD1DR CSY/ C85 P€1_%NAM SMD1DR_'DECK-ID C85 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1*_*THIS MODULE IS USED TO REPLACE THE MODULE SMDNDR_^1*_*WHEN THERE IS ONLY ONE DRIVE IN THE SYSTEM._^1*_]_^1*_*LTOFDR WILL EXIT TO THE DISPATCHER BECAUSE THERE ARE NO_^1*_1OTHER DRIVES TO B€€E CHECKED._^1*_*MPDVCK WILL GO TO THE SYSTEM ERROR MODULE._^1*_*MPDRIV WILL GO TO THE SYSTEM ERROR MODULE._^1*_]_^1*_]_^1_%SPC 1_^1*_1E N T R Y_#N A M E S_^1*_]_^1_%ENT LTOFDR_'MULTI DRIVES CHECK ON EXIT_^1_%ENT MPDVCK_'DRIVE AVAILABLE CHECK FOR MULTI DRIVES_^1_%ENT MPDRIV_'CHECK FOR HIGHEST PRIORITY SEEK END DRIVE_^1_%SPC 1_^1*_1E X T E R N A L_^1*_]_^1_%EXT SYFAIL_'SYSTEM F€€AIL_^1_%EXT XSMD_)ENTRY TO XSMD MODULE_1122*4185_^1*_]_^1*_8E Q U I V A L E N C E S_^1*_]_^1ADISP EQU ADISP($EA)_"ENTRY POINT TO THE DISPATCHER_^1****_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1FAIL_!ADC SYFAIL_'ADDRESS OF THE SYSTEM FAILURE ROUTINE_^1_%SPC 2_^1*_1MULTI DRIVES EXIT CHECK_^1*_]_^1LTOFDR ENQ 4_,SET Q TO GO TO 'CHECK' IN XS€>MD MODULE 122*4185_^1_%JMP XSMD_O122*4185_^1*_9OTHER DRIVES TO CHECK FOR._^1_%SPC 2_^1*_1CHECK DRIVE AVAILABLE FOR MULTI DRIVES_^1MPDVCK NOP 0_,ENTRY_^1_%RTJ* (FAIL)_'TO SYSTEM FAIL_^1_%SPC 2_^1*_1SEARCH FOR SEEK END DRIVE WITH HIGHEST PRIORITY_^1MPDRIV NOP 0_,ENTRY_^1_%RTJ* (FAIL)_'TO SYSTEM FAIL_^1_%END_]_^__ >PSMDCP CSY/ C86 P€1_%NAM SMDCP_(DECK-ID C86 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_]_^1*_$THIS MODULE CONTAINS THE_!ROUTINES THAT ARE USED FOR A_^1*_$TIMESHARE SYSTEM. THE ROUTINES PROVIDE AN INTERFACE TO THE_^1*_$TIMESHARE CONTROL POINT SUBROUTINES. THIS MODULE IS REPLACED_^1*_$BY A MODULE CALLED 'DMYCP' FOR NON TIMESARE SYSTEMS._^1*_]_^1*_$THE THREE ROUTINES ARE:_^1*_]_^1*_). SMDCPA - GETS THE 18€€ BIT PHYSICAL ADDRESS FOR THE CURRENT_^1*_4TRANSFER_^1*_). SMDCPG - GETS THE CONTROL POINT OUT OF THE REQUEST AND_^1*_4PUTS IT INTO THE PHYSTAB._^1*_). SMDCPS - SETS THE CONTROL POINT IF NECCESSARY._^1*_).SMDACP - SET CONTROL POINT TO ABSOLUTE MODE_(122*4185_^1*_]_^1*_$THE ENTRY REQUIREMENTS FOR EACH ROUTINE IS GIVEN HERE. EACH_^1*_$ROUTINE EXPECTS THE I REGISTER TO BE POINTING TO €€THE PHYSTAB._^1*_$THE ROUTINES ALSO REQUIRE:_^1*_]_^1*_).SMDCPA - NOTHING_^1*_).SMDCPG - NOTHING_^1*_).SMDCPC - THE Q REGISTER SHOULD CONTAIN THE ADDRESS OF THE_^1*_3LAST WORD + 1 FOR THE CURRENT DATA TRANSFER._^1*_).SMDACP - NOTHING_C122*4185_^1*_]_^1*_$THE EXIT CONDITIONS ARE AS FOLLOWS:_^1*_]_^1*_).SMDCPA - Q WILL CONTAIN THE MSB BITS (17-16) OF THE_^1*_3PHYSICAL ADDRESS AND A W€€ILL CONTAIN THE LSBS._^1*_).SMDCPG - THE CONTROL POINT NUMBER WILL BE IN THE PHYSTAB._^1*_).SMDCPS - THE CONTROL POINT WILL HAVE BEEN SET FOR THE_^1*_3CURRENT REQUEST._^1*_).SMDACP - CONTROL POINT IS SET TO ABSOLUTE MODE_$122*4185_^1*_]_^1*_$ENTRY POINTS -_^1*_]_^1_%ENT SMDCPA_'PHYSICAL ADDRESS CONVERSION_^1_%ENT SMDCPG_'GETS THE CONTROL POINT OUT OF THE REQUEST_^1_%ENT SMDCPS_'€€SETS THE CONTROL POINT IF REQUIRED_^1_%ENT SMDACP_'SET CONTROL TO ABSOLUTE MODE_)122*4185_^1*_]_^1*_$EXTERNALS_^1*_]_^1_%EXT CCP_*CURRENT CONTROL POINT_^1_%EXT CPCHK_(CONTROL POINT CHECK_^1_%EXT CPADD_(CONTROL POINT ADDRESS CONVERSION_^1_%EXT CPSET_(CONTROL POINT SET_^1*_]_^1*_$EQUIVALENCES_^1*_]_^1_%EQU ASABS($BD)_"ENTRY TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU CPVALU(3)_#I€€NDEX TO THE CONTROL POINT NUMBER THAT_^1*_9FOLLOWS THE S PARAMETER AND MSB/LSB DATA._^1_%EQU CPVLOC(63)_"CONTROL POINT VALUE SAVE IN THE PHYSTAB._^1_%EQU ECCOR(10)_#FIRST WORD ADDRESS OF THE CURRENT TRANSFER_^1_%EQU ELSTWD(11)_"LAST WORD ADDRESS +1 OF THE CURRENT TRANSFER_^1_%EQU EPTR(6)_%PHYTAB ENTRY THAT POINTS AT THE REQUEST_^1_%EQU LPMSK(2)_^1_%EQU MSB(1)_'INDEX TO THE MS€€B WORD OF THE REQUEST_^1_%EQU TSCP(4)_%FOREGROUND COMPLETION PRIORITY IS >= THIS_^1_%EQU ZERO($22)_#LOW CORE LOCATION THAT CONTAINS A ZERO._^1_%EJT_]_^1*_]_^1*_*SMDCPA_^1*_]_^1SMDCPA ADC *-*_^1*_8PUT THE CONTROL POINT NUMBER INTO Q._^1_%LDQ- CPVLOC,I_^1*_8PUT THE FIRST WORD ADDRESS INTO A_^1_%LDA- ECCOR,I_^1*_8TRANSLATE FROM LOGICAL TO PHYSICAL ADDRESS_^1_%RTJ CPADD_^1*_8RETURN€€_^1_%JMP* (SMDCPA)_^1_%SPC 3_^1*_]_^1*_*SMDCPS_^1*_]_^1SMDCPS ADC *-*_^1*_8DECREMENT THE ADDRESS OF THE LAST WORD +1_^1*_9BY 1._^1_%INQ -1_^1*_8CHECK TO SEE IF THIS ADDRESS IS WITHIN A CP_^1_%RTJ CPCHK_^1*_8SKIP IF WITHIN A CONTROL POINT AREA_^1_%SQN INCPA_^1*_8EXIT IF NOT WITHIN CP AREA._^1_%JMP* (SMDCPS)_^1*_8CHECK TO SEE IF THE CP NEEDS TO BE CHANGED._^1INCPA LDA+ CCP_^1_%€€EOR- CPVLOC,I_^1*_8SKIP IF IT DOES NOT NEED TO BE CHANGED._^1_%SAZ NOSET_^1*_8SET THE CONTROL POINT_^1_%LDQ- CPVLOC,I_^1_%RTJ CPSET_^1ACPSET EQU ACPSET(*-1)_H122*4185_^1*_8RETURN_^1NOSET EQU NOSET(*)_^1_%JMP* (SMDCPS)_^1_%EJT_]_^1*_]_^1*_*SMDCPG_^1*_]_^1SMDCPG ADC *-*_^1*_8IF THE MSB OF THE MSB WORD IS SET THEN THE_^1*_9REQUEST HAS A CONTROL POINT_^1_%LDQ- EPTR,I_^1_%RTJ- (AS€€ABS)_^1_%TRA Q_^1_%LDA- MSB,Q_^1_%SAP BAKGND_'SENSE REQUEST HAS NO CONTROL PT. NO. 116*4365_^1_%LDA- CPVALU,Q_^1*_8SAVE THE CP NUMBER AND EXIT_^1_%JMP* SAVECP_^1*_8FOR A BACKGROUND REQUEST THE CP IS ZERO_^1BAKGND CLR A_^1*_8SAVE THE CONTROL POINT IN THE PHYTAB_^1SAVECP STA- CPVLOC,I_^1*_8RETURN_^1_%JMP* (SMDCPG)_^1*_] 122*4185_^1*_$SMDACP - SET CONTROL POINT TO ABSOLUTE MODE_-1€Œ22*4185_^1*_] 122*4185_^1SMDACP NUM 0_R122*4185_^1_%ENQ 0_R122*4185_^1_%RTJ* (ACPSET)_K122*4185_^1_%JMP* (SMDACP)_K122*4185_^1_%END_]_^__ ŒPNODIAS CSY/ C87 P€1_%NAM NODIAS_'DECK-ID C87 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$DUMMY ROUTINE TO REPLACE DILUSS._^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1****_]_^1*_1THIS ROUTINE IS USED TO LINK ENTRY POINTS OF_^1*_1'FFILBF', AND 'FILSMD', WHEN NO DIAGNOSTIC OPTION_^1*_1IS REQUESTED FOR THE DRIVE. THIS ROUTINE REPL€€ACES_^1*_1DILUSS._^1*_]_^1*_]_^1_%SPC 1_^1*_1E N T R Y_#P O I N T S_^1_%ENT FFILBF_'INITIALIZE BUFFER_^1_%ENT FILSMD_'GET STATUS WORDS_^1_%SPC 1_^1*_1S Y S T E M_#E Q U I V A L E N C E_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1****_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1*_1TO BACKGROUND DIAGNOSTIC BUFFER WITH $FFFF_^1FFILBF€Ô NOP 0_,FILE BUFFER WITH $FFFF ENTRY_^1_%JMP* (FFILBF)_$RETURN_^1_%SPC 2_^1*_1GET STATUS WORDS_^1FILSMD NOP 0_,ENTRY_^1_%LDA- ESTAT2,I_$SET A-REGISTER TO LAST DA STATUS_^1_%JMP* (FILSMD)_$RETURN_^1_%END_]_^__ ÔPQ18331 CSY/ C88 P€1_%NAM Q18331_'DECK-ID C88 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SYSTEM INITIALIZER DRIVER FOR DA,CU/33,858 DISK_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1************************************************************************_^1*_8ENTRY PARAMETERS (ANY COMBINATION)_^1*_9(A) = FWA OF BUFFER€€(FWAB)_^1*_=IF A EQUALS -0 THEN WRITE ADDRESS TAGS_^1*_8+(Q) = NO OF WORDS TO READ_^1*_8-(Q) = COMPLEMENT OF WORDS TO WRITE_^1*_9(I) = STARTING SECTOR ADDRESS_^1*_?(WILL BE BIASED BY 4)_^1_%SPC 2_^1*_8EXIT PARAMETERS (NORMAL RETURN)_^1*_9(A) = -0 REQUEST OK_^1*_9(Q) = 0_^1*_9(I) = SAME AS ON ENTRY_^1_%SPC 2_^1*_8ERROR EXIT PARAMETERS_^1*_9(A) = 0_^1*_9(Q) = ERROR CODE_^1*_?14 €€NOT READY_^1*_?17 SEEK ERROR_^1*_?70 CONNECT ERROR_^1*_?71 UNCORRECTABLE ECC ERROR_^1*_?74 LENGTH GREATER THAN REQUEST_^1*_?75 DATA TRANSFER ERROR_^1*_9(I) = LAST HARDWARE DA STATUS_^1************************************************************************_^1_%SPC 2_^1***_"PURPOSE ---_^1*_$------_^1*_$QSMD IS THE MASS STORAGE DEVICE (SMD) DRIVER FOR THE SYSTEM_^1*_$INITIALIZE€€R. IT PERFORMS THESE FUNCTIONS UNDER THE CONTROL_^1*_$OF THE INITIALIZER._^1*_$(1) READ/WRITE DISK DURING SYSTEM BUILDING,_^1*_$(2) WRITE ADDRESS TAGS AND DATA, AND_^1*_$(3) THE DRIVER BROUGHT IN VIA AUTOLOAD TO READ THE MSOS CORE_^1*_)IMAGE._^1*_$THIS DRIVER IS STATUS DRIVEN,THUS IT CAN ONLY INTERFACE WITH A_^1*_$DRIVER VIA THE CU/33 ON THE DUAL CPU (CYBER 18-30) SYSTEM._^1*_]_^€€1*_$IN AUTOLOAD SECTION, IT CLEAR MOS MEMORY PARITY BY STORING ZERO_^1*_$(SELECTIVE SWITCH RESET) OR READ + STORE (SELECTIVE SWITCH SET)._^1*_]_^1_%SPC 2_^1****_!******_^1*_$ENTRY POINTS_^1*_$******_^1*_]_^1_%ENT MMINIT_'ENTRY FOR I2_^1_%ENT QMASS_(ENTRY TO DRIVER_^1_%ENT EMASS_(W,E,S FUNCTION CODE_^1_%ENT MAXSEC_'LARGEST SECTOR AVAILABLE TO INIT._#113*4253_^1*_]_^1*_]_^1*_$*€€*****_^1*_$EXTERNAL_^1*_$******_^1*_]_^1_%EXT* I2RETN_'IN I2_^1*_]_^1_%SPC 2_^1*_]_^1*_$******_^1*_$EQUIVALENCE FOR SYSTEM_^1*_$******_^1*_]_^1*_1EQUIPMENT CODE AND UNIT ASSIGNMENTS_^1_%EQU UNIT(0)_%AUTOLOAD UNIT_^1DEVICE EQU DEVICE(14)_"EQUIPMENT NUMBER_^1*_1DEVICE PHYSICAL LIMITS_^1_%EQU CYLODN(410)_!NO. OF CYLINDERS FOR LOW DENSITY_^1_%EQU CYHIDN(821)_!NO. OF CYLINDERS FO€€R HIGH DENSITY_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS IN A SECTOR_^1_%EQU SERTCK(64)_"NUMBER OF SECTORS PER TRACK_^1_%EQU TRKCYL(5)_#NUMBER OF TRACKS IN A CYLINDER_^1_%EQU SERPCY(320)_!NUMBER OF SECTORS PER CYLINDER_^1_%EQU MAXSEC($7FFF)_F113*4253_^1*_1ERROR RETRIAL COUNTS_^1_%EQU IOTRYS(3)_#NUMBER OF IO TRIES BEFORE LOG OF FAILURE_^1_%EQU CONTRY(10)_^1_%EQU BACKGD($3238) CHAR€€ACTER ('28') FOR BACKGROUND BUFFER_^1*_1ERROR CODES_^1_%EQU NRDERR(14)_"NOT READY ERROR CODE_^1_%EQU SKER(17)_$SEEK ERROR_^1_%EQU CERRCO(70)_"CONNECT ERROR CODE_^1_%EQU ECCER(71)_#UNCORRECTABLE ECC ERROR_^1_%EQU LENERR(74)_"LENGTH ERROR CODE_^1_%EQU DAER(75)_$DATA TRANSFER ERROR_^1*_]_^1****_]_^1*_]_^1****_]_^1*_$ANALYSIS ---_^1*_$------_^1*_$THIS DRIVER IS STATUS DRIVEN AND€€ ITS PRIMARY FUNCTION IS TO_^1*_$READ/WRITE DATA FROM/TO THE DISK DURING SYSTEM BUILDING. THE_^1*_$OTHER FUNCTIONS ARE: (1) WRITE ADDRESS TAGS, AND (2) SET UP_^1*_$THE AUTOLOAD DRIVER TO READ IN THE MSOS CORE IMAGE. DUE TO ITS_^1*_$STATUS DRIVEN STRUCTURE AND THE USAGE BY THE 'SI', IT BECOMES_^1*_$THE ONLY INTERFACE WITH THE CU/33 EVEN THE SYSTEM IS CONFIGU-_^1*_$RATED WITH DUAL €€CPU (CYBER 18-30). FURTHERMOVE, THE ADDRESSING_^1*_$FEATURE USED BY THE 'SI' IS ONE WORD, THUS THE ACCESSIBILITY OF_^1*_$THE DRIVER IS TO THE LOWER 32767 SECTORS FOR THE SYSTEM BUILD_^1*_$EVEN THE DRIVER IS CAPABLE TO ADDRESS THE WHOLE DISK. THE CORE_^1*_$ADDRESS IS LIMITED TO THE FIRST 65K ALSO._^1*_]_^1*_$THE WRITE ADDRESS TAGS FUNCTION, IF USED, SETS UP THE LOGICAL_^1*_$SECTOR€€S WITHIN A TRACK IN SEQUENTIAL FASHON (RANGE 0-63). IT_^1*_$ALSO ASSUMED THE FOLLOWING DATA:_^1*_$(1) 96 WORDS/SECTOR,_^1*_$(2) 64 SECTORS/TRACK, AND_^1*_$(3) 5 TRACKS/CYLINDER._^1*_$THE NUMBER OF CYLINDERS FOR THE DISK PACK IS SET UP BY EXAMINING_^1*_$THE DENSITY TYPE. THEY ARE: (1) 410, (2) 821 CYLINDERS FOR LOW_^1*_$AND HIGH DENSITY RESPECTIVELY._^1*_]_^1*_$THE AUTOLOAD UNIT€€ (OR MSOS SYSTEM UNIT) IS ASSIGNED TO UNIT ZERO._^1*_$THE EQUIPMENT CODE IS 14, AND THE STATION CODE IS ZERO._^1*_]_^1*_$THE ENTRY AND EXIT CONDITIONS FOR THIS ROUTINE ARE LISTED AS_^1*_$FOLLOWING:_^1*_]_^1*_8ENTRY PARAMETERS (ANY COMBINATION)_^1*_9(A) = FWA OF BUFFER(FWAB)_^1*_=IF A EQUALS -0 THEN WRITE ADDRESS TAGS_^1*_8+(Q) = NO OF WORDS TO READ_^1*_8-(Q) = COMPLEMENT OF WORDS T€€O WRITE_^1*_9(I) = STARTING SECTOR ADDRESS_^1*_?(WILL BE BIASED BY 4)_^1*_]_^1*_]_^1*_8EXIT PARAMETERS (NORMAL RETURN)_^1*_9(A) = -0 REQUEST OK_^1*_9(Q) = 0_^1*_9(I) = SAME AS ON ENTRY_^1*_]_^1*_]_^1*_8ERROR EXIT PARAMETERS_^1*_9(A) = 0_^1*_9(Q) = ERROR CODE_^1*_?14 NOT READY_^1*_?17 SEEK ERROR_^1*_?70 CONNECT ERROR_^1*_?71 UNCORRECTABLE ECC ERROR_^1*_?74 LENGTH GREATER THAN€€ REQUESTED_^1*_?75 DATA TRANSFER ERROR_^1*_9(I) = LAST HARDWARE DA STATUS_^1*_]_^1*_$THE OPERATIONAL SEQUENCES FOR THE DRIVER ADDRESS TAGS AND AUTO-_^1*_$LOAD FUNCTIONS ARE DESCRIBED IN THE FOLLOWING:_^1*_]_^1*_$(1) DRIVER FUNCTION ---_^1*_$THE 'SI' CALLS THIS DRIVER TO READ/WRITE MASS MEMORY DURING_^1*_$SYSTEM BUILDING PHASE. SINCE THE SECTOR AND DATA BUFFER (CORE)_^1*_$ADDRESSE€€S ARE PASSED TO THIS ROUTINE VIA THE I AND A REGISTERS,_^1*_$THEREFORE THE DISK AND CORE ADDRESSING MODES ARE RESTRICTED TO_^1*_$THE LOWEST 65K. OPERATION STEPS ARE:_^1*_]_^1*_$(A) SET UP READ (+) OR WRITE (-) FLAG AND CONVERT MASS MEMORY_^1*_)ADDRESS TO CYLINDER, TRACK AND SECTOR OUTPUT FORMAT._^1*_$(B) CONNECT CU AND DRIVE,_^1*_$(C) SEEK OPERATION (LOAD CYLINDER ADDRESS OPERATIO€€N)_^1*_$(D) DATA TRANSFER OPERATION (OUTPUT LENGTH, FWA OF BUFFER, TRACK/_^1*_)SECTOR, AND READ/WRITE CODE),_^1*_$(E) UPDATE CYLINDER, TRACK, SECTOR, AND BUFFER ADDRESSES AS WELL_^1*_)AS LENGTH IF END OF CYLINDER IS ENCOUNTERED PRIOR TO END OF_^1*_)TRANSFER. OTHERWIES CALLER REGAINS CONTROL WITH REGISTERS_^1*_)SET._^1*_]_^1*_$STEPS B-E ARE IN A SUBROUTINE FORM AND CALLED BY OTHER €€FUNCTIONS,_^1*_$SUCH AS WRITE ADDRESS TAGS._^1*_]_^1*_$ERROR CONDITIONS ARE EXAMINED DURING I/O OPERATION SEQUECES:_^1*_$(A) CONNECTION OF CU AND DRIVE ARE TRIED FOR A MAXIMUM OF 10_^1*_)TIMES (DEFINED BY THE TERM 'CONTRY')._^1*_$(B) ALARM ON SEEK OPERATION IS RETRIED FOR A MAXIMUM OF 3 TIMES._^1*_]_^1*_$ECC RECOVERY TECHNIQUES ARE USED WHEN ECC ERROR (READ OPERATION)_^1*_$IS DETEC€€TED._^1*_]_^1*_]_^1*_$FOR AUTOLOAD SET UP REQUEST, SECTOR IS ZERO, IT PICKS UP THE_^1*_$VALUE OF 'MSIZV4' FROM 'IDRIV' (STORED BY 'CONTRL' WHEN 'MSIZV4'_^1*_$IS ENCOUNTERED) AND SAVE IT FOR CLEARING MOS MEMORY PARITY._^1*_]_^1*_]_^1*_$(2) WRITE ADDRESS TAGS FUNCTION ---_^1*_$THE 5-WORD BUFFER DATA ASSIGNMENTS FOR ADDRESS TAGS ARE SHOWN_^1*_$BELOW:_^1*_)WORD 1 FLAG BYTE (SET TO 0)_^€€1*_)WORD 2 FLAG BYTE (SET TO 0)_^1*_.3 CYLINDER ADDRESS BITS 0-9._^1*_.4 TRACK ADDRESS BITS 8-10, BIT 7 SET FOR LAST SECTOR_^1*_0SECTOR ADDRESS BITS 0-6._^1*_.5 NUMBER OF BYTES PER SECTOR MINUS ONE (BITS 15-8)_^1*_]_^1*_$THE SIZE OF THIS BUFFER IS 320 WORDS (OR 5*64 SECTORS)._^1*_$THE ADDRESS TAGS DATA IS SET UP ACCORDING TO THE ABOVE 5 WORDS'_^1*_$DEFINITION FOR ONE TRACK. THEN T€€HE I/O ROUTINE (STEPS B-E OF_^1*_$DRIVER FUNCTION) IS CALLED TO WRITE THE ADDRESS TAGS DATA._^1*_$ADDRESSES, NAMELY TRACK AND CYLINDER, IF APPLIED ARE ADJUSTED._^1*_$I/O ROUTINE IS CALLED TO WRITE THE DATA. THE ABOVE PROCESS IS_^1*_$REPEATED UNTIL ALL CYLINDERS BEED WRITTEN. THEN THE DISK PACK_^1*_$IS FILLED WITH THESE 2 CHARACTERS '28'. THE SIZE OF THE BUFFER,_^1*_$WHICH '28' I€€S SET UP IS 384 WORDS (OR 4X96, 4-SECTOR BUFFER)._^1*_]_^1*_$(3) AUTOLOAD DRIVER FUNCTION ---_^1*_$IT SET UP TO MOVE THE DRIVER PORTION OF THIS PROGRAM TO LOCATION_^1*_$'STMSV4' OF THE 'SPACE' ROUTINE OF MSOS._^1*_]_^1****_]_^1_%EJT_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1*--------------------------------------------------------------------€€_^1*_]_^1*_1SET UP AUTOLOAD STUFF_^1*_]_^1*--------------------------------------------------------------------_^1_%SPC 3_^1MMINIT LDQ =XDSKEND-START1+2_"AUTOLOAD PROGRAM LENGTH_^1_%LDA =XPART01-START1_$DISTANCE TO AUTOLOAD TABLE_^1_%RTJ I2RETN_'RETURN TO I2 WITH ADDRESS OF AUTOLOAD PROGRAM_^1_%SPC 2_^1************************************************************************_^1€€*_$AUTOLOAD PROGRAM FOR SMD_^1************************************************************************_^1START1 IIN 0_^1_%APM_/SET TO ABSOLUTE PAGE MODE_^1_%SPC 1_^1*_$CLEAR CORE (LOWER 65K) TO ZERO, OR RESET PARITY_^1*_$BY DOING A LOAD AND STORE._^1*_$CORE SIZE IS PASSED BY IDRIV VIA CONTRL AT SYSTEM_^1*_$INITIALIZATION WHEN THE AUTOLOAD AREA IS WRITTEN_^1*_]_^1*_$IF THE SEL€€ECTIVE SKIP SWITCH IS._^1*_$SET_%- LOAD AND STORE MEMORY BEFORE SYSTEM READ_^1*_$NOT SET_!- ZERO MEMORY BEFORE SYSTEM IS READ IN_^1*_]_^1*_]_^1_%LDA* MSIZV4_'GET VALUE OF 'MSIZV4'_^1_%SUB =XDSKEND-START1_^1_%TRA Q_,END OF PGM TO END OF MEMORY_^1_%ENA 0_^1_%TRA M_,CLEAR IN CASE COME FROM DTLP 'A' OPT_^1CLR_"SWN STORE_(STORE ZERO IF SEL SKIP NOT SET_^1_%LDA DSKEND,Q_K122*4808_^€€1STORE STA DSKEND,Q_K122*4808_^1_%SQZ GO_+SENSE DONE_;122*4808_^1_%INQ -1_+DECREMENT INDEX BY 1_^1_%JMP* CLR_*TO REPEAT FOR NEXT CELL_^1GO_#SPE 0_,CLEAR PARITY ERROR INDICATOR_)122*4808_^1_%LDQ =XDSKEND-LOOP+1 LENGTH TO BE MOVED_0122*4808_^1LOOP01 LDA* LOOP,Q_^1_%STA* (STMSV4),Q_^1_%SQZ CONT1_^1_%INQ -1_^1_%JMP* LOOP01_^1CONT1 JMP* (STMSV4)_$GO TO LOOP AFTER IT HAS BEEN M€€OVED_^1_%SPC 2_^1*_$FWA OF CODE MOVED TO LOCATION STMSV4 IN SPACE PROGRAM_^1LOOP_!ENA 5_,SET SYSTEM SECTOR 1_^1_%STA- I_,AS SECTOR TO BE READ_^1_%CLR A_,BEGINNING FWA_^1_%LDQ* STMSV4_'MODIFIED LENGTH OF PART 0_^1_%RTJ* QMASS_(READ IN PART 0 UP TO THE END OF SPACE_^1_%SAN GOON_)SKIP IF NO DISK ERROR_^1_%JMP* LOOP_)KEEP TRYING IF ERROR_^1GOON_!LDA* PART01_'PART 1 CORE IMAGE SECTO€€R ADDRESS_^1_%SAZ ONGO_)SKIP IF NO PART 1 TO LOAD_^1_%STA- I_^1_%LDA* PART1A_'MODIFIED CORE ADDRESS OF PART 1_^1_%LDQ* LPART1_'MODIFIED LENGTH OF PART 1_^1_%RTJ* QMASS_(READ IN PART 1_^1_%SAN ONGO_)SKIP IF NO DISK ERROR_^1_%JMP* GOON_)KEEP TRYING IF ERROR_^1ONGO_!EIN 0_,ENABLE INTERRUPT SYSTEM_^1_%JMP* LOOP-2_'AND GO TO RESTRT IN SPACE PROGRAM_^1_%SPC 2_^1PART01 NUM 0_,PART 1 €€CORE IMAGE SECTOR ADDRESS_^1LPART1 NUM 0_,MODIFIED LENGTH OF PART 1_^1PART1A NUM 0_,MODIFIED CORE ADDRESS OF PART 1_^1STMSV4 NUM 0_,ADDRESS IN SPACE WHERE AUTOLOAD IS MOVED TO_^1MSIZV4 NUM 0_,CORE SIZE (TO BE FILLED)_^1************************************************************************_^1_%EJT_]_^1*------------------------------------------------------------------_^1*_]_^1€€*_1STORAGE MODULE DEVICE DRIVER FOR 'SI'_^1*_]_^1*------------------------------------------------------------------_^1_%SPC 3_^1*_$ENTRY FOR THE BASIC DRIVER_^1QMASS NUM 0_^1_%STA* BFWA_)SAVE BUFFER FWA_^1_%EOR =N$FFFF_%CHECK FOR WRITE ADDRESS TAGS FUNCTION_^1_%SAN INCK_)SKIP IF NOT_^1_%JMP TAGS_)GO WRITE ADDRESS TAGS_^1INCK_!STQ* RDWTFG_'SAVE +(READ)/-(WRITE) FLAG_^1_%SQP €€INCKB_(SKIP IF READ (Q) WORDS_^1_%TCQ Q_,COMPLEMENT FOR WRITE WORD COUNT_^1INCKB STQ* NWORDS_'SAVE TRANSFER LENGTH_^1_%LDA- I_,FETCH_^1_%STA* SECADD_)AND SAVE SECTOR ADDRESS_^1_%SPC 1_^1*_1CHECK IF AUTO-LOAD SET-UP REQUEST_^1*_1FOR AUTO-LOAD REQUEST, PICK UP 'MSIZV4' FROM 'IDRIV'_^1*_]_^1_%SAN NOTAUT_'SKIP NOT AUTOLOAD REQUEST (SECTOR NOT ZERO)_^1_%LDQ* QMASS_^1_%LDA- 2,Q_*PICK€€ 'MSIZV4' --- SIZE OF CORE 'LOWER 65K)_^1_%STA* MSIZV4_^1_%LDA* SECADD_'RECALL SECTOR ADDRESS_^1NOTAUT CLR Q_^1*_$CONVERT MSB/LSB TO SMD CYLINDER/TRACK/SECTOR_^1CONVRT ALS 1_^1_%LRS 1_^1_%DVI =XSERPCY_$DIVIDE BY SECTORS PER CYLINDER_^1_%STA* CYLIND_'SAVE CYLINDER_^1_%ENA 0_^1_%LRS 6_,MOVE SECTORS LESS THAN 64 TO A_^1_%ALS 14_+MOVE OVER FOR FORMAT (SECTOR IN LOW BYTE)_^1_%LRS€€ 8_,TRACK TO HIGH BYTE_^1_%STA* TRASEC_'SAVE FORMATTED TRACK/SECTOR_^1_%ENA 0_^1_%STA* IOFUN_(SET IO FUNCTION TO DATA_^1_%STA OFFIND_'INITIALIZE OFFSET JUMP INDEX_^1_%RTJ* SMDIO_^1_%JMP* (QMASS)_%RETURN TO CALLER_^1_%SPC 2_^1BFWA_!NUM 0_,STARTING ADDRESS OF BUFFER_^1NWORDS NUM 0_,WORDS TO TRANSFER_^1RDWTFG NUM 0_,+READ/-WRITE FLAG_^1SECADD NUM 0_,INITIAL SECTOR ADDRESS_^1CY€€LIND NUM 0_,CYLINDER ADDRESS_^1TRASEC NUM 0_,TRACK/SECTOR_^1IOFUN NUM 0_,IO CODE FOR DATA OR ADDRESS_^1NUM7F NUM $7FFF_(MASK WORD_^1_%EJT_]_^1*-------------------------------------------------------------------_^1*_]_^1*_1I/O OPERATION INTERFACE ROUTINE_^1*_]_^1*-------------------------------------------------------------------_^1_%SPC 3_^1ECNTR NUM 0_,ERROR CODE COUNTER_€€^1*_$I/O DRIVER_^1SMDIO ADC 0_^1SEEKA RTJ* CON_*GO CONNECT_^1_%SPC 3_^1*_]_^1*_,-----_#SEEK OPERATION_#-----_^1*_]_^1_%SPC 2_^1SEEK_!ENA 0_^1_%STA* IOERR_(INITIALIZE ERROR COUNTER_^1_%ENA SKER_)INITIALIZE ERROR COUNTER FOR SEEK ERROR_^1_%STA* ECNTR_^1SEKA_!LDQ* EMASS_^1_%INQ 5_,SET Q FOR SEEK FUNCTION_^1_%LDA* CYLIND_'FETCH CYLINDER ADDRESS_^1_%OUT REJT-*_'SEEK TO CYLINDE€€R_^1SEKC_!RTJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP SEKD_)SKIP IF NOT BUSY_^1_%JMP* SEKC_)WAIT FOR BUSY TO DROP_^1SEKD_!ALS 12_+ALARM TO SIGN BIT_^1_%SAP SEKF_)SKIP IF NO ALARM_^1_%JMP DATALM_'GO PROCESS SEEK ALARM_^1SEKF_!INQ 1_,SET Q FOR DRIVE STATUS 2 READ_^1_%INP REJT-*_'READ DS 2 STATUS_^1_%ALS 11_+READY TO SIGN BIT_^1_%SAM SEKI_)SKIP IF READY_^1_%JMP CONN_)GO€€ LOG NOT READY_^1SEKI_!ALS 4_,FAULT TO SIGN BIT_^1_%SAP SEKL_)SKIP IF NO FAULT_^1_%JMP* DATAM_^1SEKL_!ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM DATAI_(TO CLEAR SEEK INITIATED BIT_^1_%JMP* SEKC_^1_%SPC 3_^1*_]_^1*_,---_#CLEAR SEEK INITIATED BIT TO AVOID EXTRA SEEK_^1*_4INTERRUPT WHEN FIRST SEEK REQUEST BY MSOS_^1*_]_^1DATAI LDQ* EMASS_(SET UP TO CLEAR SEEK INITIATED BIT_^1_%INQ €€ 1_^1_%LDA DRIVE_^1_%INA $40_^1_%OUT REJT-*_^1_%SPC 3_^1*_]_^1*_,-----_#DATA TRANSFER PORTION_#-----_^1*_]_^1_%SPC 2_^1*_$NOW SET UP FOR DATA TRANSFER_^1DATA_!ENA DAER_)SET ERROR COUNTER TO DATA ERROR_^1_%STA* ECNTR_^1_%LDQ* EMASS_^1_%LDA* NWORDS_^1_%OUT REJT-*_'SET UP TRANSFER BUFFER LENGTH_^1_%INQ $D_^1_%LDA* BFWA_^1_%OUT REJT-*_'SET BUFFER FIRST WORD ADDRESS_^1_%INQ €€-6_^1_%LDA* TRASEC_^1_%OUT REJT-*_'SELECT TRACK/SECTOR_^1DATAB INQ 2_,SET Q FOR READ_^1_%LDA* RDWTFG_'FETCH READ/WRITE FLAG_^1_%SAP DATAC_(SKIP IF READ_^1_%INQ 1_,SET Q FOR WRITE_^1DATAC LDA* IOFUN_(FETCH IO FUNCTION TYPE, DATA OR ADDRESS_^1_%OUT REJT-*_'START DATA TRANSFER_^1_%SPC 2_^1*_]_^1*_(---_$LOOP TO WAIT FOR DATA TRANSFER BUSY DROP_^1*_]_^1_%SPC 2_^1DATAF R€€TJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP DATAH_(SKIP IF NOT BUSY_^1_%JMP* DATAF_^1DATAH LDA DASTS_(FETCH DA STATUS_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAM DATAM_(SKIP IF ALARM_^1_%ALS 1_,TRANSFER COMPLETE STATUS TO SIGN BIT_^1_%SAP DATAL_(SKIP IF NOT COMPLETE_^1_%SPC 2_^1*_$DATA TRANSFER COMPLETE_^1DATAH1 LDA* SECADD_^1_%STA- I_,RESTORE I TO ENTRY CONDITION_^1_%RTJ C€€LRTDA_'CLEAR DA STATUS BEFORE LEAVING_^1_%CLR Q_^1_%SET A_^1_%JMP* (SMDIO)_^1_%SPC 2_^1DATAL ALS 13_+END OF CYLINDER STATUS TO SIGN BIT_^1_%SAM DATAN_(SKIP IF EOC_^1DATAM JMP DATALM_'GO PROCESS DATA ALARM_^1_%SPC 3_^1*_]_^1*_(---_$END OF CYLINDER CONDITION_^1*_]_^1_%SPC 2_^1*_$HAVE AN END OF CYLINDER WITH NO EOT_^1DATAN LDA* TRASEC_'FETCH STARTING TRACK SECTOR_^1_%ARS€€ 8_,SAVE TRACK ONLY_^1_%TCA Q_^1_%INQ TRKCYL-1_$4 MINUS TRACK TO Q_^1_%QLS 6_,MULTIPLY BY 64 TO GET SECTORS_^1_%LDA* TRASEC_^1_%AND =N$FF_(SAVE SECTORS_^1_%TCA A_^1_%INA 64_+64 - SECTOR TO A_^1_%AAQ A_,NO SECTORS TRANSFERED TO A_^1_%MUI =XWRDSEC_$CONVERT SECTORS TO WORDS TRANSFERED_^1_%STA* TEMPNW_'SAVE NO OF WORDS_^1_%LDA* NWORDS_'FETCH INITIAL NUMBER OF WORDS_^1_%SUB* TE€€MPNW_'MINUS NUMBER TRANSFERED SO FAR_^1_%SAP DATAR_(SHOULD STILL BE POSITIVE_^1*_$NUMBER OF WORDS TRANSFERED GREATER THAN REQUESTED_^1_%ENQ LENERR_^1_%JMP* EREXIT_^1TEMPNW NUM 0_^1_%SPC 3_^1DATAR STA* NWORDS_'SAVE NEW NO OF WORDS TO TRANSFER_^1_%LDQ* BFWA_^1_%ADQ* TEMPNW_^1_%STQ* BFWA_)SAVE NEW BUFFER FIRST WORD ADDRESS_^1_%RAO* CYLIND_^1_%ENA 0_^1_%STA* TRASEC_^1_%STA* IOERR€€_(CLEAR THE ERROR COUNTER_^1_%RTJ CLRTDA_'CLEAR THE DA_^1_%JMP* SEEKA_^1_%SPC 2_^1REJT_!JMP* INTREJ_^1_%ENQ 6_,EXTERNAL REJECT_^1_%JMP* EXTREJ_^1INTREJ ENQ 5_,INTERNAL REJECT_^1EXTREJ JMP* EREXIT_^1_%SPC 2_^1DASTAT NUM 0_^1_%LDQ* EMASS_^1_%INQ 8_^1_%INP REJT-*_'READ DA STATUS_^1_%STA* DASTS_^1_%JMP* (DASTAT)_^1_%SPC 2_^1EMASS ADC DEVICE*128_^1IOERR NUM 0_,IO ERROR COUN€€TER_^1_%EJT_]_^1*-------------------------------------------------------------------_^1*_]_^1*_1ROUTINE TO CONNECT CU AND DRIVE_^1*_1(DRIVE 1 IS ASSIGNED TO AUTOLOAD)_^1*_]_^1*-------------------------------------------------------------------_^1_%SPC 3_^1CON_"ADC 0_,ENTRY_^1_%ENA 0_^1_%STA* CONERR_'INITIALIZE CONNECT ERROR COUNT_^1CONB_!RTJ* CLRTDA_'GO CLEAR THE DA_^1_%INQ -5_€€+SET FOR CONNECT FUNCTION_^1_%LDA* DRIVE_^1_%OUT REJTA-*_%CONNECT TO CU_^1COND_!RTJ* DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAP CONF_)SKIP IF NO ALARM_^1_%RTJ* ERR_*CHECK ERROR COUNT_^1_%JMP* CONB_^1CONF_!ALS 2_,CONNECT TO SIGN BIT_^1_%SAM CONG_)SKIP IF CONNECTED_^1_%JMP* COND_)WAIT FOR SELECT OR ALARM_^1_%SPC 2_^1*_$NOW CONNECT TO DRIVE_^1CONG_!LDQ* EMASS_^1_%INQ 3_^1_%LD€€A* DRIVE_^1_%OUT REJTA-*_%CONNECT TO DRIVE_^1_%RTJ* DASTAT_^1_%ALS 11_^1_%SAP CONL_)SKIP IF NO ALARM_^1_%RTJ* ERR_^1CONJ_!RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1_%JMP* CONB_^1CONL_!LDQ* EMASS_N116*4300_^1_%INQ 3_^1_%INP REJTA-*_%READ SELECT ACKNOWLEDGE STATUS_^1_%LDQ =XCYLODN_$0 - 410 CYLINDERS ON LOW DENSITY DRIVE_^1_%ALS 8_,DRIVE DENSITY TO SIGN BIT_^1_%SAP CONM_)SKIP IF L€€OW DENSITY DRIVE_^1_%LDQ =XCYHIDN_$0 - 821 CYLINDERS ON HIGH DENSITY DRIVE_^1CONM_!STQ NCYL_)SAVE MAX DRIVE CYLINDER_^1_%ARS 8_^1_%AND =N$F_)SAVE DRIVE SELECTED_^1_%EOR* DRIVE_^1_%SAN CONP_)SKIP IF NOT SAME AS SELECTED_^1_%LDQ* EMASS_^1_%INQ 9_^1_%INP REJTA-*_%READ DRIVE 2 STATUS_^1_%ALS 11_^1_%SAM CONQ_)SKIP IF READY_^1CONN_!ENQ NRDERR_'SET NOT READY ERROR CODE_^1_%JMP* €€EREXIT_^1CONP_!RTJ* ERR_^1_%JMP* CONB_^1CONQ_!ALS 4_^1_%SAM CONT_)SKIP IF FAULT BIT SET_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM CONS_)SKIP IF ON CYLINDER_^1_%JMP* CONG_)WAIT FOR ON CYLINDER OR ERROR_^1CONS_!RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1_%JMP* (CON)_^1_%SPC 2_^1CONT_!LDQ* EMASS_^1_%INQ $C_^1_%INP REJTA-*_%READ DRIVE FAULT STATUS_^1_%STA* DFSTS_^1_%ALS 8_^1_%SAP €€ CONV_)SKIP IF NOT HEAD SELECT ERROR_^1_%INQ -5_^1_%ENA 0_^1_%OUT REJTA-*_%SELECT HEAD 0 TO CLEAR ERROR_^1CONV_!LDA* DFSTS_^1_%ALS 14_^1_%SAM CONW_)SKIP IF SEEK ERROR_^1_%JMP* CONJ_^1CONW_!RTJ* STSRTZ_'CLEAR STATUS WORDS WITH A RTZ SEEK_^1_%JMP* CONG_)GO WAIT FOR ON CYLINDER_^1_%SPC 2_^1*_$ROUTINE TO CLEAR STATUS AND DO RETURN ZERO SEEK(RTZ)_^1STSRTZ ADC 0_^1_%LDQ* EMASS_^1_€€%INQ $C_^1_%LDA =N$F3_^1_%OUT REJTA-*_%CLEAR STATUS WORDS WITH RTZ SEEK_^1STS01 RTJ* DASTAT_'FETCH DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP STS02_(SKIP IF NOT BUSY_^1_%JMP* STS01_(WAIT FOR BUSY TO DROP_^1STS02 JMP* (STSRTZ)_^1_%EJT_]_^1*_]_^1*_(---_$CONNECT ERROR CHECK ROUTINE_^1*_]_^1_%SPC 2_^1ERR_"ADC 0_^1_%LDA* CONERR_^1_%INA -CONTRY_^1_%SAP ERR1_)SKIP IF ENO€€UGH ERROR TRIES_^1_%RAO* CONERR_^1_%JMP* (ERR)_^1ERR1_!ENQ CERRCO_'SET CONNECT ERROR CODE_^1EREXIT LDA* DASTS_(FETCH DA STATUS_^1_%STA- I_^1_%ENA 0_,ZERO FOR ERROR_^1_%JMP (SMDIO)_%RETURN WITH ERROR CODE IN Q_^1_%SPC 2_^1CONERR NUM 0_^1CUSTS NUM 0_,LAST CU STATUS_^1DS1STS NUM 0_,LAST DRIVE 1 STATUS_^1DFSTS NUM 0_,LAST DRIVE FAULT STATUS_^1DASTS NUM 0_,LAST DA STATUS_^1D€€RIVE ADC UNIT_)LOGICAL DRIVE NUMBER_^1_%SPC 2_^1*_$ROUTINE TO CLEAR ALL STATUS WORDS_^1CLRSTS ADC 0_^1_%LDQ* EMASS_^1_%INQ $C_^1_%ENA $73_^1_%OUT REJTA-*_%CLEAR ALL STATUS WORDS_^1_%JMP* (CLRSTS)_^1_%SPC 2_^1*_$ROUTINE TO CLEAR DA INTERRUPT STATUS_^1CLRDAS ADC 0_^1_%LDQ* EMASS_^1_%INQ 8_^1_%ENA 2_^1_%OUT REJTA-*_^1_%JMP* (CLRDAS)_^1_%SPC 2_^1*_$ROUTINE TO CLEAR THE DA_€€^1CLRTDA ADC 0_^1_%LDQ* EMASS_^1_%INQ 8_^1_%ENA 3_^1_%OUT REJTA-*_^1_%JMP* (CLRTDA)_^1_%EJT_]_^1STATUS ADC 0_^1_%LDQ* EMASS_^1_%INQ $D_^1_%INP REJTA-*_%READ CU STATUS_^1_%STA* CUSTS_^1_%INQ -1_^1_%INP REJTA-*_%READ DRIVE FAULT STATUS_^1_%STA* DFSTS_^1_%INQ 2_^1_%INP REJTA-*_%READ DRIVE STATUS 1_^1_%STA* DS1STS_^1_%JMP* (STATUS)_^1_%SPC 2_^1REJTA JMP* REJTA1_^1REJTA2 EN€€Q 6_,EXTERNAL REJECT_^1_%JMP* EREXIT_^1REJTA1 ENQ 5_,INTERNAL REJECT_^1_%JMP* EREXIT_^1_%SPC 2_^1*_$ROUTINE TO CLEAR DA IF REQUIRED_^1*_$WILL RETURN AT P + 1 IF NO DA CLEAR DONE_^1*_$AT P + 2 IF CLEAR DA DONE_^1CLRDA NUM 0_^1_%LDA* DASTS_(FETCH DA STATUS_^1_%AND =N$0600_%CHECK THOSE ERRORS REQUIRING DA CLEAR_^1_%SAZ CLRINT_'SKIP IF NO DA CLEAR NEEDED_^1_%RTJ* CLRTDA_'CLEAR T€€HE DA AND STATUS_^1_%RTJ CON_*NEED TO RECONNECT AFTER CLEAR DA_^1_%RAO* CLRDA_(SET RETURN FOR P + 2_^1CLRINT JMP* (CLRDA)_^1_%EJT_]_^1*---------------------------------------------------------------_^1*_]_^1*_1THIS SEGMENT IS USED TO PROCESS SEEK OPERATION_^1*_1ALARM ERROR_^1*_]_^1*---------------------------------------------------------------_^1_%SPC 3_^1*_$ROUTINE TO PROCESS A€€LARM ERRORS_^1DATALM RTJ* STATUS_'FETCH STATUS WORDS_^1*_$MUST CLEAR ANY CU ERROR BEFORE DOING ANY FUNCTION COMMANDS_^1_%LDA* DASTS_(FETCH DA STATUS_^1_%ALS 1_,CU ERROR TO SIGN BIT_^1_%SAP ALMN0_(SKIP IF NO CU ERROR_^1_%RTJ* CLRDAS_'CLEAR DA STATUS_^1_%RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1ALMN0 LDA* DFSTS_(FETCH DRIVE FAULT STATUS_^1_%ALS 8_,HEAD SELECT ERROR TO SIGN BIT_^1_%S€€AP ALMN1_(SKIP IF NO HEAD ERROR_^1_%LDQ EMASS_^1_%INQ 5_^1_%ENA 0_^1_%OUT REJTA-*_%SELECT HEAD 0 TO CLEAR ERROR_^1ALMN1 LDA* DFSTS_^1_%ALS 14_+SEEK ERROR TO SIGN BIT_^1_%SAM ALMN3_(SKIP IF SEEK ERROR_^1_%RTJ* CLRDA_(CLEAR DA IF NECESSARY_^1_%JMP* CKRCV_(P + 1 RETURN NO DA CLEAR. CHECK FOR RECOVERY_^1_%RTJ* CLRSTS_'P + 2 RETURN. DA CLEAR. CLEAR ALL STATUS WORDS_^1_%JMP* ALM€€N15_'GO TRY AGAIN_^1ALMN3 RTJ* CLRDA_^1_%NOP 0_,IGNORE P + 1 RETURN_^1_%RTJ* STSRTZ_'CLEAR STATUS AND DO RTZ SEEK_^1*_$MUST WAIT FOR NO ERROR AND ON CYLINDER_^1ALMN5 RTJ DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAM ALMN14_'SKIP IF ALARM_^1_%INQ 1_^1_%INP REJTA-*_%READ DRIVE STATUS 2_^1_%ALS 11_+UNIT READY TO SIGN BIT_^1_%SAM ALMN11_'SKIP IF READY_^1_%JMP CONN_)GIVE NOT R€€EADY ERROR_^1ALMN11 ALS 15_+ON CYLINDER TO SIGN BIT_^1_%SAM ALMN13_'SKIP IF ON CYLINDER_^1_%JMP* ALMN5_^1ALMN13 ALS 5_,FAULT ERROR TO SIGN BIT_^1_%SAP ALMN15_'SKIP IF NO FAULT_^1ALMN14 RTJ* ERRCK_(GO CHECK ERROR TRIES_^1_%JMP* ALMN3_^1ALMN15 RTJ* ERRCK_^1ALMN16 JMP SEKA_)RETURN TO SEEK. BYPASS ERROR RESET_^1_%SPC 5_^1*_]_^1*_(---_$CHECK FOR POSSIBLE ECC RECOVERY TRY_^1*_€€]_^1_%SPC 3_^1*_$CHECK IF HAVE RIGHT CONDITIONS FOR ERROR RECOVERY TRY_^1CKRCV LDA* CUSTS_^1_%ALS 13_+ECC ERROR BIT TO SIGN BIT_^1_%SAP CKRCV2_'SKIP IF DON T HAVE ECC ERROR_^1_%LDA IOFUN_(DATA OR ADDRESS I/O_^1_%SAN CKRCV2_'SKIP IF NOT DATA_^1_%LDA RDWTFG_'READ/WRITE FLAG_^1_%SAM CKRCV2_'SKIP IF WRITE_^1_%LDA* CUSTS_^1_%AND =N$FB_^1_%SAN CKRCV2_'SKIP IF OTHER CU ERROR_^1_€€%LDA* DS1STS_^1_%SAZ CKRCV4_'SKIP IF NO DRIVE STATUS ERROR_^1CKRCV2 JMP* CKRCV6_^1CKRCV4 LDA* DFSTS_^1_%SAN CKRCV6_'SKIP IF A DRIVE FAULT ERROR_^1_%LDA DASTS_N122*4185_^1_%SAM CKRCV6_'SENSE ECC ERROR IN ADDRESS FIELD_$122*4185_^1_%LDA ECINDX_'CHECK IF ECC IS HERE_^1_%EOR =N$60_^1_%SAN CKRCV6_'SKIP IF NOT_^1_%JMP* ECCALG_'TRY ECC RECOVERY_^1CKRCV6 RTJ* CLRSTS_'CLEAR STATUS WO€€RDS_^1_%RTJ* ERRCK_(CHECK ERROR COUNT_^1_%JMP* ALMN16_'TO 'SEEK'_^1_%SPC 2_^1*_]_^1*_1ALARM ERROR CHECK ROUTINE_^1*_]_^1_%SPC 2_^1ERRCK ADC 0_^1_%RAO IOERR_(INCREMENT ERROR COUNTER_^1_%LDA IOERR_^1_%INA -IOTRYS_^1_%SAP ECK_*SKIP IF ENOUGH TRIES_^1_%JMP* (ERRCK)_^1ECK_"LDQ ECNTR_(SET IO ERROR CODE_^1_%JMP EREXIT_'GO EXIT WITH ERROR_^1_%EQU DSKEND(*)_^1*_$ABOVE DEFINES THE€€ END OF WHAT IS IN THE AUTOLOAD SECTORS_^1_%SPC 3_^1*_$*_"*_"*_"W A R N I N G_"*_"*_"*_"*_"*_"*_^1*_$THE ABOVE LOCATION MINUS 6 MUST BE LESS THAN $1E0 TO_^1*_$FIT INTO THE AUTOLOAD SECTOR AREA_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$ERROR CORRECTION ALOGRITHM TRY_^1*_]_^1*******************************************************€€*****************_^1_%SPC 3_^1ECCALG ENA ECCER_(SET FOR ECC ERROR CODE IN ERROR FLAG_^1_%STA ECNTR_^1_%RTJ ECC_*GO EXECUTE ECC ALGORIHM_^1_%JMP* ECX0_)P+1 RETURN_!NOT CORRECTABLE BY ECC_^1_%LDQ EMASS_(P+2 RETURN_!MAY BE CORRECTABLE_^1_%INQ 7_^1_%INP REJTC-*_%READ SECTOR AND HEAD_^1_%STA* TSA_^1_%LDA ECCA0_(FETCH UPPER ACCUMULATOR BYTE_^1_%ALS 8_^1_%EOR ECCA1_(MERGE TWO BY€€TES TOGETHER_^1_%STA* TSC_^1_%INA -7_+CHECK IF ERROR IS IN ECC_^1_%SAM ECX_*SKIP IF ERROR IS IN ECC_^1_%SUB =XWRDSEC*2_"SEE IF WITHIN SECTOR_^1_%SAP ECX0_)MUST BE 0-198 OR ERROR_^1_%JMP* ECX3N_(GO TRY ERROR CORRECTION_^1ECX0_!JMP ECN_^1*_$ERROR IS IN ECC BYTES_^1ECX_"RTJ* ECXEOT_^1_%RTJ CLRSTS_'CLEAR THE STATUS WORDS_^1_%RTJ CLRDAS_'CLEAR DA STATUS_^1*_$CHECK FOR END OF CYLI€€NDER_^1*_$MUST CHECK TRACK/SECTOR FOR EOC AS STATUS NOT SET WITH ECC_^1ECX1_!LDA* TSA_*FETCH PHYSICAL TRACK/SECTOR_^1_%AND =N$7F_(SAVE SECTOR ONLY_^1_%INA -SERTCK+1_^1_%SAZ ECX2_)SKIP IF END OF TRACK_^1_%LDA* TSA_^1_%INA 1_^1_%JMP* ECX3_^1ECX2_!LDA* TSA_^1_%ARS 8_,SAVE TRACK ONLY_^1_%INA -TRKCYL+1_^1_%SAN ECX2A_(SKIP IF NOT EOC_^1_%JMP DATAN_(GO TREAT AS NORMAL EOC_^1ECX2A €€ LDA* TSA_^1_%ARS 8_,TRACK TO LOW BYTE_^1_%INA 1_,INCREMENT TRACK_^1_%ALS 8_^1ECX3_!LDQ EMASS_^1_%INQ 7_^1_%OUT REJTC-*_%SELECT TRACK/SECTOR_^1_%JMP DATAB_(GO CONTINUE_^1ECX3N LDA TRASEC_'FETCH STARTING TRACK SECTOR_^1_%ARS 8_,SAVE STARTING HEAD_^1_%TCA Q_,MINUS HEAD TO Q_^1_%LDA* TSA_^1_%ARS 8_,CURRENT HEAD_^1_%AAQ A_,CURRENT - STARTING HEAD_^1_%JMP* ECX4_O122*4185_^1€€_%SPC 2_^1SNUM_!NUM $00FF_^1TSA_"NUM 0_,CURRENT HEAD SECTOR_^1TSB_"NUM 0_,FULL TRACKS CONVERTED TO SECTORS_^1TSC_"NUM 0_,A0, A1_^1TSN_"NUM 0_,NEW BFWA. INDEX FOR CORRECTION_^1ZERO_!NUM 0_^1_%EJT_]_^1*_$COMPUTE SECTORS TRANSFERED BEFORE ERROR_^1*_$INITIAL TRACK_(CENTER TRACKS_%END TRACK_^1*_$(64 - STARTING) + ((DELTA TRACKS - 1)*64) + (CURRENT + 1)_^1*_$COMPUTE SECTORS IN €€FULL CENTER TRACKS_^1ECX4_!INA -1_Q122*4185_^1_%ALS 6_,*64 TO CONVERT TRACK TO SECTOR_'122*4185_^1_%STA* TSB_^1*_$COMPUTE SECTORS IN INITIAL TRACK_^1_%LDA TRASEC_'FETCH INITIAL HEAD SECTOR_^1_%AND* SNUM_)SAVE SECTOR ONLY_^1_%TCA Q_^1*_$COMPUTE SECTORS IN END TRACK_^1_%INQ SERTCK_'64 MINUS INITIAL SECTOR_^1_%LDA* TSA_*FETCH CURRENT SECTOR HEAD_^1_%AND* SNUM_)SAVE CURRENT SECTOR€€ ONLY_^1_%INA 1_^1_%AAQ A_,ADD PARTIAL STARTING AND END SECTORS_^1_%ADD* TSB_*PLUS SECTORS FROM FULL TRACKS_^1*_$CONVERT SECTORS TO WORDS_^1ECX9_!MUI =XWRDSEC_$NOW HAVE NUMBER OF WORDS TRANSFERED_^1*_$MAX 30720 WORDS PER CYLINDER. SHOULD NEVER GO INTO Q_^1_%ADD BFWA_)ADD WORDS TRANSFERED TO INITIAL BUFFER ADDRESS_^1_%INA -WRDSEC_^1_%STA* TSN_*SAVE NEW BUFFER FWA_^1_%LDA* TSC_*€€FETCH BYTE COUNT_^1_%INA 1_,GROUP PROPER BYTES TOGETHER FOR DIVISION_^1_%ARS 1_,DIVIDE BY 2 FOR WORD POINTER_^1_%INA -99_*INVERT MAGNITUDE_^1_%MUI =N$FFFE_%MULTIPLY BY MINUS 1 TO INVERT SIGN_^1_%INA 0_^1_%ADD* TSN_^1_%TRA Q_^1*_-DATA SECTOR_$ECC_^1*_%111_^1*_%999_-11_^1*_$********************************_^1*_%876_-10987 6543210_"BYTE CORRECTION BACK POINTER_^1*_$*BBB_-BBBBB*E€€EEEEEE*_^1*_$*000_"* * *_#11111*1234567*_!ASSOCIATED DATA BYTES AND ECC_^1*_$*000_"* * *_#88999*_%*_^1*_$*123_"* * *_#89012*_%*_^1*_$********************************_^1*_]_^1_%LDA* TSC_+FETCH OFFSET_^1_%ALS 15_+LOW BIT TO SIGN BIT_^1_%SAP ECXA_)SKIP IF BYTE COUNT EVEN_^1_%JMP* ECXE_)BYTE COUNT ODD_^1ECXA_!LDA ECCX1_(FETCH X0, X1 SYNDROME BYTES_^1_%RTJ STOECC_'MODIFY DATA IF WIT€€HIN BUFFER_)122*4185_^1_%LDA* TSC_^1_%INA -8_^1_%SAZ ECXC_)SKIP IF INTO SYNC BYTES_^1_%INQ 1_^1_%LDA ECCX2_(FETCH X2, X3 SYNDROME BITS_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_)122*4185_^1ECXC_!JMP* ECXH_^1_%SPC 2_^1REJTC JMP* REJTC1_'INTERNAL REJECT_^1_%JMP REJTA2_'EXTERNAL REJECT_^1REJTC1 JMP REJTA1_^1_%SPC 2_^1*_$BYTE COUNT IS ODD_^1ECXE_!LDA ECCX1_(FETCH X0, X1 S€€YNDROME BITS_^1_%ARS 8_,SAVE X0_^1_%AND* SNUM_)ZERO OUT TOP BYTE_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_)122*4185_^1_%LDA* TSC_^1_%INA -7_^1_%SAZ ECXH_)SKIP IF INTO ECC BYTES_^1_%INQ 1_^1_%LDA ECCX1_(MUST USE BYTES 1 AND 2_^1_%AND* SNUM_)SAVE BUTE 1_^1_%EOR ECCX2_(HAVE BYTES 2 AND 1_^1_%ALS 8_,NOW 1 AND 2_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_)122*4185_^1ECXH€€_!JMP* ECX_*GO CHECK EOT, EOC_^1ECXEOT ADC 0_^1_%LDA DASTS_^1_%ALS 12_^1_%SAP ECXJ_)SKIP IF NOT EOT_^1_%JMP DATAH1_'GO COMPLETE_^1ECXJ_!JMP* (ECXEOT)_^1_%SPC 1_R122*4185_^1*_'ROUTINE TO DETERMINE IF STORE ADDRESS FOR ECC CORRECT'N122*4185_^1*_+IS IN BUFFER AND STORE CORRECTION IF IT IS._'122*4185_^1*_)ENTRY - Q=STORE ADDRESS_=122*4185_^1*_1A=CORRECTION_@122*4185_^1_%SPC 1_R1€€22*4185_^1STOECC 0_"0_R122*4185_^1_%STA* ECCORR_'SAVE CORRECTION_6122*4185_^1_%LDA BFWA_O122*4185_^1_%ADD NWORDS_'CALC.LAST WORD+1(ELSTWD)_-122*4185_^1_%SQM STO2_O122*4185_^1_%SAP STO1_O122*4185_^1_%JMP* STO3_)(Q+,A-),OK_;122*4185_^1STO1_!TCA A_,(Q+,A+)_>122*4185_^1_%AAQ A_R122*4185_^1_%SAM STO3_)SENSE OK_=122*4185_^1_%JMP* STO4_O122*4185_^1STO2_!SAP STO4_)SENSE OUTSIDE BUF€€FER(Q-,A+)_*122*4185_^1_%TCA A_,(Q-,A-)_>122*4185_^1_%AAQ A_R122*4185_^1_%SAM STO4_)SENSE OUTSIDE BUFFER_1122*4185_^1STO3_!LDA* ECCORR_M122*4185_^1_%EOR* (ZERO),Q_$MAKE CORRECTION_6122*4185_^1_%STA* (ZERO),Q_K122*4185_^1_%JMP* (STOECC)_K122*4185_^1STO4_!JMP* ECXH_)TERMINATE ECC LOGIC IF CORRECTION_#122*4185_^1*_9OUTSIDE BUFFER_6122*4185_^1ECCORR NUM 0_R122*4185_^1_%SPC 1_R122*€€4185_^1_%EJT_]_^1*_$TRY OFFSET RECOVERY TECHNIQUES_^1*_$NOT CORRECTABLE BY ECC_^1ECN_"RTJ CLRSTS_'CLEAR ALL STATUS WORDS_^1_%RTJ CLRDAS_'CLEAR DA STATUS_^1_%LDA* OFFIND_'FETCH JUMP TABLE INDEX_^1_%SAN ECNB_)SKIP IF NOT INITIAL TIME_^1_%STA* OFFVAL_'INITIALIZE OFFSET VALUE_^1_%ENA 1_^1ECNB_!TRA Q_^1_%INA -9_+CHECK FOR END OF TRIES_^1_%SAP ECNC_)SKIP IF NO MORE COMBINATIONS TO€€ TRY_^1_%LDA* OFFVAL_^1_%ADD* OFFSET_^1_%STA* OFFVAL_^1_%JMP* TBLSRT-1,Q_^1ECNC_!JMP ECK_*GO DETERMINE AND LOG ERROR_^1*_$JUMP TABLE FOR ERROR CORRECTION TRIES_^1*_$TABLE MUST REMAIN IN ORDER_^1TBLSRT JMP* TPOO_^1_%JMP* TMOO_^1_%JMP* TOOM_^1_%JMP* TOOP_^1_%JMP* TPOP_^1_%JMP* TMOP_^1_%JMP* TPOM_^1_%JMP* TMOM_^1*_$END OF JUMP TABLE_^1RDRCON NOP 0_,DO READ/ RECOVERY WITH WHAT IS IN €€A_^1_%LDQ EMASS_^1_%INQ $C_^1_%OUT REJTC-*_^1*_$MUST WAIT FOR DA TO DROP BUSY IF SEEK WAS INITIATED_^1RDRA01 RTJ DASTAT_'READ DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP RDRA02_'SKIP IF NOT BUSY_^1_%JMP* RDRA01_'WAIT FOR BUSY TO DROP_^1RDRA02 INQ 1_,SET FOR DRIVE STATUS 2 READ_^1RDRA_!INP REJTC-*_%READ DS2_^1_%ALS 11_+READY TO SIGN BIT_^1_%SAM RDRC_)SKIP IF READY_^1_%J€€MP CONN_)GO RECORD ERROR_^1RDRC_!ALS 4_,FAULT TO SIGN BIT_^1_%SAM RDRD_)SKIP IF FAULT_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM RDRE_)SKIP IF ON CYLINDER_^1_%JMP* RDRA_)WAIT FOR ERROR OR ON CYLINDER_^1RDRD_!JMP* ECN_*QUIT ON THIS TRY_^1RDRE_!JMP* (RDRCON)_^1*_$TIMING POSITIVE, OFFSET OFF_^1TPOO_!LDA =N$8000_%SET TIMING EARLY BIT_^1TPOOA RTJ* RDRCON_^1_%RAO OFFIND_'INCREME€€NT JUMP TABLE INDEX_^1_%JMP DATA_)GO TRY AGAIN_^1*_$TIMING MINUS, OFFSET OFF_^1TMOO_!ENA 0_^1_%STA OFFVAL_'CLEAR OFFSET INCREMENT_^1_%LDA =N$4000_%FETCH BIT FOR TIMING MINUS_^1_%JMP* TPOOA_^1*_$TIMING OFF,OFFSET POSITIVE_^1TOOP_!LDA* OFFVAL_'FETCH CURRENT INCREMENT_^1_%ALS 8_^1_%EOR =N$2000_%SET FOR OFFSET POSITIVE_^1TOOP1 RTJ* RDRCON_^1_%LDA* OFFVAL_'CHECK IF TIME TO INCREM€€ENT COMBINATION_^1_%ADD* OFFSET_^1_%INA -16_^1_%SAM TOOP4_(SKIP IF ANOTHER LOOP FOR THIS ONE_^1_%ENA 0_^1_%STA* OFFVAL_'CLEAR OFFSET VALUE_^1_%RAO* OFFIND_'INCREMENT JUMP TABLE POINTER_^1TOOP4 JMP DATA_^1*_$TIMING POSITIVE, OFFSET POSITIVE_^1TPOP_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$A000_%SET OFFSET AND TIMING POSITIVE_^1_%JMP* TOOP1_^1*_$TIMING MINUS, OFFSET PLUS_^1TMOP_!LDA* €€OFFVAL_^1_%ALS 8_^1_%EOR =N$6000_%SET OFFSET POSITIVE AND TIMING NEGATIVE_^1_%JMP* TOOP1_^1*_$TIMING OFF, OFFSET MINUS_^1TOOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$1000_%SET OFFSET MINUS_^1_%JMP* TOOP1_^1*_$TIMING POSITIVE, OFFSET MINUS_^1TPOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$9000_%OFFSET MINUS AND TIMING POSITIVE_^1_%JMP* TOOP1_^1*_$TIMING MINUS, OFFSET MINUS_^1TMOM_!LDA* OFFVA€€L_^1_%ALS 8_^1_%EOR =N$5000_%OFFSET MINUS AND TIMING MINUS_^1_%JMP* TOOP1_^1OFFIND NUM 0_,JUMP TABLE INDEX_^1OFFVAL NUM 0_,CURRENT VALUE OF OFFSET INCREMENT_^1OFFSET NUM 15_+FIXED VALUE OF OFFSET INCREMENT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$SUBROUTINE TO COMPUTE ECC OFFSET AND CORRECTION VALUES_^1*_]_^1**************€€**********************************************************_^1*_]_^1*_$ON RETURN QA CONTAINS THE BYTE DISPLACEMENT_^1*_1RETURNS TO P + 1 IF UNCORRECTABLE_^1*_1RETURNS TO P + 2 IF CORRECTABLE_^1_%SPC 3_^1ECC_"NOP 0_^1_%ENA 22_^1_%STA* ECCK_)INITIALIZE SHIFT COUNT_^1_%ENA 1_^1_%STA* ECCS_)INITIALIZE S SWITCH_^1_%LDA* NUMB0_^1_%STA* ECCA2_(INITIALIZE BYTE ACCUMULATOR_^1_%ENA 0_^1_€€%STA* ECCA0_^1_%STA* ECCA1_^1_%STA* ECCI_^1POHI_!LDQ EMASS_(FETCH EQUIPMENT CODE_^1_%INQ $B_^1_%INP REJTB-*_%READ ECC CONDITION STATUS_^1_%ALS 8_,P0 HIGH NEQ 0 TO SIGN BIT_^1_%SAM SHI_*SKIP IF STILL HIGH BITS_^1_%JMP* NO_+ALL BITS ARE IN 0 - 11_^1SHI_"LDA* ECCK_^1_%SAN SHIFT_(SKIP IF NOT 22 SHIFTS YET_^1_%JMP* (ECC)_(NOT CORRECTABLE WITHIN 22 SHIFTS. RETURN P+1_^1SHIFT INA €€-1_+DECREMENT SHIFT COUNTER_^1_%STA* ECCK_^1_%ENA $20_*SHIFT PO COMMAND FUNCTION BITS_^1_%OUT REJTB-*_%ECC CONTROL FUNCTION_^1FETCHI LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1ADDA_!RTJ ADD_*FETCH AND ADD POLYNOMIAL CONSTANT_^1_%SQM S1_+SKIP IF HAVE CARRY FROM HIGH BYTE_^1_%ENA $60_*INDEX TO FETCH MODULUS FOR ADD_^1_%JMP* ADDA_)GO ADD MODULUS_^1S1_#LDA* ECCS_)FETCH S SWITCH_^1_%SAZ €€U_^1_%JMP* POHI_)GO CHECK PO AGAIN_^1NO_#ENA $54_^1_%STA* ECCI_)SET NEW POLYNOMIAL INDEX_^1_%ENA 89_^1_%STA* ECCK_)SET NEW SHIFT COUNTER VALUE_^1U_$LDQ EMASS_^1_%INQ $B_^1_%INP REJTB-*_%READ IN THE ECC CONDITION STATUS_^1_%STA* ECCC_)SAVE CONDITION STATUS_^1*_$COMPUTE U VALUE FOR SWITCH CHECK_^1_%ALS 1_,MULTIPLY CONDITION STATUS BY 2_^1_%EOR* ECCC_^1_%AND =N$54_^1_%SAZ UZER€€O_^1_%JMP* (ECC)_(NOT CORRECTABLE. PARITY. RETURN AT P+1_^1_%SPC 2_^1NUMB0 NUM $B0_^1NUME0 NUM $E0_^1ECCK_!NUM 0_,SHIFT COUNTER_^1ECCI_!NUM 0_,INDEX INTO POLYNOMIAL TABLE_^1_%SPC 2_^1UZERO STA* ECCS_)SET S SWITCH TO ZERO_^1_%LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1_%AND* ECCC_)AND WITH CONDITION STATUS_^1_%STA* ECCI_^1_%SAZ IZERO_^1_%LDA* ECCK_^1_%INA -1_+DECREMENT COUNTER_^€€1_%SAN SH123_(SKIP TO SHIFT IF NOT ZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. RETURN AT P+1_^1REJTB JMP* REJTI_^1_%JMP REJTA2_'EXTERNAL REJECT_^1REJTI JMP REJTA1_'INTERNAL REJT_^1SH123 STA* ECCK_)RESTORE K COUNTER_^1_%ENA $10_*COMMAND TO SHIFT P1,2,3 POLYNOMIAL REGISTERS_^1_%OUT REJTB-*_%SHIFT P1,2,3_^1_%JMP* FETCHI_'GO FETCH INDEX AND ADD_^1IZERO STA* ECCX2_(ZERO OUT X2, X3 SY€€NDROME BYTES_^1_%STA* ECCX1_(ZERO OUT X0, X1 SYNDROME BITS_^1_%STA* ECCI_)ZERO J SWITCH_^1_%LDA* ECCA1_^1_%ALS 8_^1_%EOR* ECCA2_(A HAS LOWER 2 ACCUMULATOR BYTES_^1_%LDQ* ECCA0_(Q HAS HIGH BYTE_^1_%LLS 8_^1_%LRS 7_,LEFT SHIFT ACCUMULATOR 1_^1_%SQP NOCARY_'SKIP IF NO CARRY_^1_%JMP* (ECC)_^1NOCARY STQ* ECCA0_^1_%ENQ 0_^1_%LLS 8_,MOVE MIDDLE BYTE TO Q_^1_%STQ* ECCA1_(RESTORE_^1_%€€ALS 8_^1_%STA* ECCA2_(SAVE LOW BYTE_^1NEXT_!LDA* ECCA2_^1_%SAZ A2ZRO_(SKIP IF A2 IS ZERO_^1_%ADD* NUME0_(ADD HEX 00E0_^1_%AND* NUMFF_(IGNORE ANY CARRY_^1_%STA* ECCA2_^1_%JMP* SHPO_^1A2ZRO LDA* ECCS_^1_%SAZ S2ZRO_(SKIP IF S SWITCH ZERO_^1_%JMP* END_^1_%SPC 2_^1NUMFF NUM $FF_^1ECCD_!NUM 0_^1ECCS_!NUM 0_,S SWITCH_^1ECCC_!NUM 0_,ECC_^1*_$CORRECTION BYTES_^1ECCX1 NUM 0_,SYND€€ROME BYTES X0, X1_^1ECCX2 NUM 0_,SYNDROME BYTES X2, X3_^1*_$ACCUMULATOR BYTES_^1ECCA0 NUM 0_,HIGH ORDER BYTE_^1ECCA1 NUM 0_,MIDDLE BYTE_^1ECCA2 NUM 0_,LOW BYTE_^1_%SPC 2_^1S2ZRO LDA* NUME0_^1_%STA* ECCA2_(SET A 2 TO $E0_^1_%LDQ EMASS_^1_%INQ $B_^1_%INP REJTB-*_%READ IN CONDITION STATUS_^1_%ALS 8_,P0 HIGH NEQ 0 TO SIGN BIT_^1_%SAP P0HZRO_'SKIP IF P0 HIGH IS ZERO_^1_%J€€MP* END_*GO DUMP SYNDROME BITS_^1*_$A0 A1 MINUS 1_^1P0HZRO LDA* ECCA0_(DO A0A1-1_^1_%ALS 8_^1_%EOR* ECCA1_^1_%INA -1_^1_%ENQ 0_^1_%LLS 8_^1_%STQ* ECCA0_^1_%ALS 8_^1_%STA* ECCA1_^1*_$SHIFT P0_^1SHPO_!LDQ EMASS_^1_%INQ $B_^1_%ENA $20_*SET A TO SHIFT PO COMMAND_^1_%OUT REJTB-*_%ECC CONTROL. SHIFT PO_^1_%JMP* NEXT_^1END_"LDA* NUME0_^1_%STA* ECCA2_^1_%ENA 1_^1_%STA* ECCS_)SET €€S SWITCH TO 1_^1*_$GET D VALUE. ECC DATA BYTE_^1_%LDQ EMASS_^1_%INQ $A_^1_%INP REJTB-*_%READ ECC PATTERN_^1_%STA* ECCD_^1*_$BRANCH OFF VALUE OF J SWITCH_^1_%LDA* ECCI_^1_%INA -1_^1_%SAM LOOPA_(SKIP IF WAS 0_^1_%SAN LOOPC_(J WAS 2_^1_%JMP* LOOPB_(WAS 1_^1*_$J SWITCH 2_^1LOOPC LDA* ECCD_)FETCH ECC PATTERN_^1_%ALS 8_,MOVE TO UPPER BYTE_^1_%AND* ECCX2_(AND INTO X2 SYNDROME BYTE€€. X3 UNCHANGED_^1_%STA* ECCX2_(RESTORE BYTES X2, X3_^1_%RAO ECC_*INCREMENT RETURN FOR P+2_^1*_$ADD CHECK FOR OUT OF RANGE_^1_%JMP (ECC)_^1*_$J SWITCH 0_^1LOOPA LDA* ECCX1_(FETCH X0, X1 BYTES_^1_%ALS 8_,NOW X1, X0_^1_%LDQ* ECCD_)FETCH ECC PATTERN_^1_%LRS 8_,A HAS ECC PATTERN, X1_^1SAVEIT STA* ECCX1_(RESTORE X0, X1_^1_%RAO ECCI_)INCREMENT SWITCH_^1_%JMP* SHPO_)GO SHIFT PO AGAI€€N_^1*_$J SWITCH 1_^1LOOPB LDA =N$FC00_^1_%STA* ECCX2_(SET X2 TO $FC, X3 TO ZERO_^1_%LDA* ECCX1_^1_%AND =N$FF00_%SAVE X0 BYTE_^1_%EOR* ECCD_)OR IN ECC PATTERN_^1_%JMP* SAVEIT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$ROUTINE TO ADD POLYNOMIAL CONSTANT TO THREE BYTE ACCUMULATOR_^1*_$WILL FIRST CALCULATE INDEX INTO CONSTANT TABL€€E_^1*_$WILL THEN DO THE BYTE BY BYTE ADDITION_^1*_$IF A CARRY OCCURS FROM THE HIGH ORDER BYTE Q WILL BE SET NEGATIVE_^1*_]_^1************************************************************************_^1*_]_^1*_$ON ENTRY A CONTAINS THE INDEX TO THE CONSTANT TABLE_^1_%SPC 3_^1ADD_"NOP 0_,A CONTAINS THE POLYNOMIAL INDEX_^1_%STA* ECIN_)SAVE INDEX SEARCHING FOR_^1_%ENQ 8_,INITIALIZE IN€€DEX_^1FLOOP EOR* ECINDX,Q_$CHECK FOR INDEX MATCH_^1_%SAZ FOUND_(SKIP IF MATCH_^1_%INQ -1_+DECREMENT COUNT_^1_%SQM NOMATH_'SKIP IF NO MATCH FOUND_^1_%LDA* ECIN_)FETCH INDEX SEARCHING FOR_^1_%JMP* FLOOP_^1NOMATH JMP (ECC)_(ASSUME NOT CORRECTABLE_^1FOUND TRQ A_^1_%MUI =N3_*MULTIPLY BY THREE_^1_%TRA Q_,SET INDEX FOR CONSTANT TABLE_^1_%LDA* ECCA2_(FETCH LOW BYTE OF ACCUMULATOR_€€^1_%ADD* ECONST,Q_$ADD TABLE CONSTANT_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDM_)SKIP IF NO CARRY_^1_%RAO* ECCA1_(INCREMENT NEXT BYTE FOR CARRY_^1_%AND* NUMFF_(SAVE ONLY LOW BYTE_^1ADDM_!STA* ECCA2_^1_%LDA* ECCA1_(FETCH NEXT BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_$ADD CONSTANT_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP €€ADDB_)SKIP IF NO CARRY_^1_%RAO* ECCA0_(INCREMENT NEXT HIGHEST BYTE_^1_%AND* NUMFF_^1ADDB_!STA* ECCA1_(SAVE IN ACCUMULATOR_^1_%LDA* ECCA0_(FETCH HIGH ACCUMULATOR BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDC_)SKIP IF NO CARRY_^1_%AND* NUMFF_^1_%SET Q_,SET Q NEGATIVE FOR CARRY FROM HIGH BYTE_^1ADDC_!STA*€€ ECCA0_^1_%JMP* (ADD)_^1ECIN_!NUM 0_^1_%SPC 3_^1*_$INDICES TO CONSTANTS_^1ECINDX NUM_"$60_^1_%NUM_"$00_^1_%NUM_"$04_^1_%NUM_"$10_^1_%NUM_"$14_^1_%NUM_"$40_^1_%NUM_"$44_^1_%NUM_"$50_^1_%NUM_"$54_^1*_$CONSTANTS_!MUST REMAIN IN ORDER_^1ECONST NUM_"$20_(INDEX 60_#MODULUS_^1_%NUM_"$EE_^1_%NUM_"$8E_^1_%NUM_"$D0_(INDEX 00_#LOW_^1_%NUM_"$8D_5MIDDLE_^1_%NUM_"$91_5HIGH BYTE_^1_%NUM_"$A0_(I€€NDEX 04_^1_%NUM_"$36_^1_%NUM_"$AF_^1_%NUM_"$A0_(INDEX 10_^1_%NUM_"$09_^1_%NUM_"$B3_^1_%NUM_"$60_(INDEX 14_^1_%NUM_"$2E_^1_%NUM_"$F1_^1_%NUM_"$A0_(INDEX 40_^1_%NUM_"$55_^1_%NUM_"$EE_^1_%NUM_"$40_(INDEX 44_^1_%NUM_"$8C_^1_%NUM_"$9D_^1_%NUM_"$40_(INDEX 50_^1_%NUM_"$5F_^1_%NUM_"$A1_^1_%NUM_"$00_(INDEX 54_^1_%NUM_"$84_^1_%NUM_"$DF_^1*_$END OF CONSTANT TABLE_^1_%EJT_]_^1*----------------€€-------------------------------------------------------_^1*_]_^1*_1WRITE ADDRESS TAGS AND BACKGROUND BUFFER_^1*_=WITH '28'_^1*_]_^1*-----------------------------------------------------------------------_^1_%SPC 3_^1*_]_^1*_1ADDRESS TAGS BUFFER SET UP (5 WORDS)_^1*_]_^1*_1WORD 1 FLAG BYTE_^1*_1WORD 2 FLAG BYTE_^1*_1WORD 3 CYLINDER ADDRESS_^1*_1WORD 4 TRACK AND SECTOR DATA_^1*€€_8(BIT 7 IS SET FOR LAST TRACK)_^1*_1WORD 5 NUMBER OF BYTE IN SECTOR_^1*_]_^1_%SPC 2_^1TAGS_!ENA 0_^1_%STA CYLIND_^1_%STA TRASEC_'INITIALIZE THE CYLINDER AND TRACK TO ZERO_^1*_$INITIALIZE THE DATA BUFFER_^1_%LDQ* BLN_*FETCH BUFFER LENGTH_^1_%INQ -1_+POINT Q TO LAST BUFFER LOCATION_^1_%SPC 1_^1*_1SET UP WORDS 1 + 2 --- FLAG BYTE AND WORD 5 NUMBER_^1*_1OF BYTE IN SECTOR (BITS 1€€5-8)_^1*_]_^1TAGS1 LDA* TAGWD5_^1_%STA BUFF,Q_'SET BYTES PER SECTOR MINUS ONE_^1_%INQ -3_+POINT Q TO FLAG BYTE WORD 2_^1_%ENA 0_^1_%STA BUFF,Q_'ZERO FLAG BYTE WORD 2_^1_%INQ -1_+POINT Q TO FLAG BYTE WORD 1_^1_%STA BUFF,Q_'ZERO FLAG BYTE WORD 1_^1_%INQ -1_+POINT Q TO NEXT 5 WORD ADDRESS BLOCK_^1_%SQM TAGS2_(SKIP IF DONE_^1_%JMP* TAGS1_^1TAGWD0 EQU TAGWD0(2*WRDSEC)_^1TAGWD1€€ EQU TAGWD1(TAGWD0-1)_^1TAGWD5 VFD X8/TAGWD1,N8/0_^1TAGS2 RTJ* SETA1_(COMPUTE ABSOLUTE ADDRESS OF BUFFER_^1SETA1 NOP 0_^1_%LDA* SETA1_^1_%ADD =XBUFF-SETA1_^1_%STA* BUFADS_'SAVE THE BUFFER ADDRESS_^1_%SPC 2_^1*_$SETUP THE CURRENT CYLINDER WORDS_^1*_]_^1*_1SET UP WORD 3 --- CYLINDER ADDRESS_^1*_]_^1TAGS4 LDQ* BLN_*FETCH BUFFER LENGTH_^1_%INQ -3_+POINT Q TO CYLINDER ADDRESS_^€€1TAGS5 LDA CYLIND_'FETCH CURRENT CYLINDER_^1_%STA BUFF,Q_'SET IN BUFFER_^1_%INQ -5_+POINT TO NEXT BLOCK_^1_%SQM TAGS6_(SKIP IF CYLINDER SET IN ALL TAGS_^1_%JMP* TAGS5_^1_%SPC 2_^1BUFADS NUM 0_,BUFFER FIRST WORD ADDRESS_^1BIT7_!NUM $80_^1CURSEC NUM 0_,CURRENT SECTOR_^1NCYL_!NUM 0_,NUMBER OF CYLINDERS ON THIS DRIVE_^1BLN_"ADC 5*SERTCK_$TAG WORDS PER TRACK_^1_%SPC 2_^1*_]_€€^1*_1SET UP WORD 4 TRACK/SECTOR DATA_^1*_1BITS 15-8 = TRACK_^1*_1BIT 7_"= SET FOR LAST SECTOR IN TRACK_^1*_1BITS 6-0 = SECTOR_^1*_]_^1*_$SETUP THE TRACK/SECTOR WORDS_^1TAGS6 LDQ* BLN_*FETCH BUFFER LENGTH_^1_%INQ -2_+POINT Q TO LAST TRACK/SECTOR WORD_^1_%LDA TRASEC_'FETCH TRACK/SECTOR_^1_%AND =N$FF00_%SAVE TRACK_^1_%INA SERTCK-1_$SET FOR MAX SECTOR_^1_%STA* CURSEC_'SAVE TRACK€€/SECTOR_^1_%EOR* BIT7_)SET BIT TO INDICATE LAST SECTOR OF TRACK_^1TAGS7 STA* BUFF,Q_'SET TRACK/SECTOR IN TAG WORD_^1_%INQ -5_+POINT Q TO NEXT TAG BLOCK_^1_%SQM TAGS8_(SKIP IF DONE SETTING SECTORS_^1_%LDA* CURSEC_^1_%INA -1_+DECREMENT TO POINT TO NEXT SECTOR_^1_%STA* CURSEC_^1_%JMP* TAGS7_^1_%SPC 2_^1*_$SETUP DRIVER TO WRITE ONE TRACK OF ADDRESS TAGS_^1TAGS8 LDA* BIT7_^1_%STA €€ IOFUN_(SET IO FUNCTION TO ADDRESS_^1_%LDA* BUFADS_'BUFFER FWA_^1_%STA BFWA_^1_%LDQ* BLN_*NO OF WORDS_^1_%STQ NWORDS_^1_%TCQ Q_,SET COMPLEMENT LENGTH FOR WRITE_^1_%STQ RDWTFG_^1_%RTJ SMDIO_(GO WRITE THIS TRACK_^1_%SAN TAGS9_(SKIP IF REQUEST OK_^1_%JMP (QMASS)_^1_%SPC 2_^1*_]_^1*_1HOUSEKEEPING TO MAKE SURE THE WHOLE DISK IS DONE_^1*_]_^1*_1UPDATE TRACK AND/OR CYLINDER ADDRES€€S_^1*_]_^1_%SPC 2_^1*_$CHECK IF ALL TRACKS ON THIS CYLINDER ARE DONE_^1TAGS9 LDA TRASEC_'FETCH TRACK/SECTOR WORD_^1_%ARS 8_,SHIFT OFF SECTOR_^1_%INA -TRKCYL+1_^1_%SAP TAGS10_'SKIP IF ALL TRACKS ON CYLINDER ARE DONE_^1_%LDA TRASEC_'FETCH TRACK_^1_%ADD =N$100_'INCREMENT TRACK BY 1_^1_%STA TRASEC_^1_%JMP* TAGS6_(GO DO NEXT TRACK_^1_%SPC 2_^1*_$CHECK IF ALL CYLINDERS ON DRIVE€€ ARE DONE_^1TAGS10 LDA CYLIND_'FETCH LAST CYLINDER WRITTEN ON_^1_%SUB* NCYL_)MINUS CYLINDERS ON THIS DRIVE_^1_%SAP TAGS11_'SKIP IF ALL CYLINDERS ARE DONE_^1_%RAO CYLIND_'INCREMENT TO NEXT CYLINDER_^1_%ENA 0_^1_%STA TRASEC_'SET TRACK/SECTOR TO ZERO_^1_%JMP* TAGS4_^1_%SPC 3_^1*_]_^1*_1ADDRESS TAGS BEEN WRITTEN, BACKGROUND THE DISK_^1*_:WITH THESE TWO CHARACTERS '28'_^1*_]_^1*_€€1BUFFER, WHICH IS USED FOR BACKGROUND THE DISK,_^1*_1IS 384 WORDS (OR 4 SECTORS) LONG_^1*_]_^1_%SPC 2_^1*_$NOW WRITE DATA ON ENTIRE PACK_^1*_$WRITES ARE 4 SECTORS LONG (384 WORDS)_^1DATSWT NUM 11_+ZERO FOR TAGS, NONZERO IF TAGS AND DATA_^1TAGS11 LDA* DATSWT_^1_%SAN WRT_*SKIP IF DATA ALSO_^1_%JMP* WRT11_(GO EXIT_^1WRT_"ENA 0_^1_%STA TRASEC_'RESET TRACK SECTOR_^1_%STA CYLIND_'€€RESET CYLINDER TO ZERP_^1_%LDA =XBACKGD_$CHARACTERS (28) FOR BACKGROUND BUFFER_^1_%LDQ* DABLN_(FETCH BUFFER LENGTH FOR DATA_^1WRT1_!INQ -1_+SETUP BUFFER WITH DATA_^1_%STA BUFF,Q_^1_%SQZ WRT3_^1_%JMP* WRT1_^1WRT3_!ENA 0_^1_%STA IOFUN_(SET IO FUNCTION FOR DATA_^1_%LDA* DABLN_^1_%STA NWORDS_'SET NO OF WORDS TO TRANSFER_^1_%TCA A_^1_%STA RDWTFG_'SET COMPLEMENT LENGTH FOR WRITE€€ FLAG_^1_%RTJ SMDIO_(GO DO DATA TRANSFER_^1_%SAN WRT5_)SKIP IF NO ERROR OCCURED_^1_%JMP (QMASS)_%EXIT WITH ERROR FLAGS SET_^1_%SPC 2_^1*_$CHECK IF ALL TRACKS/SECTORS ARE DONE_^1WRT5_!LDA TRASEC_^1_%TRA Q_,TEMP SAVE IN Q_^1_%AND =N$7F_(SAVE ONLY SECTOR_^1_%INA -SERTCK+4_J116*4300_^1_%SAP WRT7_)SKIP IF DONE WITH TRACK_^1_%TRQ A_,RESTORE TRASEC_^1_%INA 4_,INCREMENT SECTOR_^€€1_%JMP* WRT9_^1WRT7_!TRQ A_^1_%ARS 8_,SAVE TRACK_^1_%INA -TRKCYL+1_^1_%SAP WRT8_)SKIP IF ALL TRACKS ARE DONE_^1_%TRQ A_^1_%ARS 8_^1_%INA 1_,INCREMENT TRACK_^1_%ALS 8_,AND RESET SECTOR TO ZERO_^1_%JMP* WRT9_^1WRT8_!LDA CYLIND_'FETCH CYLINDER ADDRESS_^1_%SUB* NCYL_)MINUS CYLINDERS ON THIS DISK_^1_%SAP WRT11_(SKIP IF ALL CYLINDERS DONE_^1_%RAO CYLIND_^1_%ENA 0_^1WRT9_!STA €Ö TRASEC_^1_%JMP* WRT3_^1WRT11 SET A_^1_%CLR Q_^1_%JMP (QMASS)_%EXIT WITH PARAMETERS OK_^1DABLN ADC BUFSIZ_'DATA BUFFER LENGTH_^1_%BZS BUFF(384)_#GENERAL DATA BUFFER_^1BUFSIZ EQU BUFSIZ(*-BUFF)_^1_%END_]_^__ÖPB18331 CSY/ C89 P€1_%NAM B18331_'DECK-ID C89 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SYSTEM CHECKOUT BOOTSTRAP FOR DA,CU/33,858 DISK_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1***_"PURPOSE --_^1*_$-------_^1*_$B18331 IS A STATUS DRIVEN PROGRAM WHOSE FUNCTION IS TO COPY THE_^1*_$CURRENT CORE IMAGE TO A SPECIFIED €€DISK LOCATION. THIS ROUTINE_^1*_$IS CORE RESIDENT._^1*_]_^1_%SPC 3_^1*_]_^1****_!******_^1*_$ENTRY POINT_^1*_$******_^1*_]_^1_%ENT COBOP_^1*_]_^1*_$**********_^1*_$EXTERNALS_^1*_$**********_^1*_]_^1_%EXT COBOPS_'STARTING SECTOR, LOWER WORD_^1_%EXT MSIZV4_'LENGTH OF IMAGE (*S DECLARATION)_^1_%SPC 2_^1*_$******_^1*_$EQUIVALENCE FOR SYSTEM_^1*_$******_^1*_]_^1_%EQU UNIT(0)_%AU€€TOLOAD UNIT NUMBER_^1_%EQU ESCODE($0700) EQUIPMENT, STATION CODES (E =14, S=0)_^1_%EQU SERPCY(320)_!SECTORS PER CYLINDER_^1_%SPC 1_^1*_1OUTPUT FUNCTION CODE EQUIVALENCE_^1_%EQU DRCO01(1)_#CLEAR SEEK_^1_%EQU DRCO03(3)_#UNIT SELECT_^1_%EQU DRCO05(5)_#LOAD CYLINDER ADDRESS_^1_%EQU DRCO07(7)_#SECTOR AND HEAD ADDRESS_^1_%EQU DRCO08(8)_#DIRECTOR FUNCTION_^1_%EQU DRCO10(10)_"WRIT€€E DATA_^1_%EQU DRCO12(12)_"READ RECOVERY_^1_%EQU DRCO13(13)_"SET FWA LOWER_^1_%SPC 1_^1*_1INPUT FUNCTION CODE EQUIVALENCE_^1_%EQU DRCI08(8)_#DA STATUS_^1_%EQU DRCI09(9)_#DRIVE STATUS 2 READ_^1_%SPC 1_^1*_1FUNCTION TYPE EQUIVALENCE_^1_%EQU CLRINT(2)_#CLEAR INTERRUPT_^1_%EQU CRDAIN(3)_#CLEAR DA AND INTERRUPT_^1_%EQU CRCUD1(3)_#CLEAR CU AND DRIVE STATUS 1_^1_%EQU CRSKIN($40)€€_!CLEAR SEEK INITIATED_^1****_]_^1_%SPC 2_^1****_]_^1*_$ANALYSIS ---_^1*_$--------_^1*_$THIS IS A CORE-RESIDENT ROUTINE WHOSE FUNCTION IS TO COPY THE_^1*_$CORE IMAGE TO A CERTAIN SECTION (WHICH IS DEFINED IN 'SYSDAT')_^1*_$OF THE DISK. THIS ROUTINE IS ENTERED VIA A DIRECT JUMP TO THE_^1*_$ENTRY POINT 'COBOP'. AT TERMINATION, IT LOOPS ON 1 INSTRUCTION_^1*_$WITH Q-REGISTER INDICAT€€ES THE OPERATIONAL STATUS. Q-REGISTER_^1*_$CONTAINS A ZERO IF NO ERROR WAS DETECTED, CONVERSELY, $FFFF IN_^1*_$Q-REGISTER DEFINES THE FAILURE._^1*_]_^1*_$THIS ROUTINE ASSUMES 320 SECTORS IN A CYLINDER. SINCE IT MUST_^1*_$INTERFACE WITH THE MSOS, THEREFORE THE DISK ADDRESS FOR THE CORE_^1*_$IMAGE MUST BE LESS THAN OR EQUAL TO 32767 (SECTOR). FURTHERMORE_^1*_$THE CORE SIZE IS DEFI€€NED BY 'MSIZV4', THUS IT MUST BE WITHIN THE_^1*_$FIRST 65K. THE DRIVE UNIT IS DESIGNATED TO BE ZERO._^1*_]_^1****_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1COBOP IIN 0_^1_%JMP* OVER_*PASS REQUIRED REGISTER SAVE AREA_^1AREG_!NUM 0_-A REG SAVE_#MUST BE HERE FOR ANALYSIS_^1QREG_!NUM 0_-Q REG SAVE_#MUST BE HERE FOR ANALYSIS_^1START ADC COB€€OPS_(POINTER TO STARTING SECTOR(LOWER WORD)_^1LENGTH ADC MSIZV4_(WORD LENGTH OF IMAGE_^1OVER_!STA* AREG_)SAVE A REGISTER_^1_%STQ* QREG_)SAVE Q REGISTER_^1_%LDQ* CDEQ_^1_%INQ DRCO08_'SET FOR DIRECTOR FUNCTION_^1_%ENA CRDAIN_'CLEAR DA AND INTERRUPT_^1_%OUT REJ-*_(CLEAR DA AND STATUS_^1_%SPC 2_^1*_1CONNECT THE CU_^1*_]_^1_%INQ DRCO03-DRCO08 SET Q FOR UNIT SELECT_^1_%ENA UNIT_€€)SELECT FOR UNIT_^1_%OUT REJ-*_(CONNECT TO CU_^1SELOOP RTJ* DASTAT_^1_%ALS 11_+ALARM TO HIGH BIT_^1_%SAP NOALM_(SKIP IF NO ALARM_^1_%JMP* REJ_*GO ERROR HANG_^1NOALM ALS 2_,CU SELECT TO HIGH BIT_^1_%SAM DRISEL_'SKIP IF CU SELECT_^1_%JMP* SELOOP_'WAIT FOR NO ALARM AND CU SELECTED_^1_%SPC 2_^1*_$ROUTINE TO FETCH DA STATUS_^1DASTAT NOP 0_^1_%LDQ* CDEQ_)FETCH EQUIPMENT CODE_^1_%€€INQ DRCI08_'SET Q FOR DA STATUS READ_^1_%INP REJ-*_(READ DA STATUS_^1_%JMP* (DASTAT)_^1_%SPC 3_^1*_]_^1*_1SELECT DRIVE UNIT --- AUTOLOAD UNIT_^1*_]_^1DRISEL LDQ* CDEQ_^1_%INQ DRCO12_'SET Q FOR READ/RECOVERY_^1_%ENA CRCUD1_'CLEAR CU AND DS1 STATUS WORDS_^1_%OUT REJ-*_(DO READ/RECOVERY_^1_%INQ DRCO03-DRCO12_^1_%ENA UNIT_)SELECT FOR UNIT_^1_%OUT REJ-*_(SELECT DRIVE_^1_%RT€€J* DASTAT_^1_%ALS 11_^1_%SAP NOALM1_'SKIP IF NO ALARM_^1_%JMP* REJ_^1NOALM1 INQ DRCO12-DRCI08 SET Q FOR READ/RECOVERY_^1_%LDA =N$FF_^1_%OUT REJ-*_(CLEAR ALL STATUS WORDS AND DO RTZ SEEK_^1DROPBZ RTJ* DASTAT_'READ DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP NOBSY_(SKIP IF NOT BUSY_^1_%JMP* DROPBZ_'WAIT FOR BUSY TO DROP_^1*_]_^1NOBSY INQ DRCI09-DRCI08 SET Q FOR DRIVE STAT€€US 2 READ_^1WAITOC INP REJ-*_(READ DRIVE STATUS 2_^1_%ALS 11_+READY TO SIGN BIT_^1_%SAP REJA_)SKIP IF NOT READY_^1_%ALS 15_+ON CYLINDER TO SIGN BIT_^1_%SAM ISOC_)SKIP IF ON CYLINDER_^1_%JMP* WAITOC_^1ISOC_!ALS 5_,CHECK FAULT STATUS TO SIGN BIT_^1_%SAP UREADY_(SKIP IF UNIT OK_^1*_$SELECT HEAD TO CLEAR POSSIBLE HEAD SELECT ERROR_^1_%INQ DRCO07-DRCI09 SET FOR HEAD SELECT_^1_%E€€NA 0_,HEAD 0_^1_%OUT REJ-*_^1_%JMP* DRISEL_'GO RESELECT DRIVE_^1REJA_!JMP* REJ_^1_%SPC 2_^1*_]_^1*_,--- UNIT BEEN CONNECTED_^1*_]_^1*_1CONVERT MM ADDRESS TO CYLINDER, TRACK AND_^1*_1SECTOR DATA_^1*_]_^1UREADY LDA* START_(LSB SECTOR_^1_%ENQ 0_,MSB SET TO ZERO_^1NOADJ ALS 1_^1_%LRS 1_^1_%DVI =XSERPCY_$SECTORS PER CYLINDER_^1_%STA* CYLIND_'SAVE CYLINDER ADDRESS_^1_%ENA 0_^1_€€%LRS 6_,EXCESS SECTORS TO A_^1_%ALS 14_+MOVE FOR TRACK/SECTOR FORMAT_^1_%LRS 8_,FORMATTED TRACK/SECTOR TO A_^1_%STA* TRASEC_^1_%SPC 2_^1*_1TO SEEK OPERATION_^1_%RTJ* SEEK_)DO CYLINDER SEEK_^1_%SPC 2_^1*_1SEEK COMPLETED, DATA TRANSFER OPERATION_^1*_]_^1DATA_!LDQ* CDEQ_^1_%LDA* LENGTH_'FETCH CURRENT BUFFER LENGTH_^1_%OUT REJ-*_^1_%INQ DRCO13_'SET Q FOR LOAD FWA FUNCTION_^1_%EN€€A 0_,SET FIRST WORD ADDRESS_^1_%OUT REJ-*_^1_%INQ DRCO07-DRCO13 SET Q FOR TRACK/SECTOR SELECT FUNCTION_^1DATAB LDA* TRASEC_'FETCH TRACK/SECTOR_^1_%OUT REJ-*_^1_%INQ DRCO10-DRCO07 SET Q FOR WRITE FUNCTION_^1_%ENA 0_,A ZERO FOR WRITE DATA_^1_%OUT REJ-*_^1*_$WAIT FOR DA BUSY TO DROP_^1DATAC RTJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP DATAE_(SKIP IF NOT BUSY_^1_%JMP* DA€€TAC_(WAIT_^1DATAE ALS 12_+ALARM TO SIGN BIT_^1_%SAM REJ_*SKIP IF ALARM_^1_%ALS 1_,END OF TRANSFER TO SIGN BIT_^1_%ENQ 0_,SET FOR GOOD TRANSFER FLAG_^1_%SAM EOT_*SKIP ON END OF TRANSFER_^1*_]_^1DATAH ALS 13_+END OF CYLINDER TO SIGN BIT_^1_%SAM EOC_*SKIP IF EOC_^1_%SPC 2_^1*_$WILL HANG IN THIS LOOP ON ANY ERROR CONDITION_^1REJ_"SET Q_,FATAL ERROR HANG_^1_%SET Q_-SET Q IF €€EXTERNAL REJECT_^1EOT_"NUM $18FF_(--------------------HANG, DONE -- OK OR ERROR_^1*_]_^1CYLIND NUM 0_^1TRASEC NUM 0_^1CDEQ_!ADC ESCODE_(EQUIPMENT CODE 14_^1_%SPC 2_^1*_$HAVE AN END OF CYLINDER_^1EOC_"ENA 0_^1_%STA* TRASEC_'SET TRACK/SECTOR TO ZERO_^1_%RAO* CYLIND_'INCREMENT TO NEXT CYLINDER_^1*_1WHEN ENTER HERE, Q-REG. = EQUIPMENT CODE + 8_^1*_1(Q-REGISTER SET UP BY 'DASTAT')€€_^1_%ENA CLRINT_'CLEAR INTERRUPT_^1_%LDQ* CDEQ_^1_%INQ DRCO08_(SET Q FOR DIRECTOR FUNCTION_^1_%OUT REJ-*_(CLEAR DA STATUS TO DROP EOC BIT_^1_%RTJ* SEEK_^1*_1Q-REGISTER = EQUIPMENT CODE + 9_^1*_1(SET UP BY 'SEEK')_^1_%INQ DRCO07-DRCI09 SET Q FOR TRACK/SECTOR SELECT FUNCTION_^1_%JMP* DATAB_^1_%SPC 3_^1*-------------------------------------------------------------------_^1*_]_^1*€€_1ROUTINE TO PERFORM SEEK OPERATION --- CYLINDER_^1*_]_^1*-------------------------------------------------------------------_^1_%SPC 3_^1*_$WILL RETURN TO CALLER WHEN DRIVE IS ON CYLINDER_^1SEEK_!NOP 0_^1_%LDQ* CDEQ_^1_%INQ DRCO05_'SET Q FOR SEEK_^1_%LDA* CYLIND_^1_%OUT REJ-*_(SEEK TO CYLINDER_^1SEEKC RTJ* DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAM SEEKH_(SKIP IF ALARM_^1€xSEEKF INQ DRCI09-DRCI08 SET Q FOR DRIVE STATUS 2_^1_%INP REJ-*_(READ DRIVE STATUS 2_^1_%ALS 10_+ON CYLINDER TO SIGN BIT_^1_%SAM SEEKG_(SKIP IF ON CYLINDER_^1_%JMP* SEEKC_^1SEEKG ALS 1_,UNIT READY TO SIGN BIT_^1_%SAP SEEKH_(SKIP IF UNIT NOT READY_^1_%ALS 4_,FAULT STATUS TO SIGN BIT_^1_%SAP SEEKJ_(SKIP IF NO ERROR_^1SEEKH JMP* REJ_^1SEEKJ JMP* (SEEK)_^1_%END_]_^__xPDPSDSK CSY/ C90 P€1_%NAM DPSDSK_'DECK-ID C90 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PSEUDO DISK HANDLER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1***_"PURPOSE -_^1*_$------_^1*_$DPSDSK IS THE PSEUDO DISK HANDLER FOR ANY TYPE OF DISK DRIVE_^1*_]_^1*_$PSDSMD ALLOWS PROGRAMS USING ONE WORD DISK_^1*_$ADDRESSING TO€€ ADDRESS THE ENTIRE DISK BY SETTING_^1*_$UP SEVERAL LOGIACAL UNITS ON EACH DRIVE_^1*_]_^1*_]_^1****_!*****_^1*_$ENTRY POINTS_^1*_$*****_^1*_]_^1_%ENT IPSDSK_'INITIATOR ENTRY_^1_%ENT CPSDSK_'CONTINUATOR ENTRY_^1_%ENT EPSDSK_'ERROR TIMEOUT ENTRY_^1*_]_^1****_]_^1_%SPC 2_^1_%EQU AFNR($B5)_#FIND NEXT REQUEST_^1_%EQU ANABS($BF)_"NO WORDS ABSOLUTIZER_^1_%EQU ASABS($BD)_"S ABSOLUTI€€ZER_^1_%EQU ACOMPC($B6)_!COMPLETE REQUEST_^1_%EQU ADISP($EA)_"DISPATCHER_^1_%SPC 2_^1_%EQU LPMSK(2)_$LOGICAL PRODUCT MASK BASE_^1_%EQU ZROMSK($12)_!ZERO MASK BASE_^1_%EQU ZERO($22)_^1_%EQU ONEBIT($22)_^1_%EQU ZROBIT($32)_^1_%SPC 2_^1*_1MONITOR REQUEST CODE EQUIVALENCE_^1_%EQU MOTCOD(14)_"MOTION REQUEST CODE_^1_%EJT_]_^1*_$PHYSICAL DEVICE TABLE_^1_%EQU ELVL(0)_%SCHEDUL€€ER REQUEST_^1_%EQU EDIN(1)_%DRIVER INITIATOR_^1_%EQU EDCN(2)_%DRIVER CONTINUATOR_^1_%EQU EDPGM(3)_$DRIVER ERROR ROUTINE_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LU CURRENTLY ASSIGNED_^1_%EQU EPTR(6)_%PARAMETER LIST LOCATION_^1_%EQU EWES(7)_^1_%EQU EREQST(8)_^1_%EQU ESTAT1(9)_^1_%EQU ECCOR(10)_#FWA_^1_%EQU ELSTWD(11)_"LWA+1_^1_%EQU ESTAT2(12)_"DA EQUIPMENT STAT€€US_^1_%EQU NREQC(16)_#NEW REQUEST_^1_%EQU NCOMPA(17)_"COMPLETION_^1_%EQU NTHRED(18)_"THREAD_^1_%EQU NLU(19)_%LU V=0 M=0 A=0 LU=SMD_^1_%EQU NWORDS(20)_"NUMBER OF WORDS_^1_%EQU NADD(21)_$BUFFER_^1_%EQU NMSB(22)_$NEW REQUEST MSB_^1_%EQU NLSB(23)_$NEW REQUEST LSB_^1_%EQU CP(24)_'CONTROL POINT FOR TIME SHARE SYSTEM_^1_%EQU NBSSEC(25)_"BIAS FOR SECTOR ADDRESSING_^1_%EQU NBSWRD€€(26)_"BIAS FOR WORD ADDRESSING_^1_%EQU CLEVL(27)_#COMPLETION LEVEL_^1_%EJT_]_^1****_]_^1*_$ANALYSIS -_^1*_$--------_^1*_$EACH SMD DISK IS CONFIGURED WITH A MAIN LOGICAL UNIT_^1*_$AND SEVERAL PSEUDO LOGICAL UNITS WITH 0 - $7FFF SECTORS_^1*_$PER PSEUDO LOGICAL UNIT. ANY DISK CAN BE BE CONFIGURED IN THE_^1*_$SAME MANNER._^1*_]_^1*_$THE MAIN LOGICAL UNIT CAN ACCESS THE ENTIRE DISK._^1€€*_]_^1*_$REQUESTS TO A PSEUDO LOGICAL UNIT MUST ADDRESS SECTORS_^1*_$IN THE RANGE 0 - $7FFF._^1*_]_^1*_$THE PSEUDO DISK HANDLER WILL ADJUST THE REQUESTED_^1*_$SECTOR ON THE PSEUDO DISK AREA TO THE ACTUAL DISK_^1*_$SECTOR AND REMAKE THE REQUEST TO THE MAIN DISK_^1*_$LOGICAL UNIT._^1****_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1IPSDSK STQ- I_,€€SET PDT ADDRESS_^1PSB_"RTJ- (AFNR)_'CHECK FOR A REQUEST ON THIS UNIT_^1_%JMP- (ADISP)_%IF NONE RETURN TO DISPATCHER_^1_%LDQ- EPTR,I_'FETCH PARAMETER LIST ADDRESS_^1_%LDA- (ZERO),Q_$FETCH REQUEST CODE WORD_^1_%AND- ZROBIT+15_#MAKE SURE D BIT IS SET_^1_%EOR- ONEBIT+15_#SET D BIT_^1_%AND- ZROMSK+4_$DROP CALLERS COMPLETION_^1_%EOR- CLEVL,I_%ADD IN COMPLETION LEVEL_^1_%STA- NREQC,I_%SET€€ IN PDT REQUEST_^1_%ALS 9_,EXTRACT REQUEST CODE_^1_%AND- LPMSK+5_^1_%INA -MOTCOD_%CHECK IF MOTION REQUEST_^1_%SAN PSC_*SKIP IF NOT MOTION REQUEST_^1_%JMP* PSJ_*GO COMPLETE REQUEST_^1PSC_"RTJ- (ANABS)_%ABSOLUTIZE NO OF WORDS_^1_%STQ- NWORDS,I_^1_%LDQ- EPTR,I_'FETCH REQUEST POINTER_^1_%RTJ- (ASABS)_%ABSOLUTIZE BUFFER ADDRESS_^1_%STQ- NADD,I_^1_%TRA Q_,POINTER TO MSB/LSB_^1_%SPC €€1_^1*_]_^1*_1THE CONTROL POINT IS IN WORD 9 OF THE CALLING_^1*_1SEQUENCE FOR TIME SHARE SYSTEM. THERE IS NO_^1*_1CHANGE IS NEEDED FOR NON-TIME SHARE SYSTEM,_^1*_1FOR THE SMD DRIVER WILL CHECK FOR A TRUE TIME_^1*_1SHARE SYSTEM. WORD 9 IS IGNORE AND UNAFFECTED_^1*_1TO THE MSOS FOR NON-TIME SHARE SYSTEM._^1*_]_^1_%LDA- 3,Q_*GET CONTROL POINT AND SAVE_^1_%STA- CP,I_^1_%LDA- 2,Q_*FETC€€H LSB_^1_%STA- NLSB,I_^1_%LDA- 1,Q_P116*4364_^1_%LDQ- NREQC,I_L116*4364_^1_%QLS 4_,CHECK FOR SECTOR OR WORD ADDR REQUEST 116*4364_^1_%SQM PSE_*SKIP IF SECTOR ADDRESSING_,116*4364_^1_%ADD- NBSWRD,I_$ADD WORD BIAS_8116*4364_^1_%JMP* PSG_P116*4364_^1PSE_"AND- ONEBIT+16_#COMBINE BIT 15 (CONTROL POINT BIT)_"116*4364_^1_%EOR- NBSSEC,I_$MSB WITH SECTOR BIAS_1116*4364_^1PSG_"STA- NMSB,I_€€'SAVE AS NEW MSB_6116*4364_^1_%SPC 2_^1_%LDA- I_,FETCH PDT ADDRESS AND MAKE_^1_%INA NREQC_(POINTER TO REQUEST_^1_%STA* PSI_^1_%SPC 1_^1*_]_^1*_1INDIRECT CALL IS MADE TO DO READ/WRITE, THEREFORE_^1*_1NO CHANGE IS NEEDED TO THE MSOS TO ACCOUMT FOR_^1*_1THE 9TH WORD IN THE CALLING SEQUENCE BY TIME SHARE._^1*_]_^1_%RTJ- ($F4)_(MAKE INDIRECT REQUEST FOR_^1_%NUM $2000_(THE NEW REQUES€€T_^1PSI_"ADC 0_^1EPSDSK JMP- (ADISP)_^1*_$COMPLETION FROM DISK CALL_^1*_$AT COMPLETION A CONTAINS THE ADDRESS OF THE REQUEST_^1CPSDSK INA -NREQC_'POINT TO START OF PHYSTB_^1_%STA- I_^1_%LDA- NLU,I_(FETCH V WORD RETURNED_^1_%AND- ZROMSK+13_#SAVE V FIELD ONLY_^1_%EOR- ESTAT1,I_$SET FOR COMPLETE REQUEST_^1_%STA- ESTAT1,I_K116*4364_^1PSJ_"RTJ- (ACOMPC)_$COMPLETE REQUEST_^1_%JMP* PSB_€^1_%END_]_^__ PSMDMPT CSY/ C91 P€1_%NAM SMDMPT_'DECK-ID C91 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SET UP BOOT ADDRESS TAGS_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%ENT SMDMPT_^1SMDMPT JMP* START_^1GETFIL GTFILE G1,NAME-GETFIL-1,FWA,,,,0,1,1_^1_%NUM 0,0_^1_%JMP- ($EA)_^1G1_#RTJ- ($F4)_^1_%NUM $4C00_(FWRITE, OUTPUT PROTECT SWITCH€€ MESSAGE_^1_%ADC COMP,0_^1_%NUM $18FC_^1LENM1 ADC MSEND1-MESS1_^1_%ADC MESS1_^1_%JMP- ($EA)_^1MESS1 ALF *,MASTER CLEAR AND START AT THE ADDRESS ABOVE WITH*_^1_%NUM $0D0A_^1_%ALF *,A = DRIVE LOGICAL NUMBER*_^1_%NUM $0D0A_^1_%ALF *,Q = EQUIPMENT CODE(0XX0) OR ZERO IF EQUIP 14(STANDARD)*_^1MSEND1 EQU MSEND1(*)_^1COMP_!RTJ- ($F4)_^1_%NUM $4800_(FREAD, FOR CARRIAGE RETURN R€€EPLY_^1_%ADC COMP1,0_%COMPLETE AT LOADED PROGRAM_^1_%NUM $18FD,1_^1_%ADC MESS1_^1_%JMP- ($EA)_^1COMP1 IIN 0_^1FWA_"EQU FWA(*)_^1NAME_!ALF 3,MPSMDT_^1START LDA* LDADR_(STARTING ADDRESS OF SMDMPI_^1_%CLR Q_,CONVERT ADDRESS TO ASCII FOR MESSAGE_^1_%STQ- I_^1M1_#LLS 4_^1_%INQ -10_^1_%SQM M2_^1_%INQ 7_^1M2_#INQ $3A_^1_%STQ* M4,I_^1_%RAO- I_^1_%LDQ- I_^1_%INQ -4_^1_%SQZ M€€3_^1_%CLR Q_^1_%JMP* M1_^1M3_#LDA* M4_^1_%ALS 8_^1_%ADD* M4+1_^1_%STA* ADR_^1_%LDA* M4+2_^1_%ALS 8_^1_%ADD* M4+3_^1_%STA* ADR+1_^1_%RTJ- ($F4)_(WRITE LOCATION MESSAGE TO COMMENT DEVICE_^1_%NUM $4C00_^1_%ADC GETFIL_^1_%NUM 0,$18FC_^1LENM_!ADC MSEND-MESS_^1_%ADC MESS_^1_%JMP- ($EA)_^1M4_#BZS M4(4)_^1MESS_!ALF *,TAGS BOOTSTRAP FIRST WORD ADDRESS WILL BE*_^1ADR_"ALF 2,_^1_%N€FUM $0A0D_^1MSEND EQU MSEND(*)_^1LDADR ADC FWA_^1_%END SMDMPT_^__FPSMDMPI CSY/ C92 P€1_%NAM SMDMPI_'DECK-ID C92 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SET UP BOOT PACK INITIALIZATION_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%ENT SMDMPI_^1SMDMPI JMP* START_^1GETFIL GTFILE G1,NAME-GETFIL-1,FWA,,,,0,1,1_^1_%NUM 0,0_^1_%JMP- ($EA)_^1G1_#RTJ- ($F4)_^1_%NUM $4C00_(FWRITE, OUTPUT PROTECT€€ SWITCH MESSAGE_^1_%ADC COMP,0_^1_%NUM $18FC_^1LENM1 ADC MSEND1-MESS1_^1_%ADC MESS1_^1_%JMP- ($EA)_^1MESS1 ALF *,MASTER CLEAR AND START AT THE ADDRESS ABOVE WITH*_^1_%NUM $0D0A_^1_%ALF *,A = DRIVE LOGICAL NUMBER*_^1_%NUM $0D0A_^1_%ALF *,Q = EQUIPMENT CODE(0XX0) OR ZERO IF EQUIP 14(STANDARD)*_^1MSEND1 EQU MSEND1(*)_^1COMP_!RTJ- ($F4)_^1_%NUM $4800_(FREAD, FOR CARRIAGE R€€ETURN REPLY_^1_%ADC COMP1,0_%COMPLETE AT LOADED PROGRAM_^1_%NUM $18FD,1_^1_%ADC MESS1_^1_%JMP- ($EA)_^1COMP1 IIN 0_^1FWA_"EQU FWA(*)_^1NAME_!ALF 3,MPSMDI_^1START LDA* LDADR_(STARTING ADDRESS OF SMDMPI_^1_%CLR Q_,CONVERT ADDRESS TO ASCII FOR MESSAGE_^1_%STQ- I_^1M1_#LLS 4_^1_%INQ -10_^1_%SQM M2_^1_%INQ 7_^1M2_#INQ $3A_^1_%STQ* M4,I_^1_%RAO- I_^1_%LDQ- I_^1_%INQ -4_^1_€€%SQZ M3_^1_%CLR Q_^1_%JMP* M1_^1M3_#LDA* M4_^1_%ALS 8_^1_%ADD* M4+1_^1_%STA* ADR_^1_%LDA* M4+2_^1_%ALS 8_^1_%ADD* M4+3_^1_%STA* ADR+1_^1_%RTJ- ($F4)_(WRITE LOCATION MESSAGE TO COMMENT DEVICE_^1_%NUM $4C00_^1_%ADC GETFIL_^1_%NUM 0,$18FC_^1LENM_!ADC MSEND-MESS_^1_%ADC MESS_^1_%JMP- ($EA)_^1M4_#BZS M4(4)_^1MESS_!ALF *,BOOTSTRAP INITIALIZER FIRST WORD ADDRESS WILL BE*_^1ADR_€T"ALF 2,_^1_%NUM $0A0D_^1MSEND EQU MSEND(*)_^1LDADR ADC FWA_^1_%END SMDMPI_^__TPSMDINT CSY/ C93 P€1_%NAM SMDINT_'DECK-ID C93 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$BOOT ROUTINE TO INITIALIZE PACK_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1*_$ON ENTRY A CONTAINS THE DRIVE LOGICAL NUMBER_^1*_.Q CONTAINS THE EQUIPMENT CODE WES. S = 0._^1*_.IF Q IS ZERO E IS ASSUMED TO BE 3_^1*_]_^1_%SPC 2_^1***_"PURP€€OSE --_^1*_$-------_^1*_$SMDINT IS A STATUS DRIVEN PROGRAM AND IS USED TO INITIATE A NEW_^1*_$PACK WITH ZERO. A NEW PACK SHOULD BE INITIATED BY THIS ROUTINE_^1*_$PRIOR TO WRITE ADDRESS TAG._^1*_]_^1*_]_^1****_!******_^1*_$ENTRY POINT_^1*_$******_^1_%ENT SMDINT_^1*_]_^1*_$******_^1*_$SYSTEM EQUIVALENCE_^1*_$******_^1*_]_^1_%EQU ESCODE($0700) EQUIPMENT + STATION CODES (E=14, S=0€€)_^1_%EQU CYLODN(410)_!NUMBER OF CYLINDERS FOR LOW DENSITY_^1_%EQU CYHIDN(821)_!NUMBER OF CYLINDERS FOR HIGH DENSITY_^1*_]_^1****_]_^1_%SPC 2_^1****_]_^1*_$ANALYSIS ---_^1*_$--------_^1*_$USER MUST ENTER DRIVE NUMBER WHICH TO BE INITIATED ON THE A-REG._^1*_$Q-REGISTER IS SET TO ZERO IF EQUIPMENT CODE IS 3. OTHERWISE_^1*_$Q-REGISTER CONTAINS THE EQUIPMENT CODE IN BITS 7-10. ZER€€O IS_^1*_$SET FOR THE STATION CODE FOR THE SMD._^1*_]_^1*_$THE DISK PACK IS SET TO ZERO BY THE FORMAT WRITE COMMAND. THERE_^1*_$ARE 5 TRACKS IN A CYLINDER. 410 CYLINDERS OR 821 CYLINDERS ARE_^1*_$SET INTERNAL ACCORDING TO LOW OR HIGH DENSITY BY STATUS._^1*_]_^1*_$COMPUTER IS HALT EITHER AT THE COMPLETION OR WHEN ERROR IS_^1*_$DECTED. BOTH A AND Q REGISTERS ARE SET TO ZERO FOR SU€€CESSFUL_^1*_$COMPLETION WHILE A AND Q REGISTERS ARE SET TO $FFFF FOR ERROR._^1*_]_^1****_]_^1*_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 3_^1SMDINT STA* DRIV_)SAVE LOGICAL DRIVE NUMBER_^1_%SQN USEQ_)SKIP IF EQUIPMENT CODE WAS INPUT_^1_%LDQ =XESCODE_$SET EQUIPMENT CODE TO STANDARD_^1USEQ_!STQ* EQUIPC_'SET EQUIPMENT CODE_^1_%ENA 0_^1_%STA* TRACK€€_(INITIALIZE TRACK_^1_%STA* CYLIND_'INITIALIZE CYLINDER ADDRESS_^1_%SPC 2_^1*_$CLEAR DA_^1CLRDA LDQ* EQUIPC_^1_%INQ 8_,SELECT DIRECTOR FUNCTION_^1_%ENA 3_,CLEAR DA AND INTERRUPTS_^1_%OUT -1_^1_%SPC 2_^1_%ENA 0_^1_%STA* CONFLG_'SET FLAG FOR CONNECT SEQUENCE_^1_%SPC 2_^1*_$CONNECT TO CU_^1_%LDQ* EQUIPC_^1_%INQ 3_^1_%LDA* DRIV_)USE DRIVE NUMBER_^1_%OUT -1_^1*_$NOW WAIT FOR A€€LARM OR SELECT_^1USEL1 RTJ* RDDAST_'READ DA STATUS_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAP USEL5_(SKIP IF NO ALARM_^1_%JMP* CLRDA_(GO CLEAR DA AND TRY AGAIN_^1USEL5 ALS 2_,CU SELECT TO SIGN BIT_^1_%SAM USEL9_(SKIP IF CU SELECTED_^1_%JMP* USEL1_(GO WAIT FOR SELECT OR ALARM_^1USEL9 LDQ* EQUIPC_'FETCH EQUIPMENT CODE_^1_%INQ $C_+SET Q FOR READ/RECOVERY_^1_%ENA 3_,CLEAR CU AND DS€€1 STATUS_^1_%OUT -1_^1_%EJT_]_^1*_$NOW SELECT DRIVE_^1_%LDQ* EQUIPC_^1_%INQ 3_^1_%LDA* DRIV_^1_%OUT -1_^1DSEL3 RTJ* RDDAST_^1_%ALS 11_+MOVE ALARM TO HIGH BIT_^1_%SAP DRITP_(SKIP IF NO ALARM_^1_%JMP* CLRDA_^1_%SPC 2_^1DRITP LDQ* EQUIPC_^1*_*3 CARDS DELETED_D116*4328_^1*_$DETERMINE NO OF CYLINDERS FROM DRIVE TYPE_^1_%INQ 3_,SET Q FOR SEL/ACK STATUS FUNCTION_^1_%NOP 0_^1_%IN€€P -1_+READ SELECT/ACKNOWLEDGE STATUS_^1_%LDQ =XCYLODN_$0 - 410 CYLINDERS ON LOW DENSITY DRIVE_^1_%ALS 8_^1_%SAP SAVCYL_'SKIP IF LOW DENSITY DRIVE_^1_%LDQ =XCYHIDN_$0 - 821 CYLINDERS ON HIGH DENSITY DRIVE_^1SAVCYL STQ* NCYLIN_'SAVE AS NUMBER OF DRIVE CYLINDERS_^1_%ALS 3_R116*4328_^1_%SAP GOAHD_(TEST FOR NO ATTENTION BIT_,116*4328_^1_%LDQ* EQUIPC_M116*4328_^1_%INQ $C_Q116*432€€8_^1_%ENA $73_*CLEAR THE ATTENTION BIT_.116*4328_^1_%OUT -1_Q116*4328_^1_%JMP* CLRDA_N116*4328_^1GOAHD ARS 11_Q116*4328_^1_%AND =N$F_)SAVE DRIVE THAT GOT SELECTED_^1_%EOR* DRIV_)COMPARE AGAINST WHAT WAS REQUESTED_^1_%SAZ CKDS2_(SKIP IF THEY MATCH_^1_%JMP* CLRDA_(GO TRY AGAIN_^1_%SPC 3_^1CKDS2 LDQ* EQUIPC_^1_%INQ 9_^1_%NOP 0_^1_%INP -1_+READ DRIVE STATUS 2_^1_%ALS 11_+RE€€ADY TO SIGN BIT_^1_%SAM DSEL5_(SKIP IF READY_^1_%JMP* CLRDA_^1DSEL5 ALS 15_+ON CYLINDER TO SIGN BIT_^1_%SAM DSEL7_(SKIP IF ON CYLINDER_^1_%JMP* DSEL3_^1DSEL7 ALS 5_,CHECK FAULT STATUS TO SIGN BIT_^1_%SAP SETFG_(SKIP IF NOT SET_^1_%JMP* CKALM_^1SETFG ENA 1_^1_%STA* CONFLG_'SET GOOD CONNECT FLAG_^1_%EJT_]_^1*_$SEEK TO CYLINDER_^1DRIOK LDQ* EQUIPC_'NOW DO LOAD CYLINDER ADDRE€€SS_^1_%INQ 5_^1_%LDA* CYLIND_'FETCH CYLINDER_^1_%OUT -1_^1CHKST RTJ* RDDAST_^1_%AND* NUM10_^1_%SAZ CUOK_)SKIP IF NO ALARM ERROR_^1_%JMP* CKALM_^1_%SPC 2_^1RDDAST NUM 0_,READ DA STATUS_^1_%LDQ* EQUIPC_^1_%INQ 8_^1_%NOP 0_^1_%INP -1_+READ DA STATUS_^1_%STA* DASTAT_(SAVE DA STATUS_^1_%JMP* (RDDAST)_^1*_]_^1CUOK_!LDQ* EQUIPC_'NOW CHECK DRIVE 2 STATUS_^1_%INQ 9_^1_%NOP 0_^1_%€€INP -1_^1_%STA* DSTAT2_^1_%ALS 15_+FAULT ERROR TO SIGN BIT_^1_%SAM CUOK2_(SKIP IF FAULT_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM CUOK1_(SKIP IF ON CYLINDER_^1_%JMP* CHKST_(SEEKING, SO GO WAIT CHECKING STATUS_^1CUOK1 ALS 1_,UNIT READY TO SIGN BIT_^1_%SAM ONCYL_(SKIP IF READY_^1CUOK2 JMP CKALM_(GO CHECK AND CLEAR_^1*_]_^1DASTAT NUM 0_,DISK ADAPTER STATUS_^1EQUIPC ADC E€€SCODE_'EQUIPMENT 3_^1DRIV_!NUM 0_^1TRACK NUM 0_,TRACK OR HEAD (0 - 4)_^1CYLIND NUM 0_^1CONFLG NUM 0_,SET TO 1 WHEN CONNECT IS GOOD_^1_%EJT_]_^1*_$ON CYLINDER, SO SELECT TRACK_^1ONCYL LDQ* EQUIPC_^1_%INQ 7_^1_%LDA* TRACK_^1_%ALS 8_,CONVERT TO PROPER FORMAT_^1_%NOP 0_^1_%OUT -1_+SELECT TRACK_^1_%RTJ* RDDAST_^1_%AND* NUM10_^1_%SAZ CUOKB_(SKIP IF NO ALARM ERROR_^1_%JMP* CKAL€€M_^1_%SPC 2_^1*_$DO FORMAT WRITE_^1CUOKB LDQ* EQUIPC_^1_%INQ 6_^1_%NOP 0_^1_%OUT -1_+FORMAT WRITE_^1CKSTA RTJ* RDDAST_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP BSYDN_(SKIP IF DA NOT BUSY_^1_%JMP* CKSTA_(WAIT FOR BUSY TO DROP_^1*_]_^1NUM10 NUM $10_^1DSTAT2 NUM 0_^1CUSTAT NUM 0_^1NCYLIN NUM 0_,NUMBER OF CYLINDERS FOR DRIVE TYPE_^1*_]_^1BSYDN LDA* DASTAT_^1_%AND* NUM10_^1_%SA€€Z ALMOK_(SKIP IF NO ALARM ERROR_^1_%JMP* CKALM_^1ALMOK LDA* TRACK_^1_%INA -4_^1_%SAP NEWCYL_^1_%RAO* TRACK_(INCREMENT TRACK_^1_%JMP* ONCYL_^1NEWCYL ENA 0_^1_%STA* TRACK_(RESET TRACK FOR NEXT CYLINDER_^1_%LDA* CYLIND_^1_%SUB* NCYLIN_^1_%SAP ALLCYL_'SKIP IF ALL CYLINDERS DONE_^1_%RAO* CYLIND_'NEXT CYLINDER_^1_%JMP* DRIOK_^1_%SPC 2_^1*_$WHEN DONE HANG WITH A AND Q CLEAR_^1ALLCY€€L LDQ* EQUIPC_^1_%INQ 8_,SET FOR DA FUNCTION_^1_%ENA 1_,SET FOR CLEAR DA_^1_%OUT -1_^1_%ENA 0_^1_%ENQ 0_^1_%SLS 0_^1_%NUM $18FE_(-------------HANG, DONE_^1_%SPC 2_^1ALMCNT NUM 0_,ALARM ERROR COUNTER_^1DSTAT1 NUM 0_^1FAULTS NUM 0_^1_%SPC 2_^1*-----------------------------------------------------------------------_^1*_]_^1*_1THIS SEGMENT IS USED TO CHECK AND CLEAR ALARM E€€RROR_^1*_]_^1*-----------------------------------------------------------------------_^1_%SPC 2_^1CKALM RAO* ALMCNT_'BUMP ERROR COUNT_^1_%RTJ* GETSTA_^1_%LDA* FAULTS_'FETCH FAULT STATUS_^1_%ALS 14_+SEEK ERROR TO SIGN BIT_^1_%SAP NOSEK_(SKIP ON NO SEEK ERROR_^1_%JMP* SEKER_^1NOSEK LDQ* EQUIPC_^1_%INQ $C_+SET FOR READ/RECOVERY_^1_%ENA $7F_^1_%OUT -1_+CLEAR ALL STATUS WORDS_^1€€_%LDA* FAULTS_'FETCH FAULT STATUS_^1_%ALS 8_,HEAD SELECT ERROR TO SIGN BIT_^1_%SAP NOHDER_'SKIP ON NO HEAD ERROR_^1_%LDQ* EQUIPC_^1_%INQ 7_^1_%ENA 0_,SET TRACK TO ZERO_^1_%OUT -1_+SELECT TRACK_^1NOHDER LDA* DASTAT_^1_%AND =N$7E00_%SAVE BITS WHICH REQUIRE DA CLEAR_^1_%SAN RTNCON_'SKIP IF NEED DA CLEAR_^1_%LDQ* EQUIPC_^1_%INQ 8_,DIRECTOR FUNCTION_^1_%ENA 2_,CLEAR DA STATUS_^€€1_%OUT -1_^1_%LDA* CONFLG_^1_%SAZ RTNCON_'SKIP IF ERROR WAS IN CONNECT SEQUENCE_^1_%JMP* DRIOK_(GO CONTINUE_^1RTNCON JMP CLRDA_(GO START CONNECT AGAIN_^1SEKER LDQ* EQUIPC_^1_%INQ 8_^1_%ENA 2_^1_%OUT -1_+CLEAR DA STATUS_^1_%INQ 4_^1_%LDA =N$FF_^1_%OUT -1_+READ/RECOVERY WITH RTZ SEEK_^1SEK1_!RTJ* RDDAST_'READ DA STATUS_^1_%ALS 11_^1_%SAM SEK3_)SKIP IF ALARM_^1_%INQ 1_,SE€€T FOR DS2 READ_^1_%NOP 0_^1_%INP -1_+READ DS2_^1_%ALS 10_^1_%SAM SEK3_)SKIP IF ON CYLINDER_^1_%JMP* SEK1_^1SEK3_!JMP* CKALM_^1_%SPC 4_^1*_$ROUTINE TO GET STATUS_^1GETSTA NOP 0_^1_%LDQ* EQUIPC_^1_%INQ 9_^1_%NOP 0_^1_%INP -1_+READ DRIVE STATUS 2_^1_%STA* DSTAT2_^1_%INQ 3_^1_%NOP 0_^1_%INP -1_+READ DRIVE FAULT STATUS_^1_%STA* FAULTS_^1_%INQ 1_^1_%NOP 0_^1_%INP -1_+READ €†CU STATUS_^1_%STA* CUSTAT_^1_%INQ 1_^1_%NOP 0_^1_%INP -1_+READ DRIVE STATUS 1_^1_%STA* DSTAT1_^1_%JMP* (GETSTA)_^1_%END_!SMDINT_^__†PMDRSMD CSY/ C94 P€1_%NAM MDRSMD_'DECK-ID C94 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$DISK TO TAPE MASS STORAGE DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1_%SPC 2_^1***_"PURPOSE ---_^1*_$-------_^1*_$MDRSMD IS A STATUS DRIVEN DRIVER WHOSE FUNCTION IS TO SAVE DATA,_^1*_$SUCH AS THE MSOS, FROM DISK TO TAPE. SINCE THE€€ CALLING PROGRAM,_^1*_$DTLP, USES ONE WORD ADDRESSING FOR MASS MEMORY DATA, THEREFORE_^1*_$IT ONLY ACCESSES TO THE LOWER 32767 SECTORS OF THE DISK._^1*_]_^1*_]_^1_%SPC 2_^1****_!******_^1*_$ENTRY POINT_^1*_$******_^1_%ENT GENFC_(LOCATION CONTAINS EQUIPMENT + STATION CODES_^1_%ENT MDRIVE_'ROUTINE ENTRY_^1*_]_^1_%SPC 2_^1*_]_^1*_$******_^1*_$EXTERNAL_^1*_$******_^1*_]_^1_%EXT* F€€ST_^1*_]_^1_%SPC 2_^1*_]_^1*_$******_^1*_$EQUIVALENCE DATA FOR SYSTEM_^1*_$******_^1*_]_^1_%EQU CONTRY(10)_"NUMBER OF TRIES FOR CONNECT_^1_%EQU IOTRYS(3)_#NUMBER OF IO TRIES BEFORE LOG OF FAILURE_^1_%EQU NRDERR(14)_"NOT READY ERROR CODE_^1_%EQU IOERRC(28)_"IO ERROR CODE FUNCTION_^1_%EQU CERRCO(70)_"CONNECT ERROR CODE_^1_%EQU LENERR(74)_"LENGTH ERROR_^1_%SPC 2_^1*_]_^1*_$€€SYSTEM DEPENDENT DATA_^1*_$------_^1_%EQU UNIT(0)_%MSOS AUTOLOAD DISK DRIVE UNIT FOR SMD_^1_%EQU DEVICE(14)_"STANDARD EQUIPMENT CODE_^1_%EQU CYLODN(410)_!NUMBER OF CYLINDERS FOR LOW DENSITY_^1_%EQU CYHIDN(821)_!NUMBER OF CYLINDERS FOR HIGH DENSITY_^1_%EQU SERPCY(320)_!SECTORS PER CYLINDER_^1_%EQU SERTCK(64)_"NUMBER OF SECTORS IN A TRACK_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS €€PER SECTOR_^1*_]_^1_%EQU DRCO01(1)_#OUTPUT FUNCTION CODE FOR CLEAR SEEK_^1_%EQU CRSKIN($40)_!CLEAR SEEK INITIATED BIT_^1****_]_^1_%SPC 2_^1****_]_^1*_$ANALYSIS ---_^1*_$--------_^1*_$THE A AND Q REGISTERS CONTAIN THE BUFFER ADDRESS AND THE SIZE OF_^1*_$DATA RESPECTIVELY WHEN ROUTINE IS CALLED. THE ROUTINE CAN PER-_^1*_$FORM EITHER READ OR WRITE OPERATION, THEREFORE THE CONTENT €€OF Q_^1*_$REGISTER (DATA SIZE) INDICATES READ OR WRITE BY SETTING IT TO_^1*_$POSITIVE OR NEGATIVE RESPECTIVELY. THE STANDARD ECC RECOVERY_^1*_$TECHNIQUES ARE INCORPORATED INTO THIS DRIVER. THIS DRIVER IS_^1*_$RESTRICTED TO OPERATE WITHIN THE LOWER 65K OF CORE MEMORY. THE_^1*_$EQUIPMENT CODE IS ENTERED BY OPERATOR AND SAVE IN LOCATION_^1*_$LABELLED 'GENFC' BY THE ROUTINE NAMED 'D€€SKEQC'. THE DRIVE UNIT_^1*_$IS DESIGNATED AS ONE AND 320 SECTORS ARE SET FOR A CYLINDER._^1*_$96 WORDS ARE ASSUMED TO BE IN A SECTOR._^1*_]_^1*_$A REGISTER CONTAINS ZERO (ERROR) OR NO ERROR ($FFFF) WHEN CALLER_^1*_$REGAINS CONTROL. UNDER ERROR CONDITION, Q REGISTER CONTAINS THE_^1*_$ERROR CODE AND I REGISTER CONTAINS THE DA STATUS. CONVERSELY,_^1*_$Q REGISTER IS CLEAR AND I REGI€€STER IS RESTORED UNDER NORMAL EXIT._^1*_$THIS ROUTINE DOES NOT USE WORD ADDRESSING. IN OTHER WORDS, THE_^1*_$ADDRESSING IS SECTOR ORINATED. CYLINDER SIZE IS INTERNAL SET UP_^1*_$ACCORDING TO THE DENSITY OF THE DRIVE. 410 CYLINDERS AND 821_^1*_$CYLINDERS ARE USED FOR LOW AND HIGH DENSITY RESPECTIVELY._^1*_]_^1*_$THE I/O SEQUENCES FOR THE SMD ARE:_^1*_$(1) CONNECT CU,_^1*_$(2) C€€ONNECT DRIVE AND SET MAXIMUN CYLINDER SIZE,_^1*_$(3) SEEK CYLINDER ADDRESS, AND_^1*_$(4) DATA TRANSFER._^1*_]_^1*_$IF DATA SIZE IS OVERLAPPED BETWEEN CYLINDERS, CORE AND MASS_^1*_$MEMORY ADDRESSES ARE UPDATED AND THE NEW ADDRESSES ARE USED TO_^1*_$REPEAT THE SAME I/O SEQUENCE._^1*_]_^1****_]_^1_%EJT_]_^1*_]_^1*_$----------_^1*_1CALLING SEQUENCE_^1*_$RTJ MDRIVE_^1*_$A-REGISTER = €€BUFFER ADDRESS_^1*_$Q-REGISTER = SIZE (+ FOR READ, AND - FOR WRITE )_^1*_]_^1*_*CALLER REGAINS CONTROL AT P + 1 WITH THE REGISTERS SET AS_^1*_$(1)_(NORMAL (NO ERROR)_^1*_*A = $FFFF,_^1*_*Q = ZERO, AND_^1*_]_^1*_$(2)_(ERROR CONDITION_^1*_*A = ZERO,_^1*_*Q=LAST DISK ADAPTER STATUS_9116*4356_^1*_]_^1_%EJT_]_^1*_]_^1*_*-----_$PROGRAM STARTS_^1*_]_^1_%SPC 3_^1*_$ENTRY FOR THE BASIC D€€RIVER_^1MDRIVE NOP 0_^1_%STA* BFWA_)SAVE BUFFER FWA_^1_%STQ* RDWTFG_'SAVE +(READ)/-(WRITE) FALG_^1_%SQP INCKB_(SKIP IF READ (Q) WORDS_^1_%TCQ Q_,COMPLEMENT FOR WRITE WORD COUNT_^1INCKB STQ* NWORDS_'SAVE TRANSFER LENGTH_^1_%LDA- I_,FETCH_^1_%STA* SECADD_)AND SAVE SECTOR ADDRESS_^1_%CLR Q_^1*_$CONVERT MSB/LSB TO SMD CYLINDER/TRACK/SECTOR_^1CONVRT ALS 1_^1_%LRS 1_^1_%DVI =XSER€€PCY_$DIVIDE BY SECTORS PER CYLINDER_^1_%STA* CYLIND_'SAVE CYLINDER_^1_%ENA 0_^1_%LRS 6_,MOVE SECTORS LESS THAN 64 TO A_^1_%ALS 14_+MOVE OVER FOR FORMAT (SECTOR IN LOW BYTE)_^1_%LRS 8_,TRACK TO HIGH BYTE_^1_%STA* TRASEC_'SAVE FORMATTED TRACK/SECTOR_^1_%JMP* SMDIO_^1_%SPC 2_^1BFWA_!NUM 0_,STARTING ADDRESS OF BUFFER_^1NWORDS NUM 0_,WORDS TO TRANSFER_^1RDWTFG NUM 0_,+READ/-WRIT€€E FLAG_^1SECADD NUM 0_,INITIAL SECTOR ADDRESS_^1CYLIND NUM 0_,CYLINDER ADDRESS_^1TRASEC NUM 0_,TRACK/SECTOR_^1NUM7F NUM $7FFF_(MASK WORD_^1_%EJT_]_^1*_$I/O DRIVER_^1_%SPC 2_^1*_]_^1*_*---------_"TO CONNECT CU AND START SEEK OPERATION_^1*_]_^1_%SPC 1_^1SMDIO RTJ* CON_*GO CONNECT_^1_%ENA 0_^1_%STA* IOERR_(INITIALIZE ERROR COUNTER_^1SEEK_!LDQ* GENFC_^1_%INQ 5_,SET Q FOR SEEK€€ FUNCTION_^1_%LDA* CYLIND_'FETCH CYLINDER ADDRESS_^1_%OUT REJT-*_'SEEK TO CYLINDER_^1SEKC_!RTJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP SEKD_)SKIP IF NOT BUSY_^1_%JMP* SEKC_)WAIT FOR BUSY TO DROP_^1SEKD_!ALS 12_+ALARM STATUS TO SIGN BIT_^1_%SAP SEKF_)SKIP IF NO ALARM_^1_%JMP DATALM_'GO PROCESS SEEK ALARM_^1SEKF_!INQ 1_,SET Q FOR DRIVE STATUS 2 READ_^1_%INP REJT-*_'READ €€DS 2 STATUS_^1_%ALS 11_+READY TO SIGN BIT_^1_%SAM SEKI_)SKIP IF READY_^1_%JMP CONN_)GO LOG NOT READY_^1SEKI_!ALS 4_,FAULT TO SIGN BIT_^1_%SAP SEKL_)SKIP IF NO FAULT_^1_%JMP* DATAM_^1SEKL_!ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM DATAI_(SKIP ON HAVING ON CYLINDER_^1_%JMP* SEKC_)WAIT FOR NO ALARM AND ON CYLINDER_^1_%SPC 2_^1*_*-----_"SEEK COMPLETED, DATA TRANSFER OPERATION_^1€€*_]_^1_%SPC 2_^1*_]_^1*_1CLEAR SEEK INITIATED BIT TO AVOID EXTRA SEEK_^1*_1INTERRUPT WHEN START_^1*_]_^1DATAI LDQ* GENFC_^1_%INQ DRCO01_'SET FOR CLEAR SEEK INITIATED BIT_^1_%ENA CRSKIN_^1_%EOR DRIVE_^1_%OUT REJT-*_^1_%SPC 1_^1*_$NOW SET UP FOR DATA TRANSFER_^1DATA_!LDQ* GENFC_^1_%LDA* NWORDS_^1_%OUT REJT-*_'SET UP TRANSFER BUFFER LENGTH_^1_%INQ $D_^1_%LDA* BFWA_^1_%OUT RE€€JT-*_'SET BUFFER FIRST WORD ADDRESS_^1_%INQ -6_^1_%LDA* TRASEC_^1_%OUT REJT-*_'SELECT TRACK/SECTOR_^1DATAB INQ 2_,SET Q FOR READ_^1_%LDA* RDWTFG_'FETCH READ/WRITE FLAG_^1_%SAP DATAC_(SKIP IF READ_^1_%INQ 1_,SET Q FOR WRITE_^1DATAC ENA 0_,ALWAYS DO DATA TRANSFER_^1_%OUT REJT-*_'START DATA TRANSFER_^1_%SPC 3_^1*_]_^1*_$----_'LOOP ON DATA TRANSFER OPERATION_^1*_]_^1_%SPC€€ 1_^1DATAF RTJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP DATAH_(SKIP IF NOT BUSY_^1_%JMP* DATAF_^1DATAH ALS 12_+ALARM TO SIGN BIT_^1_%SAM DATAM_(SKIP IF ALARM_^1_%ALS 1_,TRANSFER COMPLETE STATUS TO SIGN BIT_^1_%SAP DATAL_(SKIP IF NOT COMPLETE_^1_%SPC 2_^1*_$DATA TRANSFER COMPLETE_^1_%SPC 1_^1*_1DATA TRANSFER COMPLETED WITHOUT ERROR_^1*_1SET UP REGISTERS AND RETURN T€€O CALLER_^1DATAH1 RTJ CLRTDA_'CLEAR THE DA_^1_%CLR Q_,Q RETURNED 0 ON GOOD TRANSFER_^1_%SET A_,A = FFFF ON GOOD RETURN_^1_%JMP* (MDRIVE)_^1_%SPC 2_^1*_]_^1*_1DATA TRANSFER BUSY BIT DROP, CHECK FOR CONDITION_^1*_]_^1DATAL ALS 13_+END OF CYLINDER STATUS TO SIGN BIT_^1_%SAM DATAN_(SKIP IF EOC_^1DATAM JMP DATALM_'GO PROCESS DATA ALARM_^1*_$HAVE AN END OF CYLINDER WITH NO EOT_^€€1DATAN LDA* TRASEC_'FETCH STARTING TRACK SECTOR_^1_%ARS 8_,SAVE TRACK ONLY_^1_%TCA Q_^1_%INQ 4_,4 MINUS TRACK TO Q_^1_%QLS 6_,MULTIPLY BY 64 TO GET SECTORS_^1_%LDA* TRASEC_^1_%AND =N$FF_(SAVE SECTORS_^1_%TCA A_^1_%INA SERTCK_'64 - SECTOR TO A_^1_%AAQ A_,NO SECTORS TRANSFERED TO A_^1_%MUI =XWRDSEC_$CONVERT SECTORS TO WORDS TRANSFERED_^1_%STA* TEMPNW_'SAVE NO OF WORDS_^1_%L€€DA* NWORDS_'FETCH INITIAL NUMBER OF WORDS_^1_%SUB* TEMPNW_'MINUS NUMBER TRANSFERED SO FAR_^1_%SAP DATAR_(SHOULD STILL BE POSITIVE_^1*_$NUMBER OF WORDS TRANSFERED GREATER THAN REQUESTED_^1_%ENQ LENERR_'LENGTH ERROR_^1_%JMP* EREXIT_^1*_]_^1TEMPNW NUM 0_^1DATAR STA* NWORDS_'SAVE NEW NO OF WORDS TO TRANSFER_^1_%LDQ* BFWA_^1_%ADQ* TEMPNW_^1_%STQ* BFWA_)SAVE NEW BUFFER FIRST WORD ADD€€RESS_^1_%RAO* CYLIND_^1_%ENA 0_^1_%STA* TRASEC_^1_%STA* IOERR_(CLEAR THE ERROR COUNTER_^1_%RTJ* CLRTDA_'CLEAR THE DA_^1_%JMP* SMDIO_^1_%SPC 2_^1REJT_!JMP* INTREJ_^1_%ENQ 6_,EXTERNAL REJECT_^1_%JMP* EXTREJ_^1INTREJ ENQ 5_,INTERNAL REJECT_^1EXTREJ JMP* EREXIT_^1_%SPC 2_^1*_1READ DA STATUS WORD_^1DASTAT NUM 0_^1_%LDQ* GENFC_^1_%INQ 8_^1_%INP REJT-*_'READ DA STATUS_^1_%STA* €€DASTS_^1_%JMP* (DASTAT)_^1_%SPC 2_^1GENFC ADC DEVICE*128_^1IOERR NUM 0_,IO ERROR COUNTER_^1_%EJT_]_^1*-------------------------------------------------------------------_^1*_]_^1*_1ROUTINE TO CONNECT THE CU AND DRIVE UNIT 1_^1*_]_^1*-------------------------------------------------------------------_^1_%SPC 2_^1*_1CONNECT CU_^1CON_"ADC 0_^1_%ENA 0_^1_%STA* CONERR_'INITIALI€€ZE CONNECT ERROR COUNT_^1CONB_!RTJ* CLRTDA_'GO CLEAR THE DA_^1_%INQ -5_+SET FOR CONNECT FUNCTION_^1_%LDA* DRIVE_^1_%OUT REJTA-*_%CONNECT TO CU_^1COND_!RTJ* DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAP CONF_)SKIP IF NO ALARM_^1_%RTJ* ERR_*CHECK ERROR COUNT_^1_%JMP* CONB_^1CONF_!ALS 2_,CONNECT TO SIGN BIT_^1_%SAM CONG_)SKIP IF CONNECTED_^1_%JMP* COND_)WAIT FOR SELECT OR ALARM_^€€1_%SPC 2_^1*_$NOW CONNECT TO DRIVE_^1CONG_!LDQ* GENFC_^1_%INQ 3_^1_%LDA* DRIVE_^1_%OUT REJTA-*_%CONNECT TO DRIVE_^1_%RTJ* DASTAT_^1_%ALS 11_^1_%SAP CONL_)SKIP IF NO ALARM_^1_%RTJ* ERR_^1CONJ_!RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1_%JMP* CONB_^1CONL_!RTJ* CLRSTS_^1_%LDQ* GENFC_^1_%INQ 3_^1_%INP REJTA-*_%READ SELECT ACKNOWLEDGE STATUS_^1_%LDQ =XCYLODN_$0 - 410 CYLINDERS ON LO€€W DENSITY DRIVE_^1_%ALS 8_,DRIVE DENSITY TO SIGN BIT_^1_%SAP CONM_)SKIP IF LOW DENSITY DRIVE_^1_%LDQ =XCYHIDN_$0 - 821 CYLINDERS ON HIGH DENSITY DRIVE_^1CONM_!STQ NCYL_)SAVE MAX DRIVE CYLINDER_^1_%ARS 8_^1_%AND =N$F_)SAVE DRIVE SELECTED_^1_%EOR* DRIVE_^1_%SAN CONP_)SKIP IF NOT SAME AS SELECTED_^1_%LDQ* GENFC_^1_%INQ 9_^1_%INP REJTA-*_%READ DRIVE 2 STATUS_^1_%ALS 11_^1_%SA€€M CONQ_)SKIP IF READY_^1CONN_!ENQ NRDERR_'NOT READY ERROR CODE_^1_%JMP* EREXIT_^1NCYL_!NUM 0_,NUMBER OF CYLINDERS ON THIS DRIVE_^1CONP_!RTJ* ERR_^1_%JMP* CONB_^1CONQ_!ALS 4_^1_%SAM CONT_)SKIP IF FAULT BIT SET_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM CONS_)SKIP IF ON CYLINDER_^1_%JMP* CONG_)WAIT FOR ON CYLINDER OR ERROR_^1CONS_!RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1_%JMP* €€(CON)_^1_%SPC 2_^1CONT_!LDQ* GENFC_^1_%INQ $C_^1_%INP REJTA-*_%READ DRIVE FAULT STATUS_^1_%STA* DFSTS_^1_%ALS 8_^1_%SAP CONV_)SKIP IF NOT HEAD SELECT ERROR_^1_%INQ -5_^1_%ENA 0_^1_%OUT REJTA-*_%SELECT HEAD 0 TO CLEAR ERROR_^1CONV_!LDA* DFSTS_^1_%ALS 14_^1_%SAM CONW_)SKIP IF SEEK ERROR_^1_%JMP* CONJ_^1CONW_!RTJ* STSRTZ_'CLEAR STATUS WORDS WITH A RTZ SEEK_^1_%JMP* CONG_)GO €€WAIT FOR ON CYLINDER_^1_%SPC 2_^1*_$ROUTINE TO CLEAR ALL STATUS WORDS AND DO RETURN TO ZERO SEEK_^1STSRTZ ADC 0_^1_%LDQ* GENFC_^1_%INQ $C_^1_%LDA =N$F3_^1_%OUT REJTA-*_%CLEAR STATUS WORDS WITH RTZ SEEK_^1_%JMP* (STSRTZ)_^1_%EJT_]_^1_%SPC 2_^1*_]_^1*_*----_!CHECK CONNECT ERROR COUNT_^1*_]_^1_%SPC 1_^1ERR_"ADC 0_^1_%LDA* CONERR_^1_%INA -CONTRY_^1_%SAP ERR1_)SKIP IF ENOUGH E€€RROR TRIES_^1_%RAO* CONERR_^1_%JMP* (ERR)_^1ERR1_!ENQ CERRCO_'SET CONNECT ERROR CODE_^1*_1ERROR EXIT_^1EREXIT ENA 0_,A IS ZERO FOR ERROR RETURN_^1_%LDQ* DASTS_N116*4356_^1_%JMP (MDRIVE)_$RETURN WITH DA STATUS IN Q_+116*4356_^1_%SPC 2_^1CONERR NUM 0_^1CUSTS NUM 0_,LAST CU STATUS_^1DS1STS NUM 0_,LAST DRIVE 1 STATUS_^1DFSTS NUM 0_,LAST DRIVE FAULT STATUS_^1DASTS NUM 0_,LA€€ST DA STATUS_^1DRIVE ADC UNIT_)LOGICAL DRIVE NUMBER_^1_%SPC 2_^1*_$ROUTINE TO CLEAR ALL STATUS WORDS_^1CLRSTS ADC 0_^1_%LDQ* GENFC_^1_%INQ $C_^1_%ENA $73_^1_%OUT REJTA-*_%CLEAR ALL STATUS WORDS_^1_%JMP* (CLRSTS)_^1_%SPC 2_^1*_$ROUTINE TO CLEAR DA INTERRUPT STATUS_^1CLRDAS ADC 0_^1_%LDQ* GENFC_^1_%INQ 8_^1_%ENA 2_^1_%OUT REJTA-*_^1_%JMP* (CLRDAS)_^1_%SPC 2_^1*_$ROUTINE €€TO CLEAR THE DA_^1CLRTDA ADC 0_^1_%LDQ* GENFC_^1_%INQ 8_^1_%ENA 3_^1_%OUT REJTA-*_^1_%JMP* (CLRTDA)_^1_%SPC 3_^1*_1ROUTINE TO GET CU, DRIVE FAULT, AND DRIVE 1 STATUS_^1STATUS ADC 0_^1_%LDQ* GENFC_^1_%INQ $D_^1_%INP REJTA-*_%READ CU STATUS_^1_%STA* CUSTS_^1_%INQ -1_^1_%INP REJTA-*_%READ DRIVE FAULT STATUS_^1_%STA* DFSTS_^1_%INQ 2_^1_%INP REJTA-*_%READ DRIVE STATUS 1_^1_%€€STA* DS1STS_^1_%JMP* (STATUS)_^1_%SPC 2_^1REJTA JMP* REJTA1_^1REJTA2 ENQ 6_,EXTERNAL REJECT_^1_%JMP* EREXIT_^1REJTA1 ENQ 5_,INTERNAL REJECT_^1_%JMP* EREXIT_^1_%SPC 2_^1*_$ROUTINE TO CLEAR DA IF REQUIRED_^1*_$WILL RETURN AT P + 1 IF NO DA CLEAR DONE_^1*_$AT P + 2 IF CLEAR DA DONE_^1CLRDA NUM 0_^1_%LDA* DASTS_(FETCH DA STATUS_^1_%AND =N$0600_%CHECK FOR ERROR THAT REQUIRES DA €€CLEAR122*4185_^1_%SAZ CLRINT_'SKIP IF NO DA CLEAR NEEDED_^1_%RTJ* CLRTDA_'CLEAR THE DA AND STATUS_^1_%RTJ CON_*NEED TO RECONNECT AFTER CLEAR DA_^1_%RAO* CLRDA_(SET RETURN FOR P + 2_^1CLRINT JMP* (CLRDA)_^1_%EJT_]_^1*--------------------------------------------------------------------_^1*_]_^1*_1ALARM ERROR PROCESSING_^1*_]_^1*------------------------------------------------------€€--------------_^1*_]_^1*_$PROCESS ALARM ERRORS_^1DATALM RTJ* STATUS_'FETCH STATUS WORDS_^1*_$MUST CLEAR ANY CU ERROR BEFORE DOING ANY FUNCTION COMMANDS_^1_%LDA* DASTS_(FETCH DA STATUS_^1_%ALS 1_,CU ERROR TO SIGN BIT_^1_%SAP ALMN0_(SKIP IF NO CU ERROR_^1_%RTJ* CLRDAS_'CLEAR DA STATUS_^1_%RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1ALMN0 LDA* DFSTS_(FETCH DRIVE FAULT STATUS_^1_%ALS 8_,€€HEAD SELECT ERROR TO SIGN BIT_^1_%SAP ALMN1_(SKIP IF NO HEAD ERROR_^1_%LDQ GENFC_^1_%INQ 5_^1_%ENA 0_^1_%OUT REJTA-*_%SELECT HEAD 0 TO CLEAR ERROR_^1ALMN1 LDA* DFSTS_^1_%ALS 14_+SEEK ERROR TO SIGN BIT_^1_%SAM ALMN3_(SKIP IF SEEK ERROR_^1_%RTJ* CLRDA_(CLEAR DA IF NECESSARY_^1_%JMP* CKRCV_(P + 1 RETURN NO DA CLEAR. CHECK FOR RECOVERY_^1_%RTJ* CLRSTS_'P + 2 RETURN. DA CLEAR. €€CLEAR ALL STATUS WORDS_^1_%JMP* ALMN15_'GO TRY AGAIN_^1ALMN3 RTJ* CLRDA_^1_%NOP 0_,IGNORE P + 1 RETURN_^1_%RTJ* STSRTZ_'CLEAR STATUS AND DO RTZ SEEK_^1*_$WAIT FOR BUSY TO DROP AFTER SEEK_^1*_$THEN WAIT FOR NO ERROR AND ON CYLINDER_^1ALMN5 RTJ DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP ALMN7_(SKIP IF NOT BUSY_^1_%JMP* ALMN5_^1ALMN7 ALS 12_+ALARM TO SIGN BIT_^1_%SAM ALMN14_€€'SKIP IF ALARM_^1_%INQ 1_^1_%INP REJTA-*_%READ DRIVE STATUS 2_^1_%ALS 11_+UNIT READY TO SIGN BIT_^1_%SAM ALMN11_'SKIP IF READY_^1_%JMP CONN_)GIVE NOT READY ERROR_^1ALMN11 ALS 15_+ON CYLINDER TO SIGN BIT_^1_%SAM ALMN13_'SKIP IF ON CYLINDER_^1_%JMP* ALMN5_^1ALMN13 ALS 5_,FAULT ERROR TO SIGN BIT_^1_%SAP ALMN15_'SKIP IF NO FAULT_^1ALMN14 RTJ* ERRCK_(GO CHECK ERROR TRIES_^1_%JM€€P* ALMN3_^1ALMN15 RTJ* ERRCK_^1_%JMP SEEK_^1_%EJT_]_^1*_$CHECK IF HAVE RIGHT CONDITIONS FOR ERROR RECOVERY TRY_^1CKRCV LDA* CUSTS_^1_%ALS 13_+ECC ERROR BIT TO SIGN BIT_^1_%SAP CKRCV2_'SKIP IF DON T HAVE ECC ERROR_^1_%LDA RDWTFG_'READ/WRITE FLAG_^1_%SAM CKRCV2_'SKIP IF WRITE_^1_%LDA* CUSTS_^1_%AND =N$FB_^1_%SAN CKRCV2_'SKIP IF OTHER CU ERROR_^1_%LDA* DS1STS_^1_%SAZ CKRCV4_'€€SKIP IF NO DRIVE STATUS ERROR_^1CKRCV2 JMP* CKRCV6_^1CKRCV4 LDA* DFSTS_^1_%SAN CKRCV6_'SKIP IF A DRIVE FAULT ERROR_^1_%LDA DASTS_N122*4185_^1_%SAM CKRCV6_'SENSE ECC ERROR IN ADDRESS FIELD_$122*4185_^1_%LDA ECINDX_'CHECK IF ECC IS HERE_^1_%EOR =N$60_^1_%SAN CKRCV6_'SKIP IF NOT_^1_%JMP* ECCALG_'TRY ECC RECOVERY_^1CKRCV6 RTJ* CLRSTS_'CLEAR STATUS WORDS_^1_%RTJ* ERRCK_(CHECK ERRO€€R COUNT_^1_%JMP SEEK_^1_%SPC 2_^1*_1ALARM ERROR COUNT CHECK_^1ERRCK ADC 0_^1_%RAO IOERR_(INCREMENT ERROR COUNTER_^1_%LDA IOERR_^1_%INA -IOTRYS_^1_%SAP ECK_*SKIP IF ENOUGH TRIES_^1_%JMP* (ERRCK)_^1ECK_"ENQ IOERRC_'IO ERROR CODE_^1_%JMP EREXIT_'TAKE ERROR EXIT_^1_%EJT_]_^1*--------------------------------------------------------------------_^1*_]_^1*_$ERROR CORRECTION ALOGR€€ITHM TRY_^1*_]_^1*--------------------------------------------------------------------_^1_%SPC 3_^1ECCALG RTJ ECC_*GO EXECUTE ECC ALGORIHM_^1_%JMP* ECX0_)P+1 RETURN_!NOT CORRECTABLE BY ECC_^1_%LDQ GENFC_(P+I RETURN_!MAY BE CORRECTABLE_^1_%INQ 7_^1_%INP REJTC-*_%READ SECTOR AND HEAD_^1_%STA* TSA_^1_%LDA ECCA0_(FETCH UPPER ACCUMULATOR BYTE_^1_%ALS 8_^1_%EOR ECCA1_(MERGE TWO B€€YTES TOGETHER_^1_%STA* TSC_^1_%INA -7_+CHECK IF ERROR IS IN ECC_^1_%SAM ECX_*SKIP IF ERROR IS IN ECC_^1_%SUB =N192_(SEE IF WITHIN SECTOR_^1_%SAP ECX0_)MUST BE 0-198 OR ERROR_^1_%JMP* ECX3N_(GO TRY ERROR CORRECTION_^1ECX0_!JMP ECN_^1*_$ERROR IS IN ECC BYTES_^1ECX_"RTJ* ECXEOT_^1_%RTJ CLRSTS_'CLEAR THE STATUS WORDS_^1_%RTJ CLRDAS_'CLEAR DA STATUS_^1*_$CHECK FOR END OF CYLINDER€€_^1*_$MUST CHECK TRACK/SECTOR FOR EOC AS STATUS NOT SET WITH ECC_^1ECX1_!LDA* TSA_*FETCH PHYSICAL TRACK/SECTOR_^1_%AND =N$7F_(SAVE SECTOR ONLY_^1_%INA -SERTCK+1_^1_%SAZ ECX2_)SKIP IF END OF TRACK_^1_%LDA* TSA_^1_%INA 1_^1_%JMP* ECX3_^1ECX2_!LDA* TSA_^1_%ARS 8_,SAVE TRACK ONLY_^1_%INA -4_^1_%SAN ECX2A_(SKIP IF NOT EOC_^1_%JMP DATAN_(GO TREAT AS NORMAL EOC_^1ECX2A LDA* TSA_^€€1_%ARS 8_,TRACK TO LOW BYTE_^1_%INA 1_,INCREMENT TRACK_^1_%ALS 8_^1ECX3_!LDQ GENFC_^1_%INQ 7_^1_%OUT REJTC-*_%SELECT TRACK/SECTOR_^1_%JMP DATAB_(GO CONTINUE_^1ECX3N LDA TRASEC_'FETCH STARTING TRACK SECTOR_^1_%ARS 8_,SAVE STARTING HEAD_^1_%TCA Q_,MINUS HEAD TO Q_^1_%LDA* TSA_^1_%ARS 8_,CURRENT HEAD_^1_%AAQ A_,CURRENT - STARTING HEAD_^1_%JMP* ECX4_O122*4185_^1_%SPC 2_^1€€SNUM_!NUM $00FF_^1TSA_"NUM 0_,CURRENT HEAD SECTOR_^1TSB_"NUM 0_,FULL TRACKS CONVERTED TO SECTORS_^1TSC_"NUM 0_,A0, A1_^1TSN_"NUM 0_,NEW BFWA. INDEX FOR CORRECTION_^1ZERO_!NUM 0_^1_%EJT_]_^1*_$COMPUTE SECTORS TRANSFERED BEFORE ERROR_^1*_$INITIAL TRACK_(CENTER TRACKS_%END TRACK_^1*_$(64 - STARTING) + ((DELTA TRACKS - 1)*64) + (CURRENT + 1)_^1*_$COMPUTE SECTORS IN FULL CENTER€€ TRACKS_^1ECX4_!INA -1_Q122*4185_^1_%ALS 6_,*64 TO CONVERT TRACKS TO SECTORS_$122*4185_^1_%STA* TSB_^1*_$COMPUTE SECTORS IN INITIAL TRACK_^1_%LDA TRASEC_'FETCH INITIAL HEAD SECTOR_^1_%AND* SNUM_)SAVE SECTOR ONLY_^1_%TCA Q_^1*_$COMPUTE SECTORS IN END TRACK_^1_%INQ SERTCK_'64 MINUS INITIAL SECTOR_^1_%LDA* TSA_*FETCH CURRENT SECTOR HEAD_^1_%AND* SNUM_)SAVE CURRENT SECTOR ONLY_^1_€€%INA 1_^1_%AAQ A_,ADD PARTIAL STARTING AND END SECTORS_^1_%ADD* TSB_*PLUS SECTORS FROM FULL TRACKS_^1*_$CONVERT SECTORS TO WORDS_^1ECX9_!MUI =XWRDSEC_$NOW HAVE NUMBER OF WORDS TRANSFERED_^1*_$MAX 30720 WORDS PER CYLINDER. SHOULD NEVER GO INTO Q_^1_%ADD BFWA_)ADD WORDS TRANSFERED TO INITIAL BUFFER ADDRESS_^1_%INA -WRDSEC_^1_%STA* TSN_*SAVE NEW BUFFER FWA_^1_%LDA* TSC_*FETCH BYT€€E COUNT_^1_%INA 1_,GROUP PROPER BYTES TOGETHER FOR DIVISION_^1_%ARS 1_,DIVIDE BY 2 FOR WORD POINTER_^1_%INA -99_*INVERT MAGNITUDE_^1_%MUI =N$FFFE_%MULTIPLY BY MINUS 1 TO INVERT SIGN_^1_%INA 0_^1_%ADD* TSN_^1_%TRA Q_^1_%EJT_]_^1*_-DATA SECTOR_$ECC_^1*_%111_^1*_%999_-11_^1*_%876_-10987 6543210_"BYTE CORRECTION BACK POINTER_^1*_$********************************_^1*_$*BBB_-BBBBB*€€EEEEEEE*_^1*_$*000_"* * *_#11111*1234567*_!ASSOCIATED DATA BYTES AND ECC_^1*_$*000_"* * *_#88999*_%*_^1*_$*123_"* * *_#89012*_%*_^1*_$********************************_^1*_]_^1_%LDA* TSC_+FETCH OFFSET_^1_%ALS 15_+LOW BIT TO SIGN BIT_^1_%SAP ECXA_)SKIP IF BYTE COUNT EVEN_^1_%JMP* ECXE_)BYTE COUNT ODD_^1ECXA_!LDA ECCX1_(FETCH X0, X1 SYNDROME BYTES_^1_%RTJ STOECC_'MODIFY DATA IF WI€€THIN BUFFER_)122*4185_^1_%LDA* TSC_^1_%INA -8_^1_%SAZ ECXC_)SKIP IF INTO SYNC BYTES_^1_%INQ 1_^1_%LDA ECCX2_(FETCH X2, X3 SYNDROME BITS_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_)122*4185_^1ECXC_!JMP* ECXH_^1REJTC JMP* REJTC1_'INTERNAL REJECT_^1_%JMP REJTA2_'EXTERNAL REJECT_^1REJTC1 JMP REJTA1_^1_%EJT_]_^1*_$BYTE COUNT IS ODD_^1ECXE_!LDA ECCX1_(FETCH X0, X1 SYNDROME BIT€€S_^1_%ARS 8_,SAVE X0_^1_%AND* SNUM_)ZERO OUT TOP BYTE_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_)122*4185_^1_%LDA* TSC_^1_%INA -7_^1_%SAZ ECXH_)SKIP IF INTO ECC BYTES_^1_%INQ 1_^1_%LDA ECCX1_(MUST USE BYTES 1 AND 2_^1_%AND* SNUM_)SAVE BUTE 1_^1_%EOR ECCX2_(HAVE BYTES 2 AND 1_^1_%ALS 8_,NOW 1 AND 2_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_)122*4185_^1ECXH_!JMP* ECX_€€*GO CHECK EOT, EOC_^1ECXEOT ADC 0_^1_%LDA DASTS_^1_%ALS 12_^1_%SAP ECXJ_)SKIP IF NOT EOT_^1_%JMP DATAH1_'GO COMPLETE_^1ECXJ_!JMP* (ECXEOT)_^1_%SPC 1_R122*4185_^1_%SPC 1_R122*4185_^1*_'ROUTINE TO DETERMINE IF STORE ADDR FOR ECC CORRECT'N_!122*4185_^1*_+IS IN BUFFER AND STORE CORRECTION IF IT IS._'122*4185_^1*_)ENTRY - Q=STORE ADDRESS_=122*4185_^1*_1A=CORRECTION_@122*4185_^1_%€€SPC 1_R122*4185_^1STOECC 0_"0_R122*4185_^1_%STA* ECCORR_'SAVE CORRECTION_6122*4185_^1_%LDA BFWA_O122*4185_^1_%ADD NWORDS_'CALC.LAST WORD+1(ELSTWD)_-122*4185_^1_%SQM STO2_O122*4185_^1_%SAP STO1_O122*4185_^1_%JMP* STO3_)(Q+,A-),OK_;122*4185_^1STO1_!TCA A_,(Q+,A+)_>122*4185_^1_%AAQ A_R122*4185_^1_%SAM STO3_)SENSE OK_=122*4185_^1_%JMP* STO4_O122*4185_^1STO2_!SAP STO4_)SENSE OU€€TSIDE BUFFER(Q-,A+)_*122*4185_^1_%TCA A_,(Q-,A-)_>122*4185_^1_%AAQ A_R122*4185_^1_%SAM STO4_)SENSE OUTSIDE BUFFER_1122*4185_^1STO3_!LDA* ECCORR_M122*4185_^1_%EOR* (ZERO),Q_$MAKE CORRECTION_6122*4185_^1_%STA* (ZERO),Q_K122*4185_^1_%JMP* (STOECC)_K122*4185_^1STO4_!JMP* ECXH_)EXIT ECC LOGIC IF CORREC'N OUTSIDE BUF122*4185_^1ECCORR NUM 0_R122*4185_^1_%EJT_]_^1*_$TRY OFFSET RECOVERY€€ TECHNIQUES_^1*_$NOT CORRECTABLE BY ECC_^1ECN_"RTJ CLRSTS_'CLEAR ALL STATUS WORDS_^1_%RTJ CLRDAS_'CLEAR DA STATUS_^1_%LDA* OFFIND_'FETCH JUMP TABLE INDEX_^1_%SAN ECNB_)SKIP IF NOT INITIAL TIME_^1_%STA* OFFVAL_'INITIALIZE OFFSET VALUE_^1_%ENA 1_^1ECNB_!TRA Q_^1_%INA -9_+CHECK FOR END OF TRIES_^1_%SAP ECNC_)SKIP IF NO MORE COMBINATIONS TO TRY_^1_%LDA* OFFVAL_^1_%ADD* OFFSET_^1€€_%STA* OFFVAL_^1_%JMP* TBLSRT-1,Q_^1ECNC_!JMP ECK_*GO DETERMINE AND LOG ERROR_^1*_$JUMP TABLE FOR ERROR CORRECTION TRIES_^1*_$TABLE MUST REMAIN IN ORDER_^1TBLSRT JMP* TPOO_^1_%JMP* TMOO_^1_%JMP* TOOM_^1_%JMP* TOOP_^1_%JMP* TPOP_^1_%JMP* TMOP_^1_%JMP* TPOM_^1_%JMP* TMOM_^1*_$END OF JUMP TABLE_^1RDRCON NOP 0_,DO READ/ RECOVERY WITH WHAT IS IN A_^1_%LDQ GENFC_^1_%INQ $C_^1_%OUT R€€EJTC-*_^1*_$MUST WAIT FOR DA TO DROP BUSY IF SEEK WAS INITIATED_^1RDRA01 RTJ DASTAT_'READ DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP RDRA02_'SKIP IF NOT BUSY_^1_%JMP* RDRA01_'WAIT FOR BUSY TO DROP_^1RDRA02 INQ 1_,SET FOR DRIVE STATUS 2 READ_^1RDRA_!INP REJTC-*_%READ DS2_^1_%ALS 11_+READY TO SIGN BIT_^1_%SAM RDRC_)SKIP IF READY_^1_%JMP CONN_)GO RECORD ERROR_^1RDRC_!ALS €€4_,FAULT TO SIGN BIT_^1_%SAM RDRD_)SKIP IF FAULT_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM RDRE_)SKIP IF ON CYLINDER_^1_%JMP* RDRA_)WAIT FOR ERROR OR ON CYLINDER_^1RDRD_!JMP* ECN_*QUIT ON THIS TRY_^1RDRE_!JMP* (RDRCON)_^1*_$TIMING POSITIVE, OFFSET OFF_^1TPOO_!LDA =N$8000_%SET TIMING EARLY BIT_^1TPOOA RTJ* RDRCON_^1_%RAO OFFIND_'INCREMENT JUMP TABLE INDEX_^1_%JMP DATA_)GO T€€RY AGAIN_^1*_$TIMING MINUS, OFFSET OFF_^1TMOO_!ENA 0_^1_%STA OFFVAL_'CLEAR OFFSET INCREMENT_^1_%LDA =N$4000_%FETCH BIT FOR TIMING MINUS_^1_%JMP* TPOOA_^1*_$TIMING OFF,OFFSET POSITIVE_^1TOOP_!LDA* OFFVAL_'FETCH CURRENT INCREMENT_^1_%ALS 8_^1_%EOR =N$2000_%SET FOR OFFSET POSITIVE_^1TOOP1 RTJ* RDRCON_^1_%LDA* OFFVAL_'CHECK IF TIME TO INCREMENT COMBINATION_^1_%ADD* OFFSET_^1_%INA€€ -16_^1_%SAM TOOP4_(SKIP IF ANOTHER LOOP FOR THIS ONE_^1_%ENA 0_^1_%STA* OFFVAL_'CLEAR OFFSET VALUE_^1_%RAO* OFFIND_'INCREMENT JUMP TABLE POINTER_^1TOOP4 JMP DATA_^1*_$TIMING POSITIVE, OFFSET POSITIVE_^1TPOP_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$A000_%SET OFFSET AND TIMING POSITIVE_^1_%JMP* TOOP1_^1*_$TIMING MINUS, OFFSET PLUS_^1TMOP_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$6000_%SET€€ OFFSET POSITIVE AND TIMING NEGATIVE_^1_%JMP* TOOP1_^1*_$TIMING OFF, OFFSET MINUS_^1TOOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$1000_%SET OFFSET MINUS_^1_%JMP* TOOP1_^1*_$TIMING POSITIVE, OFFSET MINUS_^1TPOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$9000_%OFFSET MINUS AND TIMING POSITIVE_^1_%JMP* TOOP1_^1*_$TIMING MINUS, OFFSET MINUS_^1TMOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$5000_%OFFSET M€€INUS AND TIMING MINUS_^1_%JMP* TOOP1_^1OFFIND NUM 0_,JUMP TABLE INDEX_^1OFFVAL NUM 0_,CURRENT VALUE OF OFFSET INCREMENT_^1OFFSET NUM 15_+FIXED VALUE OF OFFSET INCREMENT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$SUBROUTINE TO COMPUTE ECC OFFSET AND CORRECTION VALUES_^1*_]_^1*****************************************************€€*******************_^1*_]_^1*_1RETURNS TO P + 1 IF UNCORRECTABLE_^1*_1RETURNS TO P + 2 IF CORRECTABLE_^1_%SPC 3_^1ECC_"NOP 0_^1_%ENA 22_^1_%STA* ECCK_)INITIALIZE SHIFT COUNT_^1_%ENA 1_^1_%STA* ECCS_)INITIALIZE S SWITCH_^1_%LDA* NUMB0_^1_%STA* ECCA2_(INITIALIZE BYTE ACCUMULATOR_^1_%ENA 0_^1_%STA* ECCA0_^1_%STA* ECCA1_^1_%STA* ECCI_^1POHI_!LDQ GENFC_^1_%INQ $B_^1_%INP REJTB-*€€_%READ ECC CONDITION STATUS_^1_%ALS 8_,P0 HIGH NEQ 0 TO SIGN BIT_^1_%SAM SHI_*SKIP IF STILL HIGH BITS_^1_%JMP* NO_+ALL BITS ARE IN 0 - 11_^1SHI_"LDA* ECCK_^1_%SAN SHIFT_(SKIP IF NOT 22 SHIFTS YET_^1_%JMP* (ECC)_(NOT CORRECTABLE WITHIN 22 SHIFTS. RETURN P+1_^1SHIFT INA -1_+DECREMENT SHIFT COUNTER_^1_%STA* ECCK_^1_%ENA $20_*SHIFT PO COMMAND FUNCTION BITS_^1_%OUT REJTB-*_%ECC C€€ONTROL FUNCTION_^1FETCHI LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1ADDA_!RTJ ADD_*FETCH AND ADD POLYNOMIAL CONSTANT_^1_%SQM S1_+SKIP IF HAVE CARRY FROM HIGH BYTE_^1_%ENA $60_*INDEX TO FETCH MODULUS FOR ADD_^1_%JMP* ADDA_)GO ADD MODULUS_^1S1_#LDA* ECCS_)FETCH S SWITCH_^1_%SAZ U_^1_%JMP* POHI_)GO CHECK PO AGAIN_^1NO_#ENA $54_^1_%STA* ECCI_)SET NEW POLYNOMIAL INDEX_^1_%ENA 89_^1_%STA*€€ ECCK_)SET NEW SHIFT COUNTER VALUE_^1U_$LDQ GENFC_^1_%INQ $B_^1_%INP REJTB-*_%READ IN THE ECC CONDITION STATUS_^1_%STA* ECCC_)SAVE CONDITION STATUS_^1*_$COMPUTE U VALUE FOR SWITCH CHECK_^1_%ALS 1_,MULTIPLY CONDITION STATUS BY 2_^1_%EOR* ECCC_^1_%AND =N$54_^1_%SAZ UZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. PARITY. RETURN AT P+1_^1_%SPC 2_^1NUMB0 NUM $B0_^1NUME0 NUM $E0_^1ECCK€€_!NUM 0_,SHIFT COUNTER_^1ECCI_!NUM 0_,INDEX INTO POLYNOMIAL TABLE_^1_%SPC 2_^1UZERO STA* ECCS_)SET S SWITCH TO ZERO_^1_%LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1_%AND* ECCC_)AND WITH CONDITION STATUS_^1_%STA* ECCI_^1_%SAZ IZERO_^1_%LDA* ECCK_^1_%INA -1_+DECREMENT COUNTER_^1_%SAN SH123_(SKIP TO SHIFT IF NOT ZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. RETURN AT P+1_^1REJTB JMP* REJTI_^1€€_%JMP REJTA2_'EXTERNAL REJECT_^1REJTI JMP REJTA1_'INTERNAL REJT_^1SH123 STA* ECCK_)RESTORE K COUNTER_^1_%ENA $10_*COMMAND TO SHIFT P1,2,3 POLYNOMIAL REGISTERS_^1_%OUT REJTB-*_%SHIFT P1,2,3_^1_%JMP* FETCHI_'GO FETCH INDEX AND ADD_^1IZERO STA* ECCX2_(ZERO OUT X2, X3 SYNDROME BYTES_^1_%STA* ECCX1_(ZERO OUT X0, X1 SYNDROME BITS_^1_%STA* ECCI_)ZERO J SWITCH_^1_%LDA* ECCA1_^1_%ALS€€ 8_^1_%EOR* ECCA2_(A HAS LOWER 2 ACCUMULATOR BYTES_^1_%LDQ* ECCA0_(Q HAS HIGH BYTE_^1_%LLS 8_^1_%LRS 7_,LEFT SHIFT ACCUMULATOR 1_^1_%SQP NOCARY_'SKIP IF NO CARRY_^1_%JMP* (ECC)_^1NOCARY STQ* ECCA0_^1_%ENQ 0_^1_%LLS 8_,MOVE MIDDLE BYTE TO Q_^1_%STQ* ECCA1_(RESTORE_^1_%ALS 8_^1_%STA* ECCA2_(SAVE LOW BYTE_^1NEXT_!LDA* ECCA2_^1_%SAZ A2ZRO_(SKIP IF A2 IS ZERO_^1_%ADD* NUME0_(ADD€€ HEX 00E0_^1_%AND* NUMFF_(IGNORE ANY CARRY_^1_%STA* ECCA2_^1_%JMP* SHPO_^1A2ZRO LDA* ECCS_^1_%SAZ S2ZRO_(SKIP IF S SWITCH ZERO_^1_%JMP* END_^1_%SPC 2_^1NUMFF NUM $FF_^1ECCD_!NUM 0_^1ECCS_!NUM 0_,S SWITCH_^1ECCC_!NUM 0_,ECC_^1*_$CORRECTION BYTES_^1ECCX1 NUM 0_,SYNDROME BYTES X0, X1_^1ECCX2 NUM 0_,SYNDROME BYTES X2, X3_^1*_$ACCUMULATOR BYTES_^1ECCA0 NUM 0_,HIGH ORDER BY€€TE_^1ECCA1 NUM 0_,MIDDLE BYTE_^1ECCA2 NUM 0_,LOW BYTE_^1_%SPC 2_^1S2ZRO LDA* NUME0_^1_%STA* ECCA2_(SET A 2 TO $E0_^1_%LDQ GENFC_^1_%INQ $B_^1_%INP REJTB-*_%READ IN CONDITION STATUS_^1_%ALS 8_,P0 HIGH NEQ 0 TO SIGN BIT_^1_%SAP P0HZRO_'SKIP IF P0 HIGH IS ZERO_^1_%JMP* END_*GO DUMP SYNDROME BITS_^1*_$A0 A1 MINUS 1_^1P0HZRO LDA* ECCA0_(DO A0A1-1_^1_%ALS 8_^1_%EOR* ECCA1_^1_€€%INA -1_^1_%ENQ 0_^1_%LLS 8_^1_%STQ* ECCA0_^1_%ALS 8_^1_%STA* ECCA1_^1*_$SHIFT P0_^1SHPO_!LDQ GENFC_^1_%INQ $B_^1_%ENA $20_*SET A TO SHIFT PO COMMAND_^1_%OUT REJTB-*_%ECC CONTROL. SHIFT PO_^1_%JMP* NEXT_^1END_"LDA* NUME0_^1_%STA* ECCA2_^1_%ENA 1_^1_%STA* ECCS_)SET S SWITCH TO 1_^1*_$GET D VALUE. ECC DATA BYTE_^1_%LDQ GENFC_^1_%INQ $A_^1_%INP REJTB-*_%READ ECC PATTERN_^1€€_%STA* ECCD_^1*_$BRANCH OFF VALUE OF J SWITCH_^1_%LDA* ECCI_^1_%INA -1_^1_%SAM LOOPA_(SKIP IF WAS 0_^1_%SAN LOOPC_(J WAS 2_^1_%JMP* LOOPB_(WAS 1_^1*_$J SWITCH 2_^1LOOPC LDA* ECCD_)FETCH ECC PATTERN_^1_%ALS 8_,MOVE TO UPPER BYTE_^1_%AND* ECCX2_(AND INTO X2 SYNDROME BYTE. X3 UNCHANGED_^1_%STA* ECCX2_(RESTORE BYTES X2, X3_^1_%RAO ECC_*INCREMENT RETURN FOR P+2_^1_%JMP (ECC)_^1*_€€$J SWITCH 0_^1LOOPA LDA* ECCX1_(FETCH X0, X1 BYTES_^1_%ALS 8_,NOW X1, X0_^1_%LDQ* ECCD_)FETCH ECC PATTERN_^1_%LRS 8_,A HAS ECC PATTERN, X1_^1SAVEIT STA* ECCX1_(RESTORE X0, X1_^1_%RAO ECCI_)INCREMENT SWITCH_^1_%JMP* SHPO_)GO SHIFT PO AGAIN_^1*_$J SWITCH 1_^1LOOPB LDA =N$FC00_^1_%STA* ECCX2_(SET X2 TO $FC, X3 TO ZERO_^1_%LDA* ECCX1_^1_%AND =N$FF00_%SAVE X0 BYTE_^1_%EOR* ECCD_€€)OR IN ECC PATTERN_^1_%JMP* SAVEIT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$ROUTINE TO ADD POLYNOMIAL CONSTANT TO THREE BYTE ACCUMULATOR_^1*_$WILL FIRST CALCULATE INDEX INTO CONSTANT TABLE_^1*_$WILL THEN DO THE BYTE BY BYTE ADDITION_^1*_$IF A CARRY OCCURS FROM THE HIGH ORDER BYTE Q WILL BE SET NEGATIVE_^1*_]_^1*****************€€*******************************************************_^1*_]_^1*_$ON ENTRY A CONTAINS THE INDEX TO THE CONSTANT TABLE_^1_%SPC 3_^1ADD_"NOP 0_,A CONTAINS THE POLYNOMIAL INDEX_^1_%STA* ECIN_)SAVE INDEX SEARCHING FOR_^1_%ENQ 8_,INITIALIZE INDEX_^1FLOOP EOR* ECINDX,Q_$CHECK FOR INDEX MATCH_^1_%SAZ FOUND_(SKIP IF MATCH_^1_%INQ -1_+DECREMENT COUNT_^1_%SQM NOMATH_'SKIP IF NO MATCH€€ FOUND_^1_%LDA* ECIN_)FETCH INDEX SEARCHING FOR_^1_%JMP* FLOOP_^1NOMATH JMP (ECC)_(ASSUME NOT CORRECTABLE_^1FOUND TRQ A_^1_%MUI =N3_*MULTIPLY BY THREE_^1_%TRA Q_,SET INDEX FOR CONSTANT TABLE_^1_%LDA* ECCA2_(FETCH LOW BYTE OF ACCUMULATOR_^1_%ADD* ECONST,Q_$ADD TABLE CONSTANT_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDM_)SKIP IF NO CARRY_^1_%RAO* ECCA1_(INCR€€EMENT NEXT BYTE FOR CARRY_^1_%AND* NUMFF_(SAVE ONLY LOW BYTE_^1ADDM_!STA* ECCA2_^1_%LDA* ECCA1_(FETCH NEXT BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_$ADD CONSTANT_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDB_)SKIP IF NO CARRY_^1_%RAO* ECCA0_(INCREMENT NEXT HIGHEST BYTE_^1_%AND* NUMFF_^1ADDB_!STA* ECCA1_(SAVE IN ACCUMULATOR_^1_%LDA* ECCA0_(FETC€€H HIGH ACCUMULATOR BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDC_)SKIP IF NO CARRY_^1_%AND* NUMFF_^1_%SET Q_,SET Q NEGATIVE FOR CARRY FROM HIGH BYTE_^1ADDC_!STA* ECCA0_^1_%JMP* (ADD)_^1ECIN_!NUM 0_^1_%SPC 3_^1*_$INDICES TO CONSTANTS_^1ECINDX NUM_"$60_^1_%NUM_"$00_^1_%NUM_"$04_^1_%NUM_"$10_^1_%NUM_"$1€€4_^1_%NUM_"$40_^1_%NUM_"$44_^1_%NUM_"$50_^1_%NUM_"$54_^1*_$CONSTANTS_!MUST REMAIN IN ORDER_^1ECONST NUM_"$20_(INDEX 60_#MODULUS_^1_%NUM_"$EE_^1_%NUM_"$8E_^1_%NUM_"$D0_(INDEX 00_#LOW_^1_%NUM_"$8D_5MIDDLE_^1_%NUM_"$91_5HIGH BYTE_^1_%NUM_"$A0_(INDEX 04_^1_%NUM_"$36_^1_%NUM_"$AF_^1_%NUM_"$A0_(INDEX 10_^1_%NUM_"$09_^1_%NUM_"$B3_^1_%NUM_"$60_(INDEX 14_^1_%NUM_"$2E_^1_%NUM_"$F1_^1_%NUM_"$€âA0_(INDEX 40_^1_%NUM_"$55_^1_%NUM_"$EE_^1_%NUM_"$40_(INDEX 44_^1_%NUM_"$8C_^1_%NUM_"$9D_^1_%NUM_"$40_(INDEX 50_^1_%NUM_"$5F_^1_%NUM_"$A1_^1_%NUM_"$00_(INDEX 54_^1_%NUM_"$84_^1_%NUM_"$DF_^1*_$END OF CONSTANT TABLE_^1_%END_]_^__âPSMDTGS CSY/ C95 P€1_%NAM SMDTGS_'DECK-ID C95 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1976_^1*_]_^1*_$BOOT ROUTINE TO WRITE ADDRESS TAGS AND DATA ON SMD PACKS_^1*_]_^1*_*ON ENTRY A CONTAINS THE DRIVE LOGICAL NUMBER_^1*_3Q CONTAINS THE EQUIPMENT CODE WES. S = 0_^1*_3IF Q IS ZERO E IS ASSUMED T€€O BE 3_^1*_]_^1_%SPC 2_^1***_"PURPOSE ---_^1*_$------_^1*_$SMDTGS IS A STATUS DRIVEN PROGRAM WHICH IS USED TO WRITE ADDRESS_^1*_$TAGS AND BACKGROUND THE DISK PACK WITH DATA PATTERN, 'AB'._^1*_]_^1*_]_^1****_!******_^1*_$ENTRY POINT_^1*_$******_^1*_]_^1_%ENT SMDTGS_^1*_]_^1*_$******_^1*_$SYSTEM EQUIVALENCE DATA_^1*_$******_^1*_]_^1_%EQU ESCODE($0700) EQUIPMENT, STATION CODES (E=€€14, S=0)_^1_%EQU TRKCYL(5)_#NUMBER OF TRACKS/CYLINDER_^1_%EQU SECTCK(64)_"NUMBER OF SECTORS PER TRACK_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS/SECTOR_^1_%EQU CYLODN(410)_!NUMBER OF CYLINDERS FOR LOW DENSITY_^1_%EQU CYHIDN(821)_!NUMBER OF CYLINDERS FOR HIGH DENSITY_^1_%EQU SEEKER(10)_"ALLOWED SEEK ERROR COUNTS_^1_%EQU CONTER(10)_"ALLOWED CONNECT ERROR COUNTS_^1*_]_^1****_]_^1_%SPC€€ 2_^1****_]_^1*_$ANALYSIS ---_^1*_$--------_^1*_$THE DRIVE NUMBER FOR WHICH TAG TO BE WRITTEN IS SET IN A REGISTER_^1*_$AT ENTRY._"Q-REGISTER IS SET TO ZERO IF EQUIPMENT CODE IS 3._^1*_$OTHERWISE Q-REGISTER MUST CONTAIN THE EQUIPMENT CODE IN BITS_^1*_$7-10. THE STATION IS SET TO ZERO._^1*_]_^1*_$THE DISK PACK ADDRESSING ASSIGNMENTS ARE:_^1*_$(1) 5 TRACKS IN A CYLINDER,_^1*_$(2) 6€€4 SECTORS IN A TRACK, AND_^1*_$(3) 96 WORDS IN A SECTOR._^1*_$NUMBER OF CYLINDERS OF THE PACK IS SET INTERNALLY BY THIS ROUTINE_^1*_$ACCORDING TO THE DESITY. 410 CYLINDERS ARE SET FOR LOW DENSITY_^1*_$WHILE 821 IS SET FOR HIGH DENSITY._^1*_]_^1*_$A BUFFER OF SIZE 320 WORDS (5 TIMES 64 SECTORS) IS SET-UP FOR_^1*_$ADDRESS TAG DATA (PER TRACK). THE FIVE WORDS WHICH ARE THE_^1*_$SECT€€OR DATA ARE SHOWN IN THE FOLLOWING:_^1*_]_^1*_$WORD 1 FLAG BYTE_^1*_$WORD 2 FLAG BYTE_^1*_$WORD 3 CYLINDER ADDRESS (BITS 0-9)_^1*_$WORD 4 BITS 10-8 = TRACK ADDRESS BITS 0-6 SECTOR_!,_^1*_,BIT 7 IS SET IF LAST SECTOR OF A TRACK._^1*_$WORD 5 BITS 15-8 = NUMBER OF BYTE PER SECTOR MINUS ONE._^1*_]_^1*_$ADDRESS TAG DATA IS WRITTEN WITH A TRACK FOR EACH WRITE OPERATION_^1*_$UNTIL ALL CYL€€INDERS ARE COMPLETED. THEN THE PACK IS FILLED WITH_^1*_$THE 2 CHARACTERS/WORD DATA. THE 2 CHARACTERS ARE 'AB'._^1*_]_^1*_$COMPUTER HALT WITH BOTH A AND Q-REGISTERS SET TO ZERO WHEN_^1*_$DONE WITHOUT ERROR. '$FFFF' IS DISPLAYED ON BOTH A AND Q-REG._^1*_$WHEN ERROR IS DETECTED._^1*_]_^1****_]_^1*_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1SMD€€TGS STA* DRIV_)SAVE LOGICAL DRIVE NUMBER_^1_%SQN USEQ_)SKIP IF EQUIPMENT CODE INPUT_^1_%LDQ =XESCODE_$NO, SO USE EQUIP NO 3_^1USEQ_!STQ* EQUIPC_^1_%ENA 0_^1_%STA* SECTOR_^1_%STA* TRACK_(INITIALIZE TRACK_^1_%STA* CYLIND_'INITIALIZE CYLINDER_^1_%RTJ BUFINT_'INITIALIZE BUFFER_^1_%RTJ SETFWA_'SET THE FIRST WORD ADDRESS OF THE BUFFER_^1_%RTJ* CLRTDA_'GO CLEAR THE DA_^1_%RTJ SELECT€€_^1_%SPC 2_^1*_$SET UP CYLINDER WORD SELECT WAS OK_^1DRIOK RTJ CYLUP_^1_%LDA =N$80_^1_%STA* ADORDA_'SET FOR ADDRESS WRITE_^1_%LDA BUFLN_^1_%STA* BUFFSZ_'SET BUFFER LENGTH FOR 1 TRACK OF ADDRESSES_^1SETT_!RTJ TRKSET_'GO SETUP TRACK IN THE BUFFER_^1*_$NOW DO THE WRITE_^1_%RTJ* WRITE_^1ALMOK LDA* TRACK_^1_%INA -TRKCYL+1_^1_%SAP NEWCYL_^1_%RAO* TRACK_(INCREMENT TRACK_^1_%JMP*€€ SETT_^1NEWCYL ENA 0_^1_%STA* TRACK_^1_%LDA* CYLIND_^1_%SUB* NCYLIN_^1_%SAP TGSDN_(SKIP IF ALL CYLINDERS DONE_^1_%RAO* CYLIND_'INCREMENT CYLINDER_^1_%JMP* DRIOK_^1_%SPC 2_^1*_]_^1*_1ADDRESS TAGS BEEN WRITTEN, WRITE DATA PATTERN_^1*_]_^1_%SPC 2_^1TGSDN ENA 0_^1_%STA* SECTOR_^1_%STA* TRACK_^1_%STA* CYLIND_^1_%STA* ADORDA_'SET FOR WRITE DATA_^1_%SPC 1_^1*_1FILL BUFFER WITH 'AB€€'_^1_%LDQ =XBUFSIZ_$SET BUFFER FOR 1 TRACK_^1_%STQ* BUFFSZ_^1_%LDA =AAB_)DATA PATTERN_^1SETST INQ -1_^1_%STA ABUF,Q_^1_%SQZ SETDA_(SKIP IF BUFFER IS ALL SET_^1_%JMP* SETST_^1_%SPC 2_^1*_]_^1*_1TO WRITE DATA AND CHECK IF ALL DONE_^1*_]_^1_%SPC 1_^1SETDA RTJ* WRITE_(GO DO IO_^1DA03_!LDA* TRACK_^1_%INA -TRKCYL+1_^1_%SAP DA05_)SKIP IF END OF CYLINDER_^1_%RAO* TRACK_^1_%JMP* €€SETDA_^1DA05_!LDA* CYLIND_^1_%SUB* NCYLIN_'SKIP IF NOT END OF DISK_^1_%SAP ALLCYL_'SKIP IF END OF DISK_^1_%RAO* CYLIND_^1_%ENA 0_^1_%STA* TRACK_^1_%STA* SECTOR_^1DA06_!JMP* SETDA_^1_%SPC 2_^1*_]_^1*_1ALL DONE_^1*_]_^1*_81 CARD DELETED_7116*4301_^1ALLCYL RTJ* CLRTDA_'CLEAR DA, DESELECT CU_^1_%ENA 0_R116*4301_^1_%ENQ 0_^1_%SLS 0_^1_%NUM $18FE_(------ HANG WITHOUT ERROR_^1_%EJ€€T_]_^1*_]_^1*_,-----_#SUBROUTINES_^1*_]_^1_%SPC 1_^1RDDAST NUM 0_,READ DA STATUS_^1_%LDQ* EQUIPC_^1_%INQ 8_^1_%NOP 0_^1_%INP -1_^1_%STA* DASTAT_'SAVE DA STATUS_^1_%JMP* (RDDAST)_^1_%SPC 2_^1*_$CLEAR DA_^1CLRTDA NOP 0_^1_%LDQ* EQUIPC_^1_%INQ 8_^1_%ENA 3_,CLEAR DA_^1_%OUT -1_+DIRECTOR FUNCTION_^1_%JMP* (CLRTDA)_^1_%SPC 2_^1CLRTCU NOP 0_^1_%LDQ* EQUIPC_^1_%INQ $C_^1_%ENA €€ 1_^1_%OUT -1_^1_%JMP* (CLRTCU)_^1_%SPC 2_^1CLRSTS NOP 0_^1_%LDQ* EQUIPC_^1_%INQ $C_^1_%ENA $73_^1_%OUT -1_^1_%JMP* (CLRSTS)_^1_%SPC 2_^1NCYLIN NUM 0_^1DSTAT2 NUM 0_^1FAULTS NUM 0_^1CUSTAT NUM 0_^1DSTAT1 NUM 0_^1FWA_"NUM 0_^1DASTAT NUM 0_,DISK ADAPTER STATUS_^1EQUIPC ADC ESCODE_'EQUIP 14_^1DRIV_!NUM 0_^1TRACK NUM 0_^1CYLIND NUM 0_^1SECTOR NUM 0_^1BUFFSZ NUM 0_,€€BUFFER SIZE_^1ADORDA NUM 0_,ADDRESS OR DATA_^1_%EJT_]_^1*_]_^1*_1ROUTINE TO WRITE DATA TO DISK PACK_^1*_]_^1_%SPC 2_^1*_1(1) SEEK OPERATION_^1*_]_^1WRITE NOP 0_^1_%ENA 0_^1_%STA* SEKCNT_'CLEAR SEEK ERROR COUNTER_^1SEEKA LDQ* EQUIPC_^1_%INQ 5_^1_%LDA* CYLIND_'FETCH CYLINDER ADDRESS_^1_%OUT -1_+DO LOAD ADDRESS (CYLINDER SEEK FUNCTION)_^1CHKST RTJ* RDDAST_'GET DA STSTUS_^1_€€%ALS 11_+ALARM TO SIGN BIT_^1_%SAP SEEKD_(SKIP IF NO ALARM ERROR_^1_%JMP* SEEKZ_^1SEEKD LDQ* EQUIPC_'CHECK DRIVE 2 STATUS_^1_%INQ 9_^1_%NOP 0_^1_%INP -1_^1_%ALS 15_+FAULT TO SIGN BIT_^1_%SAM SEEKZ_(SKIP IF FAULT_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM SEEKF_(SKIP IF ON CYLINDER_^1_%JMP* CHKST_^1SEEKF ALS 1_,READY TO SIGN BIT_^1_%SAM OUTSET_'SKIP IF READY_^1_%SPC 2€€_^1SEEKZ RAO* SEKCNT_^1_%LDA* SEKCNT_^1_%INA -SEEKER_^1_%SAM SEEKZ1_'SKIP IF NOT ALL TRIES_^1_%JMP EHALT_(GO TO ERROR STOP_^1SEKCNT NUM 0_,NUMBER OF SEEK ERROR TRIES_^1SEEKZ1 RTJ* CLRSTS_^1_%RTJ* CLRTDA_^1_%RTJ* SELECT_^1_%JMP* SEEKA_^1_%SPC 5_^1*_]_^1*_1(2) DATA TRANSFER_^1*_]_^1OUTSET LDA* BUFFSZ_'FETCH BUFFER SIZE_^1_%LDQ* EQUIPC_^1_%OUT -1_+SET BUFFER LENGTH REGISTER_^€€1_%LDA* FWA_*FETCH FIRST WORD ADDRESS OF BUFFER_^1_%INQ $D_^1_%NOP 0_^1_%OUT -1_+SET FWA LOWER_^1_%LDQ* EQUIPC_^1_%INQ 7_^1_%LDA* TRACK_(FETCH TRACK_^1_%ALS 8_,CONVERT TO FORMAT_^1_%EOR* SECTOR_^1_%NOP 0_^1_%OUT -1_+SELECT TRACK_^1_%RTJ* RDDAST_'GET DA STATUS_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAP OUTEX_(SKIP IF NO ALARM_^1_%JMP* SEEKZ1_'GO PROCESS ERROR_^1_%SPC 2_^1OUTEX €€ LDA* ADORDA_'WRITE ADDRESS OR DATA_^1_%LDQ* EQUIPC_^1_%INQ $A_^1_%NOP 0_^1_%OUT -1_+WRITE_^1CKSTA RTJ* RDDAST_'GET DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP BSYDN_(SKIP IF NOT BUSY_^1_%JMP* CKSTA_(WAIT FOR BUSY TO DROP_^1BSYDN LDA* DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAM WRALM_(SKIP IF ALARM_^1_%ALS 1_,CHECK IF TRANSFER COMPLETED_^1_%SAM WOK_*YES, SKIP_^1_%ALS€€ 13_+CHECK FOR EOC (END OF CYLINDER)_^1_%SAP WRALM_(SKIP IF NO EOC_^1WOK_"JMP* (WRITE)_^1WRALM JMP* SEEKZ1_'GO PROCESS ERROR_^1_%EJT_]_^1*------------------------------------_^1*_]_^1*_1ROUTINE CONNECT CU AND DRIVE_^1*_]_^1*------------------------------------_^1_%SPC 2_^1SELECT NOP 0_,ROUTINE TO SELECT THE CU AND DRIVE_^1_%ENA 0_^1_%STA* CONERR_'CLEAR THE CONNECT ERROR COUNT€€_^1*_$CONNECT TO CU_^1USEL_!LDQ* EQUIPC_^1_%INQ 3_^1_%LDA* DRIV_)USE DRIVE NUMBER_^1_%OUT -1_^1*_$NOW WAIT FOR ALARM OR SELECT_^1USEL1 RTJ* RDDAST_'READ DA STATUS_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAP USEL5_(SKIP IF NO ALARM_^1_%JMP* DSEL3_^1USEL5 ALS 2_,CU SELECT TO SIGN BIT_^1_%SAM USEL9_(SKIP IF CU SELECTED_^1_%JMP* USEL1_(GO WAIT FOR SELECT OR ALARM_^1USEL9 RTJ* CLRTCU€€_'CLEAR THE CU_^1*_$NOW SELECT DRIVE_^1DSEL_!LDQ* EQUIPC_^1_%INQ 3_^1_%LDA* DRIV_^1_%OUT -1_^1DSEL1 RTJ RDDAST_^1_%ALS 11_+MOVE ALARM TO HIGH BIT_^1_%SAP DRITP_(SKIP IF NO ALARM_^1DSEL3 RTJ* ERR_^1_%RTJ* CLRSTS_^1_%RTJ CLRTDA_^1_%JMP* USEL_^1_%SPC 2_^1*_]_^1*_,-----_"DETERMINE CYLINDER SIZE FOR DRIVE_^1*_]_^1_%SPC 2_^1DRITP LDQ* EQUIPC_M116*4301_^1_%INQ 3_,SET Q FOR€€ SEL/ACK STATUS FUNCTION_^1_%NOP 0_^1_%INP -1_+READ SELECT/ACKNOWLEDGE STATUS_^1_%LDQ =XCYLODN_$0 - 410 CYLINDERS ON LOW DENSITY DRIVE_^1_%ALS 8_^1_%SAP SAVCYL_'SKIP IF LOW DENSITY DRIVE_^1_%LDQ =XCYHIDN_$0 - 821 CYLINDERS ON HIGH DENSITY DRIVE_^1SAVCYL STQ* NCYLIN_'SAVE AS NUMBER OF DRIVE CYLINDERS_^1_%ALS 3_R116*4301_^1_%SAP GOAHD_(TEST FOR NO ATTENTION BIT_,116*4301_^1_%€€JMP* DSEL3_N116*4301_^1GOAHD ARS 11_Q116*4301_^1_%AND =N$F_)SAVE DRIVE THAT GOT SELECTED_^1_%EOR* DRIV_)COMPARE AGAINST WHAT WAS REQUESTED_^1_%SAZ CKDS2_(SKIP IF THEY MATCH_^1_%JMP* DSEL3_^1CKDS2 LDQ* EQUIPC_^1_%INQ 9_^1_%NOP 0_^1_%INP -1_+READ DRIVE STATUS 2_^1_%ALS 11_+READY TO SIGN BIT_^1_%SAM DSEL5_(SKIP IF READY_^1_%JMP* DSEL3_^1DSEL5 ALS 15_+ON CYLINDER TO SIGN BI€€T_^1_%SAM DSEL7_(SKIP IF ON CYLINDER_^1_%JMP* DSEL1_(MUST BE SEEKING SO WAIT_^1DSEL7 ALS 5_,CHECK FAULT STATUS TO SIGN BIT_^1_%SAM FAULT_(SKIP IF FAULT_^1_%JMP* (SELECT)_^1FAULT LDQ EQUIPC_^1_%INQ $C_^1_%NOP 0_^1_%INP -1_+READ FAULT STATUS_^1_%STA FAULTS_^1_%ALS 8_^1_%SAP FALTC_(SKIP IF NOT HEAD SELECT ERROR_^1_%INQ -5_^1_%ENA 0_^1_%OUT -1_+SELECT HEAD 0 TO CLEAR ERR€€OR_^1FALTC LDA FAULTS_^1_%ALS 14_^1_%SAP FALTN_(SKIP IF NO SEEK ERROR_^1_%LDQ EQUIPC_^1_%INQ $C_^1_%LDA =N$F3_^1_%NOP 0_^1_%OUT -1_+DO RETURN SEEK TO ZERO TO CLEAR ERROR_^1_%JMP* DSEL1_(GO WAIT FOR ON CYLINDER_^1FALTN JMP* DSEL3_^1_%SPC 2_^1*_]_^1*_1CONNECT OPERATION ERROR CHECK ROUTINE_^1*_]_^1ERR_"NOP 0_,CONNECT EROR COUNT ROUTINE_^1_%RAO* CONERR_^1_%LDA* CONERR_^1_%I€€NA -CONTER_%CONNECT ERROR COUNT (ALLOWED_^1_%SAP EHALT_(SKIP IF ENOUGH TRIES_^1_%JMP* (ERR)_^1CONERR NUM 0_^1_%SPC 2_^1*_1ERROR STOP_^1*_]_^1EHALT RTJ CLRTDA_'CLEAR DA, DESELECT CU_^1_%SET A_^1_%SET Q_^1EHALT1 SLS 0_^1_%JMP* EHALT1_'-----------HANG ON ERROR_^1_%EJT_]_^1*_$ROUTINE TO GET STATUS_^1GETSTA NOP 0_^1_%LDQ EQUIPC_^1_%INQ 9_^1_%NOP 0_^1_%INP -1_+READ DRIVE S€€TATUS 2_^1_%STA DSTAT2_^1_%INQ 3_^1_%NOP 0_^1_%INP -1_+READ DRIVE FAULT STATUS_^1_%STA FAULTS_^1_%INQ 1_^1_%NOP 0_^1_%INP -1_+READ CU STATUS_^1_%STA CUSTAT_^1_%INQ 1_^1_%NOP 0_^1_%INP -1_+READ DRIVE STATUS 1_^1_%STA DSTAT1_^1_%JMP* (GETSTA)_^1_%EJT_]_^1*_]_^1*_]_^1*_$ADDRESS SETUP_^1*_$FIVE WORDS FOR EACH SECTOR IN TRACK_^1*_$WORD 1_$*_$FLAG BYTE_^1*_$WORD 2_$*_$FLAG B€€YTE_^1*_$WORD 3_$*_$CYLINDER ADDRESS_!BITS 0-9_^1*_$WORD 4_$*_$TRACK BITS 8-10 , SECTOR BITS 0-6_^1*_8BIT 7 SET IF LAST SECTOR OF TRACK_^1*_$WORD 5_$*_$NUMBER OF BYTES PER SECTOR MINUS ONE_^1*_]_^1BYTELN NUM $BF00_(BYTES PER SECTOR MINUS 1_^1BUFLN NUM 320_*5*64 BUFFER LENGTH_^1_%EQU ADDLN(5)_$ADDRESS TAG LENGTH_^1_%SPC 3_^1*_]_^1*_$INITIALIZE BUFFER ROUTINE_^1BUFINT NUM 0_€€^1_%ENA 63_+LARGEST SECTOR NUMBER_^1_%STA* CSET_^1_%LDQ* BUFLN_^1BUC_"INQ -1_+POINT Q TO DATA LENGTH_^1_%LDA* BYTELN_^1_%STA* ABUF,Q_^1_%INQ -1_+POINT Q TO HEAD SECTOR_^1_%LDA* CSET_^1_%STA* ABUF,Q_'SET SECTOR_^1_%INA -1_^1_%STA* CSET_)DECREMENT SECTOR_^1_%INQ -1_+POINT Q TO CYLINDER ADDRESS_^1_%ENA 0_^1_%STA* ABUF,Q_^1_%INQ -1_+POINT Q TO FLAG BYTE_^1_%STA* ABUF,Q_^1_%INQ €€-1_+POINT Q TO NEXT BUFFER_^1_%STA* ABUF,Q_^1_%SQZ BUE_*SKIP DONE_^1_%JMP* BUC_^1CSET_!NUM 0_^1*_'NOW SET LAST SECTOR BIT_^1BUE_"LDQ* BUFLN_^1_%INQ -2_+POINT Q TO LAST SECTOR IN TRACK_^1_%LDA* ABUF,Q_^1_%EOR =N$80_(MUST SET BIT 7 OF LAST SECTOR IN TRACK_^1_%STA* ABUF,Q_^1_%JMP* (BUFINT)_$RETURN_^1_%SPC 3_^1*_]_^1*_$SETUP CURRENT CYLINDER VALUE IN BUFFER_^1CYLUP NOP 0_^1_%LDQ€€* BUFLN_^1_%INQ -3_+POINT Q TO CYLINDER WORD_^1_%LDA CYLIND_'FETCH CYLINDER_^1CYC_"STA* ABUF,Q_^1_%INQ -5_^1_%SQM CYD_*SKIP IF DONE_^1_%JMP* CYC_^1CYD_"JMP* (CYLUP)_^1_%SPC 3_^1*_]_^1*_$SETUP CURRENT TRACK VALUE IN BUFFER_^1TRKSET NUM 0_^1_%LDQ* BUFLN_^1_%INQ -2_+POINT Q TO LAST TRACK ENTRY_^1_%LDA TRACK_^1_%ALS 8_,BIT POSITION FOR TRACK_^1_%STA* TEMTK_^1TRKA_!LDA* ABUF,Q_€€'FETCH,TRACK SECTOR_^1_%AND =N$FF_(KNOCK OFF OLD TRACK_^1_%EOR* TEMTK_(ADD IN NEW TRACK_^1_%STA* ABUF,Q_^1_%INQ -5_^1_%SQM TRKB_)SKIP IF DONE_^1_%JMP* TRKA_^1TEMTK NUM 0_^1TRKB_!JMP* (TRKSET)_^1_%SPC 5_^1*_$THIS ROUTINE MUST BE DIRECTLY IN FRONT OF THE BUFFER ABUF_^1*_$IT MAKES THE PROGRAM RUN ANYWHERE_^1SETFWA NOP 0_^1_%RTJ* SETA_^1SETA_!NOP 0_^1_%LDA* SETA_^1_%INA ABUF-S€†ETA_^1_%STA FWA_^1_%JMP* (SETFWA)_^1ABUF_!BZS ABUF(WRDSEC*SECTCK)_^1BUFSIZ EQU BUFSIZ(*-ABUF)_(DATA BUFFER SIZE_^1_%END SMDIGS_^__†PD18ECM CSY/ C96 P€1_%NAM D18ECM_'DECK-ID C96 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$EXTENDED CORE MEMORY DRIVER FOR CYBER 18_^1*_$CYBER 18 MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DEVELOPMENT DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT, CONTROL DATA CORPORATION, 1976_^1_%SPC 5_^1*E_]_^1***_"PROGRAM FUNCTION -_^1*_$THIS DRIVER ALLOWS THE EXTENDED CORE MEMORY TO BE_^1*_$ACCESS€€ED IN A MANNER COMPATIBLE WITH MASS STORAGE DEVICES_^1*_]_^1*_$THE MASS MEMORY ADDRESS IN THE REQUEST CALL_^1*_$IS INTERPRETED AS FOLLOWS_^1*_$FOR READ/WRITE AS WORD ADDRESS_^1*_$FOR FREAD/FWRITE AS A SECTOR ADDRESS (96 WORDS/SECTOR)_^1*_]_^1*_$THE DEVICE TYPE CODE FOR THIS DEVICE IS 71_^1*_$THE DRIVER ASSUMES THE ECM PAGES ARE CONTIGUOUS_^1*_$THE DRIVER ASSUMES THE ECM PAGE IS THE€€ LAST 2K_^1*_'OF MEMORY WITHIN THE 65K SYSTEM_^1*_$THERE ARE 341 96 WORD SECTORS PER 32K OF EXTENDED CORE_^1_%SPC 4_^1_%ENT I18ECM_'DRIVER INITIATOR_^1_%SPC 3_^1_%EXT COMPV4_'MAGNITUDE COMPARISON ROUTINE (IN TRVEC)_^1_%SPC 3_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM ABSOLU€€TIZING ROUTINE_^1_%EQU ANABS($BF)_"ENTRY POINT TO N PARAM ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1_%SPC 2_^1_%EQU LPMSK(2)_$LOGICAL PRODUCT MASK_^1_%EQU BITMSK($22)_!REFERENCE POINT FOR 1 BIT MASK_^1_%EQU ZERO($22)_#LOCATION OF ZERO CELL_^1_%EQU ZROMSK($12)_!ZEROS MASK TABLE REFERENCE_^1*_$E€€RROR CODE SETTINGS FOR V FIELD_^1_%EQU VE7(7)_'TRANSFER ATTEMPTED WITHIN ECM DRIVER PAGE_^1_%EQU VE6(6)_'TRANSFER ATTEMPTED PAST END OF SYSTEM_^1_%EQU VE4(4)_'TRANSFER ATTEMPTED PAST END OF AVAILABLE ECM_^1_%EJT_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1_%EQU ELVL(0)_%SCHEDULER CALL_^1_%EQU EDIN(1)_%INITIATOR ADDRESS_^1_%EQU EDCN(2)_%CONTINUATOR ADDRESS **NOT USED**_^1_%EQU€€ EDPGM(3)_$ERROR TIMEOUT ADDRESS **NOT USED**_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK **NOT USED**_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%REQUEST PARAMETER LIST POINTER_^1_%EQU EWES(7)_%WES_!**NOT USED**_^1_%EQU EREQST(8)_#REQUEST STATUS/TYPE CODE_^1_%EQU ESTAT1(9)_#STATUS WORD_^1_%EQU ECCOR(10)_#NEXT WORD ADDRESS FOR DATA_^1_%EQU ELSTWD(11)_"LAST ADDRESS + 1_^1_%EQU ES€€TAT2(12)_"EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"LENGTH IF MASS MEMORY RESIDENT_^1_%EQU MESSEC(14)_"SECTOR IF MASS MEMORY RESIDENT_^1_%EQU RETURN(15)_"FNR RETURN_^1_%EQU ADDU(16)_$WORD ADDRESS UPPER BITS_^1_%EQU ADDL(17)_$WORD ADDRESS LOWER BITS_^1_%EQU MAXADU(18)_"MAXIMUM UPPER ADDRESS FOR AVAILABLE ECS_^1_%EQU MAXADL(19)_"MAXIMUM LOWER ADDRESS FOR AVAILABLE ECS_^1_%EQU PFLN€€UM(20)_"BIASED PAGE FILE NUMBER BITS 11-15_^1_%EQU CORLOC(21)_"REAL CORE ADDRESS OF FILE PAGE_^1_%EQU MAXPAG(22)_"MAXIMUM PAGE NUMBER_^1_%SPC 2_^1***_]_^1*_$SAMPLE PHYSICAL DEVICE TABLE_^1*_%ENT P18ECM_^1*_%ENT P18PGA_^1*_%ENT P18ADD_^1*_%ENT P18MXP_^1*P18ECM NUM $5208_(00 SCHEDULER CALL AND PRIORITY_^1*_%ADC I18ECM_'01 INITIATOR ADDRESS_^1*_%ADC 0_,02 CONTINUATOR ADD€€RESS**NOT USED**_^1*_%NUM 0000_)03 ERROR TIME OUT ADDRESS**NOT USED**_^1*_%NUM 0000_)04 DIAGNOSTIC CLOCK**NOT USED**_^1*_%NUM 0_,05 LOGICAL UNIT_^1*_%NUM 0000_)06 REQUEST PARAMETER LIST POINTER_^1*_%NUM 0000_)07 WES**NOT USED**_^1*_%NUM $0711_(08 REQUEST STATUS TYPE CODE_^1*_%NUM 0000_)09 STATUS WORD_^1*_%NUM 0000_)10 NEXT WORD ADDRESS FOR DATA_^1*_%NUM 0000_)11 L€€SAT WORD ADDRESS + 1_^1*_%NUM 0000_)12 EQUIPMENT STATUS_^1*_%NUM 0000_)13 LENGTH IF MASS MEMORY RESIDENT_^1*_%NUM 0000_)14 SECTOR IF MASS MEMORY RESIDENT_^1*_%NUM 0000_)15 FNR RETURN_^1*_%NUM 0000_)16 CALLER WORD ADDRESS UPPER_^1*_%NUM 0000_)17 CALLER WORD ADDRESS LOWER_^1*_%NUM 0000_)18 MAXIMUM UPPER ADDRESS FOR ECM_^1*_%NUM $FFFF_(19 MAXUMUM LOWER ADDRESS FOR ECM_€€^1*P18PGA NUM $F800_(20 BIASED PAGE FILE NUMBER BITS 10-15_^1*P18ADD NUM $F800_(21 REAL CORE ADDRESS OF FILE PAGE_^1*P18MXP NUM $003F_(22 MAXIMUM PAGE NUMBER_^1_%EJT_]_^1*_$INITIATOR ENTRY FOR DRIVER_^1I18ECM STQ- I_,SAVE ADDRESS OF PHYSTB_^1*_]_^1NXTREQ RTJ- (AFNR)_'CHECK FOR THE NEXT REQUEST_^1_%JMP- (ADISP)_%SYSTEM RETURN IF NONE_^1*_]_^1*_$HAVE A REQUEST, CHECK THE BUFFE€€R PARAMETERS_^1*_$CHECK THE FWA_^1_%LDA- CORLOC,I_$START OF ECM PAGE_^1_%LDQ- ECCOR,I_%FWA OF USERS BUFFER_^1_%RTJ* (COMPV)_%CALL COMPV4 TO COMPUTE DIFFERENCE_^1_%SAZ ERR7_)ERROR IF EQUAL_^1_%EOR- LPMSK+15_$CHECK FOR MINUS A_^1_%SAZ ERR7_^1*_$CHECK THE LWA + 1_^1_%LDA- CORLOC,I_$START OF ECM PAGE_^1_%LDQ- ELSTWD,I_$LWA + 1 OF USERS BUFFER_^1_%RTJ* (COMPV)_%CALL COMPV4 TO COMPUTE €€DIFFERENCE_^1_%EOR- LPMSK+15_$CHECK FOR MINUS A_^1_%SAN LWAOK_^1ERR7_!ENQ VE7_*V FIELD ERROR CODE_^1_%JMP* DONE_)GO COMPLETE WITH ERROR_^1*_$CHECK THE TRANSFER LENGTH_^1LWAOK LDA- ELSTWD,I_$FETCH LAST WORD ADDRESS + 1_^1_%LDQ- ECCOR,I_%FETCH FIRST WORD ADDRESS_^1_%RTJ* (COMPV)_%CALL COMPV4 TO COMPUTE DIFFERENCE_^1_%SAZ NOTOK_(SKIP IF ZERO WORD TRANSFER_^1_%EOR- LPMSK+15_$CHECK €€FOR MINUS A_^1_%SAN LENOK_(SKIP IF LWA .GT. FWA_^1NOTOK LDA- ECCOR,I_^1_%INA 1_^1_%STA- ELSTWD,I_^1LENOK LDQ- EPTR,I_'FETCH REQUEST PARAMETER ADDRESS_^1_%LDA- (ZERO),Q_^1_%ARS 9_,REQUEST CODE TO BITS 0 - 4_^1_%AND- LPMSK+5_%SAVE REQUEST CODE ONLY_^1_%INA -14_*CHECK FOR MOTION REQUEST_^1_%SAN NOTMOT_'SKIP IF NOT MOTION_^1*_]_^1*_$TREAT MOTION REQUEST AS A NO FUNCTION OPERATIO€€N_^1NOERR ENQ 0_,SET Q FOR NO ERRORS_^1DONE_!LDA- ESTAT1,I_$FETCH STATUS WORD_^1_%ALS 3_,MOVE UP TO START OF V FIELD_^1_%LRS 3_,SET V FIELD FROM LOWER 3 BITS OF Q_^1_%STA- ESTAT1,I_^1*_$COMPLETE REQUEST WILL MOVE V FIELD INTO THE LU REQUEST WORD_^1*_$IT GOES TO THE CALLER IN Q AT COMPLETION_^1_%RTJ- (ACOMPC)_$COMPLETE THE REQUEST_^1_%JMP* NXTREQ_'GO CHECK FOR ANOTHER REQUEST ON€€ THIS UNIT_^1_%EJT_]_^1*_]_^1NOTMOT RTJ- (ASABS)_^1_%TRA Q_^1_%LDA- ESTAT1,I_$FETCH STATUS INFORMATION_^1_%ALS 14_+FORMATTED REQUEST BIT TO SIGN BIT_^1_%SAM PRFMT_(SKIP IF FORMATTED REQUEST_^1*_]_^1*_$PROCESS MSB/LSB AS WORD ADDRESSABLE_^1_%LDA- 2,Q_*FETCH LSB. BIT 15 NOT PART OF ADDRESS_^1_%LDQ- 1,Q_*FETCH MSB_^1_%ALS 1_^1_%LRS 1_,A,Q CONTAINS STRAIGHT WORD ADDRESS. 18 BIT_^1€€_%JMP* ADDCHK_^1*_]_^1*_$PROCESS MSB/LSB AS SECTOR ADDRESSABLE_^1PRFMT LDA- 2,Q_*FETCH LSB SECTOR VALUE_^1_%AND- LPMSK+14_$DROP BIT 15 OF LSB_^1_%MUI* NUM96_(CONVERT SECTOR TO WORD ADDRESS_^1*_$CHECK FOR REQUEST ADDRESS BEYOND AVAILABLE CORE_^1ADDCHK STQ- ADDU,I_'SAVE 18 BIT ADDRESS UPPER_^1_%STA- ADDL,I_'SAVE 18 BIT ADDRESS LOWER_^1_%LDA- MAXADU,I_$FETCH ECS UPPER MEMORY LIMIT_^1€€_%SUB- ADDU,I_^1_%SAM LMTBAD_'SKIP IF LIMIT BAD_^1_%SAN GOOD_)SKIP IF OK_^1*_$UPPER VALUES EQUAL SO MUST CHECK LOWER ALSO_^1_%LDA- MAXADL,I_^1_%LDQ- ADDL,I_^1_%RTJ* (COMPV)_%CHECK DIFFERENCE_^1_%SAZ GOOD_^1_%EOR- LPMSK+15_$CHECK FOR MINUS A_^1_%SAN GOOD_^1*_]_^1*_$GO TO COMPLETE. Q HAS V FIELD IN LOWER 3 BITS_^1LMTBAD ENQ VE4_^1_%JMP* DONE_)GO COMPLETE WITH ERROR_^1_%SPC 2_^1€€COMPV ADC COMPV4_^1*_$COMPV4 CALL_(WILL DO A MINUS Q_^1*_$AT COMPLETION_^1*_$IF A .GT.Q_"A SET WITH DIFFERENCE MAY BE + OR -_^1*_$IF A .EQ. Q_!A IS SET TO ZERO_^1*_$IF A .LT. Q_!A IS SET TO $FFFF_^1_%EJT_]_^1*_$NOW SET UP THE MEMORY PAGE FILE_^1GOOD_!LDA- ADDL,I_'FETCH ADDRESS LOWER_^1_%LDQ- ADDU,I_'18 BIT ADDRESS IN QA_^1_%INQ 1_,BIAS PAST FIRST 65K OF CORE_^1_%LRS 11_+PUT P€€AGE ADDRESS VALUE INTO A_^1_%EOR- PFLNUM,I_$MASK IN THE PAGE FILE NUMBER_^1_%WPR A_,SET PAGE ADDRESS VALUE IN THE PAGE FILE_^1*_$BITS 0-8 OF A GO TO THE PAGE FILE SPECIFIED BY BITS 10-15 OF A_^1*_]_^1*_$NOW COMPUTE ADDRESS VALUE USED FOR REFERENCE_^1_%LDA- ADDL,I_'FETCH INITIAL ADDRESS_^1_%AND- LPMSK+11_$SAVE ADDRESS WITHIN PAGE ONLY_^1_%EOR- CORLOC,I_$MASK IN THE REFERENCE ADDRES€€S_^1_%TRA Q_^1*_$READ WRITE CHECK_^1_%LDA- ESTAT1,I_^1_%AND- LPMSK+1_%BIT 0 IS 0 IF READ/ 1 IF WRITE_^1_%SAZ READ_^1_%JMP* WRITE_^1_%SPC 3_^1*_$* *_!P R O C E S S_!R E A D_!* *_^1*_]_^1READ_!STQ* FROM_)SET ADDRESS TO REFERENCE DATA FROM_^1_%LDA+ 0000_^1FROM_!EQU FROM(*-1)_^1_%LDQ- ECCOR,I_%FETCH BUFFER ADDRESS_^1_%STA- (ZERO),Q_^1_%RTJ* CHKEND_^1_%LDA* FROM_^1_%RTJ* CHKPAG_^1_€€%JMP* READ_^1*_]_^1*_$PROCESS A WRITE INTO EXTENDED CORE_^1WRITE STQ* TO_^1_%LDQ- ECCOR,I_^1_%LDA- (ZERO),Q_^1_%STA+ 0000_^1TO_#EQU TO(*-1)_^1_%RTJ* CHKEND_^1_%LDA* TO_^1_%RTJ* CHKPAG_^1_%JMP* WRITE_^1_%EJT_]_^1*_$MUST CHECK IF AT END OF A 2K PAGE_^1CHKPAG NUM 0_^1_%AND- LPMSK+11_$$7FF. SAVE WITHIN 2K PAGE ADDRESS_^1_%INA 1_^1_%AND- LPMSK+11_^1_%SAZ UPAGE_(SKIP IF NEED PAGE UP€€DATE_^1_%EOR- CORLOC,I_$MASK IN THE REFERENCE ADDRESS_^1CEXIT TRA Q_^1_%JMP* (CHKPAG)_^1UPAGE LDQ- PFLNUM,I_^1*_$READ THE PAGE FILE SPECIFIED BY Q BITS 10 - 15_^1*_$FILE WORD CONTENTS WILL GO INTO A-REGISTER_^1*_$BIT 15. SET IF ATTEMPT WRITE INTO READ ONLY PAGE_^1*_$BIT 14. AMR 0_!1 IF PAGE MODE, 0 IF ABSOLUTE_^1*_$BIT 13. AMR 1_!1 IF PROGRAME MODE, 0 IF MONITOR_^1*_$BIT 7. €€READ ONLY PAGE BIT_^1*_$BITS 0-6. ADDITIONAL ADDRESS BITS_^1*_]_^1_%RPR Q_^1_%AND- LPMSK+7_%KNOCK DOWN ANY UPPER STATUS BITS_^1_%INA 1_^1*_$CHECK IF ARE GOING PAST THE LAST ALLOWABLE PAGE_^1*_]_^1_%TRA Q_^1_%SUB- MAXPAG,I_^1_%SAM NEXTOK_'SKIP IF NEXT PAGE IS OK_^1_%ENQ VE4_^1_%JMP* DONE_^1NEXTOK TRQ A_^1_%EOR- PFLNUM,I_^1_%WPR A_,SET NEW PAGE FILE NUMBER_^1*_$BITS 0-8 OF A €€GO INTO THE PAGE FILE SPECIFIED BY_^1*_'BITS 10-15 OF Q 10 SPECIFIES FILE 0 OR 1 11-15 THE FILE_^1_%ENA 0_,RESET WORD OF NEXT PAGE_^1_%EOR- PFLNUM,I_^1_%JMP* CEXIT_^1_%EJT_]_^1*_$CHECK IF AT END OF REQUEST BUFFER_^1CHKEND NUM 0_^1_%RAO- ECCOR,I_%INCREMENT BUFFER POINTER_^1_%LDA- ELSTWD,I_$LWA+1_^1_%LDQ- ECCOR,I_%CURRENT WORD + 1_^1_%RTJ* (COMPV)_%CALL COMPV4 TO COMPUTE DIFFEREN€€CE_^1_%SAZ OKEND_(SKIP IF DONE_^1_%EOR- LPMSK+15_^1_%SAN DONEXT_^1_%ENQ VE6_*ERROR CODE FOR V_^1_%JMP* DONE_)SOME THING IS MESSED UP_^1OKEND LDA- ESTAT1,I_$REQUEST STATUS WORD_^1_%AND- LPMSK+2_%READ/WRITE AND FORMATTED/UNFORMATTED BITS_^1_%EOR- LPMSK+2_^1_%SAZ ZROFIL_'SKIP IF FORMATTED WRITE_^1_%JMP* NOERR_(GO COMPLETE THE REQUEST WITH NO ERROR_^1DONEXT JMP* (CHKEND)_^1*_]_^1Z€€ROFIL LDQ- PFLNUM,I_$FETCH PAGE FILE NUMBER_^1_%RPR Q_,READ PAGE FILE CONTENTS INTO A_^1_%AND- LPMSK+7_%SAVE ADDITIONAL ADDRESSING BITS ONLY_^1_%TRA Q_^1_%LDA* TO_+FETCH LAST ADDRESS STORED INTO_^1_%ALS 5_,MOVE OFF PAGE FILE INDEX_^1_%LRS 5_,QA HAS 17 BIT ADDRESS_^1_%DVI* NUM96_(CONVERT WORDS TO SECTORS_^1*_$A HAS SECTORS, Q HAS REMAINING WORDS_^1*_$REMAINDER 64 IS SECTOR BREAK€€_^1_%INQ -63_^1_%SQZ ZROEXT_'SKIP IF NO ODD WORDS_^1_%SQM VARCNT_^1_%INQ -96_*SET TO COMPLEMENT OF WORD COUNT_^1VARCNT STQ* COUNT_^1_%LDA* TO_^1ZROLP RTJ* CHKPAG_^1_%STQ* ZROTO_^1_%ENA 0_^1_%STA+ 0000_^1ZROTO EQU ZROTO(*-1)_^1_%RAO* COUNT_^1_%LDA* COUNT_^1_%SAZ ZROEXT_'SKIP IF DONE_^1_%LDA* ZROTO_^1_%JMP* ZROLP_^1ZROEXT JMP NOERR_^1COUNT NUM 00_+COMPLEMENT OF NUMBER OF €JWORDS TO ZERO_^1_%SPC 2_^1NUM96 NUM 96_+WORDS PER SECTOR_^1_%END_]_^__ JPBOOTC3 CSY/ C99 P€1_%NAM BOOTC3_'DECK-ID C99 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1*_*1829 CARD BOOT STRAP_^1_%SPC 2_^1BOOTC1 IIN 0_^1_%STA* START_(SAVE FWA_^1_%STA* STRADR_^1LOOP1 LDQ =N$05A1_%** USE $0521 FOR 1728/430_^1_%LDA =N$0080_^1_%OUT -1_+START CARD MO€€TION_^1_%ENA -40_^1_%STA* WORDCT_^1_%INQ -1_^1_%NOP 0_^1LOOP2 INP -1_+READ UPPER BYTE_^1_%AND* MASK_^1_%ALS 8_^1_%STA* (STRADR)_^1_%NOP 0_^1_%INP -1_+READ LOWER BYTE_^1_%AND* MASK_^1_%EOR* (STRADR)_^1_%STA* (STRADR)_^1_%RAO* STRADR_^1_%AAM M_,UPDATE EOF CHECKSUM_^1_%RAO* WORDCT_^1_%LDA* WORDCT_'IS THE CARD COMPLETELY READ_^1_%SAP CDDONE_'YES_^1_%JMP* LOOP2_(NO, CONTINUE_^€1CDDONE LDA* EOF_^1_%EAM A_,WAS THE CARD AN EOF_^1_%CLR M_^1_%SAN NOEOF_(NO_^1_%JMP* (START)_%YES, GO TO FWA OF THE PROGRAM_^1NOEOF JMP* LOOP1_(READ ANOTHER CARD_^1EOF_"NUM $0F00_^1MASK_!NUM $00FF_^1WORDCT NUM 0_^1START NUM 0_^1STRADR NUM 0_^1_%END_]_^__PDMP827 CSY/ D01 P€1_%NAM DMP827_'DECK-ID D01 PERIPH. DRIVERS 1.1C SUMMARY-110_^1****************************************************************_^1*_*1827 LINE PRINTER CORE DUMP ROUTINE_^1****************************************************************_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1*_]_^1*_8€€USER INSTRUCTIONS_^1*_82. PUT ENDING ADDRESS+1 IN Q_)Q=8000_^1*_83. PUT START OF COUTV4 IN P_^1*_84. PUSH RUN SWITCH_^1*_]_^1*_1PROGRAM RESULTS AFTER RUNNING_^1*_81. PAPER IS SET AT TOP OF FORM_^1*_82. ABSOLUTE/RELATIVE(MOD 16) HEADING OF_^1*_;SIXTEEN COLUMNS AT TOP OF EACH PAGE_^1*_83. ABSOLUTE ADDRESS, RELATIVE ADDRESS,_^1*_;AND SIXTEEN WORDS PRINTED PER LINE_^1*_84. LINES WHOSE €€SIXTEEN WORDS ARE SAME AS_^1*_;LAST PRINTED WORD ARE IGNORED BY_^1*_;PRINTING A ROW OF ASTERISKS_^1*_85. PRINTS 60 LINES PER PAGE,HANGS WHEN DONE_^1*_]_^1_%ENT COUTV4_^1COUTV4 NOP 0_^1_%STA STRADR_'SAVE CURRENT,STARTING AND ENDING ADDRESSES_^1_%STA CURADR_^1_%STQ ENDADR_^1_%RTJ STATUS_'WAIT UNTIL STATUS OK_^1*_]_^1NXTPAG ENA $40_*TOP OF FORM_^1_%RTJ OUTPUT_^1_%ENA_!-60_^1_%€€STA LINCTR_^1_%ENA 0_^1_%STA HEXCTR_^1_%ENQ -1_^1_(LDA =N$4142_^1_%RTJ* RPTOUT_'OUTPUT AB_^1_%ENQ -1_^1_%LDA =N$534C_^1_%RTJ* RPTOUT_'OUTPUT SL_^1_%ENQ -1_^1_%LDA* TWOSPC_^1_%RTJ* RPTOUT_'OUTPUT TWO SPACES_^1_%ENQ -1_^1_%LDA =N$2052_^1_%RTJ* RPTOUT_'OUTPUT R_^1_%ENQ -1_^1_%LDA =N$454C_^1_%RTJ* RPTOUT_'OUTPUT EL_^1_%ENQ -4_^1*_]_^1HEDFLD LDA* TWOSPC_'NEXT HEADING FIELD_€€^1_%RTJ* RPTOUT_'OUTPUT CORRECT NUMBER OF SPACES_^1_%ENA $F_+NEXT HEADING WORD_^1_%AND* CURADR_^1_%ADD* HEXCTR_'GET ABSOLUTE HEXADECIMAL DIGIT_^1_%ALS 4_^1_%EOR* HEXCTR_'GET RELATIVE HEXADECIMAL DIGIT_^1_%ALS 8_^1_%RTJ* OUT2CH_'OUTPUT ABSOLUTE AND RELATIVE HEX DIGIT HEADING_^1_%RAO* HEXCTR_^1_%LDA* HEXCTR_^1_%INA -$10_)INCREMENT HEX COLUMN COUNTER, IS IT $10_^1_%SAP HEDDON_*YE€€S, ENTIRE HEADING HAS BEEN OUTPUT_^1_%ENQ -2_.NO, OUTPUT NEXT HEADING FIELD_^1_%JMP* HEDFLD_^1HEDDON RTJ* PRTSPC_'PRINT HEADING FIELD AND SPACE TO NEXT LINE_^1_%JMP* NXTLIN_'OUTPUT THIS LINE_^1_%EJT_]_^1CHKLIN ENA 0_,CHECK LINE IF ALL WORDS SAME AS LAST WORD_^1_%STA* HEXCTR_'SET HEX COLUMN COUNTER_^1*_]_^1CHKFLD LDQ* CURADR_^1_%ADQ* HEXCTR_^1_%LDA* (ZERO),Q_^1_%EOR* LSTWRD_'IS NE€€XT WORD EQUAL TO LAST WORD OUTPUT_^1_%SAZ 1_^1_%JMP* NXTLIN_^1*_]_^1_%LDA* CURADR_'CHECK FOR END ADDRESS_^1_%ADD* HEXCTR_^1_%EOR* ENDADR_^1_%SAN_!1_^1_%JMP* NXTLIN_^1_%RAO* HEXCTR_*YES, INCREMENT HEX COLUMN COUNTER_^1_%LDA* HEXCTR_^1_%INA -$10_)IS HED COLUMN COUNTER $10_^1_%SAP 1_^1_%JMP* NXTCHK_^1*_]_^1_%LDA* CURADR_^1_%ADD* HEXCTR_^1_%STA* CURADR_^1_%LDA* IGNFLG_*YES, IS IGNO€€RE FLAG SET_^1_%SAZ OUTASK_2NO, PRINT ROW OF ASTERISKS_^1_%JMP* CHKDON_2YES, CHECK IF ALL DONE_^1*_]_^1OUTASK ENA 1_^1_%RTJ* OUTPUT_^1_%ENQ -57_^1_%STQ* IGNFLG_'SET IGNORE FLAG_^1_%LDA* TWOASK_^1_%RTJ* RPTOUT_'OUTPUT A ROW OF ASTERISKS_^1_%RAO* LINCTR_*INCREMENT LINE COUNTER_^1_%JMP* PRTLIN_'PRINT ROW OF ASTERISKS_^1*_]_^1NXTCHK JMP* CHKFLD_^1*_]_^1NXTLIN ENA 1_^1_%RTJ* OUTPUT_€€^1_%LDA* CURADR_^1_%RTJ* OUTFLD_'OUTPUT CURRENT ABSOLUTE ADDRESS_^1_%LDA* CURADR_^1_%SUB* STRADR_^1_%RTJ* OUTFLD_'OUTPUT CURRENT RELATIVE ADDRESS_^1_%ENQ -2_^1_%LDA* TWOSPC_^1_%RTJ* RPTOUT_'OUTPUT A SPACER FIELD_^1_%ENA 0_^1_%STA* HEXCTR_'SET HEX COLUMN COUNTER_^1_%STA* IGNFLG_'RESET IGNORE FLAG_^1*_]_^1NXTFLD LDQ* CURADR_^1_%LDA* (ZERO),Q_$GET NEXT CORE WORD_^1_%RTJ* OUTFLD_'OUT€€PUT NEXT FIELD (CORE WORD AND SPACES)_^1_%RAO* HEXCTR_^1_%LDA* CURADR_'CHECK TO SEE IF DONE_^1_%EOR* FFFE_^1_%SAZ 3_^1_%LDA* CURADR_^1_%EOR* ENDADR_^1_%SAN 2_^1_%RTJ* PRTSPC_^1_%JMP* ALLDON_^1_%LDA* HEXCTR_^1_%INA -$10_)INCREMENT HEX COLUMN COUNTER, IS $10_^1_%RAO* CURADR_'OUTPUT NEXT FIELD_^1_%SAP PRTLIN_*YES, PRINT THE LINE_^1_%JMP* NXTFLD_*NO, OUTPUT NEXT FIELD_^1_%EJT_]_^1€€PRTLIN RTJ* PRTSPC_'PRINT THE LINE AND SPACE TO THE NEXT LINE_^1*_]_^1CHKDON LDA* IGNFLG_'NO,IS IGNORE FLAG SET_^1_%SAN CKNXLN_1YES, CHECK NEXT LINE_^1*_]_^1_%RAO* LINCTR_1NO, INCREMENT LINE COUNTER_^1_%LDA* LINCTR_'HAS BOTTOM OF PAGE BEEN REACHED_^1_%SAM CKNXLN_*NO, CHECK NEXT LINE_^1_%JMP* NXTPAG_*YES, SET TOP OF FORM AND PRINT HEADING_^1*_]_^1CKNXLN JMP* CHKLIN_^1*_]_^1*_]_^1A€€LLDON NUM $18FF_(ALL DONE, HANG_^1_%EJT_]_^1RPTOUT 000 000_*REPEAT OUTPUT WORD IN A, Q-TIMES_^1_%STQ* RPTCTR_*SET REPEAT COUNTER AND SAVE WORD_^1_%STA* WRDSAV_^1RPTAGN ALS 8_^1_%RTJ* OUTPUT_^1_%LDA* WRDSAV_^1_%RTJ* OUTPUT_^1_%LDA* WRDSAV_^1_%RAO* RPTCTR_^1_%LDQ* RPTCTR_'INCREMENT REPEAT COUNTER, IS IT ZERO_^1_%SQP RPTEXT_*YES, ALL DONE, EXIT_^1_%JMP* RPTAGN_*NO, REPEAT AGAIN_^1€€RPTEXT JMP* (RPTOUT)_^1_%SPC 2_^1PRTSPC 000 000_*PRINT LINE AND SPACE TO THE NEXT LINE_^1_%ENA $20_*PRINT_^1_%RTJ* OUTFCT_^1_%JMP* (PRTSPC)_^1_%SPC 2_^1TWOSPC NUM $2020_(TWO SPACES_^1ENDADR NUM $8000_(ENDING ADDRESS + 1_^1STRADR NUM 0_,STARTING ADDRESS_^1CURADR NUM 0_,CURRENT ADDRESS_^1HEXCTR NUM 0_,HEX COLUMN COUNTER_^1LINCTR NUM 0_,LINE COUNTER_^1RPTCTR NUM 0_,REPEAT C€€OUNTER_^1IGNFLG NUM 0_,IGNORE FLAG_^1WRDSAV NUM 0_,WORD SAVE_^1LSTWRD NUM 0_,LAST WORD_^1ZERO_!NUM 0_,ZERO_^1TWOASK NUM $2A2A_(TWO ASTERISKS_^1WESSTA NUM $0201_(HARDWARE ADDRESS (STATUS)_"(EQ 4)_^1FFFE_!NUM $FFFE_^1_%SPC 2_^1OUTFLD 000 000_*OUTPUT NEXT FIELD_^1_%STA* LSTWRD_*SAVE LAST WORD OUTPUT_^1_%RTJ* OUT2CH_'OUTPUT FIRST TWO CHARACTERS_^1_%LDA* LSTWRD_^1_%ALS 8_^1_%R€€TJ* OUT2CH_'OUTPUT LAST TWO CHARACTERS_^1_%LDA* TWOSPC_^1_%ENQ -1_^1_%RTJ* RPTOUT_^1_%JMP* (OUTFLD)_^1_%SPC 2_^1OUT2CH 000 000_*OUTPUT TWO HEX CHARACTERS_^1_%ENQ 0_/CHARACTERS IN BITS 8-15 OF A_^1_%LLS 4_^1_%ALS 4_,PUT FIRST CHARACTER IN Q AND SECOND ONE IN A_^1_%AND =N$F_^1*_]_^1_%INQ -$A_^1_%SQP 1_,CONVERT FIRST CHARACTER TO ASCII_^1_%INQ +$3A-$41_^1_%INQ $41_^1*_]_^1_€€%INA -$A_^1_%SAP 1_,CONVERT SECOND CHARACTER TO ASCII_^1_%INA +$3A-$41_^1_%INA $41_^1*_]_^1_%QLS 8_,COMBINE BOTH ASCII CHARACTERS IN A_^1_%EAQ A_^1_%ENQ -1_^1_%RTJ* RPTOUT_^1_%JMP* (OUT2CH)_^1_%EJT_]_^1OUTPUT 000 000_*OUTPUT TWO ASCII CHARACTERS_^1_%LDQ* WESSTA_'CHARACTERS IN 'A'_^1_%INQ -1_^1_%OUT -1_+OUTPUT_^1_%RTJ* STATUS_^1_%JMP* (OUTPUT)_$CHECK STATUS AND EXIT_^1_%SP€€C 2_^1OUTFCT 000 000_*OUTPUT LINE PRINTER FUNCTION_^1_%LDQ* WESSTA_'FUNCTION IN 'A'_^1_%OUT -1_+OUTPUT FUNCTION_^1_%RTJ* STATUS_^1_%JMP* (OUTFCT)_$CHECK STATUS AOK AND EXIT_^1_%SPC 2_^1STATUS 000 000_*ASCERTAIN LINE PRINTER STATUS AOK_^1_%LDQ* WESSTA_^1INPSTA INP -1_+INPUT STATUS_^1_%AND =N$000B_^1_%INA -9_^1_%SAZ STAAOK_'IS STATUS AOK_^1_%JMP* INPSTA_*NO, REREAD STATUS_^1€4STAAOK JMP* (STATUS)_(YES, EXIT_^1_%END COUTV4_^__ 4PQCARD CSY/ D04 P€1_%NAM QCARD_(DECK-ID D04 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_*1829 INITIALIZER DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1*_$IDRIV FOR CARDS, USED WITH SYS INITIALIZER IDRIV CONTROLLER_^1*_'READS FORMATTED BINARY RECORDS_^1*_'MAXIMUM RECORD LENGTH IS ONE CARD_^1****************€€**********************************************MSOS 4.1**_^1*_$ERROR EXIT CONDITIONS_?**MSOS 4.1**_^1*_'(A) = 0_K**MSOS 4.1**_^1*_'(Q) = ERROR CODE_B**MSOS 4.1**_^1*_+1 = LOST DATA_A**MSOS 4.1**_^1*_+2 = ALARM ERROR_?**MSOS 4.1**_^1*_+4 = CHECKSUM ERROR_<**MSOS 4.1**_^1*_+5 = INTERNAL REJECT_;**MSOS 4.1**_^1*_+6 = EXTERNAL REJECT_;**MSOS 4.1**_^1*_+9 = SEQUENCE ERROR_<**MSOS 4.1**_^€€1*_*10 = NON-NEGATIVE RECORD LENGTH_0**MSOS 4.1**_^1*_*14 = NOT READY_A**MSOS 4.1**_^1*_'(I) = LAST HARDWARE STATUS_8**MSOS 4.1**_^1**************************************************************MSOS 4.1**_^1*_Z**MSOS 4.1**_^1*_$A HOLLERITH CARD CODE CONVERSION TABLE MUST BE LOADED**MSOS 4.1**_^1*_'WITH THIS MODULE....._=**MSOS 4.1**_^1*_.CR026 - HOLLERITH_:**MSOS 4.1**_^1*_.CR029 -€€ EBCDIC_=**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1_%SPC 1_^1_%EQU WES(11)_%STANDARD EQUIPMENT CODE_***MSOS 4.1**_^1_%EQU ASKII(70)_^1_%ENT QCARD_(BASIC DRIVER ENTRY_/**MSOS 4.1**_^1_%ENT ECARD_(W,E,S FUNCTION CODE_.**MSOS 4.1**_^1_%EXT* CDRD_)HOLLERITH CONVERSION TABLE_'**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1ECARD ADC WES*128+$21_!BASIC W,E,S FUNCTION CODE_^1*_Z**MSOS 4.1**_^1QCARD NUM €€0_,BASIC DRIVER ENTRY_/**MSOS 4.1**_^1_%RTJ SETUP_^1CKSTAT_!RTJ*_$STATUS_-COMES BACK ON DATA READY OR_^1REPT_!RTJ* TRIP_%TRIP NEXT CARD_^1_%ENA 1_^1_%STA CLMN1F_'SET 1ST COLUMN FLAG_^1*_82 CARDS DELETED_563*1376_^1_%RTJ* RDBIN_$READ IN BINARY MODE_^1_%JMP CHKOK_^1*_]_^1EREXIT STQ* ERCD_)SAVE ERROR CODE_2**MSOS 4.1**_^1_%RTJ STOPMO_'STOP CARD MOTION, CLEAR CONTROLLER**MSOS 4.1*€€*_^1_%LDQ* ERCD_)PASS ERROR CODE_2**MSOS 4.1**_^1EXITER LDA* STATS_(PASS STATUS_6**MSOS 4.1**_^1_%STA- I_N**MSOS 4.1**_^1_%CLR A_)SET ERROR CODE FOR EXIT_^1_%JMP* (QCARD)_%ERROR RETURN_5**MSOS 4.1**_^1ERCD_!NUM 0_N**MSOS 4.1**_^1ASMD1 RTJ ASCMD_$ASCII MODE, HOLLERITH_^1_%JMP CHKOK_^1*_]_^1TRPCD NUM $80_^1* *******************************************************************€€**_^1*_$THE FOLLOWING ROUTINE IS RESPONSIBLE FOR TRIPPING ALL CARDS_^1* *********************************************************************_^1TRIP_!ADC 0_)TRIP NEXT CARD_^1_%CLR A_^1_%STA* WORDCT_#PREPARE FOR NEXT CARD_^1_(STA*_$CC_^1_%LDQ* ECARD_J**MSOS 4.1**_^1_(LDA*_$TRPCD_^1_%OUT YREJ-*_I**MSOS 4.1**_^1_%JMP* (TRIP)_^1*_]_^1* *********************************************€€************************_^1*_"STATUS IS TAKEN EACH TIME THE DRIVER IS ENTERED_^1* *********************************************************************_^1STATUS ADC 0_)RUN STATUS ON CARD READER_^1_%LDQ* ECARD_J**MSOS 4.1**_^1_%INP REJ-*_(READ STATUS_6**MSOS 4.1**_^1_%STA* STATS_(SAVE STATUS_6**MSOS 4.1**_^1_%AND =N$0021_%SAVE ALARM AND READY_-**MSOS 4.1**_^1_%ALS 15_+GET READY€€ BIT_4**MSOS 4.1**_^1_%SAP NOTRDY_'SKIP IF NOT READY_0**MSOS 4.1**_^1_%ALS 11_+GET ALARM_8**MSOS 4.1**_^1_%SAP STATOK_'SKIP IF NO ALARM_1**MSOS 4.1**_^1_%ENQ 2_,ALARM ERROR_6**MSOS 4.1**_^1_%JMP* EXITER_I**MSOS 4.1**_^1STATOK JMP* (STATUS)_G**MSOS 4.1**_^1NOTRDY ENQ 14_+NOT READY ERROR_2**MSOS 4.1**_^1_%JMP* EXITER_I**MSOS 4.1**_^1STATS NUM 0_N**MSOS 4.1**_^1REJ_"JMP* INREJ_€€J**MSOS 4.1**_^1_%ENQ 6_,EXTERNAL REJECT ERROR_,**MSOS 4.1**_^1_%JMP* EXITER_I**MSOS 4.1**_^1INREJ ENQ 5_,INTERNAL REJECT ERROR_,**MSOS 4.1**_^1_%JMP* EXITER_I**MSOS 4.1**_^1* M********M****************M******MMM***M*****************************_^1*_!BINARY READ REQUEST PROCESSOR_^1*_$FORMATTING IS EXPECTED_^1*_'1) WORD 1 CONTAINS SEQ NBR IN BITS 15-4_^1*_+AND CHECKSUM OVERIDE€€ IN B+TS 3-0_^1*_'2) WORD 2 DEFINES THE COMPLEMENT OF THE WORD COUNT_^1*_+FOR THE RECORD_^1*_'3) DATA CONTINUES THROUGH COL 80_^1*_'4) SUCCEDING CARDS MUST CONTAIN SEQUENCING_^1*_+IN THE FIRST WORD_^1*_'5) FOLLOWING THE LAST WORD OF THE RECORD_^1*_+A CHECKSUM MUST APPEAR. CHECKSUMS ARE_^1*_+IGNORED IF OVERIDE BITS ARE SET_^1* **************************************************€€*******************_^1RDBIN_"ADC_%0_^1R_$RTJ* INPUTC_^1_%LDA* W1_^1_%ENQ 0_,STORE 3 WORDS_^1_%LLS 12_^1_%EOR* W2_^1_%LLS 8_^1_%RTJ* STOQ_)WORD 0_^1*_+WORD 0 IS MADE FROM W1(11=0) AND W2(11=8)_^1_%LDQ* W2_^1_%LDA* W3_^1_%ALS 4_^1_%LLS 8_^1_%RTJ* STOQ_^1*_8WORD 2 IS MADE FROM W2(7=0)AND W3(11=4)_^1_%ENQ 0_^1_%LDA* W3_^1_%LLS 12_^1_%EOR* W4_^1_%TRA Q_^1_%RTJ* STOQ_^1*_8WORD P€€ IS MADE OF W3(3=0) AND W4(11=0)_^1*_]_^1_(LDA*_$CC_^1_%INA -80_'TEST FOR 80 COLUMNS_^1_%SAP 1_^1_%JMP* R_^1_%JMP* (RDBIN)_^1*_]_^1WORDCT ADC 0_)CARD WORD COUNT_^1SEQ_"NUM 0_,SEQUENCE COUNTER_^1SWITCH ADC 0_)ASCII OR BINARY MODE SWITCH_^1DATCOD NUM 0_^1INPUTC ADC 0_)ROUTINE FOR READING 4 COLS_^1_%RTJ* INP_^1_%STA* W1_^1_%RTJ* INP_^1_%STA* W2_^1_%RTJ* INP_^1_%STA* W3_^1_%RTJ*€€ INP_^1_%STA* W4_^1_%JMP* (INPUTC)_^1*_]_^1_%BSS W1,W2,W3,W4,CC,CORE_^1*_]_^1*_]_^1* *********************************************************************_^1*_!GENERALIZED ROUTINE FOR STORING FORMATTED BINARY DATA_^1* *********************************************************************_^1STOQ_!ADC 0_)STORE CONTENTS OF Q AWAY_^1_(STQ*_$OVRIDE_^1_%LDA* CHKSUM_#UPDATE CHECKSUM FO€€R RECORD_^1_%AAQ A_^1_%STA* CHKSUM_^1_(LDA*_$WORDCT_.CARD WORD COUNT_^1_(SAZ_%SEQOK-*-1_+ZERO IF FIRST WORD ON CARD_^1_%SAP NOTCKS-*-1_^1_%JMP* CHECK_'MINUS IF PROCESSING CHECKSUM_^1NOTCKS JMP* NOTFST_%OTHERWISE NOT FIRST WD OR CHECKSUM_^1*_]_^1*_]_^1SEQOK_"LDA*_$OVRIDE_.CHECK FOR BINARY CARD_^1_(AND_%=N$00F0_^1_(SAZ_%BINARY_.1729 TYPE BINARY_^1_(INA_%-$50_^1_(SAZ_%BINARY_-1726 €€OR 1728 TYPE BINARY_^1_%INA -$20_)CHECKSUM OVERRIDE BIT SET_%*4.0/77*1716_^1_%SAZ SETOVR_'YES_<*4.0/77*1716_^1_(CLR_%A_^1_(STA*_$SWITCH_^1_(JMP*_$ASMD1_/PROCESS AS IF ASCII REQ_^1CHKIT NUM 0_^1SETOVR ENA 1_L*4.0/77*1716_^1_%STA* CKOVR_(SET CHECKSUM OVERRIDE_**4.0/77*1716_^1BINARY_!LDA*_$OVRIDE_(CURRENT SEQ NO TO PREVIOUS_^1_(ARS_%8_^1_%STA* CHKIT_^1*_83 CARDS DELETED_0*4.0/7€€7*1716_^1_%SAN CONTON_^1_%STA* SEQ_*RESET SEQUENCE COUNTER_^1CONTON LDA CLMN1F_^1_%SAZ NEXT1_(COLUMN 1 ALREADY PROCESSED_^1_%RTJ SEQNUM_^1NEXT1 JMP* NXTWD_^1*_]_^1YREJ_!JMP* IX_M**MSOS 4.1**_^1_%JMP* EX_M**MSOS 4.1**_^1NOTFST INA -1_(TEST FOR WORD TWO OF CARD_^1_%SAN NOT2ND-*-1_^1*_83 CARDS DELETED_^1_%SQM ISCOMP-*-1_^1_%ENQ 10_+NON-NEGATIVE RECORD LENGTH ERROR **MSOS 4.1€€**_^1_%JMP EREXIT_'WORD COUNT MUST BE NEG_+**MSOS 4.1**_^1ISCOMP TCQ A_^1_%ADD* CORE_%FWA_^1_%STA* LAST_%LWA_^1_%JMP* NXTWD_^1*_]_^1NOT2ND STQ* (CORE)_#STORE WORD IN CORE BUFFER_^1_%RAO* CORE_%UPDATE BUFFER POINTER_^1_%LDA* CORE_%TEST FOR LAST WORD OF TRANSFER_^1_%SUB* LAST_^1_%SAP ISLAST-*-1_^1NXTWD RAO* WORDCT_^1BACK_!JMP* (STOQ)_#RETURN_^1*_]_^1ISLAST ENA -1_^1_%STA* WORDCT€€_^1_%JMP* BACK_^1*_]_^1CHECK LDQ* CHKSUM_^1_%SQZ CHKOK-*-1_!TEST FOR ZERO CHECKSUM_^1_%LDA* CKOVR_^1_%SAN CHKOK-*-1_^1_%STA* STATS_J**MSOS 4.1**_^1_%ENQ 4_,CHECKSUM ERROR_3**MSOS 4.1**_^1_%JMP EREXIT_I**MSOS 4.1**_^1CHKOK RTJ STOPMO_#STOP CARD MOTION , CLEAR CONTROLLER_^1_%ENA 1_)SET SUCCESSFUL READ CODE FOR EXIT_^1_%JMP (QCARD)_H**MSOS 4.1**_^1*_]_^1* *******************€€**************************************************_^1*_!INITIALIZATION ROUTINE FOR CARD READER DRIVER_^1* *********************************************************************_^1*_]_^1SETUP ADC 0_)PARAMETER INITIALIZATION PROGRAM_^1_%STA* SWITCH_#+ = ASCII, - = BINARY_^1_%SAP ASMD-*-1_^1_%TCA A_^1ASMD_!STA* CORE_%BUFFER FIRST WORD ADDR_^1_%SQZ QCOUNT-*-1_^1_%AAQ A_)WORD COUN€€T ALREADY SPECIFIED_^1_%JMP* SVE_^1QCOUNT CLR A_)GET WORD COUNT FROM CARD_^1SVE_"STA* LAST_^1_%CLR A_)INITIALIZE PARAMETERS TO ZDRO_^1_%STA- ASKII,I_$ASCII READ MODE SWITCH_^1_%STA* WORDCT_%CARD WORD COUNT_^1_%STA* OVRIDE_%WORD ONE STORAGE SWITCH_^1_%STA* CHKSUM_%CHECKSUM CELL_^1_%STA* CKOVR_(CHECKSUM OVERRIDE_.*4.0/77*1716_^1_%STA WHCHAR_'1=LOWER_!0=UPPER_0**MSOS 4.1**_^1_%LDQ €€ ECARD_J**MSOS 4.1**_^1_%LDA =N$401_$CLEAR CONTROLLER (NEG HOLL TO ASC FOR 405)_^1_%OUT XREJ-*_I**MSOS 4.1**_^1_%JMP* (SETUP)_^1*_]_^1INP_"NUM 0_N**MSOS 4.1**_^1_%LDQ ECARD_J**MSOS 4.1**_^1WATDTA INP XREJ-*_'READ STATUS_6**MSOS 4.1**_^1_%STA STATS_(SAVE STATUS_6**MSOS 4.1**_^1_%ALS 9_N**MSOS 4.1**_^1_%SAM LOSDTA_'SKIP IF LOST DATA_0**MSOS 4.1**_^1_%ALS 1_N**MSOS 4.1**_^1_%€€SAM ALM_*SKIP IF ALARM_4**MSOS 4.1**_^1_%ALS 2_N**MSOS 4.1**_^1_%SAM DATA_)SKIP IF DATA PRESENT_-**MSOS 4.1**_^1_%JMP* WATDTA_'LOOP WAITING FOR DATA READY_%**MSOS 4.1**_^1DATA_!INQ -1_M**MSOS 4.1**_^1_%INP XREJ-*_'READ DATA_8**MSOS 4.1**_^1_(RAO*_$CC_^1_(JMP*_$(INP)_^1LOSDTA ENQ 1_,LOST DATA ERROR_2**MSOS 4.1**_^1EREX_!JMP EREXIT_I**MSOS 4.1**_^1ALM_"ENQ 2_,ALARM ERROR_6**M€€SOS 4.1**_^1_%JMP* EREX_K**MSOS 4.1**_^1*_]_^1OVRIDE_!ADC_%0_3CARD WORD 1_^1CHKSUM_!ADC_%0_3CHECKSUM CELL_^1CKOVR_"ADC_%0_3CHECKSUM OVERIDE SWITCH_^1LAST_#NUM_%0_^1*_]_^1* *********************************************************************_^1*_!ASCII READ REQUEST PROCESSOR_^1*_$IF NO RECORD SIZE IS SPECIFIED, 40 WORDS ARE FILLED._^1*_$CONVERSION IS FROM HOLLERITH TO ASCII._^1*_$€€A BINARY RECORD WITH A HOLLERITH * IN COL 1 IS_^1*_'INTERPRETED AS AN ASCII RECORD._^1* *********************************************************************_^1ASCMD_"0_(0_^1_(RAO-_$ASKII,I_-SET ASCII MODE SWITCH_^1_(LDA*_$LAST_^1_(SAN_%IZSET-*-1_^1_%LDA CORE_^1_(INA_%40_^1_(STA*_$LAST_^1IZSET_"LDA_%SWITCH_B**MSOS 4.1**_^1_(SAN_%P-*-1_^1_(JMP*_$READ4_/WAS BIN REQ WITH * IN COL 1_€€^1P_'RTJ_%INPUTC_B**MSOS 4.1**_^1READ4_"LDQ_%W1_F**MSOS 4.1**_^1_(RTJ*_$PROCES_^1_(LDQ_%W2_F**MSOS 4.1**_^1_(RTJ*_$PROCES_^1_(LDQ_%W3_F**MSOS 4.1**_^1_(RTJ*_$PROCES_^1_(LDQ_%W4_F**MSOS 4.1**_^1_(RTJ*_$PROCES_^1_(LDA_%CC_F**MSOS 4.1**_^1_(INA_%-80_^1_(SAP_%1_^1_(JMP*_$P_^1_(JMP*_$(ASCMD)_^1XREJ_!JMP* IX_M**MSOS 4.1**_^1EX_#ENQ 6_,EXTERNAL REJECT ERROR_,**MSOS 4.1**_^1_%JMP* EREX_K*€€*MSOS 4.1**_^1IX_#ENQ 5_,INTERNAL REJECT ERROR_,**MSOS 4.1**_^1_%JMP* EREX_K**MSOS 4.1**_^1*_]_^1* *********************************************************************_^1* CONVERSION FROM HOLLERITH TO ASCII_^1* *********************************************************************_^1PROCES ADC 0_^1CONVRT_!ENA_%0_^1_(QLS_%7_^1_(SQP_%1_^1_(INA_%$71_1ROW 1_^1_(QLS_%1_^1_(SQP_%1_^€€1_(INA_%$62_1ROW 2_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$63_1ROW 3_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$64_1ROW 4_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$65_1ROW 5_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$66_1ROW 6_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$67_1ROW 7_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$18_1ROW 8_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$79_1ROW 9_^1_(AND_%=N$FF8F_-CLEAR CARRY FORCING BITS FOR_^1_(QLS_%5_3NUMERIC PUNC€€HES_^1_(SQP_%1_^1_(INA_%$70_1ROW 12_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$60_1ROW 11_^1_(QLS_%1_^1_(SQP_%1_^1_(INA_%$50_1ROW ZERO_^1_(AND_%=N$FFBF_^1_(ENQ_%0_^1_(LLS_%9_3ILLEGAL PUNCH_^1_%SQZ 6_N**MSOS 4.1**_^1_%CLR Q_N**MSOS 4.1**_^1_%STQ STATS_J**MSOS 4.1**_^1_%ENQ 8_,ILLEGAL HOLLERITH PUNCH_***MSOS 4.1**_^1_%JMP EREXIT_#ERROR IN HOLLERITH_^1_(LLS_%6_3NO_^1_%LDQ CDRD,Q_I**MSOS 4.€€1**_^1_(SAZ_%1_3UPPER CHAR_^1_(LRS_%8_3YES,SHIFT IT_^1_(LRS_%8_3TACK ON $FF_^1_(ENQ_%-0_2TO THE TOP_^1_(LRS_%8_3OF IT_^1FRCV_!LDQ* WHCHAR_#UPPER CHAR_^1_%SQN LOWER-*-1_^1_%ALS 8_+YES_^1_%JMP* STORIT_^1LOWER AND (CORE)_%NO_^1STORIT STA (CORE)_^1_%ENA 1_^1_%EOR* WHCHAR_^1_%STA* WHCHAR_^1_%SAN NXTCHR-*-1_^1_%RAO CORE_^1_%LDA CORE_%TEST FOR LAST CORE ADDR_^1_%SUB LAST_^1_%SAN€€ NXTCHR-*-1_^1_%JMP CHKOK_$NORMAL EXIT FROM DRIVER_^1NXTCHR JMP* (PROCES)_^1WHCHAR ADC 0_)UPPER OR LOWER CHAR TEST CELL_^1NSEQ_!NUM 0_^1*_]_^1*_]_^1STOPMO ADC 0_)STOP MOTION AND CLEAR CONTROLLER_^1_%LDQ ECARD_J**MSOS 4.1**_^1TRYDTA INP NOTBSY-*_$TAKE STATUS_6**MSOS 4.1**_^1_%ALS 12_^1_%SAP NO405_(DATA NOT PRESENT_^1_%INQ -1_^1_%INP 0_,GET EOP, COLUMN 80_^1_%NOP 0_^1_%IN€€Q 1_^1_%INP NOTBSY-*_^1_%ALS 12_^1NO405 ALS 3_,GET READY_^1_%SAP NOTBSY_'NO ****_:**MSOS 4.1**_^1_%ALS 12_+GET EOP_:**MSOS 4.1**_^1_%SAM 1_,YES EOP_:**MSOS 4.1**_^1_%JMP* TRYDTA_'LOOP READY AND EOP_/**MSOS 4.1**_^1BSY_"INP NOTBSY-*_$INPUT STATUS_^1_%ALS 14_^1_%SAP NBSY_)SKIP IF NOT BUSY_^1_%JMP* BSY_^1NBSY_!EQU NBSY(*)_^1_%ENA 1_N**MSOS 4.1**_^1_%OUT 1_,CLEAR CONTROLL€€ER_1**MSOS 4.1**_^1NOTBSY NOP 0_,PASS_=**MSOS 4.1**_^1_%JMP* (STOPMO)_$RETURN TO CALLER_1**MSOS 4.1**_^1CLMN1F NUM 0_,1ST COLUMN FLAG_^1SEQNUM NUM 0_,RETURN EXIT_^1_%LDA OVRIDE_^1_%ARS 8_,REMOVE 7-9 AND ZEROES_^1_%AND =N$00FF_%STRIP OFF SIGN EXTENSION_^1_%STA* NSEQ_^1_%SUB SEQ_^1_%SAZ GOON_^1_%LDA* NSEQ_)SAVE SEQ NUM IN ERROR FOR RETRY_^1_%STA SEQ_^1_%ENQ 9_,SEQUENCE ERRO€üR_3**MSOS 4.1**_^1_%CLR A_N**MSOS 4.1**_^1_%STA STATS_(STATUS MEANINGLESS_/**MSOS 4.1**_^1_%JMP EREXIT_I**MSOS 4.1**_^1GOON_!RAO SEQ_*BUMP SEQUENCE COUNTER_^1_%ENA 0_^1_%STA* CLMN1F_'RESET COLUMN 1 FLAG_^1_%JMP* (SEQNUM)_$NORMAL EXIT_^1_%END_]_^__üPQPTDMY CSY/ D05 Pj1_%NAM QPTDMY_'DECK-ID D05 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_$SYSTEM INITIALIZER DUMMY PAPER TAPE DRIVER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1_%ENT QPTAPE_^1_%ENT EPTAPE_^1QPTAPE NUM $FFFF_(DUMMY ENTRY_^1EPTAPE NUM 0_,DUMMY EQUIPMENT CODE_^1_%END_]_^__jPQ1827 CSY/ D06 P€1_%NAM Q1827_(DECK-ID D06 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_*INITIALIZER DRIVER FOR THE 1827 LINE PRINTER_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 3_^1*_]_^1*_]_^1_%ENT QPRINT_^1_%ENT EPRINT_^1_(ENT_$FORMFD_^1_(ENT_$HEADR1,HEADR2,HEADR3,HEADR4_^1_%SPC 3_^1DEVICE EQU DEVICE(4)_^1_%E€€QU FORMAT($40)_"TOP OF FORM CONTROL_^1PAGE_!EQU PAGE(57)_^1_%SPC 3_^1QPRINT NOP 0_-ENTRY TO DRIVER_^1_(STA*_#START_^1_(STQ*_#NCHAR_^1NTRAIN ENA 0_^1_(STA*_#CC_^1_(LDA*_#FORMFD_^1_%SAZ PAGEFD_'SKIP IF TIME FOR FORM FEED_^1_(JMP*_#COUNTL_^1PAGEFD_!STA*_#LINES_^1_(STA*_#COUNTW HEADER PRINT COUNTER_^1_%ENA FORMAT_(TOP OF FORM_^1_(ENQ_$-1_^1_(RTJ*_#OUTPUT_+TOP OF FORM_^1_(STA*_#€€FORMFD_^1_%SPC 2_^1LOOPER_!LDQ*_#COUNTW_^1_(LDA*_#HEADER,Q_^1_(SAZ_$HPRINT-*-1_'SKIP IF PRINT HEADER TIME_^1_(RTJ*_#DATA_-SEND TO BUFFER_^1_(RAO*_#COUNTW_^1_(JMP*_#LOOPER_^1HPRINT_!RTJ*_#PRINT_,PRINT THE HEADER_^1COUNTL_!LDA*_#LINES_^1_%INA -PAGE_^1_(SAN_$GOON-*-1_^1_(STA*_#FORMFD_+FORMFD=0_^1_(JMP*_#PAGEFD_^1GOON_#LDA*_#HEADCT_+CONTROL AND SPACE FOR EACH LINE_^1_%ENQ -1_^1_%ENA€€ 1_,LINE UP_^1_%RTJ* OUTPUT_^1PLOOP_"LDQ*_#CC_^1_(LDA*_#(START),Q_(GET 2 CHARACTERS_^1BLANK RTJ* DATA_^1_(RAO*_#CC_^1_(LDA*_#CC_^1_(SUB*_#NCHAR_^1_(SAP_$PRINT1_+SKIP IF BUFFER NOW OUTPUT_^1_(JMP*_#PLOOP_,LOOP BACK FOR NEXT WORD_^1PRINT1_!RTJ*_#PRINT_^1_(JMP*_#(QPRINT)_)EXIT_^1PRINT_"NOP_$0_^1_(CLR_$Q_^1_(ENA_$$20_^1_(RTJ*_#OUTPUT_+PRINT THE LINE_^1_(RAO*_#LINES_^1_(JMP*_#(PRINT)_€€^1_%EJT_]_^1OUTPUT_!NOP_$0_^1_%STA* SAVDAT_'SAVE DATA_^1_%STQ* SAVQ_)SAVE Q INCREMENT_^1LOOPX LDQ* EPRINT_^1_%INP -1_+STATUS_^1_%AND =N$B_(MASK STATUS_^1_%INA -9_+CHECK READY AND DATA_^1_%SAZ OK_+OK_^1_%JMP* LOOPX_(LOOP FOR READY AND DATA_^1OK_#LDQ =N0_^1SAVQ_!EQU SAVQ(*-1)_^1_%LDA =N0_^1SAVDAT EQU SAVDAT(*-1)_^1_%ADQ* EPRINT_^1_(NOP_$0_^1_(OUT_$-1_^1_(JMP*_#(OUTPUT)_)EXIT€€_^1_%SPC 5_^1DATA_#NOP_$0_^1_(ENQ_$-1_^1_(ALS_$8_^1_%RTJ* CHECK_^1_(ALS_$8_^1_$ENQ -1_^1_%RTJ* CHECK_^1_(JMP*_#(DATA)_+EXIT_^1CHECK NUM 0_^1_%STA* SAVDA2_'SAVE DATA_^1_%AND =N$7F_(MASK 7 LSB_^1_%INA -$20_^1_%SAP OK1_*GREATER THAN SPACE_^1_%CLR A_,MAKE IT A SPACE_^1OK1_"INA -$5F_^1_%SAM OK2_*LESS THAN A NULL_^1_%ENA -$5F_)MAKE IT A SPACE_^1OK2_"INA $7F_*RESTORE TO ORIGIN€€AL DATA_^1_%RTJ* OUTPUT_'GO OUT DATA_^1_%LDA =N0_*RESTORE DATA TO -A-_^1SAVDA2 EQU SAVDA2(*-1)_^1_%JMP* (CHECK)_%RETURN TO CALLER_^1_%SPC 5_^1TCOUNT NUM 0_^1START_"NUM_$0_^1NCHAR_"NUM_$0_^1CC_%NUM_$0_^1FORMFD_!NUM_$0_^1COUNTW_!NUM_$0_^1H2020 NUM $2020_^1HC0C0 NUM $C0C0_^1EPRINT ADC DEVICE*128+1_^1HEADCT_!NUM_$$0120_,SINGLE SPACE,SPACE_^1HEADER_!ALF_$4, DATE_^1HEADR1_!ALF_€Ø$1,_/MM_^1HEADR2_!ALF_$1,_//D_^1HEADR3_!ALF_$1,_/D/_^1HEADR4_!ALF_$1,_^1*_$ADDITIONAL HEADER INFO. MAY BE OUTPUT BUT IT MUST BE PLACED HERE*_^1LINES NUM 0_,LINE COUNT - MUST FOLLOW LAST WORD OF HEADER_^1_%END_]_^__ØPBOOTL7 CSY/ D07 P€1_%NAM BOOTL7_'DECK-ID D07 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$CYBER 18 LCTT 7 TRACK INITIALIZER BOOTSTRAP_^1*_$PERIPHERAL DRIVERS 1.1C_^1*_#SMALL SYSTEMS DIVISION - LA JOLLA, CA._^1*_#COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1****_]_^1*E_]_^1*_OF MEMORY TO BE DUMPED._^1*_<= $00 IF THE FIRST 65K IS TO BE DUMPED_^1*_>$20 IF THE SECOND 65K IS TO BE DUMPED_^1*_>$40 IF THE€€ THIRD 65K IS TO BE DUMPED_^1*_>$60 IF THE FOURTH 65K IS TO BE DUMPED_^1*_>FOR ALL THE ABOVE VALUES OF BPR THE_^1*_>SCRATCH PAGE REGISTER MUST BE SET AND_^1*_>THE LOGICAL ADDRESS ADJUSTED TO USE_^1*_>THE SCRATCH PAGE REGISTER._^1*_>HOWEVER, IF_^1*_8BPR = $FFFF THE PAGE REGISTERS ARE ALREADY_^1*_>SET UP AND THE LOGICAL ADDRESS NEED NOT_^1*_=BE ADJUSTED_^1*_8SCRPAG = THE SCRATCH PAG€€E REGISTER ADDRESS_^1*_AIN THE TOP 5 BITS, ZERO IN THE_^1*_ABOTTOM 11 BITS._^1GETWD 0_"0_,Q= TTTTTBBBBBBBBBBB_^1_%LDA* BPR_^1_%SAM GET10_(SKIP IF PAGE REGS AND LOG ADD ARE ALREADY SET._^1_%CLR A_^1_%LLS 5_,Q= BBBBBBBBBBB00000 , A= 00000000000TTTTT_^1_%ADD* BPR_*A= 00000000000XXXXX ,WHERE XXXXX = TTTTT+BPR_^1_%QLS 11_+Q= 00000BBBBBBBBBBB_^1_%ADD* SCRPAG_'A= SSSSS000000XXXXX_^1_€€%ADQ* SCRPAG_'Q= SSSSSBBBBBBBBBBB_^1_%WPR A_,WRITE INTO THE SCRATCH PAGE_^1GET10 LDA* (ZERO),Q_$GET THE WORD TO DUMP FROM MEMORY_^1_%JMP* (GETWD)_%RETURN_^1_%EJT_]_^1LOGABS 0_"0_^1*_;FUNCTION_^1*_;--------_^1*_]_^1*_$THIS SUBROUTINE COMPUTES THE PHYSICAL ADDRESS (18 BITS)_^1*_$OF A LOCATION USING ITS LOGICAL ADDRESS (16 BITS)_^1*_]_^1*_]_^1*_6INPUT REQUIREMENT_^1*_6-------------€€-----_^1*_]_^1*_$THE LOGICAL ADDRESS (16 BITS) IS PASSED IN THE Q REGISTER._^1*_]_^1*_= D, IF DEADSTART FDD OUTPUT_^1C_:M_!= MICROMEMORY PAGE TO BEGIN DEADSTARTING_^1C_:Q_!= I, IF IGNORING SPACES_^1C_>= S (OR BLANK), IF SPACES TO BE INSERTED_^1C_:P_!= E, IF EVEN PARITY TO BE DONE_^1C_>= N (OR BLANK), IF NO PARITY TO BE DONE_^1C_:STR = STARTING SECTOR OF FDD TO BE READ_^1C_:€€END = ENDING_!SECTOR OF FDD TO BE READ_^1C_:ADR = STARTING SECTOR TO BE WRITTEN/VERIFIED_^1C_:NUM = NO. OF TIMES FDD TRANSFER TO BE DONE_^1C_:WPS = NUMBER OF WORDS PER SECTOR_^1C_:SPT = NUMBER OF SECTORS PER TRACK_^1C_]_^1C_]_^1C_]_^1C_]_^1_$INTEGER PGMBUF(1)_^1_$INTEGER PGMLMT_^1C_]_^1_$INTEGER EQUVAR(7)_^1_$INTEGER_2COMPFG_^1_$INTEGER_2FDDLU_^1_$INTEGER_2SECADR_^1_$INTEGER_2RW€€FLAG_^1_$INTEGER_2SECTRK_^1_$INTEGER_2WRDSEC_^1_$INTEGER_2CMPIND_^1_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1_$EQUIVALENCE (EQUVAR(3), SECADR)_^1_$EQUIVALENCE (EQUVAR(4), RWFLAG)_^1_$EQUIVALENCE (EQUVAR(5), SECTRK)_^1_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1_$EQUIVALENCE (EQUVAR(7), CMPIND)_^1C_]_^1_$INTEGER_%CTLBUF_"(126)_^1_$INTEGER_%OPAUSF_€€^1_$INTEGER_%PGMPTR_^1_$INTEGER_%SECLTH_^1_$INTEGER_%STRSEC_^1_$INTEGER_%ENDSEC_^1_$INTEGER_%NTIMES_^1_$INTEGER_%REDSEC_^1_$INTEGER_%CPYSEC_^1_$INTEGER_%WRTSEC_^1_$INTEGER_%TRUE_^1_$INTEGER_%FALSE_^1_$RELATIVE_$INPBIN,ERRMSG,ABSPGS,CVTNUM_^1_$RELATIVE_$FDDIOC,OPAUSE,OUTLST,INIFDD,GETLU,HEXASC,FDDOEP_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1_$DATA_)FALSE,TRUE/ 0,1/_^1_$DATA_)WRDSEC/ 96/_€€^1_$DATA_)SECTRK/ 19/_^1C_]_^1C_]_^1C_FSET COMPARE AND PAUSE FLAGS_^1_$COMPFG = 1_^1_$OPAUSF = 1_^1_$SECADR = 0_^1C_]_^1C_FPAUSE TIL OPR READY, IF FLAG SET_^1 100 IF (OPAUSF .EQ. TRUE)_!CALL OPAUSE_^1C_FINPUT NEXT CONTROL RECORD_^1_$CALL INPBIN (CTLBUF, 41)_^1C_FOUTPUT RECORD TO LIST DEVICE_^1_$CALL OUTLST (CTLBUF, 40)_^1C_FCHECK FOR *A - ABSOLUTIZE FDD_^1_$IF (CTLBUF(1) .EQ. $2A4€€1) GOTO 200_^1C_FCHECK FOR *V - VERIFY FDD_^1_$IF (CTLBUF(1) .EQ. $2A56) GOTO 300_^1C_FCHECK FOR *C - COPY FDD_^1_$IF (CTLBUF(1) .EQ. $2A43) GOTO 400_^1C_FCHECK FOR *I - INITIALIZE FDD_^1_$IF (CTLBUF(1) .EQ. $2A49) GOTO 500_^1C_FCHECK FOR *F - DEFINE FDD FORMAT_^1_$IF (CTLBUF(1) .EQ. $2A46) GOTO 600_^1C_FCHECK FOR *R - RESET PAUSE FLAG_^1_$IF (CTLBUF(1) .EQ. $2A52) GOTO 700_^€€1C_FCHECK FOR *S - SET PAUSE FLAG_^1_$IF (CTLBUF(1) .EQ. $2A53) GOTO 800_^1C_FCHECK FOR *B - INPUT BINARY PGMS_^1_$IF (CTLBUF(1) .EQ. $2A42) GOTO 900_^1C_FCHECK FOR *H - INPUT HOLERITH_^1_$IF (CTLBUF(1) .EQ. $2A48) GOTO 1000_^1C_C***CHECK ILLEGAL CONTROL RECORD_^1_$IF (CTLBUF(1) .NE. $2A5A)_2CALL ERRMSG($0110)_^1C_F*Z - TERMINATE FDD UTILITY PGM_^1_$RETURN_^1C_]_^1C_]_^1C_]_^1C_€€]_^1C_]_^1C_B*A ABSOLUTIZE FDD FROM STD INPUT_^1C_FCONVERT FDD LOGICAL UNIT_^1 200 CALL GETLU (CTLBUF(2), FDDLU)_^1C_FABSOLUTIZE RELO PROGRAMS TO FDD_^1_$CALL ABSPGS (PGMBUF, PGMLMT, EQUVAR)_^1_$GOTO 100_^1C_]_^1C_]_^1C_]_^1C_B*V VERIFY A FDD AGAINST MASTER FDD_^1 300 COMPFG = COMPFG + $8000_^1C_]_^1C_]_^1C_B*C COPY MASTER FDD TO A FDD_^1C_FSET MASTER LU AND COPY/COMP LU_^1 4€€00 CALL GETLU (CTLBUF(2), LU1)_^1_$CALL GETLU (CTLBUF(4), LU2)_^1_$IF (LU2 .EQ. 0) LU2 = LU1_^1C_FGET START AND ENDING SECTORS_^1_$CALL CVTNUM (CTLBUF(6), STRSEC, 77*SECTRK)_^1_$CALL CVTNUM (CTLBUF(8), ENDSEC, 77*SECTRK)_^1_$CALL CVTNUM (CTLBUF(10),CPYSEC, 77*SECTRK)_^1_$CALL CVTNUM (CTLBUF(12),NTIMES, $7FFF)_^1C_FSET DEFAULT CONDITIONS_^1_$IF (ENDSEC .EQ. 0) ENDSEC = STRSEC_^€€1_$IF (CPYSEC .EQ. 0) CPYSEC = STRSEC_^1_$IF (NTIMES .EQ. 0) NTIMES = 1_^1C_C***ILLEGAL START/END SECTOR ADDRESS_^1_$IF (ENDSEC-STRSEC .LT. 0)_2CALL ERRMSG($0120)_^1C_C***ILLEGAL COPY ADDRESS_^1_$IF ((CPYSEC+ENDSEC-STRSEC)/SECTRK .GE. 77) CALL ERRMSG($0130)_^1C_]_^1C_FREPEAT COPY/VERIFY N TIMES_^1_$DO 410 I=1,NTIMES_^1_$WRTSEC = CPYSEC_^1C_]_^1_$DO 410 REDSEC = STRSEC, ENDSEC€€_^1C_FREAD FROM MASTER FDD_^1_)FDDLU = LU1_^1_)SECADR = REDSEC_^1_)RWFLAG = 0_^1_)CALL FDDIOC (CTLBUF, WRDSEC, EQUVAR)_^1C_FWRITE DATA TO COPY FDD, OR_^1C_FCOMPARE WITH OTHER FDD._^1_)FDDLU = LU2_^1_)SECADR = WRTSEC_^1_)RWFLAG = 1_^1C_FIF DELETED REC READ, WRITE IT_^1_)IF (AND(CMPIND,$2000) .NE. 0)_!RWFLAG = 2_^1_)CALL FDDIOC (CTLBUF, WRDSEC, EQUVAR)_^1_)WRTSEC = WRTSEC + 1_^1 410 €€ CONTINUE_^1_$COMPFG = AND(COMPFG,$7FFF)_^1_$GOTO 100_^1C_]_^1C_B*I INITIALIZE A FDD_^1 500 CALL GETLU (CTLBUF(2), FDDLU)_^1_$CALL CVTNUM (CTLBUF(4), NTIMES, $7FFF)_^1_$IF (NTIMES .EQ. 0)_!NTIMES = 1_^1C_FREPEAT INITIALIZE N TIMES_^1_$DO 510 I=1,NTIMES_^1 510_$CALL INIFDD (PGMBUF, PGMLMT, EQUVAR)_^1_$GOTO 100_^1C_]_^1C_]_^1C_]_^1C_F*F DEFINE THE FDD FORMAT_^1 600 CALL CVTN€€UM (CTLBUF(2), WRDSEC, 127)_^1_$IF (WRDSEC .EQ. 0)_!WRDSEC = 96_^1_$CALL CVTNUM (CTLBUF(4), SECTRK, 129)_^1_$IF( SECTRK .EQ. 0)_!SECTRK = 19_^1C_C***CHECK IF SECTORS/TRACK TOO BIG_^1_$IF (5208.LT.73+(((2*WRDSEC+33)*7+5)/6)*SECTRK) CALL ERRMSG($0140)_^1_$GOTO 100_^1C_]_^1C_]_^1C_]_^1C_F*R RESET OPERATOR PAUSE FLAG_^1 700 OPAUSF = FALSE_^1_$GOTO 100_^1C_]_^1C_F*S SET OPERATOR PA€€USE FLAG_^1 800 OPAUSF = TRUE_^1_$GOTO 100_^1C_]_^1C_]_^1C_]_^1C_F*B INPUT BINARY FROM STD INPUT_^1 900 CALL GETLU (CTLBUF(2), FDDLU)_^1_$CALL CVTNUM (CTLBUF(4), STRSEC, 77*SECTRK)_^1_$IF (STRSEC .NE. 0)_!SECADR = STRSEC_^1_$IPGMNO = 0_^1_$CTLBUF(3) = $2020_^1C_FINPUT NEXT BINARY PROGRAM_^1 910 CALL INPBIN (PGMBUF, PGMLMT)_^1C_FCONVERT PROGRAM NUMBER TO ASCII_^1_$CTLBUF(1) = $€€2A54_^1_$CTLBUF(2) = $2020_^1_$IF (PGMBUF(1) .EQ. $2A54)_!GOTO 920_^1_$IPGMNO = IPGMNO + 1_^1_$CALL HEXASC (IPGMNO, CTLBUF(1), 0)_^1_$CTLBUF(1) = AND(CTLBUF(1),$FF) + $ 2000_^1C_FCONVERT SECTOR ADR AND OUTPUT_^1 920 CALL HEXASC (SECADR, CTLBUF(4), 0)_^1_$CTLBUF(4) = AND(CTLBUF(4),$FF) + $2000_^1_$CALL OUTLST (CTLBUF,5)_^1C_FCHECK IF NO MORE PRMS (*T)_^1_$IF (CTLBUF(1) .EQ. $2A54)€€_!GOTO 100_^1C_]_^1C_FWRITE BINARY PROGRAM TO FDD_^1_$PGMPTR = PGMBUF(PGMLMT)_^1_$RWFLAG = 1_^1_$CALL FDDIOC (PGMBUF, PGMPTR, EQUVAR)_^1_$SECADR = SECADR + PGMPTR/WRDSEC + 1_^1_$GOTO 910_^1C_]_^1C_F*H INPUT HOLLERITH (ASCII)_^11000 CALL GETLU (CTLBUF(2), FDDLU)_^1_$CALL CVTNUM (CTLBUF(4), STRSEC, 77*SECTRK)_^1_$IF (STRSEC .NE. 0)_!SECADR = STRSEC_^1_$ISPACE = FALSE_^1_$IF (AND(€€CTLBUF(6),$FF) .EQ. $49)_!ISPACE = TRUE_^1_$IEVENP = FALSE_^1_$IF (AND(CTLBUF(7),$FF) .EQ. $45) IEVENP = TRUE_^1C_FCONVERT SECTOR ADR AND OUTPUT_^1_$DO 1010 I=1,3_^11010_$CTLBUF(I) = $2020_^1_$CALL HEXASC (SECADR, CTLBUF(4), 0)_^1_$CTLBUF(4) = AND(CTLBUF(4),$FF) + $2000_^1_$CALL OUTLST (CTLBUF,5)_^1C_FINPUT NEXT HOLERITH RECORD_^1_$J = 0_^11020 CALL INPBIN (CTLBUF, 41)_^1C_FCHE€€CK IF NO MORE (*T RECORD)_^1_$IF (CTLBUF(1) .EQ. $2A54)_!GOTO 1060_^1C_]_^1C_FMOVE CHARACTERS TO BUFFER_^1_$DO 1050 I=1,80_^1_)II = (I-1)/2 + 1_^1_)ICHAR = CTLBUF(II)_^1_)IF (AND(I,1) .EQ. 1)_!ICHAR = ICHAR/$100_^1_)ICHAR = AND (ICHAR, $FF)_^1C_FCHECK IF IGNORING SPACES_^1_)IF (ICHAR.EQ.$20 .AND. ISPACE.EQ.TRUE)_"GOTO 1050_^1C_]_^1_)J = J + 1_^1_)PGMPTR = (J-1)/2 + 1_^1_)IF (AN€€D(J,1) .EQ. 0)_!GOTO 1030_^1_-PGMBUF(PGMPTR) = ICHAR*$100 + $20_^1_-GOTO 1050_^11030_$PGMBUF(PGMPTR) = EOR (AND(PGMBUF(PGMPTR),$FF00), ICHAR)_^1_)IF (PGMPTR .NE. WRDSEC)_!GOTO 1050_^1C_FBUFFER FULL, OUTPUT SECTOR_^1_-J = 0_^1C_FIS EVEN PARITY TO BE ADDED_^1_-IF (IEVENP .EQ. FALSE) GOTO 1040_^1_1CALL FDDOEP (PGMBUF, WRDSEC, EQUVAR)_^1_1GOTO 1050_^1C_]_^11040_,RWFLAG = 1_^1_1CA€BLL FDDIOC (PGMBUF, WRDSEC, EQUVAR)_^1_1SECADR = SECADR + 1_^11050 CONTINUE_^1_$GOTO 1020_^1C_]_^11060 IF (J .EQ. 0)_!GOTO 920_^1C_FOUTPUT LAST SECTOR, SPACE FILL_^1_$PGMPTR = (J-1)/2 + 2_^1_$DO 1070 I=PGMPTR,WRDSEC_^11070_$PGMBUF(I) = $2020_^1_$CALL FDDOEP (PGMBUF, WRDSEC, EQUVAR)_^1_$GOTO 920_^1C_]_^1_%END_]_^__ BPABSPGS CSY/ D02 P€1_$SUBROUTINE ABSPGS (PGMBUF,PGMLMT,EQUVAR)_^1_#*_2/DECK-ID D02 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_]_^1C_(F D D_!U T I I L I T Y_!A B S O L U T I Z E R_!F O R_^1C_]_^1C_(R E L O C A T A B L E_!P R O G R A M S_!T O_!F D €€D_^1C_]_^1C_]_^1C_#THE PROGRAM EXPECTS FIRST A NAM RECORD. IT PRINTS FROM THIS_^1C_#RECORD THE PROGRAM NAME, LENGTH, AND ID INFORMATION ON THE LIST_^1C_#DEVICE. ZERO TO N RBD RECORDS ARE THEN INPUT AND THEIR WORDS_^1C_#ABSOLUTIZED TO PGMBUF. THE LAST RECORD (XFR) CAUSES FDD OUTPUT_^1C_]_^1C_]_^1_$INTEGER_%PGMBUF_"(1)_^1_$INTEGER_%PGMLMT_^1C_]_^1_$INTEGER EQUVAR(7)_^1_$INTEGER_2C€€OMPFG_^1_$INTEGER_2FDDLU_^1_$INTEGER_2SECADR_^1_$INTEGER_2RWFLAG_^1_$INTEGER_2SECTRK_^1_$INTEGER_2WRDSEC_^1_$INTEGER_2CMPIND_^1_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1_$EQUIVALENCE (EQUVAR(3), SECADR)_^1_$EQUIVALENCE (EQUVAR(4), RWFLAG)_^1_$EQUIVALENCE (EQUVAR(5), SECTRK)_^1_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1_$EQUIVALENCE (EQUVAR(7), C€€MPIND)_^1C_]_^1_$INTEGER_%BYTEWD_^1_$INTEGER_%DEADST_^1_$INTEGER_%ENDFLG_^1_$INTEGER_%FALSE_^1_$INTEGER_%FIRFLG_^1_$INTEGER_%INPBUF_"(60)_^1_$INTEGER_%INPPTR_^1_$INTEGER_%NAMBUF_"(141)_^1_$INTEGER_%NAMFLG_^1_$INTEGER_%NAMLMT_^1_$INTEGER_%NAMPTR_^1_$INTEGER_%NBYTES_^1_$INTEGER_%PGMPTR_^1_$INTEGER_%RLOTYP_^1_$INTEGER_%SECLTH_^1_$INTEGER_%SECTOR_^1_$INTEGER_%TRUE_^1_$RELATIVE_$INPBIN,€€ERRMSG,HEXASC,OUTLST,CVTNUM,DSRCVT,FDDIOC_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1_$DATA FALSE, TRUE/ 0,1/_^1_$DATA_)NAMLMT/_!140/_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1_$NAMPTR = 1_^1C_FINPUT PROGRAM NAMES, STARTING_^1C_HSECTORS, AND DEADSTRART FLAGS._^1_$DO 20 I=1,NAMLMT,7_^1_)CALL INPBIN (INPBUF, 60)_^1C_FCHECK FOR *T (ALL NAMES INPUT)_^1_)IF (INPBUF(1) .EQ. $2A54) GOTO 30_^1C_€€C***CHECK FOR ILLEGAL RECORD (NOT*,)_^1_)IF (INPBUF(1) .NE. $2A2C)_.CALL ERRMSG($0210)_^1C_]_^1C_FSAVE DATA IN NAME ARRAY_^1_)DO 10 J=2,8_^1_-NAMBUF(NAMPTR) = INPBUF(J)_^1 10_*NAMPTR = NAMPTR + 1_^1 20_!CONTINUE_^1C_C***TOO MANY PROGRAM NAMES SPECIFIED_^1_QCALL ERRMSG($0220)_^1C_FSETUP POINTERS_^1 30_!NAMBUF(NAMPTR) = 0_^1_$NAMPTR = 1_^1C_]_^1C_]_^1C_]_^1C_FCLEAR POINTER AND NAME€€ FLAGS_^1 50_!PGMPTR = 0_^1_$NAMFLG = FALSE_^1C_FINPUT NEXT RECORD_^1 60_!CALL INPBIN (INPBUF, 60)_^1_$IF (AND(INPBUF(1),$1FFF) .EQ. $0050) GOTO 80_^1C_]_^1C_C***NOT A BINARY RECORD, CHECK IF *T_^1_$IF (INPBUF(1) .NE. $2A54)_2CALL ERRMSG($0230)_^1C_C***CHECK IF NO NAME RECORD INPUT_^1_$IF (NAMFLG .EQ. TRUE)_6CALL ERRMSG($0240)_^1C_FPRINT *T RECORD WITH LAST + 1_^1C_ISECTOR ADDRESS€€_^1_$CALL HEXASC (SECADR,INPBUF(8),0)_^1_$INPBUF(8) = AND (INPBUF(8),$FF) + $2000_^1_$CALL OUTLST (INPBUF, 40)_^1C_]_^1C_C***CHECK IF ALL SPECIFIED PROGRAM_^1C_HNAMES HAVE OCCURRED_^1_$IF (NAMBUF(NAMPTR) .NE. 0)_1CALL ERRMSG($0250)_^1_$RETURN_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1 80_!RLOTYP = AND (INPBUF(1)/$2000,7) + 1_^1C_]_^1C_+XXX,NAM,RBD,BZS,ENT,EXT,XFR,XXX_^1_$GOTO (200,100€€,500,200,300,200,400,200),_"RLOTYP_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1C_C***NAM RECORD, CHECK NOT FIRST_^1 100 IF (NAMFLG .EQ. TRUE)_6CALL ERRMSG($0260)_^1_$NAMFLG = TRUE_^1_$LENGTH = INPBUF(4)/2_^1C_FMOVE PROGRAM NAME AND SAVE_^1_$DO 110 I=2,4_^1 110_$INPBUF(I) = INPBUF(I+3)_^1_$INPBUF(5) = $2020_^1C_FCONVERT PGM LENGTH TO ASCII_^1_$CALL HEXASC (LENGTH, INPBUF(6), 0)_^1C_]_^1C_]_^€€1C_FCHECK IF PROGRAM NAME SPECIFIED_^1_$J = NAMPTR_^1_$ICHAR = $20_^1_$ISPAGE = $30_^1_$DO 120 I=2,4_^1_)IF (INPBUF(I) .NE. NAMBUF(J)) GOTO 150_^1 120_$J = J + 1_^1C_]_^1C_FYES, USE SPECIFIED SECTOR, NOT_^1C_KTHE NEXT CONTINUOUS ONE._^1_$CALL CVTNUM (NAMBUF(NAMPTR+3), SECTOR, 77*SECTRK)_^1C_FCHANGE SECTOR ADDRES IF NOT ZERO_^1_$IF (SECTOR .EQ. 0) GOTO 130_^1_)SECADR = SECTOR_^€€1_)ICHAR = $2A_^1C_]_^1C_FSET OR CLEAR DEADSTART FLAG_^1 130 DEADST = FALSE_^1_$IF (AND(NAMBUF(NAMPTR+5),$FF) .NE. $44) GOTO 140_^1C_FSAVE ASCII STARTING PAGE NUMBER_^1_$DEADST = TRUE_^1_$ISPAGE = AND (NAMBUF(NAMPTR+6), $FF)_^1_$IF (ISPAGE .EQ. $20)_!ISPAGE = $30_^1C_FINCREMENT TO NEXT SPECIFIED NAME_^1 140 NAMPTR = NAMPTR + 7_^1C_]_^1C_FCONVERT SECTOR ADDRESS TO ASCII_^1 150 €€ CALL HEXASC (SECADR,INPBUF(8),0)_^1_$INPBUF(8) = AND (INPBUF(8),$FF) + ICHAR*$100_^1_$INPBUF(10)= $2020_^1C_FPRINT NAME, PGM LENGTH, SECTOR_^1C_FADDRESS, AND IDENT INFORMATION_^1_$INPBUF(1) = $2020_^1_$IF (DEADST .EQ. TRUE) INPBUF(1) = $202A_^1_$CALL OUTLST (INPBUF, 33)_^1_$GOTO 60_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1C_C***ILLEGAL RECORD_^1 200_MCALL ERRMSG($0270)_^1C_]_^1C_]_^1C_C*€€**ENT RECORD, IGNORE IF LEGAL_^1 300 IF (NAMFLG .EQ. FALSE)_5CALL ERRMSG($0280)_^1_$GOTO 60_^1C_]_^1C_]_^1C_C***XFR RECORD, RETURN IF LEGAL_^1 400 IF (NAMFLG .EQ. FALSE)_5CALL ERRMSG($0280)_^1C_]_^1C_FCHECK DEADSTART FLAG_^1_$IF (DEADST .EQ. FALSE) GOTO 410_^1C_]_^1C_FCONVERT PROGRAM TO DEADSTART_^1C_HRECORDS AND OUTPUT TO FDD._^1_$CALL DSRCVT (PGMBUF, PGMPTR, EQUVAR, ISPAGE)€€_^1_$GOTO 50_^1C_]_^1C_]_^1C_FNOT SET, OUTPUT PGM TO FDD_^1 410 RWFLAG = 1_^1_$CALL FDDIOC (PGMBUF, PGMPTR, EQUVAR)_^1C_FSET TO NEXT AVAILABLE SECTOR_^1_$SECADR = SECADR + PGMPTR/WRDSEC + 1_^1_$GOTO 50_^1C_]_^1C_]_^1C_]_^1C_C***RBD RECORD, CHECK IF NAM INPUT_^1 500 IF (NAMFLG .EQ. FALSE)_5CALL ERRMSG($0280)_^1C_FYES, SETUP TO IGNORE ADDRESS_^1_$FIRFLG = TRUE_^1_$INPPTR = 1_^1C€€_]_^1C_FPROCESS NEXT FOUR BINARY WORDS_^1_$DO 540 I=1,12_^1C_FGET BYTE WORD_^1_)INPPTR = INPPTR + 1_^1_)BYTEWD = INPBUF(INPPTR)_^1_)ENDFLG = TRUE_^1C_FCHECK IF ENDING BYTE ENCOUNTERED_^1_)DO 510 NBYTES=1,4_^1_-IF (BYTEWD .LT. 0) GOTO 520_^1 510_)BYTEWD = BYTEWD * $10_^1C_FNO, SET ENDFLG FALSE. CONTINUE_^1_)ENDFLG = FALSE_^1_)NBYTES = 4_^1C_FTRANSFER 4 WORDS TO PGM BUFFER_^1 €€520_$DO 530 J=1,NBYTES_^1_-INPPTR = INPPTR +1_^1_-IF (FIRFLG .EQ. TRUE)GOTO 530_^1C_C***CHECK IF TOO MANY BINARY WORDS_^1_-PGMPTR = PGMPTR +1_^1_-IF (PGMPTR .EQ. PGMLMT)_,CALL ERRMSG($0299)_^1_-PGMBUF(PGMPTR) = INPBUF(INPPTR)_^1 530_)FIRFLG = FALSE_^1C_FGET NEXT RECORD IF DONE_^1_)IF (ENDFLG .EQ. TRUE) GOTO 60_^1C_]_^1 540 CONTINUE_^1C_C***NO END BYTE ENCOUNTERED_^1_QCALL ERRM€SG($0290)_^1C_]_^1_%END_]_^__ PDSRCVT CSY/ D03 P€1_$SUBROUTINE DSRCVT (PGMBUF,PGMLTH,EQUVAR,ISPAGE)_^1_#*_2/DECK-ID D03 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_]_^1C_(F D D_!U T I L I T Y_!D E A D S T A R T_!R E C O R D_^1C_]_^1C_2C O N V E R S I O N_!P R O G R A M_^1C_]_^€€1C_]_^1C_(THE PROGRAM CONVERTS 8 HEX DIGITS (TWO WORDS) TO ASCII,_^1C_(FOLLOWED BY A COLON. THIS IS DONE FOR ALL THE 32-BIT DATA._^1C_(IT IS PRECEEDED AND FOLLOWED BY DEADSTART CONTROL RECORDS._^1C_]_^1C_(THE RESULTING DATA IS OUTPUT TO THE FDD A SECTOR AT A TIME._^1C_(THIS INFORMATION CAN BE INPUT VIA THE SERIAL INTERFACE_^1C_((I.E., DEADSTARTING)._^1C_]_^1C_]_^1_$INTEGER PGMBUF€€(1)_^1_$INTEGER PGMLTH_^1C_]_^1_$INTEGER EQUVAR(7)_^1_$INTEGER_2COMPFG_^1_$INTEGER_2FDDLU_^1_$INTEGER_2SECADR_^1_$INTEGER_2RWFLAG_^1_$INTEGER_2SECTRK_^1_$INTEGER_2WRDSEC_^1_$INTEGER_2CMPIND_^1_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1_$EQUIVALENCE (EQUVAR(3), SECADR)_^1_$EQUIVALENCE (EQUVAR(4), RWFLAG)_^1_$EQUIVALENCE (EQUVAR(5), SECTRK)_^1€€_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1_$EQUIVALENCE (EQUVAR(7), CMPIND)_^1C_]_^1C_]_^1_$INTEGER INDEXN_^1_$INTEGER INDEXP_^1_$INTEGER OFFSET_^1_$INTEGER OUTBUF(180)_^1_$INTEGER OUTPTR_^1_$INTEGER PGMEND_^1_$INTEGER PGMPTR_^1_$INTEGER SECLTH_^1_$RELATIVE_$HEXASC,FDDOEP,ASCHEX_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1C_]_^1_$INTEGER SCONTR(485)_^1_$INTEGER NCONTR( 9)_^1_$INTEG€€ER ECONTR(48)_^1_$INTEGER SCRLTH_^1_$INTEGER SCRLGH_^1_$INTEGER NCRLTH_^1_$INTEGER ECRLTH_^1C_]_^1_$DATA_#SCRLTH/484/_^1_$DATA_#NCRLTH/ 8/_^1_$DATA_#ECRLTH/47/_^1C_]_^1_$DATA (SCONTR(I), I= 1, 57)/_^1_#* 'J ', 10*' ',_^1_#*_"'J48G J10G K4488D000G L0000G K0G J03G J11G L0000G K0G',_^1_#*_.'J05G J12G L0000G K0G J02G L00G J06G L000'_'/_^1_$DATA (SCONTR(I), I= 58,121)/_^1_#*_6'0G€€0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G'_'/_^1_$DATA (SCONTR(I), I=122,185)/_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G'_'/_^1_$DATA (SCO€€NTR(I), I=186,249)/_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G'_'/_^1_$DATA (SCONTR(I), I=250,313)/_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G€€0G0G0G0G0G0G'_'/_^1_$DATA (SCONTR(I), I=314,323)/_^1_#*_C'J01G L00G J00G L000 '_%/_^1_$DATA (SCONTR(I), I=324,387)/_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G'_'/_^1_$DATA (SCONTR(I), I=388,451)/_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G€€0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G',_^1_#*_6'0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G'_'/_^1_$DATA (SCONTR(I), I=452,457)/_^1_#*_.'J1EG K0000G '_C/_^1_$DATA (SCONTR(I), I=458,485)/_^1_#* 'J ', 10*' ','J48G J10G K28089000G K0040G L00G'_),$FFFF/_^1C_]_^1_$DATA NCONTR/_^1_#*_!'J01G LXXG J0CG L'_E,$FFFF/_^1C_]_^1_$DATA ECONTR/_^1_#*_!'J1AG K0000G J15G K80003X0€€0G IG J10G K96098800G',_^1_#*_!' JXXXXXXXX54G K1000G J41GK', 10*' ', 'G '_,,$FFFF/_^1C_]_^1_$DATA INDEXN/ 4/_^1_$DATA INDEXP/12/_^1_$DATA INDEXT/25/_^1C_]_^1C_]_^1C_FCOMPUTE MICROMEMORY HALF PAGE NO_^1C_FIN ASCII AND STORE FOR LOADING_^1C_FTHE N REGISTER THE FIRST TIME._^1_$CALL ASCHEX (ISPAGE, ISP)_^1_$IHPAGE = $3030_^1_$IF (ISP .LT. 8)_!GOTO 5_^1_)ISP_"= ISP - 8_^1_)IHPAGE €€= $3130_^1 5_!IF (ISP .GE. 5)_!IHPAGE = IHPAGE + 7_^1_$NCONTR(INDEXN) = IHPAGE + 2*ISP_^1C_]_^1C_FSTORE MICROMEMORY PAGE NUMBER IN_^1C_FASCII FOR STARTING PROGRAM_^1_$ECONTR(INDEXP) = $3300 + ISPAGE_^1C_]_^1C_FECHO THE PROGRAM TEST NUMBER_^1_$CALL HEXASC (PGMBUF(1), ECONTR(INDEXT ),0)_^1_$CALL HEXASC (PGMBUF(2), ECONTR(INDEXT+2),0)_^1C_]_^1C_FSKIP INITIALIZE REGISTERS IF_^1C_FNOT€€ ON DEADSTART SECTOR (0101)_^1_$J = 458_^1_$SCRLGH = 457_^1_$IF (SECADR .NE. SECTRK)_!GOTO 12_^1C_]_^1C_FINSERT DEADSTART CONTROL RECORDS_^1C_FWRITE ANY FULL SECTORS TO FDD_^1_$SCRLGH = SCRLTH/WRDSEC*WRDSEC_^1_$DO 10 J = 1, SCRLGH, WRDSEC_^1 10_%CALL FDDOEP (SCONTR(J), WRDSEC, EQUVAR)_^1C_FTRANSFER EXCESS TO PROGRAM BUFER_^1 12_!K = SCRLTH - SCRLGH_^1_$DO 15 I = 1, K_^1_)OUTBU€€F(I) = SCONTR(J)_^1 15_%J = J + 1_^1C_]_^1C_]_^1C_FSETUP POINTERS AND FLANGS_^1_$PGMEND = PGMLTH/2_^1_$PGMPTR = 0_^1_$OUTPTR = I_^1_$OFFSET = 0_^1C_]_^1C_]_^1C_FCONVERT PROGRAM TO DEADSTART FMT_^1_$DO 60 I = 1, PGMEND_^1C_FCHECK IF AT ONE-HALF PAGE_^1_)IF (PGMPTR .NE. PGMPTR/512*512)_(GOTO 30_^1C_FYES, INSERT SET N-REG RECORDS_^1_)IF (OFFSET .NE. 0) OUTPTR = OUTPTR + 1_^1_)DO 2€€0 J = 1, NCRLTH_^1_-OUTBUF(OUTPTR) = NCONTR(J)_^1 20_*OUTPTR = OUTPTR + 1_^1C_FINCREMENT SET N-REG RECORD_^1_)NCONTR(INDEXN) = NCONTR(INDEXN) + 1_^1_)IF (NCONTR(INDEXN) .EQ. $303A) NCONTR(INDEXN) = $3041_^1_)IF (NCONTR(INDEXN) .EQ. $3047) NCONTR(INDEXN) = $3130_^1_)IF (NCONTR(INDEXN) .EQ. $313A) NCONTR(INDEXN) = $3141_^1C_]_^1C_FCONVERT ONE 32-BIT DATA, 2 WORDS_^1 30_%DO 40 J€€ = 1, 2_^1C_FCONVERT FROM HEX TO ASCII_^1_-PGMPTR = PGMPTR + 1_^1_-CALL HEXASC (PGMBUF(PGMPTR), OUTBUF(OUTPTR), OFFSET)_^1_-OUTPTR = OUTPTR + 2_^1 40_%CONTINUE_^1C_]_^1C_FINSERT ASCII COLON PROPERLY_^1_)OUTBUF(OUTPTR) = OUTBUF(OUTPTR) + $3A_^1_)IF (OFFSET .EQ. 0) OUTBUF(OUTPTR) = $3A20_^1_)OFFSET = AND (OFFSET+1, 1)_^1_)IF (OFFSET .EQ. 0) OUTPTR = OUTPTR +1_^1C_]_^1C_FCHECK IF EN€€OUGH FOR SECTOR WRITE_^1_)IF (WRDSEC .GE. OUTPTR)_0GOTO 60_^1C_FYES, OUTPUT TO FDD UNIT_^1_)CALL FDDOEP (OUTBUF, WRDSEC, EQUVAR)_^1C_FMOVE ANY EXCESS TO START OF BFR._^1_)OUTPTR = OUTPTR - WRDSEC_^1_)L = WRDSEC_^1_)DO 50 J = 1, OUTPTR_^1_-L = L + 1_^1 50_*OUTBUF(J) = OUTBUF(L)_^1C_]_^1C_]_^1 60_!CONTINUE_^1C_]_^1C_]_^1C_FINSERT SPACE TO COMPLETE WORD_^1_$IF (OFFSET .NE. 0) OUTPT€€R = OUTPTR + 1_^1C_]_^1C_FCHECK IF THERE IS ENOUGH ROOM_^1C_FFOR END CONTROL RECORDS_^1_$IF (OUTPTR + ECRLTH .LE. WRDSEC)_+GOTO 90_^1C_FNO, PAD WITH SPACES AND OUTPUT_^1_$DO 80 I = OUTPTR, WRDSEC_^1 80_%OUTBUF(I) = $2020_^1_$CALL FDDOEP (OUTBUF, WRDSEC, EQUVAR)_^1_$OUTPTR = 1_^1C_]_^1C_FINSERT DEADSTART CONTROL_^1C_FRECORDS AT END OF PROGRAM_^1 90_!DO 100 I = 1, ECRLTH_^1_)OUTB€UF(OUTPTR) = ECONTR(I)_^1 100_$OUTPTR = OUTPTR + 1_^1C_]_^1C_FPAD RESET OF SECTOR WITH SPACES_^1_$DO 110 I = OUTPTR, WRDSEC_^1 110_$OUTBUF(I) = $2020_^1C_FWRITE OUT LAST SECTOR_^1_$CALL FDDOEP (OUTBUF, WRDSEC, EQUVAR)_^1C_]_^1C_]_^1C_]_^1_$RETURN_^1_%END_]_^__PFDDOEP CSY/ D12 P€1_$SUBROUTINE FDDOEP (OUTBUF, SECLTH, EQUVAR)_^1_#*_2/DECK-ID D12 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_]_^1C_(F D D_!U T I L I T Y_!O U T P U T P R O G R A M_^1C_]_^1C_2E V E N_!P A R I T Y_^1C_]_^1C_]_^1C_]_^1_$INTEGER_%€€OUTBUF(1)_^1_$INTEGER_%SECLTH_^1C_]_^1_$INTEGER EQUVAR(7)_^1_$INTEGER_2COMPFG_^1_$INTEGER_2FDDLU_^1_$INTEGER_2SECADR_^1_$INTEGER_2RWFLAG_^1_$INTEGER_2SECTRK_^1_$INTEGER_2WRDSEC_^1_$INTEGER_2CMPIND_^1_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1_$EQUIVALENCE (EQUVAR(3), SECADR)_^1_$EQUIVALENCE (EQUVAR(4), RWFLAG)_^1_$EQUIVALENCE (EQUVAR(5), SECT€€RK)_^1_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1_$EQUIVALENCE (EQUVAR(7), CMPIND)_^1C_]_^1_$RELATIVE_$FDDIOC_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1C_]_^1_$DO 30 I=1,SECLTH_^1_)IW = OUTBUF(I)_^1C_FDETERMINE PARITY OF UPPER CHAR_^1_)ICNT1 = 0_^1_)DO 10 J=1,8_^1_-IF (IW .LT. 0)_!ICNT1 = ICNT1 + 1_^1_-IW = IW * 2_^1 10_%CONTINUE_^1C_FDETERMINE PARITY OF LOWER CHAR_^1_)ICNT2 = 0_^1_)DO €x 20 J=1,8_^1_-IF (IW .LT. 0)_!ICNT2 = ICNT2 + 1_^1_-IW = IW * 2_^1 20_%CONTINUE_^1C_FGENERATE EVEN PARITY FOR 2 CHARS_^1_)IW = AND(ICNT1,1)*$8000 + AND(ICNT2,1)*$80_^1_)OUTBUF(I) = OR(OUTBUF(I), IW)_^1 30_!CONTINUE_^1C_]_^1C_FOUTPUT DEADSTART BUFFER TO FDD_^1_$RWFLAG = 1_^1_$CALL FDDIOC (OUTBUF, SECLTH, EQUVAR)_^1_$SECADR = SECADR + 1_^1C_]_^1_$RETURN_^1C_]_^1_%END_]_^__ xPINIFDD CSY/ D13 P€1_$SUBROUTINE INIFDD (BUFFER, LBUF, EQUVAR)_^1_#*_2/DECK-ID D13 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_]_^1C_(INITIALIZE A FLEXIBLE DISK DRIVE_^1C_]_^1C_]_^1C_]_^1C_]_^1C_2NO. OF_^1C_2BYTES_#CLOCK_#DATA_^1C_(1._'40_'FF_'FF_^€€1C_(2._(6_'FF_'00_^1C_(3._(1_'D7_'FC_^1C_(4._'26_'FF_'FF_^1C_(5._(6_'FF_'00_'***_^1C_(6._(1_'C7_'FE_'***_^1C_(7._(1_'FF_'TRACK NO. ***_^1C_(8._(1_'FF_'SECTRK-1A ***_^1C_(9._(1_'FF_'SECTOR NO.***_^1C_'10._(1_'FF_#2*(64-WRDSEC)***_^1C_'11._(2_'FF_'ADR CRC_!*** REPEAT STEPS 5-17_^1C_'12._'11_'FF_'FF_'***_!SECTRK TIMES_^1C_'13._(6_'FF_'00_'***_^1C_'14._(1_'C7_'FB_'***_^1C_'15._#2*WRDSE€€C_#FF_'E5_'***_^1C_'16._(2_'FF_'DATA CRC ***_^1C_'17. (2*WRDSEC+33)/6 FF_'FF_'***_^1C_'18._"(SEE BELOW)_!FF_'FF_^1C_,LAST GAP = 5208 - 73 - (2*WRDSEC+33)*7/6*SECTRK_^1C_]_^1C_]_^1C_1NOTE... BAD TRACK DATA IS LOCATED IN WORDS 3 AND 5_^1C_9ON SECTOR 4 (TRACK 0, SECTOR 5) IN EBDIC CODE_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1_$INTEGER_2BUFFER(7400)_^1_$INTEGER_2IBUF(1)_^1_$INTEGER_2JBUF(1)_€€^1_$EQUIVALENCE (IBUF(1), BUFFER(1))_^1_$EQUIVALENCE (JBUF(1), BUFFER(5401))_^1C_]_^1_$INTEGER EQUVAR(7)_^1_$INTEGER_2COMPFG_^1_$INTEGER_2FDDLU_^1_$INTEGER_2SECADR_^1_$INTEGER_2RWFLAG_^1_$INTEGER_2SECTRK_^1_$INTEGER_2WRDSEC_^1_$INTEGER_2CMPIND_^1_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1_$EQUIVALENCE (EQUVAR(3), SECADR)_^1_$EQUIVALENCE (EQUVA€€R(4), RWFLAG)_^1_$EQUIVALENCE (EQUVAR(5), SECTRK)_^1_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1_$EQUIVALENCE (EQUVAR(7), CMPIND)_^1C_]_^1_$INTEGER_2PTRK_^1_$INTEGER_2BADTKM(26)_^1_$DATA BADTKM/_^1_#*_!' PHYSICAL TRACK XXXX HAS BEEN DESIGNATED A BAD TRACK'/_^1C_]_^1_$RELATIVE_$CRCGEN,HEXASC,OUTLST,FDDIO,FDDIOC,ERRMSG_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1C_]_^1C_]_^1C_]_^1C_C***CHECK€€ IF ENUF ROOM FOR INITIALIZ_^1_$IF (LBUF .LT. 5400+2000)_3CALL ERRMSG($0510)_^1C_]_^1C_]_^1C_FSET ENTIRE BUFFER TO ALL ONES_^1_$DO 10_#I = 1, LBUF_^1 10_%IBUF(I) = $FFFF_^1C_]_^1C_FSETUP INITIAL GAP IN TRACK_^1_$DO 20_#I = 41, 46_^1 20_%IBUF(I) = $FF00_^1C_]_^1C_FSETUP SYNC CODE FOR INITIAL GAP_^1_$IBUF(47)_"= $D7FC_^1C_]_^1C_]_^1C_]_^1C_]_^1C_FINITIALIZE CONSTANT DATA (FOR_^1C_HEV€€ERY TRACK) IN EACH SECTOR_^1_$DO 60 ISEC= 1, SECTRK_^1_)IBYTE = (((2*WRDSEC+33)*7+5)/6) * (ISEC-1) + 74_^1C_]_^1C_FSET FIRST GAP IN SECTOR_^1_)KBYTE = IBYTE + 5_^1_)DO 30_#I = IBYTE, KBYTE_^1 30_*IBUF(I) = $FF00_^1C_]_^1C_FSET BYNC CODE FOR ADDRESS FIELD_^1_)IBUF(IBYTE+6) = $C7FE_^1C_]_^1C_FSET SEPERATOR (SECTORS/TRACK)_^1_)ITMP = SECTRK - 26_^1_)IF (ITMP .LT. 0) ITMP = AND(ITMP€€,$FF) + 1_^1_)IBUF(IBYTE+8) = EOR ($FF00, ITMP)_^1C_]_^1C_FSET SECTOR NUMBER_^1_)IBUF(IBYTE+9) = EOR ($FF00, ISEC)_^1C_]_^1C_FSET FILE ADDRESS BIAS_^1_)ITMP = 2 * (64-WRDSEC)_^1_)IF (ITMP .LT. 0) ITMP = AND(ITMP,$FF) + 1_^1_)IBUF(IBYTE+10)= EOR ($FF00, ITMP)_^1C_]_^1C_FSET ADDRESS GAP IN SECTOR_^1_)JBYTE = IBYTE + 24_^1_)KBYTE = IBYTE + 29_^1_)DO 40_#I = JBYTE, KBYTE_^1 40_*IBUF(I€€) = $FF00_^1C_]_^1C_FSET SYNC CODE FOR DATA FIELD_^1_)IBUF(IBYTE+30) = $C7FB_^1C_]_^1C_FSET DATA IN DATA FIELD (EBDIC V)_^1_)JBYTE = IBYTE + 31_^1_)KBYTE = IBYTE + 31 + 2*WRDSEC - 1_^1_)DO 50_#I = JBYTE, KBYTE_^1 50_*IBUF(I) = $FFE5_^1C_]_^1C_FSET DATA CRC FOR SECTOR_^1_)CALL CRCGEN (IBUF(IBYTE+30), 2*WRDSEC+1)_^1C_]_^1 60_%CONTINUE_^1C_]_^1C_]_^1C_]_^1C_]_^1C_]_^1C_FINITIALIZE FOR€€ EACH TRACK (0-76)_^1C_]_^1C_FCLEAR TRACK AND BAD TRACK WORDS_^1_$LTRK = 0_^1_$PTRK = 0_^1_$IBADT1 = $4040_^1_$IBADT2 = $4040_^1_$RWFLAG = 3_^1C_]_^1C_]_^1_$DO 110 K=1,77_^1C_FSET TRACK INFO INTO EACH SECTOR_^1 70_!DO 80 ISEC = 1, SECTRK_^1_)IBYTE = (((2*WRDSEC+33)*7+5)/6) * (ISEC-1) + 74_^1C_FSET TRACK NUMBER IN SECTOR_^1_)IBUF(IBYTE+7) = EOR ($FF00, LTRK)_^1C_FSET ADDRESS C€€RC IN SECTOR_^1 80_%CALL CRCGEN (IBUF(IBYTE+6), 5)_^1C_]_^1C_FINITIALIZE (WRITE) TRACK_^1_$SECADR = SECTRK * LTRK_^1_$CALL FDDIO (IBUF, LBUF, EQUVAR)_^1C_C***CHECK IF FATAL FDD ERROR_^1_$IF (CMPIND .LT. 0)_9CALL ERRMSG($0520)_^1C_]_^1_)IF (AND(CMPIND,$4000) .EQ. 0)_!GOTO 90_^1C_]_^1C_FBAD TRACK, PRINT MESSAGE_^1_)CALL HEXASC (PTRK, BADTKM(9), 0)_^1_)CALL OUTLST (BADTKM, 26)_^1C_C*€€**CHECK IF BAD TRACK ZERO_^1_)IF (PTRK .EQ. 0)_7CALL ERRMSG($0530)_^1C_C***CHECK IF MORE THAN 2 BAD TRACKS_^1_)IF (PTRK-LTRK .GE. 1)_2CALL ERRMSG($0540)_^1C_FCONVERT BAD TRACK TO EBDIC, SAVE_^1_)IBADTK = (PTRK/10*$100) + (PTRK-PTRK/10*10) + $F0F0_^1_)IF (PTRK-LTRK .EQ. 1)_!IBADT1 = IBADTK_^1_)IF (PTRK-LTRK .EQ. 2)_!IBADT2 = IBADTK_^1_)GOTO 110_^1C_]_^1C_]_^1C_FCHECK DATA ON INITIA€€LIZED TRACK_^1 90_!MBUF = LBUF - WRDSEC*SECTRK + 1_^1_$DO 100 I=MBUF,LBUF_^1C_C***CHECK IF DATA READ CORRECTLY_^1 100_$IF (IBUF(I) .NE. $E5E5)_0CALL ERRMSG($0550)_^1C_FINCREMENT LOGICAL TRACK_^1_$LTRK = LTRK + 1_^1C_FINCREMENT PHYSICAL TRACK_^1 110 PTRK = PTRK + 1_^1C_]_^1C_]_^1C_FALL DONE, SETUP BAD TRACK DATA_^1_$DO 120 I=1,WRDSEC_^1 120_$JBUF(I) = 0_^1_$JBUF(4) = IBADT1_^1_€¢$JBUF(6) = IBADT2_^1C_FWRITE BAD TRACK DATA ON SECTOR 4_^1_$RWFLAG = 1_^1_$SECADR = 4_^1_$CALL FDDIOC (JBUF, WRDSEC, EQUVAR)_^1C_]_^1_$RETURN_^1C_]_^1_$END_]_^__ ¢PCRCGEN CSY/ D14 P€1_$SUBROUTINE CRCGEN (IBUF, N)_^1_#*_2/DECK-ID D14 PERIPH. DRIVERS 1.1C SUMMARY-110_^1C_]_^1C_]_^1C_(C Y C L I C_!R E D U N N D A N C Y_!C O D E_^1C_]_^1C_,G E N E R A T I O N_!P R O G R A M_^1C_]_^1C_!F O R_!1 7 0 0_!F L E X I B L E_!D I S K_!D R I V E_^1C_]_^1C_]_^1C_#THE CRC FOR ERROR CHECKING IS THE REMAINDER RESULTING FROM_^1C_#DIVIDING THE BITS IN THE FIELD BEING CHECKED B€€Y THE POLYNOMINAL,_^1C_6X**16 + X**12 + X**5 + 1_^1C_]_^1C_]_^1C_#THE FIELD EXTENDS FROM THE MSB OF FIELD SYNC BYTE TO THE_^1C_#LSB IN THE ADDRESS OR DATA FIELD._^1C_]_^1C_]_^1C_#THE CRC (16 BITS) ARE GENERATED AS FOLLOWS_^1C_(1. ALL CRC BITS ARE SET TO ONE._^1C_(2. EACH BIT IS EOR-ED WITH CURRENT MSB OF THE CRC. THE CRC_^1C_+IS SHIFTED LEFT ONE PLACE. IF EOR-ED RESULT IS ONE, TH€€E_^1C_+CRC IS EOR-ED WITH $1021 (IE, X**12 + X**5 + 1)._^1C_(3. THIS IS DONE FOR EVERY BYTE (8 BITS) IN THE FIELD._^1C_]_^1C_]_^1C_#INPUT PARAMETERS_^1C_(1. IBUF(1) = ADDRESS OF FIRST FIELD BYTE (LS 8 BITS OF WORD)_^1C_(2. N_'= NUMBER OF FIELD BYTES IN CRC_^1C_]_^1C_#OUTPUT PARAMETERS_^1C_(1. IBUF(N+1)= MS 8 BITS OF CRC + $FF00 (INCLUDES CLOCK DATA)_^1C_(2. IBUF(N+2)= LS 8 BITS O€€F CRC + $FF00 (INCLUDES CLOCK DATA)_^1C_]_^1C_]_^1_$DIMENSION_!IBUF(1)_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1C_FSET CRC INITIALLY TO ALL ONES_^1_$ICRC = $FFFF_^1C_FMOVE NEXT BYTE TO MSHALF OF WORD_^1_$DO 20_!J = 1, N_^1_)IWORD = IBUF(J) * $100_^1C_]_^1C_FGENERATE CRC FOR NEXT BYTE_^1_)DO 10 I = 1, 8_^1_-IF (AND(ICRC,$8000).EQ.$8000)_!IWORD = EOR(IWORD,$8000)_^1_-ICRC = AND (ICRC,$7€FFF) * 2_^1_-IF (AND(IWORD,$8000).EQ.$8000)_!ICRC = EOR(ICRC,$1021)_^1 10_*IWORD = IWORD * 2_^1 20_%CONTINUE_^1C_]_^1C_FSTORE CRC INTO BUFFER_^1_$IBUF(N+1) = EOR( AND(ICRC/$100, $FF), $FF00)_^1_$IBUF(N+2) = EOR( AND(ICRC_#, $FF), $FF00)_^1C_]_^1_$RETURN_^1_$END_]_^__ PFDDIOC CSY/ D15 P€1_$SUBROUTINE FDDIOC (BUFFER,LENGTH,EQUVAR)_^1_#*_2/DECK-ID D15 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_]_^1C_(F D D_!U T I L I T Y_!I N P U T / O U T P U T_^1C_]_^1C_,( W I T H_!C O M P A R E )_!P R O G R A M_^1C_]_^1C_]_^1€€C_#FUNCTION_.NO. OF CALLS_'IF COMPARE FLAG OR *V_^1C_#*A (ABSOLUTIZE)_'1. WRITE_+READ/COMPARE_^1C_]_^1C_#*B (BINARY)_+1. WRITE_+READ/COMPARE_^1C_]_^1C_#*H (HOLLERITH OR ASCII)1. WRITE_+READ/COMPARE_^1C_]_^1C_#*C (COPY)_-1. READ_^1C_;2. WRITE_+READ/COMPARE_^1C_]_^1C_#*V (VERIFY)_+1. READ_^1C_;2._1READ/COMPARE_^1C_]_^1C_#*I (INITIALIZE)_'1. WRITE_+READ/COMPARE_^1C_)(FOR WRITING/READI€€NG BAD TRACK DATA ONLY)_^1C_]_^1C_]_^1C_]_^1_$INTEGER_%BUFFER(1)_^1C_]_^1_$INTEGER EQUVAR(7)_^1_$INTEGER_2COMPFG_^1_$INTEGER_2FDDLU_^1_$INTEGER_2SECADR_^1_$INTEGER_2RWFLAG_^1_$INTEGER_2SECTRK_^1_$INTEGER_2WRDSEC_^1_$INTEGER_2CMPIND_^1_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1_$EQUIVALENCE (EQUVAR(3), SECADR)_^1_$EQUIVALENCE (EQUVAR(4), RWFLAG)€€_^1_$EQUIVALENCE (EQUVAR(5), SECTRK)_^1_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1_$EQUIVALENCE (EQUVAR(7), CMPIND)_^1C_]_^1_$INTEGER_%INPBUF(126)_^1_$INTEGER_%LSTBUF(36)_^1_$INTEGER_%RWFTMP_^1_$INTEGER_%SECLTH_^1_$INTEGER_%SECTOR_^1_$INTEGER_%TRKSEC_^1_$RELATIVE_$FDDIO,ERRMSG,HEXASC,OUTLST_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1_$DATA LSTBUF/' LU=XXXX, SECTR=XXXX =XXXX, WRD=XXXX',_^1_#*_,'€€, XPECTED=XXXX, WAS=XXXX, IOIND=XXXX'/_^1C_]_^1C_]_^1C_]_^1C_FSAVE SECTOR AND R/W FLAG_^1_$SECTOR = SECADR_^1_$RWFTMP = RWFLAG_^1C_FRETRY N TIMES ON ERRORS_^1_$DO 60 I=1,1_^1_)SECADR = SECTOR_^1_)RWFLAG = RWFTMP_^1C_C***CHECK IF ILLEGAL SECTOR ADDRESS_^1_)IF ((SECADR+(LENGTH-1)/WRDSEC)/SECTRK .GE. 77)_^1_#*_KCALL ERRMSG($0610)_^1C_FSKIP IF 2ND CALL FROM *V_^1_)IF (COMPFG.LT.0 .AN€€D. RWFLAG.NE.0)_!GOTO 10_^1C_FWRITE (OR READ, IF *C OR *V) FDD_^1_)CALL FDDIO (BUFFER, LENGTH, EQUVAR)_^1C_C***CHECK IF FATAL FDD ERROR_^1_)IF (CMPIND .LT. 0)_5CALL ERRMSG($0620)_^1C_FEXIT IF READ OR NO COMPARE_^1_)IF (RWFLAG.EQ.0 .OR. COMPFG.EQ.0)_!GOTO 40_^1C_]_^1C_]_^1 10_%RWFLAG = 0_^1_)L = 1_^1C_FREAD ONE SECTOR AT A TIME_^1_)DO 30 J=1,LENGTH,WRDSEC_^1_-LTH = LENGTH + 1 - €€J_^1_-IF (LTH .GT. WRDSEC) LTH = WRDSEC_^1_-CALL FDDIO (INPBUF, WRDSEC, EQUVAR)_^1C_]_^1C_FCOMPARE EACH WORD OF THE SECTOR_^1_-DO 20 K=1,LTH_^1C_C***CHECK IF COMPARE ERROR_^1_1IF (BUFFER(L) .NE. INPBUF(K))_!GOTO 60_^1 20_.L = L + 1_^1C_C***CHECK IF FATAL FDD ERROR_^1_-IF (CMPIND .LT. 0)_1CALL ERRMSG($0620)_^1C_]_^1 30_*SECADR = SECADR + 1_^1C_]_^1C_FRESTORE SECTOR AND READ/WRIT€€E_^1 40_%SECADR = SECTOR_^1_)RWFLAG = RWFTMP_^1C_FALL DONE, RETURN_^1_)RETURN_^1C_]_^1C_"****** LEFT FOR FUTURE DEBUGGING EFFORTS_4*****_^1C_FREAD COMPARE ERROR, PRINT INFO_^1 50_%TRKSEC = (SECADR/SECTRK)*$100 +_^1_#*_-(SECADR - SECADR/SECTRK*SECTRK + 1)_^1_)CMPIND = EOR (CMPIND, RWFTMP)_^1_)CALL HEXASC (FDDLU_", LSTBUF(03),0)_^1_)CALL HEXASC (SECADR_!, LSTBUF(09),0)_^1_)CALL HEX€>ASC (TRKSEC_!, LSTBUF(12),0)_^1_)CALL HEXASC (K-1_$, LSTBUF(17),0)_^1_)CALL HEXASC (BUFFER(L), LSTBUF(24),0)_^1_)CALL HEXASC (INPBUF(K), LSTBUF(29),0)_^1_)CALL HEXASC (CMPIND_!, LSTBUF(35),0)_^1_)CALL OUTLST(LSTBUF,36)_^1 60_%CONTINUE_^1C_C***FATAL COMPARE, MAX RETRIES DONE_^1_QCALL ERRMSG($0630)_^1C_]_^1_$END_]_^__ >PGETLU CSY/ D16 P€1_$SUBROUTINE GETLU (IWORD, ILU)_^1_#*_2/DECK-ID D16 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_#PROGRAM GETS AND CHECKS IF LOGICAL UNIT IS A FDD_^1C_]_^1C_]_^1_$RELATIVE_$ERRMSG,CVTNUM_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1_$INT€€EGER IWORD(2)_^1C_]_^1C_]_^1_$CALL CVTNUM (IWORD, ILU, $FFF)_^12_]_^1*_#CONVERT LOGICAL UNIT NUMBER FROM HEX TO DECIMAL_^11_]_^1_$ID3=AND(ILU,$0F00)/$100_^1_$ID2=AND(ILU,$00F0)/$10_^1_$ID1=AND(ILU,$000F)_^1_$ILU=ID3*100+ID2*10+ID1_^12_]_^1_$LU = ILU_^1C_C***ILLEGAL FDD LOGICAL UNIT_^1_$IF (LU .EQ. 0)_=CALL ERRMSG($0710)_^12_]_^1*_#PICK UP WORD 8 OF PHYSTB (EREQST) AND STORE IN MMFL€îAG_^11_]_^1_$ASSEM $C0E9,$0822,$B011,$0102,$E21C,$1802,$E0E7,$4804_^1_$ASSEM $E800,LU,$E600,$0000,$C208,$6800,MMFLAG_^12_]_^1C_C***ILLEGAL FDD LOGICAL UNIT_^1_$IF (AND(MMFLAG,$3FF0) .NE. $1440)_*CALL ERRMSG($0710)_^1_$RETURN_^1_$END_]_^__îPCVTNUM CSY/ D17 P€1_$SUBROUTINE CVTNUM (IBUF, ISEC, ILMT)_^1_#*_2/DECK-ID D17 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_#THE PROGRAM CONVERTS A NUMBER FROM ASCII TO BINARY._^1C_]_^1C_]_^1_$INTEGER_%IBUF(2)_^1C_]_^1C_]_^1_$RELATIVE_$ASCHEX,ERRMS€TG_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1C_]_^1C_FCONVERT DIGITS FROM ASCII TO HEX_^1_$CALL ASCHEX (IBUF(1),_$ID3)_^1_$CALL ASCHEX (IBUF(2)/$100, ID2)_^1_$CALL ASCHEX (IBUF(2),_$ID1)_^1C_FFORM SECTOR ADDRESS_^1_$ISEC = ID3*$100 + ID2*$10 + ID1_^1C_C***CHECK IF ILLEGAL NUMBER_^1_$IF (ISEC .GE.ILMT)_9CALL ERRMSG($0810)_^1_$RETURN_^1_$END_]_^__TPASCHEX CSY/ D18 P€1_$SUBROUTINE ASCHEX (IWORD, IDIGIT)_^1_#*_2/DECK-ID D18 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_#THE PROGRAM CONVERTS THE LOWER ASCHI CHARACTER TO HEX_^1C_]_^1_$RELATIVE_$ERRMSG_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1_$IDIGIT €€= AND (IWORD, $FF)_^1C_FMAKE SPACE A ZERO_^1_$IF (IDIGIT .EQ. $20) IDIGIT = $30_^1C_C***CHECK IF NOT A HEX DIGIT_^1_$IF (IDIGIT .LT. $30 .OR. IDIGIT .GT. $46)_!CALL ERRMSG($0910)_^1_$IF (IDIGIT .LT. $3A .OR. IDIGIT .GT. $40)_!GOTO 10_^1C_C***NOT A HEX DIGIT_^1_QCALL ERRMSG($0910)_^1C_]_^1C_FCONVERT TO HEX_^1 10_!IDIGIT = IDIGIT - $30_^1_$IF (IDIGIT .GT. 9) IDIGIT = IDIGIT - 7_^1_€$RETURN_^1_$END_]_^__ PHEXASC CSY/ D19 P€1_$SUBROUTINE HEXASC (IWORD, ASCBUF, IOFF)_^1_#*_2/DECK-ID D19 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_]_^1C_]_^1C_(F D D_!U T I L I T Y_!H E X_!T O_!A S C I I_^1C_]_^1C_.C O N V E R S I O N_!P R O G R A M_^1C_]_^1C_]_^1C_#T€€HE PROGRAM CONVERTS THE FOUR HEX DIGITS IN IWORD TO ASCII AND_^1C_#PUTS THEM IN FOUR CHARACTER POSITIONS OF THE ASCII BUFFER (ASCBUF)_^1C_#IF IOFF IS A ONE, THE CHARACTERS ARE OFFSET, IE, THE FIRST CHAR-_^1C_#ACTER IS STORED IN BITS 0-7 RATHER THAN 8-15._^1C_]_^1C_]_^1C_]_^1_$INTEGER_%ASCBUF(1)_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1C_]_^1C_FGET WORD TO CONVERT TO ASCII_^1_$JWORD = IW€€ORD_^1C_]_^1_$DO 10 I =1, 4_^1C_FGET NEXT HEX DIGIT (0-9)_^1_)IDIGIT = AND (JWORD/$1000, $F) + $30_^1C_FCORRECT IF A HEX (A-F) DIGIT_^1_)IF (IDIGIT .GE. $3A) IDIGIT = IDIGIT + 7_^1C_]_^1_)K = I - 1 + IOFF_^1_)J = K/2 + 1_^1C_FINSERT ASCII HEX DIGIT IN LS CHR_^1_)ASCBUF(J) = AND (ASCBUF(J), $FF00) + IDIGIT_^1C_FINSERT ASCII HEX DIGIT IN MS CHR_^1_)IF ( AND(K,1) .EQ. 0) ASCBUF(€ZJ) = IDIGIT * $100_^1_)JWORD = JWORD * $10_^1 10_!CONTINUE_^1C_]_^1_$RETURN_^1_%END_]_^__ ZPERRMSG CSY/ D20 P€1_$SUBROUTINE ERRMSG (ERRNUM)_^1_#*_2/DECK-ID D20 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^13_]_^1C_]_^1C_#THE PROGRAM PRINTS THE ERROR NUMBER ON THE LIST DEVICE_^1C_]_^1_$INTEGER_%ERRNUM_^1_$INTEGER_%MESSAG(26)_^1_$RELATIVE_$HEXASC,OUTLST,€TFDDUTL_^1_$RELATIVE_$Q8PREP,Q8PKUP_^1C_]_^1_$DATA_)MESSAG/_^1_#*_,'FDD UTILITY PROGRAM, ERROR ', 0,0,_^1_#*_.', RESTART OPERATION.'/_^1C_]_^1C_FCONVERT ERROR NUMBER TO ASCII_^1_$CALL HEXASC (ERRNUM, MESSAG(15),0)_^1C_FPRINT ERROR MESSAGE_^1_$CALL OUTLST (MESSAG, 26)_^1C_]_^1C_FRESTART AND CONTINUE_^1_$CALL FDDUTL_^1C_]_^1_$END_]_^__ TPMON2 CSY/ P1 MON_]_^__ PFDDIO CSY/ D21 P€1_%NAM FDDIO_(DECK-ID D21 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1*_*CALL FDDIO (BUFFER,LENGTH,EQUVAR)_^1*_]_^1*_$INTEGER_1EQUVAR(7)_^1*_$INTEGER_1COMPFG_^1*_$INTEGER_1FDDLU_^1*_$INTEGER_1SECADR_^1*_$INTEGER_1RWFLAG_^1*_$INTEGER_1S€€ECTRK_^1*_$INTEGER_1WRDSEC_^1*_$INTEGER_1CMPIND_^1*_$EQUIVALENCE (EQUVAR(1), COMPFG)_^1*_$EQUIVALENCE (EQUVAR(2), FDDLU )_^1*_$EQUIVALENCE (EQUVAR(3), SECADR)_^1*_$EQUIVALENCE (EQUVAR(4), RWFLAG)_^1*_$EQUIVALENCE (EQUVAR(5), SECTRK)_^1*_$EQUIVALENCE (EQUVAR(6), WRDSEC)_^1*_$EQUIVALENCE (EQUVAR(7), CMPIND)_^1*_]_^1*_]_^1*_]_^1*_+FDD REQUESTS_^1*_$READ_.BINARY FORMAT READ_^1*_€€$WRITE_-BINARY FORMAT WRITE_^1*_$WRITE DR_*ASCII FORMAT WRITE_^1*_$INITIALIZE_(ASCII FORMAT WRITE PRECEEDED BY 'PRIME' REQ._^1*_$V-FIELD (BITS 13-15 ESTAT1) RETURNED TO CALLER_^1*_*000_*NORMAL RETURN_^1*_*001_*DELETED RECORD(S) ENCOUNTERED_^1*_*010_*BAD TRACK ENCOUNTERED ON INITIALIZE_^1*_*100_*FATAL REQUEST ERROR_^1*_*110_*MORE THAN .01 SPEED DEVIATION ON INITIALIZE_^1*_]_^1*_]_€€^1_%ENT FDDIO_(FLOPPY DISK DRIVE INPUT/OUTPUT PROGRAM_^1*_]_^1_%EXT* ERRMSG_'ERROR MESSAGE ROUTINE_^1_%EXT* Q8PREP_'PARAMETER PREPARATION ROUTINE_^1_%EXT* Q8PKUP_'PARAMETER PICKUP_$ROUTINE_^1*_]_^1_%EQU ZERO(2)_%ADDRESS OF ZERO VALUE_^1_%EQU ONEMSK(3)_#ADDRESS OF ONES MASK TABLE_^1_%EQU ZROMSK($13)_!ADDRESS OF ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!ADDRESS OF ONE BIT TABLE_^1_%E€€QU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1FDDIO NUM 0_^1_%LDA- I_,SAVE I AND Q REGISTERS_^1_%STA* ISAVE_^1_%STQ* QSAVE_^1*_]_^1_%RTJ Q8PREP_'SETUP FOR PARAMETER PICKUP_^1_%ADC (FDDIO-*)_^1*_]_^1_%RTJ Q8PKUP_'GET THE MEMORY BUFFER ADDRESS_^1_%STA* MEMADR_^1*_]_^1_%RTJ Q8PKUP_'GET NUMBER OF WORDS TO BE TRANSFERRED_^1_%TRA Q_^1_%LDA- (ZERO)€€,Q_^1_%STA* NWORDS_^1*_]_^1_%RTJ Q8PKUP_'GET THE EQUIVALENCE PARAMETER_^1_%TRA Q_^1_%STA* EQUVAR_'SAVE EQU VARIBLE ADDRESS_^1_%LDA- 1,Q_^1_%STA* LU_+STORE THE LOGICAL UNIT_^1_%STA* LUTMP_^1_%STA* MTNLU_(SAVE LU IN MOTION REQUEST_^1*_]_^1_%LDA- 2,Q_*STORE SECTOR_^1_%STA* SECTOR_^1*_]_^1_%ENA 0_,CLEAR SECTOR MSB OF WRITE REQUEST_^1_%STA* SECMSB_^1*_]_^1_%LDA- 5,Q_*COMBINE WORDS/SE€€CTORS AND SECTORS/TRACK_^1_%ALS 8_,AND STORE INTO INITIALIZE WRITE REQUEST_^1_%EOR- 4,Q_^1_%STA* WPSSPT_^1*_]_^1_%LDQ- 3,Q_*CHECK WHICH REQUEST_^1_%LDA =N$4801_%A=$4801_^1_%SQN 1_^1_%JMP* STORC_(FORMAT READ REQUEST_^1_%EOR- ONEBIT+10_#A=$4C01_^1_%INQ -1_^1_%SQN 1_^1_%JMP* STORC_(FORMAT WRITE REQUEST_^1_%INQ -1_^1_%SQN 1_^1_%JMP* FDD10_(FORMAT WRITE DELETE (ASCII) REQUEST_^1_€€%STA* REQCOD_'SAVE A REGISTER_^1_%RTJ- (AMONI)_%EXECUTE 'PRIME' REQUEST_^1_%NUM $5C00_(REQUEST CODE_^1_%NUM 0_,COMPLETION_^1MTNTHD NUM 0_,THREAD_^1MTNLU NUM 0_,LOGICAL UNIT_^1_%NUM $1000_('PRIME' REQUEST_^1_%LDA* WPSSPT_'WORDS/SECTOR, SECTORS/TRACK TO WRITE REQUEST_^1_%STA* SECMSB_^1MTNWAT LDA* MTNTHD_'PICK UP THREAD WORD_^1_%SAZ MTNCOM_'SKIP IF REQUEST COMPLETE_^1_%JMP* MTN€€WAT_'GO BACK AND RECHECK DONE_^1MTNCOM LDQ* MTNLU_(PICK UP LU WORD_^1_%SQP MTNOK_(SKIP IF NO ERROR_^1_%JMP* FDDCMP_'DONE IF THERE WAS AN ERROR_^1MTNOK LDA* REQCOD_'RESTORE THE A REGISTER_^1*_]_^1FDD10 LDQ* LU_+SET ASCII BIT FOR INITIALIZE AND WRITE DELETE_^1_%ADQ- ONEBIT+12_^1_%STQ* LU_^1*_]_^1STORC STA* REQCOD_'SET REQUEST CODE_^1*_]_^1_%RTJ- (AMONI)_%EXECUTE TRANSFER TO THE F€€DD_^1REQCOD NUM 0_/FORMATTED REQUEST_^1_%NUM 0_^1THD_"NUM 0_^1LU_#NUM 0_^1NWORDS NUM 0_^1MEMADR NUM 0_^1SECMSB NUM 0_^1SECTOR NUM 0_^1WAIT_!LDA* THD_^1_%SAZ 1_,SKIP IF REQUEST COMPLETE_^1_%JMP* WAIT_^1_%LDQ* LU_+ERROR CODE TO Q_^1FDDCMP TRQ A_,STORE COMPLETION INDICATOR (Q) IN CMPIND_^1_%LDQ* EQUVAR_^1_%AND- ZROMSK+12_^1_%STA- 6,Q_^1_%LDA- $E9_*PICK UP ADDRESS OF EXTENDED€€ CORE TABLE_^1_%TRA Q_,SAVE IN Q_^1_%EOR- $11_*($7FFF)_^1_%SAZ RCOS_)SKIP IF RUNNING IN RCOS SYSTEM_^1_%LDQ- 28,Q_)ADDRESS OF LOG1A TABLE TO Q_^1_%JMP* GETPHY_'GO PICK UP PHYSTB ADDRESS_^1RCOS_!LDQ- $E7_*ADDRESS OF LOG1A TABLE TO Q_^1GETPHY STQ* TEMP_)ADDRESS OF LOG1A TABLE TO TEMP CELL_^1_%LDQ* LUTMP_(LOGICAL UNIT NUMBER TO Q_^1_%LDQ+ 0,Q_*PHYSTB ADDRESS TO Q_^1TEMP_!EQU TEMP(*€€-1)_^1_%LDA- 29,Q_)GET WORDS/SECTOR AND SECTORS/TRACK_^1_%ALS 8_,CHECK IF FORMAT DIFFERENT_^1_%EOR- 28,Q_^1_%EOR* WPSSPT_^1_%SAZ FDD120_^1*_]_^1_%RTJ ERRMSG_#***DISKETTE FORMAT NOT SAME AS REQUESTED_^1_%ADC (ERRNUM-*)_^1*_]_^1FDD120 LDA* ISAVE_(RESTORE I AND Q REGISTERS AND RETURN_^1_%STA- I_^1_%LDQ* QSAVE_^1_%JMP* (FDDIO)_^1*_]_^1ISAVE NUM 0_,I REGISTER SAVE_^1QSAVE NUM 0_€Ê,Q REGISTER SAVE_^1EQUVAR NUM 0_,ADDRESS OF EQUIVALENCE PARAMETERS_^1LUTMP NUM 0_,TEMPORARY FOR LOGICAL UNIT_^1WPSSPT NUM 0_^1ERRNUM NUM $1010_(ERROR NUMBER FOR INCORRECT FORMAT_^1*_]_^1_%END_]_^__ÊPOPAUSE CSY/ D22 P€1_%NAM OPAUSE_'DECK-ID D22 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1*_*OPERATOR PAUSE ROUTINE_^1*_8WAIT FOR C/R INPUT FROM OPERATOR_^1*_]_^1_%ENT OPAUSE_^1*_]_^1*_]_^1OPAUSE NUM 0_^1_%FWRITE $FC,,MSG,MSGL,A,,,I,,1_^1REPLY FREAD_!€€$FD,,TEMP,1,A,,,I,,1_^1WAIT_!LDA* REPLY+3_%PICK UP THREAD WORD_^1_%SAZ DONE_)SKIP IF INPUT REQUEST COMPLETED_^1_%JMP* WAIT_)GO RECHECK THREAD_^1DONE_!LDA* REPLY+4_%CHECK FOR TIMEOUT ERROR ON REPLY_^1_%SAP OK_+SKIP IF NO ERROR_^1_%JMP* REPLY_(REISSUE INPUT REQUEST_^1OK_#JMP* (OPAUSE)_$RETURN TO CALLER_^1MSG_"ALF /,:B:BREADY FDD(S), THEN PRESS CARRIAGE RETURN.:R:L/_^1MSGL_!EQU MS€&GL(*-MSG)_^1TEMP_!NUM 0_^1_%END_]_^__&PINPBIN CSY/ D23 P€1_%NAM INPBIN_'DECK-ID D23 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1_%ENT INPBIN_^1*_]_^1_%EXT* ERRMSG_'ERROR MESSAGE ROUTINE_^1_%EXT* Q8PREP_'PARAMETER PREPARATION ROUTINE_^1_%EXT* Q8PKUP_'PARAMETER PICKUP_$ROUTINE_^1*_]_^1_%EQU Z€€ERO(2)_%ADDRESS OF ZERO_^1_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1*_]_^1*_*CALL INPBIN (BUFFER, WORDS)_^1*_]_^1INPBIN NUM 0_^1_%LDA- I_,SAVE I AND Q REGISTERS_^1_%STA* ISAVE_^1_%STQ* QSAVE_^1*_]_^1_%RTJ Q8PREP_'SETUP FOR PARAMETER PICKUP_^1_%ADC (INPBIN-*)_^1*_]_^1_%RTJ Q8PKUP_'STORE INPUT BUFFER ADDRESS_^1_%STA* MEMADR_^1_%STA- I_,SAV€€E BUFFER ADDRESS FOR CLAER_^1*_]_^1_%RTJ Q8PKUP_'STORE NUMBER OF WORD IN BUFFER_^1_%TRA Q_^1_%LDA- (ZERO),Q_^1_%STA* NOWRDS_^1_%TRA Q_,MOVE BUFFER LENGTH TO Q_^1_%LDA =A_+SET A TO SPACES_^1CLEAR STA- (ZERO),I_$BLANK BUFFER LOCATION_^1_%INQ -1_+DECREMENT COUNT_^1_%SQZ INPREQ_'SKIP IF DONE_^1_%RAO- I_,BUMP BUFFER ADDRESS_^1_%JMP* CLEAR_(GO BACK AND DO IT AGAIN_^1INPREQ EQU IN€€PREQ(*)_^1*_]_^1*_]_^1_%RTJ- (AMONI)_%INPUT ONE BINARY RECORD_^1_%NUM $4801_^1_%NUM 0_^1THD_"NUM 0_^1LU_#NUM $18F9_(STANDARD INPUT_^1NOWRDS NUM 0_^1MEMADR NUM 0_^1WAIT_!LDA* THD_^1_%SAZ 1_^1_%JMP* WAIT_^1_%LDQ* LU_+ERROR CODE TO Q_^1INPCMP SQM INPERR_'CHECK IF FATAL INPUT ERROR_^1_%QLS 1_^1_%SQM INPEXT_'CHECK IF SHORT READ (SHOULD BE)_^1*_]_^1INPERR RTJ ERRMSG_#***INPUT €€ERROR_^1_%ADC (ERRNUM-*)_^1*_]_^1INPEXT LDQ* NOWRDS_'STORE NUMBER OF WORDS READ INTO LAST WORD_^1_%INQ -1_.OF THE BUFFER._^1_%LDA* (MEMADR),Q_^1_%SUB* MEMADR_^1_%INA 1_^1_%STA* (MEMADR),Q_^1*_]_^1_%LDA* ISAVE_(RESTORE I AND Q REGISTERS AND RETURN_^1_%STA- I_^1_%LDQ* QSAVE_^1_%JMP* (INPBIN)_^1*_]_^1ISAVE NUM 0_,I REGISTER SAVE_^1QSAVE NUM 0_,Q REGISTER SAVE_^1ERRNUM NUM $111€40_(EROOR NUMBER FOR INPUT ERROR_^1*_]_^1_%END_]_^__ 4POUTLST CSY/ D24 P€1_%NAM OUTLST_'DECK-ID D24 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1_%ENT OUTLST_^1*_]_^1_%EXT* Q8PREP_'PARAMETER PREPARATION ROUTINE_^1_%EXT* Q8PKUP_'PARAMETER PICKUP_$ROUTINE_^1*_]_^1_%EQU ZERO(2)_%ADDRESS OF ZERO_^1_%EQU ADISP(€€$EA)_"ADDRESS OF DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1*_]_^1*_*CALL OUTLST (BUFFER, LENGTH)_^1*_]_^1OUTLST NUM 0_^1_%LDA- I_,SAVE I AND Q REGISTERS_^1_%STA* ISAVE_^1_%STQ* QSAVE_^1*_]_^1_%RTJ Q8PREP_'SETUP FOR PARAMETER PICKUP_^1_%ADC (OUTLST-*)_^1*_]_^1_%RTJ Q8PKUP_'STORE LIST BUFFER ADDRESS_^1_%STA* MEMADR_^1*_]_^1_%RTJ Q8PKUP_'STORE LIST LENGTH_^1_%TRA Q_^€€1_%LDA- (ZERO),Q_^1_%STA* NWORDS_^1*_]_^1_%RTJ- (AMONI)_%OUTPUT ONE LIST LINE_^1_%NUM $4C01_(FORMAT WRITE_^1_%NUM 0_^1THD_"NUM 0_^1LU_#NUM $18FC_^1NWORDS NUM 0_^1MEMADR NUM 0_^1WAIT_!LDA* THD_^1_%SAZ 1_^1_%JMP* WAIT_^1*_]_^1LSTCMP LDA* ISAVE_(RESTORE I AND Q REGISTERS AND RETURN_^1_%STA- I_^1_%LDQ* QSAVE_^1_%JMP* (OUTLST)_^1*_]_^1ISAVE NUM 0_,I REGISTER SAVE_^1QSAVE NUM €&0_,Q REGISTER SAVE_^1*_]_^1_%END_]_^__&PPARFTN CSY/ D25 P€1_%NAM PARFTN_'DECK-ID D25 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_2PARAMETER PASSING ROUTINES FOR FTN SUB-PROGRAMS_^1_%ENT Q8PREP_^1_%ENT Q8PKUP_^1*_2PARAMETER PREPARATION SUBROUTINE FOR FTN SUBPROGRAMS_^1Q8PREP NUM 0_^1_%LDA* (Q8PR€€EP)_$GET ADDRESS OF SUBPROGRAM,S ENTRY POINT_^1_%ADD* Q8PREP_*= SUBADR-* + *_^1_%STA* SUBADR_'SAVE THE ADR OF THE SUBROUTINE,S ENTRY POINT_^1_%RAO* Q8PREP_^1_%JMP* (Q8PREP)_$INCREMENT OVER PARAMETER AND RETURN_^1*_2PARAMETER ADDRESS PICKUP SUBROUTINE FOR FTN SUBPROGS_^1Q8PKUP NUM 0_^1_%STQ* QSAVE_(SAVE Q_^1_%LDA* (SUBADR)_$GET POINTER TO NEXT PARAMETER ADDRESS_^1_%STA* PARPTR_^€€1_%LDA* (PARPTR)_$GET PARAMETER ADDRESS_^1_%LDQ- $F6_^1_%SQM PKUP1_(CHECK IF IN LOWER 32K AND BIT IS OF ADR SET_^1_%SAP PKUP1_^1_%ADD* (SUBADR)_(YES, ADJUST RELATIVE POINTER ADDRESS_^1_%AND- $11_^1PKUP1 RAO* (SUBADR)_$INCREMENT POINTER TO NEXT PARAMETER ADRESS_^1_%LDQ* QSAVE_^1_%JMP* (Q8PKUP)_$RESTORE Q AND EXIT_^1*_]_^1QSAVE NUM 0_,Q REGISTER SAVE_^1SUBADR NUM 0_,ADDRESS OF €fCALLING SUBROUTINE_^1PARPTR NUM 0_,POINTER TO NEXT PARAMETER ADR OR SUB,S RETURN_^1*_]_^1_%END_]_^__ fPFDDUTL CSY/ D26 P€1_%NAM FDDUTL_'DECK-ID D26 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%ENT FDDUTL_^1_%ENT Q8STP_^1_%ENT MIFSUB_^1_%EXT* FUPROC_^1_%EQU ADISP($EA)_^1*_]_^1*_]_^1*_*THIS IS THE MAIN PROGRAM OF FDDUTY. IT IS LOCATED AS THE_^1*_*LAST PROGR€€AM SO THAT THE WORKING BUFFER CAN BE DEFINED_^1*_*AS LARGE AS POSSIBLE._^1*_]_^1MIFSUB EQU MIFSUB(*)_^1FDDUTL NUM 0_^1_%RTJ* HERE_)COMPUTE MAXIMUM LENGTH OF BUFFER_^1HERE_!NUM 0_^1*_]_^1_%LDA* HERE_)CHECK IF RTOS RESIDENT_^1_%SUB- $F7_^1_%SAP FU10_,NO_^1*_]_^1_%LDA- $F6_*USE LENGTH OF UNPROTECTED FOT PGMLMT_^1_%SUB- $F7_^1_%INA -1_^1_%STA* PGMLMT_^1_%LDA- $F7_*COMPUTE RELATIVE€€ ADDRESS, USING START OF_^1_%INA 1_,UNPROTECTED AS START OF PROGRAM BUFFER_^1_%SUB* HERE_^1_%INA HERE-PGMADR_^1_%ADD =N$8000_^1_%STA* PGMADR_^1_%JMP* FU20_^1*_]_^1FU10_!LDA- $F6_^1_%SUB* HERE_^1_%INA HERE-PGMBUF_^1_%STA* PGMLMT_^1*_]_^1FU20_!RTJ FUPROC_'CALL FDD UTILITY PROCESSOR_^1PGMADR ADC (PGMBUF-*)_^1_%ADC (PGMLMT-*)_^1*_]_^1Q8STP JMP- (ADISP)_%EXIT FDD UTILITY_^1*_]_^€f1PGMLMT NUM 0_,PROGRAM BUFFER LIMIT_^1PGMBUF EQU PGMBUF(*)_#PROGRAM BUFFER START_^1*_]_^1_%END_]_^__fPFDUTIL CSY/ D27 P€1_%NAM FDUTIL_'DECK-ID D27 PERIPH. DRIVERS 1.1C SUMMARY-110_^1*_]_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%ENT FDUTIL_^1FDUTIL GTFILE FWA,NAME-FDUTIL-1,FWA,FWA-FDUTIL+1,0,,0,1,1_^1_%NUM 0_^1_%NUM 0_^1_%JMP- ($EA)_(EXIT TO DISPATCHER TO WAIT FOR COMPLETION_^1NAME_!ALF 3,F€:DUTIL_$NAME OF FILE_^1FWA_"EQU FWA(*)_^1_%END FDUTIL_^__:PTSPD29 CSY/ D29 P¸1_%NAM TSPD29_'DECK-ID D29 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD30 CSY/ D30 P¸1_%NAM TSPD30_'DECK-ID D30 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD31 CSY/ D31 P¸1_%NAM TSPD31_'DECK-ID D31 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD32 CSY/ D32 P¸1_%NAM TSPD32_'DECK-ID D32 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD33 CSY/ D33 P¸1_%NAM TSPD33_'DECK-ID D33 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD34 CSY/ D34 P¸1_%NAM TSPD34_'DECK-ID D34 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD35 CSY/ D35 P¸1_%NAM TSPD35_'DECK-ID D35 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD36 CSY/ D36 P¸1_%NAM TSPD36_'DECK-ID D36 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD37 CSY/ D37 P¸1_%NAM TSPD37_'DECK-ID D37 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD38 CSY/ D38 P¸1_%NAM TSPD38_'DECK-ID D38 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD39 CSY/ D39 P¸1_%NAM TSPD39_'DECK-ID D39 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD40 CSY/ D40 P¸1_%NAM TSPD40_'DECK-ID D40 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD41 CSY/ D41 P¸1_%NAM TSPD41_'DECK-ID D41 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD42 CSY/ D42 P¸1_%NAM TSPD42_'DECK-ID D42 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD43 CSY/ D43 P¸1_%NAM TSPD43_'DECK-ID D43 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD44 CSY/ D44 P¸1_%NAM TSPD44_'DECK-ID D44 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD45 CSY/ D45 P¸1_%NAM TSPD45_'DECK-ID D45 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD46 CSY/ D46 P¸1_%NAM TSPD46_'DECK-ID D46 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD47 CSY/ D47 P¸1_%NAM TSPD47_'DECK-ID D47 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD48 CSY/ D48 P¸1_%NAM TSPD48_'DECK-ID D48 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PTSPD49 CSY/ D49 P¸1_%NAM TSPD49_'DECK-ID D49 PERIPH. DRIVERS 1.1C SUMMARY 110_^1*_$MSOS 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%END_]_^__¸PD18334 CSY/ D50 P€1_%NAM D18334_'DECK-ID D50 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$CARTRIDGE DISK DRIVER_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*S2_]_^1_%SPC 2_^1*_8CDD DRIVER_^1*_8***********_^1*S2_]_^1_%SPC 2_^1*_8FUNCTION_^1*_8--------_^1*S2_]_^1_%SPC 2_^1*_$THE CDD DRIVER HAN€€DLES READ,WRITE,FREAD,FWRITE_^1*_$REQUESTS,SYSTEM DIRECTORY REQUESTS AND MOTION REQUESTS._^1*_$MOTION REQUESTS ARE PROCESSED ONLY IF ORIGINATED BY_^1*_$DIAGNOSTICS. THE DRIVER CAN HANDLE UP TO 4 UNITS._^1*S2_]_^1_%SPC 2_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*S2_]_^1_%SPC 2_^1*_$THE CDD DRIVER IS A CORE RESIDENT PROGRAM.IT HAS A_^1*_$KERNEL SUBROUTINE WHICH TRANSF€€ERS CONTROL TO THE_^1*_$VARIOUS SUBROUTINE. IN THE CASE OF MOTION REQUEST,_^1*_$THE MOTION SUBROUTINE ACTS LIKE A KERNEL SUBROUTINE._^1*_$THE DRIVER HAS 3 ENTRY POINTS:_^1*_$INITIATOR , CONTINUATOR , TIMEOUT ENTRY._^1*_$IT SUPPORTS OVERLAPSEEK,SO THAT SEEK ON ALL THE UNITS_^1*_$MAY BE DONE IN PARALEL._^1*S2_]_^1_%SPC 2_^1*_8INPUT REQUIRMENTS_^1*_8------------------_^1*S2_]_^1_%SP€€C 2_^1*_$(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE._^1*S2_]_^1_%SPC 2_^1*_8OUTPUT_^1*_8------_^1*S2_]_^1_%SPC 2_^1*_$1. THE LAST Q AND A THAT WERE SEND AS A COMMAND TO_^1*_(THE CONTROLLER ARE IN WORDS 58,59 OF THE P.D.T_^1*_$2. IF ERROR:_^1*_1FLTCOD<--- CODE OF ERROR_^1*_1STIMEO <--- LAST DYNAMIC STATUS._^1*_1ESTAT2 <--- LAST DYNAMIC STATUS._^1*_1LOG ROUTINE LOGGS THE ERRO€€R._^1*_(EIF._^1*_$3. SINTER <--- STATUS AFTER INTERRUPT._^1*_(SENTRY <--- STATUS AFTER INITIAL ENTRY._^1*_$4.(I) REGISTER <--- ADDRESS OF P.D.T_^1*_#5. CALLS MAKEQ TO SET V-FIELD OF REQUEST_^1*_#6. CALLS LOG TO OUTPUT LU AND FAULT CODE_^1*_#7. CALLS ALTERNATE DEVICE HANDLER_^1*_'TO OUTPUT ERROR MESSAGES TO OPERATOR._^1*_]_^1*_]_^1*S2_]_^1_%SPC 2_^1*_8ENTRY/EXIT_^1*_8----------_^1*€€S2_]_^1_%SPC 2_^1*_#1. I18334 - INITIATOR ENTRY_^1*_0SCHEDULE BY THE REUQEST PROCESSOR._^1*_,Q = ADDRESS OF P.D.T_^1*_,EPTR (WORD 6 OF P.D.T) = ADDRESS OF THE_^1*_EPARAMETER LOCATION._^1*_#2. C18334 - CONTINUATOR ENTRY_^1*_,THE CONTINUATOR IS ENTERED WHEN THERE_^1*_,IS AN INTERRUPT ON THE CDD'S LINE_^1*_,Q= ADDRESS OF THE FIRST P.D.T IN THE CHAIN_^1*_,OF THE CDD'S._^1*_#3. E18334 €€- TIMOUT ENTRY_^1*_,IT IS ENTERED WHEN AN INTERRUPT FAILS TO_^1*_,OCCUR IN THE TIME LIMIT._^1*_,Q = ADDRESS OF THE P.D.T_^1*_#4. EXIT - TO DISPATCHER WHEN WAITING FOR AN INTERRUPT_^1*_.OR AFTER COMPLETION OF ALL REQUESTS._^1*S2_]_^1_%SPC 2_^1*_9FLOW_^1*_8----_^1*S2_]_^1_%SPC 2_^1*_#1. SAVE P.D.T ADDRESS IN I._^1*_#2. FIND NEXT REQUEST. IF NONE, SCAN FOR REUQESTS ON OTHER UNIT€€S._^1*_#3. CALL THE KERNEL SUBROUTINE TO PROCESS REQUEST_^1*_"DONE-COMPLETE THE REQUEST_^1*_#4. ON RETURN CALL MAKEQ. TO MAKE V-FIELD OF ESTAT1_^1*_'DE SELECT THE UNIT._^1*_#5. GO TO STEP (2)_^1*_]_^1*_!I10 - THIS POINT IS ENTERED BY "CHECK"_^1*_#6. MASK FOR SEEK FOR ALL THE UNITS. IF SEEK IS NOT COMPLETED WAIT_^1*_'FOR SEEK COMPLETE (B40 IN BEGIN SUBROUTINE)_^1*_#7. RELEASE BUS, E€€XIT TO DISPATCHER._^1*_]_^1*_!ECYB18- TIMEOUT ERROR ENTRY_^1*_#8. SAVE ADDRESS OF PHYSTAB_^1*_#9. JMP TO FAULT SUBROUTINE TO LOG TIMEOUT ERROR_^1*_]_^1*_]_^1*_!CHECK- CHECK FOR A UNIT THAT WANTS IN AND INITIATE SEEK OPERATION_^1*_"10. PICK UP FIRST THREAD._^1*_"11. IF END OF CHAIN GO TO I10 (6)._^1*_"12. IF THIS UNIT WANTS IN GO TO SERVICE IT (14)._^1*_"13. GET NEXT UNIT AND CHECK€€ IT (11)._^1*_"14. SET I REGISTER TO P.D.T OF UNIT THAT WANTS IN._^1*_]_^1*_!SEEKOP- INITIATE SEEK OPERATION_^1*_"15. SELECT THE UNIT FOR THIS P.D.T_^1*_"16. CLEAR WANT IN BIT_^1*_"17. SET COUNT1,TMPERR TO 0._^1*_"18. SAVE DYNAMIC STATUS. IF NOT EOP GO TO 21.6_^1*_"19. SET TMPERR TO 14.IF READY GO TO 23_^1*_"20. RETURN JUMP TO COUNT IN "NEXT"._^1*_'SUBROUTINE._^1*_"21.2JUMP TO FAUL€€T WITH ERROR CODE IN TMPERR.(COUNT1=10)_^1*_"21.4JUMP TO 19.(COUNT1 < 10)._^1*_"21.6IF NOT ON-CYLINDER JUMP TO FAULT WITH CODE 17._^1*_"22. IF WRITE PROTECT IS OFF CONTINUE (25)_^1*_"23. PICK UP REQUEST CODE.IF MOTION REQUEST GO TO SEEK10 (25)_^1*_"24. IF WRITE REQUEST LOG ERROR 13._^1*_]_^1*_!SEEK10- SEEK TO DEVICE._^1*_$WHEN MOTCOD=1 PROCES THE FOLOWIN STEPS._^1*_"25. IF MOTION G€€O BACK TO MOT01 IN MOTION SUBROUTINE_^1*_]_^1*_$WHEN MOTCOD=0_^1*_"26. SEEK TO DEVICE_^1*_"27. SET THIS UNIT BIT IN SEEK MASK (SEKMSK). GO TO CHECK(10)._^1*_]_^1*S3_]_^1_%SPC 3_^1*_8SUBROUTINES_^1*_8-----------_^1*_$KERNEL - CONTROLS THE FLOW OF THE EXECUTION._^1*_$BEGIN - BEGINS THE I/O_^1*_$WAIT_!- WAIT FOR INTERRUPT_^1*_$VERIFY - VERIFY THE INTERRUPT_^1*_$NEXT_!- I/O AFTER INTE€€RRUPT_^1*_$MOTION - CONTROLS FLOW OF EXECUTION IN CASE OF MOTION_^1*_$ERROR - HANDLES ERRORS_^1*S2_]_^1_%SPC 2_^1*_8ANCILLARY SUBROUTINES_^1*_8---------------------_^1*_$READ_!- GET INFORMATION FROM CONTROLLER(STATUSES,ETC)_^1*_$WRITE - GIVE INFORMATION TO CONTROLLER_^1*_$ADDRESS- READ FILE REGISTERS_^1*_$BUSCON- NORMAL CONNECTION OF BUS_^1*_$SECFIL - CONVERT SECTOR NUMBER TO €€FILE ADDRESS._^1*_$CHKLEN- CHECK LENGTH OF TRANSFER_^1*_$WFNSC - WAIT FOR SEEK TO BE COMPLETED_^1*_$GHOST - HANDLING GHOST INTERRUPTS_^1*_$CHKPRI- AMONG THE UNITS WHICH COMPLETED SEEK,CHOOSE_^1*_.THE UNIT WITH THE HIGHEST PRIORITY_^1*_$FINAL - COMPUTE FINAL ADDRESS_^1*_$CHKADR- COMPARE HARDWARE ADDRESS TO EXPECTED_^1*_$UNFRMT- CONTROL FLOW OF UNFORMATTED REQUEST_^1*_$OVERLA€€Y- HANDLING AN OVERLAY REQUEST_^1*S2_]_^1_%SPC 2_^1*_8MISCELLANOUS_^1*_8------------_^1*S2_]_^1_%SPC 2_^1*_8COMMAND TO CONTROLLER - INPUT_^1*_8----------------------------_^1*_$F U N C T I O N_!Q4 Q3 Q2 Q1 Q0_^1*_$---------------------_!-- -- -- -- --_^1*_$CLEAR CONTROLLER_(1 0 0 0 0_^1*_$RTZS_41 0 0 0 1_^1*_$READ DATA_/0 0 0 0 1_^1*_$WRITE DATA_.0 0 0 0 1_€€^1*_$COMPARE DATA_,0 0 0 0 1_^1*_$CHECKWORD CHECK_)0 0 0 0 1_^1*_$WRITE ADDRESS_+0 0 0 0 1_^1*_$SENSE-VERIFY_,0 0 0 0 1_^1*_$FIRST WORD ADDRESS_%0 0 0 1 0_^1*_$BANK SELECT_-0 0 0 1 1_^1*_$LOAD FILE ADDRESS_'0 0 1 0 0_^1*_$WAIT FOR SEEK COMPLETE_!0 0 1 0 1_^1*_$UNIT SELECT_-0 0 1 1 0_^1*_$BLOCK LENGTH_,0 0 1 1 1_^1*_$BUS CONNECT_-0 1 0 0 0€€_^1*_$INTERRUPT REQUEST_'0 1 0 0 1_^1*_$SEEK TO DEVICE_*0 1 0 1 0_^1*_$LOAD DISK ADDRESS_'0 1 0 1 1_^1*S2_]_^1_%SPC 2_^1*_8COMMAND TO CONTROLLER-OUTPUT_^1*_8-----------------------------_^1*S2_]_^1_%SPC 2_^1*_$DYNAMIC STATUS_*1 0 0 0 0_^1*_$A-OUT STATUS_,0 0 0 0 1_^1*_$CURRENT WORD STATUS_$0 0 0 1 0_^1*_$CURRENT MEMORY BANK_$0 0 0 1 1_^1*_$FILE STAUTS€€_-0 0 1 0 0_^1*_$SEEK COMPLETE STATUS_"0 0 1 0 1_^1*S2_]_^1_%SPC 2_^1*_8DYNAMIC STATUS_^1*_8--------------_^1*S2_]_^1_%SPC 2_^1*_$15_"14_"13_"12_"8_#7_"5_"4_"3_"2_"1_"0_^1*_$----- ---- ----- ----- ---- ---- ---- ---- ---- ---- ---- ----_^1*_$BUS_!CTL_!DEV_!ON_"EOP SING DISK ON_!ALRM INTR CONT UNIT_^1*_$BUSY PRTCT SEEK BUS_'DENS WRTE CYL_$RESO BUSY RDY_^1*_1ERR_2PRTC_€€^1*S2_]_^1_%SPC 2_^1*_8ALARM_"STATUS_^1*_8---------------_^1*_$13_"12_"11_"10_"9_#8_"5_"4_"3_"2_"1_"0_^1*_$---- ----- ---- ----- ---- ---- ---- ---- ---- ---- ---- ----_^1*_$BUS_!WRNG WRNG MISS CONT END CMP CHW LOST DMA DMA DMA_^1*_$REL._!D.TR S.FM I/S_!S.ER MED ERR ERR DATA PA.E PR.F AD.A_^1****_]_^1*E_]_^1_%EJT_]_^1_%SPC 1_^1*_*THE MASS MEMORY ADDRESS GIVEN IN€€ THE CALL_^1*_*IS INTERPRETED AS FOLLOWS_^1*_*FOR READ/WRITE AS A WORD ADDRESS_^1*_*FOR FREAD/FWRITE AS A SECTOR ADDRESS (96 WORDS/SECTOR)_^1*_]_^1*_$ENTRY POINTS_^1*_]_^1_%ENT I18334_'DRIVER INITIATOR_^1_%ENT C18334_'DRIVER CONTINUATOR_^1_%ENT E18334_'TIMEOUT ENTRY_^1**********************************************************************_^1*_]_^1*_$THIS DRIVER CAN BE COMPIL€€ED IN TWO MODES_^1*_$ACCORDING TO THE VALUE OF MOTCON_^1*_$MOTCON=0_!RESULTS IN A DRIVER WITHOUT CAPABILITY OF_^1*_0PERFORMING MOTIONS._^1*_$MOTION=1_!RESULTS IN A DRIVER WITH MOTION CAPABILITY._^1*_]_^1*_]_^1_%EQU MOTCON(0)_J14/06/77_^1*_]_^1**********************************************************************_^1*_]_^1*_$EXTERNALS AND EQUATES FOR SYSTEM ROUTINES_^1*_]_€€^1_%EXT CDDCPA_'ROUTINE TO CONVERT LOGICAL TO PHYSICAL ADDR_^1_%EXT CDDCPG_'ROUTINE TO GET CONTROL POINT_^1_%EXT CDDCPS_'ROUTINE TO ROUTINE TO CHECK/SET CONTROL POINT_^1_%EXT CDDACP_'ROUTINE TO SET ABSOLUTE MODE_^1_%EXT LOG_*ERROR LOGGING ROUTINE_^1_%EXT COMPV4_'MAGNITUDE COMPARISON ROUTINE (IN TRVEC)_^1_%EXT MAKEQ_(MAKE Q REG. AND "V" FIELED_^1_%EXT CGHOST_'CONSTANT INT RO€€UTINE_109/06/77_^1_%EQU AFNR($B5)_#ENTRY POINT TO FNR_^1_%EQU ASABS($BD)_"ENTRY POINT TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ACABS($BE)_"ENTRY POINT TO C PARAM. ABSOLUTIZING ROUTINE_^1_%EQU ADISP($EA)_"ENTRY POINT TO DISPATCHER_^1_%EQU ACOMPC($B6)_!ENTRY POINT TO COMPLETION ROUTINE_^1*_]_^1*_$MASK WORDS_^1*_]_^1_%EQU PLU(3)_^1_%EQU CLCKVA(2)_#CLOCK VALUE_:27/04/77_^1_%EQU €€ WDSECM(5)_#MSB OF SYSTEM DIRECTORY ADDRESS_^1_%EQU WDSECL(6)_#LSB OF SYSTEM DIRECTORY ADRESS_^1_%EQU ZERO($22)_#$0_^1_%EQU LPMSK(2)_$$0,$1,$3,$7,$F..._^1_%EQU NZERO($12)_"$FFFF,$FFFE,$FFFC,$FFF8,..._^1_%EQU ONEBIT($23)_!$1,$2,$4,$8,$10..._^1_%EQU ZROBIT($33)_!$FFFE,$FFFD,$FFFB,$FFF7..._^1_%EQU HFFF0($16)_"$FFF0_^1_%EJT_]_^1***************************************************€€*********************_^1*_]_^1*_$PHYSICAL DEVICE TABLE EQUIVALENCES_^1*_]_^1************************************************************************_^1_%SPC 3_^1*_$ALL STATUSES EXCECEPT ESTAT2 ARE HARDWARE STATUSES_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%LOC. OF CURRENT REQUEST PARAMETER LIST_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU€€ EREQST(8)_#SYSTEM STATUS_^1_%EQU ESTAT1(9)_#REQUEST STATUS_^1_%EQU ECCOR(10)_#NEXT LOC. TO STORE OR OBTAIN DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST VALUE OF EQUIPMENT STATUS_^1_%EQU MASLEGN(13)_!DRIVER LENGTH_^1_%EQU MASSEC(14)_"MASS STORAGE ADRESS FOR DRIVER_^1_%EQU RETURN(15)_"RE-ENTRANCY FOR SYSTEM ROUTINES_^1_%EQU FLTCOD(16)_"DRIVER€€ FAULT CODE_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"COUNT OF GHOST INTERUPTS_^1_%EQU MICROI(19)_"MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"TIMOUT IN SECONDS_^1_%EQU SENTRY(21)_"STATUS AFTER INI0IAL ENTRY_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER ERROR_^1_%EQU CPVLOC(24)_"CONTROL POINT LOCATION_^1_%EQU FUNCT(25)_#LA€€ST DATA TRANSFER FUNCTION_^1_%EQU BUFSIZ(26)_"BUFFER SIZE FOR SPLIT TRANSFERS_^1_%EQU CYLADR(27)_"CYLINDER ADDRESS FOR TRANSFER_^1_%EQU SEKBIT(28)_"MASK FOR THIS UNIT'S SEEK COMPLETE BIT_^1_%EQU ABUFF(29)_#ADDRESS OF 96 WORD BUFFER_^1_%EQU TEMFWD(30)_"USED BY WORD ADRESS PORTION_^1_%EQU TEMLWD(31)_"USED BY WORD ADDRESS PORTION_^1_%EQU WORDNO(32)_"USED BY WORD ADDRESS PORTION€€_^1_%EQU TEMREQ(33)_"REQUEST CODE_^1_%EQU PRILVL(34)_"REQUEST PRIORITY_^1_%EQU SVFLAD(35)_"START SECTOR FOR COMPARE OR RETRY_^1_%EQU SAVFWD(36)_"FWA OF TRANSFER FOR COMPARE OR RETRY_^1_%EQU ERCONT(37)_"ERROR COUNTER_^1_%EQU FDATAF(38)_"DATA TRANSFER FUNCTION CODE_^1_%EQU BUFSEC(39)_"NUMBER OF SECTOR CURRENTLY IN BUFFER_^1_%EQU STAT12(40)_"LAST VALUE OF TRUE SECTOR ADDRESS_^€€1_%EQU STAT14(41)_"LAST VALUE OF TRUE CYLINDER ADDRESS_^1_%EQU STAT2(42)_#LAST VALUE OF CWA_^1_%EQU STAT3(43)_#LAST VALUE OF CURRENT BANK STATUS_^1_%EQU EXTRA(44)_#RETURN INDEX AFTER DATA TRANSFER_^1_%EQU FILEAD(45)_"SOFTWARE ECTOR NUMBER_^1_%EQU FCONN(46)_#CONNECT,NO COMPARE FLAG_^1_%EQU TEMSEC(47)_"USED BY WORD ADDRESS PORTION_^1_%EQU COMCHC(48)_"COMPARE OR CHECKWORD CHEC€€K_^1_%EQU ECALL1(49)_"**********_^1_%EQU ECALL2(50)_"* RESERVED FOR_^1_%EQU ECALL3(51)_"* OVERLAY ROUTINE_^1_%EQU ECALL4(52)_"**********_^1_%EQU TMOPAR(53)_"TEMPORARY STORAGE FOR THE MOTION PARAMETERS_^1_%EQU SECTAD(54)_"SECTOR ON DISK_^1_%EQU BANK(55)_$SELECTED BANK_^1_%EQU ALRMST(56)_"ALARM STATUS_^1_%EQU RTZS(57)_$INDICATOR FOR RTZS AFTER ERROR_^1_%EQU LASTQ(58)_#LA€€ST Q REG ON INP/OUT COMMANDS_^1_%EQU LASTA(59)_#LAST A REG ON INP/OUT COMMANDS_^1_%EQU DYNMIC(60)_"HARDWARE DYNAMIC STATUS_^1_%EQU DISK1(61)_#FIRST SECTOR ADDRESS ON DISK 1_^1_%EQU OTHER(62)_#LINK FOR MULTIPLE PHYSTBS_^1_%EQU BUFF(63)_$96 WORD BUFFER FOR PHYSICAL ADDRESSING_^1*_$BIT_!9 OF ESTAT1 IS INDICATOR FOR BUS CONNECT_^1*_$BIT 11 OF ESTAT1 IS THE_!"WANT-IN" BIT€€_^1_%EJT_]_^1***********************************************************************_^1*_]_^1*_$E R R O R C O D E E Q U A T E S_^1*_]_^1***********************************************************************_^1_%SPC 3_^1_%EQU TIMERR(0)_#TIMEOUT ERROR_^1_%EQU INTREJ(5)_#INTERNAL REJECT_^1_%EQU EXTREJ(6)_#EXTERNAL REJECT_^1_%EQU NTRDY(14)_#DEVICE NOT READY_^1_%EQU DVSEEK(17)_€€"DEVICE SEEK ERROR_^1_%EQU CWAERR(85)_"CWA ERROR_^1_%EQU ADRERR(49)_"DEVICE ADRESS ERROR AFTER DATA TRANSFER_^1_%EJT_]_^1_%EJT_]_^1*********************************************************************_^1*_]_^1*_$I N I T I A T O R_^1*_]_^1*********************************************************************_^1_%SPC 3_^1I18334 STQ- I_,SAVE ADDRESS OF PHYSTAB_^1DK_#RTJ- (AFNR)_'CHE€€CK FOR A REQUEST ON THIS UNIT_^1_%JMP* CHECK_(NONE, SCAN FOR REQUESTS ON OTHER UNITS_^1_%ENA -0_+INITIATE STATUS SAVES_^1_%STA- SINTER,I_^1_%STA- SENTRY,I_^1_%STA- STIMEO,I_^1_%STA- FLTCOD,I_^1_%RTJ KDISK_(PROCEED IN KERNEL_^1_%SPC 2_^1*_]_^1*** COMPLETE REQUEST_^1*_]_^1DONE_!CLR A_^1_%STA- ERCONT,I_$CLEAR ERROR COUNTER_^1_%STA DATFLG_^1_%STA- COMCHC,I_$AND RESET IT_^1_%LDA- EL€€STWD,I_$INSURE THAT NO SHORT READ FLAG IS RETURNED_^1_%STA- ECCOR,I_^1_%RTJ+ MAKEQ_^1_%RTJ- (ACOMPC)_$COMPLETE THE REQUEST_^1_%LDQ- EWES,I_^1_%INQ 5_,UNIT DE-SELECT_^1_%LDA- FCONN,I_%IS DONE AFTER THE_^1_%AND- ZROBIT+7_$COMPLETION OF THE_^1_%OUT I05-*_(REQUEST_^1I05_"JMP* DK_^1_%JMP* DK_^1_%SPC 2_^1*_]_^1*** EXIT FROM DRIVER_^1*_]_^1I10_"LDA SEKMSK_'MASK FOR SEEK FOR ALL THE €€UNITS_^1_%SAZ I20_*SKIP IF NO SEEK HAS BEEN ISSUED_^1_%JMP B40_^1*_]_^1* CODE DELETED TO RELEASE BUS SINCE SINGLE ACCESS ONLY_^1*_]_^1I20_"JMP- (ADISP)_%EXIT_^1*_]_^1*** TIMEOUT ERROR ENTRY_^1*_]_^1E18334 STQ- I_,SAVE ADDRESS OF PHYSTAB_^1_%ENA TIMERR_'0 - TIMEOUT ERROR_^1_%JMP FAULT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_€€$CHECK FOR A UNIT THAT WANTS IN AND INITIATE SEEK OPERATION_^1*_]_^1************************************************************************_^1_%SPC 3_^1CHECK LDA- OTHER,I_%PICK UP FIRST THREAD_^1CHECK1 TRA Q_^1_%SUB- I_,IS THIS END OF CHAIN_^1_%SAZ CHECK4_'SKIP IF YES_^1_%LDA- ESTAT1,Q_$SEE IF THIS UNIT WANTS IN_^1_%AND- ONEBIT+11_^1_%SAN CHECK3_'IT DOES, GO SERVICE IT_^1_%LD€€A- OTHER,Q_%GET NEXT UNIT_^1_%JMP* CHECK1_'CHECK IT_^1CHECK4 JMP I10_^1CHECK3 STQ- I_,SET I REGISTER TO UNIT THAT WANTS IN_^1_%SPC 3_^1*_]_^1*** INITIATE SEEK OPERATION_^1*_]_^1SEEKOP LDQ- EWES,I_^1_%INQ 5_,UNIT SELECT_^1_%LDA- FCONN,I_%SELECT THE UNIT FOR THIS P.D.T._^1_%RTJ WRITE_^1_%LDA- ESTAT1,I_$CLEAR WANT-IN BIT_^1_%AND- ZROBIT+11_^1_%STA- ESTAT1,I_^1_%SPC 1_^1** CHECK I€€F UNIT IS READY_^1_%ENA 0_^1_%STA COUNT1_^1_%STA* TMPERR_'ENABLE TIMEOUT ERROR IF NO EOP_'13/06/77_^1SEEK05 LDQ- EWES,I_^1_%INQ 15_+DYNAMIC STATUS_^1_%RTJ READ_^1_%RTJ CONV_^1_%STA- ESTAT2,I_^1_%LDA- DYNMIC,I_^1_%AND- ONEBIT+8_$($100) CHECK FOR EOP_^1_%SAZ SEEK06_'SKIP IF NOT EOP_^1_%ENA 14_Q13/06/77_^1_%STA* TMPERR_M13/06/77_^1_%LDA- DYNMIC,I_$CHECK FOR UNIT READY_^1_%AND- €€ONEBIT_^1_%SAN SEEK04_'IF EOP,CHECK ON CYLINDER_-06/06/77_^1SEEK06 RTJ COUNT_^1_%LDA* TMPERR_'TMPERR=NOT READY OR TIMEOUT ERROR_#13/06/77_^1_%JMP* REJCT+2_%JUMP TO FAULT ROUTINE_^1_%JMP* SEEK05_^1SEEK04 LDA- DYNMIC,I_K06/06/77_^1_%AND- ONEBIT+4_$CHECK "ON CYLINDER BIT"_.06/06/77_^1_%SAN SEEK07_'IF ON CYLINDER CONTINUE_.06/06/77_^1_%ENA DVSEEK_'ELSE - JUMP TO FAULT WITH_,06/06/7€€7_^1_%JMP FAULT_(ERROR CODE = 13_606/06/77_^1_%SPC 1_^1SEEK07 LDA- DYNMIC,I_^1_%AND- ONEBIT+5_$IS WRITE PROTECT ON_^1_%SAN SEEK08_'IF ON_!GO TO CHECK IF IT WAS A WRITE REQ_^1_%JMP* SEEK10_'IF NOT - CONTINUE_^1SEEK08 LDA- TEMREQ,I_$PICK UP REQUEST CODE_^1_%ALS 12_^1_%SAM SEEK10_'IF MOTION REQUEST - CONTINUE_^1_%ALS 2_^1_%SAM SEEK09_'IF_#WRITE - ERROR_^1_%JMP* SEEK1€€0_'IF NOT CONTINUE_^1SEEK09 ENA 13_+DISK WRITE PROTECT ERROR_^1_%JMP FAULT_^1** SEEK TO DEVICE_^1*_]_^1_%IFA MOTCON,EQ,1_^1*_]_^1SEEK10 LDA- TEMREQ,I_^1_%INA -14_^1_%SAN SEK100_^1_%JMP MOT01_(IF MOTION GO BACK TO MOTION ROUTINE_^1SEK100 LDQ- EWES,I_^1_%EIF_]_^1_%IFA_!MOTCON,EQ,0_^1*_]_^1SEEK10 LDQ- EWES,I_^1_%EIF_]_^1_%INQ 9_,SEEK TO DEVICE_^1_%LDA- CYLADR,I_$PICK UP NEW AD€€RESS_^1_%IFA MOTCON,EQ,0_H14/06/77_^1_%AND =N$E000_%CHECK IF ONE OF THE THREE UPPER BITS 14/06/77_^1_%SAZ SEEK16_M15/06/77_^1_%ENA 16_+IF YES CONTROLLER SEEK ERROR_)14/06/77_^1_%JMP FAULT_N14/06/77_^1SEEK16 LDA- CYLADR,I_K15/06/77_^1_%JMP* SEEK15_^1_%EIF_]_^1_%IFA MOTCON,EQ,1_^1_%AND* M1FF0_^1*_]_^1_%EIF_]_^1*_]_^1SEEK15 RTJ WRITE_N14/06/77_^1_%SPC 1_^1** SET THIS UNIT BIT€€ IN SEEK MASK_^1SEK125 LDA- SEKBIT,I_$SEKBIT = THE BIT IN SEEK COMPLETE STATUS_^1_%TCA A_,FOR THIS UNIT_^1_%AND SEKMSK_^1_%EOR- SEKBIT,I_^1_%STA SEKMSK_^1_%JMP* CHECK_^1_%IFA MOTCON,EQ,1_^1M1FF0 NUM $1FF0_^1_%EIF_]_^1TMPERR NUM 0_R13/06/77_^1*E_]_^1_%EJT_]_^1****_]_^1************************************************************************_^1*_]_^1*_$K E R N E L_^1*_]_^1*****€€*******************************************************************_^1_%SPC 3_^1*_8FUNCTION_^1*_8--------_^1*S2_]_^1_%SPC 2_^1*_$THE KERNEL CONTROLS THE FLOW OF EXECUTION IN THE DRIVER._^1*S2_]_^1_%SPC 2_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*S2_]_^1_%SPC 2_^1*_$THE KERNEL PROVIDES THE SKELETON FOR ANCILLARY_^1*_$ROUTINES CALL FOR I/O PROCESSING._^1*_]_^1*S2_]_^1_€€%SPC 2_^1*_8INPUT_!REQUIREMENTS_^1*_8--------------------_^1*S2_]_^1_%SPC 2_^1*_$I = ADDRESS OF P.D.T_^1*S2_]_^1_%SPC 2_^1*_7OUTPUT_^1*_7------_^1*S2_]_^1_%SPC 2_^1*_]_^1*_'1. CALLS ANCILLARY SUBROUTINES BDISK,WAIT,VERIFY,NEXT_^1*_*RETURN TO 'DONE' IN THE INITIATOR._^1*_]_^1*S2_]_^1_%SPC 2_^1*_8FLOW_^1*_8----_^1*S2_]_^1_%SPC 2_^1*_]_^1*_!KDISK_]_^1*_$1. ISOLATE REQUEST CODE A€€ND PRIORITY. STORE IT IN P.D.T_^1*_$2. IF MOTION_^1*_0IF MOTIONS ARE PERMITED_^1*_4JUMP TO MOTION ROUTINE._^1*_0ELSE_^1*_4JUMP TO EXIT FROM DRIVER._^1*_(EIF_^1*_$3. IF USERS-BUFFER LENGTH > 0 : CONTINUE_^1*_-ELSE : USERS-BUFFER LENGTH<--- 1_^1*_(EIF_^1*_#4. CALL BDISK ANCILLARY SUBROUTINE_^1*_#5. ON RETURN CALL WAIT ANCILLARY SUBROUTINE_^1*_#6. ON RETURN CALL VERIFY ANCILLARY SUBRO€€UTINE_^1*_$7. IF_!EOP INTERRUPT IS ON BUS-CONNECT_^1*_-JUMP TO 4._^1*_(IF_!EOP INTERRUPT IS ON GHOST-INTERRUPT_^1*_-JUMP TO 5._^1*_(ELSE_^1*_-JUMP TO "NEXT" AND RETURN_^1*_$8. IF_!EOP ON DATA TRANSFER_^1*_2IF REQUEST COMPLETED_^1*_4JUMP TO "DONE"_^1*_4ELSE JUMP TO 4._^1*_4ENDIF._^1*_(ELSE_^1*_)JUMP TO 5. (WAIT FOR EOP ON DATA TRASFER)._^1*_!WRITE - ON ENTRY Q= HARDWARE ADDRESS. A€€=OUTPUT DATA_^1*_#1. SAVE (Q) AND (A) REGISTERS OF OUT IN LASTQ AND LASTA_^1*_#2. PERFORM OUT INSTRUCTION_^1*_#3. IF REPLY,REUTRN TO CALLER._^1*_'IF INTERNAL/EXTERNAL REJECT LOG THE CORESPONDING ERROR CODE_^1*_]_^1_$SPC 3_^1*_]_^1*_"READ- ON ENTRY Q=HARDWARE ADDRESS A=$FFFF_^1*_#1. SAVE (Q) REGISTER OF INP IN LASTQ. SET LASTA._^1*_#2. PERFORM INP INSTRUCTION._^1*_#3. IF REPLY RETU€€RN TO CALLER._^1*_'IF INTERNAL/EXTERNAL REJECT,JUMP TO FAULT_^1*_!ADDRESS - TAKE ALL STATUS CONCERNING ADDRESS._^1*_#1. LOAD FILE ADDRESS (FILE '12+13')_^1*_#2. GET THE TRUE SECTOR ADDRESS, STORE IT (FILE '14+15')_^1*_#3. GET TRUE CYLINDER ADDRESS,STORE IT_^1*_#4. GET CURRENT BANK STATUS,STORE IT_^1*_#5. GET CURRENT WORD ADDRESS,STORE IT._^1*_]_^1*_]_^1*_8SUBROUTINES_^1*_8--------€€---_^1*S2_]_^1_%SPC 2_^1*_#COMPV4- COMPARE VALUES OF A AND Q (EXTERNAL)_^1*_#MOTION- HANDLE MOTION REQUESTS._^1*_#BDISK - BEGIN:PREPARE AND BEGIN ANCILLARY OPERATION._^1*_#WAIT - INITIATE DIAGNOSTIC CLOCK AND EXITS TO DISPATCHER_^1*_#VERIFY- GET STATUS AND VERIFY THE INTERRUPT._^1*_#NEXT - PERFORMS THE MAIN I/O_^1*_]_^1****_]_^1*E_]_^1_%EJT_]_^1KDISK NUM 0_^1_%RTJ CDDCPG_'GET€€ THE CONTROL POINT FOR THIS REQUEST_^1_%SPC 1_^1** SAVE REQUEST CODE AND REQUEST PRIORITY_^1_%LDQ- EPTR,I_'PICK UP REQUEST PARAMETER LOCATION_^1_%LDA- (ZERO),Q_^1_%STA- TEMREQ,I_$SAVE THE REQ._^1_%ARS 4_,DROP COMPLETION PRIORITY_^1_%AND- LPMSK+4_%$000F - SAVE REQ PRIORITY_^1_%STA- PRILVL,I_(FOR DRIVER_^1_%SPC 1_^1** PROCESS THE REQUEST_^1_%LDA- TEMREQ,I_$RESTORE REQUEST_^1_%AND€€ =N$3E00_%UNPACK THE REQUEST CODE_^1_%ARS 9_^1_%STA- TEMREQ,I_$STORE_!REQUEST CODE RIGHT SHIFTED_^1_%INA -14_*CHECK FOR MOTION REQUEST_^1_%SAN K35_*SKIP IF NOT MOTION_^1*_]_^1_%IFA MOTCON,EQ,1_^1*_]_^1_%JMP MOTION_'JMP TO MOTION ROUTINE_^1*_]_^1_%EIF_]_^1_%IFA MOTCON,EQ,0_^1*_]_^1_%JMP DONE_)IGNORE MOTION REQUEST_^1*_]_^1_%EIF_]_^1K35_"LDA- ELSTWD,I_$LWA OF USERS BUFFER€€_^1_%LDQ- ECCOR,I_%FWA OF USERS BUFFER_^1_%RTJ COMPV4_'CHECK MAGNITUDES_^1_%INA 0_^1_%SAN K20_*SKIP IF ECCOR27/04/77_^1_%STA- EDCLK,Q_%TIME INTERRUPTS._527/04/77_^1_%LDA- ELU,Q_(CHECK_@27/04/77_^1_%SAZ C30_*ACTIVITY:_<27/04/77_^1_%STQ* ACTIVE_'STORE ADDRESS OF ACTIVE P.D.T_(13/06/77_^1C30_"LDA- OTHER,Q_%CHECK_@27/04/77_^1_%SUB- I_,END OF CHAIN_927/04/77_^1_%SAZ C20_*IF FINISHED - EXIT FROM L€€OOP_)27/04/77_^1_%LDA- OTHER,Q_%ELSE_A27/04/77_^1_%JMP* C10_*CONTINUE LOOPING_527/04/77_^1C20_"LDA* ACTIVE_M27/04/77_^1_%SAN C40_P27/04/77_^1_%RTJ GHOST_(IF NO UNIT IS ACTIVE- GHOST INTERRUPT 27/04/77_^1C40_"STA- I_-ADDRESS OF LAST ACTIVE P.D.T_(13/06/77_^1_%JMP* (WAIT)_M27/04/77_^1ACTIVE NUM 0_R27/04/77_^1_%EJT_]_^1****_]_^1*E_]_^1***********************************************€€************************_^1*_]_^1*_$V E R I F Y_!T H E_!I N T E R U P T_^1*_]_^1***********************************************************************_^1_%SPC 3_^1*S2_]_^1_%SPC 2_^1*_8FUNCTION_^1*_8--------_^1*_$THE VERIFY SUBROUTINE EXAMINES THE VALIDITY OF THE INTERRUPT_^1*_$AND DETERMINS INTERRUPT TYPE_^1*S2_]_^1_%SPC 2_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*_]_€€^1*_]_^1*_$THIS SUBROUTINE DETERMINTS WHAT OF THE FOLLOWING CASES CAUSED_^1*_$THE INTERRUPT:_^1*_$- BUS CONNECT._^1*_$- EOP ON DATA TRANSFER._^1*_$- EOP ON SEEK._^1*_$- EOP ON SENSE-VERIFY,RTZS,WRITE ADDRESSES-IF MOTION REQUEST._^1*_$- GHOST INTERRUPT._^1*_$- EOP ON ALARM._^1*_]_^1*S2_]_^1_%SPC 2_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_$(I)=ADDRESS OF LAST ACTIVE UNIT._€€^1*S2_]_^1_%SPC 2_^1*_8OUTPUT_^1*_8------_^1*S2_]_^1_%SPC 2_^1*_]_^1*_$1. CALLS KERNEL READ/WRITE SUBROUTINES._^1*S2_]_^1_%SPC 2_^1*_8ENTRY/EXIT_^1*_8----------_^1*S2_]_^1_%SPC 2_^1*_$1. VERIFY ENTRY - ENTERED BY RETURN JUMP FROM KERNEL_^1*_$2. EXIT - TO ALARM SUBROUTINE IF INTERRUPT WAS BECAUSE OF ALARM._^1*_$3. EXIT - TO DISPATCHER WHEN INTERRUPT ILLEGAL._^1*_$4. EXIT - TO KERN€€EL (CALLING SUBROUTINE),TO WAIT TO BEGINE_^1*_/MOTION OR NEXT DUE TO INTERRUPT._^1*S2_]_^1_%SPC 2_^1*_8FLOW_^1*_8----_^1*_]_^1* VERIFY_]_^1*_$1. IF DATFLG NOT EQUAL ZERO THEN I=DATFLG_^1*_$2. READ DYNAMIC STATUS_^1*_$3. IF ALARM GO TO ALARM SUBROUTINE_^1*_$4. IF NOT EOP CALL GHOST SUBROUTINE IN VERIFY SUBROUTINE._^1*_$5. CLEAR INTERRUPT_^1*_$6. IF EOT BECAUS OF BUS CONNECT RESET €€BIT IN ESTAT1_^1*_$7. RESTORE P.D.T ADDRESS, CLEAR BUS-CONNECT FLAG_^1*_(RETURN TO CALLER (BEGIN OR MOTION)_^1*_$8. IF DATFLG IS ON - JUMP TO NEXT VIA KERNEL SUBROUTIEN_^1*_$9. IF EOP ON CHANGE IN SEEK STATUS OF NON-OPERATIVE UNIT-_^1*_(JMP TO WAIT SUBROUTINE_^1*_#10. EOP ON SEEK COMPLETED-JUMP TO NEXT SUBROUTINE_^1*_]_^1*_!GHOST_]_^1*_$1. INCREMENT GHOSTI FOR ALL PDT'S._^1*_$2. IF€€ THERE IS AT LEAST ONE ACTIVE UNIT_^1*_(JUMP TO FAULT WITH TIMEOUT ERROR._^1*_$3. CLEAR CONTROLLER._^1*_$4. IF DIAGNOSTICS,JUMP TO CGHOST._^1*_$5. JUMP TO DISPATCHER._^1*S2_]_^1_%SPC 2_^1****_]_^1*E_]_^1_%EJT_]_^1VERIFY NUM 0_^1_%LDA DATFLG_^1_%SAZ V01_^1_%STA- I_^1_%SPC 1_^1V01_"LDQ- EWES,I_^1_%INQ 15_+DYNAMIC STATUS_^1_%INP RJCT2-*_^1_%STA- SINTER,I_^1V05_"RTJ CONV_^1_%ST€€A- ESTAT2,I_^1_%SPC 1_^1_%LDA- DYNMIC,I_^1**CHECK FOR ALARM_^1_%AND- ONEBIT+3_^1_%SAZ V10_*SKIP IF NO ALARM_^1_%JMP ALARM_(FIND CAUSE FOR ALARM_^1_%SPC 1_^1** CHECK FOR EOP INTERRUPT_^1V10_"LDA- DYNMIC,I_^1_%AND- ONEBIT+8_^1_%SAN V20_^1_%RTJ GHOST_^1_%SPC 1_^1** CLEAR INTERRUPTS_^1V20_"LDQ- EWES,I_^1_%INQ 8_,INTERRUPT REQUEST_^1_%LDA- ONEBIT+7_$CLEAR INTERRUPT_^1_%RTJ WRIT€€E_^1_%SPC 1_^1** CHECK IF EOP IS FOR BUS CONNECT_^1_%LDA- ESTAT1,I_^1_%AND- ONEBIT+9_^1_%SAZ V25_*SKIP IF EOP IS NOT FOR BUS CONNECT_^1_%LDA- ESTAT1,I_$CLEAR EOP ON BUS CONNECT INDICATOR_^1_%AND- ZROBIT+9_^1_%STA- ESTAT1,I_^1_%LDA DATFLG_'RESTORE PHSICAL DEVICE_^1_%STA- I_,LOAD RETURN ADDRESS_^1_%LDQ BSCN20_^1_%CLR A_^1_%STA DATFLG_'INDICATES THAT BUS CONNECT IS COMPLETE_^1_%€€STA BSCN20_'CLEAR BUS CONNECT FLAG_^1_%JMP- (ZERO),Q_$JUMP IS DONE EITHER TO BEGIN_^1*_8OR TO MOTION DEPENDING ON BSCN20_^1*_]_^1** CHECK IF EOP IS FOR DATA TRANSFER OR SEEK OPERATIN_^1V25_"LDA DATFLG_^1_%SAZ 2_^1_%LDQ* VERIFY_^1_%JMP- 2,Q_*JUMP TO NEXT_^1_%SPC 1_^1** CHECK IF EOP IS BECAUSE CHANGE IN READY FOR NON OPERATIVE UNIT_^1_%LDQ- EWES,I_^1_%INQ 4_,SEEK COMPLETE STATUS€€_^1_%RTJ READ_^1_%TRA Q_,TRANSFER A TO Q_^1_%AND SEKMSK_'CHECK IF ANY OF THE UNITS COMPLETED SEEK_^1_%SAN V30_*SKIP IF INT IS NOT BECAUSE A NON_^1*_8OPERATIVE UNIT_^1_%SPC 1_^1**WAIT FOR NEW SEEK COMPLETE ,ADD THE NEW READY DEVICE_^1_%STQ SEKCOM_'UPDATE SEEK COMPLETE_^1_%RTJ WFNSC_^1_%LDQ* VERIFY_^1_%JMP- 1,Q_*GO TO "WAIT"_^1V30_"LDQ* VERIFY_^1_%JMP- 2,Q_*GO TO "NEXT"_^1RJCT€€2 JMP* INRJ2_^1_%ENA 6_^1_%JMP FAULT_^1INRJ2 ENA 5_^1_%JMP FAULT_^1_%SPC 2_^1_%EJT_]_^1***********************************************************************_^1*_]_^1*_$G H O S T_!I N T E R U P T_^1*_]_^1***********************************************************************_^1_%SPC 3_^1GHOST NUM 0_^1 SPC 1_]_^1**_#UPDATE GHOSTI_K08/06/77_^1 SPC 1_]_^1_%LDA- I_R08/06/77_€€^1_%STA* CKPDT_N08/06/77_^1CK05_!RAO- GHOSTI,I_$INCREMENT NO OF GHOSTS_/08/06/77_^1_%LDA- OTHER,I_L08/06/77_^1_%STA- I_R08/06/77_^1_%EOR* CKPDT_N08/06/77_^1_%SAZ CK10_)SKIP IF CHIN IS FINISHED_-08/06/77_^1_%JMP* CK05_)CONTINUE LOOPING_508/06/77_^1 SPC 1_]_^1** FOR NON ACTIVE UNITS CLEAR CONTROLLER AND EXIT_.08/06/77_^1 SPC 1_]_^1CK10_!LDA- ELU,I_N08/06/77_^1_%SAN G10_P08/06/77_^1€€_%LDQ- EWES,I_'CLEAR CONTROLLER_508/06/77_^1_%INQ 15_Q08/06/77_^1_%OUT G20-*_N08/06/77_^1_%IFA MOTCON,EQ,1_^1G20_"NOP_]_^1_%RTJ CGHOST_'JUMP TO DISPATCHER VIA CGHOST_(08/06/77_^1_%EIF_]_^1_%IFA MOTCON,EQ,0_^1G20_"JMP- (ADISP)_%JUMP TO DISPATCHER_308/06/77_^1_%JMP- (ADISP)_%JUMP TO DISPATCHER_308/06/77_^1_%EIF_]_^1 SPC 1_]_^1** IF GHOST BECAUSE THERE IS NO EOP JUMP TO FAULT_^1 €€SPC 1_]_^1G10_"ENA TIMERR_N08/06/77_^1_%JMP FAULT_N08/06/77_^1CKPDT NUM 0_R08/06/77_^1_%EJT_]_^1****_]_^1*E_]_^1*S2_]_^1_%SPC 2_^1************************************************************************_^1*_]_^1*_$N E X T_!I / O_^1*_]_^1************************************************************************_^1_%SPC 3_^1*_8FUNCTION_^1*_8--------_^1*_$THE NEXT SUBROUTINE DOES T€€HE MAIN I/O FUNCTIONS:_^1*_$DATA TRANSFER,COMPARE,RETRY,CHECKWORD CHECK (IF MOTION REQUEST)_^1*_]_^1*S2_]_^1_%SPC 2_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*S2_]_^1_%SPC 2_^1*_$THE NEXT SUBROUTINE IS ENTERED IN TWO CASES:_^1*_$1. EOP ON SEEK OPERATION_^1*_$2. EOP ON DATA TRANSFER AND THE MOTIONS: RTZS,SEEK TO DEVICE._^1*_]_^1*_$WHEN EOP ON SEEK OPERATION, INITIATION I€€S DONE FOR DATA TRANSFER._^1*_]_^1*_$WHEN EOP ON MOTION, A RETURN TO MOTION ROUTINE IS DONE_^1*_]_^1*_$WHEN EOP AFTER DATA TRANSFER IT CHACKS REQUEST COMPLETION._^1*_]_^1*S2_]_^1_%SPC 2_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*_#1. DATFLG=0 IF NO DATA TRANSFER ,I REGISTER=P.D.T ADDRESS_^1*_'DATFLG=P.D.T ADDRESS OF THE UNIT PERFORMING DATA TRANSFER_^1*_]_^1*S2_]_^1_%SPC €€ 2_^1*_8OUTPUT_^1*_8------_^1*S2_]_^1_%SPC 2_^1*_#1. CALLS KERNEL READ/WRITE SUBROUTINES._^1*_#2. SAVE DYNAMIC STATUS IN SINTER (P.D.T)_^1*_#3. SET DATFLG TO THE P.D.T ADDRESS OF THE UNIT WHICH TRANSFERES_^1*_'DATA / OR CLEAR IT WHEN EOP FOR DATA TRANSFER_^1*_#4. ASSIGNS THE FOLLOWING ERROR CODES:_^1*_)0 - TIMEOUT ERROR IF NO EOP IS ENCOUNTERED_^1*_)14 - DEVICE NOT READY_^1*_)17.-€€ DEVICE SEEK ERROR_^1*_]_^1*S2_]_^1_%SPC 2_^1*_8ENTRY/ EXIT_^1*_8-----------_^1*S2_]_^1_%SPC 2_^1*_#1. NEXT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL OR BY A_^1*_4RETURN JUMP FROM MOTION SUBROUTINE_^1*_#2. EXIT - TO ALALRM IF ALARM DURING FUNCTION EXECUTION._^1*_#3. EXIT - TO FAULT TO LOG THE ERRORS_^1*_#4. EXIT - TO MOT03 WHEN PERFORMING MOTION._^1*_#5. EXIT - TO COMPR TO COMPA€€RE DATA_^1*_#6. EXIT - TO WRITOP TO WRITE ON DISK 1._^1*_]_^1*S2_]_^1_%SPC 2_^1*_8FLOW_^1*_8----_^1*S2_]_^1_%SPC 2_^1*_!NEXT_]_^1*_#1. IF DATA TRANSFER RESTOR I, GO TO N40 (25)_^1*_#2. PROCESS EOP FOR SEEK COMPLETE._^1*_#3. FROM ALL UNITS WHICH COMPLETED SEEK OPERATION, PICK UP THE ONE_^1*_$. WITH THE HIGHEST PRIORITY._^1*_#4. SELECT THE UNIT AND GET DYNAMIC STATUS._^1*_#5. IF TH€€E UNIT IS NOT READY TRY 10 TIMES_^1*_#6. IF AFTER 10 TIMES OF RETRY UNIT STILL NOT READY LOG ERROR-14_^1*_#7. IF DEVICE SEEK ERROR /NOT ON CYLINDER LOG ERROR - 17_^1*_#8. IF ALARM GO TO ALARM IN ERROR ROUTINE_^1*_$9. IF DIAGNOSTICS:_^1*_+IF IT IS MOTION JUMP TO MOT03._^1*_(EIF._^1*_(IF NOT DIAGNOSTICS:_^1*_*IF IT IS RTZS- JUMP TO F05 IN FAULT._^1*_'EIF_^1*_"10. SELECT MEMORY BANK_^€€1*_"11. LOAD FIRST WORD ADDRESS_^1*_"12. LOAD BLOCK LENGTH_^1*_"13. LOAD DISK ADDRESS_^1*_"14. SELECT EOP+ALARM INTERRUPTS_^1*_"15. PERFORM TRANSFER DATA FUNCTION_^1*_"16. IF NOT DIAGNOSTIC LOGICAL UNIT GO TO N27 (21)_^1*_"17. IF COMPARE.GO TO N25 ( )_^1*_"18. IF CHECKWORD CHECK GO TO N26 (20)_^1* N25_]_^1*_"19. SET TO COMPARE FUNCTION GO TO N27 (21)_^1* N26_]_^1*_"20. SET TO CHE€€CKWORD CHECK FUNCTION_^1*_"21. PERFORM FUNCTION_^1*_"22. SET DATFLG TO THE P.D.T ADDRESS OF THE UNIT WHO TRANSFERS THE_^1*_'DATA_^1*_"23. COMPUTE FINAL CONTROLLER ADDRESS STATUS._^1*_"24. RETURN TO KERNEL - CALLING SUBROUTINE_^1* N40_]_^1*_"25. CLEAR DATFLG.CHECK ALL CONTROLLER ADDRESS STATUS AGAINST THE_^1*_'THE EXPECTED VALUES_^1*_"2L. IF NOT DIAGNOSTIC CLOCK GO TO N45 (28)._^1*€€_"27. IF SPECIAL COMPARE OR CHECKWORD CHECK GO TO N50 (33)_^1* N45_]_^1*_"28. IF COMPARE FLAG IS NOT SET, BY PASS COMPARE (33)_^1*_"29. PICK UP LAST DATA TRANSFER FUNCTION.IF LAST OPERATION WAS NOT_^1*_'WRITE GO TO N50 ( )._^1*_"30. PICK UP ORIGINAL FILE ADDRESS, RESTORE IT IN P.D.T_^1*_"31. PICK UP ORIGINAL FIRST WORD ADDRESS,RESTORE IT IN P.D.T_^1*_"32. GO TO COMPR (IN BEGIN SU€€BROUTINE) TO COMPARE DATA WRITTEN ON_^1*_'DISK AT A TIME_^1* N50_]_^1*_"33. IF REQUEST COMPLETED GO TO N70 (36)._^1* CONTINUE TRANSFER_^1*_"34. IF LAST FUNCTION WAS COMPARE WRITE ON DISK 1.(COMPARE WILL BE_^1*_'PERFORMED AFTERWARDS)._^1*_"35. GO TO CONT IN BEGIN TO CONTINUE THE TRANSFER ACCORDING TO_^1*_'THE FUNCTION IN FDATAF IN THE P.D.T_^1* N70_]_^1*_"36. GO TO SPECIFIED ENTR€€Y IN BEGIN_^1*_]_^1* COUNT_]_^1*_#1. COUNT UP TO TEN TIMES._^1*_#2. IF FINISHED RETURNS THREE LOCATIONS AFTER CALL_^1*_#3. RETURNS ONE LOCATION AFTER CALL._^1* CHKPRI -PICK THE UNIT WITH THE HIGHEST PRIORITY_^1*_#1. SET CURRENT HIGHEST PRIORITY=-1_^1*_#2. FIND NEXT UNIT THAT COMPLETED SEEK.COMPARE THE PRIORITY OF_^1*_'THIS UNIT AND THE CURRENT HIGHEST PRIORITY. SAVE THE HIGEST_^1€€*_'BETWEEN THE TWO._^1*_#3. IF NOT END OF THREAD GO TO 2_^1*_#4. SAVE THE P.D.T OF THE UNIT WITH THE HIGHEST PRIORITY_^1*_#5. CLEAR THIS UNIT'S BIT IN SEEK COMPLETED MASK_^1*_#6. RETURN TO CALLER._^1*_]_^1* FINAL - COMPUTE FINAL CONTROLLER ADDRESS STATUS._^1*_#1. FIND FINAL SOFTWAR SECTOR_^1*_#2. COMPUTE HARDWARE ADDRESS_^1*_#3. INCREMENT SOFTWARE SECOTR NUMBER BY 1._^1*_#4. UPDAT€€E CURRENT WORD ADDRESS_^1*_#5. RETURN TO CALLER_^1*_]_^1* CHKADR - CHECK ALL CONTROLLER ADDRESS STATUS AGAINST EXPECTED VALUES._^1*_#1. TAKE ALL STATUS CONCERNING THE ADDRESS_^1*_#2. COMPARE CURRENT BANK. IF NOT THE SAME LOG ERROR 37-CWA ERROR CO_^1*_#3. CHECK CWA.IF NOT THE SAME LOG ERROR 37_^1*_#4. IF NOT THE TRUE CYLINDER-LOG ERROR 49- DRIVE ADDRESS ERROR_^1*_#5. IF NOT THE TRU€€E SECTOR- LOG ERROR 49_^1*_#6. RETURN TO CALLER._^1*_]_^1*_]_^1****_]_^1*E_]_^1_%EJT_]_^1NEXT_!NUM 0_^1_%SPC 1_^1** DECIDE WETHER EOP WAS FOR END OF DATA TRANSFER OR FOR END OF SEEK_^1_%LDA DATFLG_^1_%SAZ N10_*SKIP IF NO DATA TRANSFER IN PROGRESS_^1_%STA- I_^1_%JMP* N40_^1*_]_^1*** PROCESS EOP FOR SEEK COMPLETE_^1*_]_^1_%SPC 1_^1** FROM ALL UNITS WHICH COMPLETED SEEK OPERATION€€, PICK UP THE ONE_^1** WITH THE HIGHEST PRIORITY_^1N10_"LDQ- EWES,I_^1_%INQ 4_,SEEK COMPLETE STATUS_^1_%RTJ READ_^1_%AND SEKMSK_^1_%STA SEKDON_'SAVE THE UNITS WHICH COMPLETED THE SEEK_^1_%RTJ CHKPRI_'PICK THE UNIT WITH THE HIGHEST PRIORITY_^1_%SPC 1_^1** SELECT THIS UNIT_^1_%LDQ- EWES,I_^1_%INQ 5_,UNIT SELECT_^1_%LDA- FCONN,I_%UNIT SELECT BITS_^1_%RTJ WRITE_^1_%SPC 1_^1** €€CHECK FOR DEVICE SEEK ERROR_^1N3_#ENA 0_^1_%STA COUNT1_'CLEAR COUNTER IN "COUNT"_^1_%STA TMPER2_M13/06/77_^1N11_"LDQ- EWES,I_'DYNAMIC STATUS_^1_%INQ 15_^1_%RTJ READ_^1_%RTJ CONV_^1_%STA- ESTAT2,I_^1_%LDA- DYNMIC,I_^1_%STA- SINTER,I_^1_%AND- ONEBIT+8_$CHECK FOR EOP_^1_%SAZ N115_)SKIP IF NOT EOP_^1_%ENA 14_Q13/06/77_^1_%STA TMPER2_^1_%LDA- DYNMIC,I_$CHECK FOR UNIT READY_^1_%€€AND- ONEBIT_^1_%SAN N12_*SKIP IF UNIT READY_^1N115_!RTJ COUNT_^1_%LDA* TMPER2_M13/06/77_^1_%JMP* N19_^1_%JMP* N11_^1TMPER2 NUM 0_R13/06/77_^1N12_"LDA- DYNMIC,I_^1_%ALS 2_^1_%SAP N13_*SKIP IF NO DEVICE SEEK ERROR_^1_%ENA DVSEEK_'17 - SEEK ERROR_^1_%JMP* N19_^1N13_"ALS 9_^1_%SAN N14_*SKIP IF ON CYLINDER_^1_%ENA DVSEEK_'17 - SEEK ERROR_^1_%JMP* N19_^1N14_"ALS 1_^1_%SAP N20_€€*SKIP IF NO ALARM_^1_%JMP ALARM_^1N19_"JMP FAULT_^1*_]_^1_%IFA MOTCON,EQ,1_^1*_]_^1N20_"LDA- TEMREQ,I_^1_%INA -14_^1_%SAZ N21_*IF MOTION RETURN TO MOTION ROUTINE_^1_%LDA* N22_^1_%STA* NEXT_)IF THE REQUEST WAS NOT MOTION_^1_%JMP N23_*MAKE SURE TO RETURN TO KERNEL_^1N22_"ADC K55+2_^1N21_"JMP MOT03_(RETURN TO MOTION_^1_%SPC 1_^1** SELECT MEMORY BANK_^1N23_"LDQ- EWES,I_€€^1*_]_^1_%EIF_]_^1_%IFA MOTCON,EQ,0_^1*_]_^1N20_"LDA- RTZS,I_M05/05/77_^1_%SAZ N200_)IF NOT RTZS BEGIN DATA TRANSFER_%05/05/77_^1_%CLR A_,CLEAR_@05/05/77_^1_%STA- RTZS,I_'RTZS INDICATOR_705/05/77_^1_%JMP F05_*RTZS IS DONE RETURN TO FAULT_)05/05/77_^1N200_!RTJ CDDCPA_'TRANSLATE LOGICAL TO PHYSICAL ADDRESS_^1_%STA* LSBADR_'SAVE LSB OF PHYSICAL ADDRESS_^1_%ENA 0_^1_%LRS 2_,POSI€€TION MSB (BANK BITS)_^1_%STA- BANK,I_^1_%LDQ- EWES,I_^1*_]_^1_%EIF_]_^1*_]_^1_%INQ 2_,BANK SELECT_^1_%LDA- BANK,I_^1_%RTJ WRITE_^1_%SPC 1_^1** LOAD THE FIRST WORD ADRESS_^1_%INQ -1_+FIRST WORD ADRESS_^1_%LDA* LSBADR_'GET PHYSICAL LSB_^1_%RTJ WRITE_^1_%SPC 1_^1** LOAD BLOCK LENGTH_^1_%LDA- BUFSIZ,I_$TAKE BUFFER LENGTH_^1_%LDQ- EWES,I_^1_%INQ 6_,BLOCK LENGTH_^1_%RTJ WRITE_^1_€€%SPC 1_^1** LOAD DISK ADRESS_^1_%INQ 4_,LOAD DISK ADRESS_^1_%LDA- CYLADR,I_$PICK CYLINDER ADRESS_^1_%RTJ WRITE_^1_%SPC 1_^1** SELECT EOP+ALARM INTERUPTS_^1_%INQ -2_+INTERRUPT REQUEST_^1_%ENA $20_*SELECT EOP_^1_%RTJ WRITE_^1_%SPC 1_^1** TRANSFER DATA_^1_%LDA- FDATAF,I_$PICK UP THE TRANSFER FUNCTION_^1_%ADD- SECTAD,I_$ADD THE SECTOR NUMBER, DISK AND SURFACE_^1*_]_^1_%IFA MOTC€€ON,EQ,1_^1*_]_^1_%LDQ- DIAGLU,I_$CHECK IF DIAGNOSTIC LU_^1_%TCQ Q_^1_%ADQ- ELU,I_^1_%SQN N27_*IF NOT DIAGNOSTIC CONTINUE AS USUAL_^1_%LDQ- COMCHC,I_$CHECK FOR COMPARE OR CHECKWORD CHECK REQ_^1_%SQM N25_*IF COMPARE_^1_%QLS 15_^1_%SQM N26_+IF CHECKWORD CHECK_^1_%JMP N27_*REGULAR DATA TRANSFER_^1N25_"INA 2_,COMPARE FUNCTION_^1_%JMP N27_*PERFORM_^1N26_"INA 3_,CHECKWORD CHECK FU€€NCTION_^1*_]_^1_%EIF_]_^1*_]_^1N27_"LDQ- EWES,I_^1_%RTJ WRITE_^1_%SPC 1_^1** SET "DATFLG" TO THE P.D.T. ADRESS OF THE UNIT WHO TRANSFERS THE DATA_^1_%LDQ- I_^1_%STQ DATFLG_^1_%SPC 1_^1** COMPUTE FINAL CONTROLLER ADRESS STATUS_^1_%RTJ FINAL_^1_%SPC 1_^1** EXIT TO DISPATCHER_^1_%JMP* (NEXT)_^1*_]_^1*** PROCESS EOP FOR DATA TRANSFER_^1*_]_^1N40_"CLR A_^1_%STA DATFLG_^1_%SPC 1€€_^1** CHECK ALL CONTROLLER ADRESS STATUS AGAINST THE EXPECTED VALUES_^1_%RTJ CHKADR_^1_%SPC 1_^1*_]_^1_%IFA MOTCON,EQ,1_^1_%LDQ- DIAGLU,I_$CHECK IF DIAGNOSTIC LU_^1_%TCQ Q_^1_%ADQ- ELU,I_^1_%SQN N45_*IF NOT DIAGNOSTIC CONTINUE AS USUAL_^1_%LDQ- COMCHC,I_^1_%SQP N41_*IF NOT SPECIAL COMPARE_^1_%JMP* N50_*IF SPECIAL COMPARE_^1N41_"QLS 15_^1_%SQP N45_*IF NOT CHECKWORD CHECK_^1_€€%JMP* N50_*IF CHECKWORD CHECK_^1*_]_^1_%EIF_]_^1** CHECK FOR THE COMPARE FLAG IN P.D.T._^1N45_"LDA- FCONN,I_^1*_]_^1_%SAM N50_*NO, BY-PASS COMPARE_^1_%LDA- FDATAF,I_$PICK UP LAST DATA TRANSFER FUNCTION_^1_%AND- ZROBIT+7_$IGNORE T TRACK OFFSET BIT_,08/06/77_^1_%INA -$A_*CHECK FOR WRITE COMPLETION_^1_%SAN N50_*SKIP IF LAST OPERATION WAS NOT WRITE_^1_%LDA- SVFLAD,I_$PICK UP ORIGINA€€L FILE ADDRESS_^1_%STA- FILEAD,I_$RESTORE_^1_%LDA- SAVFWD,I_$PICK UP ORIGINAL FWD_^1_%STA- ECCOR,I_%RESTORE_^1_%SPC 1_^1**COMPARE DATA WRITTEN ON ON DISK AT A TIME_^1_%LDQ- EXTRA,I_^1_%JMP COMPR_(COMPARE DATA_^1_%SPC 1_^1** CHECK IF REQUEST COMPLETED_^1N50_"LDA- ELSTWD,I_$PICK UP LWA+1 OF REQUEST_^1_%LDQ- ECCOR,I_%PICK UP LWA+1 OF REQUEST_^1_%RTJ COMPV4_'GET DIFFERENCE_^1_%SAZ €€ N70_*SKIP IF REQUEST COMPLETED_^1_%SPC 1_^1** CONTINUE TRANSFER TO DISK 1_^1_%LDA- FDATAF,I_$CHECK IF LAST XFER WAS A COMPARE_^1_%AND- ZROBIT+7_$IGNORE T TRACK OFFSET BIT_,08/06/77_^1_%INA -$B_^1_%SAN N60_*SKIP IF NOT COMPARE_^1_%SPC 1_^1** WRITE ON DISK 1 WHICH WILL BE COMPARED AFTERWARDS_^1_%LDQ- EXTRA,I_^1_%JMP WRITOP_^1_%SPC 1_^1**CONTINUE THE TRANSFER ACCORDING TO THE F€€UNCTION IN"FDATAF"_^1N60_"JMP CONT_^1_%SPC 1_^1** GO TO SPECIFIED ENTRY IN "BEGIN"_^1N70_"LDQ- EXTRA,I_^1_%RAO NEXT_^1_%JMP (NEXT)_^1*_]_^1LSBADR NUM 0_,LSB OF PHYSICAL ADDRESS_^1_%SPC 3_^1*_]_^1*** COUNT TO TEN TIMES; WITH TWO EXITS IF FINISHED - THREE LOCATIONS_^1*** AFTER CALL, IF NOT - ONE LOCATION AFTER CALL_^1*_]_^1COUNT NUM 0_^1_%RAO* COUNT1_^1_%LDA* COUNT1_^1_%INA €€-10_^1_%SAM 1_^1_%JMP* (COUNT)_%EXIT ONE LOCATION AFTER CALL_^1_%LDQ* COUNT_^1_%JMP- 2,Q_*EXIT THREE LOCATIONS AFTER CALL_^1COUNT1 NUM 0_^1_%EJT_]_^1_%IFA MOTCON,EQ,1_^1*_]_^1_%EJT_]_^1****_]_^1*E_]_^1*_$SPC 2_^1*S2_]_^1*_$*************************_^1*_$* M O T I O N_!ROUTINE *_^1*_$*************************_^1*_]_^1*_8FUNCTION_^1*_8--------_^1*_$SPC 2_^1*S2_]_^1*_]_^1*_#THE MO€€TION SUBROUTINE CONTROLS EXECUTION OF MOTION REQUESTS_^1*S2_]_^1_%SPC 2_^1*_8GENERAL DESCRIPTION_^1*_8-------------------_^1*S2_]_^1_%SPC 2_^1*_#THERE ARE EIGHT MOTION REQUESTS THAT ARE HANDLED BY THE_^1*_#MOTION SUBROUTINE:_^1*_$. UNIT SELECT_^1*_$. SEEK TO DEVICE_^1*_$. RTZS_^1*_$. SENSE VERIFY_^1*_$. CHECK CONSECUTIVE SECTORS_^1*_$. COMPARE MOTION_^1*_$. CHECKWORD CHECK MOTION€€_^1*_$. WRITE ADDRESSES_^1*_]_^1*_#ACCORDING TO THE TYPE OF THE MOTION,THIS SUBROUTINE_^1*_#EXECUTES THE REQUESTS, USING THE FLOW OF READ/WRITE REQUESTS_^1*_]_^1*S2_]_^1_%SPC 2_^1*_8INPUT REQUIREMENTS_^1*_8-------------------_^1*S2_]_^1_%SPC 2_^1*_#(I) REGISTER=P.D.T ADDRESS_^1*_]_^1*_8OUTPUT_^1*_8------_^1*S2_]_^1_%SPC 2_^1*_]_^1*_#1. SET DATFLG=I (P.D.T ADDRESS) IF DATA TRANSF€€ER_^1*_'OR SET IT TO ZERO WHEN DATA TRANSFER COMPLETED._^1*_#2. SET WANT IN BIT IN ESTAT1 IF DRIVER IS BUSY._^1*_]_^1*S2_]_^1_%SPC 2_^1*_8ENTRY/EXIT_^1*_8------------_^1*S2_]_^1_%SPC 2_^1*_]_^1*_#1. MOTION ENTRY - ENTERED BY JUMP FROM THE KERNEL_^1*_#2. MOT02 ENTRY - ENTERED BY JUMP FROM BEGIN SUBROUTINE_^1*_#3. MOT03 ENTRY - ENTERED BY JUMP FROM NEXT SUBROUTINE_^1*_#4. CHKPRI E€€NTRY - ENTERED BY RETURN JUMP FROM NEXT SUBROUTINE_^1*_#5. FINAL ENTRY - ENTERED BY RETURN JUMP FROM NEXT SUBROUTINE_^1*_#6. CHKADR ENTRY - ENTERED BY RETURN JUMP FROM NEXT SUBROUTINE_^1*_#7. EXIT - IF DRIVER IS BUSY EXITS TO DISPATCHER_^1*_#8. EXIT - TO PERFORM UNIT SELECT (SEEKOP IN THE INITIATOR)_^1*_#9. EXIT - WITH NO MOTION OPERATION OR DIAGNOSTIC LOGICAL UNIT_^1*_.TO DONE IN€€ THE INITIATOR_^1*_"10. EXIT - TO PERFORM SEEK OR WRITE ADDRESS TAGS TO SEK100 IN_^1*_.THE INITIATOR_^1*_"11. EXIT - SEK125 IN THE INITIATOR TO WAIT FOR NEW SEEK COMPLET_^1*_"12. EXIT - TO CALLER WHEN UNIT WITH THE HIGHEST PRIORITY IS FAUND_^1*_.OR WHEN FINAL CONTROLLER ADDRESS STATUS IS CALCULATED._^1*S2_]_^1_%SPC 2_^1*_8FLOW_^1*_8----_^1*S2_]_^1_%SPC 2_^1* MOTION_]_^1*_#1. IF €€NOT DIAGNOSTIC LOGICAL UNIT EXIT TO DONE IN THE INITIATOR_^1*_#2. SAVE REQUEST CODE IN FDATAF IN P.D.T_^1*_#3. SAVE SECTOR+SURFACE+DISK IN CYLADR OF P.D.T_^1*_#4. PERFORM BUS CONNECT_^1*_#5. IF DRIVER IS BUSY SET WANT-IN BIT IN ESTAT1 AND EXIT TO DISPATC_^1*_#6. CLEAR CONTROLLER AND EXIT TO SEEKOP IN THE INITIATOR_^1*_'TO PERFORM UNIT SELECT._^1*_#7. PICK UP MOTION CODE AND JUMP TO€€ THE APROPRIAT SUBROUTINE:_^1*_'(TO DONE IN THE INITIATOR IF NOTHING TO BE DONE)_^1* MOTSEK_]_^1*_#8. GO TO SEK100 IN THE INITIATOR TO INITIATE SEEK TO DEVICE._^1* MOT02_]_^1*_#9. WAIT FOR INTERRUPT (WAIT SUBROUTINE)_^1*_"10. VERIFYS THE INTERRUPT (VERIFY SUBROUTINE)._^1*_"11. IF SEEK WAS NOT COMPLETED RETURNS TO MOT02 (9)_^1*_"12. GOES TO NEXT SUBROUTINE TO CHOOSE THE UNIT WITH €€THE HIGHEST_^1*_'PRIORITY._^1* MOT03 -END OF SEEK OPERATION_^1*_#13. IF RTZS MOTION JUMP TO F05 IN FAULT._^1*_#14. IF MOTION IS NOT WRITE ADDRESS JUMP TO DONE IN INITIATOR._^1*_#15. WRITE ADDRESS TAGS AND RETURN JUMP TO WAIT._^1*_"16. VERIFY THE INTERRUPT_^1*_"17. REESTABLISH P.D.T ADDRESS,CLEAR DATA TRANSFER FLAG (DATFLG)_^1*_'AND EXIT TO DONE IN THE INITIATOR_^1* MOTRTZ_]_^1*_"€€18. PERFORM RTZS FUNCTION_^1*_"19. GO TO SED125 IN THE INITIATOR TO WAIT FOR SEEK COMPLETE_^1* MOTSNS_]_^1*_"20. PERFORM SENSE DIRECTOR FUNCTION_^1*_"21. WAIT FOR EOP INTERRUPT, VERIFY THE INTERRUPT_^1*_'REESTABLISH P.D.T ADDRESS_^1*_#22. IF NOT SENSE CONSECUTIVE MOTION JUMP TO 24._^1*_#23. PERFORM STEPS 20-21 58 TIMES AND FILL A BUFFER_^1*_(WITH SECTOR NUMBERS._^1*_#24. CLEAR DA€€TFLG._^1*_#25. EXIT TO DONE._^1*_]_^1****_]_^1*E_]_^1_%EJT_]_^1MOTION BSS MOTION(0)_^1*_'THIS ROUTINE HANDLE MOTION REQUESTS._^1*_'MOTION REQUESTS ARE PROCESSED ONLY_^1*_'IF ORIGINATED BY DIAGNOSTICS,OTHERWISE IGNORED_^1*_'WITHOUT ERROR._^1*_'THE MOTIONS ARE: 0 - DO NOTHING (ONLY UNIT-SELECT)_^1*_81 - SEEK TO DEVICE_^1*_82 - WRITE ADDRESS_^1*_83_"RTZS_^1*_84_"SENS-V€€ERIFY_^1*_]_^1_%LDA- DIAGLU,I_$CHECK IF DIAGNOSTIC LU._^1_%EOR- ELU,I_^1_%SAZ 2_,IF DIAGNOSTIC - CONTINUE_^1_%JMP DONE_)IF NOT EXIT (NO ERROR, NO MOTION)_^1_%LDQ- EPTR,I_'PICK UP REQUEST PARAMETER LOCATION_^1_%LDA 4,Q_*PICK UP LAST WORD OF REQUEST_^1_%AND- ZROBIT+15_^1_%CLR Q_^1_%LLS 4_,Q <= CODE OF MOTION_^1_%STQ FDATAF,I_$FDATAF <= Q_^1_%STA CYLADR,I_$CYLADR <=SECTOR+S€€URFACE+DISK_^1*_]_^1*_'BUS CONNECT_^1*_]_^1_%RTJ BUSCON_^1*_]_^1*_'UNIT SELECT_^1*_]_^1_%LDA DATFLG_'CHECK IF DRIVER IS BUSY_^1_%SAZ M30_*SKIP IF NOT BUSY_^1*_]_^1_%LDA- ESTAT1,I_$IF BUSY_^1_%AND- ZROBIT+11_#SET "WANT-IN" BIT_^1_%EOR- ONEBIT+11_%IN THIS UNIT PHYSICAL DEVICE_^1_%STA- ESTAT1,I_'TABLE_^1_%DISP_0AND EXIT TO DISPATCHER_^1*_]_^1** SEEK OPERATION IS PERFORMED ONLY IF T€€HE DRIVER IS NOT BUSY_^1** IN DATA TRANSFER._^1*_]_^1M30_"LDQ- EWES,I_'PREPARE_^1_%INQ 15_+FOR_^1_%RTJ WRITE_(CLEAR CONTROLLER_^1*_]_^1_%JMP SEEKOP_'GO AND PERFORM UNIT SELECT_^1MOT01 LDA- FDATAF,I_$PICK UP MOTION CODE_^1_%TRA Q_^1_%INA -6_^1_%SAP MOTTAB_^1_%QLS 1_^1_%JMP MOTTAB,Q_^1MOTTAB JMP DONE_)DO NOTHING MOTION_^1_%JMP MOTSEK_'SEEK MOTION_^1_%JMP MOTSEK_'WRITE €€ADDRESS TAG MOTION_^1_%JMP MOTRTZ_'RTZS MOTION_^1_%JMP MOTSNS_(SENSE MOTION_^1_%JMP MOTSNS_'CHECK CONSECUTIVE ADDRESSES_^1*_]_^1MOTSEK JMP SEK100_'INITIATE SEEK TO DEVICE_^1MOT02 RTJ WAIT_^1_%RTJ VERIFY_^1_%NOP_]_^1_%JMP* MOT02_(IF SEEK WAS NOT COMPLETED_^1_%RTJ NEXT_)CHOOSE THE UNIT WITH THE HIGHEST PRIORITY_^1MOT03 LDA- RTZS,I_'CHECK IF IT IS RTZS MOTION_+05/05/77_^€€1_%SAZ MOT035_'AFTER SEEK ERROR_505/05/77_^1_(JMP F05_L19.5.77_^1MOT035 LDQ- FDATAF,I_$IF IT IS NOT, CHECK MOTION CODE_%05/05/77_^1_%INQ -2_+IF WRITE ADDRESS MOTIN_/05/05/77_^1_%SQZ MOT04_(CONTINUE,_<05/05/77_^1_%JMP DONE_)ELSE- MOTION IS DONE_105/05/77_^1*_]_^1*_8PREPARATIONS FOR WRITE ADDRESS_^1MOT04 LDQ- EWES,I_^1_%INQ 8_,INTERRUPT REQUEST_^1_%ENA $20_*EOP_^1_%RTJ WRITE€€_^1_%LDQ- I_^1_%STQ DATFLG_'DATFLG CONTAINS THE ADDRESS OF THE P.D.T_^1_%LDA- CYLADR,I_$CYLADR CONTAINS THE TRACK NUMBER_^1_%CLR Q_,INTERCHANGE_!BETWEEN THE BIT_^1_%LLS 1_,OF THE SURFACE AND THE BIT_^1_%ARS 15_+OF THE DISK._^1_%QLS 15_^1_%LLS 15_^1*_8INTERCHANGE IS COMPLETE_^1_%LDQ- EWES,I_'PREPARE FOR WRITE ADDRESS_^1_%INA 13_+A CONTAINS THE WRITE ADDRESS COMMAND_^1_%RT€€J WRITE_^1_%RTJ WAIT_^1_%RTJ VERIFY_^1_%NOP_]_^1_%NOP_]_^1_%STA- I_+REESTABLISH PDT ADDRESS_^1_%CLR A_^1_%STA DATFLG_'CLEAR DATA TRANSFER FLAG_^1_%JMP DONE_^1*_]_^1MOTRTZ LDQ- EWES,I_^1_%INQ 8_,EOP_^1_%ENA $20_*INTERRUPT_^1_%RTJ WRITE_(REQUEST_^1*_]_^1_%LDQ- EWES,I_^1_%ENA $20_*RTZS FUNCTION_^1_%RTJ WRITE_^1_%JMP SEK125_'WAIT FOR SEEK COMPLETE AND EXIT_^1*_]_^1MOTSNS L€€DQ- I_^1_%STQ DATFLG_'DATFLG CONTAINS THE ADDRESS OF THE P.D.T_^1_%LDQ- EWES,I_^1_%INQ 10_+LOAD DISK ADDRESS_^1_%LDA- CYLADR,I_$A CONTAINS THE CYLINDER_^1_%AND M1FF0_^1_%RTJ WRITE_(IN THE REQUEST MOTION._^1_%LDQ- EWES,I_^1_%INQ 8_,INTERRUPT REQUEST_^1_%ENA $20_*EOP_^1_%RTJ WRITE_^1_%LDA- CYLADR,I_^1_%CLR Q_^1_%LLS 1_,INTERCHANGE BETWEEN THE BIT_^1_%ARS 15_+OF THE DIS€€K AND THE BIT OF_^1_%QLS 15_+THE SURFACE_^1_%LLS 15_+INTERCHANGE IS COMPLETE_^1_%INA 14_+SENSE DIRECTOR FUNCTION_^1_%LDQ- EWES,I_^1_%RTJ WRITE_(SENSE-VERIFY_^1_%RTJ WAIT_^1_%RTJ VERIFY_^1_%NOP_]_^1_%NOP_]_^1_%STA- I_,REESTABLISH P.D.T ADDRESS_^1_%LDQ- EWES,I_^1_%INQ 3_,DEFINE NUMBER OF FILE REGISTER_^1_%ENA 12_+12-13 TO BE READ_^1_%RTJ WRITE_^1_%RTJ READ_)READ C€€ONTENTS OF FILE 12+13_^1_%STA- STAT12,I_$STORE_!TRUE SECTOR_^1_%CLR A_^1_%STA DATFLG_'CLR DATA TRANSFER FLAG_^1_%LDA* TEMP2_(CHECK IF FIRST TIME_227/04/77_^1_%SAN MOT06_(IN THIS LOOP_927/04/77_^1_%LDA- FDATAF,I_$LOAD TYPE OF MOTION_^1_%INA -5_^1_%SAP MOT06_(IF TYPE = 5,GO TO CHECK SECTOR NUMBERS_^1_%JMP DONE_)ELSE- EXIT_^1MOT06 LDQ* TEMP2_(LOAD POINTER TO CURRENT WORD €€IN BUFFER_^1_%LDA- STAT12,I_$LOAD CURRENT SECTOR NUMBER_^1_%STA- BUFF,B_'STORE IN 96 BUFFER OF P.D.T_^1_%INQ -58_P27/04/77_^1_%SQP MOT07_(IF 29 SECTORS ALREADY READ- EXIT_^1_%RAO TEMP2_(ELSE,UPDATE COUNTER_^1_%JMP MOTSNS_'CONTINUE TO NEXT SECTOR_^1MOT07 CLR A_,AND_^1_%STA TEMP2_(TEMP2_^1_%JMP DONE_)EXIT TO DONE_^1TEMP2 NUM 0_^1_%EJT_]_^1_%EIF_]_^1*_]_^1*_$****************€€***************************_^1*_$* PICK THE UNIT WITH THE HIGHEST PRIORITY *_^1*_$*******************************************_^1*_]_^1SEKMSK NUM 0_,MASK FOR SEEK COMPLETE STATUS_^1DATFLG NUM 0_,DATA TRANSFER FLAG_^1PRINUM NUM 0_,CURRENT HIGHEST PRIORITY NO._^1PRIADR NUM 0_,ADDRESS OF HIGH PRIORITY UNIT PHYSTB_^1SEKDON NUM 0_,SEEK COMPLETE STATUS_^1UNIT0 NUM 0_^1_%SPC 3_^1CH€€KPRI NUM 0_^1_%ENA -1_^1_%STA* PRINUM_'CURRENT HIGHEST PRIORITY NO._^1_%LDA* UNIT0_^1_%LDQ* SEKDON_'SEEK COMPLETED BITS TO Q-REG_^1*_]_^1*_*FIND A UNIT THAT HAS COMPLETED SEEKING_^1*_]_^1SEEK_!LRS 1_,SEEK COMPLETE BIT TO A REG._^1_%STQ* SEKDON_'SAVE SEEKS COMPLETED_^1_%SAP SEEK4_(SKIP IF THIS UNIT NOT DONE SEEKING_^1_%JMP* SEEK5_(DONE - CHECK PRIORITY OF THIS UNIT_^1SEEK4 LDQ-€€ OTHER,I_%ADDRESS OF NEXT PHYSTB_^1_%TRQ A_^1_%SUB* UNIT0_(ADDRESS OF UNIT 0 PHYSTB_^1_%SAN SEEK9_(SKIP IF NOT END OF THREAD_^1_%JMP* SEEK6_(PROCESS INTERRUPT ON HIGHEST PRIORITY UNIT_^1SEEK9 STQ- I_^1_%LDQ* SEKDON_'RESTORE Q REGISTER_^1_%JMP* SEEK_)CHECK NEXT UNIT_^1*_]_^1*_*SEE IF THIS UNITS PRIORITY IS HIGHER THAN LAST_^1*_]_^1SEEK5 LDA* PRINUM_'PICK UP HIGHEST PRIORITY SO F€€AR_^1_%SUB- PRILVL,I_$SUBTRACT THIS UNIT'S PRIORITY_^1_%SAM SEEK7_(SKIP IF THIS UNIT'S PRIORITY HIGHER_^1_%JMP* SEEK4_(GO BACK TO CHECK REST_^1SEEK7 LDA- PRILVL,I_$PRIORITY LEVEL FOR THIS UNIT_^1_%STA* PRINUM_'SAVE IT AS CURRENT HIGHEST PRIORITY_^1_%LDA- I_,PHYSTB ADDRESS_^1_%STA* PRIADR_'ADDRESS OF CURRENT HIGHEST PRIORITY PHYSTB_^1_%JMP* SEEK4_(CHECK IF DONE_^1*_]_^1*_$PROCESS €€SEEK INTERRUPT ON HIGHEST PRIORITY UNIT_^1*_]_^1SEEK6 LDQ* PRIADR_'ADDRESS OF HIGHEST PRIORITY PHYSTB_^1_%STQ- I_^1_%LDA- SEKBIT,I_$CLEAR THIS UNIT'S BIT_^1_%TCA A_4IN_^1_%AND* SEKMSK_'SEEK COMPLETED MASK_^1_%STA* SEKMSK_^1_%JMP* (CHKPRI)_^1_%EJT_]_^1*_]_^1*_$******************************************_^1*_$* COMPUTE FINAL CONTROLLER ADRESS STATUS *_^1*_$**************************€€****************_^1*_]_^1FINAL NUM 0_^1_%LDA- BUFSIZ,I_$PICK UP LENGTH OF TRANSFER_^1_%INA -1_+DECREASE SECTOR NUMBER_^1_%CLR Q_^1_%DVI =N96_)COMPUTE NUMBER OF SECTORS TO BE ADDED_^1_%ADD- FILEAD,I_^1_#STA- FILEAD,I_$FINAL SOFTWARE SECTOR_^1_%RTJ SECFIL_'COMPUTE HARDWARE ADRESS_^1_%RAO- FILEAD,I_$NEXT SOFTWARE SECTOR_^1_%LDA- BUFSIZ,I_$UPDATE CURRENT WORD ADDRESS_^1_%ADD- ECC€€OR,I_^1_%STA- ECCOR,I_^1_%JMP* (FINAL)_^1_%EJT_]_^1*_]_^1*_$**************************************************************_^1*_$* CHECK ALL CONTRPLLER ADRESS STATUS AGAINST EXPECTED VALUES *_^1*_$**************************************************************_^1*_]_^1CHKADR NUM 0_^1_%RTJ ADRESS_'TAKE ALL STATUS CONCERNING THE ADRESS_^1_%LDA- BANK,I_'CHECK CURRENT BANK_^1_%EOR- STA€€T3,I_^1_%SAZ CKAD10_'SKIP IF THE SAME_^1_%ENA CWAERR_'37 - CWA ERROR CODE_^1_%JMP* CKAD50_^1CKAD10 LDQ- COMCHC,I_$CHECK BIT 1 IN THIS WORD_^1_%QLS 15_+IF NOT CHECKWORD MOTION_^1_%SQP CKAD11_'CHECK CURRENT WORD ADDRESS_^1_%JMP* CKAD20_'ELSE,IGNORE CHECKING_^1CKAD11 LDA- ECCOR,I_%PICK UP EXPECTED LWA+1_^1_%INA -1_+FORM LWA_^1_%STA- ECCOR,I_%SAVE_^1_%RTJ CDDCPA_'OBTAIN THE PHYSI€€CAL ADDRESS_^1_%RAO- ECCOR,I_%RESTORE ECCOR_^1_%INA 0_,IF FFFF MAKE IT 0_^1_%SAZ CKAD12_'IF 0 THEN DONE_^1_%INA 1_,FORM PHYSICAL LWA+1_^1CKAD12 EOR- STAT2,I_^1_%SAZ CKAD20_'SKIP IF THE SAME_^1_%ENA CWAERR_(37 - CWA ERROR CODE_^1_%JMP* CKAD50_^1CKAD20 LDA- CYLADR,I_$CHECK THE TRUE CYLINDER_^1_%EOR- STAT14,I_^1_%SAZ CKAD30_'SKIP IF THE SAME_^1_%ENA ADRERR_'49 - DRIVE ADRESS ERR€€OR_^1_%JMP* CKAD50_M08/06/77_^1CKAD30 LDA- SECTAD,I_$CHECK THE TRUE SECTOR_^1_%EOR- STAT12,I_^1_%SAZ CKAD40_(SKIP IF THE SAME_^1_%ENA ADRERR_'49 - DRIVE ADRESS ERROR_^1_%JMP* CKAD50_^1CKAD40 JMP* (CHKADR)_^1CKAD50 JMP FAULT_^1_%EJT_]_^1****_]_^1*E_]_^1_%EJT_]_^1**********************************************************************_^1*_]_^1*_$E R R O R_!R O U T I N E_^1*_]_^1*****€€*****************************************************************_^1_%SPC 2_^1*_8FUNCTION_^1*_8--------_^1*S2_]_^1_%SPC 2_^1*_#THE ALARM ROUTINE IS EXECUTED WHEN AN ALARM OCCURS OR AN_^1*_#ERROR IS DETECTED DURING I/O OPERATION.IT MAKES A RETRY_^1*_#IF IT FAILS THE ERROR IS LOGED. NO ERROR LOGING IS PERFORMED_^1*_#WHEN DIAGNOSTIC LOGICAL UNIT._^1*_]_^1*S2_]_^1_%SPC 2_^1*_8GENERA€€L DESCRIPTION_^1*_8--------------------_^1*S2_]_^1_%SPC 2_^1*_#THE ERROR ROUTINR HAS TWO TABLES._^1*_*BITTAB - TABLE OF ALARM STATUS_^1*_*ERRTAB - TABLE OF ERROR CODES AND NUMBER OF RETRIES_^1*_#THE ERROR CODE IS FOUND AND A RETRY IS DONE IF RETRIES COUNT_^1*_#IS NOT ZERO. LOGGING OF ERROR IS PERFORMED IF NOT DIAGNOSTIC_^1*_#LOGICAL UNIT._^1*_]_^1*_#THEIS ROUTINE PERFORMS INDEPEND€€ENT I/O AND DOESN'T CALL_^1*_#READ/WRITE SUBROUTINES. THE REASON IS THAT IN CASE OF_^1*_#INTERNAL REJECT AND EXTERNAL REJECT THERE WILL BE AN_^1*_#ENDLESS LOOP USING THE READ/WRITE SUBROUTINES._^1*S2_]_^1_%SPC 2_^1*_8INPUT REQUIREMENTS_^1*_8------------------_^1*S2_]_^1_%SPC_!2_^1*_#ALARM_^1*_'(I) REGISTER= P.D.T ADDRESS_^1*_]_^1*_#FAULT_^1*_'(I) REGISTER= P.D.T ADDRESS_^1*_'(A) R€€EGISTER= FAULT CODE_^1*_]_^1*S2_]_^1_%SPC 2_^1*_8OUTPUT_^1*_8------_^1*S2_]_^1_%SPC 2_^1*_]_^1*_$1. SAVE ALARM STATUS IN P.D.T_^1*_$2. SAVE DYNAMIC STATUS IN P.D.T_^1*_$3. CLEAR THIS UNIT BIT IN THE CONTINUATOR_^1*S2_]_^1_%SPC 2_^1*_8ENTRY/ EXIT_^1*_8-----------_^1*S2_]_^1_%SPC 2_^1*_$1. ALARM ENTRY - ENTERED BY JUMP FROM VERIFY, NEXT WHEN ALARM_^1*_$2. FAULT ENTRY - ENTERED BY€€ JUMP FROM INITIATOR,KERNEL,NEXT_^1*_6MOTION,ALARM WHEN ERROR CODE IS FOUND AND GOING_^1*_6TO LOG IT._^1*_]_^1*_$3. EXIT-TO RETRY IN BEGIN WHEN RECOVERY_^1*_$4. EXIT-TO DONE IN THE INITIATOR_^1*_$5. EXIT TO MAKE RTZS IN CASE OF DEV. SEEK ERROR._^1*S2_]_^1_%SPC 2_^1*_8FLOW_^1*_8----_^1*S2_]_^1_%SPC 2_^1*_]_^1*_#ALARM_^1*_$1. LOAD FILE ADDRESS_^1*_$2. STORE ALARM STATUS IN P.D.T_^1€€*_$3. IF ALARM STATUS = 0 JUMP TO FAULT WITH ERROR CODE=2._^1*_$4. FIND THE ERROR AND THE CORRESPONDING ERROR CODE_^1*_#FAULT_^1*_$5. SAVE DYNAMIC STATUS._^1*_$6. DO RTZS (RECOVERY) IF DEVICE SEEK ERROR_^1*_$7. IF DIAGNOSTIC LU NO RECOVERY IS PERFORMED GO TO F100_^1*_$8. RETRY - IF NO MORE CHANCE FOR RETRY GO TO F40(10)._^1*_$8.2IF A WRITE REQUEST GO TO 9._^1*_$8.4IF NO OF RETRIES €€IN THE TABLE < FF GOTO 9._^1*_$8.6SET TRACK OFFSET BIT IN THE FUNCTION._^1*_$9. JUMP TO CONT TO RETRY REQUEST._^1*_#10. LOG THE ERROR - RETRY DIDN'T SUCCED_^1*_#11. CLEAR THIS UNIT BIT IN SEKMSK_^1*_#12. EXIT TO DONE IN THE INITIATOR_^1****_]_^1*E_]_^1_%EJT_]_^1ALARM LDQ- EWES,I_^1_%INQ 3_,LOAD FILE ADDRESS_^1_%ENA 6_,FILE "6+7"_^1_%OUT REJECT-*_^1_%INP REJECT-*_^1_%AND =N$3€€FBF_%MASK FOR ALL ERRORS_^1_%STA- ALRMST,I_^1_%ENQ 9_^1_%SAZ ALM30_(IF NO ALARM STATUS - HANDLE AS ALARM ERROR_^1_%CLR Q_^1ALM10 LDA- ALRMST,I_$BEGIN THE LOOP TO FIND ERROR_^1_%AND* BITTAB,Q_^1_%SAN ALM30_(SKIP IF THIS ERROR_^1_%INQ 1_^1_%JMP* ALM10_(SEARCH FOR NEXT ERROR_^1ALM30 LDA* ERRTAB,Q_$TAKE THE ERROR CODE_^1_%ARS 8_^1_%AND- LPMSK+8_%GET ERROR CODE ONLY_^1_%JMP* F€€AULT_^1REJECT JMP* F05_^1_%JMP* F05_^1_%SPC 3_^1**** TABLE OF ALARM STATUSES:_^1BITTAB NUM $0200_)ERROR CODE 16.CONTROL SEEK ER._^1_%NUM $0002_)ERROR CODE 19 DMA PROTECT FAULT_^1_%NUM $0010_)ERROR CODE 20 CHECKWORD CHECK_^1_%NUM $0008_(ERROR CODE 1 LOST DATA_^1_%NUM $0004_(ERROR CODE 3 DMA PARITY ERROR_^1_%NUM $0020_(ERROR CODE 7 COMPARE ERROR_^1_%NUM $0001_(ERROR CODE 36€€ DMA ADDRESS ERROR_^1_%NUM $0800_(ERROR CODE 2 WRONG SECTOR FORMA3_^1_%NUM $0100_(ERROR CODE 18 END OF MEDIUM_^1_%NUM $1000_(ERROR CODE 2 WRONG DEVICE TRANSFER_^1_%NUM $2000_(ERROR CODE 84 BUS RELINQUISHED_^1_%NUM $0400_(ERROR CODE 50 MISSING INDEX SECTOR PULSE_^1****_]_^1_%SPC 3_^1** TABLE OF ERROR CODES AND NUMBER OF RETRIES 8 M.S.B. ARE THE ERROR_^1** CODE, , L.S.B. ARE €€NUMBER OF RETRIES_^1ERRTAB NUM $1010_N09/06/77_^1_%NUM $1310_N09/06/77_^1_%NUM $1410_N09/06/77_^1_%NUM $01FF_N09/06/77_^1_%NUM $0310_N09/06/77_^1_%NUM $0710_N09/06/77_^1_%NUM $5810_N09/06/77_^1_%NUM $02FF_N09/06/77_^1_%NUM $1210_N09/06/77_^1_%NUM $02FF_N09/06/77_^1_%NUM $5410_N09/06/77_^1_%NUM $3210_N09/06/77_^1_%NUM $0010_(TIMEOUT ERROR_809/06/77_^1_%NUM $0510_(INTER€€NAL REJECT_609/06/77_^1_%NUM $0610_(EXTERNAL REJECT_609/06/77_^1_%NUM $0D10_(DISK WRITE PROTECTED_109/06/77_^1_%NUM $0E10_(NOT READY_<09/06/77_^1_%NUM $1110_(DEV SEEK ERROR_709/06/77_^1_%NUM $5510_(CWA ERROR_<09/06/77_^1_%NUM $3110_(DRIVER ADDRESS ERROR_109/06/77_^1_%SPC 3_^1FAULT EOR- NZERO+15_$TURN BIT 15 ON_^1_%LDQ- ELU,I_^1_%QLS 8_,ERROR CODE IS BUILT FROM_^1_%EAQ €€ A_,ELU AND FLTCOD_^1_%STA- FLTCOD,I_$STORE FAULT CODE_^1_%LDQ- EWES,I_^1_%INQ 15_+TAKE DYNAMIC STATUS_^1_%INP REJECT-*_^1_%STA- STIMEO,I_$STORE DYNAMIC STATUS IN P.D.T._^1_%RTJ CONV_^1_%STA- ESTAT2,I_^1_%OUT REJECT-*_^1_%LDA- FLTCOD,I_^1_%AND =N$00FF_^1_%INA -17_*IF DEVICE SEEK ERROR_^1_%SAZ RTZ_*EXECUTE RTZS_^1_%JMP F05_*ELSE CONTINUE_806/06/77_^1RTZ_$LDA- RTZS,I_G19.5€€.77_^1_%SAZ F02_M29/05/77_^1_(JMP* F05_J19.5.77_^1*_[19.5.77_^1F02_$ENA 1_M19.5.77_^1_(STA- RTZS,I_G19.5.77_^1_%LDA- DIAGLU,I_$CHECK IF DIAGNOSTICS_105/05/77_^1_%EOR- ELU,I_(IF IT IS,_<05/05/77_^1_%SAN F03_*JUMP TO STORE PDT BEFORE RTZS_(05/05/77_^1 SPC 2_]_^1** STORE STATUSES AGAIN FOR DIAGNOSTICS_805/05/77_^1** BEFORE AN EXIT TO RTZS SECTION IS MADE_605/05/77_^1**_]_^1 SPC 2€€_]_^1_%ENQ 0_R05/05/77_^1F04_"LDA- (ZERO),B_$LOAD CURRENT WORD OF PDT_,05/05/77_^1_%STA- BUFF,B_'STORE IN CURRENT WORD OF BUFFER_$05/05/77_^1_%TRQ A_R05/05/77_^1_%INQ -60_P05/05/77_^1_%SQP F03_*IF 60 WORDS TRANSFFERED EXIT_)05/05/77_^1_%TRA Q_-ELSE_@05/05/77_^1_%INQ 1_,UPDATE Q_=05/05/77_^1_%JMP* F04_*CONTINUE TRANSFER_405/05/77_^1_%IFA MOTCON,EQ,1_H05/05/77_^1F03_"ENA 14€€_Q05/05/77_^1_%STA- TEMREQ,I_K05/05/77_^1_%JMP MOTRTZ_M05/05/77_^1_%EIF_]_^1_%IFA MOTCON,EQ,0_H05/05/77_^1F03_"LDQ- EWES,I_'EOP_B05/05/77_^1_%INQ 8_,INTERRUPT REQUEST_405/05/77_^1_%ENA $20_P05/05/77_^1_%RTJ WRITE_N05/05/77_^1_%LDQ- EWES,I_M05/05/77_^1_%ENA $20_*RTZS FUNCTION_805/05/77_^1_%RTJ WRITE_N05/05/77_^1_%JMP SEK125_'WAIT FOR RTZS COMPLETE_/05/05/77_^1_%EIF_]_^1F05_$€€CLR A_M19.5.77_^1_(STA- RTZS,I_G19.5.77_^1_(STA DATFLG_H19.5.77_^1_(STA BSCN20_H19.5.77_^1_(LDA- DIAGLU,I_E19.5.77_^1_%EOR- ELU,I_^1_%SAN F10_*SKIP IF NOT DIAGNOSTIC_^1_%JMP* F100_^1F10_"RAO- ERCONT,I_^1_%CLR Q_^1F20_"LDA- FLTCOD,I_^1_%AND- LPMSK+8_%TAKE ERROR CODE ONLY_^1_%ALS 8_^1_%EOR* ERRTAB,Q_^1_%AND- NZERO+8_%($FF00) IGNORE NUMBER OF RETRIES_^1_%SAZ F30_*SKIP IF THIS€€ ERROR_^1_%INQ 1_^1_%JMP* F20_*CONTINUE SEARCH_^1F30_"LDA* ERRTAB,Q_^1_%AND- LPMSK+8_%($FF) NUMBER OF RETRIES FOR THIS ERROR_^1_%SUB- ERCONT,I_^1_%SAP F33_^1_%JMP* F40_^1F33_"LDA- SAVFWD,I_^1_%STA- ECCOR,I_^1_%LDA- SVFLAD,I_^1_%STA- FILEAD,I_^1_%LDA- FUNCT,I_^1_%STA- FDATAF,I_^1_(LDA-_#FDATAF,I_^1_%INA -10_^1_(SAZ_$F35_^1_%LDA* ERRTAB,Q_^1_%AND- LPMSK+8_^1_%SUB =N$00FF_^1_%SAM €€ F35_^1_%LDA- FDATAF,I_^1_%AND- ZROBIT+7_^1_%EOR- ONEBIT+7_^1_%STA- FDATAF,I_^1F35_"JMP CONT_)PERFORM RETRY_808/06/77_^1F40_"LDQ- FLTCOD,I_$LOG ERROR_^1_%RTJ+ LOG_^1F100_!LDA- EREQST,I_$SET BIT 14 IN EREQST_^1_%AND- ZROBIT+14_^1_%EOR- ONEBIT+14_^1_%STA- EREQST,I_^1_%LDA- SEKBIT,I_$CLEAR THIS UNIT BIT IN MSK_^1_%TCA A_^1_%AND SEKMSK_^1_%STA SEKMSK_'COMPLETE_^1_%LDA- FLTCOD,I_^1_€€%AND =N$00FF_^1_%STA- FLTCOD,I_^1_%JMP DONE_^1_%EJT_]_^1*_]_^1*_$*****************************_^1*_$*_!WORD ADRESSING ROUTINE *_^1*_$*****************************_^1*_]_^1UNFRMT RTJ- (ASABS)_%ABSOLUTIZE STARTING ADRESS_^1_%TRA Q_,A = ABS. STARTING ADDRESS_^1_%LDA- 1,Q_*A = MSB OF WORD ADDRESS_^1_%AND- LPMSK+15_$REMOVE CONTROL POINT INDICATOR IF NECESSARY_^1_%LDQ- 2,Q_^1_%LLS 1€€6_+A = LSB - Q = MSB OF WORD ADDRESS_^1_%ALS 1_^1_%LRS 1_,DOUBLE PRECISION WORD ADDRESS_^1_%DVI =N96_)DIVIDE INTO SECTORS AND WORDS_^1_%STA- FILEAD,I_$SAVE STARTING SECTOR NUMBER_^1_%STA- TEMSEC,I_^1_%STQ- WORDNO,I_$SAVE NO. OF WORDS LESS THAN A SECTOR_^1_%LDQ- ESTAT1,I_$PICK UP REQUEST STATUS_^1_%LRS 1_^1_%SAM B100_)SKIP IF WRITE REQUEST_^1_%RTJ CKOVRL_'MOVE PARAMETERS IF OV€€ERLAY REQUEST_^1B100_!LDA- ELSTWD,I_$LWA+1 OF USERS BUFFER_^1_%STA- TEMLWD,I_$SAVE IN TEMP._^1_%LDA- ECCOR,I_%PICK UP FWA OF USERS BUFFER_^1_%STA- TEMFWD,I_$SAVE IN_^1_%LDA- WORDNO,I_$PICK UP WORDS LESS THAN A SECTOR_^1_%SAN B120_)SKIP IF THERE ARE SOME_^1_%LDA- TEMREQ,I_$PICK UP REQUEST CODE_^1_%AND- ONEBIT_'UNPACK REQUEST CODE_^1_%SAN B110_)SKIP IF A READ REQUEST_^1_%JMP* B240_€€)JUMP TO WRITE FULL SECTORS_^1B110_!ENQ 2_,RETURN TO "DONE"_^1_%JMP* B130_)COMPLETE AS FORMAT READ_^1B120_!LDA- ABUFF,I_%PICK UP ADDRESS OF INTERIM BUFFER_^1_%STA- ECCOR,I_%SAVE IN PHYSTB AS FWA_^1_%INA 96_^1_%STA- ELSTWD,I_$SET UP LWA+1_^1_%LDA- FILEAD,I_$PICK UP SECTOR TO BE READ_^1_%STA- BUFSEC,I_$SAVE AS SECTOR IN BUFFER_^1_%ENQ 4_,RETURN TO "B140"_^1B130_!JMP READOP_^1B140€€_!LDQ- TEMLWD,I_^1_%RTJ CDDCPS_'SET CONTROL POINT IF NECESSARY_^1_%LDA- TEMSEC,I_^1_%STA- FILEAD,I_^1_%LDA- TEMREQ,I_^1_%AND- ONEBIT_'UNPACK REQUEST CODE_^1_%SAN B150_)SKIP IF A READ REQUEST_^1_%JMP* B180_)REGULAR WRITE_^1B150_!LDQ- WORDNO,I_$WORDS LESS THAN A SECTOR (0-95)_^1_%INQ -96_^1_%SQP B170_^1_%RAO- WORDNO,I_^1_%LDA- BUFF+96,B_^1_%LDQ- TEMFWD,I_$PICK UP THE ADDRESS OF T€€HE USERS BUFFER_^1_%STA- (ZERO),Q_$STORE THE WORD INTO THE USERS BUFFER_^1_%RAO- TEMFWD,I_$INCREMENT FWA OF USERS BUFFER_^1_%LDA- TEMFWD,I_$CHECK IF DONE WITH ENTIRE JOB_^1_%LDQ- TEMLWD,I_^1_%RTJ COMPV4_'GET DIFFERENCE_^1_%SAM B160_)SKIP IF MORE TO DO_^1_%RTJ CDDACP_'SET ABSOLUTE MODE_^1ASMDAC EQU ASMDAC(*-1)_^1_%JMP DONE_)TRANSFER COMPLETE, EXIT_^1B160_!JMP* B150_^1B170_!RAO-€€ FILEAD,I_^1_%LDA- TEMFWD,I_^1_%STA- ECCOR,I_%UPDATE FWA_^1_%LDA- TEMLWD,I_'AND LWA+1_^1_%STA- ELSTWD,I_^1_%RTJ* (ASMDAC)_$SET ABSOLUTE MODE_^1_%JMP* B110_^1B180_!LDQ- TEMFWD,I_$INDEX TO PICK UP ONE WORD_^1_%LDA- (ZERO),Q_$PICK UP ONE WORD_^1_%LDQ- WORDNO,I_$PICK UP THE WORD COUNT_^1_%INQ -96_^1_%SQP B220_^1_%RAO- WORDNO,I_^1_%STA- BUFF+96,B_^1_%RAO- TEMFWD,I_^1_%LDA- TEMFWD,I_$C€€HECK IF_^1_%LDQ- TEMLWD,I_^1_%RTJ COMPV4_'GET DIFFERENCE_^1_%SAN B210_^1_%RTJ* (ASMDAC)_$SET ABSOLUTE MODE_^1_%ENQ 2_,RETURN TO "DONE"_^1B190_!LDA- ABUFF,I_^1_%STA- ECCOR,I_^1B200_!JMP WRITOP_'WRITE SECTOR BACK ON DISK_^1B210_!JMP* B180_^1B220_!RTJ* (ASMDAC)_$SET ABSOLUTE MODE_^1_%ENQ 6_^1_%JMP* B190_^1B230_!RAO- TEMSEC,I_^1_%LDA- TEMSEC,I_^1_%STA- FILEAD,I_$SET SECTOR TO SECO€€ND OF TRANSFER_^1_%ENA 0_^1_%STA- WORDNO,I_$CLEAR WORD COUNTER_^1B240_!LDQ- TEMFWD,I_$RESTORE FWD_^1_%STQ- ECCOR,I_^1_%INQ 96_+ADD ONE SECTOR_^1_%TRQ A_^1_%STQ* TMP4_^1_%LDQ- TEMLWD,I_^1_%RTJ COMPV4_'GET DIFFERENCE_^1_%SAM B250_*SKIP IF MORE THAN ONE SECTOR_^1_%SAZ B260_^1_%JMP* B120_)UPDATE AND WRITE BACK LAST SECTOR_^1B250_!LDQ* TMP4_^1_%STQ- ELSTWD,I_$RESTORE LWD_^1_%STQ- €€TEMFWD,I_$NEXT FIRST WORD_^1_%RAO- TEMSEC,I_$NEXT SECTOR_^1_%INQ 96_+ADD ONE SECTOR_^1_%TRQ A_^1_%STQ* TMP4_^1_%LDQ- TEMLWD,I_^1_%RTJ COMPV4_'GET DIFFERENCE_^1_%SAP B260_)SKIP IF LAST EVEN SECTOR_^1_%JMP* B250_^1B260_!ENQ 8_,RETURN TO "B280"_^1_%SAN B270_^1_%LDQ* TMP4_^1_%STQ- ELSTWD,I_^1_%ENQ 2_,RETURN TO DONE_^1B270_!JMP* B200_^1B280_!LDA- TEMSEC,I_^1_%STA- FILEAD,I_$RESET€€ SECTOR ADDRESS_^1_%JMP* B120_)CORRECT AND WRITE BACK LAST SECTOR_^1TMP4_!NUM 0_^1_%EJT_]_^1**********************************************************************_^1*_]_^1*_$CHECK FOR AN OVERLAY REQUEST_^1*_]_^1**********************************************************************_^1*_]_^1*_$IF THE REQUEST IS A READ AND THE REQUEST PARAMETERS ARE IN THE_^1*_$READ BUFFER, MOVE THEM€€ TO ECALL. (WORDS 18 THROUGH 21 OF THE_^1*_$PHYSTB)_^1*_]_^1**********************************************************************_^1_%SPC 3_^1CKOVRL 0_"0_^1_%LDA- EPTR,I_'PICK UP ADDRESS OF REQUEST PARAM. LIST_^1_%INA 7_,LENGTH OF PARAMETER LIST_^1_%LDQ- ECCOR,I_^1_%RTJ COMPV4_'COMPARE MAGNITUDES_^1_%SAP CKOV1_(EPTR+7.GE.FWD_^1_%JMP* (CKOVRL)_$NOT OVERLAY REQUEST, RETURN_^1CK€€OV1 LDA- EPTR,I_'PICK UP ADDRESS OF REQUEST PARAM. LIST_^1_%LDQ- ELSTWD,I_^1_%RTJ COMPV4_'COMPARE MAGNITUDES_^1_%SAM CKB_*EPTR.LT.LWD_^1_%JMP* (CKOVRL)_$NOT OVERLAY REQUEST, RETURN_^1CKB_"LDQ- EPTR,I_'PICK FWA OF PARAMETER LIST_^1_%LDA- (ZERO),Q_$PICK UP CONTENTS OF FWA OF PARAM. LIST_^1_%AND- NZERO-8_%($00FF) SAVE PRIORITIES_^1_%ADD =N$5200_%CONVERT TO A SCHEDULER REQUEST_^1_€€%STA- ECALL1,I_$SAVE IN PHYSTB (WORD 18)_^1_%LDA- PLU,Q_(PICK UP THE LOGICAL UNIT FROM THE PARAM. LIS_^1_%STA- ECALL4,I_$SAVE IN PHYSTB (WORD 21)_^1_%RTJ- (ACABS)_%ABSOLUTIZE THE COMPLETION ADDRESS_^1_%STQ- ECALL2,I_$SAVE IN PHYSTB (WORD 19)_^1_%ENA ECALL1_'PICK UP ADDRESS OF OVERLAY CALL_^1_%ADD- I_,ADD IN THE ADDRESS OF THE PHYSTB_^1_%STA- EPTR,I_'SAVE AS THE NEW ADDRESS OF T€ˆHE PARAM. LIST_^1_%JMP* (CKOVRL)_$RETURN TO CALLER_^1*_]_^1CONV_!NUM 0_^1_%STA- DYNMIC,I_K08/06/77_^1_%JMP* (CONV)_^1*_]_^1_%END_]_^__ ˆPD18326 CSY/ D51 P€1_%NAM D18326_'DECK-ID D51 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - DRIVER MODULE (MSOS INTERFACE)_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT DRIVER_^1*_7***********_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE KERNEL DRIVER PROCESSES MSOS/RTOS RE€€QUESTS FOR_^1*_'THE LCTT MAG TAPE._^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_'THE KERNEL DRIVER INTERFACES BETWEEN THE OPERATING_^1*_'SYSTEM AND THE KERNEL FOR THE LCTT MAG TAPE. THE_^1*_'DRIVER FINDS NEXT REQUEST, CALLS THE KERNEL TO_^1*_'PROCESS THE REQUEST, PREPARES THE V-FIELD OF Q,_^1*_'LOGS ERRORS IN ENGINEERING FILE, AND CALLS THE_^1*_'ALTERNATE DEVICE HAND€€LER WHEN ERRORS OCCUR AND THE_^1*_'LOGICAL UNIT IS NON DIAGNOSTIC._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS MAKEQ TO SET V FIELD OF REQUEST_^1*_'2. CALLS LOG TO OUTPUT LU AND FAULT CODE_^1*_'3. CALLS ALTERNATE DEVICE HANDLER TO OUTPUT_^1*_*ERROR MESS€€AGE TO OPERATOR_^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. I18326 - SCHEDULED BY THE REQUEST PROCESSOR_^1*_*Q REGISTER CONTAINS THE ADDRESS OF PDT WITH THE_^1*_*REQUEST_^1*_'2. I20 ENTRY - REQUEST COMPLETION ENTRY WHEN EOF_^1*_*OR END OF TAPE ENCOUNTERED_^1*_'3. NEXUNI ENTRY - PROCESS NEXT UNIT ENTRY AFTER_^1*_*REWIND CHECK_^1*_'4. EXIT - TO DISPATCHER WHEN DRIVER ST€€ILL NEEDED_^1*_*FOR REWIND CHECK ; TO MAS300 TO RELEASE DRIVER_^1*_*WHEN MASS RESIDENT (MSOS)_^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_'1. CHECK IF DRIVER BUSY, IF IT IS EXIT TO DISPATCHER._^1*_*IF NOT BUSY SET DRIVER BUSY, SAVE PDT ADDRESS IN I_^1*_*AND UPDATE ALTDEV SCHEDULER CALL._^1*_'2. IF UNIT REWINDING SKIP IT AND CHECK IF ANY UNIT_^1*_*THAT IS NOT REWINDING WANTS IN._^1*_'3. FIN€€D NEXT REQUEST, IF NONE CHECK IF ANY UNIT WHICH_^1*_*IS NOT REWINDING WANTS IN._^1*_'4. CALL KERNEL TO PROCESS REQUEST. ON RETURN CALL_^1*_*MAKEQ. ON RETURN IF ERROR AND NOT DLU CALL LOG,_^1*_*SCHEDULE ALTDEV AND CHECK IF ANOTHER UNIT WANTS_^1*_*IN._^1*_'5. COMPLETE THE REQUEST AND CHECK IF ANOTHER REQUEST_^1*_*IS WAITING FOR THIS UNIT._^1*_]_^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----€€------_^1*_]_^1*_'FNR - FIND NEXT REQUEST_^1*_'KLCTT - LCTT KERNEL_^1*_'MAKEQ - MAKE V-FIELD OF Q_^1*_'LOG - LOG ERROR IN ENGINEERING FILE_^1*_'ALTDEV - ALTERNATE DEVICE HANDLER_^1*_'COMPRQ - COMPLETE REQUEST_^1*_]_^1*_]_^1*_7PARAMETERS_^1*_]_^1*_7----------_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$I18326_+DRIVER INITIATOR ENTRY_^1_(ENT_$CURPDT_+CURRENT PDT ADDRESS_€€^1_(ENT_$I20,NEXUNI_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT_$C18326_+KERNEL CONTINUATOR ENTRY_^1_(EXT_$E18326_+KERNEL TIMOUT ERROR ENTRY_^1_(EXT*_#KLCTT_,DRIVER KERNEL ENTRY_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT_$MAKEQ_,MAKE V-FIELD_^1_(EXT_$LOG_.LOG ERROR IN ENGINEERING FILE_^1_(EXT_$ALTDEV_+ALTERNATE DEVICE HANDLER_^1_(EXT*_#RWC_.REWIND€€ COUNTER_^1_(EXT_$MAS300_+MASS RESIDENT PROGRAMS HANDLER_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$AFNR($B5)_(FIND NEXT REQUEST ADDRESS_^1_(EQU_$ACMPRQ($B6)_%COMPLETE REQUEST ADDRESS_^1_(EQU_$ADISP($EA)_'DISPATCHER ADDRESS_^1_(EQU_$ZERO($22)_^1_(EQU_$ONEBIT($23)_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(E€€QU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST€€ STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LO€€GICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG€€(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$AL€€RMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1*_]_^1*_7MESSAGES_^1*_7--------_^1*_]_^1*_'ALTERNATE DEVICE HANDLER WILL PRINT FAULT CODE_^1*_'FOR NON-DIAGNOSTIC LOGICAL UNITS._^1*_]_^1*_]_^1*_7MISCELLANEOUS_^1*_7-------------_^1*_]_^1*_'CYBER 18 LCTT - FORMATTER CONTROLLER REGISTER DEFINITIONS_^1*_]_^1*_]_^1*_3*****************€€****_^1*_3* Q REGISTER FORMAT *_^1*_3*********************_^1*_]_^1*_'-------------------------------------------------_^1*_'*15*14*13*12*11*10*09*08*07*06*05*04*03*02*01*00*_^1*_'-------------------------------------------------_^1*_'*<----- W ---->* EQUIPMENT * N.A.*<-- CONTROL ->*_^1*_]_^1*_]_^1*_5*************_^1*_5* Q CONTROL *_^1*_5*************_^1*_]_^1*_(Q4 Q3 Q2 Q1 Q0_$OUT€€PUT_-INPUT_^1*_(-- -- -- -- --_$------_------_^1*_)1 0 0 0 0_$CLEAR CONTROLLER_!DYNAMIC STATUS_^1*_)0 0 0 0 1_$DIRECTOR FUNCTION_^1*_)0 0 0 1 0_$LOAD FWA_*CURRENT WORD_^1*_)0 0 0 1 1_$BANK SELECT_'CURRENT BANK_^1*_)0 0 1 0 0_$LOAD FILE ADDRESS FILE STATUS_^1*_)0 0 1 0 1_$SENSE/ASS NXT RDY TRANSPORT STAT._^1*_)0 0 1 1 0_$UNIT SELECT_^1*_)0 0 1 1 1_$€€LOAD BLOCK LENGTH_^1*_)0 1 0 0 0_$BUS CONNECT_^1*_)0 1 0 0 1_$INTERRUPT REQUEST_^1*_]_^1*_3*********************_^1*_3* DIRECTOR FUNCTION *_^1*_3*********************_^1*_)A REGISTER VALUE_$FUNCTION_^1*_)----------------_$--------_^1*_10_,READ DATA_^1*_11_,ADVANCE RECORD_^1*_12_,SEARCH FILE MARK FORWARD_^1*_13_,SEARCH FILE MARK BACKWARD_^1*_14_,BACKSPACE RECORD_^1*_15_,WRIT€€E DATA_^1*_16_,WRITE FILE MARK_^1*_17_,REWIND_^1*_18_,FIXED ERASE_^1*_19_,VARIABLE ERASE_^1*_0$A_,CONTROLLED BACKSPACE_^1*_0$B_,REWIND OFF-LINE_^1*_/$20_,LOW THRESHOLD READ_^1*_]_^1*_3******************_^1*_3* DYNAMIC STATUS *_^1*_3******************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,UNIT READY_^1*_11_,CONTROLLER BUSY_^1*_12_,INTERRUPT_^1*_13_,ALARM_^1*_€€]_^1*_14_,NOT ASSIGNED_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,END OF TAPE_^1*_]_^1*_18_,END OF OPERATION_^1*_19_,FILE MARK_^1*_010_,NOT ASSIGNED_^1*_011_,CORRECTED ERROR_^1*_]_^1*_012_,ON-BUS_^1*_013_,NOT ASSIGNED_^1*_014_,CONTROLLER PROTECTED_^1*_015_,BUS BUSY_^1*_]_^1*_7**********_^1*_7* ESTAT2 *_^1*_7**********_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*€€_10_,UNIT READY_^1*_11_,CONTROLLER BUSY_^1*_12_,INTERRUPT_^1*_13_,ALARM_^1*_]_^1*_14_,NOT ASSIGNED_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,NOT ASSIGNED_^1*_]_^1*_18_,END OF OPERATION_^1*_19_,END OF TAPE_^1*_010_,NOT ASSIGNED_^1*_011_,FILE MARK_^1*_]_^1*_012_,ON-BUS_^1*_013_,NOT ASSIGNED_^1*_014_,CONTROLLER PROTECTED_^1*_015_,BUS BUSY_^1*_]_^1*_]_^1*_7****************_^1*_€€7* ALARM STATUS *_"(FILES 10,11)_^1*_7****************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,TAPE DATA ERROR_^1*_11_,TAPE DATA ERROR_^1*_12_,TAPE DATA ERROR_^1*_13_,TAPE PARITY ERROR (ONLY PE)_^1*_]_^1*_14_,NO CHARACTER READ IN 25 FEET_^1*_15_,FILL_^1*_16_,FORMATTER REJECT_^1*_17_,BUS RELINQUISHED_^1*_]_^1*_18_,LOST DATA_^1*_19_,MEMORY PROTECT FAULT_^1*_010_€€,MEMORY ADDRESS ERROR_^1*_011_,MEMORY PARITY ERROR_^1*_]_^1*_012_,TRANSMISSION PARITY ERROR_^1*_013_,NOT ASSIGNED_^1*_014_,NOT ASSIGNED_^1*_015_,NOT ASSIGNED_^1*_]_^1_(EJT_^1*_]_^1*_5********************_^1*_5* TRANSPORT STATUS *_^1*_5********************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,NOT ASSIGNED_^1*_11_,NRZI_^1*_12_,SPEED 50 IPS_^1*_13_,TRANSPORT C€€ODE_^1*_]_^1*_14_,TRANSPORT CODE_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,NOT ASSIGNED_^1*_]_^1*_18_,REWINDING_^1*_19_,LOAD POINT_^1*_010_,WRITE PROTECTED_^1*_011_,NOT ASSIGNED_^1*_]_^1*_012_,NOT ASSIGNED_^1*_013_,NOT ASSIGNED_^1*_014_,DESELECT_^1*_015_,OFF-LINE_^1*_]_^1*_]_^1*_0BITS_!4 3_"TRANSPORT_^1*_0-----------_"---------_^1*_70 0_"7 TRACK NRZI_^1*_70 1_"9 TRACK DU€€AL MODE_^1*_71 0_"9 TRACK NRZI_^1*_71 1_"9 TRACK PHASE ENCODING_^1*_]_^1_(EJT_^1****_]_^1*_]_^1*_]_^1* ENTRY FROM MASDRV/DBLDRV_^1* ABSOLUTIZE PROGRAM RELOCATABLE ADDRESSES_^1*_]_^1DLCTT_"STQ-_#I_0SAVE PHYSTB ADDRESS_^1_(STQ-_#0_0SAVE STARTING PDT_^1STRPDT_!NUM_$0_0STARTING PDT ADDRESS_^1_(STA-_#0_0SAVE DLCTT ADDRESS_^1LOCN_#NUM_$0_0DLCTT ADDRESS_^1OTHERS_!LDA*_#LOCN_-TRANSFER DR€€IVER LOCATION TO Q_^1_(TRA_$Q_^1_(INQ_$I18326-DLCTT_$UPDATE INITIATOR ENTRY IN PDT_^1_(STQ-_#1,I_^1_(LDQ_$=XC18326_)UPDATE CONTINUATOR ADDRESS IN PDT_^1_(AAQ_$Q_^1_(STQ-_#2,I_^1_(LDQ_$=XE18326_)UPDATE HANGUP ENTRY ADDRESS IN PDT_^1_(AAQ_$Q_^1_(STQ-_#3,I_^1_(LDA-_#ELINK,I_*GET NEXT PDT ADDRESS_^1_(TRA_$Q_^1_(SUB*_#STRPDT_+IS STARTING PDT_^1_(SAZ_$I18326_+SKIP IF STARTING PDT_^1_(STQ€€-_#I_0UPDATE OTHER PDT'S_^1_(JMP*_#OTHERS_^1_(EJT_^1*_]_^1*_4*********_^1*_4* DLCTT *_^1*_4*********_^1*_]_^1* ENTERED BY REQUEST PROCESSOR_^1*_]_^1* FUNCTION:_^1*_'FIND NEXT REQUEST AND CALL KERNEL, UPON RETURN IF ERROR_^1*_'AND NOT DLU, LOG IT AND CALL ALTDEV. IF NO ERROR COMPLETE_^1*_'THE REQUEST._^1*_'IF MULTI PDT SEARCH ALL TABLES FOR REQUESTS BEFORE GIVING_^1*_'UP CONTROL TO €€DISPATCHER._^1*_]_^1I18326_!LDA-_#0_0IS DRIVER BUSY_^1CURPDT_!NUM_$0_0CURRENT PDT ADDRESS_^1_(SAZ_$1_0SKIP IF DRIVER NOT BUSY_^1_(JMP-_#(ADISP)_*EXIT IF REQUEST IN PROGRESS_^1_(STQ-_#I_0PDT ADDRESS TO I_^1_(STQ*_#CURPDT_+UPDATE CURRENT PDT_^1_(LDA-_#(ZERO),Q_)UPDATE ALTDEV SCHEDULER CALL_^1_(STA*_#SADEV+1_^1CKRWND_!LDA-_#ESTAT1,I_)CHECK IF REWIND IN PROGRESS_^1_(AND-_#ONEBIT+6_^1_(€€SAN_$1_0SKIP IF UNIT REWINDING_^1I10_$RTJ-_#(AFNR)_+FIND NEXT REQUEST_^1_(JMP*_#NEXUNI_+PROCESS NEXT UNIT_^1_(LDQ-_#I_0UPDATE CURRENT PDT ADDRESS_^1_(STQ*_#CURPDT_^1_(RTJ_$KLCTT_,PROCEED WITH PRESENT REQUEST_^1_(RTJ_$MAKEQ_,MAKE V-FIELD OF ESTAT1_^1_(LDA-_#ESTAT1,I_)CHECK FOR ERROR_^1_(SAP_$I20_.SKIP IF NO ERROR_^1_(LDA-_#ELU,I_,IS DIAGNOSTIC LOGICAL UNIT_^1_(EOR-_#DIAGLU,I_^1_(SAZ€€_$I20_.SKIP IF DLU_^1_(LDA-_#ELU,I_,MAKE ERROR WORD_^1_(ALS_$8_^1_(ADD-_#FLTCOD,I_^1_(EOR-_#ONEBIT+15_^1_(TRA_$Q_^1_(RTJ_$LOG_.LOG THE ERROR_^1SADEV_"SCHDLE_!ALTDEV,0,,1_%SCHEDULE ALTDEV_^1_(JMP*_#NEXUNI_+PROCESS NEXT UNIT_^1I20_$RTJ-_#(ACMPRQ)_)COMPLETE THE REQUEST_^1_(JMP*_#I10_.GET NEXT REQUEST_^1*_]_^1NEXUNI_!LDA-_#ELINK,I_*GET NEXT PDT ADDRESS_^1_(STA-_#I_0NEXT PDT ADDRESS TO €€I_^1_(EOR*_#CURPDT_+IS IT STARTING PDT_^1_(SAZ_$EXIT_-SKIP IF STARTING PDT_^1_(LDA-_#EREQST,I_)WAS ALTDEV SCHEDULED_^1_(ALS_$1_^1_(SAP_$1_0SKIP IF ALTDEV NOT SCHEDULED_^1_(JMP*_#NEXUNI_+PROCESS NEXT UNIT_^1_(JMP*_#CKRWND_+CHECK IF REWIND IN PROGRESS_^1EXIT_#STA*_#CURPDT_+CLEAR DRIVER BUSY WORD_^1_(LDA_$RWC_.IS REWIND IN PROGRESS_^1_(SAN_$DISP_-SKIP IF ANY UNIT REWINDING_^1_(ENQ_$$F€x_/CLEARE CONTROLLER_^1_(RTJ_$QLCTT_^1_(JMP_$MAS300_+RELEASE DRIVER_^1DISP_#JMP-_#(ADISP)_*EXIT TO DISPATCHER_^1_(END_^__xPK18326 CSY/ D52 P€1_%NAM K18326_'DECK-ID D52 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - KERNEL MODULE_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT KERNEL_^1*_7***********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_'€€PERFORMS THE I/O BY CALLING ANCILLARY ROUTINES._^1*_'IT ALSO HANDLES DIAGNOSTIC TIMEOUT AND PROCESSES_^1*_'ERRORS._^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7--------------------_^1*_]_^1*_'THE KERNEL PROVIDES THE SKELETON FOR ANCILLARY_^1*_'ROUTINES CALLS FOR I/O PROCESSING._^1*_'IN ADDITION IT PROVIDES STATUS SUBROUTINES,THE_^1*_'FUNCTION(OUT) SUBROUTINE AND HANDLING OF TIMEOUT_^1*_'ERR€€OR._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'KLCTT_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'E18326_^1*_*(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'FLCTT_^1*_*(A) REGISTER = FAULT CODE_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'SLCTT_^1*_*(Q) REGISTER = VALUE CORRESPONDING TO REQUESTED_^1*_9STA€€TUS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'QLCTT_^1*_*(A) REGISTER = VALUE APPROPRIATE FOR THIS FUNCTION_^1*_*(Q) REGISTER = VALUE CORRESPONDING TO REQUESTED_^1*_9FUNCTION_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'STATUU_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1_(EJT_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS ANCIL€€LARY ROUTINES BLCTT,WLCTT,VLCTT,NLCTT_^1*_*AND LLCTT DURING I/O PROCESSING._^1*_'2. UPDATES TIMEOUT STATUS WORD IN PDT WHEN TIMEOUT._^1*_'3. RETURNS TO CALLER OF SLCTT WITH REQUESTED STATUS_^1*_*IN (A) REGISTER._^1*_'4. UPDATES ESTAT2 WORD OF PDT AND RETURNS IT IN (A)_^1*_*REGISTER TO CALLER OF STATUU._^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. KLCTT ENTRY - ENTERED BY RET€€URN JUMP FROM DRIVER._^1*_'2. E18326 ENTRY - ENTERED WHEN DIAGNOSTIC CLOCK_^1*_8BECOMES NEGATIVE._^1*_'3. FLCTT ENTRY - ENTERED WHEN ERROR LOGGING IS_^1*_8NEEDED._^1*_'4. SLCTT ENTRY - ENTERED WHEN A STATUS IS REQUIRED._^1*_'5. QLCTT ENTRY - ENTERED BY RETURN JUMP WHEN CONTROL_^1*_8FUNCTION IS SENT TO CONTROLLER._^1*_'6. STATUU ENTRY - ENTERED WHEN DYNAMIC STATUS IS_^1*_9REQUIRED._€€^1*_'7. EXIT - TO DRIVER (CALLING ROUTINE) WHEN FAULT OR_^1*_1ON NORMAL COMPLETION OF REQUEST._^1*_'8. EXIT - TO DISPATCHER WHEN TIMEOUT FOR REWINDING_^1*_1UNIT._^1*_'9. EXIT - TO CALLER WHEN STATUS OR FUNCTION ARE_^1*_1REQUIRED._^1*_]_^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'KLCTT_^1*_*1. CALL BLCTT ANCILLARY ROUTINE._^1*_*2. ON RETURN CALL WLCTT ANCILLARY ROUTINE._^1*_*3. ON RE€€TURN CALL VLCTT ANCILLARY ROUTINE._^1*_*4. ON RETURN CALL NLCTT ANCILLARY ROUTINE._^1*_*5. ON RETURN EXIT TO DRIVER IF REQUEST COMPLETED,_^1*_-OTHERWISE CALL WLCTT AGAIN(2.)._^1*_]_^1*_'E18326_^1*_*1. GET AND SAVE DYNAMIC STATUS IN STIMEO._^1*_*2. IF UNIT REWINDING EXIT TO DISPATCHER.ELSE CALL_^1*_-LLCTT TO LOG TIMEOUT ERROR._^1*_]_^1*_'FLCTT_^1*_*1. CALL LLCTT TO LOG ERROR._^1*_*2€€. ON RETURN EXIT TO DRIVER TO COMPLETE REQUEST._^1*_]_^1*_]_^1*_'SLCTT_^1*_*1. SAVE (Q) REGISTER OF INP IN OUTQRG. SET OUTARG._^1*_*2. PERFORM INP INSTRUCTION._^1*_*3. IF REPLY RETURN TO CALLER. IF INTERNAL REJECT_^1*_-LOG THE ERROR. IF EXTERNAL REJECT THE FIRST TIME_^1*_-TRY ONCE MORE. OTHERWISE LOG THE ERROR._^1*_]_^1*_'QLCTT_^1*_*1. SAVE (Q) AND (A) REGISTERS OF OUT IN OUTQRG AN€€D_^1*_-OUTARG._^1*_*2. PERFORM OUT INSTRUCTION_^1*_*3. IF REPLY RETURN TO CALLER. IF INTERNAL REJECT_^1*_-LOG THE ERROR. IF EXTERNAL REJECT TRY ONCE MORE._^1*_-IF EXTERNAL REJECT SECOND TIME, GET DYNAMIC_^1*_-STATUS AND CHECK IF BUS RELINQUISHED. IF OFF-BUS_^1*_-LOG THE ERROR WITE CODE 21. OTHERWISE LOG THE_^1*_-ERROR WITH CODE 6._^1*_]_^1*_'STATUU_^1*_*1. CALL SLCTT TO GET DYNAMIC€€ STATUS._^1*_*2. MOVE EOF AND EOT BITS 2 BITS TO THE LEFT._^1*_*3. SAVE MODIFIED STATUS IN ESTAT2 AND RETURN TO_^1*_-CALLER WITH MODIFIED STATUS IN (A) REGISTER._^1*_]_^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'E18326 - CONNECT BUS AND SELECT UNIT._^1*_'WLCTT - SET DIAGNOSTIC CLOCK AND RETURN_^1*_/WHEN INTERRUPT._^1*_'VLCTT - GET STATUS AND VERIFY THE INTERRUPT._^1*_'€€NLCTT - PERFORM I/O._^1*_'LLCTT - SAVE FAULT CODE AND SET HARDWARE FAILURE_^1*_/BIT OF EREQST._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$KLCTT_^1_(ENT_$E18326_+KERNEL TIMEOUT ERROR RETRY_^1_(ENT_$FLCTT_,KERNEL FAULT ENTRY_^1_(ENT_$SLCTT_,KERNEL STATUS ENTRY_^1_(ENT_$QLCTT_,KERNEL FUNCTION ENTRY_^1_(ENT_$STATUU_+KERNEL DYNAMIC STATUS ENTRY_^1*_]_^1_(EJT_^1*_7EXT€€ERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#BLCTT_,KERNEL BEGIN ANCILLARY ROUTINE_^1_(EXT*_#WLCTT_,KERNEL WAIT ANCILLARY ROUTINE_^1_(EXT*_#VLCTT_,KERNEL VERIFY ANCILLARY ROUTINE_^1_(EXT*_#NLCTT_,KERNEL NEXT ANCILLARY ROUTINE_^1_(EXT*_#LLCTT_,KERNEL LOG ANCILLARY ROUTINE_^1_(EXT*_#CURPDT_+CURRENT PDT ADDRESS_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*€€_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$ONEBIT($23)_^1_(EQU_$ZROBIT($33)_^1_(EQU_$ADISP($EA)_'DISPATCHER ADDRESS_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQ€€U_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(€€EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STAT€€US AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RF€€LAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1****_]_^1*_]_^1*_]_^1*_7*********_^1*_7* KLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REG€€ISTER_^1*_]_^1KLCTT_"NUM_$0_^1_(RTJ_$BLCTT_,BEGIN I/O_^1KCONT_"RTJ_$WLCTT_,WAIT FOR INTERRUPT_^1_(RTJ_$VLCTT_,VERIFY THE INTERRUPT_^1_(RTJ_$NLCTT_,DO NEXT I/O_^1_(SAZ_$1_0SKIP IF REQUEST COMPLETE_^1_(JMP*_#KCONT_,CONTINUE I/O_^1_(JMP*_#(KLCTT)_*COMPLETE THE REQUEST_^1*_]_^1*_]_^1* DIAGNOSTIC TIMEOUT_^1* ENTERED WITH PDT ADDRESS IN (Q) REGISTER_^1*_]_^1*_]_^1E18326_!STQ-_#I_0PDT ADD€€RESS TO I_^1_(RTJ*_#STATUU_+GET DYNAMIC STATUS_^1_(STA-_#STIMEO,I_)SAVE STATUS AT TIMEOUT_^1_(LDA-_#I_0IS DRIVER BUSY_^1_(EOR_$CURPDT_^1_(SAZ_$1_0SKIP IF DRIVER BUSY_^1_(JMP-_#(ADISP)_*UNIT REWINDING,EXIT TO DISPATCHER_^1*_]_^1*_]_^1* ERROR_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND FAULT CODE_^1* IN (A) REGISTER_^1*_]_^1*_]_^1FLCTT_"RTJ_$LLCTT_,LOG THE ERROR_^1_(JMP*_#(KLC€€TT)_*COMPLETE THE REQUEST_^1*_]_^1_(EJT_^1*_]_^1* STATUS_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND APPROPRIATE_^1* VALUE IN (Q) REGISTER_^1*_]_^1*_]_^1SLCTT_"NUM_$0_^1_(ADQ-_#EWES,I_^1_(ENA_$-0_^1INPUT_"INP_$SREJ-*_^1_(CLR_$Q_^1_(STQ*_#RCOUNT_^1_(JMP*_#(SLCTT)_^1SREJ_#JMP*_#INTREJ_^1_(LDA*_#RCOUNT_^1_(SAN_$EXTERN_^1_(RAO*_#RCOUNT_^1_(JMP*_#INPUT_^1EXTERN_!CLR_$A_^1_(STA*_#€€RCOUNT_^1_(JMP*_#EXTREJ_^1*_]_^1*_]_^1* FUNCTION_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND APPROPRIATE_^1* VALUES IN (A) AND (Q) REGISTERS_^1*_]_^1*_]_^1QLCTT_"NUM_$0_^1_(ADQ-_#EWES,I_^1_(STA-_#OUTARG,I_)SAVE A REGISTER_^1_(STQ-_#OUTQRG,I_)SAVE Q REGISTER_^1OUTPUT_!OUT_$QREJ-*_^1_(CLR_$Q_^1_(STQ*_#RCOUNT_^1_(JMP*_#(QLCTT)_^1QREJ_#JMP*_#INTREJ_^1_(LDA*_#RCOUNT_^1_(SAN_$SECO€€ND_+SKIP IF SECOND TIME_^1_(RAO*_#RCOUNT_^1_(LDA-_#OUTARG,I_^1_(JMP*_#OUTPUT_^1SECOND_!RTJ*_#STATUU_^1_(AND-_#ONEBIT+12_(IS ON-BUS_^1_(SAZ_$1_0SKIP IF OFF-BUS_^1EXTREJ_!ENA_$-78_.EXTERNAL REJECT_^1_(INA_$84_/BUS RELEINQUISHED ERROR CODE=21_^1_(JMP*_#FLCTT_^1INTREJ_!ENA_$5_^1_(JMP*_#FLCTT_^1RCOUNT_!NUM_$0_^1*_]_^1* MODIFIED DYNAMIC STATUS_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER€_^1*_]_^1*_]_^1STATUU_!NUM_$0_^1_(ENQ_$$F_/SAVE DYNAMIC STATUS_^1_(RTJ*_#SLCTT_^1_(STA-_#ESTAT2,I_^1_(AND_$=N$280_+GET EOF AND EOT BITS_^1_(ALS_$2_^1_(TRA_$Q_^1_(LDA-_#ESTAT2,I_^1_(AND_$=N$F57F_^1_(AAQ_$A_^1_(STA-_#ESTAT2,I_)EOF AND EOT BITS SHIFTED_^1_(JMP*_#(STATUU)_^1_(END_^__PB18326 CSY/ D53 P€1_%NAM B18326_'DECK-ID D53 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - CONNECT BUS AND UNIT SELECT_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT BEGIN_^1*_7**********_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT BEGIN ASSURES BUS CONNECT AND UNIT S€€ELECT_^1*_'BEFORE REQUEST PROCESSING IS CONTINUED._^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE BEGINS PROCESSING THE REQUEST BY_^1*_'INITIALIZING SOME WORDS IN THE APPROPRIATE PDT AND_^1*_'IN THE DRIVER. THEN IT CHECKS IF BUS CONNECTED. IF_^1*_'OFF-BUS A BUS CONNECT IS PERFORMED FOLLOWED BY EXIT_^1*_'TO CALLER. IF ON-BUS OR AFTER BUS CONNECT HAS €€BEEN_^1*_'ESTABLISHED, UNIT SELECT IS PERFORMED AND EXIT IS_^1*_'MADE TO CALLER._^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'UNTSEL_^1*_*(A) REGISTER = (ONEBIT+7)_^1*_]_^1*_'SELECT_^1*_*(A) REGISTER = APPROPRIATE UNIT SELECT CODE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SE€€TS SENTRY,SINTER AND STIMEO WORDS IN PDT._^1*_'2. CLEARS RTRECV WORD IN PDT AND DELTA,ERSCNT AND_^1*_*EOT WORDS IN DRIVER._^1*_'3. CALLS KERNEL QLCTT AND STATUU SUBROUTINES._^1*_'4. UPDATES SENTRY WORD IN PDT WITH CURRENT STATUS._^1*_'5. UPDATES ESTAT1 AND UNTMOD WORDS IN PDT ACCORDING_^1*_*TO NEEDS._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_'1. BLCTT ENTRY - ENTERED BY RETUR€€N JUMP FROM KERNEL._^1*_'2. CONBUS ENTRY - ENTERED FROM RWLCTT FOR REWIND_^1*_9CHECK._^1*_'3. UNTSEL ENTRY - ENTERED FROM VLCTT TO PROVIDE UNIT_^1*_:SELECT._^1*_'4. SELMOD ENTRY - ENTERED FROM RLCTT TO SELECT UNIT_^1*_9WITH ORIGINALLY REQUESTED MODE._^1*_'5. SELECT ENTRY - ENTERED FROM RLCTT TO SELECT UNIT_^1*_9WITH REVERSED MODE._^1*_'6. EXIT - TO KERNEL (CALLING ROUTINE) AFTER_^1€€*_1PERFORMING A FUNCTION._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'BLCTT_^1*_*1. SET SENTRY,SINTER AND STIMEO WORDS IN PDT._^1*_*2. CLEAR RTRECV WORD IN PDT AND DELTA,ERSCNT_^1*_-AND EOT WORDS IN DRIVER._^1*_*3. CALL QLCTT TO REQUEST EOP INTERRUPT._^1*_*4. ON RETURN CALL STATUU AND SAVE MODIFIED_^1*_-DYNAMIC STATUS IN SENTRY WORD IN PDT._^1*_*5. CHECK BUS. IF ON-BUS JUMP TO UNTSE€€L. IF_^1*_-OFF-BUS SET BUS CONNECT BIT OF ESTAT1 (BIT 7)._^1*_*6. ENTER BUS CONNECT VALUE TO (Q) REGISTER._^1*_*7. CALL QLCTT TO PERFORM FUNCTION._^1*_*8. ON RETURN EXIT TO CALLER WITH TIMEOUT PERIOD_^1*_-IN (A) REGISTER._^1*_]_^1*_'UNTSEL_^1*_*1. SET UNIT SELECT BIT OF ESTAT1 (BIT 8)_^1*_]_^1*_'SELMOD_^1*_*2. UPDATE MODE BIT IN UNTMOD IN PDT ACCORDING TO_^1*_-REQUEST._^1*_]_^1*_'S€€ELECT_^1*_*3. ENTER UNIT SELECT VALUE TO (Q) REGISTER AND_^1*_-JUMP TO BLCTT 7._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'QLCTT - KERNEL FUNCTION SUBROUTINE_^1*_'STATUU - KERNEL MODIFIED DYNAMIC STATUS SUBROUTINE._^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$BLCTT_^1_(ENT_$CONBUS_+BUS CONNECT ENTRY_^1_(ENT_$UNTSEL_+UNIT SELECT ENTRY_^1_(ENT_$SELMOD_+MODE€€ SELECT ENTRY_^1_(ENT_$SELECT_+UNIT SELECT FUNCTION ENTRY_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#STATUU_+KERNEL DYNAMIC STATUS SUBROUTINE_^1_(EXT*_#DELTA,ERSCNT,EOT_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$ONEBIT($23)_^1*_]_^1*_]_^1***_$PHYSICAL D€€EVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIREC€€TOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_€€(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETU€€RN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFF€€ER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1*_]_^1*_]_^1*_]_^1****_]_^1*_7*********_^1*_7* BLCTT *_^1*_7*********_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1BLCTT_"NUM_$0_^1_(ENA_$-0_^1_(STA-_#SENTRY,I_^1_(STA-_#SINTER,I_^1_(STA-_#STIMEO,I_^1_(ENA_$0_0INITIALIZE NECE€€SSARY WORDS_^1_(STA-_#RTRECV,I_^1_(STA_$DELTA_^1_(STA_$ERSCNT_^1_(STA_$EOT_^1CONBUS_!ENA_$$30_.REQUEST EOP+ALARM INTERRUPT_^1_(ENQ_$8_^1_(RTJ_$QLCTT_^1_(RTJ_$STATUU_+SAVE DYNAMIC STATUS_^1_(STA-_#SENTRY,I_^1_(AND-_#ONEBIT+12_(IS BUS CONNECTED_^1_(SAZ_$2_0SKIP IF OFF BUS_^1_(CLR_$A_0SELECT UNIT_^1_(JMP*_#UNTSEL_^1_(LDA-_#ESTAT1,I_)SET BUS CONNECT BIT (BIT 7 OF ESTAT1_^1_(ADD-_#ONEBI€€T+7_^1_(STA-_#ESTAT1,I_^1_(LDA-_#ONEBIT+7_)CONNECT BUS_^1_(ENQ_$7_^1OUTPUT_!RTJ_$QLCTT_^1_(ENA_$1_^1_(JMP*_#(BLCTT)_*RETURN TO KERNEL_^1*_]_^1*_]_^1* UNIT SELECT_^1*_]_^1UNTSEL_!EOR-_#ESTAT1,I_)CLEAR BUS CONNECT BIT_^1_(ADD-_#ONEBIT+8_)SET UNIT SELECT BIT (BIT 8 OF ESTAT1_^1_(STA-_#ESTAT1,I_^1* MODE UPDATE_^1SELMOD_!LDA-_#ESTAT1,I_)CHECK REQUEST MODE_^1_(AND-_#ONEBIT+3_^1_(SAZ_$1_0€€SKIP IF BINARY_^1_(LDA-_#ONEBIT+13_(SET ASCII MODE_^1_(ADD-_#UNTMOD,I_)SELECT UNIT_^1SELECT_!ENQ_$5_^1_(JMP*_#OUTPUT_^1_(END_^__€PT18326 CSY/ D54 P€1_%NAM T18326_'DECK-ID D54 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - SET UP DIAGNOSTIC CLOCK_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT WAIT_^1*_7*********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT WAIT SETS UP THE DIAGNOSTIC CLOCK AN€€D_^1*_'RETURNS CONTROL TO CALLER WHEN INTERRUPT._^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE ENTERS THE APPROPRIATE TIMEOUT PERIOD_^1*_'IN DIAGNOSTIC CLOCK AND PROVIDES THE CONTINUATOR_^1*_'ENTRY OF THE DRIVER._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'WLCTT_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_*(A€€) REGISTER = TIMEOUT PERIOD_^1*_'C18326_^1*_*(Q) REGISTER = ADDRESS OF UNIT 0 PDT_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SETS UP EDCLK WORD IN PDT._^1*_'2. RETURNS TO CALLER WITH UNIT 0 PDT ADDRESS_^1*_*IN (I) REGISTER._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_]_^1*_'1. WLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. C18326 ENTRY - ENTERED WHEN INT€€ERRUPT._^1*_'3. EXIT - TO DISPATCHER WHEN WAITING FOR EOP._^1*_'4. EXIT - TO KERNEL (CALLING ROUTINE) WHEN INTERRUPT._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'WLCTT_^1*_*1. SET UP DIAGNOSTIC CLOCK._^1*_*2. EXIT TO DISPATCHER._^1*_]_^1*_'C18326_^1*_*1. SAVE UNIT 0 PDT ADDRESS IN (I) REGISTER._^1*_*2. RETURN TO CALLER._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$€€WLCTT_^1_(ENT_$C18326_+KERNEL CONTINUATOR ENTRY_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$ADISP($EA)_'DISPATCHER ADDRESS_^1*_]_^1_(EJT_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$ED€€PGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_€€^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE€€_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(2€€9)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1_(EJT_^1****_]_^1*_7*********_^1*_7* WLCT€€T *_^1*_7*********_^1*_]_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND TIMEOUT_^1* PERIOD IN (A) REGISTER._^1*_]_^1*_]_^1WLCTT_"NUM_$0_^1_(STA-_#EDCLK,I_*SET UP DIAGNOSTIC CLOCK_^1_(JMP-_#(ADISP)_*EXIT TO DISPATCHER_^1*_]_^1*_]_^1* CONTINUATOR ENTRY_^1* ENTERED WITH UNIT 0 PDT ADDRESS IN (Q) REGISTER._^1*_]_^1*_]_^1C18326_!STQ-_#I_0FIRST UNIT PDT ADDRESS TO I_^€.1_(JMP*_#(WLCTT)_*RETURN TO KERNEL_^1_(END_^__.PV18326 CSY/ D55 P€1_%NAM V18326_'DECK-ID D55 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - VERIFY INTERRUPT_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT VERIFY_^1*_7***********_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT VERIFY CHECKS THE INTERRUPT FOR GHOST_^1*_'IN€€TERRUPT BEFORE PROCESSING IT._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE VERIFIES THAT A REQUEST IS BEING_^1*_'PROCESSED WHEN AN INTERRUPT HAS OCCURED. IF NO_^1*_'REQUEST THE INTERRUPT IS A GHOST INTERRUPT AND_^1*_'AN EXIT IS MADE TO DISPATCHER. IF THERE IS A_^1*_'REQUEST PRESENT THE INTERRUPT IS CHECKED TO BE_^1*_'ELECTRONICALLY VALID. IF€€ VALID IT IS DETERMINED_^1*_'WHETHER THE OPERATION WAS A BUS CONNECT. IF IT_^1*_'WAS BUS CONNECT AN EXIT IS MADE TO SELECT UNIT,_^1*_'OTHERWISE CONTROL RETURNS TO CALLER._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'(I) REGISTER = ADDRESS OF UNIT 0 PDT_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS KERNEL QLCTT AND STATUU SUBROUTINES._^1*_'2. UPDA€€TES SINTER WORD OF PDT WHEN NOT GHOST_^1*_*INTERRUPT._^1*_'3. INCREMENTS GHOSTI WORD OF PDT WHEN INTERRUPT_^1*_*ELECTRONICALLY NOT VALID._^1*_'4. RESETS DIAGNOSTIC CLOCK IF INTERRUPT VALID._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. VLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. EXIT - TO DISPATCHER WHEN INTERRUPT ILLEGAL._^1*_'3. EXIT - TO UNTSEL (IN BLCT€€T) TO SELECT UNIT._^1*_'4. EXIT - TO KERNEL (CALLING ROUTINE) IF INTERRUPT_^1*_1WAS NOT DUE TO BUS CONNECT._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'VLCTT_^1*_*1. CHECK IF A REQUEST IS BEING PROCESSED._^1*_-EXIT TO DISPATCHER IF NO REQUEST._^1*_*2. SAVE REQUEST PDT ADDRESS IN (I) REGISTER._^1*_-GET MODIFIED DYNAMIC STATUS AND SAVE IT IN_^1*_-SINTER WORD OF PDT._^1*_*3. CHECK IF I€€NTERRUPT ELECTRONICALLY VALID. IF_^1*_-ELECTRONICALLY INVALID INCREMENT GHOSTI WORD_^1*_-OF PDT AND EXIT TO DISPATCHER._^1*_*4. RESET DIAGNOSTIC CLOCK, CLEAR THE INTERRUPT_^1*_-AND REQUEST EOP INTERRUPT._^1*_*5. IF INTERRUPT WAS DUE TO BUS CONNECT GO TO_^1*_-UNTSEL (EXTERNAL). OTHERWISE RETURN TO CALLER._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'QLCTT - KERNEL FUNCTI€€ON SUBROUTINE_^1*_'STATUU - KERNEL MODIFIED DYNAMIC STATUS SUBROUTINE_^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$VLCTT_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#CURPDT_+CURRENT PDT ADDRESS_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#STATUU_+KERNEL DYNAMIC STATUS SUBROUTINE_^1_(EXT*_#UNTSEL_+UNIT SELECT ENTRY_^1_%EXT €€ CGHOST_'GHOST INTERRUPT HANDLER- ODS ROUTINE_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$ONEBIT($23)_^1_(EQU_$ZROBIT($33)_^1_(EQU_$ADISP($EA)_'DISPATCHER ADDRESS_^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENT€€RY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFF€€ER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTE€€RRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU€€_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(€€NEXT UNIT PDT_^1_(EJT_^1*_]_^1****_]_^1*_7*********_^1*_7* VLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1VLCTT_"NUM_$0_^1_(LDQ_$CURPDT_+IS ANY REQUEST IN PROGRESS_^1_(STQ-_#I_0CURRENT PDT TO I_^1_(SQN_$REQST_,SKIP IF REQUEST IN PROGRESS_^1_(ENQ_$$F_/CLEAR CONTROLLER_^1_(RTJ_$QLCTT_^1_(JMP*_#GHOST_^1REQST_"RTJ_$STATUU_+SAVE DYNAMIC STATUS_^1€€_(STA-_#SINTER,I_^1_(ENA_$-1_/RESET DIAGNOSTIC CLOCK_^1_(STA-_#EDCLK,I_^1_(LDA_$=N$A0_,CLEARE INTERRUPT AND REQUEST EOP INT_^1_(ENQ_$8_^1_(RTJ_$QLCTT_^1_(LDA-_#SINTER,I_^1_(ALS_$7_0WAS EOP INTERRUPT_^1_(SAP_$GHOST_,SKIP IF NOT EOP_^1_(ALS_$6_0WAS INTERRUPT ?_^1_%SAM CLK_*SKIP IF INTERRUPT IS OK_^1GHOST RAO- GHOSTI,I_$ADD 1 TO GHOST COUNT TO EACH PDT_^1_%LDA- ELINK,I_^1_%STA- I_^1€è_'EOR CURPDT_^1_%SAZ GOON_^1_%JMP* GHOST_^1GOON_!RTJ CGHOST_^1_%JMP- (ADISP)_^1CLK_$LDA-_#ESTAT1,I_^1_(AND-_#ONEBIT+7_^1_(SAN_$1_0SKIP IF BUS CONNECTED_^1_(JMP*_#(VLCTT)_*RETURN TO KERNEL_^1_(JMP_$UNTSEL_+SELECT UNIT_^1_(END_^__ èPN18326 CSY/ D56 P€1_%NAM N18326_'DECK-ID D56 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - EXECUTE I/O FUNCTIONS_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT NEXT_^1*_7*********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT NEXT EXECUTES ALL I/O FUNCTIONS, CHECK€€S_^1*_'THEIR FULFILMENT AFTER EXECUTION AND CALLS RECOVERY_^1*_'AND ERROR LOGGING WHEN NEEDED._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'LCTT NEXT IS THE PROGRAM THAT ACTUALLY PERFORMS_^1*_'THE REQUESTS. IT CONSISTS OF THREE MAIN SECTIONS._^1*_]_^1*_'THE FIRST SECTION GAINS CONTROL RIGHT AFTER A_^1*_'UNIT SELECT IS ACCOMPLISHED. IT INITIATES THE_^1*_'€€DSA TRANSFER WHEN READ/FREAD AND WRITE/FWRITE_^1*_'REQUESTS. IT INITIATES TAPE MOTION WHEN MOTION_^1*_'REQUESTS._^1*_]_^1*_'THE SECOND SECTION GAINS CONTROL WHEN OPERATIONS_^1*_'INITIATED BY THE FIRST SECTION COME TO AN END. IT_^1*_'CALLS A SUBROUTINE (THIRD SECTION) TO CHECK ALARM_^1*_'CAUSES WHEN OPERATION TERMINATED ABNORMALLY. IF_^1*_'TRANSFER WAS FAILURE FREE IT PROCEEDS THE R€€EQUEST_^1*_'OR TERMINATES IT ACCORDING TO NEEDS._^1*_]_^1*_'THE THIRD SECTION CHECKS FOR ALARM REASONS AND_^1*_'DECIDES WHETHER TO LOG THE ERRORS OR TO CALL_^1*_'RECOVERY._^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_*ESTAT2 = LAST MODIFIED DYNAMIC STATUS_^1*_]_^1*_'FRSTWD_^1*_*(A) REGISTE€€R = FIRST WORD ADDRESS FOR NEXT DSA_^1*_]_^1*_'FUNCTN_^1*_*(A) REGISTER = APPROPRIATE FUNCTION CODE_^1*_]_^1*_'FILEST_^1*_*(A) REGISTER = FILE ADDRESS_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS KERNEL QLCTT AND SLCTT SUBROUTINES._^1*_'2. CALLS COMPV4 FOR 16 BIT ARITHMETIC._^1*_'3. CALLS MAKEQ TO SET V FIELD IN REQUEST._^1*_'4. INCREMENTS REWINDS COUNTER - RWC._^1*_'5. CALLS €€SEVENT AND SEVNRD TO HANDLE 7 TRACK_^1*_*TAPE REQUESTS._^1*_'6. UPDATES TRANSPORT STATUS WORD - TRNSPT._^1*_'7. UPDATES FOLLOWING BITS OF ESTAT1 :_^1*_,BIT 5 - MOTION REQUEST BIT_^1*_,BIT 6 - UNIT REWINDING BIT_^1*_,BIT 8 - UNIT SELECT BIT_^1*_,BIT 10 - LOW THRESHOLD READ BIT_^1*_'8. SAVES TRANSFER LENGTH OR MOTION PARAMETERS_^1*_*IN QSTWD4 (IN PDT)._^1*_'9. UPDATES UNIT SELECT COD€€E WORD - UNTMOD._^1*_'10. SETS EOT BIT (BIT 9) OF ESTAT2._^1*_'11. SETS EOF BIT (BIT 14) OF EREQST._^1*_'12. UPDATES CURRENT WORD ADDRESS - ECCOR._^1*_'13. ASSIGNS FOLLOWING ERROR CODES :_^1*_-1 - LOST DATA_^1*_-2 - IRRECOVERABLE ERROR_^1*_-3 - PARITY ERROR_^1*_,13 - AN ATTEMPT TO WRITE WITHOUT RING_^1*_,14 - DEVICE NOT READY_^1*_,21 - BUS RELINQUISHED_^1*_,27 - NO CHARACTER READ I€€N 25 FEET_^1*_,31 - SHORT RECORD_^1*_,36 - TRANSMISSION PARITY ERROR_^1*_,51 - ILLEGAL DENSITY SELECT_^1*_,60 - ILLEGAL MOTION CODE_^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. NLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. FRSTWD ENTRY - ENTERED FROM RLCTT (RECOVERY) TO_^1*_9REPEAT LAST I/O._^1*_'3. FUNCTN ENTRY - ENTERED FROM RLCTT (RECOVERY) TO_^1*_9PERFO€€RM FUNCTION._^1*_'4. NEXMOT ENTRY - ENTERED FROM RWLCTT (REWIND CHECK)_^1*_9AFTER REWIND COMPLETION TO PERFORM_^1*_9NEXT MOTION._^1*_'5. TRNSOK ENTRY - ENTERED FROM RLCTT (RECOVERY)_^1*_9WHEN RECOVERY HAS BEEN SUCCESSFUL_^1*_9TO CONTINUE PROCESSING THE REQUEST._^1*_'6. ALARM ENTRY - CALLED BY RLCTT (RECOVERY) WHEN_^1*_8ERROR IN READ._^1*_]_^1*_'7. FILEST ENTRY - CALLED BY RLCTT (RE€€COVERY) TO GET_^1*_9FILE STATUS._^1*_'8. EXIT - TO RWNDCK (IN RWLCTT) TO CHECK REWIND_^1*_1STATUS AFTER UNIT SELECT._^1*_'9. EXIT - TO KERNEL (CALLING ROUTINE) TO WAIT FOR_^1*_1EOP OR TO COMPLETE THE REQUEST._^1*_'10. EXIT - TO FLCTT TO LOG ERRORS._^1*_'11. EXIT - TO VARIOUS ENTRY POINTS IN RLCTT AFTER_^1*_2EOP OF LAST CONTROLLER FUNCTION_^1*_2REQUESTED._^1*_'12. EXIT - TO SCHEDN (€€IN RWLCTT) TO SCHEDULE REWIND_^1*_2CHECK._^1*_'13. EXIT - TO I20 (IN DLCTT) TO COMPLETE REQUEST_^1*_2WHEN EOF OR EOT ENCOUNTERED._^1*_'14. EXIT - TO RLCTT FOR LOW THRESHOLD READ OR FOR_^1*_2ERROR RECOVERY._^1*_'15. EXIT - TO CALLER OF ALARM SUBROUTINE._^1*_'16. EXIT - TO CALLER OF FILEST SUBROUTINE._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'NLCTT_^1*_*1. CHECK BUS. IF BUS RELINQUI€€SHED EXIT TO FLCTT_^1*_-TO LOG ERROR (CODE = 21)._^1*_*2. GET TRANSPORT STATUS AND SAVE IT IN TRNSPT,I._^1*_*3. CHECK UNIT SELECT BIT OF ESTAT1 (BIT 8). IF_^1*_-OPERATION WAS NOT UNIT SELECT GO TO CKTRNS (56.)._^1*_*4. CLEAR UNIT SELECT BIT AND GO TO RWNDCK_^1*_-(EXTERNAL) IF UNIT REWINDING (BIT 6 OF ESTAT1)._^1*_*5. IF UNIT NOT READY EXIT TO FLCTT TO LOG ERROR_^1*_-(CODE = 14)._^1€€*_*6. IF REQUEST IS MOTION REQUEST GO TO MOTREQ (16.)._^1*_*7. CALCULATE TRANSFER LENGTH AND SAVE IT IN_^1*_-QSTWD4,I._^1*_*8. IF LENGTH NOT GREATER THAN 2 EXIT TO FLCTT_^1*_-TO LOG ERROR (CODE = 31)._^1*_]_^1*_'LENGOK_^1*_*9. CHECK TRANSPORT TYPE (BIT 9 OF ESTAT1). IF_^1*_-7 TRACK CALL SEVENT (EXTERNAL). ON RETURN_^1*_-(A) REGISTER CONTAINS CURRENT TRANSFER LENGTH._^1*_-IF 7 TRACK€€ LOAD (Q) REGISTER WITH PACK/UNPACK_^1*_-BUFFER ADDRESS. IF 9 TRACK LOAD (A) FROM_^1*_-QSTWD4,I._^1*_)10. SAVE TRANSFER LENGTH (IN (A) REGISTER) IN_^1*_-NUMBR AND FIRST WORD ADDRESS (IN (Q) REGISTER)_^1*_-IN FWA._^1*_]_^1*_'FRSTWD_^1*_)11. LOAD CONTROLLER WITH FIRST WORD ADDRESS GIVEN_^1*_-IN (A) REGISTER, AND SELECT FIRST BANK._^1*_)12. LOAD CONTROLLER WITH CURRENT BLOCK LENGTH_^1€€*_-SAVED IN NUMBR._^1*_)13. IF WRITE REQUEST AND RING MISSING EXIT TO_^1*_-FLCTT TO LOG ERROR (CODE = 13). IF RING OK_^1*_-LOAD (A) REGISTER WITH WRITE FUNCTION CODE_^1*_-(5). IF READ REQUEST GO TO 15.._^1*_]_^1*_'FUNCTN_^1*_)14. CALL QLCTT TO PERFORM DIRECTOR FUNCTION GIVEN_^1*_-IN (A) REGISTER AND EXIT TO KERNEL TO WAIT FOR_^1*_-EOP._^1*_)15. LOAD (A) REGISTER WITH READ/LOW THRES€€HOLD READ_^1*_-FUNCTION CODE (0/$20) AND GO TO FUNCTN (14.)._^1*_]_^1*_'MOTREQ_^1*_)16. CLEAR DENCOD, SET MOTION BIT OF ESTAT1 (BIT 5)_^1*_-AND SAVE MOTION PARAMETER WORD IN QSTWD4,I._^1*_)17. IF REQUEST NON ITERATIVE SAVE DENSITY CODE_^1*_-IN DENCOD AND GO TO DOMOT (20.)._^1*_)18. IF LU IS DLU GO TO DIAGNS (29.)._^1*_)19. IF NUMBER OF ITERATIONS EQUALS ZERO GO TO_^1*_-COMPLT (44.)€€. ELSE SAVE IT IN MOTITR._^1*_]_^1*_'DOMOT_^1*_)20. SAVE CURRENT PARAMETER STRING IN QSTWD4,I_^1*_-AND SAVE CURRENT MOTION CODE IN MOTCOD AND_^1*_-IN (Q) REGISTER. GO TO SUBMOT,Q._^1*_]_^1*_'SUBMOT_^1*_)21. GO TO DONEM (41.)._!MOTION CODE = 0_^1*_)22. GO TO RECDBK(45.)._!MOTION CODE = 1_^1*_)23. GO TO WRFM (47.)._!MOTION CODE = 2_^1*_)24. GO TO REW_!(48.)._!MOTION CODE = 3_^1*_)25€€. GO TO REWUN (50.)._!MOTION CODE = 4_^1*_)26. GO TO SCFMFD(51.)._!MOTION CODE = 5_^1*_)27. GO TO SCFMBK(52.)._!MOTION CODE = 6_^1*_)28. GO TO ADVRCD(54.)._!MOTION CODE = 7_^1*_]_^1*_'DIAGNS_^1*_)29. IF NUMBER OF ITERATIONS/WORDS EQUALS ZERO_^1*_-GO TO COMPLT (44.). ELSE SAVE IT IN MOTITR._^1*_)30. SAVE MOTION CODE IN MOTCOD. IF MOTION CODE_^1*_-NOT SPECIAL FOR DIAGNOSTIC LOAD (Q) €€REGISTER_^1*_-FROM MOTCOD AND GO TO SUBMOT,Q._^1*_)31. IF NEW MOTION CODE ILLEGAL EXIT TO FLCTT TO_^1*_-LOG ERROR (CODE = 60)._^1*_)32. LOAD (Q) REGISTER WITH VALUE OF NEW MOTION_^1*_-CODE MINUS 8 AND GO TO NEW,Q._^1*_]_^1*_'NEW_^1*_)33. GO TO CNBKSP (36.). MOTION CODE = 8_^1*_)34. GO TO VARERS (40.). MOTION CODE = 9_^1*_]_^1*_'FIXERS_^1*_)35. LOAD (A) REGISTER_"MOTION CODE = 10_€€^1*_-WITH FIXED ERASE FUNCTION CODE_^1*_-AND GO TO FUNCTN (14.)._^1*_]_^1*_'CNBKSP_^1*_)36. CALL LOAD POINT CHECK ROUTINE LPCHK (55.)._^1*_)37. ON RETURN (TAPE NOT AT LOAD POINT) CALL_^1*_-QLCTT TO LOAD BLOCK LENGTH GIVEN IN MOTITR_^1*_-AND LOAD (A) REGISTER WITH CONTROLLED_^1*_-BACKSPACE FUNCTION CODE._^1*_]_^1*_'GOON_^1*_)38. SET MOTITR TO 1._^1*_]_^1*_'DOIT_^1*_)39. GO TO FUNCTN€€ (14.)._^1*_]_^1*_'VARERS_^1*_)40. CALL QLCTT TO LOAD BLOCK LENGTH GIVEN IN_^1*_-MOTITR. ON RETURN LOAD (A) REGISTER WITH_^1*_-VARIABLE ERASE FUNCTION CODE AND GO TO_^1*_-GOON (38.)._^1*_]_^1*_'DONEM_^1*_)41. IF DENCOD EQUALS ZERO GO TO COMPLT (44.)._^1*_-ELSE IF TAPE NOT AT LOAD POINT GO TO_^1*_-DENERR (43.)._^1*_)42. IF REQUESTED DENSITY SELECT IMPOSSIBLE ON_^1*_-TRANSPORT GO TO €€DENERR (43.). ELSE UPDATE_^1*_-UNIT SELECT WORD - UNTMOD,I AND GO TO_^1*_-COMPLT (44.)._^1*_]_^1*_'DENERR_^1*_)43. EXIT TO FLCTT TO LOG ERROR (CODE = 51)._^1*_]_^1*_'COMPLT_^1*_)44. IF EOT NOT ENCOUNTERED DURING REQUEST_^1*_-EXECUTION EXIT TO KERNEL TO COMPLETE REQUEST._^1*_-ELSE SET EOT BIT OF ESTAT2 AND GO TO EOF (71.)._^1*_]_^1*_'RECDBK_^1*_)45. CALL LOAD POINT CHECK ROUTINE LPC€€HK (55.)._^1*_)46. ON RETURN (TAPE NOT AT LOAD POINT) LOAD (A)_^1*_-REGISTER WITH BACKSPACE FUNCTION CODE AND_^1*_-GO TO DOIT (39.)._^1*_]_^1*_'WRFM_^1*_)47. IF RING MISSING EXIT TO FLCTT TO LOG ERROR_^1*_-(CODE = 13). ELSE LOAD (A) REGISTER WITH_^1*_-WRITE EOF FUNCTION CODE AND GO TO DOIT (39.)._^1*_]_^1*_]_^1*_'REW_^1*_)48. CALL LOAD POINT CHECK ROUTINE LPCHK (55.)._^1*_)49. ON R€€ETURN (TAPE NOT AT LOAD POINT) LOAD (A)_^1*_-REGISTER WITH REWIND FUNCTION CODE AND_^1*_-GO TO DOIT (39.)._^1*_]_^1*_'REWUN_^1*_)50. LOAD (A) REGISTER WITH REWIND OFF-LINE_^1*_-FUNCTION CODE AND GO TO DOIT (39.)._^1*_]_^1*_'SCFMFD_^1*_)51. LOAD (A) REGISTER WITH SEARCH EOF FORWARD_^1*_-FUNCTION CODE AND GO TO DOIT (39.)._^1*_]_^1*_'SCFMBK_^1*_)52. CALL LOAD POINT CHECK ROUTINE LPCH€€K (55.)._^1*_)53. ON RETURN (TAPE NOT AT LOAD POINT) LOAD (A)_^1*_-REGISTER WITH SEARCH EOF BACKWARD FUNCTION_^1*_-CODE AND GO TO DOIT (39.)._^1*_]_^1*_'ADVRCD_^1*_)54. LOAD (A) REGISTER WITH ADVANCE RECORD FUNCTION_^1*_-CODE AND GO TO DOIT (39.)._^1*_]_^1*_'LPCHK_^1*_)55. IF TAPE NOT AT LOAD POINT RETURN TO CALLER._^1*_-ELSE SET MOTITR TO 1 AND GO TO NEXMOT (61.)._^1*_]_^1*_]_^1*_€€'CKTRNS_^1*_)56. LOAD (A) REGISTER WITH ALARM BIT STATUS AND_^1*_-(Q) REGISTER FROM RTRECV,I. GO TO CNTINU,Q._^1*_]_^1*_'CNTINU_^1*_)57. IF (A) REGISTER DIFFERENT FROM ZERO CALL_^1*_-ERROR ANALYSING ROUTINE ALARM (80.)._^1*_)58. IF NOT MOTION REQUEST GO TO TRNSOK (64.)._^1*_)59.IF MOTION WAS REWIND INCREMENT REWINDS_^1*_-COUNTER RWC (EXTERNAL), SET REWIND BIT OF_^1*_-ESTAT1 (BIT 6)€€ AND EXIT TO SCHEDN (EXTERNAL)_^1*_-TO SCHEDULE REWIND CHECK PROGRAM._^1*_)60. IF MOTION WAS REWIND OFF-LINE GO TO DONEM (41.)._^1*_]_^1*_'NEXMOT_^1*_)61. IF NON ITERATIVE MOTION REQUEST SHIFT_^1*_-PARAMETER WORD TO GET CURRENT CODE ON THE_^1*_-RIGHT AND GO TO DOMOT (20.)._^1*_)62. DECREMENT MOTITR AND GO TO COMPLT (44.) IF_^1*_-ZERO NOW._^1*_)63. IF MOTION SPECIAL FOR DIAGNOSTICS €€GO TO_^1*_-FIXERS (35.). ELSE LOAD (Q) REGISTER WITH_^1*_-MOTION CODE AND GO TO SUBMOT,Q._^1*_]_^1*_'TRNSOK_^1*_)64. IF READ REQUEST GO TO RDRQST (70.)._^1*_)65. IF 9 TRACK GO TO COMPLT (44.)._^1*_)66. IF FORMATTED WRITE GO TO COMPLT (44.)._^1*_]_^1*_'CONTIO_^1*_)67. CALL COMPV4 (EXTERNAL) TO CALCULATE NEXT_^1*_-TRANSFER LENGTH._^1*_)68. ON RETURN IF NO MORE TO TRANSFER GO TO_^1*_-€€COMPLT (44.)._^1*_)69. SAVE TRANSFER LENGTH IN QSTWD4,I AND_^1*_-GO TO LENGOK (9.)._^1*_]_^1*_'RDRQST_^1*_)70. IF EOF NOT ENCOUNTERED GO TO NOEOF (74.)._^1*_]_^1*_'EOF_^1*_)71. SET EOF BIT OF EREQST,I (BIT 14)._^1*_)72. CALL MAKEQ (EXTERNAL) TO SET V-FIELD OF_^1*_-REQUEST._^1*_)73. ON RETURN GO TO I20 (EXTERNAL) TO COMPLETE_^1*_-THE REQUEST._^1*_]_^1*_'NOEOF_^1*_)74. CALL FILEST (8€€9.) TO GET NUMBER OF WORDS_^1*_-NOT YET TRANSFERED._^1*_)75. ON RETURN CALL COMPV4 (EXTERNAL) TO CALCULATE_^1*_-NUMBER OF WORDS TRANSFERED ON LAST READ. IF_^1*_-RECORD READ IS NOT NOISE RECORD GO TO_^1*_-NONOIS (77.)._^1*_)76. IF LAST READ WAS LOW THRESHOLD READ RESET LOW_^1*_-THRESHOLD READ BIT (BIT 10) OF ESTAT1, LOAD_^1*_-(A) REGISTER FROM FWA AND GO TO FRSTWD (11.)_^1*_-TO READ€€ NEXT RECORD. ELSE EXIT TO RLCTT TO_^1*_-TRY LOW THRESHOLD READ._^1*_]_^1*_'NONOIS_^1*_)77. CLEAR LOW THRESHOLD READ BIT OF ESTAT1_^1*_-(BIT 10) AND CALL SLCTT TO GET CURRENT WORD_^1*_-ADDRESS._^1*_)78. ON RETURN ((A) REGISTER CONTAINS CURRENT_^1*_-WORD ADDRESS) IF 7 TRACK CALL SEVNRD (EXTERNAL)_^1*_-TO CONTINUE._^1*_)79. IF FORMATTED READ GO TO COMPLT (44.) .ELSE GO_^1*_-TO CONTIO€€ (67._^1*_]_^1*_'ALARM_^1*_)80. IF DEVICE NOT READY EXIT TO FLCTT TO LOG_^1*_-ERROR (CODE = 14)._^1*_)81. CALL FILEST (89.) TO GET ALARM STATUS. ON_^1*_-RETURN SAVE IT IN ERRORS._^1*_)82. IGNORING BUS RELINQUISH CHECK IF ANY ERRORS_^1*_-IN ALARM STATUS. IF NO ERROR FOUND INCREMENT_^1*_-EOT AND RETURN TO CALLER._^1*_)83. IF IRRECOVERABLE ERRORS EXIT TO FLCTT TO_^1*_-LOG ERROR (CODE €€= 2)._^1*_)84. IF NO CHARACTER FOUND IN 25 FEET EXIT TO_^1*_-FLCTT TO LOG ERROR (CODE = 27)._^1*_)85. IF TRANSMISSION PARITY ERROR ENTER (A)_^1*_-REGISTER 36 (ERROR CODE) AND EXIT TO RLCTT_^1*_-TO TRY RECOVERY._^1*_)86. IF LOST DATA ENTER (A) REGISTER 1 (ERROR CODE)_^1*_-AND EXIT TO RLCTT TO TRY RECOVERY._^1*_)87. IF ANY PARITY ERROR ENTER (A) REGISTER 3_^1*_-(ERROR CODE) AND EXIT €€TO RLCTT TO TRY RECOVERY._^1*_)88. RETURN TO CALLER._^1*_]_^1*_'FILEST_^1*_)89. CALL QLCTT TO LOAD FILE ADDRESS GIVEN IN_^1*_-(A) REGISTER._^1*_)90. ON RETURN CALL SLCTT TO GET FILE STATUS._^1*_)91. ON RETURN FILE STATUS IS IN (A) REGISTER._^1*_-RETURN TO CALLER._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7------------_^1*_]_^1*_'SLCTT - KERNEL STATUS SUBROUTINE_^1*_'QLCTT - KERNEL FUNCTION €€SUBROUTINE_^1*_'SEVENT - SEVEN TRACK HANDLER PROGRAM_^1*_'SEVNRD - SEVEN TRACK READ ROUTINE_^1*_'RLCTT - KERNEL RECOVERY ANCILLARY ROUTINE_^1*_'COMPV4 - 16 BIT SUBTRACTION ROUTINE_^1*_'MAKEQ - MAKE V-FIELD OF Q_^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$NLCTT_^1_(ENT_$FRSTWD_+FIRST WORD ADDRESS FUNCTION ENTRY_^1_(ENT_$FUNCTN_+DIRECTOR FUNCTION ENTRY_^1_(ENT_$CNT€€INU_+REFERENCE ADDRESS FOR RECOVERY_^1_(ENT_$NEXMOT_+NEXT MOTION ENTRY_^1_(ENT_$MOTITR_+MOTION ITERATIONS NUMBER_^1_(ENT_$TRNSOK_+RECOVERED ERROR ENTRY_^1_(ENT_$ALARM_,ALRAM ANALYSIS ENTRY_^1_(ENT_$FWA_.CURRENT FIRST WORD ADDRESS_^1_(ENT_$NUMBR_,CURRENT TRANSFER LENGTH_^1_(ENT_$EOT_.END OF TAPE WORD_^1_(ENT_$FILEST_+FILE STATUS SUBROUTINE ENTRY_^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1*_7EX€€TERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#SLCTT_,KERNEL STATUS SUBROUTINE_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#FLCTT_,KERNEL FAULT ENTRY_^1_(EXT*_#SEVENT_+SEVEN TRACK ROUTINES ENTRY_^1_(EXT*_#RWC_.REWIND COUNTER_^1_(EXT*_#SCHEDN_+REWIND CHECK SCHEDULER ENTRY_^1_(EXT*_#RWNDCK_+ADDRESS OF RETURN TO REWIND CHECK_^1_(EXT*_#I20_.REQUEST COMPLETION ENTRY€€_^1_(EXT*_#SEVNRD_+SEVEN TRACK READ HANDLER_^1_(EXT*_#RLCTT_,RECOVERY ROUTINE ENTRY_^1_(EXT_$COMPV4_+16 BIT ADDRESS SUBTRACTION ROUTINE_^1_(EXT_$MAKEQ_,MAKE V-FIELD_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$LPMASK(2)_^1_(EQU_$ZERO($22)_^1_(EQU_$ONEBIT($23)_^1_(EQU_$ZROBIT($33)_^1*_]_^1*_]_^1*_'ADDITIONAL EQUIVALENTS_^€€1*_]_^1_(EQU_$NOISLN(2)_^1*_]_^1*_]_^1_(EJT_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER€€ LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN AD€€DRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_€€$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYS€€ICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1*_]_^1_(EJT_^1*_]_^1****_]_^1*_7*********_^1*_7* NLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1NLCTT_"NUM_$0_^1_(LDA-_#ESTAT2,I_)CHECK IF BUS RELINQ€€UISHED_^1_(AND-_#ONEBIT+12_^1_(SAN_$2_0SKIP IF ON-BUS_^1_(ENA_$84_/BUS RELINQUISHED ERROR CODE=84_^1_(JMP*_#ERR_.LOG THE ERROR_^1_(ENQ_$4_0SAVE TRANSPORT STATUS_^1_(RTJ_$SLCTT_^1_(STA-_#TRNSPT,I_^1_(LDA-_#ESTAT1,I_)WAS UNIT JUST SELECTED_^1_(AND-_#ONEBIT+8_^1_(SAN_$2_0SKIP IF UNIT JUST SELECTED_^1_(JMP_$CKTRNS_+CHECK TRANSFER_^1_(EOR-_#ESTAT1,I_)CLEAR UNIT SELECT BIT (BIT 8 OF ESTA€€_^1_(STA-_#ESTAT1,I_^1_(AND-_#ONEBIT+6_)IS UNIT REWINDING_^1_(SAZ_$2_0SKIP IF UNIT NOT REWINDING_^1_(JMP_$RWNDCK_+RETURN TO REWIND CHECK ROUTINE_^1_(LDA-_#ESTAT2,I_)IS UNIT READY_^1_(AND-_#ONEBIT+0_^1_(SAN_$2_0SKIP IF UNIT READY_^1_(ENA_$14_/UNIT NOT READY ERROR CODE=14_^1_(JMP*_#ERR_.LOG THE ERROR_^1_(LDQ-_#EPTR,I_+CHECK IF MOTION REQUEST_^1_(LDA-_#(ZERO),Q_^1_(ARS_$9_^1_(AND-_#LP€€MASK+5_^1_(INA_$-14_^1_(SAN_$NOTMOT_+SKIP IF NOT MOTION REQUEST_^1_(JMP*_#MOTREQ_+PROCESS MOTION REQUEST_^1NOTMOT_!LDA-_#ELSTWD,I_)SAVE NUMBER OF WORDS TO TRANSFER_^1_(LDQ-_#ECCOR,I_^1_(RTJ_$COMPV4_^1_(STA-_#QSTWD4,I_^1_(INA_$-NOISLN-1_(IS NUMBER OF WORDS LEGAL_^1_(SAP_$LENGOK_+SKIP IF NUMBER OK_^1_(ENA_$31_/RECORD TOO SHORT,ERROR CODE=31_^1_(JMP*_#ERR_.LOG THE ERROR_^1LENGOK_!LDQ-€€_#ECCOR,I_*FIRST WORD ADDRESS TO Q_^1_(LDA-_#ESTAT1,I_)CHECK TRANSPORT TYPE_^1_(AND-_#ONEBIT+9_^1_(SAZ_$NINETR_+SKIP IF NINE TRACK TRANSPORT_^1_(RTJ_$SEVENT_+PREPARE FOR 7 TRACK TRANSFER_^1_(LDQ-_#ABUFF,I_*FIRST WORD ADDRESS TO Q (7 TRCK)_^1_(JMP*_#NINETR+1_^1NINETR_!LDA-_#QSTWD4,I_)GET TRANSFER LENGTH_^1_(STA-_#0_0SAVE CURRENT TRANSFER LENGTH_^1NUMBR_"NUM_$0_0NUMBER OF WORDS TO TR€€ANSFER_^1_(STQ-_#0_0SAVE CURRENT FIRST WORD ADDRESS_^1FWA_$NUM_$0_0FIRST WORD ADDRESS_^1_(TRQ_$A_0FIRST WORD ADDRESS TO A_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND FIRST WORD ADDRESS IN (A) REGISTER_^1*_]_^1FRSTWD_!ENQ_$1_0FIRST WORD ADDRESS TO CONTROLLER_^1_(RTJ_$QLCTT_^1_(CLR_$A_0SELECT FIRST BANK_^1_(ENQ_$2_^1_(RTJ_$QLCTT_^1_(LDA*_#NUMBR_,BLOCK LENGTH TO C€€ONTROLLER_^1_(ENQ_$6_^1_(RTJ_$QLCTT_^1_(LDA-_#ESTAT1,I_)READ/WRITE_^1_(AND-_#ONEBIT+0_^1_(SAZ_$READ_-SKIP IF READ/FREAD REQUEST_^1_(LDA-_#TRNSPT,I_)IS WRITE ENABLED (RING?)_^1_(AND-_#ONEBIT+10_^1_(SAZ_$2_0SKIP IF WRITE ENABLED_^1_(ENA_$13_/WRITE PROTECTED,ERROR CODE=13_^1ERR_$JMP*_#ERROR_,LOG THE ERROR_^1_(ENA_$5_0WRITE FUNCTION CODE_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) €€REGISTER_^1* AND FUNCTION CODE IN (A) REGISTER_^1*_]_^1FUNCTN_!ENQ_$0_0DIRECTOR FUNCTION_^1_(RTJ_$QLCTT_^1_(ENA_$$70_.TIMEOUT PERIOUD TO A_^1RTRN_#JMP*_#(NLCTT)_*RETURN TO KERNEL_^1READ_#LDA-_#ESTAT1,I_)CHECK IF LOW THRESHOLD READ_^1_(AND-_#ONEBIT+10_^1_(SAZ_$1_0SKIP IF NORMAL READ_^1_(ENA_$$20_.READ WITH LOW THRESHOLD_^1_(JMP*_#FUNCTN_+EXECUTE FUNCTION_^1MOTREQ_!STA*_#DENCOD_+CLEA€€R DENSITY CODE WORD_^1_(LDA-_#ESTAT1,I_)SET MOTION BIT (BIT 5 OF ESTAT1)_^1_(ADD-_#ONEBIT+5_^1_(STA-_#ESTAT1,I_^1_(LDA-_#4,Q_.SAVE PARAMETER WORD_^1_(STA-_#QSTWD4,I_^1_(SAM_$NODENS_+SKIP IF ITERATIVE TYPE MOTION_^1_(AND-_#LPMASK+4_)SAVE DENSITY CODE_^1_(STA*_#DENCOD_^1_(JMP*_#DOMOT_,PERFORM FIRST MOTION_^1NODENS_!LDA-_#ELU,I_,IS DIAGNOSTIC LOGICAL UNIT_^1_(EOR-_#DIAGLU,I_^1_(SAN_$1€€_0SKIP IF NOT DLU_^1_(JMP*_#DIAGNS_+HANDLE DLU REQUEST_^1_(LDA-_#QSTWD4,I_)GET NUMBER OF ITERATIONS_^1_(AND-_#LPMASK+12_^1_(SAN_$1_0SKIP IF NUMBER GREATER THAN ZERO_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(STA*_#MOTITR_+SAVE NUMBER OF ITERATIONS_^1DOMOT_"EOR-_#QSTWD4,I_)SAVE MOTION CODES_^1_(STA-_#QSTWD4,I_^1_(ARS_$12_/SAVE CURRENT MOTION CODE_^1_(AND-_#LPMASK+3_^1_(STA*_#MOTCOD_€€^1_(TRA_$Q_0MOTION CODE TO Q_^1_(JMP*_#SUBMOT,Q_)PERFORM CURRENT MOTION_^1SUBMOT_!JMP*_#DONEM_,NO MOTION TO PROCESS_^1_(JMP*_#RECDBK_+BACKSPACE ONE RECORD_^1_(JMP*_#WRFM_-WRITE FILE MARK_^1_(JMP*_#REW_.REWIND_^1_(JMP*_#REWUN_,REWIND AND UNLOAD_^1_(JMP*_#SCFMFD_+SEARCH FILE MARK FORWARD_^1_(JMP*_#SCFMBK_+SEARCH FILE MARK BACKWARD_^1_(JMP*_#ADVRCD_+ADVANCE ONE RECORD_^1DIAGNS_!LDA-_#€€QSTWD4,I_)GET NUMBER OF WORDS OR ITERATIONS_^1_(AND-_#LPMASK+11_^1_(SAN_$1_0SKIP IF NUMBER NOT ZERO_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(STA*_#MOTITR_+SAVE NUMBER_^1_(EOR-_#QSTWD4,I_)SAVE MOTION CODE_^1_(STA-_#QSTWD4,I_^1_(ARS_$11_^1_(AND-_#LPMASK+4_^1_(STA*_#MOTCOD_^1_(INA_$-8_/CHECK IF NEW MOTION_^1_(SAP_$NEWMOT_+SKIP IF NEW MOTION_^1_(LDQ*_#MOTCOD_+PERFORM REQUESTED MOTION€€_^1_(JMP*_#SUBMOT,Q_^1NEWMOT_!INA_$-3_/IS MOTION CODE LEGAL_^1_(SAM_$PERMOT_+SKIP IF LEGAL CODE_^1_(ENA_$60_/ILLEGAL CODE , ERROR CODE = 60_^1_(JMP*_#ERROR_,LOG THE ERROR_^1PERMOT_!INA_$3_0REGAIN MOTION CODE_^1_(TRA_$Q_0PERFORM REQUESTED MOTION_^1_(JMP*_#NEW,Q_^1NEW_$JMP*_#CNBKSP_+CONTROLLED BACKSPACE_^1_(JMP*_#VARERS_+VARIABLE ERASE_^1FIXERS_!ENA_$8_0FIXED ERASE_^1_(JMP*_#FUNCTN_+€€PERFORM FIXED ERASE_^1CNBKSP_!RTJ*_#LPCHK_,CHECK IF TAPE AT LOAD POINT_^1_(LDA*_#MOTITR_+NOT AT LOAD POINT , LOAD BLOCK LENGT_^1_(ENQ_$6_^1_(RTJ_$QLCTT_^1_(ENA_$$A_/FUNCTION CODE TO A_^1GOON_#ENQ_$1_0SET MOTITR TO 1_^1_(STQ*_#MOTITR_^1DOIT_#JMP*_#FUNCTN_+PERFORM MOTION_^1VARERS_!LDA*_#MOTITR_+LOAD BLOCK LENGTH_^1_(ENQ_$6_^1_(RTJ_$QLCTT_^1_(ENA_$9_0FUNCTION CODE TO A_^1_(JMP*_#GOON_€€-CONTINUE_^1MOTCOD_!NUM_$0_0CURRENT MOTION CODE_^1DENCOD_!NUM_$0_0DENSITY CODE_^1MOTITR_!NUM_$0_0ITERATION NUMBER_^1DONEM_"LDA*_#DENCOD_+GET DENSITY CODE_^1_(SAN_$1_0SKIP IF ANY DENSITY REQUEST_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(LDA-_#TRNSPT,I_)IS TAPE AT LOAD POINT_^1_(ALS_$6_^1_(SAM_$1_0SKIP IF TAPE AT LOAD POINT_^1_(JMP*_#DENERR_+ILLEGAL REQUEST,LOG THE ERROR_^1_(LDQ*_#D€€ENCOD_+DENSITY CODE TO Q_^1_(ALS_$5_0CHECK TRANSPORT TYPE_^1_(SAP_$BOTH_-SKIP IF TWO DENSITIES AVAILABLE_^1_(ALS_$1_0CHECK NRZI/PE_^1_(SAP_$NRZI_-SKIP IF NRZI_^1_(INQ_$-4_/IS DENSITY CODE LEGAL FOR THIS TRANS_^1XIT_$SQZ_$1_0SKIP IF REQUEST LEGAL_^1_(JMP*_#DENERR_+ILLEGAL DENSITY,LOG THE ERROR_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1NRZI_#INQ_$-1_/IS DENSITY CODE LEGAL FOR THIS TRA€€NS_^1_(JMP*_#XIT_^1BOTH_#ALS_$1_0IS 7 OR 9 TRACK TRANSPORT_^1_(SAP_$TRCK7_,SKIP IF 7 TRACK TRANSPORT_^1_(LDA-_#UNTMOD,I_)UPDATE DENSITY MODE_^1_(AND-_#ZROBIT+15_^1_(INQ_$-1_^1_(SQZ_$LOWDEN_^1_(INQ_$-3_^1_(SQZ_$HIGHDN_^1_(JMP*_#DENERR_+ILLEGAL DENSITY,LOG THE ERROR_^1TRCK7_"LDA-_#UNTMOD,I_)UPDATE DENSITY MODE_^1_(AND-_#ZROBIT+15_^1_(INQ_$-1_^1_(SQZ_$HIGHDN_^1_(INQ_$-1_^1_(SQZ_$LOWDE€€N_^1DENERR_!ENA_$51_/ILLEGAL DENSITY,ERROR CODE=51_^1ERROR_"JMP_$FLCTT_,LOG THE ERROR_^1LOWDEN_!ADD-_#ONEBIT+15_(SET LOW DENSITY BIT_^1HIGHDN_!STA-_#UNTMOD,I_)SAVE NEW UNIT SELECT CODE_^1COMPLT_!LDA_$EOT_.WAS EOT ENCOUNTERED_^1_(SAN_$1_0SKIP IF EOT ENCOUNTERED_^1_(JMP*_#RTRN_-COMPLETE THE REQUEST_^1_(LDA-_#ESTAT2,I_)SET EOT BIT OF ESTAT2_^1_(AND-_#ZROBIT+9_^1_(ADD-_#ONEBIT+9_^1_(ST€€A-_#ESTAT2,I_^1_(JMP*_#EOF_^1RECDBK_!RTJ*_#LPCHK_,CHECK IF TAPE AT LOAD POINT_^1_(ENA_$4_0NO, BACKSAPCE RECORD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1WRFM_#LDA-_#TRNSPT,I_)IS WRITE ENABLED (RING?)_^1_(AND-_#ONEBIT+10_^1_(SAZ_$2_0SKIP IF WRITE ENABLED_^1_(ENA_$13_/WRITE IMPOSSIBLE,ERROR CODE=13_^1_(JMP*_#ERROR_,LOG THE ERROR_^1_(ENA_$6_0WRITE FILE MARK CODE TO A_^1_(JMP*_#DOIT_-€€PERFORM DIRECTOR FUNCTION_^1REW_$RTJ*_#LPCHK_,CHECK IF TAPE AT LOAD POINT_^1_(ENA_$7_0NOT AT LOAD POINT,REWIND CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1REWUN_"ENA_$11_/REWIND AND UNLOAD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1SCFMFD_!ENA_$2_0SEARCH FM CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1SCFMBK_!RTJ*_#LPCHK_,CHECK IF TAPE AT LOAD POINT_^1_(ENA_$3_0NO,SEARCH FM BACKWARD C€€ODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1ADVRCD_!ENA_$1_0ADVANCE RECORD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1LPCHK_"NUM_$0_0LOAD POINT CHECK_^1_(LDA-_#TRNSPT,I_)CHECK FOR LOAD POINT_^1_(AND-_#ONEBIT+9_^1_(SAN_$1_0SKIP IF AT LOAD POINT_^1_(JMP*_#(LPCHK)_*RETURN TO CALLER_^1_(ENA_$1_0PROCESS NEXT MOTION_^1_(STA*_#MOTITR_^1_(JMP*_#NEXMOT_^1CKTRNS_!LDA-_#ESTAT2,I_)GET ALARM BIT_€€^1_(AND-_#ONEBIT+3_^1_(LDQ-_#RTRECV,I_)CONTINUE_^1_(JMP*_#CNTINU,Q_^1CNTINU_!SAZ_$1_0SKIP IF NO ALARM_^1_(RTJ*_#ALARM_,CHECK ALARM CAUSE_^1_(LDA-_#ESTAT1,I_)PROCESSING POSSIBLE,CHECK FOR MOTION_^1_(AND-_#ONEBIT+5_^1_(SAN_$1_0SKIP IF MOTION REQUEST_^1_(JMP*_#TRNSOK_+PROCESS DATA TRANSFER_^1_(LDQ*_#MOTCOD_+CHECK FOR REWIND_^1_(INQ_$-3_^1_(SQN_$NOTRW_,SKIP IF NOT REWIND_^1_(RAO_$RWC_.€€INCREMENT REWINDS COUNTER_^1_(LDA-_#ESTAT1,I_)SET REWIND BIT (BIT 6 OF ESTAT1)_^1_(ADD-_#ONEBIT+6_^1_(STA-_#ESTAT1,I_^1_(LDA_$=N200_,TIMEOUT PERIOD TO A_^1_(JMP_$SCHEDN_+SCHEDULE REWIND CHECK PROGRAM_^1NOTRW_"INQ_$-1_/CHECK FOR REWIND AND UNLOAD_^1_(SQN_$1_0SKIP IF NOT REWIND AND UNLOAD_^1_(JMP*_#DONEM_,COMPLETE THE REQUEST_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^€€1*_]_^1NEXMOT_!LDA-_#QSTWD4,I_)GET PARAMETER WORD_^1_(SAM_$NZITR_,SKIP IF ITERATIVE TYPE REQUEST_^1_(ALS_$4_0GET NEXT MOTION CODE_^1_(JMP_$DOMOT+1_*PROCESS NEXT MOTION_^1NZITR_"LDQ*_#MOTITR_+DECREMENT ITERATION NUMBER_^1_(INQ_$-1_^1_(STQ*_#MOTITR_^1_(SQZ_$MOTEXT_+SKIP IF NO MORE ITERATIONS TO DO_^1_(LDQ*_#MOTCOD_+IS NEW MOTION CODE_^1_(INQ_$-8_^1_(SQP_$DIAG_-SKIP IF DLU CODE_^1_(IN€€Q_$8_^1_(JMP_$SUBMOT,Q_)PERFORM NEXT MOTION_^1DIAG_#JMP_$FIXERS_+PERFORM FIXED ERASE_^1MOTEXT_!JMP*_#COMPLT_+COMPLETE THE REQUEST_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1TRNSOK_!LDA-_#ESTAT1,I_)IS READ OR WRITE_^1_(ALS_$15_^1_(SAM_$1_0SKIP IF WRITE REQUEST_^1_(JMP*_#RDRQST_+PROCESS READ REQUEST_^1_(ALS_$7_07 OR 9 TRACK_^1_(SAM_$1_0SKIP IF 7 TRACK TRANSPORT_€€^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(AND-_#ONEBIT+7_)FORMATTED/UNFORMATTED_^1_(SAZ_$1_0SKIP IF UNFORMATTED_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1CONTIO_!LDA-_#ELSTWD,I_)CALCULATE NEXT TRANSFER LENGTH_^1_(LDQ-_#ECCOR,I_^1_(RTJ_$COMPV4_^1_(SAN_$1_0SKIP IF DATA TO TRANSFER_^1CMPLT_"JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(STA-_#QSTWD4,I_)SAVE UPDATED TRANSFER LENGTH_^1_(JMP_$LE€€NGOK_+PERFORM DATA TRANSFER_^1RDRQST_!LDA-_#ESTAT2,I_)WAS FILE MARK ENCOUNTERED_^1_(AND-_#ONEBIT+11_^1_(SAZ_$NOEOF_,SKIP IF NO FILE MARK ENCOUNTERED_^1EOF_$LDA-_#EREQST,I_)SET EOF BIT OF EREQST,I(BIT 14)_^1_(ADD-_#ONEBIT+14_^1_(STA-_#EREQST,I_^1_(RTJ_$MAKEQ_,MAKE V-FIELD_^1_(JMP_$I20_.COMPLETE THE REQUEST_^1NOEOF_"ENA_$8_0REST OF WORDS TO READ_^1_(RTJ*_#FILEST_^1_(SAM_$1_^1_(INA_$1€€_^1_(INA_$0_^1_(TRA_$Q_0REST OF WORDS TO READ TO Q_^1_(LDA_$NUMBR_,ORIGINAL TRANSFER LENGTH TO A_^1_(RTJ_$COMPV4_+ACTUAL NUMBER OF WORDS READ_^1_(INA_$-NOISLN-1_(WAS IT A NOISE RECORD_^1_(SAP_$NONOIS_+SKIP IF NOT NOISE_^1_(LDA-_#ESTAT1,I_)CHECK IF LOW THRESHOLD READ(BIT 10)_^1_(AND-_#ONEBIT+10_^1_(SAN_$2_0SKIP IF LOW THRESHOLD_^1RECOVR_!JMP_$RLCTT_,TRY RECOVERY_^1_(EOR-_#ESTAT1,I_)€€CLEAR LOW THRESHOLD BIT (BIT 10)_^1_(STA-_#ESTAT1,I_^1_(LDA_$FWA_.FIRST WORD ADDRESS TO A_^1_(JMP_$FRSTWD_+PERFORM THE REQUEST ANEW_^1NONOIS_!LDA-_#ESTAT1,I_)CLEAR LOW THRESHOLD BIT (BIT 10)_^1_(AND-_#ZROBIT+10_^1_(STA-_#ESTAT1,I_^1_(ENQ_$1_0GET CURRENT ADDRESS_^1_(RTJ_$SLCTT_^1_(LDQ-_#ESTAT1,I_)7 OR 9 TRACK_^1_(QLS_$6_^1_(SQM_$TRCK7N_+SKIP IF 7 TRACK TRANSPORT_^1_(STA-_#ECCOR,I_*U€€PDATE CURRENT ADDRESS WORD_^1_(QLS_$8_0FORMATTED/UNFORMATTED_^1_(SQM_$3_0SKIP IF FORMATTED_^1_(JMP*_#CONTIO_+CONTINUE READING_^1TRCK7N_!RTJ_$SEVNRD_+HANDLE 7 TRACK TRANSFER_^1_(JMP*_#CMPLT_,TRANSFER COMPLETED,COMPLETE THE REQU_^1*_]_^1*_]_^1* ALARM ANALYSIS_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1ALARM_"NUM_$0_^1_(LDA-_#ESTAT2,I_)IS DEVICE READY ?_^1_(AND-_#ONEBIT+0_^1€€_(SAN_$2_0SKIP IF UNIT READY_^1_(ENA_$14_/UNIT NOT READY,ERROR CODE=14_^1_(JMP*_#FAULT_,LOG THE ERROR_^1_(ENA_$10_/SAVE ALARM STATUS_^1_(RTJ*_#FILEST_^1_(STA-_#ALRMST,I_)SAVE ALARM STATUS_^1_(LDA-_#TRNSPT,I_)CHECK TRANSPORT MODE_^1_(AND-_#ONEBIT+1_^1_(SAZ_$PEMODE_+SKIP IF PE MODE_^1_(ENA_$-8_^1PEMODE_!ADD-_#LPMASK+13_(MASK UNASSIGNED BITS_^1_(AND-_#ZROBIT+7_)IGNORE BUS RELINQUISHED€€ BIT_^1_(AND-_#ALRMST,I_^1_(SAN_$CKERR_,SKIP IF ERROR_^1_(RAO-_#0_0SET EOT WORD_^1EOT_$NUM_$0_0END OF TAPE WORD_^1_(JMP*_#(ALARM)_*RETURN TO CALLER_^1CKERR_"STA-_#ALRMST,I_^1_(LDA_$ESTAT1,I_)IS ERROR DURING MOTION REQUEST?_^1_(AND-_#ONEBIT+5_^1_(SAZ_$1_^1_%JMP*_%FAULT-1_)YES,DONT TRY RECOVERY_^1_(LDA-_#ALRMST,I_^1_(AND_$=N$E40_+CHECK FOR IRRECOVERABLE ERRORS_^1_(SAZ_$3_0SKIP IF NON€€E_^1_(ENA_$2_0LOG ALARM, ERROR CODE=2_^1FAULT_"JMP_$FLCTT_,LOG THE ERROR_^1_(LDA-_#ALRMST,I_)ERRORS TO A_^1_(ALS_$11_/NO CHARACTER READ IN 25 FEET ?_^1_(SAP_$2_^1_(ENA_$87_^1_(JMP*_#FAULT_,LOG THE ERROR_^1_(ALS_$8_0CHECK FOR TRANSMISSION PARITY ERROR_^1_(SAP_$NOTRPA_+SKIP IF NO TRANS. PARITY ERROR_^1_(ENA_$36_/TRANSMISSION PARITY ERROR CODE TO A_^1_(JMP*_#RECOVR_+TRY RECOVERY_^1NOT€€RPA_!ALS_$4_0CHECK IF LOST DATA_^1_(SAP_$NOLSDT_+SKIP IF NOT LOST DATA_^1_(ENA_$1_0LOST DATA ERROR CODE TO A_^1_(JMP*_#RECOVR_+TRY RECOVERY_^1NOLSDT_!AND-_#LPMASK+11_(CHECK IF PARITY ERROR_^1_(SAZ_$2_0SKIP IF NO PARITY ERROR_^1PARERR_!ENA_$3_0PARITY ERROR CODE TO A_^1_(JMP*_#RECOVR_+TRY RECOVERY_^1_(JMP*_#(ALARM)_*RETURN TO CALLER_^1*_]_^1*_]_^1* FILE STATUS_^1* ENTERED WITH PDT AD€ÈDRESS IN (I) REGISTER_^1* AND FILE ADDRESS IN (A) REGISTER_^1*_]_^1FILEST_!NUM_$0_^1_(ENQ_$3_0LOAD FILE ADDRESS_^1_(RTJ_$QLCTT_^1_(ENQ_$3_0GET FILE STATUS_^1_(RTJ_$SLCTT_^1_(JMP*_#(FILEST)_^1_(END_^__ÈPL18326 CSY/ D57 P€1_%NAM L18326_'DECK-ID D57 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - PREPARE ERROR LOGGING INFORMATION_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT LOG_^1*_7********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT LOG PREPARES THE DRIVER AND €€PHYSICAL_^1*_'DEVICE TABLE BEFORE ERROR LOGGING._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ANCILLARY ROUTINE SAVES ERROR CODE IN PDT_^1*_'AND SETS HARDWARE FAILURE BIT OF EREQST. IT TAKES_^1*_'ALSO SPECIAL CARE WHEN UNIT PERFORMED A REWIND._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'(I) REGISTER = PHYSICAL DEVICE TABLE€€ ADDRESS_^1*_'(A) REGISTER = FAULT CODE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SAVES ERROR CODE IN FLTCOD WORD OF PDT._^1*_'2. CLEARS REWIND BIT OF ESTAT1 (BIT 6) IF_^1*_*UNIT PERFORMED A REWIND._^1*_'3. DECREMENTS REWINDS COUNTER IF UNIT_^1*_*PERFORMED A REWIND._^1*_'4. SETS HARDWARE FAILURE BIT OF EREQST,I._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. LLCT€€T ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. EXIT - TO KERNEL (CALLING ROUTINE)._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'LLCTT_^1*_*1. SAVE ERROR CODE (IN (A) REGISTER) IN FLTCOD,I._^1*_*2. IF UNIT PERFORMED A REWIND CLEAR REWIND BIT_^1*_-OF ESTAT1 (BIT 6) AND DECREMENT REWINDS_^1*_-COUNTER - RWC (EXTERNAL)._^1*_*3. SET HARDWARE FAILURE BIT OF EREQST (BIT 14)_^1*_-AND R€€ETURN TO KERNEL (CALLING ROUTINE)._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$LLCTT_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#RWC_.REWIND COUNTER_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$ONEBIT($23)_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQ€€U_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST €€STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOG€€ICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(€€26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALR€€MST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1_(EJT_^1*_]_^1****_]_^1*_]_^1*_7*********_^1*_7* LLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND ERROR CODE IN (A) REGISTER_^1*_]_^1*_]_^1LLCTT_"NUM_$0_^1_(STA-_#FLTCOD,I_)SAVE ERROR CODE_^1_(LDA-_#ESTAT1,I_)IS UNIT REWINDING_^1_(AND-_#ONEBIT+€P6_^1_(SAZ_$NOTRW_,SKIP IF UNIT NOT REWINDING_^1_(EOR-_#ESTAT1,I_)CLEAR REWIND BIT (BIT 6 OF ESTAT1)_^1_(STA-_#ESTAT1,I_^1_(LDA_$RWC_.DECREMENT REWIND COUNTER_^1_(INA_$-1_^1_(STA_$RWC_^1NOTRW_"LDA-_#EREQST,I_)SET HARDWARE FAILURE BIT OF EREQST,I_^1_(ADD-_#ONEBIT+14_^1_(STA-_#EREQST,I_^1_(JMP*_#(LLCTT)_*COMPLETE THE REQUEST_^1_(END_^__ PPW18326 CSY/ D58 P€1_%NAM W18326_'DECK-ID D58 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - REWIND CHECK_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT REWIND CHECK_^1*_7*****************_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT REWIND CHECK IS RUN TO CHECK RE€€WIND_^1*_'COMPLETION. IF REWIND NOT YET COMPLETED THE_^1*_'PROGRAM SCHEDULES ITSELF FOR ANOTHER CHECK._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE IS FIRST ENTERED AFTER A REWIND MOTION_^1*_'HAS BEEN INITIATED. IT IS THEN SCHEDULED TO RUN IN_^1*_'LOWER PRIORITY. THEN A BUS CONNECT AND UNIT SELECT_^1*_'ARE ESTABLISHED TO ENABLE STATUS SAMPLE€€. IF ERROR_^1*_'CONDITION THE REQUEST WILL BE COMPLETED. IF NO_^1*_'ERROR AND REWIND NOT COMPLETED THE PROGRAM IS_^1*_'RESCHEDULED. IF NO ERROR AND REWIND COMPLETED_^1*_'CONTROL IS TRANSFERED TO NLCTT TO CONTINUE REQUEST_^1*_'PROCESSING._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'RWLCTT_^1*_*(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'RWND€€CK_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'SCHEDN_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. UPDATES DRIVER BUSY WORD - CURPDT IF DRIVER_^1*_*WAS FOUND NOT BUSY._^1*_'2. SCHEDULES ITSELF WHEN NEEDED._^1*_'3. RESETS AND SETS DIAGNOSTIC CLOCK EDCLK,I._^1*_'4. CLEARS REWIND BIT OF ESTAT1 (BIT 6) WHEN R€€EWIND_^1*_*COMPLETED._^1*_'5. SETS MOTITR TO 1 ((MOTITR) = NUMBER OF ITERATIONS)._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'RWLCTT ENTRY - SCHEDULED FROM INTERNAL PARTS._^1*_'RWNDCK ENTRY - ENTERED FROM NLCTT TO CHECK STATUS._^1*_'SCHEDN ENTRY - ENTERED FROM NLCTT AFTER REWIND BEGIN._^1*_'EXIT - TO DISPATCHER AFTER RWLCTT RESCHEDULE._^1*_'EXIT - TO FLCTT TO LOG ERROR._€€^1*_'EXIT - TO DISPATCHER AFTER SCHEDULING NEXT PART TO_^1*_.RUN AT DRIVER PRIORITY._^1*_'EXIT - TO CONBUS TO ESTABLISH UNIT SELECT._^1*_'EXIT - TO NEXMOT TO CONTINUE REQUEST PROCESSING._^1*_'EXIT - TO NEXUNI AFTER RWLCTT RESCHEDULE TO_^1*_.PROCESS NEXT UNIT._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'RWLCTT_^1*_*1. SAVE PDT ADDRESS GIVEN BY (Q) REGISTER IN_^1*_-(I) REGISTER AND IN€€HIBIT INTERRUPTS._^1*_*2. IF DRIVER BUSY ENABLE INTERRUPTS AND SCHEDULE_^1*_-RWLCTT (1.) AGAIN (PRIORITY = 3)._^1*_*3. SET DRIVER BUSY AND ENABLE INTERRUPTS._^1*_*4. IF TIMEOUT ERROR EXIT TO FLCTT TO LOG ERROR_^1*_-(ERROR CODE = 0)._^1*_*5. SAVE DIAGNOSTIC CLOCK CONTENTS, SCHEDULE_^1*_-CONECT (6.) AT DRIVER PRIORITY AND EXIT_^1*_-TO DISPATCHER._^1*_]_^1*_'CONECT_^1*_*6. SAVE PDT AD€€DRESS GIVEN BY (Q) REGISTER IN_^1*_-(I) REGISTER AND EXIT TO CONBUS (IN BLCTT)._^1*_]_^1*_'RWNDCK_^1*_*7. IF UNIT OFF-LINE EXIT TO FLCTT TO LOG ERROR_^1*_-(ERROR CODE = 14)._^1*_*8. IF UNIT NOT READY (REWIND NOT COMPLETE) GO_^1*_-TO RESCHD (10.)._^1*_*9. REWIND IS COMPLETED - DECREMENT RWC, CLEAR_^1*_-REWIND BIT OF ESTAT1 (BIT 6), SET MOTITR_^1*_-(EXTERNAL) TO 1 AND EXIT TO NEXMOT.€€_^1*_]_^1*_'RESCHD_^1*_)10. LOAD (A) REGISTER WITH PRESAVED DIAGNOSTIC_^1*_-CLOCK CONTENTS._^1*_]_^1*_'SCHEDN_^1*_)11. RESTORE DIAGNOSTIC CLOCK EDCLK,I._^1*_)12. SCHEDULE RWLCTT (1.) AND EXIT TO NEXUNI._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$RWLCTT_^1_(ENT_$RWNDCK_+REWIND STATUS CHECK ENTRY_^1_(ENT_$RWC_.REWIND COUNT_^1_(ENT_$SCHEDN_+RWLCTT SCHEDULE ENTRY_^1€€*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#CURPDT_+CURRENT PDT ADDRESS_^1_(EXT*_#CONBUS_+BUS CONNECT ENTRY_^1_(EXT*_#MOTITR_+MOTION ITERATIONS NUMBER_^1_(EXT*_#NEXMOT_+NEXT MOTION PROCESSING ENTRY_^1_(EXT*_#NEXUNI_+PROCESS NEXT UNIT ENTRY_^1_(EXT*_#FLCTT_,KERNEL FAULT ENTRY_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_€€'LOW CORE EQUATES_^1*_]_^1_(EQU_$ONEBIT($23)_^1_(EQU_$ZROBIT($33)_^1_(EQU_$ADISP($EA)_'DISPATCHER ADDRESS_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU€€_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(E€€QU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATU€€S AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFL€€AG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1_(EJT_^1*_]_^1****_]_^1*_]_^1*_7**********_^1*_7* RWLCTT *_^1*_7**********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS €€IN (Q) REGISTER_^1* RUNNING PRIORITY = 3_^1*_]_^1RWLCTT_!STQ-_#I_0PDT ADDRESS TO I_^1_(IIN_$0_^1_(LDA_$CURPDT_+IS DRIVER BUSY_^1_(SAZ_$NOTBSY_+SKIP IF DRIVER NOT BUSY_^1_(EIN_$0_^1_(SCHDLE_!RWLCTT-*+1,3,X_"RESCHEDULE RWLCTT_^1_(JMP-_#(ADISP)_*EXIT TO DISPATCHER_^1NOTBSY_!STQ_$CURPDT_+UPDATE CURPDT_^1_(EIN_$0_^1_(LDA-_#EDCLK,I_*DID TIMEOUT OCCURE_^1_(SAP_$NOHNGP_+SKIP IF NO HANG UP €€OCCURED_^1_(ENA_$0_0TIMEOUT ERROR CODE=0_^1ERROR_"JMP_$FLCTT_,LOG THE ERROR_^1NOHNGP_!STA-_#0_0SAVE MOMENTARY DIAGNOSTIC CLOCK VALU_^1TIMOUP NUM 0_^1_(ENA_$-1_/RESET DIAGNOSTIC CLOCK_^1_(STA-_#EDCLK,I_^1_(LDQ-_#I_0SCHEDULE BUS CONNECT_^1_(SCHDLE_!CONECT-*+1,10,X_^1_(JMP-_#(ADISP)_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (Q) REGISTER_^1*_]_^1CONECT_!STQ-_#I_^1_(JMP_$CONBUS_+CONN€€ECT BUS_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1RWNDCK_!LDA-_#TRNSPT,I_)CHECK IF UNIT REWINDING_^1_(SAP_$2_0SKIP IF UNIT ON-LINE_^1_(ENA_$14_/UNIT NOT READY ERROR CODE=14_^1_(JMP*_#ERROR_,LOG THE ERROR_^1_(LDA-_#ESTAT2,I_)IS REWIND COMPLETE ?_^1_(AND-_#ONEBIT+0_^1_(SAZ_$RESCHD_+SKIP IF UNIT STILL REWINDING_^1_(LDA*_#RWC_.DECREMENT REWIND COUNTER_^1_(INA_$-1€€_^1_(STA-_#0_^1RWC_$NUM_$0_0REWIND COUNTER_^1_(LDA-_#ESTAT1,I_)CLEAR REWIND IN PROGRESS BIT_^1_(AND-_#ZROBIT+6_^1_(STA-_#ESTAT1,I_^1_(ENA_$1_0SET MOTITR TO 1_^1_(STA_$MOTITR_^1_(JMP_$NEXMOT_+PERFORM NEXT MOTION_^1RESCHD LDA* TIMOUP_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1SCHEDN_!STA-_#EDCLK,I_^1_(LDQ-_#I_^1_(SCHDLE_!RWLCTT-*+1,3,X_^1_(JMP_$NEXUNI_+PROCESS €NEXT UNIT_^1_(END_^__ PR18326 CSY/ D59 P€1_%NAM R18326_'DECK-ID D59 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - ERROR RECOVERY_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT RECOVERY_^1*_7*************_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT RECOVERY CONTROLS RECOVERY ATTEMPTS_^€€1*_'FOR CERTAIN HARDWARE FAILURES._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THE LCTT RECOVERY ANCILLARY ROUTINE HANDLES ERROR_^1*_'RECOVERY TRIALS FOR READ/FREAD AND WRITE/FWRITE_^1*_'REQUESTS. IT IS CALLED WHEN A NOISE RECORD IS_^1*_'ENCOUNTERED TO BACKSPACE THE RECORD AND READ IT_^1*_'AGAIN IN LOW THRESHOLD. MORE SOFISTICATED ACTIONS_^1*_'ARE PERFO€€RMED WHEN IT IS CALLED TO RECOVER DATA_^1*_'TRANSFER ERRORS SUCH AS LOST DATA AND PARITY FAULTS._^1*_'THESE RECOVERIES ARE ATTEMPTED ONLY FOR NON_^1*_'DIAGNOSTIC LOGICAL UNITS. IF RECOVERY IS SUCCESSFUL_^1*_'PROCESSING OF REQUEST IS CONTINUED. IF RECOVERY_^1*_'FAILS ERROR LOGGING COMPLETES THE REQUEST._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY€€ POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'RLCTT_^1*_*(A) REGISTER = 0 IF NOISE RECOVERY_^1*_*(A) REGISTER = ERROR CODE IF NON NOISE RECOVERY_^1*_]_^1*_'BKSPRN_^1*_*(A) REGISTER = ALARM BIT STATUS_^1*_]_^1*_'BKREAD_^1*_*(A) REGISTER = ALARM BIT STATUS_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SETS LOW THRESHOLD BIT (BIT 10) OF ESTAT1._^1*_'2. EN€€TERS PROPER VALUE INTO RTRECV,I._^1*_'3. SAVES ERROR CODE IN FLTCOD,I IF NON NOISE RECOVERY._^1*_'4. SETS AND RESETS MODE BIT (BIT 3) OF ESTAT1 WHEN_^1*_*NEEDED FOR 7 TRACK TAPE RECOVERY._^1*_'5. ASSIGNS VALUE 15 FOR SWITCH MODE ERROR CODE._^1*_'6. SETS AND RESETS LOW THRESHOLD READ BIT (BIT 10)_^1*_*OF ESTAT1 DURING READ RECOVERY._^1*_'7. CALLS ALARM ANALYSIS ROUTINE - ALARM._^1*_€€'8. CALLS FILE STATUS ROUTINE - FILEST._^1*_'9. CALLS KERNEL QLCTT ROUTINE TO ISSUE FUNCTION._^1*_'10. INCREMENTS EOT WORD WHEN EOT ENCOUNTERED DURING_^1*_+WRITE RECOVERY._^1*_'11. ASSIGNS VALUE 32 FOR TAPE DEFECT ERROR CODE_^1*_+WHEN WRITE RECOVERY IMPOSSIBLE._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'RLCTT ENTRY - ENTERED FROM NLCTT TO TRY RECOVERY._^1*_'REREAD ENTRY€€ - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER UNIT HAS BEEN SELECTED IN_^1*_6OPPOSITE MODE._^1*_'NOT7TR ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER RESTORING ORIGINAL MODE._^1*_'BKSPRN ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER A RECORD HAS BEEN BACKSPACED._^1*_'BKREAD ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER A RECORD HAS BEEN READ._€€^1*_'EXIT - TO FRSTWD (IN NLCTT) TO REREAD RECORD._^1*_'EXIT - TO SELECT (IN BLCTT) TO SELECT UNIT IN_^1*_.OPPOSITE MODE._^1*_'EXIT - TO SELMOD (IN BLCTT) TO SELECT UNIT IN_^1*_.ORIGINAL MODE._^1*_'EXIT - TO TRNSOK (IN NLCTT) TO CONTINUE REQUEST_^1*_.PROCESSING._^1*_'EXIT - TO FUNCTN (IN NLCTT) TO PERFORM TAPE MOTIONS._^1*_'EXIT - TO FLCTT TO LOG ERROR._^1*_]_^1*_]_^1*_7FLOW_^1*_7-€€---_^1*_]_^1*_'RLCTT_^1*_*1. IF NOT NOISE RECOVERY GO TO NONOIS (5.)._^1*_*2. CALL BACKSPACE SUBROUTINE - BKSPC (32.). ON_^1*_-RETURN SET LOW THRESHOLD BIT (BIT 10) OF ESTAT1._^1*_]_^1*_]_^1*_'REDOIO_^1*_*3. CLEAR RTRECV,I._^1*_*4. LOAD (A) REGISTER FROM FWA AND EXIT TO FRSTWD._^1*_]_^1*_'NONOIS_^1*_*5. SAVE ERROR CODE IN FLTCOD,I._^1*_*6. IF DIAGNOSTIC LOGICAL UNIT GO TO FAILD (31€€.)._^1*_*7. LOAD (Q) REGISTER FROM DELTA AND GO TO START,Q._^1*_]_^1*_'START_^1*_*8. IF WRITE/FWRITE REQUEST GO TO WRTRCV (47.)._^1*_]_^1*_'RDRCV_^1*_*9. ENTER (A) REGISTER THE VALUE 5 AND SAVE IT_^1*_-IN MM._^1*_*10. SAVE (A) REGISTER IN NN AND ENTER THE VALUE 2_^1*_.IN PP._^1*_]_^1*_'REREAD_^1*_*11. CALL BACKSPACE SUBROUTINE - BKSPC (32.). ON_^1*_.RETURN CALL READRC (41.)._^1*_*1€€2. ON NORMAL RETURN GO TO READOK (20.), ELSE_^1*_.CONTINUE._^1*_*13. IF PP LESS THAN 2 GO TO PLSTN2 (16.)._^1*_*14. DECREMENT NN. IF NN NOT ZERO NOW GO TO_^1*_.REREAD (11.)._^1*_*15. IF 9 TRACK TRANSPORT GO TO NOT7TR (23.)._^1*_]_^1*_'PLSTN2_^1*_*16. IF PP EQUALS ZERO GO TO RESTMD (19.)._^1*_*17. DECREMENT PP. IF PP NOT EQUAL TO 1 GO TO_^1*_.REREAD (11.)._^1*_*18. UPDATE RTRECV,I F€€OR RETURN TO REREAD (11.),_^1*_.LOAD (A) REGISTER WITH UNIT SELECT CODE WITH_^1*_.SWITCHED MODE AND EXIT TO SELECT (IN BLCTT)._^1*_]_^1*_'RESTMD_^1*_*19. UPDATE RTRECV,I FOR RETURN TO NOT7TR (23.)_^1*_-AND EXIT TO SELMOD (IN BLCTT)._^1*_]_^1*_'READOK_^1*_*20. IF PP EQUALS 2 CLEAR RTRECV,I AND EXIT TO_^1*_.TRNSOK (IN NLCTT)._^1*_*22. ENTER (A) REGISTER WITH MODE ERROR CODE_^1*_.(=15€€) AND EXIT TO FLCTT TO LOG ERROR._^1*_]_^1*_'NOT7TR_^1*_*23. CLEAR BB._^1*_*24. CALL BACKSPACE SUBROUTINE - BKSPC (32.)._^1*_.ON RETURN IF TAPE AT LOAD POINT GO TO_^1*_.NOMORE (26.)._^1*_*25. INCREMENT BB. IF BB NOT EQUAL TO 4 GO TO_^1*_.(24.)._^1*_]_^1*_'NOMORE_^1*_*26. IF BB EQUALS 1 GO TO LASTRD (28.)._^1*_*27. DECREMENT BB AND CALL READRC (41.).ON RETURN_^1*_.GO TO NOMORE (26.)€€._^1*_]_^1*_'LASTRD_^1*_*28. CALL READRC (41.). ON NORMAL RETURN CLEAR_^1*_.RTRECV,I AND EXIT TO TRNSOK (IN NLCTT)._^1*_.ON ABNORMAL RETURN CONTINUE._^1*_*29. DECREMENT MM. IF MM NOT EQUAL ZERO NOW, ENTER_^1*_.(A) REGISTER THE VALUE 5 AND GO TO (10.)._^1*_*30. REVERSE LOW THRESHOLD READ BIT (BIT 10) OF_^1*_.ESTAT1. IF BIT NOW SET GO TO RDRCV (9.)._^1*_]_^1*_'FAILD_^1*_*31. LOAD (A)€€ REGISTER FROM FLTCOD,I AND EXIT_^1*_.TO FLCTT TO LOG ERROR._^1*_]_^1*_'BKSPC_^1*_*32. UPDATE RTRECV,I FOR RETURN TO BKSPRN (35.)._^1*_]_^1*_'CODE_^1*_]_^1*_*33. ENTER (A) REGISTER THE VALUE 4 (BACKSPACE_^1*_.FUNCTION CODE)._^1*_*34. EXIT TO FUNCTN (IN NLCTT)._^1*_]_^1*_'BKSPRN_^1*_*35. RESTORE CODE (33.) TO ENABLE BACKSPACE ON_^1*_.NEXT CALL OF BKSPC._^1*_*36. IF (A) REGISTER EQUA€€LS ZERO (NO ALARM) RETURN_^1*_.TO CALLER OF BKSPC (32.)._^1*_*37. IF UNIT NOT READY ENTER (A) REGISTER THE VALUE_^1*_.14 (ERROR CODE) AND EXIT TO FLCTT TO LOG ERROR._^1*_*38. CALL FILEST (EXTERNAL) TO GET ALARM STATUS._^1*_*39. ON RETURN IF NO FATAL ERRORS RETURN TO CALLER_^1*_.OF BKSPC (32.)._^1*_*40. ENTER (A) REGISTER THE VALUE 2 (ALARM ERROR_^1*_.CODE) AND EXIT TO FLCTT TO LOG €€ERROR._^1*_]_^1*_'READRC_^1*_*41. UPDATE RTRECV,I FOR RETURN TO BKREAD (42.)_^1*_.AND GO TO (4.)._^1*_]_^1*_'BKREAD_^1*_*42. IF (A) REGISTER EQUALS ZERO (NO ALARM) RETURN_^1*_.TO CALLER OF READRC (41.)._^1*_*43. UPDATE DELTA FOR RETURN TO RETRN (45.) AND_^1*_.CALL ALARM (EXTERNAL)._^1*_*44. ON NORMAL RETURN GO TO (46.)._^1*_]_^1*_'RETRN_^1*_*45. INCREMENT RETURN ADDRESS IN READRC (€€41.)._^1*_*46. CLEAR DELTA AND RETURN TO CALLER OF_^1*_.READRC (41.)._^1*_]_^1*_]_^1*_]_^1*_'WRTRCV_^1*_*47. CALL FILEST (EXTERNAL) TO GET BLOCK LENGTH_^1*_.STATUS._^1*_*48. ON RETURN SAVE THE NUMBER OF WORDS ALREADY_^1*_.WRITTEN IN TEMP._^1*_*49. CALL QLCTT TO LOAD BLOCK LENGTH._^1*_*50. ON RETURN CHANGE CONTENT OF CODE (33.) TO_^1*_.ENABLE CONTROLLED BACKSPACE ON CALL OF_^1*_.BKS€€PC (32.)._^1*_*51. CALL BKSPC (32.) AND ON RETURN CALL QLCTT_^1*_.TO LOAD BLOCK LENGTH KEPT IN TEMP._^1*_*52. ON RETURN CHANGE CONTENT OF CODE (33.) TO_^1*_.ENABLE VARIABLE ERASE ON CALL OF BKSPC (32.)._^1*_*53. CALL BKSPC (32.) AND ON RETURN INCREMENT_^1*_.EOT IF END OF TAPE ENCOUNTERED._^1*_*54. INCREMENT ERSCNT._^1*_*55. IF ERSCNT LESS THAN $100 GO TO REDOIO (3.)._^1*_*56. LOAD €€(A) REGISTER WITH TAPE DEFECT ERROR_^1*_.CODE (32) AND EXIT TO FLCTT TO LOG ERROR._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'QLCTT - KERNEL FUNCTION SUBROUTINE_^1*_'FILEST - FILE STATUS ROUTINE_^1*_'ALARM - ALARM ANALYSIS ROUTINE_^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$RLCTT_^1_(ENT_$DELTA_,RETURN CORRECTION FOR ALARM IN RECOV_^1_(ENT_$ERSCNT_+€€ERASE COUNT_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#FLCTT_,KERNEL FAULT ENTRY_^1_(EXT*_#FWA_.FIRST WORD ADDRESS WORD_^1_(EXT*_#FRSTWD_+FIRST WORD ADDRESS FUNCTION ENTRY_^1_(EXT*_#FUNCTN_+DIRECTOR FUNCTION ENTRY_^1_(EXT_$CNTINU_+BASE ADDRESS FOR RECOVERY RETURN_^1_(EXT*_#FILEST_+FILE STATUS SUBROUTINE_^1*_]_^1*_]_^1_(EQU_$DIAG(0)_^1_(IFA_$DIAG,E€€Q,0_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#TRNSOK_+RECOVERED ERROR ENTRY_^1_(EXT*_#SELECT_+UNIT SELECT FUNCTION ENTRY_^1_(EXT*_#SELMOD_+MODE SELECT ENTRY_^1_(EXT*_#NUMBR_,NUMBER OF WORDS TO TRANSFER WORD_^1_(EXT*_#EOT_.END OF TAPE WORD_^1_(EXT*_#ALARM_,ALARM ANALYSIS SUBROUTINE_^1_(EIF_^1*_]_^1*_]_^1€€_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$ONEBIT($23)_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5€€)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MAS€€SEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER€€ INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_€€+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1*_]_^1*_]_^1_(EJT_^1*_]_^1****_]_^1*_7*********_^1*_7* RLCTT *_^1*_7*********_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRES€€S IN (I) REGISTER_^1* AND (A) REGISTER = 0 IF NOISE RECOVERY_^1*_#(A) REGISTER = ERROR CODE IF NON NOISE RECOVERY_^1*_]_^1RLCTT_"SAZ_$1_0SKIP IF NOISE RECOVERY_^1_(JMP*_#NONOIS_+PROCESS NON NOISE RECOVERY_^1_(RTJ*_#BKSPC_,BACKSPACE ONE RECORD_^1_(LDA-_#ESTAT1,I_)SET LOW THRESHOLD READ BIT_^1_(ADD-_#ONEBIT+10_^1_(STA-_#ESTAT1,I_^1REDOIO_!ENQ_$0_0CLEAR RETURN FOR RECOVERY_^1_(STQ-_#R€€TRECV,I_^1_(LDA_$FWA_.PERFORM I/O ANEW_^1_(JMP_$FRSTWD_^1_(IFA_$DIAG,EQ,1_^1NONOIS_!JMP*_#UNRCVD_^1ERSCNT NUM 0_^1DELTA NUM 0_^1_(EIF_^1_(IFA_$DIAG,EQ,0_^1NONOIS_!STA-_#FLTCOD,I_)SAVE ERROR CODE_^1_(LDA-_#ELU,I_,IS DIAGNOSTIC LOGICAL UNIT_^1_(EOR-_#DIAGLU,I_^1_(SAN_$1_0SKIP IF NOT DLU_^1_(JMP*_#FAILD_,LOG THE ERROR_^1_(LDA-_#RFLAG,I_*IS RECOVERY ENABLED?_^1_(SAP_$1_0YES,SKIP_^1_€€(JMP*_#FAILD_,NO,LOG ERROR_^1_(LDQ*_#DELTA_^1_(JMP*_#START,Q_*CONTINUE_^1START_"LDA-_#ESTAT1,I_)READ OR WRITE_^1_(AND-_#ONEBIT+0_^1_(SAZ_$RDRCV_,SKIP IF READ RECOVERY_^1_(JMP_$WRTRCV_^1RDRCV_"ENA_$5_0INITIALIZE RECOVERY COUNTERS_^1_(STA-_#0_^1MM_%NUM_$0_0RETRY COUNT_^1_(STA-_#0_^1NN_%NUM_$0_0REREAD COUNT_^1_(ENA_$2_^1_(STA-_#0_^1PP_%NUM_$0_0OPPOSITE MODE RETRY COUNT_^1REREAD_!RTJ*_€€#BKSPC_,BACKSPACE ONE RECORD_^1_(RTJ*_#READRC_+REREAD_^1_(JMP*_#READOK_+READ OK, FINISH RECOVERY_^1_(LDQ*_#PP_/WAS MODE CHANGED_^1_(INQ_$-2_^1_(SQZ_$1_0SKIP IF MODE UNCHANGED_^1_(JMP*_#PLSTN2_+HANDLE REREAD IN CHANGED MODE_^1_(LDQ*_#NN_/DECREMENT REREAD COUNT_^1_(INQ_$-1_^1_(STQ*_#NN_^1_(SQZ_$1_0SKIP IF TRIED ENOUGH_^1_(JMP*_#REREAD_+REREAD ONCE MORE_^1_(LDA-_#ESTAT1,I_)7 OR 9 TRAC€€K_^1_(AND-_#ONEBIT+9_^1_(SAN_$1_0SKIP IF 7 TRACK TRANSPORT_^1_(JMP*_#NOT7TR_^1PLSTN2_!LDQ*_#PP_/IS OPPOSITE MODE RETRY OVER_^1_(SQN_$1_0SKIP IF NOT_^1_(JMP*_#RESTMD_+RESTORE MODE_^1_(INQ_$-1_/DECREMENT OPPOSITE MODE RETRY COUNT_^1_(STQ*_#PP_^1_(INQ_$-1_/WAS OPPOSITE MODE SELECTED_^1_(SQZ_$1_0SKIP IF OPPOSITE MODE TO SELECT_^1_(JMP*_#REREAD_+REREAD_^1_(LDA_$=XREREAD_)UPDATE RECOVERY€€ RETURN_^1_(SUB_$=XCNTINU_^1_(STA-_#RTRECV,I_^1_(LDA-_#ESTAT1,I_)SWITCH MODE_^1_(AND-_#ONEBIT+3_^1_(TRA_$Q_^1_(CLR_$A_^1_(SQN_$1_^1_(LDA-_#ONEBIT+13_^1_(ADD-_#UNTMOD,I_^1_(JMP_$SELECT_+SELECT UNIT_^1RESTMD_!LDA_$=XNOT7TR_)UPDATE RECOVERY RETURN_^1_(SUB_$=XCNTINU_^1_(STA-_#RTRECV,I_^1_(JMP_$SELMOD_+SELECT UNIT WITH ORIGINAL MODE_^1READOK_!LDQ*_#PP_/WAS MODE CHANGED_^1_(INQ_$-2_^1_(S€€QN_$3_0SKIP IF OPPOSITE MODE_^1RECVRD_!STA-_#RTRECV,I_)CLEAR RECOVERY RETURN WORD_^1_(RAO-_#RCNTFG,I_)INDEX RECOVERY COUNT_^1_(JMP_$TRNSOK_+CONTINUE DATA TRANSFER_^1_(ENA_$86_/MODE ERROR CODE TO A_^1_(JMP*_#UNRCVD_+LOG THE ERROR_^1NOT7TR_!ENA_$0_0CLEAR BACKSPACE COUNTER_^1_(STA-_#0_^1BB_%NUM_$0_0BACKSPACE COUNT_^1_(RTJ*_#BKSPC_,BACKSPACE ONE RECORD_^1_(LDA-_#TRNSPT,I_)IS TAPE AT LO€€AD POINT_^1_(AND-_#ONEBIT+9_^1_(SAN_$NOMORE_+SKIP IF TAPE AT LOAD POINT_^1_(RAO*_#BB_/INCREMENT BACKSPACE COUNT_^1_(LDA*_#BB_/MORE TO BACKSPACE_^1_(INA_$-4_^1_(SAZ_$NOMORE_+SKIP IF ALREADY 3 BACKSPACES_^1_(JMP*_#BB+1_-BACKSPACE ONCE MORE_^1NOMORE_!LDA*_#BB_/IS NEXT RECORD BAD ONE_^1_(INA_$-1_^1_(SAZ_$LASTRD_+SKIP IF NEXT RECORD TO RECOVER_^1_(STA*_#BB_^1_(RTJ*_#READRC_+READ RECORD_€€^1_(NOP_$0_^1_(JMP*_#NOMORE_+CHECK HEAD POSITIONING_^1LASTRD_!RTJ*_#READRC_+READ THE RECORD_^1_(JMP*_#RECVRD_+READ OK, RECOVERY SUCCESFUL_^1_(LDA*_#MM_/RETRIED ENOUGH?_^1_(INA_$-1_^1_(STA*_#MM_^1_(SAZ_$2_0SKIP IF RETRIED ENOUGH_^1_(ENA_$5_0RETRY AGAIN_^1_(JMP*_#MM+1_^1_(LDA-_#ESTAT1,I_)CHANGE LOW THRESHOLD READ BIT_^1_(EOR-_#ONEBIT+10_^1_(STA-_#ESTAT1,I_^1_(AND-_#ONEBIT+10_(WAS LOW€€ THRESHOLD READ ALREADY USED?_^1_(SAZ_$1_0SKIP IF YES_^1_(JMP*_#RDRCV_,TRY RECOVERY WITH LOW THRESHOLD READ_^1FAILD_"LDA-_#FLTCOD,I_)READ IRRECOVERABLE,LOG THE ERROR_^1_(JMP*_#UNRCVD_^1DELTA_"NUM_$0_0RETURN CORRECTION FOR ALARM IN RECOV_^1_(EIF_^1*_]_^1*_]_^1* BACKSPACE RECORD ROUTINE_^1*_]_^1BKSPC_"NUM_$0_^1_(LDA_$=XBKSPRN_)UPDATE RETURN FOR RECOVERY_^1_(SUB_$=XCNTINU_^1_(STA-_#RT€€RECV,I_^1CODE_#ENA_$4_0BACKSPACE ONE RECORD_^1_(JMP_$FUNCTN_^1BKSPRN_!LDQ_$=N$A04_+RESTORE BACKSPACE CAPABILITY_^1_(STQ*_#CODE_^1_(SAN_$1_0SKIP IF ALARM_^1_(JMP*_#(BKSPC)_*RETURN TO CALLER_^1_(LDA-_#ESTAT2,I_)IS UNIT READY ?_^1_(AND-_#ONEBIT+0_^1_(SAN_$2_0SKIP IF UNIT READY_^1_(ENA_$14_/UNIT NOT READY,ERROR CODE=14_^1_(JMP*_#UNRCVD_+LOG THE ERROR_^1_(ENA_$10_/GET ALARM STATUS_^1_(R€€TJ_$FILEST_^1_(AND_$=N$D0_,ANY FATAL ERRORS_^1_(SAN_$1_0SKIP IF FATAL ERRORS_^1_(JMP*_#(BKSPC)_*RETURN TO CALLER_^1_(ENA_$2_0LOG ALARM,ERROR CODE=2_^1UNRCVD_!JMP_$FLCTT_^1_(IFA_$DIAG,EQ,0_^1*_]_^1*_]_^1* READ RECORD ROUTINE_^1*_]_^1READRC_!NUM_$0_^1_(LDA_$=XBKREAD_)UPDATE RETURN FOR RECOVERY_^1_(SUB_$=XCNTINU_^1_(STA-_#RTRECV,I_^1_(JMP_$REDOIO+2_)REDO I/O_^1BKREAD_!SAZ_$BACK_-SKIP €€IF NO ALARM_^1_(LDA_$=XRETRN-START_#UPDATE RETURN FOR ALARM_^1_(STA*_#DELTA_^1_(RTJ_$ALARM_,ANALYSE ALARM CAUSE_^1_(JMP*_#RETRN+1_*RECOVERED_^1RETRN_"RAO*_#READRC_+NOT RECOVERED_^1_(CLR_$A_0CLEAR RETURN FOR ALARM_^1_(STA*_#DELTA_^1BACK_#JMP*_#(READRC)_)RETURN TO CALLER_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1WRTRCV_!ENA_$8_0GET BLOCK LENGTH STATUS_^1_(RTJ_$FILEST_^1_(SAM_$1_^1_(INA_€€$1_^1_(INA_$0_^1_(SUB_$NUMBR_,GET NUMBER OF WORDS ALREADY WRITTEN_^1_(TCA_$A_^1_(STA-_#0_0SAVE IT_^1TEMP_#NUM_$0_^1_(ENQ_$6_0BLOCK LENGTH TO CONTROLLER_^1_(RTJ_$QLCTT_^1_(LDA_$=N$A0A_+ENABLE CONTROLLED BACKSPACE_^1_(STA*_#CODE_^1_(RTJ*_#BKSPC_,PERFORM CONTROLLED BACKSPACE_^1_(LDA*_#TEMP_-NUMBER OF WORDS TO A_^1_(ENQ_$6_0BLOCK LENGTH TO CONTROLLER_^1_(RTJ_$QLCTT_^1_(LDA_$=N$A09_+ENA€€BLE VARIABLE ERASE_^1_(STA*_#CODE_^1_(RTJ*_#BKSPC_,PERFORM VARIABLE ERASE_^1_(LDA-_#ESTAT2,I_)WAS EOT ENCOUNTERED_^1_(AND-_#ONEBIT+9_^1_(SAZ_$2_0SKIP IF EOT NOT ENCOUNTERED_^1_(RAO_$EOT_.INCREMENT EOT WORD_^1_(RAO-_#0_0INCREMENT ERASE COUNT_^1ERSCNT_!NUM_$0_0ERASE COUNTER_^1_(LDA-_#ONEBIT+8_)NUMBER OF ERASES TOO HIGH?_^1_(SUB*_#ERSCNT_^1_(SAN_$2_0SKIP IF NUMBER OF ERASES ACCEPTABLE€ž_^1_(ENA_$32_/TAPE DEFECT,ERROR CODE=32_^1_(JMP*_#UNRCVD_+LOG THE ERROR_^1_(RAO-_#RCNTFG,I_)INDEX RECOVERY COUNT_^1_(JMP_$REDOIO_+REDO I/O_^1_(EIF_^1_(END_^__žPS18326 CSY/ D60 P€1_%NAM S18326_'DECK-ID D60 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$LCTT DRIVER - SEVEN TRACK TAPE PACK/UNPACK ROUTINES_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*E_]_^1*_7LCTT 7 TRACK HANDLER_^1*_7********************_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT €€7 TRACK HANDLER SUPPLIES PACK AND UNPACK_^1*_'PROCEDURES FOR DATA TRANSFER ON 7 TRACK TAPE_^1*_'TRANSPORT._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE CONTROLS SPLITTING OF REQUEST ACCORDING_^1*_'TO DRIVER BUFFER. WHEN ASCII MODE DATA IS CONVERTED_^1*_'TO BCD IF WRITE AND FROM BCD IF READ. WHEN BINARY_^1*_'MODE DATA IS UNPACKED IF WRITE AND€€ PACKED IF READ._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'SEVNRD_^1*_*(A) REGISTER = CURRENT WORD ADDRESS_^1*_*(Q) REGISTER = ESTAT1 6 LEFT SHIFTED_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. UPDATES ECCOR,I AND QSTWD4,I._^1*_'2. CALLS COMPV4 FOR 16 BIT ARITHMETIC._^€€1*_'3. ON RETURN TO CALLER OF SEVENT (A) REGISTER_^1*_*CONTAINS BLOCK LENGTH FOR NEXT TRANSFER._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. SEVENT ENTRY - ENTERED BY RETURN JUMP FROM NLCTT._^1*_'2. SEVNRD ENTRY - ENTERED BY RETURN JUMP FROM NLCTT._^1*_'3. EXIT - TO NLCTT (CALLING ROUTINE)._^1*_]_^1*_]_^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'SEVENT_^1*_*1. IF REQUES€€T NEEDS NO SPLITTING GO TO NUMOK (3.)._^1*_*2. CALCULATE BLOCK LENGTH FOR NEXT TRANSFER._^1*_]_^1*_'NUMOK_^1*_*3. SAVE BLOCK LENGTH IN NUMBR._^1*_*4. IF ASCII MODE GO TO ASCII (6.)._^1*_*5. CALCULATE PACK/UNPACK BUFFER SIZE AND UPDATE_^1*_-NUMBR ACCORDINGLY._^1*_]_^1*_'ASCII_^1*_*6. IF WRITE/FWRITE REQUEST GO TO (8.)._^1*_]_^1*_'EXIT_^1*_*7. LOAD (A) REGISTER FROM NUMBR AND EXIT TO€€_^1*_-CALLER OF SEVENT._^1*_*8. SAVE LAST WORD ADDRESS (IN DRIVER BUFFER)_^1*_-IN LWA._^1*_*9. IF BINARY MODE CALL UNPK SUBROUTINE AND ON_^1*_-RETURN GO TO EXIT (7.)._^1*_)10. CALL ASCBCD SUBROUTINE AND ON RETURN GO TO_^1*_-EXIT (7.)._^1*_]_^1*_]_^1*_'UNPK_^1*_*UNPACK USER DATA INTO DRIVER BUFFER AND_^1*_*RETURN TO CALLER._^1*_]_^1*_]_^1*_'ASCBCD_^1*_*CONVERT USER DATA INTO DRIVER €€BUFFER FROM_^1*_*ASCII CODE TO BCD CODE AND RETURN TO CALLER._^1*_]_^1*_]_^1*_'SEVNRD_^1*_*1. SAVE (A) REGISTER IN LWA._^1*_*2. IF ASCII MODE CALL BCDASC SUBROUTINE AND_^1*_-ON RETURN GO TO (4.)._^1*_*3. CALL PACK SUBROUTINE AND CONTINUE ON RETURN._^1*_*4. IF FORMATTED READ RETURN TO CALLER OF SEVNRD._^1*_*5. IF NO MORE TO READ RETURN TO CALLER OF SEVNRD._^1*_*6. SAVE NUMBER OF WOR€€DS LEFT TO READ IN QSTWD4,I_^1*_-AND GO TO SEVENT._^1*_]_^1*_]_^1*_'PACK_^1*_*PACK DATA IN DRIVER BUFFER INTO USER BUFFER_^1*_*AND RETURN TO CALLER._^1*_]_^1*_]_^1*_'BCDASC_^1*_*CONVERT DATA IN DRIVER BUFFER FROM BCD TO_^1*_*ASCII INTO USER BUFFER AND RETURN TO CALLER._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$SEVENT_^1_(ENT_$SEVNRD_+7 TRACK READ HANDLER ENTRY_€€^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT_$COMPV4_+16 BIT ADDRESS SUBTRACTION ROUTINE_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_'LOW CORE EQUATES_^1*_]_^1_(EQU_$LPMASK(2)_^1_(EQU_$NZERO($12)_^1_(EQU_$ZERO($22)_^1_(EQU_$ONEBIT($23)_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH €€PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVE€€R STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'G€€HOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$CPVLOC(24)_'CONTROL POINT LOCATION_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^€€1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_(EQU_$UNTMOD(28)_'UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(E€€QU_$TRNSPT(35)_'TRANSPORT STATUS_^1_(EQU_$ELINK(36)_(NEXT UNIT PDT_^1*_]_^1*_]_^1*_'ADDITIONAL EQUIVALENTS_^1*_]_^1_(EQU_$NOISLN(2)_^1*_]_^1_(EJT_^1*_]_^1****_]_^1*_]_^1*_7**********_^1*_7* SEVENT *_^1*_7**********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1SEVENT_!NUM_$0_^1_(LDA-_#PHSREC,I_)IS TRANSFER LENGTH < PHYSICAL RECORD_^1_(LDQ-_#QSTWD4,I_^1_(RTJ_$COMP€€V4_^1_(SAP_$NUMOK_,SKIP IF LENGTH OK_^1_(LDA-_#QSTWD4,I_)SPLIT TRANSFER_^1_(ENQ_$0_^1_(DVI-_#PHSREC,I_^1_(INQ_$-NOISLN-1_^1_(LDA-_#ESTAT1,I_^1_(AND-_#ONEBIT+1_^1_(SAZ_$1_^1_(ENQ_$1_^1_(LDA-_#PHSREC,I_^1_(SQP_$1_^1_(INA_$-NOISLN_^1_(JMP*_#NUMOK+1_^1NUMOK_"LDA-_#QSTWD4,I_^1_(STA*_#NUMBR_,SAVE ACTUAL TRANSFER LENGTH_^1_(LDA-_#ESTAT1,I_)ASCII /BINARY_^1_(AND-_#ONEBIT+3_^1_(SAN_$ASCII_,€€SKIP IF ASCII MODE_^1_(LDA*_#NUMBR_,COMPUTE SIZE OF PACK/UNPACK BUFFER_^1_(MUI-_#ONEBIT+2_^1_(DVI-_#LPMASK+2_^1_(SQZ_$1_^1_(INA_$1_^1_(STA*_#NUMBR_,SAVE SIZE_^1ASCII_"LDA-_#ESTAT1,I_)READ/WRITE_^1_(AND-_#ONEBIT+0_^1_(SAN_$WRITE_,SKIP IF WRITE REQUEST_^1EXIT_#LDA-_#0_0NUMBER OF WORDS TO A_^1NUMBR_"NUM_$0_^1_(JMP*_#(SEVENT)_)RETURN TO CALLER_^1WRITE_"LDQ-_#ABUFF,I_*SAVE LAST BUFFER W€€ORD+1_^1_(ADQ*_#NUMBR_^1_(STQ_$LWA_^1_(LDA-_#ESTAT1,I_)ASCII/BINARY_^1_(AND-_#ONEBIT+3_^1_(SAN_$WRTASC_+SKIP IF ASCII_^1_(RTJ*_#UNPK_-UNPACK_^1_(JMP*_#EXIT_-RETURN TO CALLER_^1WRTASC_!RTJ*_#ASCBCD_+CONVERT ASCII TO BCD_^1_(JMP*_#EXIT_-RETURN TO CALLER_^1*_]_^1*_]_^1* UNPACK USER DATA_^1*_]_^1UNPK_#NUM_$0_0BINARY DISASSEMBLY_^1_(LDA-_#ABUFF,I_*INITIALIZE CURRENT WORD TO UNPACK_^1_(S€€TA_$CURR_^1_(CLR_$Q_^1NXTCYC_!RTJ*_#GETFST_+GET CURRENT WORD TO UNPACK_^1_(LLS_$6_^1_(QLS_$2_^1_(LLS_$6_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(LLS_$4_^1_(RTJ*_#GETFST_+GET NEXT WORD_^1_(LLS_$2_0UNPACK_^1_(QLS_$2_^1_(LLS_$6_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(LLS_$6_^1_(QLS_$2_^1_(LLS_$2_^1_(RTJ*_#GETFST_+GET NEXT WORD_^1_(LLS_$4_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(LL€€S_$6_^1_(QLS_$2_^1_(LLS_$6_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(JMP*_#NXTCYC_+CONTINUE UNPACKING_^1GETFST_!NUM_$0_^1_(STQ*_#QSAV_-SAVE Q_^1_(LDA-_#ELSTWD,I_)MORE WORDS TO UNPACK ?_^1_(SUB-_#ECCOR,I_^1_(SAN_$1_0SKIP IF MORE WORDS TO UNPACK_^1_(JMP*_#(GETFST)_)RETURN TO CALLER (A=0)_^1_(LDQ-_#ECCOR,I_*GET NEXT WORD_^1_(LDA-_#(ZERO),Q_^1_(LDQ-_#0_0RESTORE Q_^1QSAV_#NUM_$0_^1_(RAO€€-_#ECCOR,I_*TALLY CURRENT WORD_^1_(JMP*_#(GETFST)_)RETURN TO CALLER_^1STRDAT_!NUM_$0_^1_(STQ*_#(CURR)_+STORE UNPACKED DATA_^1_(TRA_$Q_^1_(RAO*_#CURR_-MORE WORDS TO UNPACK ?_^1_(LDA*_#CURR_^1_(EOR*_#LWA_^1_(SAN_$CURNOT_+SKIP IF MORE TO UNPACK_^1_(JMP*_#(UNPK)_+DISASSEMBLY COMPLETE,RETURN TO CALLE_^1CURNOT_!TRQ_$A_^1_(CLR_$Q_^1_(JMP*_#(STRDAT)_)CONTINUE UNPACKING_^1*_]_^1*_]_^1* CONV€€ERT ASCII TO BCD_^1*_]_^1ASCBCD_!NUM_$0_0ASCII TO BCD CONVERSION_^1_(LDA-_#ABUFF,I_*INITIALIZE CURRENT WORD TO CONVERT_^1_(STA*_#CURR_^1ASCLOP_!LDQ-_#ECCOR,I_*TRANSFER USER BUFFER TO DRIVER BUFFE_^1_(LDA-_#(ZERO),Q_^1_(STA*_#(CURR)_^1_(RAO-_#ECCOR,I_^1_(RAO*_#CURR_^1_(LDA*_#CURR_^1_(EOR*_#LWA_^1_(SAZ_$1_^1_(JMP*_#ASCLOP_^1_(LDQ*_#NUMBR_,CONVERT ASCII TO BCD IN DRIVER BUFFE_^1_(LDA-€€_#ABUFF,I_*SAVE STARTING ADDRESS OF BUFFER_^1_(STA*_#BUFFER_^1_(LDA-_#I_0SAVE I_^1_(STA*_#SAVEI_^1LOOPA_"ENA_$$7F_.MASK TO A_^1_(INQ_$-1_/DECREMENT Q_^1_(SQP_$CONVA_,SKIP IF MORE TO CONVERT_^1_(LDA*_#SAVEI_,RESTORE I_^1_(STA-_#I_^1_(JMP*_#(ASCBCD)_)RETURN TO CALLER_^1CONVA_"STQ-_#I_0SET UP I AS BUFFER INDEX_^1_(LDQ*_#(BUFFER),I_'GET WORD FROM BUFFER_^1_(LAQ_$Q_0MASK TO GET LOWER CH€€ARACTER_^1_(RTJ*_#LIMCK_,ASSURE CHARACTER BETWEEN 20 AND 5F_^1_(LDQ*_#TABLE,Q_*GET BCD CODE-ASCII CODE IS INDEX_^1_(LAQ_$Q_0MASK TO GET BCD CODE_^1_(STQ*_#TEMP_-SAVE 1ST CODE_^1_(LDQ*_#(BUFFER),I_'GET WORD FROM BUFFER_^1_(QLS_$8_0SHIFT UPPER CHARACTER INTO POSITION_^1_(LAQ_$Q_0MASK TO GET CHARACTER_^1_(RTJ*_#LIMCK_,ASSURE CHARACTER VALID_^1_(LDQ*_#TABLE,Q_*GET BCD CODE_^1_(LAQ_$A_^€€1_(ALS_$8_0SHIFT CODE TO UPPER HALF_^1_(ADD*_#TEMP_-ADD LOWER CODE_^1_(STA*_#(BUFFER),I_'STORE CONVERTED CODE BACK INTO BUFFE_^1_(LDQ-_#I_0GET I_^1_(JMP*_#LOOPA_,LOOP BACK FOR NEXT WORD IN BUFFER_^1LIMCK_"NUM_$0_^1_(INQ_$-$20_^1_(SQP_$1_0SKIP IF NOT 0-1F_^1_(ENQ_$0_0SET TO 20 FOR SPACE_^1_(INQ_$-$40_^1_(SQM_$1_0SKIP IF NOT 60-7F_^1_(ENQ_$-$40_-SET TO 20 FOR SPACE_^1_(INQ_$$60_.REST€€ORE ORIGINAL CHARACTER_^1_(INA_$-$40_-MAKE 3F MASK_^1_(LAQ_$Q_0TRUNCATE Q TO 6 BITS_^1_(INA_$$40_.RESTORE 7F MASK_^1_(JMP*_#(LIMCK)_^1************************************************************************_^1*_]_^1*_+THE FOLLOWING TABLE IS USED TO CONVERT CODES FROM_^1*_/1. TELETYPE ASCII TO EXTERNAL BCD_^1*_12. EXTERNAL BCD TO TELETYPE ASCII_^1*_BBCD TO ASCII **_!ASCII TO B€€CD_^1*_P**_^1TABLE_"NUM_$$261F_,00_#3A_#**_^1_(NUM_$$3131_,01 1 31_#**_#41 A 31_^1_(NUM_$$3232_,02 2 32_#**_#42 B 32_^1_(NUM_$$3333_,03 3 33_#**_#43 C 33_^1_(NUM_$$3434_,04 4 34_#**_#44 D 34_^1_(NUM_$$3535_,05 5 35_#**_#45 E 35_^1_(NUM_$$3636_,06 6 36_#**_#46 F 36_^1_(NUM_$$3737_,07 7 37_#**_#47 G 37_^1_(NUM_$$3838_,08 8 38_#**_#48 H 38_^1_(NUM_$$393€€9_,09 9 39_#**_#49 I 39_^1_(NUM_$$3021_,0A 0 30_#**_#4A J 21_^1_(NUM_$$3D22_,0B = 3D_#**_#4B K 22_^1_(NUM_$$2723_,0C_#27_#**_#4C L 23_^1_(NUM_$$3A24_,0D_#26 (3A)**_#4D M 24_^1_(NUM_$$3E25_^1_(NUM_$$2226_^1_(NUM_$$2027_,10 SPACE 20_!**_#50 P 27_^1_(NUM_$$2F28_,11 / 2F_#**_#51 Q 28_^1_(NUM_$$5329_,12 S 53_#**_#52 R 29_^1_(NUM_$$5412_,13 T 54_#**_#53 S 12€€_^1_(NUM_$$5513_,14 U 55_#**_#54 T 13_^1_(NUM_$$5614_,15 V 56_#**_#55 U 14_^1_(NUM_$$5715_,16 W 57_#**_#56 V 15_^1_(NUM_$$5816_,17 X 58_#**_#57 W 16_^1_(NUM_$$5917_,18 Y 59_#**_#58 X 17_^1_(NUM_$$5A18_,19 Z 5A_#**_#59 Y 18_^1_(NUM_$$5F19_^1_(NUM_$$2C3D_^1_(NUM_$$281E_^1_(NUM_$$252D_^1_(NUM_$$5C2F_^1_(NUM_$$401A_^1_(NUM_$$2D10_,20 - 2D_#**_#20 SPACE 10_^1_(€€NUM_$$4A2A_,21 J 4A_#**_#21_#2A_^1_(NUM_$$4B0F_^1_(NUM_$$4C3F_^1_(NUM_$$4D2B_,24 M 4D_#**_#24 $ 2B_^1_(NUM_$$4E1D_^1_(NUM_$$4F1D_^1_(NUM_$$500C_,27 P 50_#**_#27_#0C_^1_(NUM_$$511C_,28 Q 51_#**_#28 ( 1C_^1_(NUM_$$523C_,29 R 52_#**_#29 ) 3C_^1_(NUM_$$212C_,2A_#21_#**_#2A * 2C_^1_(NUM_$$2430_,2B $ 24_#**_#2B + 30_^1_(NUM_$$2A1B_,2C * 2A_#**_#2C , 1B_^1_(NUM_$€€$5D20_^1_(NUM_$$3B3B_^1_(NUM_$$5E11_^1_(NUM_$$2B0A_^1_(NUM_$$4101_,31 A 41_#**_#31 1 01_^1_(NUM_$$4202_,32 B 42_#**_#32 2 02_^1_(NUM_$$4303_,33 C 43_#**_#33 3 03_^1_(NUM_$$4404_,34 D 44_#**_#34 4 04_^1_(NUM_$$4505_,35 E 45_#**_#35 5 05_^1_(NUM_$$4606_,36 F 46_#**_#36 6 06_^1_(NUM_$$4707_,37 G 47_#**_#37 7 07_^1_(NUM_$$4808_,38 H 48_#**_#38 8 08_^1_(N€€UM_$$4909_,39 I 49_#**_#39 9 09_^1_(NUM_$$3F0D_^1_(NUM_$$2E2E_^1_(NUM_$$293E_^1_(NUM_$$5B0B_^1_(NUM_$$3C0E_^1_(NUM_$$233A_^1*_]_^1CURR_#NUM_$0_^1LWA_$NUM_$0_^1BUFFER_!NUM_$0_0ADDRESS OF BUFFER_^1SAVEI_"NUM_$0_0TEMPORARY STORAGE OF I_^1TEMP_#NUM_$0_0TEMPORARY STORAGE OF PARTIAL CONVERS_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* CURRENT WORD ADDRESS IN (A)€€ REGISTER AND_^1* ESTAT1 6 LEFT SHIFTED IN (Q) REGISTER_^1*_]_^1SEVNRD_!NUM_$0_^1_(STA*_#LWA_.SAVE LAST WORD ADDRESS IN DRIVER BUF_^1_(QLS_$6_0ASCII/BINARY_^1_(SQM_$RDASC_,SKIP IF ASCII MODE_^1_(RTJ*_#PACK_-PACK_^1_(JMP*_#RDASC+1_^1RDASC_"RTJ*_#BCDASC_+CONVERT BCD TO ASCII_^1_(LDA-_#ESTAT1,I_)FORMATTED/UNFORMATTED_^1_(AND-_#ONEBIT+1_^1_(SAZ_$1_0SKIP IF UNFORMATTED READ_^1_(JMP*_#(S€€EVNRD)_)COMPLETE THE REQUEST_^1_(LDA-_#ELSTWD,I_)MORE TO READ ?_^1_(LDQ-_#ECCOR,I_^1_(RTJ_$COMPV4_^1_(SAN_$1_0SKIP IF MORE TO READ_^1_(JMP*_#(SEVNRD)_)COMPLETE THE REQUEST_^1_(STA-_#QSTWD4,I_)SAVE REST OF WORDS TO READ_^1_(JMP_$SEVENT+1_)CONTINUE PROCESSING THE REQUEST_^1*_]_^1*_]_^1* PACK DATA INTO USER BUFFER_^1*_]_^1PACK_#NUM_$0_^1_(LDA-_#ABUFF,I_*INITIALIZE CURRENT WORD TO PACK€€_^1_(STA*_#CURR_^1NXTGET_!RTJ*_#GETFWA_+GET CURRENT WORD TO PACK_^1_(CLR_$Q_^1_(LLS_$8_^1_(ALS_$2_^1_(LLS_$6_^1_(RTJ*_#GETFWA_+GET NEXT WORD_^1_(ALS_$2_^1_(LLS_$4_^1_(RTJ*_#STRFST_+STORE PACKED DATA_^1_(LLS_$2_^1_(ALS_$2_^1_(LLS_$6_^1_(RTJ*_#GETFWA_+GET NEXT WORD_^1_(ALS_$2_^1_(LLS_$6_^1_(ALS_$2_^1_(LLS_$2_^1_(RTJ*_#STRFST_+STORE PACKED DATA_^1_(LLS_$4_^1_(RTJ*_#GETFWA_+GET NEXT WO€€RD_^1_(ALS_$2_^1_(LLS_$6_^1_(ALS_$2_^1_(LLS_$6_^1_(RTJ*_#STRFST_+STORE PACKED DATA_^1_(JMP*_#NXTGET_+CONTINUE PACKING_^1GETFWA_!NUM_$0_^1_(LDA*_#CURR_-MORE WORDS TO PACK ?_^1_(EOR*_#LWA_^1_(SAN_$NOTCUR_+SKIP IF MORE WORDS TO PACK_^1_(JMP*_#(PACK)_+ASSEMBLY COMPLETE,RETURN TO CALLER_^1NOTCUR_!LDA*_#(CURR)_+TALLY CURRENT WORD_^1_(RAO*_#CURR_^1_(JMP*_#(GETFWA)_)CONTINUE PACKING_^1STRF€€ST_!NUM_$0_^1_(STA*_#QSAV1_,SAVE A_^1_(TRQ_$A_0STORE PACKED DATA_^1_(LDQ-_#ECCOR,I_^1_(STA-_#(ZERO),Q_^1_(LDA-_#0_0RESTORE A_^1QSAV1_"NUM_$0_^1_(CLR_$Q_^1_(RAO-_#ECCOR,I_*TALLY CURRENT ADDRESS IN USER BUFFER_^1_(JMP*_#(STRFST)_)RETURN TO CALLER_^1*_]_^1*_]_^1* CONVERT BCD TO ASCII_^1*_]_^1BCDASC_!NUM_$0_0BCD TO ASCII CONVERSION_^1_(LDA-_#ABUFF,I_*INITIALIZE CURRENT WORD TO CONVERT_€€^1_(STA*_#CURR_^1_(STA*_#BUFFER_^1_(TCA_$Q_0NUMBER OF WORDS TO CONVERT+1 TO Q_^1_(ADQ*_#LWA_^1_(LDA-_#I_0SAVE I_^1_(STA*_#SAVEI_^1LOOPB_"LDA-_#LPMASK+8_)MASK TO A_^1_(INQ_$-1_/DECREMENT Q_^1_(SQP_$CONVB_,SKIP IF MORE TO CONVERT_^1_(LDA*_#SAVEI_,RESTORE I_^1_(STA-_#I_^1_(JMP*_#BCDLOP_+RETURN TO CALLER_^1CONVB_"STQ-_#I_0SET UP I AS INDEX TO BUFFER_^1_(LDQ*_#(BUFFER),I_'GET WORD FROM €€BUFFER_^1_(LAQ_$Q_0MASK TO GET LOWER CHARACTER_^1_(LDQ_$TABLE,Q_*GET ASCII CODE-BCD CODE IS INDEX_^1_(QLS_$8_0SHIFT ASCII CODE TO LOWER HALF OF WO_^1_(LAQ_$Q_0MASK TO GET LOWER CODE_^1_(STQ*_#TEMP_-SAVE FIRST CODE_^1_(LDQ*_#(BUFFER),I_'GET WORD FROM BUFFER_^1_(QLS_$8_0SHIFT UPPER CHARACTER INTO POSITION_^1_(LAQ_$Q_0MASK TO GET CHARACTER_^1_(LDA_$TABLE,Q_*GET ASCII CODE-BCD CODE IS €€INDEX_^1_(AND-_#NZERO+8_*MASK TO GET UPPER CODE_^1_(ADD*_#TEMP_-ADD LOWER CODE_^1_(STA*_#(BUFFER),I_'STORE CONVERTED CODES BACK INTO BUFF_^1_(LDQ-_#I_0GET I_^1_(JMP*_#LOOPB_,LOOP BACK FOR NEXT WORD IN BUFFER_^1BCDLOP_!LDQ-_#ECCOR,I_*TRANSFER DRIVER BUFFER TO USER BUFFE_^1_(LDA*_#(CURR)_^1_(STA-_#(ZERO),Q_^1_(RAO-_#ECCOR,I_^1_(RAO*_#CURR_^1_(LDA*_#CURR_^1_(EOR*_#LWA_^1_(SAZ_$BCDAEX_€H^1_(JMP*_#BCDLOP_^1BCDAEX_!JMP*_#(BCDASC)_)RETURN TO CALLER_^1_(END_^__ HPDMYCDD CSY/ D61 P€1_%NAM DMYCDD_'DECK-ID D61 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$MSOS DUMMY ROUTINES FOR CARTRIDGE DISK (1833-4)_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1***_]_^1*E_]_^1*_*DMYCDD_^1*_]_^1*_*THIS IS A DUMMY MODULE FOR NON-TIME SHARE SYSTEM. ALL THE_^1*_*ENTRY POINTS IN THIS ROUTINE ARE USE€€D TO ALLOW THE DEVICE_^1*_*DRIVER EXECUTES NORMALLY ON A STANDARD MSOS SYSTEM. THUS_^1*_*ONE DEVICE IS USED FOR ALL APPLICATIONS._^1*_]_^1*_*THIS MODULE IS SET UP WHEN SYSTEM IS ORDERED AS NON-TIME_^1*_*SHARE SYSTEM._^1*_]_^1*_]_^1****_!------_^1*_$ENTRY NAMES_^1*_$------_^1*_]_^1_%ENT CDDCPA_'LOGICAL TO PHYSICAL ADDRESS TRANSLATION_^1_%ENT CDDCPS_'CONTROL POINT CHECK/SET ROUTI€€NE_^1_%ENT CDDCPG_'GET THE CONTROL POINT FROM THE REQUEST_^1_%ENT CDDACP_'SET ABSOLUTE MODE_^1*_]_^1*_1EQUIVALENCES_^1*_]_^1ECCOR EQU ECCOR(10)_#ENTRY IN THE PHYSTAB OF THE FWA_^1*_]_^1****_]_^1*_]_^1*_]_^1*_$CDDCPA - LOGICAL TO PHYSICAL ADDRESS CONVERSION_^1*_]_^1CDDCPA ADC *-*_^1*_8Q IS THE MSB OF THE PHYSICAL ADDRESS_^1_%CLR Q_^1*_8A IS THE LSB OF THE PHYSICAL ADDRESS_^1_%€jLDA- ECCOR,I_^1*_8RETURN_^1_%JMP* (CDDCPA)_^1*_]_^1*_$CDDCPS - CONTROL POINT CHECK_^1*_]_^1CDDCPS ADC *-*_^1_%JMP* (CDDCPS)_^1*_]_^1*_$CDDCPG - GET THE CONTROL POINT_^1*_]_^1*_1DOES NOTHING BECAUSE THE PHYSTAB IS ALREADY ZERO._^1CDDCPG EQU CDDCPG(CDDCPS)_^1*_]_^1*_$CDDACP - SET ABSOLUTE MODE_^1*_.(DO NOTHING)_^1*_]_^1CDDACP EQU CDDACP(CDDCPS)_^1_%END_]_^__ jPCDDCP CSY/ D62 P€1_%NAM CDDCP_(DECK-ID D62 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$ITOS CONTROL POINT ROUTINES FOR CARTRIDGE DISK (1833-4)_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1*_]_^1*_$THIS MODULE CONTAINS THE_!ROUTINES THAT ARE USED FOR A_^1*_$TIMESHARE SYSTEM. THE ROUTINES PROVIDE AN INTERFACE TO€€ THE_^1*_$TIMESHARE CONTROL POINT SUBROUTINES. THIS MODULE IS REPLACED_^1*_$BY A MODULE CALLED 'DMYCDD' FOR NON TIMESHARE SYSTEMS._^1*_]_^1*_$THE THREE ROUTINES ARE:_^1*_]_^1*_). CDDCPA - GETS THE 18 BIT PHYSICAL ADDRESS FOR THE CURRENT_^1*_4TRANSFER_^1*_). CDDCPG - GETS THE CONTROL POINT OUT OF THE REQUEST AND_^1*_4PUTS IT INTO THE PHYSTAB._^1*_). CDDCPS - SETS THE CONTROL POINT I€€F NECESSARY._^1*_). CDDACP - SET ABSOLUTE MODE_^1*_]_^1*_$THE ENTRY REQUIREMENTS FOR EACH ROUTINE IS GIVEN HERE. EACH_^1*_$ROUTINE EXPECTS THE I REGISTER TO BE POINTING TO THE PHYSTAB._^1*_$THE ROUTINES ALSO REQUIRE:_^1*_]_^1*_). CDDCPA - NOTHING_^1*_). CDDCPG - NOTHING_^1*_). CDDCPS - THE Q REGISTER SHOULD CONTAIN THE ADDRESS OF THE_^1*_3LAST WORD + 1 FOR THE CURRENT DATA TRANSFER€€._^1*_). CDDACP - NOTHING_^1*_]_^1*_$THE EXIT CONDITIONS ARE AS FOLLOWS:_^1*_]_^1*_). CDDCPA - Q WILL CONTAIN THE MSB BITS (17-16) OF THE_^1*_3PHYSICAL ADDRESS AND A WILL CONTAIN THE LSBS._^1*_). CDDCPG - THE CONTROL POINT NUMBER WILL BE IN THE PHYSTAB._^1*_). CDDCPS - THE CONTROL POINT WILL HAVE BEEN SET FOR THE_^1*_3CURRENT REQUEST._^1*_). CDDACP - CONTROL POINT SET TO 0_^1*_]_^1€€*_$ENTRY POINTS -_^1*_]_^1_%ENT CDDCPA_'PHYSICAL ADDRESS CONVERSION_^1_%ENT CDDCPG_'GETS THE CONTROL POINT OUT OF THE REQUEST_^1_%ENT CDDCPS_'SETS THE CONTROL POINT IF REQUIRED_^1_%ENT CDDACP_'SETS ABSOLUTE MODE_^1*_]_^1*_$EXTERNALS_^1*_]_^1_%EXT CCP_*CURRENT CONTROL POINT_^1_%EXT CPCHK_(CONTROL POINT CHECK_^1_%EXT CPADD_(CONTROL POINT ADDRESS CONVERSION_^1_%EXT CPSET_(CONT€€ROL POINT SET_^1*_]_^1*_$EQUIVALENCES_^1*_]_^1_%EQU ASABS($BD)_"ENTRY TO S PARAM. ABSOLUTIZING ROUTINE_^1_%EQU CPVALU(3)_#INDEX TO THE CONTROL POINT NUMBER THAT_^1*_9FOLLOWS THE S PARAMETER AND MSB/LSB DATA._^1_%EQU CPVLOC(24)_"CONTROL POINT VALUE IN PDT_^1_%EQU ECCOR(10)_#FIRST WORD ADDRESS OF THE CURRENT TRANSFER_^1_%EQU ELSTWD(11)_"LAST WORD ADDRESS +1 OF THE CURRENT TRANSF€€ER_^1_%EQU EPTR(6)_%PHYTAB ENTRY THAT POINTS AT THE REQUEST_^1_%EQU LPMSK(2)_^1_%EQU MSB(1)_'INDEX TO THE MSB WORD OF THE REQUEST_^1_%EQU TSCP(4)_%FOREGROUND COMPLETION PRIORITY IS >= THIS_^1_%EQU ZERO($22)_#LOW CORE LOCATION THAT CONTAINS A ZERO._^1_%EJT_]_^1*_]_^1*_$CDDCPA_^1*_]_^1CDDCPA ADC *-*_^1*_8PUT THE CONTROL POINT NUMBER INTO Q._^1_%LDQ- CPVLOC,I_^1*_8PUT THE FIRST W€€ORD ADDRESS INTO A_^1_%LDA- ECCOR,I_^1*_8TRANSLATE FROM LOGICAL TO PHYSICAL ADDRESS_^1_%RTJ CPADD_^1*_8RETURN_^1_%JMP* (CDDCPA)_^1_%SPC 3_^1*_]_^1*_$CDDCPS_^1*_]_^1CDDCPS ADC *-*_^1*_8DECREMENT THE ADDRESS OF THE LAST WORD +1_^1*_9BY 1._^1_%INQ -1_^1*_8CHECK TO SEE IF THIS ADDRESS IS WITHIN A CP_^1_%RTJ CPCHK_^1*_8SKIP IF WITHIN A CONTROL POINT AREA_^1_%SQN INCPA_^1*_8EXIT IF€€ NOT WITHIN CP AREA._^1_%JMP* (CDDCPS)_^1*_8CHECK TO SEE IF THE CP NEEDS TO BE CHANGED._^1INCPA LDA+ CCP_^1_%EOR- CPVLOC,I_^1*_8SKIP IF IT DOES NOT NEED TO BE CHANGED._^1_%SAZ NOSET_^1*_8SET THE CONTROL POINT_^1_%LDQ- CPVLOC,I_^1_%RTJ CPSET_^1ACPSET EQU ACPSET(*-1)_^1*_8RETURN_^1NOSET EQU NOSET(*)_^1_%JMP* (CDDCPS)_^1_%EJT_]_^1*_]_^1*_$CDDCPG_^1*_]_^1CDDCPG ADC *-*_^1*_8IF T€€HE MSB OF THE MSB WORD IS SET THEN THE_^1*_9REQUEST HAS A CONTROL POINT_^1_%LDQ- EPTR,I_^1_%RTJ- (ASABS)_^1_%TRA Q_^1_%LDA- MSB,Q_^1_%SAP BAKGND_'SKIP IF THIS REQUEST HAS NO CONTROL_^1*_8POINT NUMBER_^1_%LDA- CPVALU,Q_^1*_8SAVE THE CP NUMBER AND EXIT_^1_%JMP* SAVECP_^1*_8FOR A BACKGROUND REQUEST THE CP IS ZERO_^1BAKGND CLR A_^1*_8SAVE THE CONTROL POINT IN THE PHYTAB_^1SAVECP STA€¢- CPVLOC,I_^1*_8RETURN_^1_%JMP* (CDDCPG)_^1*_]_^1*_$CDDACP - SET ABSOLUTE MODE_^1*_]_^1CDDACP NUM 0_^1_%ENQ 0_^1_%RTJ* (ACPSET)_^1_%JMP* (CDDACP)_^1_%END_]_^__ ¢PCDDRVE CSY/ D63 P€1_%NAM CDDRVE_'DECK-ID D63 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$DTLP DRIVER FOR CARTRIDGE DISK_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1_'SPC_!3_^1***_]_^1*_6DTLP - CDD DRIVER_^1*_6------------------_^1*_]_^1*_'FUNCTION_^1*_'---------_^1*_]_^1*_'THE DTLP - CDD DRIVER EXECUTES ALL R€€EAD/WRITE REQUESTS_^1*_'FROM THE DISK-TO-TAPE PROGRAM._^1*_]_^1*_'DESCRIPTION:_^1*_'------------_^1*_]_^1*_'THIS PROGRAM IS A STATUS DRIVEN DRIVER.THIS MEANS THAT_^1*_'INSTEAD OF USING INTERRUPTS TO SIGNAL THE END OF SPECIFIED_^1*_'OPERATIONS,IT LOOPS ON THE STATUS AND WAITS UNTIL SPECIFIED_^1*_'CONDITIONS ARE MET (EOP,ON CYLINDER,ETC.)._^1*_'THE DRIVER OPERATION IS BASED ON A TABL€€E COMPOSED OF_^1*_(8 VECTORS.THE N-TH ENTRY IN THIS TABLE GIVES THE_^1*_'REQUIRED A AND Q REGISTERS FOR THE N-TH OUTPUT OPERATION,_^1*_'TWO MASKS FOR THE STATUS WORD AND THE_!EXPECTED RESULTS_^1*_'AFTER APPLYING THESE MASKS,AND POINTERS TO ROUTINES TO BE_^1*_'EXECUTED BEFORE % AFTER THE OUTPUT OPERATIONS._^1*_'THE TABLE ENTRIES ARE ORDERED ACCORDING TO THE SEQUENCE_^1*_'OF INST€€RUCTIONS SENT TO THE CONTROLLER._^1*_]_^1*_'A TYPICAL I/O CYLCLE IS AS FOLLOWS (DISREGARDING_^1*_'ROUTINES' BOUNDARIES ) :_^1*_0SET I-REG. TO ORDINAL NO. OF REQUIRED I/O._^1*_0JMP ACCORDING TO PREVEC ( BY I )_^1*_0LDA FROM TABLE (INDEXED BY I-REG.)_^1*_0LDQ FROM TABLE (BY I)_^1*_0ADQ EQUIPMENT CODE_^1*_1SRI IREG :SAVE LOOP INDEX_^1*_1LRI IMEM :RESTORE CONTENTS OF LOCATION $€€00FF_^1*_0OUT REJECT - *_^1*_0GET DYNAMIC STATUS IN A._^1*_0AND WITH WATMSK FROM TABLE (BY I)_^1*_0EOR WITH WATRSL FROM TABLE (BY I)_^1*_0WAIT UNTIL A=0 (I.E.: IF A #0 THEN GET A NEW STATUS)_^1*_0SRI IMEM:SAVE CONTENTS OF LOCATION $00FF_^1*_0LRI IREG: RESTORE LOOP INDEX_^1*_0LDA WITH LAST STATUS_^1*_0AND WITH ERRMSK (BY I)_^1*_0EOR WITH ERRSLT (BY I)_^1*_0IF A=0 THEN CO€€NTINUE.ELSE - RETURN ERROR._^1*_0JMP ACCORDING TO PSTVEC ( BY I )_^1*_]_^1*E_]_^1*_'WATMSK ENABLES THE DRIVER TO WAIT UNTIL CERTAIN EVENTS HAVE_^1*_'OCCURRED ( EOP,ON CYLINDER ETC.)._^1*_'ERRMSK CHECKS IF ANY ERROR CONDITION HAS BEEN SET, AND IF SO,_^1*_'IT EXITS FROM THE DRIVER._^1*_]_^1*_]_^1*_'PREVEC AND PSTVEC ENABLE THE PROGRAMMER TO SET PARAMETERS_^1*_'BEFORE EACH OUTPUT AN€€D TO CHECK CONDITIONS (OR ERRORS )_^1*_'OR EVEN REPEAT THE OUTPUT AFTER EACH OPERATION._^1*_]_^1*_]_^1*_'NOTICE THE DOUBLE ROLE OF LOCATION $00FF:EACH TIME THE_^1*_'CONTROLLER IS CALLED BY AN OUTPUT OPERATION - IT IS TREATED_^1*_'LIKE ANY OTHER LOCATION(AND IS SAVED IN IMEM).THROUGHOUT_^1*_'THE DRIVER,IT IS TREATED LIKE AN INDEX REGISTER(AND IS SAVED_^1*_'IN IREG).THIS IS DONE TO €€AVOID COMPARE ERRORS AFTER_^1*_'READ/WRITE FROM/INTO LOW CORE(I.E.:LOCATION $00FF IS CHANGED_^1*_'AND COMPARED).ON EXIT FROM DRIVER,I IS SET TO THE CONTENTS_^1*_'OF IMEM ,SO THAT IT WILL CONTAIN THE SAME DATA AS IF THE_^1*_'DRIVER HAD NOT USED I REGISTER FOR AN INDEX REG._^1*_]_^1*_]_^1*_'THE UNIT ON WHICH THE DRIVER WILL OPERATE IS THE FIRST UNIT_^1*_'ALONG THE DAISY CHAIN THAT IS€€ READY._^1*_'UNIT SELECT IS DONE EVERY TIME THE DRIVER IS CALLED WITH_^1*_'THE WORD FST (EXTERNAL) ZERO.WHEN FST # 0 - THE DRIVER_^1*_'OPERATES ON THE SAME UNIT AS IN THE PREVIOUS CALL._^1*_]_^1*_]_^1*_'INTERNAL REJECT ON ANY I/O OR EXTERNAL REJECT ON STATUS_^1*_'INPUT WILL CAUSE AN ERROR EXIT WITH STATUS = $0000,SINCE_^1*_'STATUS CANNOT BE OBTAINED UNDER THESE CONDITIONS._^1*_'€€EXTERNAL REJECT ON OUTPUT WILL CAUSE STATUS READING,_^1*_'AND EXIT WITH ERROR._^1*_]_^1*_'IN CASE OF ERRORS THAT ARE DETECTED BY THE DRIVER AND_^1*_'FOR WHICH THE STATUS WORD IS MEANINGLESS (FOR INSTANT,_^1*_'WHEN THE DRIVER DETECTS AN ERROR IN THE STARTING SECTOR_^1*_'ADDRESS),THE DRIVER WILL SEND $FFFF INSTEAD OF THE_^1*_'STATUS WORD._^1*_]_^1*_]_^1*_'AFTER THE REQUEST IS FI€€NISHED,THE UNIT IS DESELECTED_^1*_'AND THE BUS IS RELEASED._^1*_]_^1_'EJT_^1***_]_^1*E_]_^1*_]_^1*_'THE STATUS WORD IS BUILT AS FOLLOWS:_^1*_]_^1*_(15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0_^1*_'-------------------------------------------------_^1*_'I I I I IXXIXXIXXI I IXXI I I I I I I_^1*_'-------------------------------------------------_^1*_)' ' ' '_*' '_#€€' ' ' ' ' '_^1*_)' ' ' '_*' '_#' ' ' ' ' '_^1*_)' ' ' ON BUS_$' SINGLE' ' ' ' ' UNIT READY(=1)_^1*_)' ' '_-' DNSITY' ' ' ' '_^1*_)' ' DEVICE SEEK_"' (=1) ' ' ' ' CONTROLLER BUSY =1_^1*_)' ' ERROR_)'_'' ' ' '_^1*_)' '_0EOP(=1) ' ' ' INTERRUPT_^1*_)' CONTROLLER_0' ' '_^1*_)' PROTECTED_1' ' ALARM_^1*_)'_<' '_^1*_)BUS BUSY_5' ON C€€YLINDER_^1*_G'_^1*_GDISK WRITE PROTECTED_^1*E_]_^1_'EJT_^1***_]_^1*_'ON ENTRY :_^1*_'-----------_^1*_]_^1*_2A - HOLDS THE FIRST WORD ADDRESS OF THE_^1*_6READ / WRITE BUFFER._^1*_2Q - IF POSITIVE: NO. OF WORDS TO BE READ_^1*_CFROM DISK (READ OPERATION)._^1*_6IF NEGATIVE: THE COMPLEMENT OF THE NO. OF_^1*_CWORDS TO BE WRITTEN ON._^1*_CDISK (WRITE OPERATION)._^1*_2I - HOLDS THE ADD€€RESS OF THE FIRST SECTOR_^1*_6FOR THE I/O.SINCE THE NO. OF SECTORS ON A_^1*_6DOUBLE DENSITY DISK IS LARGER THAN $7FFF (BUT_^1*_6SMALLER THAN $FFFF) - I IS TREATED AS A_^1*_6POSITIVE NUMBER WITH 16 BITS.THUS,THE NO._^1*_6OF ACCESSIBLE SECTORS (THROUGH I) COVERS ALL_^1*_6SECTORS ON A DOUBLE DENSITY DISK._^1*_]_^1*_2GENFC - DSKTAP INSERTS HERE THE EQUIPMENT CODE + 1_^1*_:OF THE CDD._€€^1*_2INVRSE - INVERSE (OR NORMAL)DISKS MODE - INSERTED_^1*_;BY DSKTAP: 0 - NORMAL, $40 - INVERSE._^1*_2FST - EXTERNAL TO PROGRAM (IN DSKTAP).IF FST = 0_^1*_8ON ENTRY - DRIVER WILL SEARCH FOR THE FIRST_^1*_8READY UNIT,AND OPERATE ON IT.ALSO,IT WILL_^1*_8ADD 1 TO FST,SO THAT ON THE NEXT TIME THE_^1*_8DRIVER IS CALLED - IT WILL OPERATE ON THE_^1*_8SAME UNIT._^1*_8IF FST # 0,THE DRIVER€€ WILL OPERATE ON THE_^1*_8SAME UNIT THAT WAS USED DURING THE PREVIOUS_^1*_8REQUEST(WITH THE SAME DISKS MODE)._^1*_]_^1*_'ON EXIT :_^1*_'----------_^1*_]_^1*_1COMPLETION WITH NO ERROR:_^1*_2A = -0 ($FFFF)_^1*_2Q = 0_^1*_]_^1*_1RETURN WITH AN ERROR:_^1*_2A = 0_^1*_2Q = $FFFF IF ERRONEOUS STARTING SECTOR IS SENT_^1*_=TO DRIVER (TOO BIG)._^1*_4= $0000 IF INTERNAL REJECT ON I/O OR€€ EXTERNAL_^1*_=REJECT ON STATUS INPUT_^1*_4= BAD STATUS FOR ALL OTHER ERRORS_^1*_]_^1*_'THE CONTENTS OF I REG. ON EXIT ARE THE SAME AS THEY WOULD_^1*_'HAVE BEEN IF THE DRIVER HAD NOT USED LOCATION $00FF AS AN_^1*_'INDEX REG.(I.E.:STARTING SECTOR UNLESS DATA HAD BEEN WRITTEN_^1*_'INTO LOCATION $00FF)._^1*_]_^1*E_]_^1****_]_^1*_]_^1*_'EXTERNALS :_^1*_'-----------_^1*_]_^1_'EXT* FST_€€+FIRST TIME THROUGH_^1*_]_^1*_]_^1*_'ENTRY POINTS :_^1*_'--------------_^1*_]_^1_'ENT_!GENFC_)EQUIPMENT CODE + 1_^1_'ENT_!INVRSE_(INVERSE DISKS MODE FLAG_^1_'ENT_!MDRIVE_(CDD DRIVER ENTRY POINT_^1*_]_^1*_]_^1*_'FLOW :_^1*_'------_^1*_]_^1*_'1. GET REQUEST PARAMETERS AND INSERT PROPER WORDS IN THE A-REG._^1*_*VECTOR FOR OUTPUT._^1*_'2. EXECUTE OUTPUT LOOP ACCORDING TO THE ORDER IN A€€ % Q_^1*_*VECTORS.JUMP TO THE PROPER SUBROUTINES BEFORE AND AFTER_^1*_*EACH OUTPUT._^1****_]_^1*_]_^1*_'PROGRAMMING NOTICE :_^1*_'--------------------_^1*_]_^1*_'NOTE THAT IN SOME CASES THROUGHOUT THE PROGRAM,LABELS_^1*_'ARE ASSIGNED BY:_^1*_3LABEL_"BSS_"LABEL ( 0 )_^1*_'WHICH ASSIGNS THE LABEL TO THE NEXT LOCATION._^1*_]_^1_'EJT_^1****_]_^1*_]_^1*_'THE FOLLOWING IS THE TABLE FOR O€€UTPUT OPERATIONS.IT CONTAINS_^1*_'8 VECTORS:_^1*_,AVEC - A REG. FOR OUTPUTS_^1*_,QVEC - Q REG. FOR OUTPUTS_^1*_,WATMSK - MASK FOR WAITING ON STATUS_^1*_,WATRSL - DESIRED RESULT AFTER APPLYING THE MASK ABOVE._^1*_,ERRMSK - MASK FOR CHECKING ERRORS AT THE END OF_^1*_5AN OUTPUT OPERATION_^1*_,ERRSLT - THE RESULT OF APPLYING THE MASK ABOVE TO THE_^1*_5STATUS WORD IF NO ERROR OCCURRED._€€^1*_,PREVEC - VECTOR OF ADDRESSES OF ROUTINES TO BE EXECUTED_^1*_6BEFORE EACH OUTPUT._^1*_,PSTVEC - VECTOR OF ADDRESSES OF ROUTINES TO BE EXECUTED_^1*_6AFTER EACH SUCCESSFUL OUTPUT._^1*_]_^1*_'NOTE :_^1*_-THE OPERATION OF THE DRIVER IS BASED ON SEQUENTIAL_^1*_-EXECUTION OF I/O'S ACCORDING TO THIS TABLE.THEREFORE,_^1*_-ADDING A NEW I/O IS DONE BY ADDING THE APPROPRIATE_^1*_-R€€OUTINE AND BY ADDING AN ENTRY TO EACH OF THE_^1*_-VECTORS ABOVE IN THE PROPER PLACE ACCORDING TO THE_^1*_-SEQUENCE._^1*_-EVEN WHEN NO WATMSK OR ERRMSK IS NEEDED - A ZERO ENTRY_^1*_-MUST BE INSERTED IN THE UNNEEDED VECTORS._^1*_]_^1*_'SEEK (AND RTZS) OPERATIONS INCLUDE WAITING FOR "ON CYLINDER"_^1*_'SIGNAL,AND NOT JUST "EOP"._^1*_]_^1*S2_]_^1_'SPC_!2_^1AVEC_"BSS_!AVEC(0)_'A-REG. €€FOR OUTPUT OPERATIONS_^1*_]_^1*_]_^1ACLCNT NUM_!0_-CLAER CONTROLLER_^1ABSCON NUM_!$80_+NORMAL BUS CONNECT_^1AUNTSL BZS_!AUNTSL_(UNIT SELECT - PREPARED % INSERTED BY PROG._^1ARTZS_!NUM_!$20_+RTZS - RETURN TO ZERO SEEK_^1ABNKSL NUM_!0_-MEMORY BANK 0 SELECT_^1ALNGTH BZS_!ALNGTH_(REQUEST BLOCK LENGTH (NO. OF WORDS) -_^1*_;INSERTED BY PROGRAM._^1AFWA_"BZS_!AFWA_*FIRST WORD ADDRESS €€IN MEMORY - INSERTED_^1*_;BY PROG._^1ASKRW_!BZS_!ASKRW_)SEEK FOR READ/WRITE - INSERTED BY PROG._^1ARDWR_!BZS_!ARDWR_)READ/WRITE - INSERTED BY PROG._^1ACOMP_!BZS_!ACOMP_)COMPARE - INSERTED BY PROG._^1AUNTDS BZS_!AUNTDS_(UNIT DESELECT - INSERTED BY PROG._^1ABSREL NUM_!0_-BUS RELEASE_^1*S2_]_^1_'SPC_!2_^1QVEC_"BSS_!QVEC(0)_'Q-REG. FOR OUTPUT_^1_'NUM_!$10_+CLEAR CONTROLLER_^1_'NUM_!$€€8_,BUS CONNECT_^1_'NUM_!$6_,UNIT SELECT_^1_'NUM_!$1_,RTZS_^1_'NUM_!$3_,MEMORY BANK SELECT_^1_'NUM_!$7_,BLOCK LENGTH (NO. OF WORDS)_^1_'NUM_!$2_,FIRST WORD ADDRESS (FWA)_^1_'NUM_!$A_,SEEK (FOR READ/WRITE)_^1_'NUM_!$1_,READ / WRITE_^1_'NUM_!$1_,COMPARE_^1_'NUM_!$6_,UNIT DESELECT_^1_'NUM_!$8_,BUS RELEASE_^1*S2_]_^1_'SPC_!2_^1WATMSK BSS_!WATMSK(0)_$MASK FOR WAITING ON STATUS_^1_'NUM_!€€0_-DO NOT WAIT_^1_'NUM_!$0102_)BUS CON.- WAIT FOR EOP_^1_'NUM_!$0102_)UNIT SEL.- EOP_^1_'NUM_!$0010_)RTZS-WAIT FOR "ON CYLINDER" (CONTROLLER_^1*_;DOES NOT BECOME BUSY FOR RTZS)._^1_'NUM_!0_-BANK SELECT - DUMMY ENTRY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY ENTRY_^1_'NUM_!0_-FWA - DUMMY ENTRY_^1_'NUM_!$0112_)SEEK - EOP % "ON CYLINDER"_^1_'NUM_!$0102_)READ/WRITE - EOP_^1_'NUM_!$01€€02_)COMPARE - EOP_^1_'NUM_!$0102_)UNIT DESELECT - EOP_^1_'NUM_!$0102_)BUS RELEASE - EOP_^1*S2_]_^1_'SPC_!2_^1WATRSL BSS_!WATRSL(0)_$RESULT OF STATUS "ANDED" WITH WATMSK IF_^1*_;THE SPECIFIED EVENTS OCCURED (I.E.:THE_^1*_;PROGRAM SHOULD EXIT FROM WAITING LOOP)._^1_'NUM_!0_-DO NOT WAIT_^1_'NUM_!$0100_)EOP OF BUS CONNECT_^1_'NUM_!$0100_)EOP OF UNIT SELECT_^1_'NUM_!$0010_)"ON CYLINDER€€" FOR RTZS (ZERO SEEK)_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$0110_)EOP % "ON CYLINDER" FOR SEEK_^1_'NUM_!$0100_)EOP OF READ/WRITE_^1_'NUM_!$0100_)EOP FOR COMPARE_^1_'NUM_!$0100_)EOP FOR UNIT DESELECT_^1_'NUM_!$0100_)EOP FOR BUS RELEASE_^1*S2_]_^1_'SPC_!2_^1ERRMSK BSS_!ERRMSK(0)_$MASK FOR CHECKING FOR ERRORS_^1€€_'NUM_!$010E_)CLEAR CONTROLLER_^1_'NUM_!$110A_)BUS CONNECT_^1_'NUM_!$110A_)UNIT SELECT_^1_'NUM_!$311B_)RTZS(% "ON CYLINDER")_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$311B_)SEEK (% "ON CYLINDER")_^1_'NUM_!$311B_)READ/WRITE_^1_'NUM_!$311B_)COMPARE_^1_'NUM_!$110A_)UNIT DESELECT_^1_'NUM_!$110A_)BUS RELEASE_^1*S2_]_^1_€€'SPC_!2_^1ERRSLT BSS_!ERRSLT(0)_$RESULT OF STATUS "ANDED" WITH ERRMSK IF_^1*_;NO ERROR OCCURED_^1_'NUM_!$0100_)CLEAR CONTROLLER - EOP_^1_'NUM_!$1100_)BUS CONNECT- "ON BUS" % EOP_^1_'NUM_!$1100_)UNIT SELECT - "ON BUS" % EOP_^1_'NUM_!$1111_)RTZS - "ON BUS % CYLINDER",READY % EOP_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'N€€UM_!$1111_)SEEK - "ON BUS % CYLINDER",READY % EOP_^1_'NUM_!$1111_)READ/WRITE-"ON BUS % CYL.",READY,EOP._^1_'NUM_!$1111_)COMPARE -"ON BUS % CYL.",READY,EOP._^1_'NUM_!$1100_)UNIT DESELECT - "ON BUS" % EOP._^1_'NUM_!$0100_)BUS RELEASE - EOP._^1*S2_]_^1_'SPC_!2_^1PREVEC BSS_!PREVEC(0)_$ROUTINES TO BE EXECUTED BEFORE OUTPUT_^1_'ADC* DOUT_*CLEAR CONTROLLER_^1_'ADC* DOUT_*BUS CONNECT_^€€1_'ADC* UNTPRE_(UNIT SELECT_^1_'ADC* RTZSPR_(RTZS_^1_'ADC* BNKPRE_(PRE BANK SELECT_^1_'ADC* DOUT_*BLOCK LENGTH_^1_'ADC* DOUT_*FWA_^1_'ADC* DOUT_*SEEK (READ/WRITE)_^1_'ADC* RWRPRE_(PRE READ/WRITE_^1_'ADC* DOUT_*COMPARE_^1_'ADC* DOUT_*UNIT DESELECT_^1_'ADC* DOUT_*BUS RELEASE_^1*S2_]_^1_'SPC_!2_^1PSTVEC BSS_!PSTVEC(0)_$ROUTINES TO EXECUTE AFTER OUTPUTS_^1_'ADC* INCRI_)CL€€EAR CONTROLLER_^1_'ADC* INCRI_)BUS CONNECT_^1_'ADC* UNTPST_(UNIT SELECT_^1_'ADC* INCRI_)RTZS_^1_'ADC* INCRI_)BANK SELECT_^1_'ADC* INCRI_)BLOCK LENGTH_^1_'ADC* INCRI_)FWA_^1_'ADC* INCRI_)SEEK (READ/WRITE)_^1_'ADC* RWRPST_(POST READ / WRITE_^1_'ADC* COMPST_(COMPARE_^1_'ADC* INCRI_)UNIT DESELECT_^1_'ADC* ENDREQ_(BUS RELEASE_^1*_]_^1*_(END OF OUTPUT OPERATIONS TABLE._^1*_€€]_^1****_]_^1_'EJT_^1*_]_^1*_'THE FOLLOWING IS THE LIST OF ALL EQU'S,NUM'S,AND BSS'S_^1*_'FOR THE PROGRAM( IN ALPHABETIC ORDER)._^1*_]_^1CMCODE EQU_!CMCODE(11)_#L.S.BITS FOR A-REG. IN COMPARE INSTRUCTION_^1CMPFLG BSS_!CMPFLG_(COMPARE - READ/WRITE FLAG_^1SCTR_"EQU_!SCTR(29)_%NO. OF SECTORS ON A TRACK_^1DBLDNS EQU_"DBLDNS(406)_!NO. OF CYLINDERS ON DOUBLE DENSITY DISK_^1DBLFST E€€QU_!DBLFST(DBLDNS*SCTR*2-1) FIRST SECTOR ADD.OF FIXED DISK_^1*_EFOR DOUBLE DENSITY._^1DNSHFT EQU_!DNSHFT(8)_$NO. OF SHIFTS TO GET DENSITY BIT FROM_^1*_;STATUS WORD IN SIGN BIT_^1DYNST_!BSS_!DYNST(1)_%DYNAMIC STATUS_^1EQPCDE BSS_!EQPCDE_(EQUIPMENT CODE (BIT ZERO = 0 )_^1ERRFLG BSS_!ERRFLG_(ERROR ROUTINE FLAG (DESIGNATES THAT_^1*_;ROUTINE HAS BEEN ENTERED)._^1ERSTTS BSS_!ERSTTS_€€(BAD STATUS WHEN ERROR_^1FSTDS1 BSS_!FSTDS1(1)_$FIRST SECTOR ADDRESS OF DISK 1._^1GENFC NUM $700_)EQUIPMENT CODE_^1IMEM_"BSS_!IMEM_*SAVE LOCATION $00FF (IN CASE DATA IS_^1*_;READ/WRITTEN FROM/INTO LOW CORE)._^1INVRSE NUM_!0_-INVERSE DISKS MODE:0-NORMAL,$40-INVERSE_^1IREG_"BSS_!IREG_*SAVE I (INDEX) REGISTER_^1LNGTH2 BSS_!LNGTH2_(SECOND REQUEST LENGTH FOR A SPLITTED_^1*_;REQUES€€T.IF ZERO-THE REQ. IS NOT SPLITTED._^1QSTTS_!EQU_!QSTTS($10)_#Q REG. VALUE TO INPUT STATUS_^1RDCODE EQU_!RDCODE(9)_$L.S.BITS FOR A-REG. IN READ INSTRUCTION_^1RDWRT_!BSS_!RDWRT(1)_%READ / WRITE FLAG (= BITS FOR A-REG.)_^1SAVEI_!BSS_!SAVEI_)SAVE I REG AT ERROR_^1SCWRD_!EQU_!SCWRD(96)_$NO.OF WORDS PER SECTOR_^1SINDNS EQU_"SINDNS(203)_!NO. OF CYLINDERS ON SINGLE DENSITY DISK_^1SINFST€€ EQU_!SINFST(SINDNS*SCTR*2-1) FIRST SECTOR ADD.OF FIXED DISK_^1*_EFOR SINGLE DENSITY_^1SKERR_!EQU_!SKERR($2010)_!MASK FOR SEEK ERROR % "ON CYLINDER" BITS_^1SKRSL_!EQU_!SKRSL($10)_#EXPECTED RESULT AFTER APPLYING SKERR_^1*_;TO STATUS, IF NO ERROR_^1STSEC_!BSS_!STSEC(1)_%STARTING SECTOR FOR REQUEST_^1TEMP1_!BSS_!TEMP1(1)_'TEMPORARY_^1UNTDIF EQU_!UNTDIF($10)_"DIFFERENCE BETWEEN TWO €€CONSECUTIVE UNIT_^1*_;SELECT WORDS._^1UNTSEL EQU_!UNTSEL($80)_"UNIT 0 SELECT - A REG._^1WRCODE EQU_!WRCODE(10)_#L.S.BITS FOR A-REG. IN WRITE INSTRUCTION_^1_'EJT_^1***_]_^1*E_]_^1*_]_^1*_'M D R I V E - I N I T I A L I Z E R_^1*_]_^1*_'THE FOLLOWING ROUTINE SAVES THE INPUT PARAMETERS AND CHECKS_^1*_'WHETHER THE REQUEST IS FOR READ OR WRITE OPERATIONS._^1*_]_^1MDRIVE NUM_!0_-ENTR€€Y POINT TO PORGRAM._^1_'STA* AFWA_*INSERT FIRST WORD ADDRESS IN AVEC._^1_'LDA- I_-I CONTAINS THE STARTING SECTOR ADDRESS_^1_'STA* STSEC_)STARTING SECTOR TEMPORARY_^1_'STA* IMEM_*SAVE LOCATION $00FF_^1_'ENA_!RDCODE_(PREPARE FOR READ_^1_'SQP_!P1_,SKIP IF READ (Q>0 IF READ, Q<0 FOR WRITE)_^1_'ENA_!WRCODE_(PREPARE FOR WRITE_^1_'TCQ_!Q_-GET ABSOLUTE VALUE OF NO.OF WORDS_^1P1_$STA* €€RDWRT_)SET READ/WRITE FLAG_^1_'STQ* ALNGTH_(INSERT NO.OF WORDS IN AVEC._^1_%LDA* GENFC_(GET EQUIPMENT CODE_^1_'STA* EQPCDE_(SAVE EQUIPMENT CODE_^1_'CLR_!A_^1_'STA* ERRFLG_(CLEAR ERROR ROUTINE FLAG_^1_'STA* SAVEI_)CLEAR SAVE I AT ERROR_^1_'STA* IREG_*CLEAR SAVE I (INDEX) REGISTER_^1_'STA* LNGTH2_(CLEAR SPLIT REQUEST FLAG_^1_'STA* ERSTTS_(CLEAR BAD STATUS_^1_'STA- I_-SET I TO€€ 0 TO BEGINNING OF OUTPUT TABLE._^1_'JMP* PMPRE_^1_'EJT_^1****_]_^1*_]_^1*_'O U T P U T_!C Y C L E_^1*_]_^1*_%THE FOLLOWING ROUTINE IS THE MAIN PROGRAM. IT EXECUTES ALL_^1*_%OUTPUT OPERATIONS,ACCORDING TO THEIR ORDER IN THE TABLE._^1*_%IT INCREMENTS I BY 1 TO POINT TO THE NEXT I/O,JUMPS TO_^1*_%PRE-OUTPUT ROUTINE,EXECUTES OUTPUT,WAITS ON STATUS % CHECKS_^1*_%FOR ERRORS AND JUM€€PS TO A POST-OUTPUT ROUTINE._^1*_'PRE % POST OUTPUT ROUTINES ENABLE THE PROGRAMMER TO SET_^1*_'PARAMETERS,CHECK CONDITIONS AND CHANGE THE PROGRAM FLOW ._^1*_'A RETURN TO DOUT WILL CAUSE THE OUTPUT (POINTED TO BY I REG)_^1*_'TO BE EXECUTED.A RETURN TO PMPOST CAUSES A SKIP ON THE_^1*_'OUTPUT OPERATION.A RETURN TO INCRI CAUSES THE NEXT_^1*_'OUTPUT TO BE EXECUTED._^1*_%NOTICE THAT AN O€€UTPUT MAY BE REPEATED SIMPLY BY COMING BACK_^1*_%TO THE INSTRUCTION FOLLOWING THE : RAO- I ._^1*_%NOTICE THAT ON NORMAL RETURN FROM OUTPUT ,I REG. DOES NOT_^1*_%HOLD THE INDEX.THIS IS BECAUSE THE OPERATION IS STILL GOING ON_^1*_%AND LOCATION $00FF MAY BE CHANGED BY IT. I IS RESTORED IN STTS_^1*_%AFTER THE COMPLETION OF THE OPERATION._^1*_]_^1*_]_^1INCRI_!RAO- I_-MOVE TO NEXT O€€UTPUT_^1PMPRE_!LDQ* PREVEC,I_%GET RELATIVE ADDRESS OF PRE-PUTPUT ROUTINE_^1_'JMP* PREVEC,B_%JUMP TO PRE-OUTPUT ROUTINE (OR TO DOUT)_^1DOUT_"RTJ* OUTPUT_(EXECUTE OUTPUT OPERATION_^1DOSTTS RTJ* STTS_*WAIT ACCORDING TO WATMSK % CHECK IF ERRORS_^1ERROR1 JMP* ERROR_)ERROR FOUND - ERROR EXIT_^1PMPOST LDQ* PSTVEC,I_%GET RELATIVE ADDRESS OF NEXT ROUTINE_^1_'JMP* PSTVEC,B_%GO TO N€€EXT ROUTINE (OR TO INCRI)_^1*E_]_^1****_]_^1_'EJT_^1***_]_^1*_]_^1*_'E R R O R_!R O U T I N E_^1*_]_^1*_'ERROR EXIT: AN ATTEMPT IS MADE TO EXIT FROM DRIVER WITH_^1*_'UNIT DESELECTED AND BUS RELEASED.(DESPITE OF ANY ERROR THAT_^1*_'BROUGHT US HERE).ALL ERRORS DETECTED AFTER CONTROL HAS_^1*_%PASSED TO THIS ROUTINE - ARE_^1*_'DISREGARDED.THE ROUTINE USES A FLAG:ERRFLG,TO DESIGNATE_^1€€*_'TO I/O ROUTINES THAT ERRORS SHOULD BE DISREGARDED._^1*_'NOTICE THAT ERROR IS THE ENTRY POINT FOR MOST ERRORS,WHILE_^1*_'ERRFF IS THE ENTRY POINT FOR ERRORS DETECTED BY THE DRIVER_^1*_'FOR WHICH STATUS IS MEANINGLESS($FFFF IS SENT INSTEAD)._^1*_'ERR00 IS THE ENTRY POINT FOR ERROR EXITS BECAUSE OF INTERNAL_^1*_'REJECTS ON I/OS OR EXTERNAL REJECTS ON STATUS INPUT._^1*_'NOTE THAT FO€€R THESE CASES,IT IS IMPOSSIBLE TO OBTAIN THE_^1*_'CURRENT STATUS._^1*_]_^1ERROR_!BSS_!ERROR(0)_%ERRO EXIT (WITH MEANINGFUL STATUS)_^1_'LDQ* DYNST_)GET STATUS_^1P10_#LDA* ERRFLG_(ERROR ROUTINE FLAG_^1_'SAZ_!P25_+FIRST TIME THROUGH ERROR ROUTINE ?_^1_'JMP* PMPOST_^1P25_#STQ* ERSTTS_(SAVE BAD STATUS_^1_'RAO* ERRFLG_(SET ERROR FLAG_^1_'LDA- I_-GET I REG FOR ERRONEOUS OUTPUT_^1_'S€€TA* SAVEI_)SAVE IT_^1_'ENA_!AUNTDS-AVEC_"POINT TO UNIT DESELECT_^1_'STA- I_-SET I_^1_'JMP* PMPRE_)EXECUTE EXIT_^1ERRFF_!BSS_!ERRFF(0)_%ENTRY WHEN STATUS IS MEANINGLESS_^1_'ENQ_!-0_,Q = $FFFF_^1_'JMP* P10_+CONTINUE AS ERROR_^1ERR00_!BSS_!ERR00(0)_%ENTRY FOR REJECTS_^1_'ENQ_!0_-Q = $0000_^1_'JMP* P10_+CONTINUE AS AN ERROR_^1_'EJT_^1***_]_^1*_]_^1*_'O U T P U T_^1*_]_^1*_'THE FO€€LLOWING ROUTINE EXECUTES ALL OUTPUT OPERATIONS._^1*_'ON ENTRY, I POINTS TO THE REQUIRED OUTPUT IN THE OUTPUT_^1*_'TABLE._^1*_'IF INTERNAL REJECT OCCURS,ERROR ROUTINE FLAG IS CHECKED:_^1*_'IF ERROR ROUTINE HAS BEEN ENTERED,IT RETURNS TO CALLER._^1*_'OTHERWISE-ERROR EXIT._^1*_'EXTERNAL REJECT IS TREATED AS FOLLOWS:_^1*_'IF OUTPUT WAS REQUESTED FROM ERROR ROUTINE,PROG. RETURNS TO_^1*_€€'CALLER.OTHERWISE,STATUS IS READ AND THE PROG.BRANCHES TO_^1*_'ERROR ROUTINE. TO OBTAIN_^1*_'STATUS, I IS CHANGED TO SIMULATE FWA OUTPUT(WHICH HAS ZERO_^1*_'FOR ITS WAITING MASK % RESULT WHICH MEANS NO WAIT) AND_^1*_'STTS IS CALLED._^1*_]_^1OUTPUT NUM_!0_^1_'LDQ- I_^1_'STQ* IREG_*SAVE INDEX REGISTER_^1_'LDA* IMEM_^1_'STA- I_-RESTORE $00FF_^1_'LDA_!AVEC,Q_(GET A-REG. FOR OUTPU€€T_^1_'LDQ_!QVEC,Q_(GET Q-REG._^1_'ADQ* EQPCDE_(ADD EQUIPMENT CODE_^1PP1_#BSS_!PP1(0)_^1_'OUT_!REJCT-*_'EXECUTE OUTPUT_^1PP3_#JMP* (OUTPUT)_%RETURN_^1REJCT_!JMP* PP5_^1_'LDA* IREG_^1_'STA- I_-RESTORE INDEX REG._^1_'LDA* ERRFLG_(EXTERNAL REJECT_^1_'SAZ_!PP2_+OUTPUT FROM ERROR ROUTINE ?_^1_'JMP* PP3_+YES,RETURN TO CALLER_^1PP2_#ENA_!AFWA-AVEC_$FOR EXTERNAL REJECT: ERROR EXIT_^€€1_'STA- I_-POINT TO FWA OUTPUT (TO GET STATUS)_^1_'RTJ* STTS_*GET STATUS,DO NOT WAIT % FIND NO ERRORS_^1_'NOP_!0_-SHOULD NEVER GET HERE_^1_'JMP* ERROR1_(GO TO ERROR EXIT_^1PP5_#LDA* IREG_*INTERNAL REJECT_^1_'STA- I_-RESTORE LOOP INDEX_^1_'LDA* ERRFLG_^1_'SAZ_!PP4_+ERROR ROUTINE HAS BEEN ENTERED ?_^1_'JMP* PP3_+YES,RETURN TO CALLER_^1PP4_#JMP* ERR00_)NO,ERROR EXIT_^1_'EJT_^1€€***_]_^1*_]_^1*_'S T A T U S_^1*_]_^1*_'THE FOLLOWING ROUTINE READS THE DYNAMIC STATUS,WAITS UNTIL_^1*_'SPECIFIED EVENTS OCCUR, AND THEN CHECKS IF THERE WERE ANY_^1*_'SPECIFIED ERRORS.IF THERE WERE ERRORS IT RETURNS TO THE NEXT_^1*_'INSTRUCTION IN THE CALLING PROGRAM.IF NO ERROR-IT SKIPS ON_^1*_'IT ( ASSUMING THAT IT IS A ONE-WORD INSTRUCTION)._^1*_'ANY REJECT WILL CAUSE AN ERROR E€€XIT UNLESS ERROR ROUTINE HAS_^1*_'ALREADY BEEN ENTERED._^1*_%ON ENTRY I DOES NOT HOLD THE LOOP INDEX.THEREFORE THE INDEX IS_^1*_%LOADED INTO Q FROM IREG(WHICH SHOULD HOLD THE CURRENT LOOP_^1*_%INDEX ON ENTRY )._^1*_%I IS RESTORED ONLY AFTER THE COMPLETION OF THE OPERATION._^1*_]_^1STTS_"NUM_!0_^1PS2_#ENQ_!QSTTS_)SET Q REG FOR STATUS READING_^1_'ADQ* EQPCDE_(ADD EUIPMENT CODE_^1_€€'INP_!INRJCT-*_%INPUT STATUS_^1_'JMP* PS10_^1INRJCT NOP_!0_-INTERNAL REJECT_^1_'LDA* IREG_*EXTERNAL REJECT_^1_'STA- I_-RESTORE LOOP INDEX_^1_'LDA* ERRFLG_^1_'SAZ_!PS4_+ERROR ROUTINE ?_^1_'JMP* PS3_+YES,RETURN_^1PS4_#JMP* ERR00_)NO,ERROR EXIT_^1PS10_"BSS_!PS10(0)_'NO REJECT-CONTINUE_^1_'STA* DYNST_)SAVE STATUS_^1_'LDQ* IREG_*GET LOOP INDEX_^1_'AND_!WATMSK,Q_%EXTRACT BITS TO€€ WAIT ON_^1_'EOR_!WATRSL,Q_%CHECK WITH EXPECTED RESULT_^1_'SAZ_!PS1_+ALL BITS MATCH ?_^1_'JMP* PS2_+NO,GET ANOTHER STATUS_^1PS1_#BSS_!PS1(0)_(YES,CONTINUE (OPERATION FINISHED)_^1_'LDA- I_^1_'STA* IMEM_*SAVE $00FF_^1_'STQ- I_-RESTORE INDEX REG._^1_'LDA* DYNST_)GET STATUS_^1_'AND_!ERRMSK,I_%EXTRACT BITS THAT INDICATE POSSIBLE ERRORS_^1_'EOR_!ERRSLT,I_%CHECK WITH BITS SETTING FOR€€ NO ERROR_^1_'SAN_!PS3_+IS THERE AN ERROR ?_^1_'RAO* STTS_*NO, SKIP ONE INSTRUCTION ON RETURN_^1PS3_#JMP* (STTS)_(RETURN_^1_'EJT_^1***_]_^1*E_]_^1*_]_^1*_'E N D_!R E Q U E S T_^1*_]_^1*_'FINISH THE REQUEST :_^1*_'IF ERRFLG = 0 : NORMAL EXIT(A = $FFFF, Q = 0 )_^1*_'IF ERRFLG # 0 : ERROR EXIT ( A = 0, Q = STATUS FROM ERSTTS )_^1*_%RESTORE I REG. (TO STARTING SECTOR)._^1*_]_^1ENDREQ€€ BSS_!ENDREQ(0)_$END REQUEST ROUTINE ENTRY POINT_^1_'LDA* IMEM_*GET IMAGE OF LOCATION $00FF_^1_'STA- I_-RESTORE I REG._^1_'LDQ* ERRFLG_(ERROR STATUS_^1_'SQZ_!P26_+ERROR OCCURRED ?_^1_'CLR_!A_-YES,CLEAR A_^1_'LDQ* ERSTTS_(GET BAD STATUS_^1_'JMP* RETURN_^1P26_#SET_!A_-A = $FFFF ( SUCCESSFUL REQUEST)_^1RETURN JMP_!(MDRIVE)_%RETURN TO CALLING PROGRAM_^1_'EJT_^1***_]_^1*_]_^1*_%€€P R E_!U N I T_!S E L E C T_^1*_]_^1*_'CHECK FST FLAG TO SEE IF A SEARCH FOR THE FIRST READY UNIT_^1*_'IS NECESSARY.IF POSITIVE-PREPARE THE SEARCH.OTHERWISE,_^1*_'SET SEARCH COUNTER TO ZERO,SO THAT IF THE PREVIOUSLY_^1*_'SELECTED UNIT IS NOT READY - AN ERROR MESSAGE WILL RESULT_^1*_'(BUT NOT A SEARCH)._^1*_]_^1UNTPRE BSS_!UNTPRE(0)_$PRE OUTPUT (UNIT SELECT)_^1_'LDA_!FST_+IF FST=0:€€IT IS A NEW REQUEST - SEARCH_^1*_;FOR FIRST READY UNIT.OTHERWISE - OPERATE_^1*_;ON THE UNIT USED IN LAST REQUEST._^1_'SAZ_!P32_+SEARCH NEEDED ?_^1_'CLR_!A_-NO,SET SEARCH COUNTER TO END OF SEARCH_^1_'JMP* P33_^1P32_#BSS_!P32(0)_^1_'RAO_!FST_+FST=1:IF NEXT REQUEST IS OF THE SAME TYPE_^1*_;(LOAD,SAVE,VERIFY)- USE THE SAME UNIT_^1_'LDA_!INVRSE_(INVERSE DISKS MODE FLAG (ENTRY POINT):_^€€1*_;0 - NORMAL $40 - INVERSE DISKS_^1_'EOR_!=XUNTSEL_%ADD UNIT 0 SELECT TO FORM A-REG._^1_'STA_!AUNTSL_(STORE IN AVEC FOR UNIT SELECT OPERATION_^1_'ENA_!-3_,PREPARE TO LOOP 4 TIMES(FOR 4 UNITS)_^1P33_#STA_!TEMP1_)SET SEARCH COUNTER_^1_'JMP* DOUT_^1_'SPC_!3_^1***_]_^1*_]_^1*_%P O S T_!U N I T_!S E L E C T_^1*_]_^1*_'THIS ROUTINE SEARCHES FOR THE FIRST UNIT (OUT OF 4 ) THAT_^1*_'I€€S READY.IF NONE - IT RETURNS WITH ERROR.OTHERWISE,_^1*_'IT PREPARES UNIT SELECT/DESELECT OUTPUTS._^1*_]_^1UNTPST BSS_!UNTPST(0)_$AFTER UNIT SELECT OUTPUT_^1_'LDQ_!DYNST_)GET STATUS_^1_'LRS_!1_-SHIFT "READY" BIT INTO A_^1_'SAM_!P3_,IF READY - OPERATE ON THIS UNIT.ELSE,_^1_'LDA_!TEMP1_)GET UNIT COUNTER_^1_'SAN_!P4_,ALL UNITS FAILED ?_^1_'JMP* ERROR1_(YES, ERROR EXIT_^1P4_$RAO_!TE€€MP1_)INCRASE COUNTER_^1_'ENA_!UNTDIF_(GET DIFFERENCE TO NUEXT UNIT SELECT_^1_'ADD_!AUNTSL_(ADD TO THIS ONE_^1_'STA_!AUNTSL_(SAVE IN AVEC FOR NEXT OUTPUT_^1_'JMP_!DOUT_*SELECT NEXT UNIT_^1P3_$LDA_!AUNTSL_(GET UNIT SELECT WORD (FIRST READY UNIT)_^1_'EOR_!=XUNTSEL_%RESET_#"SELECT/DESELECT" BIT_^1_'STA_!AUNTDS_(STORE IN AVEC FOR "DESELECT UNIT"._^1_'JMP_!INCRI_)MOVE TO NEXT OUTPUT_^1_€€'SPC_!3_^1***_]_^1*_]_^1*_%P R E_"R T Z S_^1*_]_^1*_'CHECK IF SEEK ERROR BIT IS SET,OR IF "ON CYLINDER" BIT_^1*_'IS RESET.IF SO,EXECUTE RETURN TO ZERO SEEK (RTZS ) TO RESET_^1*_'ANY SEEK ERROR AND TO RECALIBRATE THE SELECTED UNIT._^1*_'OTHERWISE - SKIP ON RTZS._^1*_]_^1RTZSPR BSS_!RTZSPR(0)_$RTZS PRE-OUTPUT ROUTINE_^1_'LDA_!DYNST_)GET STATUS_^1_'AND_!=XSKERR_'MASK SEEK ERROR % "O€€N CYLINDER"BITS_^1_'EOR_!=XSKRSL_'CHECK IF ERROR OR NOT ON CYLINDER_^1_'SAN_!P27_+RTZS NEEDED?_^1_'JMP_!INCRI_)NO ERROR % ON CYLINDER-SKIP RTZS_^1P27_#JMP_!DOUT_*CONTINUE_^1_'SPC_!3_^1***_]_^1*E_]_^1*_]_^1*_%P R E_!B A N K_!S E L E C T_^1*_]_^1*_'THE FOLLOWING CHECKS THE DENSITY OF THE DISK,CHECKS FOR_^1*_'SPLIT REQUEST AND PREPARES IT IF NECCESSARY._^1*_'IT ALSO SERVES AS AN ENTRY€€ POINT FOR THE SECOND PART_^1*_'OF A DIVIDED REQUEST._^1*_]_^1BNKPRE BSS_!BNKPRE(0)_$BANK SELECT PRE OUTPUT ROUTINE_^1_'LDA_!LNGTH2_(SPLIT REQUEST FLAG_^1_'SAN_!P30_+SECOND HALF OF A REQUEST ?_^1_'JMP* P12_+NO_^1P30_#BSS_!P30(0)_^1_'LDQ_!ALNGTH_(GET LENGTH OF FIRST PART_^1_'ADQ_!AFWA_*CALCULATE NEW FWA_^1_'STQ_!AFWA_*UPDATE AFWA_^1_'STA_!ALNGTH_(UPDATE REQUEST LENGTH._^1_'CLR_!€€A_^1_'STA_!LNGTH2_(CLEAR FLAG_^1_'CLR_!Q_-POINT TO CYLINDER ZERO_^1_'LDA_!=N$4000_'POINT TO SURFACE=0,DISK=1,SECTOR=0_^1_'JMP* SETPRM_(SKIP ALL CALCULATIONS_^1***_]_^1*_]_^1*_'EXTRACT THE DENSITY BIT FROM STATUS WORD,AND DETERMINE_^1*_'THE DISK DENSITY.(AFTER LAST OPERATION,DYNST HOLDS A VALID_^1*_'STATUS WORD)._^1*_]_^1P12_#LDA_!DYNST_)GET STATUS TO CHECK DENSITY_^1_'ALS_!DNSHFT€€_(SHIFT DENSITY BIT INTO SIGN BIT_^1_'LDQ_!=XSINFST_%SINGLE DENSITY,FIRST SECTOR OF FIXED DISK_^1_'SAM_!P5_,SKIP IF DISK IS SINGLE DENSITY_^1_'LDQ_!=XDBLFST_%DOUBLE DENSITY FIRST SECTOR OF FIXED DISK_^1P5_$STQ_!FSTDS1_(SAVE ADDRESS OF FIRST SECTOR ON DISK 1_^1***_]_^1*_]_^1*_'THE FOLLOWING CHECKS IF THE REQUEST SHOULD BE SPLIT._^1*_'A REQUEST IS SPLITTED IF IT STARTS ON DISK 0 (REM€€OVABLE IN_^1*_'NORMAL MODE) AND ENDS ON DISK 1.WHEN THIS HAPPENS, THE_^1*_'REQUEST IS DIVIDED INTO TWO:ONE FOR DISK 0 AND ONE FOR_^1*_'DISK 1. WORD LNGTH2 SERVES TO DESIGNATE IF THE REQUEST IS_^1*_'SPLITTED (AND THEN IT CONTAINS THE LENGTH OF THE SECOND_^1*_'REQUEST) OR IF IT IS ONE REQUEST ( LNGTH2 = 0 )._^1*_]_^1_'LDA_!STSEC_)GET STARTING SECTOR_^1_'SAP_!P35_+SECTOR AT END OF DI€€SK 1 (DOUBLE DENSITY)?_^1_'JMP* CONT1_)YES,NO SPLIT REQUEST_^1P35_#BSS_!P35(0)_(CHECK IF SECTOR ON DISK 1_^1_'SUB_!FSTDS1_(SUBTRACT FIRST SECTOR ON DISK 1_^1_'SAM_!P6_,REQUEST STARTS ON DISK 0 ?_^1_'JMP* CONT1_)NO,CONTINUE (NO SPLIT REQUEST)_^1P6_$MUI_!=X(-SCWRD)_#MUI BY -NO.OF WORDS PER SECTOR TO GET_^1*_;NO.OF WORDS TILL THE END OF DISK 0_^1_'SQN_!CONT1_)IF Q#0 OR BIT 15 OF A €€IS 1 THEN THERE ARE_^1_'SAM_!CONT1_)ENOUGH WORDS SINCE THE LENGTH OF ANY_^1*_;REQUEST CANNOT EXCEED (2**15-1)._^1_'SUB_!ALNGTH_(DIFFERENCE BETWEEN REQ. AND WORDS LEFT ON_^1*_;DISK 0._^1_'SAP_!CONT1_)REQUEST ENDS ON DISK 0 ?_^1_'TCA_!Q_-GET LENGTH OF SECOND REQUEST_^1_'ADD_!ALNGTH_(GET LENGTH OF FIRST REQUEST_^1_'STA_!ALNGTH_(INSERT IN REQUEST (AVEC)_^1_'STQ_!LNGTH2_(SET SECOND €€REQ. LENGTH/NO SPLIT REQ.FLAG_^1***_]_^1*_]_^1*_'THE FOLLOWING CALCULATES THE DISK,CYLINDER,SURFACE AND_^1*_'SECTOR FROM THE ADDRESS OF THE STARTING SECTOR._^1*_]_^1CONT1_!CLR_!Q_^1_'LDA_!STSEC_)STARTING SECTOR ADDRESS_^1_'DVI_!FSTDS1_(GET DISK AND RELATIVE NO. OF SECOTR ON IT_^1_'STA_!TEMP1_)A=0 FOR DISK 0 ,A=1 FOR DISK 1_^1_'ARS_!1_-DISCARD L.S.BIT_^1_'SAZ_!P8_,IS STSEC TOO BIG €€?_^1_'JMP_!ERRFF_)YES, GO TO ERROR EXIT (SEND STATUS:$FFFF)_^1P8_$TRQ_!A_-SECTOR DISTANCE FROM 1ST SECTOR ON DISK_^1_'CLR_!Q_^1_'DVI_!=XSCTR_(GET CYLINDER NO. + SURFACE(L.S.B.)IN A,_^1*_;SECTOR NO. - IN Q._^1*_;SURFACE: =0 FOR TOP, =1 FOR BOTTOM_^1_'ALS_!1_^1_'EOR_!TEMP1_)FORM A WORD OF: CYLINDER,SURFACE,DISK_^1_'QLS_!10_,GET 6 BITS OF SECOTR IN M.S.BITS(SIGN=0)_^1_'LLS_!14_,A:SURF€€ACE,DISK,0,SECOTR,0...0;_^1_'QLS_!4_-Q:0,0,0,CYLINDER,0,0,0,0;_^1***_]_^1*_]_^1*_%S E T P R M_^1*_]_^1*_'SET THE REQUEST PARAMETERS IN THE PROPER LOCATIONS IN AVEC._^1*_'ON ENTRY, Q HOLDS THE CYLINDER NO. AS SHOULD BE SENT (IN_^1*_'A-REG) BY SEEK OUTPUT,A HOLDS THE SURFACE,DISK AND SECTOR_^1*_'IN THE REQUIRED FORMAT (EXCEPT FOR READ/WRITE/COMPARE BITS)_^1*_'IN CASE OF A SPLITTED R€€EQUEST,THE PROGRAM RETURNS TO HERE_^1*_'TO SET PARAMETERS FOR THE SECOND PART OF THE REQUEST._^1*_]_^1SETPRM BSS_!SETPRM(0)_^1_'STQ_!ASKRW_)INSERT IN SEEK FOR READ/WRITE_^1_'TRA_!Q_^1_'EOR_!RDWRT_)SET READ/WRITE BITS ACCORDING TO FLAG_^1_'STA_!ARDWR_)INSERT READ/WRITE INSTRUCTION IN AVEC_^1_'INQ_!CMCODE_(SET COMPARE BITS_^1_'STQ_!ACOMP_)INSERT COMPARE INSTRUCTION IN AVEC_^1_'CLR_!€€A_^1_'STA_!CMPFLG_(SET COMPARE FLAG TO READ/WRITE OPERATION_^1_'JMP_!DOUT_*RETURN_^1_'EJT_^1***_]_^1*E_]_^1*_]_^1*_%P R E_!R E A D / W R I T E_^1*_]_^1*_%CHECK IF READ/WRITE HAS BEEN EXECUTED.IF SO,SKIP ON IT_^1*_%AND CONTINUE TO COMPARE.IF NOT,SET FLAG TO COMPARE AND_^1*_%EXECUTE READ/WRITE._^1*_]_^1RWRPRE BSS_!RWRPRE(0)_$READ/WRITE PRE OUTPUT ROUTINE_^1_'LDA_!CMPFLG_(GET COMPARE€€ FLAG_^1_'SAZ_!P31_+READ/WRITE ?_^1_'JMP_!INCRI_)NO,EXECUTE COMPARE_^1P31_#RAO_!CMPFLG_(YES,SET TO COMPARE FOR NEXT TIME THROUGH_^1_'JMP_!DOUT_*EXECUTE READ/WRITE_^1_'SPC_!3_^1***_]_^1*_]_^1*_%P O S T_!R E A D / W R I T E_^1*_]_^1*_%GO BACK TO MEMORY BANK SELECT TO EXECUTE COMPARE(BUT_^1*_%SKIP ON CALCULATIONS)._^1*_]_^1RWRPST BSS_!RWRPST(0)_$READ/WRITE POST OUTPUT ROUTINE_^1_'ENA€€_!ABNKSL-AVEC_"POINT TO MEMORY BANK SELECT_^1_'STA- I_-SET IN I REG._^1_'JMP_!DOUT_*SKIP ON CALCULATIONS IN BNKPRE_^1_'SPC_!3_^1***_]_^1*_]_^1*_%P O S T_!C O M P A R E_^1*_]_^1*_'CHECK IF REQUEST IS DIVIDED INTO TWO.IF POSITIVE, SET_^1*_'PARAMETERS FOR SECOND PART AND GO BACK TO EXECUTE IT._^1*_'OTHERWISE - FINISH THE REQUEST AND RETURN TO CALLER._^1*_]_^1COMPST BSS_!COMPST(0)_$€<COMPARE POST-OUTPUT ROUTINE_^1_'LDA_!LNGTH2_(IF #0 : SECOND PART (=SECOND PART LENGTH)_^1_'SAN_!P9_,IS THERE A SECOND PART ?_^1_'JMP_!INCRI_)NO,FINISH THE REQUEST_^1P9_$BSS_!P9(0)_^1_'ENA_!ABNKSL-AVEC_"POINT TO MEMORY BANK SELECT_^1_'STA- I_-SET IN I REG._^1_'JMP_!PMPRE_)EXECUTE SECOND PART OF REQUEST_^1_'END_^__<PQ8334I CSY/ D64 P€1_%NAM Q8334I_'DECK-ID D64 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$CARTRIDGE DISD INITIALIZER FOR ITOS_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*_'THIS DRIVER PROVIDES SOFTWARE CONTROL OF CARTRIDGE DISK DRIVES-_^1*_'-9425,9427 AND "HAWK" THROUGHT CYBER-18 CONTROLLER_^1*_]_^1*_€€]_^1*_0*****************************************************_^1*_0*_$ENTRY PARAMETERS_"(ANY COMBINATION)_'*_^1*_0*_(REG. A = (+) FWA OF BUFFER (FWAB)_(*_^1*_0*_(REG. A = $FFFF WRITE ADDRESS TAGS_^1*_0*_(REG. Q = (+) NO. OF WORDS TO READ_(*_^1*_0*_(REG. Q = (-) COMPLEMENT OF WORDS TO WRITE *_^1*_0*_(REG. I = (+) STARTING SECTOR ADDRESS_$*_^1*_0*_R*_^1*_0*_$EXIT PARAMETERS-IF OK_6*_€€^1*_0*_(REG. A =-0_?*_^1*_0*_(REG. Q = 0_?*_^1*_0*_(REG. I = (+) STARTING SECTOR ADDRESS_$*_^1*_0*_R*_^1*_0*_$ERROR EXIT_B*_^1*_0*_(REG. A = 0_?*_^1*_0*_(REG. Q = ERROR CODE_6*_^1*_0*_12 = ALARM ERROE_1*_^1*_0*_15 = INTERNAL REJECT_-*_^1*_0*_16 = EXTERNAL REJECT_-*_^1*_0*_013 = WRITE PROTECT_^1*_0*_17 = NO COMPARE ERROR_^1*_0*_014 = NOT READY_3*_^1*_0*_017 = SEEK ERROR_2*_^1*_0*_07€€0 = BUS OFF_5*_^1*_0*_074 = SECTOR ADDRESS TOO GREAT_#*_^1*_0*_0FF = UNKNOWN ERROR_/*_^1*_0*_(REG. I = LAST HARDWARE STATUS_,*_^1*_0*_R*_^1*_0*****************************************************_^1*_]_^1*E_]_^1*_]_^1*_'DESCRIPTION:_^1*_'------------_^1*_]_^1*_'THIS PROGRAM IS A STATUS DRIVEN DRIVER.THIS MEANS THAT_^1*_'INSTEAD OF USING INTERRUPTS TO SIGNAL THE END OF SPECIFIED_^1*€€_'OPERATIONS,IT LOOPS ON THE STATUS AND WAITS UNTIL SPECIFIED_^1*_'CONDITIONS ARE MET (EOP,ON CYLINDER,ETC.)._^1*_'THE DRIVER OPERATION IS BASED ON A TABLE COMPOSED OF_^1*_(7 VECTORS.THE N-TH ENTRY IN THIS TABLE GIVES THE_^1*_'REQUIRED A AND Q REGISTERS FOR THE N-TH OUTPUT OPERATION,_^1*_'TWO MASKS FOR THE STATUS WORD AND THE_!EXPECTED RESULTS_^1*_'AFTER APPLYING THESE MASKS,AN€€D POINTERS TO ROUTINES TO BE_^1*_'EXECUTED AFTER THE OUTPUT OPERATIONS._^1*_'THE TABLE ENTRIES ARE ORDERED ACCORDING TO THE SEQUENCE_^1*_'OF INSTRUCTIONS SENT TO THE CONTROLLER._^1*_]_^1*_'A TYPICAL I/O CYLCLE IS AS FOLLOWS (DISREGARDING_^1*_'ROUTINES' BOUNDARIES ) :_^1*_0SET I-REG. TO ORDINAL NO. OF REQUIRED I/O._^1*_0JMP ACCORDING TO PREVEC ( BY I )_^1*_0LDA FROM TABLE (INDE€€XED BY I-REG.)_^1*_0LDQ FROM TABLE (BY I)_^1*_0ADQ EQUIPMENT CODE_^1*_0OUT REJECT - *_^1*_0GET DYNAMIC STATUS IN A._^1*_0AND WITH WATMSK FROM TABLE (BY I)_^1*_0EOR WITH WATRSL FROM TABLE (BY I)_^1*_0WAIT UNTIL A=0 (I.E.: IF A #0 THEN GET A NEW STATUS)_^1*_0LDA WITH LAST STATUS_^1*_0AND WITH ERRMSK (BY I)_^1*_0EOR WITH ERRSLT (BY I)_^1*_0IF A=0 THEN CONTINUE.ELSE - RETUR€€N ERROR._^1*_0JMP ACCORDING TO NEXTBL ( BY I )_^1*_]_^1*_'WATMSK ENABLES THE DRIVER TO WAIT UNTIL CERTAIN EVENTS HAVE_^1*_'OCCURRED ( EOP,ON CYLINDER ETC.)._^1*_'ERRMSK CHECKS IF ANY ERROR CONDITION HAS BEEN SET, AND IF SO,_^1*_'IT EXITS FROM THE DRIVER._^1*_]_^1*_]_^1*_'NEXTBL ENABLE THE PROGRAMMER TO SET PARAMETERS_^1*_'BEFORE EACH OUTPUT AND TO CHECK CONDITIONS (OR ERRORS )_^1€€*_'OR EVEN REPEAT THE OUTPUT AFTER EACH OPERATION._^1*_]_^1*_]_^1*_'THE UNIT ON WHICH THE DRIVER WILL OPERATE IS THE FIRST UNIT_^1*_'ALONG THE DAISY CHAIN THAT IS READY._^1*_]_^1*_]_^1*_'AFTER THE REQUEST IS FINISHED,THE UNIT IS DESELECTED_^1*_'AND THE BUS IS RELEASED._^1_(EJT_^1*E_]_^1*_'THE STATUS WORD IS BUILT AS FOLLOWS:_^1*_]_^1*_(15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 €€ 0_^1*_'-------------------------------------------------_^1*_'I I I I IXXIXXIXXI I IXXI I I I I I I_^1*_'-------------------------------------------------_^1*_)' ' ' '_*' '_#' ' ' ' ' '_^1*_)' ' ' '_*' '_#' ' ' ' ' '_^1*_)' ' ' ON BUS_$' SINGLE' ' ' ' ' UNIT READY(=1)_^1*_)' ' '_-' DNSITY' ' ' ' '_^1*_)' ' DEVICE SEEK_"' (=1) ' ' €€ ' ' CONTROLLER BUSY =1_^1*_)' ' ERROR_)'_'' ' ' '_^1*_)' '_0EOP(=1) ' ' ' INTERRUPT_^1*_)' CONTROLLER_0' ' '_^1*_)' PROTECTED_1' ' ALARM_^1*_)'_<' '_^1*_)BUS BUSY_5' ON CYLINDER_^1*_G'_^1*_GDISK WRITE PROTECTED_^1*S2_]_^1*_]_^1*_'ENTRY POINTS :_^1*_'--------------_^1*_]_^1*_]_^1_(ENT_$MMINIT_$ENTRY FOR I2_^1_(ENT_$QMASS_%ENTRY TO DRIVER_^1_(ENT_$EMASS_%W.E.S FU€€NCTION CODE_^1_'ENT_!INVRSE_(INVERSE DISKS MODE FLAG_^1_%ENT SIZMAS_'ROUTINE TO CONVERT MM DEVICE SIZE_%**ITOS_^1_%ENT MAXSEC_'LARGEST SECTOR AVAILABLE_^1_%ENT NFILES_'MAXIMUM NUMBER OF FILES ON SYSTEM VOLUME_^1*_]_^1_%EQU MAXSEC($5BF0)_^1_%EQU NFILES(256)_^1*_]_^1*_'EXTERNALS :_^1*_'-----------_^1_(EXT*_#I2RETN_^1*_]_^1*E_]_^1****_]_^1_(EJT_^1***_]_^1*_0A U T O L O A D_!R O €€U T I N E_^1*_]_^1*_]_^1*_'THROUGHT THIS ROUTINE TRANSFER THREE PARAMETERS_^1*_'TO MODEL I2_#1) AUTOLOAD PROGRAM LENGTH_^1*_72) DISTANCE TO AUTOLOAD TABLE_^1***_53) ADDRESS OF AUTOLOAD PROGRAM_^1MMINIT_!LDQ_$=XDSKEND-START1_!AUTOLOAD PROGRAM LENGTH_^1_(LDA_$=XPART01-START1_!DISTANCE TO AUTOLOAD TABLE_^1_(RTJ_$I2RETN_$RETURN TO I2 WITH AUTOLOAD ADDRES PROG._^1_(SPC_$2_^1*_]_^1_(SPC€€_$2_^1START1_!IIN_$0_^1_(APM_,SET TO ABSOLUTE PAGE MODE_^1_(SPC_$2_^1***_]_^1*_'THIS ROUTINE_^1*_'CLEAR CORE (LOWER 65K) TO ZERO, OR RESET PARITY_^1*_'BY DOING A LOAD AND STORE._^1*_'CORE SIZE IS PASSED BY IDRIV VIA CONTRL AT SYSTEM_^1*_'INITIALIZATION WHEN THE AUTOLOAD AREA IS WRITTEN_^1*_]_^1*_'IF THE SELECTIVE SKIP SWITCH IS : SET - LOAD AND STORE MEMORY_^1*_INOT SET - ZERO MEM€€ORY_^1*_]_^1*S2_]_^1*_'THIS ROUTINE MOVES THE DRIVER TO THE END OF SPACE_^1*_'PROGRAM AND PERFORM TWO REQUESTS THROUGH THE DRIVER._^1*E_]_^1_(SPC_$2_^1_(LDA*_#MSIZV4 GET VALUE OF HIGHEST CORE LOCTION_^1_(SUB_$=XDSKEND-START1_^1_(TRA_$Q_$END OF PGM TO END OF MEMORY_^1_(CLR_$A,M_"CLEAR IN CASE COME FROM DTLP 'A' OPTION_^1CLR_$SWN_$STORE STORE ZERO IF SELECTIVE SKIP IS OFF_^1_(LDA_$D€€SKEND,Q_#READ AND STORE_^1STORE_"STA_$DSKEND,Q_^1_(SQZ_$GO_#DONE, SKIP_^1_(INQ_$-1_#DECREMENT INDEX BY 1_^1_(JMP*_#CLR_"TO REPEAT FOR NEXT CELL_^1GO_%SPE_$0_+CLEAR PARITY ERROR STATUS_^1_(LDQ_$=XDSKEND-LOOP+1 LENGTH TO BE MOVED_^1LOOP01_!LDA*_#LOOP,Q_$THIS ROUTINE MOVES THE DRIVER_^1_(STA*_#(STMSV4),Q TO SPACE PROGRM STARTING FROM 'STMSV4'_^1_(SQZ_$CNT1_^1_(INQ_$-1_^1_(JMP*_#LOOP€€01_^1CNT1_#JMP*_#(STMSV4)_"START THE LOOP AFTER IS HAS BEEN MOVED_^1_(SPC_$1_^1*_'FWA OF CODE MOVED TO LOCATION STMSV4 IN SPACE PROGRAM_^1*_]_^1*_]_^1LOOP_!ENA 16_+SET FIRST SECTOR TO BE READ_,**ITOS_^1_(STA-_#I_^1_(CLR_$A_$SET F. W. A._^1_(LDQ*_#STMSV4 MODIFIED LENGTH OF PART 0_^1_(RTJ*_#QMASS READ IN PART 0_^1_(SAN_$GOON_!SKIP IF NO DISK ERROR_^1_(JMP*_#LOOP_!KEEP TRYING_^1GOON€€_#LDA*_#PART01 PART 1 CORE IMAGE SECTOR ADDRESS_^1_(SAZ_$ONGO_!SKIP IF NOT PART 1 TO LOAD_^1_(STA-_#I_$SET REG. I TO BE FIRST SECTOR OF PART 1_^1_(LDA*_#PART1A MODIFIED CORE ADDRESS OF PART 1_^1_(LDQ*_#LPART1 MODIFIED LENGTH OF PART 1_^1_(RTJ*_#QMASS READ IN PART 1_^1_(SAN_$ONGO_!SKIP IF NO DISK ERROR_^1_(JMP*_#GOON_!KEEP TRYING IF ERROR_^1ONGO_#EIN_$0_$ENABLE INTERRUPT SYSTEM_^1_€€(JMP*_#LOOP-2 GO TO 'RESTRT' IN SPACE PGM. TO RE-START_^1_(SPC_$2_^1PART01_!NUM_$0_$PART 1 CORE IMAGE SECTOR ADDRESS_^1LPART1_!NUM_$0_$MODIFIED LENGTH OF PART1_^1PART1A_!NUM_$0_$MODIFIED CORE ADDRESS OF PART 1_^1STMSV4_!NUM_$0_$ADDRESS IN SPACE WHERE AUTOLOAD IS MOVED TO_^1MSIZV4_!NUM_$0_$CORE SIZE (TO BE FILLED)_^1_(EJT_^1****_]_^1*_'D R I V E R_"S U B R O U T I N E_^1*_]_^1_'SPC_€€!3_^1*_'THE FOLLOWING IS THE TABLE FOR OUTPUT OPERATIONS.IT CONTAINS_^1*_'7 VECTOR:_^1*_,AVEC - A REG. FOR OUTPUTS_^1*_,QVEC - Q REG. FOR OUTPUTS_^1*_,WATMSK - MASK FOR WAITING ON STATUS_^1*_,WATRSL - DESIRED RESULT AFTER APPLYING THE MASK ABOVE._^1*_,ERRMSK - MASK FOR CHECKING ERRORS AT THE END OF_^1*_5AN OUTPUT OPERATION_^1*_,ERRSLT - THE RESULT OF APPLYING THE MASK ABOVE TO THE_€€^1*_5STATUS WORD IF NO ERROR OCCURRED._^1*_'NEXTBL - POINTER TO NEXT ROUTINE TO BE EXECUTE_^1*_]_^1*_'NOTE :_^1*_-THE OPERATION OF THE DRIVER IS BASED ON SEQUENTIAL_^1*_-EXECUTION OF I/O'S ACCORDING TO THIS TABLE.THEREFORE,_^1*_-ADDING A NEW I/O IS DONE BY ADDING THE APPROPRIATE_^1*_-ROUTINE AND BY ADDING AN ENTRY TO EACH OF THE_^1*_-VECTORS ABOVE IN THE PROPER PLACE ACCORDING €€TO THE_^1*_-SEQUENCE._^1*_-EVEN WHEN NO WATMSK OR ERRMSK IS NEEDED - A ZERO ENTRY_^1*_-MUST BE INSERTED IN THE UNNEEDED VECTORS._^1*_]_^1*_'SEEK (AND RTZS) OPERATIONS INCLUDE WAITING FOR "ON CYLINDER"_^1*_'SIGNAL,AND NOT JUST "EOP"._^1*_]_^1****_]_^1_'SPC_!2_^1AVEC_"BSS_!AVEC(0)_'A-REG. FOR OUTPUT OPERATIONS_^1_'SPC_!2_^1ACLCNT NUM_!0_-CLEAR CONTROLLER % WAIT FOR BUS NOT BUSY_^1A€€BSCON NUM_!$80_,BUS CONNECT_^1AUNTSL NUM_!0_-UNIT SELECT - PREPARED % INSERTED BY PROG._^1ARTZS_!NUM_!$20_+RTZS - RETURN TO ZERO SEEK_^1ABNKSL NUM_!0_-MEMORY BANK 0 SELECT_^1ALNGTH NUM_!0_-REQUEST BLOCK LENGTH (NO. OF WORDS) -_^1*_;INSERTED BY PROGRAM._^1AFWA_"NUM_!0_-FIRST WORD ADDRESS IN MEMORY - INSERTED_^1*_;BY PROG._^1ASKRW_!NUM_!0_-SEEK FOR READ/WRITE/WRITE TAGS /COMPARE_€€^1ARDWRC NUM_!0_-READ/WRITE/WRITE ADDRESS /COMPARE_^1AUNTDS NUM_!0_-UNIT DESELECT - INSERTED BY PROG._^1ABSREL NUM_!0_-BUS RELEASE_^1_'SPC_!2_^1QVEC_"BSS_!QVEC(0)_'Q-REG. FOR OUTPUT_^1_'NUM_!$10_+CLEAR CONTROLLER % WAIT FOR BUS NOT BUSY_^1_'NUM_!$8_,BUS CONNECT_^1_'NUM_!$6_,UNIT SELECT_^1_'NUM_!$1_,RTZS_^1_'NUM_!$3_,MEMORY BANK SELECT_^1_'NUM_!$7_,BLOCK LENGTH (NO. OF WORDS)_^1_€€'NUM_!$2_,FIRST WORD ADDRESS (FWA)_^1_'NUM_!$A_,SEEK (FOR READ/WRITE/WRITE TAGS/COMPARE)_^1_'NUM_!$1_,READ / WRITE/ WRITE TAGS/COMPARE_^1_'NUM_!$6_,UNIT DESELECT_^1_'NUM_!$8_,BUS RELEASE_^1_'SPC_!2_^1WATMSK BSS_!WATMSK(0)_$MASK FOR WAITING ON STATUS_^1_'NUM_!0_-NO WAITTING AFTER CLEAR CONTROLLER_^1_'NUM_!$0102_)BUS CON.- WAIT FOR EOP_^1_'NUM_!$0102_)UNIT SEL.- EOP_^1_'NUM_!$0010_)€€RTZS-WAIT FOR "ON CYLINDER" (CONTROLLER_^1*_;DOES NOT BECOME BUSY FOR RTZS)._^1_'NUM_!0_-BANK SELECT - DUMMY ENTRY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY ENTRY_^1_'NUM_!0_-FWA - DUMMY ENTRY_^1_'NUM_!$0112_)SEEK - EOP % "ON CYLINDER"_^1_'NUM_!$0102_)READ/WRITE/ WRITE TAGS/COMPARE-EOP_^1_'NUM_!$0102_)UNIT DESELECT - EOP_^1_'NUM_!$0102_)BUS RELEASE - EOP_^1_'SPC_!2_^1WATRSL BSS_€€!WATRSL(0)_$RESULT OF STATUS "ANDED" WITH WATMSK IF_^1*_;THE SPECIFIED EVENTS OCCURED (I.E.:THE_^1*_;PROGRAM SHOULD EXIT FROM WAITING LOOP)._^1_'NUM_!0_-CLEAR CONTROLLER , COUNTINUE_^1_'NUM_!$0100_)EOP OF BUS CONNECT_^1_'NUM_!$0100_)EOP OF UNIT SELECT_^1_'NUM_!$0010_)"ON CYLINDER" FOR RTZS (ZERO SEEK)_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'N€€UM_!0_-FWA - DUMMY_^1_'NUM_!$0110_)EOP % "ON CYLINDER" FOR SEEK_^1_'NUM_!$0100_)EOP OF READ/WRITE/ WRITE TAGS/COMPARE_^1_'NUM_!$0100_)EOP FOR UNIT DESELECT_^1_'NUM_!$0100_)EOP FOR BUS RELEASE_^1_'SPC_!2_^1ERRMSK BSS_!ERRMSK(0)_$MASK FOR CHECKING FOR ERRORS_^1_'NUM_!$010E_)CLEAR CONTROLLER_^1_'NUM_!$110A_)BUS CONNECT_^1_'NUM_!$110A_)UNIT SELECT_^1_'NUM_!$311B_)RTZS(% "ON CYLINDER")€€_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$311B_)SEEK (% "ON CYLINDER")_^1_'NUM_!$311B_)READ/WRITE / WRITE TAGS/COMPARE_^1_'NUM_!$110A_)UNIT DESELECT_^1_'NUM_!$110A_)BUS RELEASE_^1_'SPC_!2_^1ERRSLT BSS_!ERRSLT(0)_$RESULT OF STATUS "ANDED" WITH ERRMSK IF_^1*_;NO ERROR OCCURED_^1_'NUM_!$0100_)CLEAR CONTROLLER - EOP_€€^1_'NUM_!$1100_)BUS CONNECT- "ON BUS" % EOP_^1_'NUM_!$1100_)UNIT SELECT - "ON BUS" % EOP_^1_'NUM_!$1111_)RTZS - "ON BUS % CYLINDER",READY % EOP_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$1111_)SEEK - "ON BUS % CYLINDER",READY % EOP_^1_'NUM_!$1111_$READ/WRITE/ WRITE TAGS/COMPARE-ON BUS%CYL,READY_^1_'NUM_!$1100_)UNIT €€DESELECT - "ON BUS" % EOP._^1_'NUM_!$0100_)BUS RELEASE - EOP._^1_'SPC_!2_^1NEXTBL_!EQU_$NEXTBL(*) POINTER FOR ROUTINE TO BE EXECUTED AFTER:_^1_(ADC*_#NXINCI I=0_%CLEAR CONTROLLER_^1_(ADC*_#NXUSLC I=1_%BUS CONNECT_^1_(ADC*_#NXUFIN I=2_%UNIT SELECT_^1_(ADC*_#NXINCI I=3_%RTZS_^1_(ADC*_#NXBLKL I=4_%MEMORY BANK SELECT_^1_(ADC*_#NXINCI I=5_%BLOCK LENGTH_^1_(ADC*_#NXINCI I=6_%FIRS€€T WORD ADDRESS_^1_(ADC*_#NXRWCM I=7_%SEEK_^1_(ADC*_#NXRWCM I=8_%READ/WRITE/WRITE TAGS/COMPARE_^1_(ADC*_#NXINCI I=9_%UNIT DE-SELECT_^1_(ADC*_#ENDREQ I=10_$BUS RELEASE_^1*_]_^1*_(END OF OUTPUT OPERATIONS TABLE._^1_'EJT_^1*_'THE FOLLOWING IS THE LIST OF ALL EQU'S,NUM'S,AND BSS'S_^1*_'FOR THE PROGRAM( IN ALPHABETIC ORDER)._^1*_]_^1CMCODE EQU_!CMCODE(11)_#L.S.BITS FOR A-REG. IN CO€€MPARE INSTRUCTION_^1CMPFLG_!NUM_$0_$COMPARE FLAG_^1SCTR_"EQU_!SCTR(29)_%NO. OF SECTORS ON A TRACK_^1DBLDNS EQU_"DBLDNS(406)_!NO. OF CYLINDERS ON DOUBLE DENSITY DISK_^1DBLFST EQU_!DBLFST(DBLDNS*SCTR*2-1) FIRST SECTOR ADD.OF FIXED DISK_^1*_EFOR DOUBLE DENSITY._^1DEVICE EQU DEVICE($E)_"EQUIPMENT NUMBER_^1DNSHFT EQU_!DNSHFT(8)_$NO. OF SHIFTS TO GET DENSITY BIT FROM_^1*_;STATUS WO€€RD IN SIGN BIT_^1EMASS_"ADC_$DEVICE*128+1 W.E.S. FUNCTION CODE_^1FSTDS1 BSS_!FSTDS1(1)_$FIRST SECTOR ADDRESS OF DISK 1._^1INVRSE_!NUM_$$80_"INVERSE DISK MODE ; $80-NORMAL,$C0-INVERSE_^1*_;REQUEST.IF ZERO-THE REQ. IS NOT SPLITTED._^1QSTTS_!EQU_!QSTTS($10)_#Q REG. VALUE TO INPUT STATUS_^1RDCODE EQU_!RDCODE(9)_$L.S.BITS FOR A-REG. IN READ INSTRUCTION_^1RDWRT_!BSS_!RDWRT(1)_%READ €€/ WRITE FLAG (= BITS FOR A-REG.)_^1SCWRD_!EQU_!SCWRD(96)_$NO.OF WORDS PER SECTOR_^1SINDNS EQU_"SINDNS(203)_!NO. OF CYLINDERS ON SINGLE DENSITY DISK_^1SINFST EQU_!SINFST(SINDNS*SCTR*2-1) FIRST SECTOR ADD.OF FIXED DISK_^1*_EFOR SINGLE DENSITY_^1SKERR_!EQU_!SKERR($2010)_!MASK FOR SEEK ERROR % "ON CYLINDER" BITS_^1SKRSL_!EQU_!SKRSL($10)_#EXPECTED RESULT AFTER APPLYING SKERR_^1*_;TO €€STATUS, IF NO ERROR_^1STSEC_!BSS_!STSEC(1)_%STARTING SECTOR FOR REQUEST_^1TEMP2_"NUM_$0_*TEMPORARY FOR READ/WRITE CODE_^1*_;SELECT WORDS._^1UNTSEL EQU_!UNTSEL($80)_"UNIT 0 SELECT - A REG._^1WADCOD_!EQU_$WADCOD(13) L.S.BITS FOR A-REG. IN WRITE TAGS INSTR._^1WRCODE EQU_!WRCODE(10)_#L.S.BITS FOR A-REG. IN WRITE INSTRUCTION_^1WRPRTC_!EQU_$WRPRTC($20) MASK FOR WRITE PROTECTED_^1_'EJT€€_^1*_'Q M A S S - I N I T I A L I Z E R_^1*_]_^1*_'THE FOLLOWING ROUTINE SAVES THE INPUT PARAMETERS AND CHECKS_^1*_'WHETHER THE REQUEST IS FOR READ OR WRITE OPERATIONS._^1*_]_^1QMASS_"NUM_$0_$DRIVER ENTRY_^1_(STA*_#AFWA_!FIRST WORD ADD. IN AVEC./FLAG FOR WRITE TAGS_^1_(EOR_$=N$FFFF_"CHECK IF A = $FFFF_^1_(SAN_$NTAG_%SKIP IF NOT WRITE ADDRESS_^1_(CLR_$A_^1_(STA_$RDWRT SET READ WR€€ITE FLAG_^1_(STA*_#STSEC SET STARTING SECTOR FOR WRITE ADDRESS_^1_(JMP*_#WRTAG CONTINUE FOR WRITE TAGS_^1NTAG_#ENA_$RDCODE PREPAR FOR READ_^1_(SQP_$P1_#SKIP IF READ (Q>0 IF READ, Q<0 IF WRITE)_^1_(ENA_$WRCODE PREPAR FOR WRITE_^1_(TCQ_$Q_$GET ABSOLUTE VALUE OF NO. OF WORDS_^1P1_%STA*_#RDWRT SET READ/WRITE FLAG_^1_(STQ*_#ALNGTH INSERT NO. OF WORD IN AVEC_^1_(LDA-_#I_^1_(STA*_#STSE€€C SET STARTING SECTOR FOR READ/WRITE_^1_(SPC_$1_^1*_]_^1*_'CHECK IF AUTOLOAD SET UP REQUEST_^1*_'FOR AUTOLOAD REQUEST , PICK UP 'MSIZV4' FROM 'IDRIV'_^1*_]_^1_%INA -1_S**ITOS_^1_(SAN_$NOTAUT_^1_(LDQ*_#QMASS_$TAKE THE RETURN ADDRESS_^1_(LDA-_#2,Q_'PICK 'MSIZV4' FROM 'IDRIV' IN 'I2MZV4_^1_(STA*_#MSIZV4_^1NOTAUT EQU NOTAUT(*)_^1_(SPC_$1_^1WRTAG_"CLR_$A_^1_(STA-_#I_$SET I TO BEGINN€€ING OF OUT PUT TABLE_^1_(STA_$LNGTH2_$CLEAR SPLIT REQUEST FLAG_^1_(STA*_#TEMP2_$SAVE LAST READ/WRITE CODE_^1FROPR_"JMP*_#DOUT_!DUMMY ROUTINE FOR CLEAR CONTROLLER_^1_'EJT_^1*_'E R R O R_%R O U T I N E_^1_(SPC_$1_^1*_'IN ENTRY LOCATION 'DYNST' CONTAIN LAST HARDWARE STATUS_^1*_'ENTRIES EROUT IS FOR EXTERNAL/INTERNAL REJECT REG.Q = 6/5_^1*_0ERROR2 IS FOR ILLEGAL REQUESTA_(REG.Q = 74_€€^1*_0ERROR3 IS FOR NOT READY ERROR_)REG.Q = 14_^1*_0ERROR4 IS FOR WRITE PROTECTED ERROR_"REG.Q = 13_^1*_0ERROR IS FOR DYNAMIC STATUS ERROR_^1*_7IF DEVICE SEEK ERROR IS ON_$REG.Q = 17_^1*_:ELSE IF BUS IS OFF_*REG.Q = 70_^1*_=ELSE IF ALARM BIT IS ON_^1*_=AND COMPARE FLAG IS ON_"REG.Q = 7_^1*_@ELSE IT IS ALARM ERROR REG.Q = 2_^1*_7IF GHOST ERROR HAPPENED_(REG.Q = FF_^1*_'LAST HARDWAR€€E STATUS SAVE IN REG.I IN EXIT REG.A = 0_^1_(SPC_$2_^1EROUT_"LDA_$DYNST_%ENTRY FOR REJECTS % ERROR EXIT_^1_(STA-_#I_$SAVE HARDWARE STATUS_^1_(CLR_$A,M_^1_(JMP_$DSKED1_"RETURN TO THE CALLING ROUTINE_^1ERROR2_!ENQ_$74_#FOR SECTOR ADDRESS GREATER THEN POSSIBLE_^1_(JMP*_#EROUT_4FOR THIS DEVICE_^1ERROR3_!ENQ_$14_#FOR NOT READY ERROR_^1_(JMP*_#EROUT_^1ERROR4_!ENQ_$13_#FOR WRITE PROTECTE€€D ERROR_^1_(JMP*_#EROUT_^1ERROR_"LDQ_$DYNST_%CHECK DYNAMIC STATUS_^1_(QLS_$2_^1_(SQP_$ER1_"SKIP IF NOT DEVICE SEEK ERROR_^1_(ENQ_$17_^1_(JMP*_#EROUT_^1ER1_$QLS_$1_^1_(SQM_$ER2_"SKIP IF BUS OFF_^1_(ENQ_$70_^1_(JMP*_#EROUT_^1ER2_$QLS_$9_^1_(SQP_$ER3_"SKIP IF NOT ALARM ERROR_^1_(LDA_$TEMP1_%IF COMPARE TEMP1 = 1_^1_(INA_$1_)IF ALARM HAPPENDED DURING COMPARE_^1_(SAN_$ER4_(OPERATION THEN€€ NO COMPARE ERROR_^1_(ENQ_$7_^1_(JMP*_#EROUT_^1ER4_$ENQ_$2_*ELSE ALARM ERROR_^1_(JMP*_#EROUT_^1ER3_$ENQ_$-0_#IF GHOST ERROR_^1_(JMP_$EROUT_^1_(EJT_^1****_]_^1*_'O U T P U T_!C Y C L E_"- M A I N_"P R O G R A M_^1*_]_^1*_%THE FOLLOWING ROUTINE IS THE MAIN PROGRAM. IT EXECUTES ALL_^1*_%OUTPUT OPERATIONS,ACCORDING TO THEIR ORDER IN THE TABLE._^1*_%IT INCREMENTS I BY 1 TO POINT TO€€ THE NEXT I/O,JUMPS TO_^1*_%PRE-OUTPUT ROUTINE,EXECUTES OUTPUT,WAITS ON STATUS % CHECKS_^1*_%FOR ERRORS AND JUMPS TO A POST-OUTPUT ROUTINE._^1*_'PRE % POST OUTPUT ROUTINES ENABLE THE PROGRAMMER TO SET_^1*_'PARAMETERS,CHECK CONDITIONS AND CHANGE THE PROGRAM FLOW ._^1*_'A RETURN TO DOUT WILL CAUSE THE OUTPUT (POINTED TO BY I REG)_^1*_'TO BE EXECUTED.A RETURN TO PMPOST CAUSES A SKIP O€€N THE_^1*_'OUTPUT OPERATION.A RETURN TO INCRI CAUSES THE NEXT_^1*_'OUTPUT TO BE EXECUTED._^1*_%NOTICE THAT AN OUTPUT MAY BE REPEATED SIMPLY BY COMING BACK_^1*_%TO THE INSTRUCTION FOLLOWING THE : RAO- I ._^1*_%ON RETURNING TO THIS ROUTINE - I MUST BE RESTORED._^1*_]_^1NXINCI_!RAO-_#I_$MOVE TO NEXT OUTPUT_^1DOUT_#RTJ*_#OUTPUT EXECUTE OUTPUT OPERATION_^1DOSTTS_!RTJ*_#STTS_!WAIT ACC€€ORDING WATMSK % CHECK IF ERRORS_^1ERR_$JMP*_#ERROR ERROR EXIT_^1GONXT_"LDQ*_#NEXTBL,I_"GET RELATIVE ADDRESS OF NEXT ROUTINE_^1_(JMP*_#NEXTBL,B_"CONTINUE NEXT OPERATION_^1****_]_^1_(EJT_^1*_'O U T P U T_^1*_]_^1*_'THE FOLLOWING ROUTINE EXECUTES ALL OUTPUT OPERATIONS._^1*_'ON ENTRY, I POINTS TO THE REQUIRED OUTPUT IN THE OUTPUT_^1*_'TABLE._^1*_]_^1OUTPUT NUM_!0_^1_(LDA_$CMPFLG_$COM€€PARE CODE_^1_(SUB_$ARDWRC_$CHECK IF COMPARE_^1_(TRA_$Q_^1_(LDA_$AVEC,I_$GET A-REG. FOR OUTPUT_^1_(SQN_$NCOMP_%SKIP,IF NOT COMPARE_^1_(LDQ_$TEMP2_%GET READ/WRITE CODE_^1_(STQ_$ARDWRC_$REPLACE READ/WRITE CODE_^1NCOMP_"EQU_$NCOMP(*)_^1_'LDQ_!QVEC,I_(GET Q-REG._^1_(ADQ*_#EMASS_$ADD EQUIPMENT CODE_^1_(INQ_$-1_^1_'OUT_!REJCT-*_'EXECUTE OUTPUT_^1PP3_#JMP* (OUTPUT)_%RETURN_^1REJCT_"JMP*_#€€INTREJ FOR INTERNAL REJECT_^1_(ENQ_$6_$ENTER Q EXTERNAL REJECT CODE_^1_(JMP*_#OUTRJC EXIT TO ERROR ROUTINE_^1INTREJ_!ENQ_$5_$ENTER Q INTERNAL REJECT CODE_^1OUTRJC_!JMP*_#EROUT EXIT TO ERROR ROUTINE_^1_'EJT_^1*_'S T A T U S_^1*_'THE FOLLOWING ROUTINE READS THE DYNAMIC STATUS,WAITS UNTIL_^1*_'SPECIFIED EVENTS OCCUR, AND THEN CHECKS IF THERE WERE ANY_^1*_'SPECIFIED ERRORS.IF THERE €€WERE ERRORS IT RETURNS TO THE NEXT_^1*_'INSTRUCTION IN THE CALLING PROGRAM.IF NO ERROR-IT SKIPS ON_^1*_'IT ( ASSUMING THAT IT IS A ONE-WORD INSTRUCTION)._^1*_'ON ENTRY, I POINTS TO THE CURRENT OUTPUT OPERATION_^1*_]_^1STTS_"NUM_!0_^1PS2_#ENQ_!QSTTS-1_'SET Q REG FOR STATUS READING_^1_(ADQ*_#EMASS_$ADD EQUIPMENT CODE_^1_(INP_$REJCT-*_"TAKE STATUS , NO EXTERNAL REJECT_^1_'STA_$DYNST_€€%SAVE STATUS_^1_'AND_!WATMSK,I_%EXTRACT BITS TO WAIT ON_^1_'EOR_!WATRSL,I_%CHECK WITH THE EXPECTED RESULT_^1_'SAZ_!PS1_+DO ALL BITS MATCH ?_^1_'JMP* PS2_+READ ANOTHER STATUS AND CHECK AGAIN_^1PS1_$LDA_$DYNST_%GET STATUS_^1_'AND_!ERRMSK,I_%EXTRACT BITS THAT INDICATE POSSIBLE ERRORS_^1_'EOR_!ERRSLT,I_%CHECK WITH BITS SETTING FOR NO ERROR_^1_'SAN_!PS3_+IS THERE AN ERROR ?_^1_'RAO* S€€TTS_*NO, SKIP ONE INSTRUCTION ON RETURN_^1PS3_#JMP* (STTS)_(RETURN_^1_'EJT_^1*_'U N I T S E L E C T R O U T I N E_^1*_]_^1NXUSLC_!EQU_$NXUSLC(*)_!PRE-OUTPUT UNIT SELECT_^1_(RAO-_#I_$SET I FOR UNIT SELECT_^1_(CLR_$A_^1_(STA_$TEMP1_^1RUNSLC_!LDA_$TEMP1_%GET UNIT TO BE SELECT_^1_(ALS_$4_^1_(EOR_$INVRSE_$INVERSE DISK MODE (ENTRY POINT)_^1_(STA_#AUNTSL STORE IN AVEC FOR UNIT SELECT O€€PERATION_^1_(JMP*_#DOUT_!DO OUTPUT_^1NXUFIN_!LDQ_$DYNST_%RETURN AFTER UNIT SELECT_^1_(LRS_$1_$SHIFT "READY" BIT INTO A_^1_(SAM_$U1_#IF READY SET UNIT DE-SELECT AND COUNTINUE_^1_(LDA_$TEMP1_%ELSE_^1_(INA_$-3_,IF ALL UNITS FAILED EXIT TO ERROR_^1_(SAZ_$U2_0ELSE_^1_(RAO_$TEMP1_%GET NEXT UNIT_^1_(JMP*_#RUNSLC_1TRY TO SELECT NEXT UNIT_^1U2_%JMP*_#ERROR3 EXIT TO ERROR ROUTINE_^1U1_%LD€€A_$AUNTSL GET THE SELECTED UNIT_^1_(EOR_$=XUNTSEL_^1_(STA_$AUNTDS STORE IN AVEC FOR UNIT DE-SELECT OPERATION_^1*_]_^1_(SPC_$1_^1*_'W R I T E_!P R O T E C T E D R O U T I N E_^1*_]_^1*_'CHECK IF PROTECTED SWITCH IS ON_^1*_]_^1_(LDA_$DYNST TAKE DYNAMIC STATUS AFTER UNIT SELECT_^1_(AND_$=XWRPRTC_!MASK FOR WRITE PROTECTED BIT_^1_(SAZ_$NP1_"SKIP, IF NOT PROTECTED_^1_(LDA_$RDWRT TAKE €€ READ / WRITE FLAG_^1_(INA_$-RDCODE_"DECREASE BY READ CODE_^1_)SAZ_#NP1_"SKIP , IF READ_!ELSE_^1_(JMP*_#ERROR4 SEND WRITE PROTECT ERROR_^1NP1_$EQU_$NP1(*)_#COUNTINUE_^1_'EJT_^1*_'P R E_!R T Z S % W R I T E_!T A G S_^1*_]_^1*_'CHECK IF SEEK ERROR BIT IS SET,OR IF "ON CYLINDER" BIT_^1*_'IS RESET.IF SO,EXECUTE RETURN TO ZERO SEEK (RTZS ) TO RESET_^1*_'ANY SEEK ERROR AND TO RECALIBRA€€TE THE SELECTED UNIT._^1*_'OTHERWISE - SKIP ON RTZS._^1*_]_^1_'LDA_!DYNST_)GET STATUS_^1_'AND_!=XSKERR_'MASK SEEK ERROR % "ON CYLINDER"BITS_^1_'EOR_!=XSKRSL_'CHECK IF ERROR OR NOT ON CYLINDER_^1_(SAN_%RZ_"SKIP, IF ERROR TO EXECUTE RTZS_^1_(SPC_$1_^1CHKTAG_!LDA_$AFWA_!CHECK FOR WRITE ADDRESS_^1_(EOR_$=N$FFFF_"CHECK IF A = $FFFF_^1_(SAN_$NT_#SKIP, IF NO WRITE ADDRESS_^1_(JMP_$WTAGS_$€€GO TO WRITE TAGS_^1_(SPC_$1_^1NT_%RAO-_#I_$COUNTINUE TO NEXT STEP AFTER RTZS_^1RZ_%JMP*_#NXINCI_#RETURN TO MAIN ROUTINE_^1_(EJT_^1_(SPC_$1_^1*_%P R E/P O S T R E A D / W R I T E / W R I T E T A G S_^1*_]_^1NXRWCM_!LDA_$AFWA_!WRITE ADDRESS FLAG_^1_(EOR_$=N$FFFF_"CHECK IF A = $FFFF_^1_(SAN_$NT2_"SKIP , IF NOT WRITE TAGS_^1_(JMP_$NWRTAG_#COUNTNUE WRITING ON NEXT TRACK_^1*_%P O S€€ T_!C O M P A R E_^1*_]_^1*_'CHECK IF REQUEST IS DIVIDED INTO TWO.IF POSITIVE, SET_^1*_'PARAMETERS FOR SECOND PART AND GO BACK TO EXECUTE IT._^1*_'OTHERWISE - FINISH THE REQUEST AND RETURN TO CALLER._^1*_]_^1NT2_$LDA*_#TEMP1_%GET FLAG_^1_(SAZ_$COMP_%IF ZERO , EXECUTE COMPARE_^1_(SAM_$RDWR_%IF NEGATIVE EXECUTE READ/WRITE_^1SPLIT2_!LDA_$LNGTH2_#ELSE, LOAD SPLIT FLAG_^1_(SAM_$CONSPT€€_#COUNTINUE AFTER COMPARE_^1_(JMP*_#SPLIT1_#EXECUTE COMPARE OPERATION_^1CONSPT_!JMP*_#SPLIT_$CONTINUE WITH SECOND REQUEST_^1RDWR_#RAO*_#TEMP1_%RESET THE FLAG_^1_(JMP*_#COT3_%EXECUTE READ_^1COMP_#EQU_$COMP(*)_^1_(RAO*_#TEMP1_%CLEAR THE FLAG_^1_(ENA_$ABNKSL-AVEC_^1_(STA-_#I_*SET I REG. TO OPERATE BLOCK LENGTH_^1_(JMP*_#COT3_^1SPLIT1_!TCA_$A_^1_(STA_$LNGTH2_$STORE COMPLEMENT OF SPLIT€€ FLAG_^1_(LDA_$CMPFLG_$LOAD COMPARE CODE_^1_(STA_$ARDWRC_$STORE FOR COMPARE IN AVEC_^1_(JMP*_#COT3_%EXECUTE COMPARE_^1SPLIT_"INA_$1_)INCREASE SPLIT FLAG BY ONE_^1_'SAM_!P9_,IS THERE A SECOND PART ?_^1_(JMP*_#COT3_%NO,FINISH THE REQUEST_^1P9_$ENA_!ARTZS-AVEC_#OUTPUT BLOCK LENGTH_^1_'STA- I_-POINT I TO BLOCK LENGTH_^1COT3_#JMP_$NXINCI_#EXECUTI/O OPERATION_^1*_]_^1_(EJT_^1*_%P R E_€€!B L O C K_!L E N G T H_^1*_]_^1*_'THE FOLLOWING CHECKS THE DENSITY OF THE DISK,CHECKS FOR_^1*_'SPLIT REQUEST AND PREPARES IT IF NECCESSARY._^1*_'IT ALSO SERVES AS AN ENTRY POINT FOR THE SECOND PART_^1*_'OF A DIVIDED REQUEST._^1*_]_^1NXBLKL_!LDA_$LNGTH2_"LOAD SPLIT FLAG_^1_'SAN_!P30_+SECOND HALF OF A REQUEST ?_^1_'JMP* P12_+NO_^1P30_#BSS_!P30(0)_^1_'LDQ_!ALNGTH_(GET LENGTH OF FIRS€€T PART_^1_'ADQ_!AFWA_*CALCULATE NEW FWA_^1_'STQ_!AFWA_*UPDATE AFWA_^1_'STA_!ALNGTH_(UPDATE REQUEST LENGTH._^1_'CLR_!A_^1_'STA_!LNGTH2_(CLEAR FLAG_^1_'CLR_!Q_-POINT TO CYLINDER ZERO_^1_'LDA_!=N$4000_'POINT TO SURFACE=0,DISK=1,SECTOR=0_^1_'JMP* SETPRM_(SKIP ALL CALCULATIONS_^1*_]_^1*_'EXTRACT THE DENSITY BIT FROM STATUS WORD,AND DETERMINE_^1*_'THE DISK DENSITY.(AFTER LAST OPERATI€€ON,DYNST HOLDS A VALID_^1*_'STATUS WORD)._^1*_]_^1P12_#LDA_!DYNST_)GET STATUS TO CHECK DENSITY_^1_'ALS_!DNSHFT_(SHIFT DENSITY BIT INTO SIGN BIT_^1_'LDQ_!=XSINFST_%SINGLE DENSITY,FIRST SECTOR OF FIXED DISK_^1_'SAM_!P5_,SKIP IF DISK IS SINGLE DENSITY_^1_'LDQ_!=XDBLFST_%DOUBLE DENSITY FIRST SECTOR OF FIXED DISK_^1P5_$STQ_!FSTDS1_(SAVE ADDRESS OF FIRST SECTOR ON DISK 1_^1*_]_^1*_'THE F€€OLLOWING CHECKS IF THE REQUEST SHOULD BE SPLIT_^1*_'A REQUEST IS SPLITTED IF IT STARTS ON DISK 0 (REMOVABLE IN_^1*_'NORMAL MODE) AND ENDS ON DISK 1.WHEN THIS HAPPENS, THE_^1*_'REQUEST IS DIVIDED INTO TWO:ONE FOR DISK 0 AND ONE FOR_^1*_'DISK 1. WORD LNGTH2 SERVES TO DESIGNATE IF THE REQUEST IS_^1*_'SPLITTED (AND THEN IT CONTAINS THE LENGTH OF THE SECOND_^1*_'REQUEST) OR IF IT IS O€€NE REQUEST ( LNGTH2 = 0 )._^1*_]_^1_'LDA_!STSEC_)GET STARTING SECTOR_^1_'SUB_!FSTDS1_(SUBTRACT FIRST SECTOR ON DISK 1_^1_'SAM_!P6_,REQUEST STARTS ON DISK 0 ?_^1_'JMP* CONT1_)NO,CONTINUE (NO SPLIT REQUEST)_^1P6_$MUI_!=X(-SCWRD)_#MUI BY -NO.OF WORDS PER SECTOR TO GET_^1*_;NO.OF WORDS TILL THE END OF DISK 0_^1_'SQN_!CONT1_)IF Q#0 OR BIT 15 OF A IS 1 THEN THERE ARE_^1_'SAM_!CONT1_)EN€€OUGH WORDS SINCE THE LENGTH OF ANY_^1*_;REQUEST CANNOT EXCEED (2**15-1)._^1_'SUB_!ALNGTH_(DIFFERENCE BETWEEN REQ. AND WORDS LEFT ON_^1*_;DISK 0._^1_'SAP_!CONT1_)REQUEST ENDS ON DISK 0 ?_^1_'TCA_!Q_-GET LENGTH OF SECOND REQUEST_^1_'ADD_!ALNGTH_(GET LENGTH OF FIRST REQUEST_^1_'STA_!ALNGTH_(INSERT IN REQUEST (AVEC)_^1_'STQ_!LNGTH2_(SET SECOND REQ. LENGTH/NO SPLIT REQ.FLAG_^1*_]_^1€€*_'THE FOLLOWING CALCULATES THE DISK,CYLINDER,SURFACE AND_^1*_'SECTOR FROM THE ADDRESS OF THE STARTING SECTOR._^1*_]_^1CONT1_!CLR_!Q_^1_'LDA_!STSEC_)STARTING SECTOR ADDRESS_^1_'DVI_!FSTDS1_(GET DISK AND RELATIVE NO. OF SECOTR ON IT_^1_(STA*_#TEMP1_%A=0 FOR DISK 0 , A=1 FOR DISK 1_^1_'ARS_!1_-DISCARD L.S.BIT_^1_'SAZ_!P8_,IS STSEC TOO BIG ?_^1_'JMP_%ERROR2_#YES, GO TO ERROR EXIT_^1P€€8_$TRQ_!A_-SECTOR DISTANCE FROM 1ST SECTOR ON DISK_^1_'CLR_!Q_^1_'DVI_!=XSCTR_(GET CYLINDER NO. + SURFACE(L.S.B.)IN A,_^1*_;SECTOR NO. - IN Q._^1*_;SURFACE: =0 FOR TOP, =1 FOR BOTTOM_^1_'ALS_!1_^1_(EOR*_#TEMP1_%FORM A WORD OF_^1_'QLS_!10_,GET 6 BITS OF SECOTR IN M.S.BITS(SIGN=0)_^1_'LLS_!14_,A:SURFACE,DISK,0,SECOTR,0...0;_^1_'QLS_!4_-Q:0,0,0,CYLINDER,0,0,0,0;_^1_(EJT_^1*_%S E T P R€€ M_^1*_]_^1*_'SET THE REQUEST PARAMETERS IN THE PROPER LOCATIONS IN AVEC._^1*_'ON ENTRY, Q HOLDS THE CYLINDER NO. AS SHOULD BE SENT (IN_^1*_'A-REG) BY SEEK OUTPUT,A HOLDS THE SURFACE,DISK AND SECTOR_^1*_'IN THE REQUIRED FORMAT (EXCEPT FOR READ/WRITE/COMPARE BITS)_^1*_'IN CASE OF A SPLITTED REQUEST,THE PROGRAM RETURNS TO HERE_^1*_'TO SET PARAMETERS FOR THE SECOND PART OF THE REQUES€€T._^1*_]_^1SETPRM BSS_!SETPRM(0)_^1_'STQ_!ASKRW_)INSERT IN SEEK FOR READ/WRITE_^1_'TRA_!Q_^1_'EOR_!RDWRT_)SET READ/WRITE BITS ACCORDING TO FLAG_^1_'STA_!ARDWRC_#INSERT READ/WRITE/COMPARE INSTRUCTION IN AVEC_^1_(STA_$TEMP2_%FLAG FOR READ/WRITE CODE_^1_'INQ_!CMCODE_(SET COMPARE BITS_^1_'STQ_!CMPFLG_(SAVE COMPARE CODE_^1_(ENQ_$-1_^1_(STQ*_#TEMP1_%STORE FLAG FOR READ/WRITE % COMPARE_€€^1_'JMP_!NXINCI_(RETURN_^1_'SPC_!3_^1*_]_^1*_'E N D_!R E Q U E S T_^1*_]_^1*_'FINISH THE REQUEST :_^1*_]_^1ENDREQ BSS_!ENDREQ(0)_$NO-ERROR ENTRY_^1_(LDQ_$STSEC_,SET IN IREG STARTING_^1_(STQ-_#I_0SECTOR FOR EXIT_^1_(CLR_$Q_0CLEAR QREG. FOR EXIT_^1_(SET_$A_$IF NO ERROR REG. A = -0_^1DSKED1_!JMP_$(QMASS)_"RETURN TO THE CALLING ROUTINE_^1DSKEND_!EQU_$DSKEND(*)_^1*_]_^1*THIS THREE LOC€€ATION ARE CHANGE BETWEEN TRANSFER DATA_^1*_'AND COMPARE OPERATION. TO PRIVENT NO COMPARE ERROR_^1*_'IT WERE PLACED OUT OF AUTOLOAD PROGRAM._^1TEMP1_"NUM_$0_*TEMPORARY_^1LNGTH2_!NUM_$0_*SECOND REQUEST LENGTH FOR A SPLITTED_^1DYNST_"NUM_$0_*DYNAMIC STATUS_^1_%EJT_]_^1*_]_!**ITOS_^1*_$M A S S_"M E M O R Y_!S I Z E_!R O U T I N E_***ITOS_^1*_]_!**ITOS_^1*_$THIS ROUTINE CALCULATES THE €€PHYSICAL SIZE OF THE_***ITOS_^1*_$PARTICULAR TYPE OF CARTRIDGE DISK_9**ITOS_^1*_]_!**ITOS_^1_%SPC 1_^1SIZMAS NOP 0_T**ITOS_^1_%LDA =XDBLFST_M**ITOS_^1_%LDQ* DYNST_P**ITOS_^1_%QLS DNSHFT_'IS THIS A DOUBLE DENSITY DISK_***ITOS_^1_%SQP SIZ010_'YES_D**ITOS_^1_%LDA =XSINFST_$NO_E**ITOS_^1_%SPC 1_^1SIZ010 CLR Q_,RETURN WITH Q-A = PHYSICAL DISK SIZE_"**ITOS_^1_%JMP* (SIZMAS)_M**IT€€OS_^1_%SPC 4_^1_(EJT_^1*_'W R I T E A D D R E S S R O U T I N E_^1*_]_^1*_]_^1*_'THIS ROUTINE WRITE STARTING AT CYLINDER ZERO SURFACE ZERO_^1*_'ON DISK ZERO, CYLINDER UNTIL THE END OF THE DISK._^1*_]_^1*_]_^1_(SPC_$1_^1WTAGS_"EQU_$WTAGS(*)_!ENTRY TO INITIATE WRITE TAGS OPERATION_^1_(CLR_$A_^1_(STA_$ASKRW_!SET CYLINDER ZERO ADDRESS IN 'AVEC'_^1_(ENA_$WADCOD TAKE WRITE ADDRESS CO€€DE_^1_(STA_$ARDWRC SET WRITE ADDRESS CODE IN 'AVEC'_^1_(LDQ_$DYNST_!TAKE DYNAMIC STATUS_^1_(QLS_$DNSHFT SHIFT FOR DENSITY BIT_^1_(LDA_$=XSINDNS*$10_$SET BITS TO CHECK IF SINGLE DENSITY_^1_(SQM_$SG_$SKIP, IF SINGLE DENSITY_^1_(LDA_$=XDBLDNS*$10_$SET BITS TO CHECK IF DOUBLE DENSITY_^1SG_$STA_%TEMP1_$SAVE LAST CYLINDER_^1SKTAG_"ENQ_$ASKRW-AVEC ENTRY FOR SEEK TO NEW CYLINDER_^1_(STQ€€-_#I_%SET REG. I BEFORE SEEK OPERATION_^1REWRT_"JMP_$DOUT_"EXECUTE OPERATION_^1NWRTAG_!LDA-_#I_$TAKE I REG._^1_(INA_$AVEC-ASKRW DECREASE BY SEEK POINTER_^1_(SAN_$COT4_%SKIP, IF NOT AFTER SEEK_^1_(RAO-_#I_^1_(JMP*_#REWRT_$WRITE ADDRESS ON DISK 0 SURFACE 0_^1COT4_#LDA_$ARDWRC LAST SURFACE % DISK ADDRESS_^1_(ADD_$=N$4000_^1_(TRA_$Q_)SAVE 'ARDWRC'_^1_(AND_$=N$E000_^1_(SAZ_$NXSEK_$€€SKIP IF NO MORE WRITING ON THIS CYLINDER_^1_(STQ_$ARDWRC SET NEW SURFACE % DISK ADDRESS_^1_(JMP*_#REWRT_$WRITE TAGS ON NEXT TRACK_^1NXSEK_"ENA_$3_)MASK FOR WRITE ADDRESS CODE_^1_(EAQ_$Q_^1_(STQ_$ARDWRC_#STORE NEW ADDRESS_^1_(LDA_$ASKRW_!LAST CYLINDER ADDRESS_^1_(INA_$$10_^1_(STA_$ASKRW_!SET CYLINDER ADDRESS IN 'AVEC'_^1_(EOR_$TEMP1_$COMPARE WITH LAST CYLINDER_^1_(SAZ_$EXTAG_!END O€ÒF WRITE ADDRESS OPERATION_^1_(JMP*_#SKTAG_!JUMP FOR NEW SEEK_^1EXTAG_"ENA_$ARDWRC-AVEC_"END OF WRITE ADDRESS_^1_(STA-_#I_%SET REG.I BEFORE UNIT DE-SELECT OPERATION_^1_(JMP_$NXINCI EXIT TAGS ROUTINE_^1_(END_^__ÒPQ18334 CSY/ D65 P€1_%NAM Q18334_'DECK-ID D65 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$CARTRIDGE DISD INITIALIZER FOR MSOS_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1****_]_^1*_'THIS DRIVER PROVIDES SOFTWARE CONTROL OF CARTRIDGE DISK DRIVES-_^1*_'-9425,9427 AND "HAWK" THROUGHT CYBER-18 CONTROLLER_^1*_]_^1*_€€]_^1*_0*****************************************************_^1*_0*_$ENTRY PARAMETERS_"(ANY COMBINATION)_'*_^1*_0*_(REG. A = (+) FWA OF BUFFER (FWAB)_(*_^1*_0*_(REG. A = $FFFF WRITE ADDRESS TAGS_^1*_0*_(REG. Q = (+) NO. OF WORDS TO READ_(*_^1*_0*_(REG. Q = (-) COMPLEMENT OF WORDS TO WRITE *_^1*_0*_(REG. I = (+) STARTING SECTOR ADDRESS_$*_^1*_0*_R*_^1*_0*_$EXIT PARAMETERS-IF OK_6*_€€^1*_0*_(REG. A =-0_?*_^1*_0*_(REG. Q = 0_?*_^1*_0*_(REG. I = (+) STARTING SECTOR ADDRESS_$*_^1*_0*_R*_^1*_0*_$ERROR EXIT_B*_^1*_0*_(REG. A = 0_?*_^1*_0*_(REG. Q = ERROR CODE_6*_^1*_0*_12 = ALARM ERROE_1*_^1*_0*_15 = INTERNAL REJECT_-*_^1*_0*_16 = EXTERNAL REJECT_-*_^1*_0*_013 = WRITE PROTECT_^1*_0*_17 = NO COMPARE ERROR_^1*_0*_014 = NOT READY_3*_^1*_0*_017 = SEEK ERROR_2*_^1*_0*_07€€0 = BUS OFF_5*_^1*_0*_074 = SECTOR ADDRESS TOO GREAT_#*_^1*_0*_0FF = UNKNOWN ERROR_/*_^1*_0*_(REG. I = LAST HARDWARE STATUS_,*_^1*_0*_R*_^1*_0*****************************************************_^1*_]_^1*E_]_^1*_]_^1*_'DESCRIPTION:_^1*_'------------_^1*_]_^1*_'THIS PROGRAM IS A STATUS DRIVEN DRIVER.THIS MEANS THAT_^1*_'INSTEAD OF USING INTERRUPTS TO SIGNAL THE END OF SPECIFIED_^1*€€_'OPERATIONS,IT LOOPS ON THE STATUS AND WAITS UNTIL SPECIFIED_^1*_'CONDITIONS ARE MET (EOP,ON CYLINDER,ETC.)._^1*_'THE DRIVER OPERATION IS BASED ON A TABLE COMPOSED OF_^1*_(7 VECTORS.THE N-TH ENTRY IN THIS TABLE GIVES THE_^1*_'REQUIRED A AND Q REGISTERS FOR THE N-TH OUTPUT OPERATION,_^1*_'TWO MASKS FOR THE STATUS WORD AND THE_!EXPECTED RESULTS_^1*_'AFTER APPLYING THESE MASKS,AN€€D POINTERS TO ROUTINES TO BE_^1*_'EXECUTED AFTER THE OUTPUT OPERATIONS._^1*_'THE TABLE ENTRIES ARE ORDERED ACCORDING TO THE SEQUENCE_^1*_'OF INSTRUCTIONS SENT TO THE CONTROLLER._^1*_]_^1*_'A TYPICAL I/O CYLCLE IS AS FOLLOWS (DISREGARDING_^1*_'ROUTINES' BOUNDARIES ) :_^1*_0SET I-REG. TO ORDINAL NO. OF REQUIRED I/O._^1*_0JMP ACCORDING TO PREVEC ( BY I )_^1*_0LDA FROM TABLE (INDE€€XED BY I-REG.)_^1*_0LDQ FROM TABLE (BY I)_^1*_0ADQ EQUIPMENT CODE_^1*_0OUT REJECT - *_^1*_0GET DYNAMIC STATUS IN A._^1*_0AND WITH WATMSK FROM TABLE (BY I)_^1*_0EOR WITH WATRSL FROM TABLE (BY I)_^1*_0WAIT UNTIL A=0 (I.E.: IF A #0 THEN GET A NEW STATUS)_^1*_0LDA WITH LAST STATUS_^1*_0AND WITH ERRMSK (BY I)_^1*_0EOR WITH ERRSLT (BY I)_^1*_0IF A=0 THEN CONTINUE.ELSE - RETUR€€N ERROR._^1*_0JMP ACCORDING TO NEXTBL ( BY I )_^1*_]_^1*_'WATMSK ENABLES THE DRIVER TO WAIT UNTIL CERTAIN EVENTS HAVE_^1*_'OCCURRED ( EOP,ON CYLINDER ETC.)._^1*_'ERRMSK CHECKS IF ANY ERROR CONDITION HAS BEEN SET, AND IF SO,_^1*_'IT EXITS FROM THE DRIVER._^1*_]_^1*_]_^1*_'NEXTBL ENABLE THE PROGRAMMER TO SET PARAMETERS_^1*_'BEFORE EACH OUTPUT AND TO CHECK CONDITIONS (OR ERRORS )_^1€€*_'OR EVEN REPEAT THE OUTPUT AFTER EACH OPERATION._^1*_]_^1*_]_^1*_'THE UNIT ON WHICH THE DRIVER WILL OPERATE IS THE FIRST UNIT_^1*_'ALONG THE DAISY CHAIN THAT IS READY._^1*_]_^1*_]_^1*_'AFTER THE REQUEST IS FINISHED,THE UNIT IS DESELECTED_^1*_'AND THE BUS IS RELEASED._^1_(EJT_^1*E_]_^1*_'THE STATUS WORD IS BUILT AS FOLLOWS:_^1*_]_^1*_(15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 €€ 0_^1*_'-------------------------------------------------_^1*_'I I I I IXXIXXIXXI I IXXI I I I I I I_^1*_'-------------------------------------------------_^1*_)' ' ' '_*' '_#' ' ' ' ' '_^1*_)' ' ' '_*' '_#' ' ' ' ' '_^1*_)' ' ' ON BUS_$' SINGLE' ' ' ' ' UNIT READY(=1)_^1*_)' ' '_-' DNSITY' ' ' ' '_^1*_)' ' DEVICE SEEK_"' (=1) ' ' €€ ' ' CONTROLLER BUSY =1_^1*_)' ' ERROR_)'_'' ' ' '_^1*_)' '_0EOP(=1) ' ' ' INTERRUPT_^1*_)' CONTROLLER_0' ' '_^1*_)' PROTECTED_1' ' ALARM_^1*_)'_<' '_^1*_)BUS BUSY_5' ON CYLINDER_^1*_G'_^1*_GDISK WRITE PROTECTED_^1*S2_]_^1*_]_^1*_'ENTRY POINTS :_^1*_'--------------_^1*_]_^1*_]_^1_(ENT_$MMINIT_$ENTRY FOR I2_^1_(ENT_$QMASS_%ENTRY TO DRIVER_^1_(ENT_$EMASS_%W.E.S FU€€NCTION CODE_^1_'ENT_!INVRSE_(INVERSE DISKS MODE FLAG_^1_%ENT MAXSEC_'LARGEST SECTOR AVAILABLE_^1*_]_^1_%EQU MAXSEC($5BF0)_^1*_]_^1*_'EXTERNALS :_^1*_'-----------_^1_(EXT*_#I2RETN_^1*_]_^1*E_]_^1****_]_^1_(EJT_^1***_]_^1*_0A U T O L O A D_!R O U T I N E_^1*_]_^1*_]_^1*_'THROUGHT THIS ROUTINE TRANSFER THREE PARAMETERS_^1*_'TO MODEL I2_#1) AUTOLOAD PROGRAM LENGTH_^1*_72) DISTANCE T€€O AUTOLOAD TABLE_^1***_53) ADDRESS OF AUTOLOAD PROGRAM_^1MMINIT_!LDQ_$=XDSKEND-START1_!AUTOLOAD PROGRAM LENGTH_^1_(LDA_$=XPART01-START1_!DISTANCE TO AUTOLOAD TABLE_^1_(RTJ_$I2RETN_$RETURN TO I2 WITH AUTOLOAD ADDRES PROG._^1_(SPC_$2_^1*_]_^1_(SPC_$2_^1START1_!IIN_$0_^1_(APM_,SET TO ABSOLUTE PAGE MODE_^1_(SPC_$2_^1***_]_^1*_'THIS ROUTINE_^1*_'CLEAR CORE (LOWER 65K) TO ZERO, OR RESE€€T PARITY_^1*_'BY DOING A LOAD AND STORE._^1*_'CORE SIZE IS PASSED BY IDRIV VIA CONTRL AT SYSTEM_^1*_'INITIALIZATION WHEN THE AUTOLOAD AREA IS WRITTEN_^1*_]_^1*_'IF THE SELECTIVE SKIP SWITCH IS : SET - LOAD AND STORE MEMORY_^1*_INOT SET - ZERO MEMORY_^1*_]_^1*S2_]_^1*_'THIS ROUTINE MOVES THE DRIVER TO THE END OF SPACE_^1*_'PROGRAM AND PERFORM TWO REQUESTS THROUGH THE DRIVER._^1*E_]_€€^1_(SPC_$2_^1_(LDA*_#MSIZV4 GET VALUE OF HIGHEST CORE LOCTION_^1_(SUB_$=XDSKEND-START1_^1_(TRA_$Q_$END OF PGM TO END OF MEMORY_^1_(CLR_$A,M_"CLEAR IN CASE COME FROM DTLP 'A' OPTION_^1CLR_$SWN_$STORE STORE ZERO IF SELECTIVE SKIP IS OFF_^1_(LDA_$DSKEND,Q_#READ AND STORE_^1STORE_"STA_$DSKEND,Q_^1_(SQZ_$GO_#DONE, SKIP_^1_(INQ_$-1_#DECREMENT INDEX BY 1_^1_(JMP*_#CLR_"TO REPEAT FOR NEXT€€ CELL_^1GO_%SPE_$0_+CLEAR PARITY ERROR STATUS_^1_(LDQ_$=XDSKEND-LOOP+1 LENGTH TO BE MOVED_^1LOOP01_!LDA*_#LOOP,Q_$THIS ROUTINE MOVES THE DRIVER_^1_(STA*_#(STMSV4),Q TO SPACE PROGRM STARTING FROM 'STMSV4'_^1_(SQZ_$CNT1_^1_(INQ_$-1_^1_(JMP*_#LOOP01_^1CNT1_#JMP*_#(STMSV4)_"START THE LOOP AFTER IS HAS BEEN MOVED_^1_(SPC_$1_^1*_'FWA OF CODE MOVED TO LOCATION STMSV4 IN SPACE PROGRAM_^1€€*_]_^1*_]_^1LOOP_#ENA_$5_$SET FIRST SECTOR TO BE READ_^1_(STA-_#I_^1_(CLR_$A_$SET F. W. A._^1_(LDQ*_#STMSV4 MODIFIED LENGTH OF PART 0_^1_(RTJ*_#QMASS READ IN PART 0_^1_(SAN_$GOON_!SKIP IF NO DISK ERROR_^1_(JMP*_#LOOP_!KEEP TRYING_^1GOON_#LDA*_#PART01 PART 1 CORE IMAGE SECTOR ADDRESS_^1_(SAZ_$ONGO_!SKIP IF NOT PART 1 TO LOAD_^1_(STA-_#I_$SET REG. I TO BE FIRST SECTOR OF PART 1_^1_(€€LDA*_#PART1A MODIFIED CORE ADDRESS OF PART 1_^1_(LDQ*_#LPART1 MODIFIED LENGTH OF PART 1_^1_(RTJ*_#QMASS READ IN PART 1_^1_(SAN_$ONGO_!SKIP IF NO DISK ERROR_^1_(JMP*_#GOON_!KEEP TRYING IF ERROR_^1ONGO_#EIN_$0_$ENABLE INTERRUPT SYSTEM_^1_(JMP*_#LOOP-2 GO TO 'RESTRT' IN SPACE PGM. TO RE-START_^1_(SPC_$2_^1PART01_!NUM_$0_$PART 1 CORE IMAGE SECTOR ADDRESS_^1LPART1_!NUM_$0_$MODIFIED LEN€€GTH OF PART1_^1PART1A_!NUM_$0_$MODIFIED CORE ADDRESS OF PART 1_^1STMSV4_!NUM_$0_$ADDRESS IN SPACE WHERE AUTOLOAD IS MOVED TO_^1MSIZV4_!NUM_$0_$CORE SIZE (TO BE FILLED)_^1_(EJT_^1****_]_^1*_'D R I V E R_"S U B R O U T I N E_^1*_]_^1_'SPC_!3_^1*_'THE FOLLOWING IS THE TABLE FOR OUTPUT OPERATIONS.IT CONTAINS_^1*_'7 VECTOR:_^1*_,AVEC - A REG. FOR OUTPUTS_^1*_,QVEC - Q REG. FOR OUTPUTS_^€€1*_,WATMSK - MASK FOR WAITING ON STATUS_^1*_,WATRSL - DESIRED RESULT AFTER APPLYING THE MASK ABOVE._^1*_,ERRMSK - MASK FOR CHECKING ERRORS AT THE END OF_^1*_5AN OUTPUT OPERATION_^1*_,ERRSLT - THE RESULT OF APPLYING THE MASK ABOVE TO THE_^1*_5STATUS WORD IF NO ERROR OCCURRED._^1*_'NEXTBL - POINTER TO NEXT ROUTINE TO BE EXECUTE_^1*_]_^1*_'NOTE :_^1*_-THE OPERATION OF THE DRIVER IS BA€€SED ON SEQUENTIAL_^1*_-EXECUTION OF I/O'S ACCORDING TO THIS TABLE.THEREFORE,_^1*_-ADDING A NEW I/O IS DONE BY ADDING THE APPROPRIATE_^1*_-ROUTINE AND BY ADDING AN ENTRY TO EACH OF THE_^1*_-VECTORS ABOVE IN THE PROPER PLACE ACCORDING TO THE_^1*_-SEQUENCE._^1*_-EVEN WHEN NO WATMSK OR ERRMSK IS NEEDED - A ZERO ENTRY_^1*_-MUST BE INSERTED IN THE UNNEEDED VECTORS._^1*_]_^1*_'SEEK (€€AND RTZS) OPERATIONS INCLUDE WAITING FOR "ON CYLINDER"_^1*_'SIGNAL,AND NOT JUST "EOP"._^1*_]_^1****_]_^1_'SPC_!2_^1AVEC_"BSS_!AVEC(0)_'A-REG. FOR OUTPUT OPERATIONS_^1_'SPC_!2_^1ACLCNT NUM_!0_-CLEAR CONTROLLER % WAIT FOR BUS NOT BUSY_^1ABSCON NUM_!$80_,BUS CONNECT_^1AUNTSL NUM_!0_-UNIT SELECT - PREPARED % INSERTED BY PROG._^1ARTZS_!NUM_!$20_+RTZS - RETURN TO ZERO SEEK_^1ABNKSL N€€UM_!0_-MEMORY BANK 0 SELECT_^1ALNGTH NUM_!0_-REQUEST BLOCK LENGTH (NO. OF WORDS) -_^1*_;INSERTED BY PROGRAM._^1AFWA_"NUM_!0_-FIRST WORD ADDRESS IN MEMORY - INSERTED_^1*_;BY PROG._^1ASKRW_!NUM_!0_-SEEK FOR READ/WRITE/WRITE TAGS /COMPARE_^1ARDWRC NUM_!0_-READ/WRITE/WRITE ADDRESS /COMPARE_^1AUNTDS NUM_!0_-UNIT DESELECT - INSERTED BY PROG._^1ABSREL NUM_!0_-BUS RELEASE_^1_'SPC_!2_^1€€QVEC_"BSS_!QVEC(0)_'Q-REG. FOR OUTPUT_^1_'NUM_!$10_+CLEAR CONTROLLER % WAIT FOR BUS NOT BUSY_^1_'NUM_!$8_,BUS CONNECT_^1_'NUM_!$6_,UNIT SELECT_^1_'NUM_!$1_,RTZS_^1_'NUM_!$3_,MEMORY BANK SELECT_^1_'NUM_!$7_,BLOCK LENGTH (NO. OF WORDS)_^1_'NUM_!$2_,FIRST WORD ADDRESS (FWA)_^1_'NUM_!$A_,SEEK (FOR READ/WRITE/WRITE TAGS/COMPARE)_^1_'NUM_!$1_,READ / WRITE/ WRITE TAGS/COMPARE_^1_'NUM_!$6_€€,UNIT DESELECT_^1_'NUM_!$8_,BUS RELEASE_^1_'SPC_!2_^1WATMSK BSS_!WATMSK(0)_$MASK FOR WAITING ON STATUS_^1_'NUM_!0_-NO WAITTING AFTER CLEAR CONTROLLER_^1_'NUM_!$0102_)BUS CON.- WAIT FOR EOP_^1_'NUM_!$0102_)UNIT SEL.- EOP_^1_'NUM_!$0010_)RTZS-WAIT FOR "ON CYLINDER" (CONTROLLER_^1*_;DOES NOT BECOME BUSY FOR RTZS)._^1_'NUM_!0_-BANK SELECT - DUMMY ENTRY (NOT USED)_^1_'NUM_!0_-BLOCK LEN€€GTH - DUMMY ENTRY_^1_'NUM_!0_-FWA - DUMMY ENTRY_^1_'NUM_!$0112_)SEEK - EOP % "ON CYLINDER"_^1_'NUM_!$0102_)READ/WRITE/ WRITE TAGS/COMPARE-EOP_^1_'NUM_!$0102_)UNIT DESELECT - EOP_^1_'NUM_!$0102_)BUS RELEASE - EOP_^1_'SPC_!2_^1WATRSL BSS_!WATRSL(0)_$RESULT OF STATUS "ANDED" WITH WATMSK IF_^1*_;THE SPECIFIED EVENTS OCCURED (I.E.:THE_^1*_;PROGRAM SHOULD EXIT FROM WAITING LOOP)._^1_'NU€€M_!0_-CLEAR CONTROLLER , COUNTINUE_^1_'NUM_!$0100_)EOP OF BUS CONNECT_^1_'NUM_!$0100_)EOP OF UNIT SELECT_^1_'NUM_!$0010_)"ON CYLINDER" FOR RTZS (ZERO SEEK)_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$0110_)EOP % "ON CYLINDER" FOR SEEK_^1_'NUM_!$0100_)EOP OF READ/WRITE/ WRITE TAGS/COMPARE_^1_'NUM_!$0100_)EOP FOR UNIT €€DESELECT_^1_'NUM_!$0100_)EOP FOR BUS RELEASE_^1_'SPC_!2_^1ERRMSK BSS_!ERRMSK(0)_$MASK FOR CHECKING FOR ERRORS_^1_'NUM_!$010E_)CLEAR CONTROLLER_^1_'NUM_!$110A_)BUS CONNECT_^1_'NUM_!$110A_)UNIT SELECT_^1_'NUM_!$311B_)RTZS(% "ON CYLINDER")_^1_'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$311B_)SEEK (% "ON CYLINDER")_^1_'NUM€€_!$311B_)READ/WRITE / WRITE TAGS/COMPARE_^1_'NUM_!$110A_)UNIT DESELECT_^1_'NUM_!$110A_)BUS RELEASE_^1_'SPC_!2_^1ERRSLT BSS_!ERRSLT(0)_$RESULT OF STATUS "ANDED" WITH ERRMSK IF_^1*_;NO ERROR OCCURED_^1_'NUM_!$0100_)CLEAR CONTROLLER - EOP_^1_'NUM_!$1100_)BUS CONNECT- "ON BUS" % EOP_^1_'NUM_!$1100_)UNIT SELECT - "ON BUS" % EOP_^1_'NUM_!$1111_)RTZS - "ON BUS % CYLINDER",READY % EOP_^1_€€'NUM_!0_-BANK SELECT - DUMMY (NOT USED)_^1_'NUM_!0_-BLOCK LENGTH - DUMMY_^1_'NUM_!0_-FWA - DUMMY_^1_'NUM_!$1111_)SEEK - "ON BUS % CYLINDER",READY % EOP_^1_'NUM_!$1111_$READ/WRITE/ WRITE TAGS/COMPARE-ON BUS%CYL,READY_^1_'NUM_!$1100_)UNIT DESELECT - "ON BUS" % EOP._^1_'NUM_!$0100_)BUS RELEASE - EOP._^1_'SPC_!2_^1NEXTBL_!EQU_$NEXTBL(*) POINTER FOR ROUTINE TO BE EXECUTED AFTER:_^1_(AD€€C*_#NXINCI I=0_%CLEAR CONTROLLER_^1_(ADC*_#NXUSLC I=1_%BUS CONNECT_^1_(ADC*_#NXUFIN I=2_%UNIT SELECT_^1_(ADC*_#NXINCI I=3_%RTZS_^1_(ADC*_#NXBLKL I=4_%MEMORY BANK SELECT_^1_(ADC*_#NXINCI I=5_%BLOCK LENGTH_^1_(ADC*_#NXINCI I=6_%FIRST WORD ADDRESS_^1_(ADC*_#NXRWCM I=7_%SEEK_^1_(ADC*_#NXRWCM I=8_%READ/WRITE/WRITE TAGS/COMPARE_^1_(ADC*_#NXINCI I=9_%UNIT DE-SELECT_^1_(ADC*_#END€€REQ I=10_$BUS RELEASE_^1*_]_^1*_(END OF OUTPUT OPERATIONS TABLE._^1_'EJT_^1*_'THE FOLLOWING IS THE LIST OF ALL EQU'S,NUM'S,AND BSS'S_^1*_'FOR THE PROGRAM( IN ALPHABETIC ORDER)._^1*_]_^1CMCODE EQU_!CMCODE(11)_#L.S.BITS FOR A-REG. IN COMPARE INSTRUCTION_^1CMPFLG_!NUM_$0_$COMPARE FLAG_^1SCTR_"EQU_!SCTR(29)_%NO. OF SECTORS ON A TRACK_^1DBLDNS EQU_"DBLDNS(406)_!NO. OF CYLINDERS ON €€DOUBLE DENSITY DISK_^1DBLFST EQU_!DBLFST(DBLDNS*SCTR*2-1) FIRST SECTOR ADD.OF FIXED DISK_^1*_EFOR DOUBLE DENSITY._^1DEVICE EQU DEVICE($E)_"EQUIPMENT NUMBER_^1DNSHFT EQU_!DNSHFT(8)_$NO. OF SHIFTS TO GET DENSITY BIT FROM_^1*_;STATUS WORD IN SIGN BIT_^1EMASS_"ADC_$DEVICE*128+1 W.E.S. FUNCTION CODE_^1FSTDS1 BSS_!FSTDS1(1)_$FIRST SECTOR ADDRESS OF DISK 1._^1INVRSE_!NUM_$$80_"INV€€ERSE DISK MODE ; $80-NORMAL,$C0-INVERSE_^1*_;REQUEST.IF ZERO-THE REQ. IS NOT SPLITTED._^1QSTTS_!EQU_!QSTTS($10)_#Q REG. VALUE TO INPUT STATUS_^1RDCODE EQU_!RDCODE(9)_$L.S.BITS FOR A-REG. IN READ INSTRUCTION_^1RDWRT_!BSS_!RDWRT(1)_%READ / WRITE FLAG (= BITS FOR A-REG.)_^1SCWRD_!EQU_!SCWRD(96)_$NO.OF WORDS PER SECTOR_^1SINDNS EQU_"SINDNS(203)_!NO. OF CYLINDERS ON SINGLE DENSITY DIS€€K_^1SINFST EQU_!SINFST(SINDNS*SCTR*2-1) FIRST SECTOR ADD.OF FIXED DISK_^1*_EFOR SINGLE DENSITY_^1SKERR_!EQU_!SKERR($2010)_!MASK FOR SEEK ERROR % "ON CYLINDER" BITS_^1SKRSL_!EQU_!SKRSL($10)_#EXPECTED RESULT AFTER APPLYING SKERR_^1*_;TO STATUS, IF NO ERROR_^1STSEC_!BSS_!STSEC(1)_%STARTING SECTOR FOR REQUEST_^1TEMP2_"NUM_$0_*TEMPORARY FOR READ/WRITE CODE_^1*_;SELECT WORDS._^1UNTSEL €€ EQU_!UNTSEL($80)_"UNIT 0 SELECT - A REG._^1WADCOD_!EQU_$WADCOD(13) L.S.BITS FOR A-REG. IN WRITE TAGS INSTR._^1WRCODE EQU_!WRCODE(10)_#L.S.BITS FOR A-REG. IN WRITE INSTRUCTION_^1WRPRTC_!EQU_$WRPRTC($20) MASK FOR WRITE PROTECTED_^1_'EJT_^1*_'Q M A S S - I N I T I A L I Z E R_^1*_]_^1*_'THE FOLLOWING ROUTINE SAVES THE INPUT PARAMETERS AND CHECKS_^1*_'WHETHER THE REQUEST IS FOR REA€€D OR WRITE OPERATIONS._^1*_]_^1QMASS_"NUM_$0_$DRIVER ENTRY_^1_(STA*_#AFWA_!FIRST WORD ADD. IN AVEC./FLAG FOR WRITE TAGS_^1_(EOR_$=N$FFFF_"CHECK IF A = $FFFF_^1_(SAN_$NTAG_%SKIP IF NOT WRITE ADDRESS_^1_(CLR_$A_^1_(STA_$RDWRT SET READ WRITE FLAG_^1_(STA*_#STSEC SET STARTING SECTOR FOR WRITE ADDRESS_^1_(JMP*_#WRTAG CONTINUE FOR WRITE TAGS_^1NTAG_#ENA_$RDCODE PREPAR FOR READ_^1_(SQ€€P_$P1_#SKIP IF READ (Q>0 IF READ, Q<0 IF WRITE)_^1_(ENA_$WRCODE PREPAR FOR WRITE_^1_(TCQ_$Q_$GET ABSOLUTE VALUE OF NO. OF WORDS_^1P1_%STA*_#RDWRT SET READ/WRITE FLAG_^1_(STQ*_#ALNGTH INSERT NO. OF WORD IN AVEC_^1_(LDA-_#I_^1_(STA*_#STSEC SET STARTING SECTOR FOR READ/WRITE_^1_(SPC_$1_^1*_]_^1*_'CHECK IF AUTOLOAD SET UP REQUEST_^1*_'FOR AUTOLOAD REQUEST , PICK UP 'MSIZV4' FROM 'ID€€RIV'_^1*_]_^1_(SAN_$NOTAUT_^1_(LDQ*_#QMASS_$TAKE THE RETURN ADDRESS_^1_(LDA-_#2,Q_'PICK 'MSIZV4' FROM 'IDRIV' IN 'I2MZV4_^1_(STA*_#MSIZV4_^1NOTAUT EQU NOTAUT(*)_^1_(SPC_$1_^1WRTAG_"CLR_$A_^1_(STA-_#I_$SET I TO BEGINNING OF OUT PUT TABLE_^1_(STA_$LNGTH2_$CLEAR SPLIT REQUEST FLAG_^1_(STA*_#TEMP2_$SAVE LAST READ/WRITE CODE_^1FROPR_"JMP*_#DOUT_!DUMMY ROUTINE FOR CLEAR CONTROLLER_^1_'E€€JT_^1*_'E R R O R_%R O U T I N E_^1_(SPC_$1_^1*_'IN ENTRY LOCATION 'DYNST' CONTAIN LAST HARDWARE STATUS_^1*_'ENTRIES EROUT IS FOR EXTERNAL/INTERNAL REJECT REG.Q = 6/5_^1*_0ERROR2 IS FOR ILLEGAL REQUESTA_(REG.Q = 74_^1*_0ERROR3 IS FOR NOT READY ERROR_)REG.Q = 14_^1*_0ERROR4 IS FOR WRITE PROTECTED ERROR_"REG.Q = 13_^1*_0ERROR IS FOR DYNAMIC STATUS ERROR_^1*_7IF DEVICE SEEK ERROR I€€S ON_$REG.Q = 17_^1*_:ELSE IF BUS IS OFF_*REG.Q = 70_^1*_=ELSE IF ALARM BIT IS ON_^1*_=AND COMPARE FLAG IS ON_"REG.Q = 7_^1*_@ELSE IT IS ALARM ERROR REG.Q = 2_^1*_7IF GHOST ERROR HAPPENED_(REG.Q = FF_^1*_'LAST HARDWARE STATUS SAVE IN REG.I IN EXIT REG.A = 0_^1_(SPC_$2_^1EROUT_"LDA_$DYNST_%ENTRY FOR REJECTS % ERROR EXIT_^1_(STA-_#I_$SAVE HARDWARE STATUS_^1_(CLR_$A,M_^1_(JMP_$DSKED1€€_"RETURN TO THE CALLING ROUTINE_^1ERROR2_!ENQ_$74_#FOR SECTOR ADDRESS GREATER THEN POSSIBLE_^1_(JMP*_#EROUT_4FOR THIS DEVICE_^1ERROR3_!ENQ_$14_#FOR NOT READY ERROR_^1_(JMP*_#EROUT_^1ERROR4_!ENQ_$13_#FOR WRITE PROTECTED ERROR_^1_(JMP*_#EROUT_^1ERROR_"LDQ_$DYNST_%CHECK DYNAMIC STATUS_^1_(QLS_$2_^1_(SQP_$ER1_"SKIP IF NOT DEVICE SEEK ERROR_^1_(ENQ_$17_^1_(JMP*_#EROUT_^1ER1_$QLS_$1_^1_(€€SQM_$ER2_"SKIP IF BUS OFF_^1_(ENQ_$70_^1_(JMP*_#EROUT_^1ER2_$QLS_$9_^1_(SQP_$ER3_"SKIP IF NOT ALARM ERROR_^1_(LDA_$TEMP1_%IF COMPARE TEMP1 = 1_^1_(INA_$1_)IF ALARM HAPPENDED DURING COMPARE_^1_(SAN_$ER4_(OPERATION THEN NO COMPARE ERROR_^1_(ENQ_$7_^1_(JMP*_#EROUT_^1ER4_$ENQ_$2_*ELSE ALARM ERROR_^1_(JMP*_#EROUT_^1ER3_$ENQ_$-0_#IF GHOST ERROR_^1_(JMP_$EROUT_^1_(EJT_^1****_]_^1*_'O U T €€P U T_!C Y C L E_"- M A I N_"P R O G R A M_^1*_]_^1*_%THE FOLLOWING ROUTINE IS THE MAIN PROGRAM. IT EXECUTES ALL_^1*_%OUTPUT OPERATIONS,ACCORDING TO THEIR ORDER IN THE TABLE._^1*_%IT INCREMENTS I BY 1 TO POINT TO THE NEXT I/O,JUMPS TO_^1*_%PRE-OUTPUT ROUTINE,EXECUTES OUTPUT,WAITS ON STATUS % CHECKS_^1*_%FOR ERRORS AND JUMPS TO A POST-OUTPUT ROUTINE._^1*_'PRE % POST OUTPUT ROUT€€INES ENABLE THE PROGRAMMER TO SET_^1*_'PARAMETERS,CHECK CONDITIONS AND CHANGE THE PROGRAM FLOW ._^1*_'A RETURN TO DOUT WILL CAUSE THE OUTPUT (POINTED TO BY I REG)_^1*_'TO BE EXECUTED.A RETURN TO PMPOST CAUSES A SKIP ON THE_^1*_'OUTPUT OPERATION.A RETURN TO INCRI CAUSES THE NEXT_^1*_'OUTPUT TO BE EXECUTED._^1*_%NOTICE THAT AN OUTPUT MAY BE REPEATED SIMPLY BY COMING BACK_^1*_%TO THE €€INSTRUCTION FOLLOWING THE : RAO- I ._^1*_%ON RETURNING TO THIS ROUTINE - I MUST BE RESTORED._^1*_]_^1NXINCI_!RAO-_#I_$MOVE TO NEXT OUTPUT_^1DOUT_#RTJ*_#OUTPUT EXECUTE OUTPUT OPERATION_^1DOSTTS_!RTJ*_#STTS_!WAIT ACCORDING WATMSK % CHECK IF ERRORS_^1ERR_$JMP*_#ERROR ERROR EXIT_^1GONXT_"LDQ*_#NEXTBL,I_"GET RELATIVE ADDRESS OF NEXT ROUTINE_^1_(JMP*_#NEXTBL,B_"CONTINUE NEXT OPERATIO€€N_^1****_]_^1_(EJT_^1*_'O U T P U T_^1*_]_^1*_'THE FOLLOWING ROUTINE EXECUTES ALL OUTPUT OPERATIONS._^1*_'ON ENTRY, I POINTS TO THE REQUIRED OUTPUT IN THE OUTPUT_^1*_'TABLE._^1*_]_^1OUTPUT NUM_!0_^1_(LDA_$CMPFLG_$COMPARE CODE_^1_(SUB_$ARDWRC_$CHECK IF COMPARE_^1_(TRA_$Q_^1_(LDA_$AVEC,I_$GET A-REG. FOR OUTPUT_^1_(SQN_$NCOMP_%SKIP,IF NOT COMPARE_^1_(LDQ_$TEMP2_%GET READ/WRITE CODE_^€€1_(STQ_$ARDWRC_$REPLACE READ/WRITE CODE_^1NCOMP_"EQU_$NCOMP(*)_^1_'LDQ_!QVEC,I_(GET Q-REG._^1_(ADQ*_#EMASS_$ADD EQUIPMENT CODE_^1_(INQ_$-1_^1_'OUT_!REJCT-*_'EXECUTE OUTPUT_^1PP3_#JMP* (OUTPUT)_%RETURN_^1REJCT_"JMP*_#INTREJ FOR INTERNAL REJECT_^1_(ENQ_$6_$ENTER Q EXTERNAL REJECT CODE_^1_(JMP*_#OUTRJC EXIT TO ERROR ROUTINE_^1INTREJ_!ENQ_$5_$ENTER Q INTERNAL REJECT CODE_^1OUTRJC_!J€€MP*_#EROUT EXIT TO ERROR ROUTINE_^1_'EJT_^1*_'S T A T U S_^1*_'THE FOLLOWING ROUTINE READS THE DYNAMIC STATUS,WAITS UNTIL_^1*_'SPECIFIED EVENTS OCCUR, AND THEN CHECKS IF THERE WERE ANY_^1*_'SPECIFIED ERRORS.IF THERE WERE ERRORS IT RETURNS TO THE NEXT_^1*_'INSTRUCTION IN THE CALLING PROGRAM.IF NO ERROR-IT SKIPS ON_^1*_'IT ( ASSUMING THAT IT IS A ONE-WORD INSTRUCTION)._^1*_'ON ENTRY€€, I POINTS TO THE CURRENT OUTPUT OPERATION_^1*_]_^1STTS_"NUM_!0_^1PS2_#ENQ_!QSTTS-1_'SET Q REG FOR STATUS READING_^1_(ADQ*_#EMASS_$ADD EQUIPMENT CODE_^1_(INP_$REJCT-*_"TAKE STATUS , NO EXTERNAL REJECT_^1_'STA_$DYNST_%SAVE STATUS_^1_'AND_!WATMSK,I_%EXTRACT BITS TO WAIT ON_^1_'EOR_!WATRSL,I_%CHECK WITH THE EXPECTED RESULT_^1_'SAZ_!PS1_+DO ALL BITS MATCH ?_^1_'JMP* PS2_+READ ANOTHER€€ STATUS AND CHECK AGAIN_^1PS1_$LDA_$DYNST_%GET STATUS_^1_'AND_!ERRMSK,I_%EXTRACT BITS THAT INDICATE POSSIBLE ERRORS_^1_'EOR_!ERRSLT,I_%CHECK WITH BITS SETTING FOR NO ERROR_^1_'SAN_!PS3_+IS THERE AN ERROR ?_^1_'RAO* STTS_*NO, SKIP ONE INSTRUCTION ON RETURN_^1PS3_#JMP* (STTS)_(RETURN_^1_'EJT_^1*_'U N I T S E L E C T R O U T I N E_^1*_]_^1NXUSLC_!EQU_$NXUSLC(*)_!PRE-OUTPUT UNIT SE€€LECT_^1_(RAO-_#I_$SET I FOR UNIT SELECT_^1_(CLR_$A_^1_(STA_$TEMP1_^1RUNSLC_!LDA_$TEMP1_%GET UNIT TO BE SELECT_^1_(ALS_$4_^1_(EOR_$INVRSE_$INVERSE DISK MODE (ENTRY POINT)_^1_(STA_#AUNTSL STORE IN AVEC FOR UNIT SELECT OPERATION_^1_(JMP*_#DOUT_!DO OUTPUT_^1NXUFIN_!LDQ_$DYNST_%RETURN AFTER UNIT SELECT_^1_(LRS_$1_$SHIFT "READY" BIT INTO A_^1_(SAM_$U1_#IF READY SET UNIT DE-SELECT AND COU€€NTINUE_^1_(LDA_$TEMP1_%ELSE_^1_(INA_$-3_,IF ALL UNITS FAILED EXIT TO ERROR_^1_(SAZ_$U2_0ELSE_^1_(RAO_$TEMP1_%GET NEXT UNIT_^1_(JMP*_#RUNSLC_1TRY TO SELECT NEXT UNIT_^1U2_%JMP*_#ERROR3 EXIT TO ERROR ROUTINE_^1U1_%LDA_$AUNTSL GET THE SELECTED UNIT_^1_(EOR_$=XUNTSEL_^1_(STA_$AUNTDS STORE IN AVEC FOR UNIT DE-SELECT OPERATION_^1*_]_^1_(SPC_$1_^1*_'W R I T E_!P R O T E C T E D R O U €€T I N E_^1*_]_^1*_'CHECK IF PROTECTED SWITCH IS ON_^1*_]_^1_(LDA_$DYNST TAKE DYNAMIC STATUS AFTER UNIT SELECT_^1_(AND_$=XWRPRTC_!MASK FOR WRITE PROTECTED BIT_^1_(SAZ_$NP1_"SKIP, IF NOT PROTECTED_^1_(LDA_$RDWRT TAKE READ / WRITE FLAG_^1_(INA_$-RDCODE_"DECREASE BY READ CODE_^1_)SAZ_#NP1_"SKIP , IF READ_!ELSE_^1_(JMP*_#ERROR4 SEND WRITE PROTECT ERROR_^1NP1_$EQU_$NP1(*)_#COUNTINUE_^€€1_'EJT_^1*_'P R E_!R T Z S % W R I T E_!T A G S_^1*_]_^1*_'CHECK IF SEEK ERROR BIT IS SET,OR IF "ON CYLINDER" BIT_^1*_'IS RESET.IF SO,EXECUTE RETURN TO ZERO SEEK (RTZS ) TO RESET_^1*_'ANY SEEK ERROR AND TO RECALIBRATE THE SELECTED UNIT._^1*_'OTHERWISE - SKIP ON RTZS._^1*_]_^1_'LDA_!DYNST_)GET STATUS_^1_'AND_!=XSKERR_'MASK SEEK ERROR % "ON CYLINDER"BITS_^1_'EOR_!=XSKRSL_'CHECK IF €€ERROR OR NOT ON CYLINDER_^1_(SAN_%RZ_"SKIP, IF ERROR TO EXECUTE RTZS_^1_(SPC_$1_^1CHKTAG_!LDA_$AFWA_!CHECK FOR WRITE ADDRESS_^1_(EOR_$=N$FFFF_"CHECK IF A = $FFFF_^1_(SAN_$NT_#SKIP, IF NO WRITE ADDRESS_^1_(JMP_$WTAGS_$GO TO WRITE TAGS_^1_(SPC_$1_^1NT_%RAO-_#I_$COUNTINUE TO NEXT STEP AFTER RTZS_^1RZ_%JMP*_#NXINCI_#RETURN TO MAIN ROUTINE_^1_(EJT_^1_(SPC_$1_^1*_%P R E/P O S T R E A €€D / W R I T E / W R I T E T A G S_^1*_]_^1NXRWCM_!LDA_$AFWA_!WRITE ADDRESS FLAG_^1_(EOR_$=N$FFFF_"CHECK IF A = $FFFF_^1_(SAN_$NT2_"SKIP , IF NOT WRITE TAGS_^1_(JMP_$NWRTAG_#COUNTNUE WRITING ON NEXT TRACK_^1*_%P O S T_!C O M P A R E_^1*_]_^1*_'CHECK IF REQUEST IS DIVIDED INTO TWO.IF POSITIVE, SET_^1*_'PARAMETERS FOR SECOND PART AND GO BACK TO EXECUTE IT._^1*_'OTHERWISE - FINISH T€€HE REQUEST AND RETURN TO CALLER._^1*_]_^1NT2_$LDA*_#TEMP1_%GET FLAG_^1_(SAZ_$COMP_%IF ZERO , EXECUTE COMPARE_^1_(SAM_$RDWR_%IF NEGATIVE EXECUTE READ/WRITE_^1SPLIT2_!LDA_$LNGTH2_#ELSE, LOAD SPLIT FLAG_^1_(SAM_$CONSPT_#COUNTINUE AFTER COMPARE_^1_(JMP*_#SPLIT1_#EXECUTE COMPARE OPERATION_^1CONSPT_!JMP*_#SPLIT_$CONTINUE WITH SECOND REQUEST_^1RDWR_#RAO*_#TEMP1_%RESET THE FLAG_^1_(JMP*_€€#COT3_%EXECUTE READ_^1COMP_#EQU_$COMP(*)_^1_(RAO*_#TEMP1_%CLEAR THE FLAG_^1_(ENA_$ABNKSL-AVEC_^1_(STA-_#I_*SET I REG. TO OPERATE BLOCK LENGTH_^1_(JMP*_#COT3_^1SPLIT1_!TCA_$A_^1_(STA_$LNGTH2_$STORE COMPLEMENT OF SPLIT FLAG_^1_(LDA_$CMPFLG_$LOAD COMPARE CODE_^1_(STA_$ARDWRC_$STORE FOR COMPARE IN AVEC_^1_(JMP*_#COT3_%EXECUTE COMPARE_^1SPLIT_"INA_$1_)INCREASE SPLIT FLAG BY ONE_^1_'SA€€M_!P9_,IS THERE A SECOND PART ?_^1_(JMP*_#COT3_%NO,FINISH THE REQUEST_^1P9_$ENA_!ARTZS-AVEC_#OUTPUT BLOCK LENGTH_^1_'STA- I_-POINT I TO BLOCK LENGTH_^1COT3_#JMP_$NXINCI_#EXECUTI/O OPERATION_^1*_]_^1_(EJT_^1*_%P R E_!B L O C K_!L E N G T H_^1*_]_^1*_'THE FOLLOWING CHECKS THE DENSITY OF THE DISK,CHECKS FOR_^1*_'SPLIT REQUEST AND PREPARES IT IF NECCESSARY._^1*_'IT ALSO SERVES AS AN €€ENTRY POINT FOR THE SECOND PART_^1*_'OF A DIVIDED REQUEST._^1*_]_^1NXBLKL_!LDA_$LNGTH2_"LOAD SPLIT FLAG_^1_'SAN_!P30_+SECOND HALF OF A REQUEST ?_^1_'JMP* P12_+NO_^1P30_#BSS_!P30(0)_^1_'LDQ_!ALNGTH_(GET LENGTH OF FIRST PART_^1_'ADQ_!AFWA_*CALCULATE NEW FWA_^1_'STQ_!AFWA_*UPDATE AFWA_^1_'STA_!ALNGTH_(UPDATE REQUEST LENGTH._^1_'CLR_!A_^1_'STA_!LNGTH2_(CLEAR FLAG_^1_'CLR_!Q_-POINT T€€O CYLINDER ZERO_^1_'LDA_!=N$4000_'POINT TO SURFACE=0,DISK=1,SECTOR=0_^1_'JMP* SETPRM_(SKIP ALL CALCULATIONS_^1*_]_^1*_'EXTRACT THE DENSITY BIT FROM STATUS WORD,AND DETERMINE_^1*_'THE DISK DENSITY.(AFTER LAST OPERATION,DYNST HOLDS A VALID_^1*_'STATUS WORD)._^1*_]_^1P12_#LDA_!DYNST_)GET STATUS TO CHECK DENSITY_^1_'ALS_!DNSHFT_(SHIFT DENSITY BIT INTO SIGN BIT_^1_'LDQ_!=XSINFST_%SING€€LE DENSITY,FIRST SECTOR OF FIXED DISK_^1_'SAM_!P5_,SKIP IF DISK IS SINGLE DENSITY_^1_'LDQ_!=XDBLFST_%DOUBLE DENSITY FIRST SECTOR OF FIXED DISK_^1P5_$STQ_!FSTDS1_(SAVE ADDRESS OF FIRST SECTOR ON DISK 1_^1*_]_^1*_'THE FOLLOWING CHECKS IF THE REQUEST SHOULD BE SPLIT_^1*_'A REQUEST IS SPLITTED IF IT STARTS ON DISK 0 (REMOVABLE IN_^1*_'NORMAL MODE) AND ENDS ON DISK 1.WHEN THIS HAPPENS,€€ THE_^1*_'REQUEST IS DIVIDED INTO TWO:ONE FOR DISK 0 AND ONE FOR_^1*_'DISK 1. WORD LNGTH2 SERVES TO DESIGNATE IF THE REQUEST IS_^1*_'SPLITTED (AND THEN IT CONTAINS THE LENGTH OF THE SECOND_^1*_'REQUEST) OR IF IT IS ONE REQUEST ( LNGTH2 = 0 )._^1*_]_^1_'LDA_!STSEC_)GET STARTING SECTOR_^1_'SUB_!FSTDS1_(SUBTRACT FIRST SECTOR ON DISK 1_^1_'SAM_!P6_,REQUEST STARTS ON DISK 0 ?_^1_'JMP* €€ CONT1_)NO,CONTINUE (NO SPLIT REQUEST)_^1P6_$MUI_!=X(-SCWRD)_#MUI BY -NO.OF WORDS PER SECTOR TO GET_^1*_;NO.OF WORDS TILL THE END OF DISK 0_^1_'SQN_!CONT1_)IF Q#0 OR BIT 15 OF A IS 1 THEN THERE ARE_^1_'SAM_!CONT1_)ENOUGH WORDS SINCE THE LENGTH OF ANY_^1*_;REQUEST CANNOT EXCEED (2**15-1)._^1_'SUB_!ALNGTH_(DIFFERENCE BETWEEN REQ. AND WORDS LEFT ON_^1*_;DISK 0._^1_'SAP_!CONT1_)REQUES€€T ENDS ON DISK 0 ?_^1_'TCA_!Q_-GET LENGTH OF SECOND REQUEST_^1_'ADD_!ALNGTH_(GET LENGTH OF FIRST REQUEST_^1_'STA_!ALNGTH_(INSERT IN REQUEST (AVEC)_^1_'STQ_!LNGTH2_(SET SECOND REQ. LENGTH/NO SPLIT REQ.FLAG_^1*_]_^1*_'THE FOLLOWING CALCULATES THE DISK,CYLINDER,SURFACE AND_^1*_'SECTOR FROM THE ADDRESS OF THE STARTING SECTOR._^1*_]_^1CONT1_!CLR_!Q_^1_'LDA_!STSEC_)STARTING SECTOR AD€€DRESS_^1_'DVI_!FSTDS1_(GET DISK AND RELATIVE NO. OF SECOTR ON IT_^1_(STA*_#TEMP1_%A=0 FOR DISK 0 , A=1 FOR DISK 1_^1_'ARS_!1_-DISCARD L.S.BIT_^1_'SAZ_!P8_,IS STSEC TOO BIG ?_^1_'JMP_%ERROR2_#YES, GO TO ERROR EXIT_^1P8_$TRQ_!A_-SECTOR DISTANCE FROM 1ST SECTOR ON DISK_^1_'CLR_!Q_^1_'DVI_!=XSCTR_(GET CYLINDER NO. + SURFACE(L.S.B.)IN A,_^1*_;SECTOR NO. - IN Q._^1*_;SURFACE: =0 FOR TOP€€, =1 FOR BOTTOM_^1_'ALS_!1_^1_(EOR*_#TEMP1_%FORM A WORD OF_^1_'QLS_!10_,GET 6 BITS OF SECOTR IN M.S.BITS(SIGN=0)_^1_'LLS_!14_,A:SURFACE,DISK,0,SECOTR,0...0;_^1_'QLS_!4_-Q:0,0,0,CYLINDER,0,0,0,0;_^1_(EJT_^1*_%S E T P R M_^1*_]_^1*_'SET THE REQUEST PARAMETERS IN THE PROPER LOCATIONS IN AVEC._^1*_'ON ENTRY, Q HOLDS THE CYLINDER NO. AS SHOULD BE SENT (IN_^1*_'A-REG) BY SEEK OUTPUT,A H€€OLDS THE SURFACE,DISK AND SECTOR_^1*_'IN THE REQUIRED FORMAT (EXCEPT FOR READ/WRITE/COMPARE BITS)_^1*_'IN CASE OF A SPLITTED REQUEST,THE PROGRAM RETURNS TO HERE_^1*_'TO SET PARAMETERS FOR THE SECOND PART OF THE REQUEST._^1*_]_^1SETPRM BSS_!SETPRM(0)_^1_'STQ_!ASKRW_)INSERT IN SEEK FOR READ/WRITE_^1_'TRA_!Q_^1_'EOR_!RDWRT_)SET READ/WRITE BITS ACCORDING TO FLAG_^1_'STA_!ARDWRC_#INSER€€T READ/WRITE/COMPARE INSTRUCTION IN AVEC_^1_(STA_$TEMP2_%FLAG FOR READ/WRITE CODE_^1_'INQ_!CMCODE_(SET COMPARE BITS_^1_'STQ_!CMPFLG_(SAVE COMPARE CODE_^1_(ENQ_$-1_^1_(STQ*_#TEMP1_%STORE FLAG FOR READ/WRITE % COMPARE_^1_'JMP_!NXINCI_(RETURN_^1_'SPC_!3_^1*_]_^1*_'E N D_!R E Q U E S T_^1*_]_^1*_'FINISH THE REQUEST :_^1*_]_^1ENDREQ BSS_!ENDREQ(0)_$NO-ERROR ENTRY_^1_(LDQ_$STSEC_,SET €€IN IREG STARTING_^1_(STQ-_#I_0SECTOR FOR EXIT_^1_(CLR_$Q_0CLEAR QREG. FOR EXIT_^1_(SET_$A_$IF NO ERROR REG. A = -0_^1DSKED1_!JMP_$(QMASS)_"RETURN TO THE CALLING ROUTINE_^1DSKEND_!EQU_$DSKEND(*)_^1*_]_^1*THIS THREE LOCATION ARE CHANGE BETWEEN TRANSFER DATA_^1*_'AND COMPARE OPERATION. TO PRIVENT NO COMPARE ERROR_^1*_'IT WERE PLACED OUT OF AUTOLOAD PROGRAM._^1TEMP1_"NUM_$0_*TEMPORARY€€_^1LNGTH2_!NUM_$0_*SECOND REQUEST LENGTH FOR A SPLITTED_^1DYNST_"NUM_$0_*DYNAMIC STATUS_^1_(EJT_^1*_'W R I T E A D D R E S S R O U T I N E_^1*_]_^1*_]_^1*_'THIS ROUTINE WRITE STARTING AT CYLINDER ZERO SURFACE ZERO_^1*_'ON DISK ZERO, CYLINDER UNTIL THE END OF THE DISK._^1*_]_^1*_]_^1_(SPC_$1_^1WTAGS_"EQU_$WTAGS(*)_!ENTRY TO INITIATE WRITE TAGS OPERATION_^1_(CLR_$A_^1_(STA_$ASKRW_!€€SET CYLINDER ZERO ADDRESS IN 'AVEC'_^1_(ENA_$WADCOD TAKE WRITE ADDRESS CODE_^1_(STA_$ARDWRC SET WRITE ADDRESS CODE IN 'AVEC'_^1_(LDQ_$DYNST_!TAKE DYNAMIC STATUS_^1_(QLS_$DNSHFT SHIFT FOR DENSITY BIT_^1_(LDA_$=XSINDNS*$10_$SET BITS TO CHECK IF SINGLE DENSITY_^1_(SQM_$SG_$SKIP, IF SINGLE DENSITY_^1_(LDA_$=XDBLDNS*$10_$SET BITS TO CHECK IF DOUBLE DENSITY_^1SG_$STA_%TEMP1_$SAVE LAST€€ CYLINDER_^1SKTAG_"ENQ_$ASKRW-AVEC ENTRY FOR SEEK TO NEW CYLINDER_^1_(STQ-_#I_%SET REG. I BEFORE SEEK OPERATION_^1REWRT_"JMP_$DOUT_"EXECUTE OPERATION_^1NWRTAG_!LDA-_#I_$TAKE I REG._^1_(INA_$AVEC-ASKRW DECREASE BY SEEK POINTER_^1_(SAN_$COT4_%SKIP, IF NOT AFTER SEEK_^1_(RAO-_#I_^1_(JMP*_#REWRT_$WRITE ADDRESS ON DISK 0 SURFACE 0_^1COT4_#LDA_$ARDWRC LAST SURFACE % DISK ADDRESS_^1_€€(ADD_$=N$4000_^1_(TRA_$Q_)SAVE 'ARDWRC'_^1_(AND_$=N$E000_^1_(SAZ_$NXSEK_$SKIP IF NO MORE WRITING ON THIS CYLINDER_^1_(STQ_$ARDWRC SET NEW SURFACE % DISK ADDRESS_^1_(JMP*_#REWRT_$WRITE TAGS ON NEXT TRACK_^1NXSEK_"ENA_$3_)MASK FOR WRITE ADDRESS CODE_^1_(EAQ_$Q_^1_(STQ_$ARDWRC_#STORE NEW ADDRESS_^1_(LDA_$ASKRW_!LAST CYLINDER ADDRESS_^1_(INA_$$10_^1_(STA_$ASKRW_!SET CYLINDER ADDRESS €IN 'AVEC'_^1_(EOR_$TEMP1_$COMPARE WITH LAST CYLINDER_^1_(SAZ_$EXTAG_!END OF WRITE ADDRESS OPERATION_^1_(JMP*_#SKTAG_!JUMP FOR NEW SEEK_^1EXTAG_"ENA_$ARDWRC-AVEC_"END OF WRITE ADDRESS_^1_(STA-_#I_%SET REG.I BEFORE UNIT DE-SELECT OPERATION_^1_(JMP_$NXINCI EXIT TAGS ROUTINE_^1_(END_^__PB18334 CSY/ D66 P€1_%NAM B18334_'DECK-ID D66 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$SYSTEM CHECKOUT BOOTSTRAP FOR CARTRIDGE DISK (1833-4)_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1_%SPC 4_^1_%ENT COBOP_^1*_]_^1_%EXT COBOPS_'STARTING SECTOR_^1_%EXT MSIZV4_'LENGTH OF IMAGE (*S) DECLARATION_^1*_]_^1_%EQU SCTR(29€€)_$NO. OF SECTORS ON A TRACK_^1_%EQU SINDNS(203)_!NO. OF CYLINDERS ON SINGLE DENSITY DRIVE_^1_%EQU DBLDNS(406)_!NO. OF CYLINDERS ON DOUBLE DENSITY DRIVE_^1SINFST EQU SINFST(SINDNS*SCTR*2-1)_^1DBLFST EQU DBLFST(DBLDNS*SCTR*2-1)_^1*_]_^1*_]_^1*_]_^1COBOP IIN 0_^1_%JMP* BEGIN_^1AREG_!NUM 0_,A REG ON ENTRY_^1QREG_!NUM 0_,Q REG ON ENTRY_^1START ADC COBOPS_'STARTING SECTOR_^1LE€€NGTH ADC MSIZV4_'LENGTH OF IMAGE_^1CDEQ_!ADC $E_+EQUIPMENT NUMBER_^1*_]_^1BEGIN STA* AREG_^1_%STQ* QREG_^1_%LDA* CDEQ_^1_%ALS 7_^1_%STA* DISK39_^1_%ENA 0_,CLEAR CONTROLLER_^1_%ENQ $10_^1_%RTJ* OUTPUT_^1_%LDA* CONN_)BUS CONNECT_^1_%ENQ 8_^1_%RTJ* OUTPUT_^1_%ENA 0_,NO EXTRA CONDITIONS_^1_%RTJ* STATUS_^1_%LDA* CONN_)UNIT SELECT_^1_%ENQ 6_^1_%RTJ* OUTPUT_^1_%ENA 0_,NO EXTRA C€€ONDITIONS_^1_%RTJ* STATUS_^1_%ENA $20_*RTZS_^1_%ENQ 1_^1_%RTJ* OUTPUT_^1_%ENA $10_*WAIT FOR ON CYLINDER_^1_%RTJ* STATUS_^1_%LLS 24_+TYPE BIT TO Q15_^1_%LDA =XSINFST_$SECTOR 0, DISK 1, SINGLE DENSITY_^1_%SQM TYPSET_'SKIP IF SINGLE DENSITY_^1_%LDA =XDBLFST_^1TYPSET STA* SECSIZ+1_^1_%ENA 0_,SELECT MEMORY BANK 0_^1_%ENQ 3_^1_%RTJ* OUTPUT_^1_%LDA* START_^1_%CLR Q_^1SECSIZ DVI €€ =N0_*TWO WORD INSTRUCTION_^1_%STA* TEMP_)BIT 14 FOR DISK 0 OR 1_^1_%TRQ A_^1_%CLR Q_^1_%DVI =N29_^1_%ALS 1_^1_%EOR* TEMP_)FORM WORD OF CYLINDER, SURFACE, DISK_^1_%QLS 10_^1_%LLS 14_+A= DISK, SURFACE, SECTOR_^1_%QLS 4_,Q= CYLINDER IN CORRECT POSITION_^1_%STQ* SEEK_)SAVE FOR SEEK COMMAND_^1_%TRA Q_^1_%INA $A_+ADD WRITE BITS_^1_%STA* WRITE_(SAVE FOR WRITE FUNCTION_^1_%INQ $€€B_+ADD COMPARE BIT_^1_%STQ* COMPR_(SAVE FOR COMPARE FUNCTION_^1_%ENA 1_^1_%STA* FIRST_^1SEC_"LDA* LENGTH_'LOAD LENGTH OF TRANSFER_^1_%ENQ 7_^1_%RTJ* OUTPUT_^1_%ENA 0_,LOAD FWA IN MEMORY_^1_%ENQ 2_^1_%RTJ* OUTPUT_^1_%LDA* SEEK_)SEEK TO CYLINDER_^1_%ENQ $A_^1_%RTJ* OUTPUT_^1_%ENA $10_*WAIT FOR ON CYLINDER_^1_%RTJ* STATUS_^1_%LDA* COMPR_^1_%LDQ* FIRST_(WRITE OR COMPARE_^1_%SQZ €€SEC10_^1_%ENA 0_,CLEAR FLAG, DO COMPARE NEXT_^1_%STA* FIRST_^1_%LDA* WRITE_^1SEC10 ENQ 1_,DO WRITE OR COMPARE_^1_%RTJ* OUTPUT_^1_%ENA 0_^1_%RTJ* STATUS_^1_%LDA* FIRST_(COMPARE DONE_^1_%SAZ END_*YES, EXIT_^1_%JMP* SEC_*DO COMPARE_^1END_"CLR Q_^1_%JMP* SOF_^1*_]_^1*_]_^1*_]_^1OUTPUT NUM 0_^1_%ADQ- 0_,TWO WORD INSTRUCTION_^1DISK39 NUM 0_^1_%OUT OREJ-*_^1_%JMP* (OUTPUT)_^1*_]_€€^1*_]_^1*_]_^1STATUS NUM 0_^1_%STA* MASK_^1_%LDQ* DISK39_^1_%INQ $10_^1INP_"INP OREJ-*_^1_%STA* DYNST_^1_%ALS 12_^1_%SAP NOALRM_^1_%JMP* OREJ_^1NOALRM ALS 2_,CHECK IF BUSY_^1_%SAP NOBSY_(SKIP IF NOT BUSY_^1_%JMP* INP_^1NOBSY LDA* DYNST_(WAIT FOR SELECTED CONDITION_^1_%AND* MASK_^1_%EOR* MASK_^1_%SAZ DNE_^1_%JMP* INP_^1DNE_"LDA* DYNST_^1_%JMP* (STATUS)_^1*_]_^1*_]_^1*_]_^1O€ÎREJ_!SET Q_^1SOF_"SLS 0_^1_%JMP* SOF_^1*_]_^1CONN_!NUM $80_*CONNECT, SELECT CODE_^1SEEK_!NUM 0_^1WRITE NUM 0_^1COMPR NUM 0_^1TEMP_!NUM 0_^1FIRST NUM 1_^1MASK_!NUM 0_^1DYNST NUM 0_^1_%END_]_^__ÎPBT8326 CSY/ D67 P€1_%NAM BT8326_$DECK-ID D67 PERIPH. DRIVERS 1.2C_%SUMMARY-_^1*_$LCTT 7/9 TRACK BOOTSTRAP_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1*_]_^1*_]_^1*_]_^1***_]_^1* FUNCTION:_^1*_'READ 1 RECORD FROM TAPE INTO CORE, STARTING AT FWA, THEN_^1*_'GIVE CONTROL TO FWA._^1*_]_^1*_'THE RECORD IS READ ONLY€€ FROM UNIT 0_^1*_]_^1*_]_^1* AT ENTRY:_^1*_'A-REG CONTAINS FIRST WORD ADDRESS (FWA)_^1*_'Q-REG CONTAINS EQUIPMENT CODE (EWES)_^1*_]_^1* AT EXIT:_^1*_'IF ANY REJECTS OCCURS, THE PROGRAM HANG UP, ELSE IT RETURNS_^1*_'*_'CONTROL TO FWA_^1*_]_^1* GENERAL DESCRIPTION:_^1*_'A STAND ALONE, 1 READ REQUEST IS PERFORM. THEN IF UNIT IS_^1*_'7-TRACK, A PACK IS DONE. AT END, JUMP TO FWA IS D€€ONE._^1REED_#MAC_$K_^1_(LDA*_#('K')_^1_(RAO*_#'K'_^1_(EMC_^1RITE_#MAC_$K_^1_(STQ*_#('K')_^1_(RAO*_#'K'_^1_(EMC_^1SHFT_#MAC_$K,L_^1_(IFC_$0,NE,'K'_^1_(ALS_$'K'_^1_(EIF_^1_(LLS_$'L'_^1_(EMC_^1*_]_^1*_]_^1_(ENT_$BOOTAP_^1*_]_^1*_]_^1_%EJT_]_^1BOOTAP_!IIN_!0_(INHIBIT INTERRUPTS_^1_(STQ* EWES_%SAVE EQUIPMENT CODE_^1_(STA* FWA_'SAVE FIRST WORD ADDRESS_^1_(CLR A_^1_(STA* INDX_%INITIATE I€€NDX_^1*_]_^1*_7PERFORM READ_^1*_7------------_^1_(RTJ* OUTPUT_#BUS CONNECT_((INDEX=0)_^1_(RTJ* OUTPUT_#UNIT SELECT_((INDEX=1)_^1_(RTJ* OUTPUT_#BANK SELECT_((INDEX=2)_^1_(RTJ* OUTPUT_#FWA SELECT_)(INDEX=3)_^1_(RTJ* OUTPUT_#BLOCK LENGTH SELECT (INDEX=4)_^1_(RTJ* OUTPUT_#READ_/(INDEX=5)_^1*_]_^1_(RTJ* TRNSPT_#GET TRANSPORT STATUS_^1_(SAN UDESLC_#UNIT IS 9-TRACK_^1_(RTJ* PACK_%UNIT IS€€ 7-TRACK, PACK THE BUFFER_^1UDESLC_!RTJ* OUTPUT_#DESELECT THE UNIT_^1_(EIN 0_)ENABLE INTERRUPTS_^1_(JMP* (FWA)_$GO EXECUTE THE READ RECORD_^1*_]_^1*_7END-LOGIC_^1*_7---------_^1OUTPUT_!NUM 0_)OUTPUT CONTROLLER ROUTINE_^1*_7----------------------------_^1_(LDQ* INDX_^1_(LDA* AVEQ,Q_#PREPARE A,Q_^1_(LDQ* QVEQ,Q_^1_(ADQ* EWES_^1_(OUT REJCT-*_"OUTPUT_^1_(RTJ* WAIT_%WAIT FOR COMPLETI€€ON OF I/O_^1_(RAO* INDX_%INCREASE INDX FOR THE NEXT I/O_^1_(JMP* (OUTPUT)_^1*_]_^1*_7WAIT ROUTINE_^1*_7------------_^1WAIT_#NUM 0_^1LOOP_#ENQ $10_'SEND DYNAMIC STATUS REQUEST_^1_(ADQ* EWES_^1_(INP REJCT-*_^1_(LDQ* INDX_^1_(EOR* RSLT,Q_#EOR STATUS WITH EXPECTED RESULT_^1_(LDQ* RSLT,Q_^1_(SQZ COMPT_$(DO NOT CHECK RESURT IF DOING EOR WITH ZERO)_^1_(AND* MASK_^1_(SAZ COMPT_$IF STA€€TUS IS AS EXPECTED,RETURN_^1_(JMP* LOOP_)ELSE, LOOP ON STATUS_^1COMPT_"JMP* (WAIT)_^1*_]_^1REJCT_"NOP 0_)REJECT ROUTINE_^1_(NUM $18FF_$HANG UP_^1*_]_^1_%EJT_]_^1*_'TABLES OF CONSTANTS_^1*_]_^1EWES_#NUM 0_)EQUIPMENT CODE_^1INDX_#NUM 0_)INDX_^1FWA1_#NUM 0_)FWA FOR PACK ROUTINE_^1FWA2_#NUM 0_^1LWA_$NUM 0_)LAST WORD ADDRESS_^1*_]_^1QVEQ_#NUM 8_)BUS CONNECT_^1_(NUM 6_)UNIT SELE€€CT_^1_(NUM 3_)BANK_^1_(NUM 2_)FWA_^1_(NUM 7_)BL_^1_(NUM 1_)READ_^1_(NUM 6_)DESELECT UNIT_^1*_]_^1AVEQ_#NUM $80_'BUS CONNECT_^1_(NUM $80_'UNIT SELECT_^1_(NUM 0_)BANK_^1FWA_$NUM 0_)FWA_^1_(NUM $FFFF_$BL_^1_(NUM 0_)READ_^1_(NUM 0_)UNIT DESELECT_^1*_]_^1RSLT_#NUM $1100_$BUS CONNECT_^1_(NUM $1101_$UNIT SELECT_^1_(NUM 0_)BANK_^1_(NUM 0_)FWA_^1_(NUM 0_)BL_^1_(NUM $1101€€_$READ_^1_(NUM 0_)UNIT DESELECT_^1*_]_^1MASK_#NUM $938F_$MASK FOR DYNAMIC STATUS_^1_%EJT_]_^1*_]_^1*_'7-TRACK ROUTINES. THESE ROUTINES SHOULD BE PLACED HERE_^1*_'SO IT WOULD BE POSSIBLE TO DISCONNECT IT FOR 9-TRACK SYSTEMS._^1*_]_^1TRNSPT_!NUM 0_)GET TYPE OF UNIT (7/9 TRACK)_^1_(ENQ 5_^1_(ADQ* EWES_^1_(INP REJCT-*_"ASK FOR TRANSPORT STATUS_^1_(AND =N$18_$MASK TYPE OF UNIT_^1_€€(JMP* (TRNSPT)_^1*_]_^1PACK_#NUM 0_)PACK RECORD_^1_(LDA* FWA_^1_(STA* FWA1_^1_(STA* FWA2_^1_(ENQ 2_)GET LAST WORD ADDRESS WHICH WS READ_^1_(ADQ* EWES_^1_(INP REJCT-*_^1_(INA -1_^1_(STA* LWA_^1LOOP1_"RTJ* PACK1_$PACK 4 WORD FROM FWA1 TO 3 WODS FROM FWA2_^1_(LDA* LWA_^1_(SUB* FWA1_%IS ALL BUFFER PACKED?_^1_(SAM DONE_%YES_^1_(JMP* LOOP1_$NO_^1DONE_#JMP* (PACK)_#RETURN_^1PACK1_"NU€€M 0_^1_(REED FWA1_%READ WORD_^1_(SHFT 2,6_*TRANSFER 6 BIT TO Q_^1_(SHFT 2,6_*TRANSFER 6 BIT TO Q_^1_(REED FWA1_%READ WORD_^1_(SHFT 2,4_"TRANSFER 4 BIT TO Q_^1_(RITE FWA2_%WRITE PACKED WORD_^1_(SHFT 0,2_*TRANSFER 2 BIT TO Q_^1_(SHFT 2,6_*TRANSFER 6 BIT TO Q_^1_(REED FWA1_%READ WORD_^1_(SHFT 2,6_*TRANSFER 6 BIT TO Q_^1_(SHFT 2,2_*TRANSFER 2 BIT TO Q_^1_(RITE FWA2_%WRITE PACKED WORD€Ò_^1_(SHFT 0,4_*TRANSFER 4 BIT TO Q_^1_(REED FWA1_%READ WORD_^1_(SHFT 2,6_*TRANSFER 6 BIT TO Q_^1_(SHFT 2,6_*TRANSFER 6 BIT TO Q_^1_(RITE FWA2_%WRITE PACKED WORD_^1_(JMP* (PACK1)_"RETURN_^1*_]_^1*_]_^1_(END_^__ ÒPDP8112 CSY/ D68 P€1_%NAM DP8112_$DECK-ID D68 PERIPH. DRIVERS 1.2C_%SUMMARY-_^1*_$PSEUDO DRIVER FOR THE CDT ON THE 1843-2_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 2_^1*_]_^1****_]_^1*E_]_^1*_MISC_^1*_>----_^1*_]_^1*_;PARAMETERS_^1*_;----------_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT ICDT_)INITIATOR ENTRY_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT* CRTREQ_^1_%EXT* CRTSTA_^1_%EXT LOG_*ENGINEERING FILE LOG ROUTINE_^1_%EXT ALTDEV_'ALTERNATE DEVICE HANDLER_^1*_]_^€€1_%EJT 1_^1*_:** EQUATES **_^1*_]_^1************************************************************************_^1*_]_'*_^1*_5PHYSICAL DEVICE TABLE EQUATES_2*_^1*_]_'*_^1************************************************************************_^1_%SPC 2_^1*_]_^1_%EQU ELVL(0)_%SCHEDULAR CALL_^1_%EQU EDIN(1)_%INITIATOR ADDRESS_^1_%EQU EDCN(2)_%CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_$€€TIMEOUT ERROR ADDRESS_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU EREQST(8)_#REQUEST STATUS_^1_%EQU ESTAT1(9)_#DRIVER STATUS_^1_%EQU ECCOR(10)_#NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST EQUIPMENT STATUS_^1_%EQU MA€€SLGN(13)_"DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"FAULT CODE_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"STATUS AFTER INITIAL€€ ENTRY_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER TIMEOUT._^1_%EQU FLAGWD(24)_"FLAG WORD_^1_%EQU PORT(25)_$CLA PORT NUMBER FOR THIS DEVICE_^1_%EQU BEGBUF(26)_"START ADDRESS FOR CONVERTED BUFFER_^1_%EQU ENDBUF(27)_"LAST LOCATION + 1 OF CONVERTED BUFFER_^1_%EQU RDBUF(28)_#READ FWA OF CALLER'S BUFFER_^1_%EQU NEWREQ(29)_"NEW REQUEST CODE, PRIORI€€TIES_^1_%EQU NEWCOM(30)_"NEW COMPLETION ADDRESS_^1_%EQU NEWTHD(31)_"NEW THREAD_^1_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADDRESS OF HEADER/BUFFER_^1_%EQU ELINK(35)_#PDT THREAD_^1*_]_^1_%EQU AFNR($B5)_#ADDRESS OF FIND-NEXT-REQUEST ROUTINE_^1_%EQU ACMPRQ($B6)_!ADDRESS OF COMPLETE-REQUEST ROUTINE_^1€€_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU ZERO($22)_^1_%EJT 1_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1*_$INITIATOR(ICDT)_^1*_(.FIND THE NEXT REQUEST FOR A NON-BUSY PDT, VIA FNR._^1*_(.IF NONE EXISTS GO TO DISPATCHER._^1*_(.CALL KERNAL TO PROCESS THE I/O FOR REQUEST FOUND._^1*_(.ON RETURN, CALL MAKEQ TO SET UP V-FIELD IN ESTAT1._^1*_(.IF AN ERROR HAS OCCURED, AND NOT DIAGNOSTIC L€€U,_^1*_+LOG THE ERROR IN ENG. FILE AND GO TO THE ALTERNATE_^1*_+DEVICE HANDLER._^1*_(.CCOMPLETE THE REQUEST._^1*_(.START AT FIRST STEP._^1*_]_^1****_]_^1_%EJT 1_^1*_]_^1*_,DRIVER_^1*_]_^1_%SPC 1_^1ICDT_!STQ- I_,SAVE PHYSICAL DEVICE TABLE ADDRESS_^1_%STQ* PDT1_)SAVE PDT FOR CIRCULAR SEARCH_^1_%SPC 1_^1*_8SHOULD WE FIND NEXT REQUEST FOR THIS PDT._^1I10_"SFN- EREQST,15,1,I_"SKIP IF€€ BUSY BIT SET_^1_%JMP* IFNR_,NOT BUSY - FNR_^1_%SFZ- EREQST,14,1,I_"SKIP IF ERROR BIT NOT SET_^1_%JMP* IFNR_,BUSY WITH ERROR INDICATES ALTDEV ENTRY- FNR_^1_%SPC 1_^1*_8IS THERE ANOTHER PDT TO LOOK AT._^1I20_"LRI- ELINK,I_)GET NEXT PDT ON THREAD_^1_%CIE PDT1_,SKIP IF NEXT PDT = LAST CURRENT PDT_^1_%JMP* I10_-GO LOOK AT NEXT PDT._^1_%JMP- (ADISP)_)EXIT TO DISPATCHER_^1_%SPC 1_^1IF€€NR_!RTJ- (AFNR)_'FIND NEXT REQUEST_^1_%JMP* I20_-1 NO REQUEST THIS PDT_^1_%SRI* PDT1_,2 FOUND REQUEST - SAVE CURRENT PDT ADDRESS_^1_%SPC 1_^1_%RTJ* KCRT_)CALL KERNEL TO PERFORM I/O_^1_%SPC 1_^1_%RTJ MAKEV_(MAKE V-FIELD IN ESTAT1_^1*_8SEE IF ERRORS WERE MADE_^1_%SFN- ESTAT1,15,1,I_"SKIP IF ERROR BIT SET_^1_%JMP* I30_-NO ERROR_^1_%LDQ- ELU,I_+GET CURRENT LOGICAL UNIT_^1_%CQE- DIAG€€LU,I_(SKIP IF CURRENT = DIAGNOSTIC LU_^1_%JMP* I40_-ERROR FOUND AND NOT DIAGNOSTIC LU_^1_%SPC 1_^1I30_"RTJ- (ACMPRQ)_$COMPLETE THE REQUEST_^1_%JMP* IFNR_)LOOP BACK TO SEARCH FOR NEXT REQUEST_^1_%SPC 1_^1I40_"QLS 6_,SHIFT LU TO 15-6 OF Q-REG_^1_%ADQ- FLTCOD,I_$PUT FAULT CODE IN 5-0 OF Q-REG_^1_%RTJ LOG_*LOG THE ERROR IN THE ENGINEERING FILE_^1_%JMP ALTDEV_'GO TO THE ALTERNATE D€€EVICE HANDLER._^1_%SPC 2_^1PDT1_!NUM 0_,LAST CURRENT PDT_^1_%EJT 1_^1*_]_^1*_V04-26-77 REV 100_^1*_3KERNEL INITIATOR_^1*_]_^1*_]_^1KCRT_!NUM 0_^1*_8SET STATUS WORDS TO $FFFF_^1_%SEF- SENTRY,15,16,I_!ENTRY STATUS_^1_%SEF- SINTER,15,16,I_!INTERRUPT STATUS_^1_%SEF- STIMEO,15,16,I_!TIMEOUT STATUS_^1*_8CLEAR PDT WORDS_^1_%CLF- ESTAT2,15,16,I_!HARDWARE STATUS_^1_%CLF- FLAGWD,15,16,I_€€!FLAGWD FOR NO MORE I/O_^1_%CLF- ENDBUF,15,16,I_!END OF NEWLY FORMATTED BUFFER_^1*_8IF MOTION REQUEST RETURN_^1_%LDQ- EPTR,I_*Q = PARAMETER LIST ADDRESS_^1_%LFA- (ZERO),13,5,Q_"REQUEST CODE TO A_^1_%SFA* RQCOD,13,5_"SAVE REQUEST CODE_^1_%INA -14_-TEST FOR MOTION REQUEST_^1_%SAN K10_-SKIP IF NOT MOTION_^1_%JMP* K50_-RETURN IF MOTION_^1*_8CHECK IF READ REQUEST_^1K10_"SFZ- ESTAT1,0,€€1,I_#SKIP IF READ_^1_%JMP* K20_-GO PROCESS WRITE_^1_%EJT 1_^1_%SPC 1_^1*_8INITIALIZE READ VALUES_^1_%LDA- ECCOR,I_)GET REQUESTOR'S FWA_^1_%STA- RDBUF,I_)SAVE FWA_^1_%LDQ- BEGBUF,I_(GET NEW FWA IN Q_^1_%STQ* NEWBUF_'SAVE NEW FWA_^1*_8COMPUTE LENGTH OF BUFFER_^1_%LDA- ELSTWD,I_(GET LWA+1_^1_%SUB- ECCOR,I_)SUBTRACT FWA_^1_%STA* RDLEN_+SAVE LENGTH_^1*_8SET NEW BUFFER LENGTH NO GREATE€€R THAN MAXIMUM_^1_%LDA* RDMAX_+GET MAX READ LENGTH_^1_%SUB* RDLEN_+SUBTRACT REQUESTOR LENGTH_^1_%SAP K15_-SKIP IF LENGTH LESS THAN OR EQUAL MAX_^1_%SPC 1_^1_%ADQ* RDMAX_+ENDBUF=BEGBUF+MAX_^1_%JMP* K17_^1K15_"ADQ* RDLEN_+ENDBUF=BEGBUF+REQUESTOR LENGTH_^1_%RAO- FLAGWD,I_(SET NO-MORE-I/O FLAG_^1K17_"STQ- ENDBUF,I_$SAVE LWA+1 OF NEW BUFFER IN PDT_^1_%JMP* K65_*GO MAKE I/O REQUEST_^1_€€%EJT 1_^1*_8INITIALIZE WRITE VALUES_^1K20_"LDQ- ECCOR,I_)GET FWA OF REQUESTOR'S BUFFER IN Q_^1_%LDA- BEGBUF,I_(GET FWA OF NEW BUFFER IN A_^1_%STA* NEWBUF_*SAVE FWA._^1_%CLR A_/ZERO DATA WORD_^1_%XFA 1_/CLEAR NEW BUFFER WORD COUNTER IN R1_^1*_8CHECK IF FWRITE_^1_%SFN- ESTAT1,1,1,I_#SKIP IF FWRITE_^1_%JMP* K30_-NOT FWRITE_^1*_8CHECK IF FIRST WORD OF REQUEST_^1_%SFZ- ESTAT1,5,1,I_#€€SKIP IF FIRST WORD_^1_%JMP* K30_-NOT FIRST WORD_^1_%SEF- ESTAT1,5,1,I_#CLEAR FIRST WORD FLAG_^1_%LDA* CRLF_)INSERT CR/LF IN FIRST WORD OF FWRITE BUFFER_^1_%JMP* K45_*GO STORE IN NEWBUF_^1_%SPC 1_^1*_8CHECK IF OUTPUT LENGTH TO SEND IS ZERO WORDS_^1K30_"CQE- ELSTWD,I_(SKIP IF NEXT ADDRESS = LWA+1_^1_%JMP* K35_-MORE WORDS TO SEND_^1_%JMP* K50_-GO MAKE I/O REQUEST, SET FLAG_^1*_8CHECK€€ IF OUTPUT BUFFER IS FULL_^1K35_"C1E* NEWMAX_*SKIP IF NEW BUFFER COUNTER = MAXIMUM_^1_%JMP* K40_-GO GET NEXT CHARACTER_^1_%JMP* K55_-GO MAKE I/O REQUEST_^1_%SPC 1_^1K40_"LDA- (ZERO),Q_$GET NEXT REQUESTOR BUFFER WORD_^1_%INQ 1_,INCREMENT NEXT-REQBUF-DATA ADDRESS_^1_%SPC 1_^1*_8CHECK IF FIRST CHARACTER = EOT_^1_%XFA 3_/PUT NEXT WORD IN R3_^1_%AN3* HFF00_+MASK FIRST CHARACTER THRO€€UGH_^1_%C3E* EOTU_,SKIP IF FIRST CHARACTER = EOT_^1_%JMP* K45_-NOT EOT_^1_%JMP* K50_-GO MAKE I/O REQUEST, SET FLAG_^1K45_"SEF- ESTAT1,4,1,I CLEAR FIRST CHARACTER FLAG (1=CLEAR)_^1_%SRA* (NEWBUF),1_"PUT WORD IN NEW BUFFER_^1_%AR1* ONE_*INCREMENT NEW-BUFFER COUNTER IN R1_^1_%SPC 1_^1*_8CHECK IF 2ND CHARACTER = EOT_^1_%XFA 3_/PUT NEXT WORD IN R3_^1_%AN3* H00FF_+MASK 2ND CHARACTER T€€HROUGH_^1_%C3E* EOTL_,SKIP IF 2ND CHARACTER = EOT_^1_%JMP* K30_-NO EOT THIS WORD - REPEAT WD TRANSFER LOOP_^1_%SPC 2_^1K50_"RAO- FLAGWD,I_$SET NO MORE I/O FLAG_^1_%SPC 1_^1K55_"STQ* NEXADR_'SAVE NEXT ADDR OF REQUESTORS'S BUFFER_^1_%SPC 1_^1*_8COMPUTE LWA+1 OF NEWBUFFER_^1_%AR1* NEWBUF_*ADD # WORD IN BUFFER TO FWA OF BUFFER_^1_%SR1- ENDBUF,I_(PUT LWA+1 OF NEW BUFFER IN PDT_^1*_8C€€HECK IF ANY CHARACTERS IN NEW BUFFER_^1_%SFZ- ESTAT1,4,1,I_#SKIP IF FIRST CHAR FLAG SET (0=SET)_^1_%JMP* K65_-DATA TO SEND - GO MAKE I/O REQUEST_^1_%SPC 2_^1K60_"JMP* (KCRT)_'R E T U R N T O D R I V E R_^1_%SPC 2_^1K65_"RTJ CRTREQ_'I/O REQUEST - RETURN WHEN I/O COMPLETE_^1_%SPC 1_^1_%EJT 1_^1*_]_^1*_1CONTINUATOR_^1*_]_^1_%STQ- I_,SAVE PDT_^1_%RTJ CRTSTA_'ANALYZE STATUS_^1*_€€8CHECK IF READ REQUEST_^1_%SFZ- ESTAT1,0,1,I_#SKIP IF READ_^1_%JMP* K75_^1*_8READ REQUEST - MOVE DATA INTO CALLER'S BUFFER_^1_%LDA- RDBUF,I_)GET ADDRESS OF REQUEST READ BUFFER_^1_%STA* RDFWA_+SAVE READ BUFFER FWA_^1_%LDA- BEGBUF,I_(GET ADDRESS OF NEW BUFFER_^1_%STA* NEWBUF_*SAVE NEW FWA_^1_%LDQ- ECCOR,I_)GET RETURNED NEXT ADDRESS OF CALLER'S BUF_^1_%SBQ* RDFWA_+SUBTRACT FWA OF CALL€€ER'S BUFFER_^1_%INQ -1_.LENGTH OF READ - 1 IN Q_^1K70_"LDA* (NEWBUF),Q_%PICK UP WORD FROM NEW BUFFER_^1_%STA* (RDFWA),Q_'STORE IN CALLER'S BUFFER_^1_%DQP *-K70_+REPEAT IF NOT ALL MOVED._^1_%SPC 2_^1K75_"SFZ- ESTAT1,15,1,I SKIP IF NO ERROR OCCURRED_^1_%JMP* K60_*EXIT - FAULT_^1_%SPC 1_^1*_8CHECK IF MORE DATA TO OUTPUT_^1_%SFZ- FLAGWD,15,16,I_!SKIP IF NO-MORE-I/O FLAG NOT SET._^1€€_%JMP* K60_-EXIT - NO-MORE-IO_^1_%SPC 1_^1_%CLF- ESTAT1,4,1,I SET FIRST CHARACTER FLAG (0=SET)_^1_%JMP* K10_*LOOP BACK FOR NEXT RECORD_^1_$EJT 1_^1*_]_^1*_8STORAGE_^1*_]_^1RQCOD NUM 0_,REQUEST CODE_^1RDFWA NUM 0_,READ FWA (CALLERS BUFFER)_^1RDLEN NUM 0_,READ BUFFER LENGTH_^1NEWBUF NUM 0_,FWA OF NEW BUFFER_^1NEXADR NUM 0_,SAVE POINTER TO CALLERS BUFFER_^1*_]_^1*_8CONSTANT€€S_^1*_]_^1RDMAX NUM 50_+MAXIMUM READ BUFFER LENGTH_^1CRLF_!NUM $0D0A_)CARRIAGE RETURN/LINE FEED_^1NEWMAX NUM 50_+MAXIMUM WRITE BUFFER_^1HFF00 NUM $FF00_(UPPER CHAR MASK_^1H00FF NUM $00FF_(LOWER CHAR MASK_^1EOTU_!NUM $0300_(UPPER CHAR EOT_^1EOTL_!NUM $0003_(LOWER CHAR EOT_^1ONE_"NUM 1_^1_%EJT 1_^1*_]_^1*_$MAKEV - CHECKS FOR A SHORT READ IF NO ERROR OCCURRED AND_^1*_-INPUT€€ REQUEST._^1*_-IF SHORT READ, SETS BIT 14 IN ESTAT1 AND PUTS_^1*_-NEXT AVAILABLE LOCATION IN LAST WORD OF BUFFER._^1*_]_^1_%SPC 1_^1MAKEV NUM 0_,SUBROUTINE ENTRY POINT_^1*_8CHECK IF READ AND NO ERROR_^1_%SFZ- ESTAT1,15,1,I_"SKIP 1 IF NO ERROR OCCURRED_^1_%JMP* MAK10_+ERROR OCCURRED - EXIT_^1_%SFN- ESTAT1,0,1,I_#SHIP 1 IF READ REQUEST_^1_%JMP* MAK10_+WRITE REQUEST - EXIT_^1*_8CHE€€CK IF SHORT READ_^1_%LDA- ECCOR,I_)GET NEXT AVAILABLE LOCATION_^1_%SUB- ELSTWD,I_(SUBTRACT LAST WORD ADDRESS + 1_^1_%SAP MAK10_+SKIP TO EXIT - NOT SHORT READ_^1*_8STORE NEXT AVAILABLE LOCATION IN LAST WORD_^1_%LDA- ECCOR,I_)GET NEXT AVAIL LOCATION_^1_%LDQ- ELSTWD,I_(GET LAST ADDRESS + 1 OF BUFFER_^1_%INQ -1_.DECREMENT Q TO LAST WORD ADDRESS OF BUFFER_^1_%STA- (ZERO),Q_(STORE NEXT€† AVAIL IN LWA_^1*_]_^1_%SEF- ESTAT1,14,1,I SET SHORT READ BIT IN ESTAT1 V-FIELD_^1_%SPC 1_^1MAK10 JMP* (MAKEV)_%RETURN_^1_%END_]_^__†PRQ8112 CSY/ D69 P€1_%NAM RQ8112_$DECK-ID D69 PERIPH. DRIVERS 1.2C_%SUMMARY-_^1*_$1843-2 CDT PSEUDO DRIVER - EXPAND I/O REQUEST_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 2_^1*_]_^1****_]_^1*E_]_^1*_MISC_^1*_>----_^1*_]_^1*_;PARAMETERS_^1*_;----------_^1*€€_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT CRTREQ_^1_%ENT CRTSTA_^1_%ENT CCDT_^1*_9** EXTERNALS **_^1*_]_^1_%EXT TERMLU_'1X8 CLA LU_^1_%EXT PORTS_(START OF PORT TABLES_^1_%EXT EPORTS_'END OF PORT TABLES_^1_%EXT PLENTH_'LENGTH OF EACH TABLE_^1_%EXT LOG1A_(PDT ADDRESS TABLE_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_8PDT EQUATES_^1*_]_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK (CLA TIMER)_^1_€€%EQU ELU(5)_'LU_^1_%EQU EPTR(6)_%PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU EREQST(8)_#REQUEST STATUS_^1_%EQU ESTAT1(9)_#STATUS WORD 1_^1_%EQU ECCOR(10)_#NEXT LOCATION FOR DATA_^1*_2(THIS VALUE INCREASED BY LENGTH OF DATA SENT_^1*_3AT CLA REQUEST COMPLETION)._^1_%EQU ESTAT2(12)_"LAST EQUIPMENT STATUS_^1_%EQU FLTCOD(16)_"FAULT CODE_^1_%EQU DIAGLU(17)_"DI€€AGNOSTIC LU_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER TIME OUT_^1_%EQU PORT(25)_$PORT NUMBER FOR DEVICE_^1_%EQU BEGBUF(26)_"FIRST DATA LOCATION FOR CURRENT I/O SEGMENT._^1_%EQU ENDBUF(27)_"LWA+1 OF CURRENT I/O SEGMENT._^1_%EQU RDBUF(28)_#READ FWA OF CALLER'S BUFFER_^1_%EQU NEWREQ(29)_"NEW REQUEST CODE, PRIORITIES_^1_%EQU NEWCOM(30)_"NEW COM€€PLETION ADDRESS_^1_%EQU NEWTHD(31)_"NEW THREAD_^1_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADDRESS OF HEADER/BUFFER_^1_%EQU ELINK(35)_#PDT THREAD_^1*_]_^1*_8LOW CORE EQUATES_^1*_]_^1_%EQU NEGONE($13)_!$FFFE_^1_%EQU ZERO($22)_#ZERO_^1_%EQU ADISP($EA)_"DISPATCHER_^1*_]_^1*_8FAULT CODE EQUATES_^1*_]_^€€1_%EQU ALARM(2)_^1_%EQU TIMOUT(0)_^1_%EQU PARITY(3)_^1*_]_^1*_8BUFFER HEADER EQUATES_^1*_]_^1_%EQU PORTNB(0)_#PORT NUMBER_^1_%EQU DSTAT1(1)_#STATUS_^1_%EQU CURPOS(2)_#CURSOR POSITION (NEG=NOT USED) / TERMINATION C_^1_%EQU NCHAR(3)_$NUMBER OF CHARACTERS READ_^1_%EQU DATADD(4)_#ADDRESS OF DATA BUFFER_^1*_]_^1*_8PORT TABLE EQUATES_^1*_]_^1_%EQU PORTEQ(11)_"PORT TABLE OFFSET F€€OR EWES_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1****_]_^1_%EJT 1_^1CRTREQ NUM 0_,ENTRY_^1_%SRI* PDT_*SAVE PDT ADDRESS_^1*_8CHECK IF DIAGNOSTIC LU_^1_%LDA- DIAGLU,I_(GET DIAGNOSTIC LU_^1_%CAE- ELU,I_+SKIP IF DIAGNOSTIC_^1_%JMP* CRT10_+NOT DIAGNOSTIC_^1_%RTJ* CRTWES_'YES DIAG, PUT EQUIP CODE IN PORT TABLES_^1*_8SET REQUEST CODE IN NEW REQUEST_^1CRT10 LDQ- EPTR,I_*Q=PARAMETER LIST ADDRES€€S_^1_%LFA- (ZERO),13,5,Q_"REQUEST CODE TO A_^1_%SFA- NEWREQ,13,5,I_"STORE IN REQUEST_^1*_8SET COMPLETION PRIORITY IN NEW REQUEST_^1_%LDA- $EF_-PICK UP CURRENT PRIORITY LEVEL_^1_%SFA- NEWREQ,3,4,I_#STORE IN REQUEST_^1*_8SET LU OF 1X8 CLA IN NEW REQUEST_^1_%LDA =XTERMLU_(PICK UP LOGICAL UNIT OF CLA_^1_%STA- NEWVLU,I_(STORE IN REQUEST_^1*_8COMPUTE LENGTH OF DATA BUFFER FOR NEW REQUES€€T_^1_%LDA- ENDBUF,I_(PICK UP LWA+1_^1_%SUB- BEGBUF,I_(SUBTRACT FWA_^1_%INQ -5_/BACKUP 5 WORDS_^1_%ALS 1_/TIMES 2 FOR CHARACTERS_^1_%STA- NEWNCH,I_(STORE IN REQUEST_^1*_8SET ADDRESS OF REQUEST BUFFER IN NEW REQUEST_^1_%LDQ- BEGBUF,I_(PICK UP FWA_^1_%INQ -5_/BACKUP 5 WORDS_^1_%STQ- NEWSHD,I_(STORE IN REQUEST_^1*_8SET PORT NUMBER IN NEW REQUEST_^1_%LDA- PORT,I_*PICK UP PORT NUMBER_^1€€_%STA- (ZERO),Q_(STORE IN REQUEST_^1*_8CLEAR STATUS AND READ TRANSFER COUNT,NEW REQ._^1_%CLR A_^1_%STA- DSTAT1,Q_(CLEAR STATUS_^1_%STA- NCHAR,Q_)CLEAR READ CHARACTER TRANSFER COUNT._^1*_8INDICATE NO CURSOR POSITIONING IN NEW REQUEST_^1_%ENA -1_^1_%STA- CURPOS,Q_(PUT NEG VALUE IN CURSOR FLAG_^1_%LDA- BEGBUF,I_(GET DATA FWA_^1_%STA- DATADD,Q_(STORE IN REQUEST HEADER_^1_%SPC 1_^1*_€€8SET DATA BUFFER ADDRESS IN HEADER_^1*_8PUT IO REQUEST ADDRESS IN INDIRECT REQUEST_^1_%LDA* PDT_*GET PDT ADDRESS_^1_%INA NEWREQ_*ADD OFFSET TO NEW REQUEST_^1_%STA* RQST+2_*SAVE ADDRESS IN INDIRECT REQUEST_^1*_]_^1RQST_!INDIR RQST,1_$INDIRECT IO REQUEST (ADDRESS TO BE INSERTED)_^1*_]_^1_%JMP- (ADISP)_%WAIT FOR COMPLETION_^1_%SPC 2_^1*_]_^1*_]_^1*_8STORAGE_^1*_]_^1DATBUF NUM 0_,B€€UFFER DATA ADDRESS_^1NWORDS NUM 0_,DATA LENGTH IN WORDS_^1PDT_"NUM 0_,PDT ADDRESS_^1*_]_^1_%EJT 1_^1*_8COMPLETION ADDRESS_^1CCDT_!EQU CCDT(*)_%CONTINUATOR ADDRESS_%******_^1REQCOM NUM 0_^1*_8GET PDT ADDRESS OF THIS COMPLETION_^1_%LDA* REQCOM_)GET COMPLETION ADDRESS WITHIN PDT_^1_%SUB =XELINK+3_'BACKUP TO GET PDT START ADDRESS_^1_%STA- I_,RESTORE PDT ADDRESS TO I_^1*_]_^1*_8SE€€E IF ANY CHARACTERS_^1_%LDQ- NEWSHD,I_(HEADER ADDRESS TO Q_^1_%LDQ- NCHAR,Q_)PICK UP NUM CHARS_^1*_8DETERMINE NUMBER OF WORDS_^1_%XFQ 1_/CHARACTER COUNT TO R1_^1_%LRS 1_/CONVERT LENGTH TO WORDS_^1_%SFZ- ESTAT1,0,1,I SKIP IF READ COMPLETION_^1_%JMP* REQ010_'GO TO DO WRITE COMPLETION_^1*_8DETERMINE IF ODD POSITION FILLER NEEDED_^1_%SAP REQ010_*SKIP IF EVEN NUM CHARS INPUT_^1_%LDA€€- BEGBUF,I_(GET DATA BUFFER FWA_^1_%STA* DATBUF_*SAVE BUFFER ADDRESS LOCALLY_^1_%ENA -0_.A=$FFFF_^1_%SCA* (DATBUF),1_%STORE $FF IN ODD CHARACTER POSITION_^1_%INQ 1_/ADD 1 TO NUM OF WORDS INPUT_^1REQ010 STQ* NWORDS_*SAVE NUMBER OF WORDS READ_^1_%SPC 2_^1*_8UPDATE ECCOR_^1REQ020 LDA- ECCOR,I_)PICK UP STARTING DATA ADDRESS_^1_%ADD* NWORDS_*ADD NUMBER OF WORDS TRANSFERRED_^1_%STA- E€€CCOR,I_)RESET ECCOR IN PDT_^1_%SPC 1_^1REQ050 XFI Q_,PUT PDT ADDRESS IN Q_^1_%JMP* (CRTREQ)_$RETURN_^1_%EJT 1_^1*_]_^1*_)C R T S T A_^1*_]_^1*_$THIS ROUTINE USES THE STATUS WORD RETURNED BY THE CLA DRIVER_^1*_$IN THE EXPANDED I/O REQUEST, TO DO THE FOLLOWING._^1*_)1. STATUS SAVED IN PDT (ESTAT2,SINTER)._^1*_)2. IF ERROR INDICATED_^1*_/SET ERROR BITS IN PDT (ESTAT1,EREQST)._^1*_€€/DETERMINE FAULT CODE AND PUT IN PDT (FLTCOD)._^1*_)3. RETURN_^1*_]_^1*_]_^1CRTSTA NUM 0_,ENTRY_^1*_8SAVE STATUS IN PDT_^1_%LDQ- NEWSHD,I_(HEADER ADDRESS TO Q_^1_%LR1- DSTAT1,Q_(PICK UP RETURNED STATUS IN R1_^1_%SR1- ESTAT2,I_(SAVE IN PDT(LAST STATUS TAKEN)_^1_%SR1- SINTER,I_(SAVE IN PDT(STATUS AFTER INTERRUPT)_^1*_8CHECK IF ERROR FLAG SET_^1_%SFN- NEWVLU,15,3,I_"SKIP IF V-FIELD I€€N LU WORD IS SET_^1_%JMP* STA30_+NO ERROR - JUMP TO END._^1*_8SET ERROR BITS IN PDT_^1_%SEF- ESTAT1,15,1,I_"BIT 15 IN ESTAT1 - DEVICE ERROR_^1_%SEF- EREQST,14,1,I_"BIT 14 IN EREQST - HARDWARE ERROR_^1*_8DETERMINE FAULT CODE_^1_%ENA ALARM_+ASSUME ALARM - CHANGE LATER IF OTHER._^1_%SFN- DSTAT1,10,1,Q_"SKIP IF TIMEOUT_^1_%JMP* STA10_+NOT TIMEOUT_^1_%SPC 1_^1_%ENA TIMOUT_*GET FAULT €€CODE FOR TIMEOUT_^1_%SR1- STIMEO,I_(SAVE STATUS IN PDT_^1_%JMP* STA20_+GO TO RETURN_^1STA10 SFN- DSTAT1,8,1,Q_#SKIP IF PARITY_^1_%JMP* STA20_+NOT PARITY_^1_%SPC 1_^1_%ENA PARITY_*GET FAULT CODE FOR PARITY_^1STA20 STA- FLTCOD,I_(STORE CODE IN PDT_^1_%SPC 1_^1STA30 JMP* (CRTSTA)_$RETURN_^1_%EJT 1_^1*_]_^1*_)C R T W E S - ENTERED ONLY IF DIAGNOSTIC LU._^1*_8SETS EQUIPMENT CODE€€ IN_^1*_81X8 CLA PORT TABLES TO VALUE_^1*_8IN 1X8 CLA PDT. THE VALUE MAY_^1*_8HAVE BEEN CHANGED IN PDT IF_^1*_8DIAGNOSTIC PARAMETER FOR EWES_^1*_8WAS CHANGED._^1_%SPC 1_^1CRTWES NUM 0_,ENTRY_^1_%LDQ =XTERMLU_$GET 1X8 CLA LU_^1_%LDQ LOG1A,Q_%GET PDT ADDRESS OF 1X8 CLA_^1*_8SET CLA TIMER FOR ENTRY EVERY 60 MS._^1_%LDA- EDCLK,Q_%GET CLA TIMER WORD_^1_%EOR- NEGONE_'COMPARE WITHE $€€FFFE_^1_%SAN WES05_(SKIP IF TIMER ON (NOT $FFFE)_^1_%LDA* GOTIME_'GET MAX TIMER VALUE_^1_%STA- EDCLK,Q_%RESET CLA TIMER WORD_^1_%SPC 1_^1WES05 LFA- EWES,10,4,I_$GET EWES FOR 1X8 CLA FROM PERIPH PDT_^1_%SFA- EWES,10,4,Q_!SAVE EWES IN CLA PDT_^1_%LDQ =XPORTS_%GET PORT TABLE ADDRESS_^1WES10 ADQ =XPLENTH_$INCREASE Q BY PORT LENGTH_^1*_$CQE =XEPORTS_$SKIP IF END OF PORT TABLES RE€*ACHED_^1_%NUM $0405_^1_%NUM $E000_^1_%ADC EPORTS_^1_%SPC 1_^1_%JMP* WES20_(NOT END OF PORT TABLES_^1_%JMP* (CRTWES)_$RETURN_^1WES20 SFA- PORTEQ,10,4,Q STORE EWES IN NEXT PORT TABLE_^1_%JMP* WES10_(LOOP UNTIL ALL PORT TABLES ENTERED_^1_%SPC 1_^1GOTIME NUM 60_+CLA TIME OUT VALUE_^1_%END_]_^__*PDP8277 CSY/ D70 P€1_%NAM DP8277_$DECK-ID D70 PERIPH. DRIVERS 1.2C_%SUMMARY-_^1*_$PSEUDO DRIVER FOR THE MATRIX PRINTER ON THE 1843-2_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 2_^1*_]_^1****_]_^1*E_]_^1*_MISC_^1*_>----_^1*_]_^1*_;PARAMETERS_^1*_;----------_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT IPRT_)INITIATOR ENTRY_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT ALTDEV_'ALTERNATE DEVICE HANDLER_^1_%EXT CPRT_)DRIVER'S CONTINUATOR._^1_%EXT LOG_*EN€€GINEERING FILE LOG ROUTINE_^1_%EXT MAS300_'MASS MEMORY EXECUTIVE_^1_%EXT* PRTREQ_^1_%EXT* PRTSTA_^1*_]_^1_%EJT 1_^1*_:** EQUATES **_^1*_]_^1************************************************************************_^1*_]_'*_^1*_5PHYSICAL DEVICE TABLE EQUATES_2*_^1*_]_'*_^1************************************************************************_^1_%SPC 2_^1*_]_^1_%EQU ELVL(0)_%SCH€€EDULAR CALL_^1_%EQU EDIN(1)_%INITIATOR ADDRESS_^1_%EQU EDCN(2)_%CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_$TIMEOUT ERROR ADDRESS_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU EREQST(8)_#REQUEST STATUS_^1_%EQU ESTAT1(9)_#DRIVER STATUS_^1_%EQU ECCOR(10)_#NEXT LOCATION FOR DA€€TA_^1_%EQU ELSTWD(11)_"LAST LOCATION + 1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"FNR RETURN ADDRESS_^1_%EQU FLTCOD(16)_"FAULT CODE_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL UNIT_^1_%EQU GHOSTI(18)_"COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"MICR€€O INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"INTERRUPT TIMEOUT VALUE_^1_%EQU SENTRY(21)_"STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER TIMEOUT._^1_%EQU FTNLU(24)_#FORTRAN LU NUMBER_^1_%EQU PORT(25)_$CLA PORT NUMBER FOR THIS DEVICE_^1_%EQU BEGBUF(26)_"START ADDRESS FOR CONVERTED BUFFER_^1_%EQU ENDBUF(27)_"LAST LOCATION + 1 O€€F CONVERTED BUFFER_^1_%EQU NEXCAR(28)_"NEXT CHAR FOR OUTPUT BUFFER_^1_%EQU NEWREQ(29)_"NEW REQUEST CODE, PRIORITIES_^1_%EQU NEWCOM(30)_"NEW COMPLETION ADDRESS_^1_%EQU NEWTHD(31)_"NEW THREAD_^1_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADDRESS OF HEADER/BUFFER_^1_%EQU TABCNT(35)_"NUM OF BLANKS TO OUT€€PUT FOR TAB_^1_%EQU TABSET(36)_"N = TAB STOPS EVERY N CHARACTERS_^1_%EQU LINCT(37)_#CURRENT PAGE LINE COUNTER_^1_%EQU MAXLIN(38)_"MAXIMUM LINES PER PAGE_^1_%EQU VTABLF(39)_"LINES TO ADD TO LINE CTR FOR VERT TAB_^1_%EQU ELINK(40)_#PDT THREAD_^1_%EQU NCOMP(41)_#PSEUDO COMPLETION FOR NEW REQUEST_^1*_]_^1*_]_^1*_8COMMUNICATIONS REGION_^1*_]_^1_%EQU LPMSK($2)_#$0000_!START OF LOW€€ER ONES MASK_^1_%EQU NZERO($12)_"$FFFF_!START OF LOWER ZEROS MASKS._^1_%EQU ZERO($22)_#$0000_!MASK CONTAINING A ZERO._^1_%EQU ONEBIT($23)_!$0001_!START OF SPECIFIC BIT ONE MASK._^1_%EQU ZROBIT($33)_!$FFFE_!START OF SPECIFIC BIT ZERO MASK._^1_%EQU AFNR($B5)_#ADDRESS OF FIND-NEXT-REQUEST ROUTINE_^1_%EQU ACMPRQ($B6)_!ADDRESS OF COMPLETE-REQUEST ROUTINE_^1_%EQU ADISP($EA)_"ADDRE€€SS OF DISPATCHER_^1*_]_^1*_8CONTROL CHARACTERS_^1*_]_^1EOM_"EQU EOM($03)_$END OF MESSAGE_^1EOT_"EQU EOT($04)_$END OF TRANSMISSION_^1BEL_"EQU BEL($07)_$RING BELL_^1HTAB_!EQU HTAB($09)_#HORIZONTAL TAB_^1LF_#EQU LF($0A)_%LINE FEED_^1VTAB_!EQU VTAB($0B)_#VERTICAL TAB_^1FF_#EQU FF($0C)_%FORM FEED_^1CR_#EQU CR($0D)_%CARRIAGE RETURN_^1ESC_"EQU ESC($1B)_$ESCAPE_^1FILL00 EQU FILL0€€0(0)_#FILL CHAR._^1FILL7F EQU FILL7F($7F)_!FILL CHAR._^1BLANK EQU BLANK($20)_"BLANK CHAR FOR PSEUDO TAB_^1*_]_^1_%EQU MOTCOD(4)_#WORD IN REQUEST CONTAINING MOTION CODE_^1_%EJT_]_^1************************************************************************_^1*_$THIS CODE IS CALLED BY THE MASS MEMORY DRIVER_^1*_$EXECUTIVE. IT IS CALLED ONLY AFTER THE DRIVER HAS_^1*_$BEEN READ INTO€€ MEMORY BY THE EXECUTIVE._^1*_$IT IS NOT CALLED IF THE DRIVER IS CORE RESIDENT._^1*_$ITS PURPOSE IS_^1*_$TO INITIALIZE THE PHYSICAL DEVICE TABLES THAT THIS_^1*_$DRIVER USES._^1*_$ENTRY IS WITH :_^1*_2Q = PDT ADDRESS._^1*_2A = ABSOLUTE ADDRESS OF DRIVER._^1_%SPC 2_^1BEGIN STQ- I_,SAVE PHYSTAB ADDRESS IN I._^1_%STQ* STRPDT_'SAVE STARTING PHYSTAB ADDRESS._^1_%STA* LOCN_)SAVE ABSOLUT€€E DRIVER ADDRESS._^1BEGIN1 LDA* LOCN_)CALCULATE_^1_%TRA Q_,DRIVER INITIATOR ADDRESS AND_^1_%INQ IPRT-BEGIN_"PLUG IT INTO_^1_%STQ- 1,I_*THE PHYSTAB._^1_%LDQ =XCPRT_'CALCULATE_^1_%AAQ Q_,DRIVER CONTINUATOR ADDRESS AND_^1_%STQ- 2,I_*PLUG IT INTO THE PHYSTAB._^1_%LDA- ELINK,I_%CHECK IF THER ARE_^1_%TRA Q_,MORE PHYSTABS TO INITIALIZE_^1_%SUB* STRPDT_^1_%SAZ IPRT_)SKIP IF FINISHED.€€_^1_%STQ- I_,PUT ADDRESS OF NEXT PHYSTAB INTO THE I REG._^1_%JMP* BEGIN1_'INITIALIZE THE NEXT PHYSTAB ON THE THREAD._^1************************************************************************_^1_%SPC 3_^1*_8STORAGE_^1*_]_^1LOCN_!NUM 0_,STARTING ADDRESS OF THE DRIVER._^1STRPDT NUM 0_,STARTING PHYSTAB ADDRESS._^1REMAIN NUM 0_,CURRENT CHAR POS BEYOND LAST TAB SETTING_^1*_]_^1*_8CO€€NSTANTS_^1*_]_^1D120_!NUM 120_*MAXIMUM TAB POSITION_^1D133_!NUM 133_*MAXIMUM CHAR PER LINE + CONTROL CHAR_^1MAXOUT NUM 140_*MAX # OF CHAR FOR OUTPUT BUFFER_^1_%EJT 1_^1_%EJT 1_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1*_$INITIATOR(ICDT)_^1*_(.FIND THE NEXT REQUEST FOR A NON-BUSY PDT, VIA FNR._^1*_(.IF NONE EXISTS GO TO DISPATCHER._^1*_(.CALL KERNAL TO PROCESS THE I/O FOR REQUEST FOUND€€._^1*_(.ON RETURN, CALL MAKEQ TO SET UP V-FIELD IN ESTAT1._^1*_(.IF AN ERROR HAS OCCURED, AND NOT DIAGNOSTIC LU,_^1*_+LOG THE ERROR IN ENG. FILE AND GO TO THE ALTERNATE_^1*_+DEVICE HANDLER._^1*_(.CCOMPLETE THE REQUEST._^1*_(.START AT FIRST STEP._^1*_]_^1****_]_^1_%EJT 1_^1*_]_^1*_,DRIVER_^1*_]_^1_%SPC 1_^1IPRT_!STQ- I_,SAVE PHYSICAL DEVICE TABLE ADDRESS_^1_%STQ* PDT1_)SAVE PDT FO€€R CIRCULAR SEARCH_^1_%SPC 1_^1*_8SHOULD WE FIND NEXT REQUEST FOR THIS PDT._^1I10_"SFN- EREQST,15,1,I_"SKIP IF BUSY BIT SET_^1_%JMP* IFNR_,NOT BUSY - FNR_^1_%SFZ- EREQST,14,1,I_"SKIP IF ERROR BIT NOT SET_^1_%JMP* IFNR_,BUSY WITH ERROR INDICATES ALTDEV ENTRY- FNR_^1_%SPC 1_^1*_8IS THERE ANOTHER PDT TO LOOK AT._^1I20_"LRI- ELINK,I_)GET NEXT PDT ON THREAD_^1_%CIE PDT1_,SKIP IF NEXT €€PDT = LAST CURRENT PDT_^1_%JMP* I10_-GO LOOK AT NEXT PDT._^1_%JMP+ MAS300_'EXIT TO DISPATCHER (VIA MASS MEMORY EXEC)_^1_%SPC 1_^1IFNR_!RTJ- (AFNR)_'FIND NEXT REQUEST_^1_%JMP* I20_-1 NO REQUEST THIS PDT_^1_%SRI* PDT1_,2 FOUND REQUEST - SAVE CURRENT PDT ADDRESS_^1_%SPC 1_^1_%RTJ* KPRT_)CALL KERNEL TO PERFORM I/O_^1_%SPC 1_^1_%RTJ MAKEV_(MAKE V-FIELD IN ESTAT1_^1*_8SEE IF ERRORS W€€ERE MADE_^1_%SFN- ESTAT1,15,1,I_"SKIP IF ERROR BIT SET_^1_%JMP* I30_-NO ERROR_^1_%LDQ- ELU,I_+GET CURRENT LOGICAL UNIT_^1_%CQE- DIAGLU,I_(SKIP IF CURRENT = DIAGNOSTIC LU_^1_%JMP* I40_-ERROR FOUND AND NOT DIAGNOSTIC LU_^1_%SPC 1_^1I30_"RTJ- (ACMPRQ)_$COMPLETE THE REQUEST_^1_%JMP* IFNR_)LOOP BACK TO SEARCH FOR NEXT REQUEST_^1_%SPC 1_^1I40_"QLS 6_,SHIFT LU TO 15-6 OF Q-REG_^1_%ADQ-€€ FLTCOD,I_$PUT FAULT CODE IN 5-0 OF Q-REG_^1_%RTJ LOG_*LOG THE ERROR IN THE ENGINEERING FILE_^1_%JMP ALTDEV_'GO TO THE ALTERNATE DEVICE HANDLER._^1_%SPC 2_^1PDT1_!NUM 0_,LAST CURRENT PDT_^1_%EJT 1_^1*_]_^1*_$MAKEV - CHECKS FOR A SHORT READ IF NO ERROR OCCURRED AND_^1*_-INPUT REQUEST._^1*_-IF SHORT READ, SETS BIT 14 IN ESTAT1 AND PUTS_^1*_-NEXT AVAILABLE LOCATION IN LAST WORD O€€F BUFFER._^1*_]_^1_%SPC 1_^1MAKEV NUM 0_,SUBROUTINE ENTRY POINT_^1*_8CHECK IF READ AND NO ERROR_^1_%SFZ- ESTAT1,15,1,I_"SKIP 1 IF NO ERROR OCCURRED_^1_%JMP* MAK10_+ERROR OCCURRED - EXIT_^1_%SFN- ESTAT1,0,1,I_#SHIP 1 IF READ REQUEST_^1_%JMP* MAK10_+WRITE REQUEST - EXIT_^1*_8CHECK IF SHORT READ_^1_%LDA- ECCOR,I_)GET NEXT AVAILABLE LOCATION_^1_%SUB- ELSTWD,I_(SUBTRACT LAST WORD ADD€€RESS + 1_^1_%SAP MAK10_+SKIP TO EXIT - NOT SHORT READ_^1*_8STORE NEXT AVAILABLE LOCATION IN LAST WORD_^1_%LDA- ECCOR,I_)GET NEXT AVAIL LOCATION_^1_%LDQ- ELSTWD,I_(GET LAST ADDRESS + 1 OF BUFFER_^1_%INQ -1_.DECREMENT Q TO LAST WORD ADDRESS OF BUFFER_^1_%STA- (ZERO),Q_(STORE NEXT AVAIL IN LWA_^1*_]_^1_%SEF- ESTAT1,14,1,I SET SHORT READ BIT IN ESTAT1 V-FIELD_^1_%SPC 1_^1MAK10 JMP*€€ (MAKEV)_%RETURN_^1_%EJT 1_^1*_]_^1*_3KERNEL INITIATOR_^1*_]_^1*_]_^1KPRT_!NUM 0_^1*_8SET STATUS WORDS TO $FFFF_^1_%SEF- SENTRY,15,16,I_!ENTRY STATUS_^1_%SEF- SINTER,15,16,I_!INTERRUPT STATUS_^1_%SEF- STIMEO,15,16,I_!TIMEOUT STATUS_^1*_8CLEAR PDT WORDS_^1_%CLF- ESTAT2,15,16,I_!HARDWARE STATUS_^1_%CLF- ENDBUF,15,16,I_!END OF NEWLY FORMATTED BUFFER_^1*_8IF MOTION REQUEST RETURN_^1_€€%LDQ- EPTR,I_*Q = PARAMETER LIST ADDRESS_^1_%LFA- (ZERO),13,5,Q_"REQUEST CODE TO A_^1_%INA -14_-TEST FOR MOTION REQUEST_^1_%SAN K10_-SKIP IF NOT MOTION_^1_%RTJ* MOTREQ_'GO HANDLE MOTION REQUEST_^1_%JMP KRETUR_*RETURN IF MOTION_^1K10_"SFZ- ESTAT1,0,1,I_#SKIP IF READ_^1_%JMP* K15_-GO HANDLE WRITE_^1_%JMP KRETUR_*READ NOT POSSIBLE - RETURN_^1_%EJT 1_^1*_]_^1*_(MOTREQ - HANDLE MOT€€ION REQUESTS TO MATRIX PRINTER_^1*_]_^1MOTREQ NUM 0_^1_%CLR A_^1_%STA* EOF_*CLEAR EOF FLAG_^1_%XFA 2_,CLEAR OUTPUT BUFFER INDEX (REG 2)_^1_%LDA- MOTCOD,Q_$PICK UP MOTION CODE_^1MOT10 STA* MOTION_'SAVE MOTION CODE LOCALLY_^1_%LFA* MOTION,15,4_!GET CURRENT MOTION COMMAND_^1_%SAN MOT20_(SKIP IF MORE MOTION COMMANDS_^1_%JMP* MOT60_(NO MORE MOTION COMMANDS_^1MOT20 INA -2_+CHECK F€€OR WRITE EOF_^1_%SAZ MOT30_+SKIP IF EOF_^1_%SPC 1_^1_%INA -2_+CHECK FOR REW/UNLOAD_^1_%SAZ MOT50_+SKIP IF REW/UNL_^1_%SPC 1_^1_%JMP* MOT40_(KEEP CHECKING_^1_%SPC 1_^1*_*EOF - PAGE EJT, RESET LINE COUNT, CONTINUE MOTION REQ_^1*_]_^1MOT30 STA- LINCT,I_$ZERO LINE COUNT_^1_%RAO* EOF_*SET EOF FLAG_^1_%ENA FF_+GET FORM FEED CHAR_^1_%STA- NEXCAR,I_$STORE FORM FEED IN NEXT CHARAC.€€ WORD_^1_%RTJ FILL_)PUT FORM FEED IN OUTPUT BUFFER_^1_%SPC 1_^1MOT40 LDA* MOTION_'GET MOTION CODE_^1_%LLS 4_,SHIFT UP NEXT MOTION COMMAND_^1_%JMP* MOT10_(PROCESS NEXT MOTION COMMAND_^1_%SPC 1_^1*_*REW/UNL - RESET LINE COUNT, TERMINATE REQUEST_^1*_]_^1MOT50 STA- LINCT,I_%ZERO LINE COUNT_^1_%SPC 2_^1MOT60 LDA* EOF_*GET EOF FLAG_^1_%SAZ MOT70_)SKIP IF NO FORM FEEDS TO SEND_^1_€€%RTJ SENDIT_'SEND FORM FEED TO PRINTER_^1MOT70 JMP* (MOTREQ)_%RETURN_^1_%SPC 1_^1MOTION NUM 0_,LOCAL STORAGE FOR MOTION WORD_^1EOF_"NUM 0_,FLAG SET IF EOF MOTION, SEND FF TO PRINTER_^1_%EJT 1_^1*_]_^1*_$FORMAT DATA FOR WRITE REQUEST_^1*_]_^1_%SPC 1_^1*_8FLAGS USED IN ESTAT1 (EXPECT CLEARED BY FNR)_^1*_;BIT 8 = EOT NEEDED_^1*_;BIT 7 = LF NEEDED_^1*_;BIT 6 = LAST DATA_^1*_;€€BIT 5 = CONTROL CHARACTER_^1*_;BIT 4 = FIRST CHARACTER_^1*_;BIT 2 = 0=UPPER CHAR/ 1= LOWER CHAR._^1*_8CLEAR TAB NEEDED FLAG WORD_^1K15_"CLF- TABCNT,15,16,I_^1*_8CLEAR BUFFER COUNTERS:_^1*_]_^1*_;PRINT CHARAC COUNTER = REG1_^1*_;OUTPUT BUFFER INDEX = REG2_^1_%CLR A_^1_%XFA 1_/CLEAR REG1_^1_%XFA 2_/CLEAR REG2_^1_%SPC 3_^1*_8CHECK IF ANY DATA LEFT TO WRITE_^1KWRITE LDA- ECCOR,€€I_%GET NEXT DATA ADDRESS_^1_%SUB- ELSTWD,I_(SUBTRACT LAST DATA+1 ADDRESS_^1_%SAP KW20_,SKIP IF NO MORE DATA TO FORMAT_^1_%JMP* KW40_,DATA TO SEND - CONTINUE_^1*_8NO DATA TO FORMAT_^1KW20_!SFZ- ESTAT1,4,1,I_#SKIP IF THIS IS THE FIRST CHAR_^1_%JMP* KW25_,NEED TO SEND DATA IN BUFFER_^1_%JMP KRETUR_*ZERO WORD DATA BUFFER - RETURN_^1_%SPC 1_^1KW25_!SEF- ESTAT1,6,1,I_#SET LAST DATA FL€€AG_^1_%LFA- ESTAT1,1,1,I_#GET FWRITE/WRITE FLAG_^1_%SAN KW30_,SKIP IF FWRITE_^1*_;WRITE - SEND BUF TO PRINTER (NO CONTROL)_^1_%SEF- ESTAT1,5,1,I_#SET CONTROL CHAR FLAG TO FORCE I/O REQUEST_^1_%JMP KW230_^1_%SPC 1_^1*_;FWRITE - SEND BUF TO PRINTER WITH CR_^1KW30_!ENA CR_.GET CR CHARACTER_^1_%STA- NEXCAR,I_(STORE IN NEXT CHARACTER WORD_^1_%JMP KW210_+GO SET CONTROL FLAG_^1_%SPC €€ 2_^1*_8CHECK FLAGS_^1KW40_!LFA- ESTAT1,7,1,I_#GET LF NEEDED FLAG_^1_%SAZ KW50_/SKIP IF NO LF NEEDED_^1_%CLF- ESTAT1,7,1,I_'CLEAR LF NEEDED FLAG_^1_%ENA LF_1GET LF CHARAC._^1_%STA- NEXCAR,I_+STORE LF IN NEXT CHARAC. WORD_^1_%JMP KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW50_!LFA- ESTAT1,8,1,I_#GET EOT NEEDED FLAG_^1_%SAZ KW60_/SKIP IF NO EOT NEEDED_^1_%CLF- ESTAT1,8,1,I_'CLEAR E€€OT NEEDED_^1_%SEF- ESTAT1,6,1,I_'SET LAST DATA FLAG_^1_%ENA EOT_0GET EOT CHARAC_^1_%STA- NEXCAR,I_+STORE EOT IN NEXT CHAR WORD_^1_%JMP KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW60_!LFA- ESTAT1,4,1,I_#GET 1ST CHARAC FLAG_^1_%SAN KW70_/SKIP IF NOT 1ST CHARAC_^1_%SEF- ESTAT1,4,1,I_'SET NOT 1ST CHARAC FLAG_^1*_>SUBROU DOES INITIAL FORMATTING_^1_%RTJ FTNFMT_-FOR FWRITE AND FWRITE/FO€€RTRAN._^1_%SFN- ESTAT1,5,1,I_'SKIP IF CONTROL FLAG SET_^1_%JMP* KW70_)NO INITIAL FORMATTING_^1_%JMP KW215_.GO HANDLE INITIAL FORMAT CONTROLS_^1_%SPC 1_^1KW70_!LDA- TABCNT,I_(GET TAB FLAG_^1_%SAZ KW100_.SKIP IF NO TABS NEEDED_^1_%INA -1_^1_%STA- TABCNT,I_+DECREMENT TABCOUNT_^1_%ENA BLANK_.GET BLANK CHARAC_^1_%STA- NEXCAR,I_+STORE IN NEXT CHAR WORD_^1_%JMP KW200_.GO UPDATE PRIN€€T BUFFER_^1_%EJT 1_^1*_8GET NEXT USER CHARACTER AND ANALYZE IT_^1*_]_^1*_8SUBROU RETURNS NEXT USER CHAR IN NEXCAR,I;_^1*_?TOGGLES UPPER/LOWER BIT,_^1KW100 RTJ NXTCHR_.BUMPS NEXADR IF LOWER CHARAC._^1_%SPC 2_^1*_8CHECK FOR CONTROL CHARACTERS_^1_%ENA LF_.LINE FEED CHECK_^1_%CAE- NEXCAR,I_+SKIP IF LF_^1_%JMP* KW105_.NOT LF_^1_%JMP* KWRITE_-YES LF - IGNORE_^1_%SPC 1_^1KW105 ENA€€ EOM_-END OF MESSAGE CHECK_^1_%CAE- NEXCAR,I_+SKIP IF EOM_^1_%JMP* KW110_.NOT EOM_^1_%SEF- ESTAT1,6,1,I_'YES-SET LAST DATA FLAG_^1_%ENA LF_1GET LF CHARAC._^1_%STA- NEXCAR,I_+STORE LF IN NEXT CHAR WORD_^1_%JMP KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW110 ENA EOT_-END OF TEXT CHECK_^1_%CAE- NEXCAR,I_+SKIP IF EOT_^1_%JMP* KW115_.NOT EOT_^1_%SEF- ESTAT1,8,1,I_'YES - SET EOT NEEDE€€D FLAG_^1_%ENA LF_1GET LF CHARAC._^1_%STA- NEXCAR,I_+STORE LF IN NEXT CHAR WORD_^1_%JMP KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW115 ENA CR_.CARRIAGE RETURN CHECK_^1_%CAE- NEXCAR,I_+SKIP IF CR_^1_%JMP* KW120_.NOT CR_^1_%ENA LF_1GET LF CHARAC_^1_%STA- NEXCAR,I_+STORE LF IN NEXT CHAR WORD_^1_%JMP KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW120 ENA FF_.FORM FEED CHECK_^1_%CAE- €€NEXCAR,I_+SKIP IF FORM FEED_^1_%JMP* KW125_.NOT FF_^1_%JMP* KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW125 ENA FILL00_*$00 CHECK - FILL CHARAC_^1_%CAE- NEXCAR,I_+SKIP IF 0_^1_%JMP* KW126_.NOT 0_^1_%JMP* KW220_.THIS CHAR NOT PRINTED_^1_%SPC 1_^1KW126 ENA FILL7F_*$7F CHECK_^1_%CAE- NEXCAR,I_+SKIP IF $7F - FILL CHARAC._^1_%JMP* KW127_.NOT $7F_^1_%JMP* KW220_.THIS CHAR NOT PRINTED_€€^1_%SPC 1_^1KW127 ENA BEL_-BELL CHECK_^1_%CAE- NEXCAR,I_+SKIP IF BELL_^1_%JMP* KW130_.NOT BELL_^1_%JMP* KW220_.THIS CHAR NOT PRINTED_^1_%SPC 1_^1KW130 ENA ESC_-ESCAPE CHECK_^1_%CAE- NEXCAR,I_+SKIP IF ESC_^1_%JMP* KW135_.NOT ESC._^1_%JMP* KW150_.GO HANDLE ESCAPE ALGORITHM_^1*_]_^1KW135 ENA VTAB_,VERTICAL TAB CHECK_^1_%CAE- NEXCAR,I_+SKIP IF VT_^1_%JMP* KW140_.NOT VT_^1_%SR1€€- TABCNT,I_+SET TAB FLAG TO PRINT COUNT_^1_%JMP* KW210_.GO SET CONTROL FLAG_^1_%SPC 1_^1KW140 ENA HTAB_,HORIZONTAL TAB CHECK_^1_%CAE- NEXCAR,I_+SKIP IF HT_^1_%JMP* KW200_.NOT HT - MUST BE PRINTABLE CHARACTER_^1*_]_^1*_>HORIZONTAL TAB GOES TO NEXT TABSET POSIT_^1*_]_^1_%XF1 A_2GET PRINT COUNT IN A_^1_%SUB D120_/SUBTRACT MAXIMUM TAB POSITION_^1_%SAM KW145_.SKIP IF MAXIMUM TAB P€€OS NOT REACHED_^1_%ENA LF_1GET LF CHARACTER_^1_%STA- NEXCAR,I_+STORE LF IN NEXT CHARACTER WORD_^1_%JMP* KW210_.GO SET CONTROL FLAG_^1KW145 XF1 A_2GET PRINT CHARACTER COUNT IN A_^1_%DVI- TABSET,I_+DIVIDE BY TAB VALUE IN PDT_^1_%STQ REMAIN_-SAVE REMAINDER_^1_%LDA- TABSET,I_+GET TAB VALUE_^1_%SUB REMAIN_-SUBTRACT REMAINDER FROM TAB VALUE_^1_%STA- TABCNT,I_+SET TAB FLAG TO # BLANK€€S TO NEXT TAB_^1_%JMP* KW70_/GO PROCESS TAB BLANKS_^1_%EJT 1_^1*_]_^1*_8ESCAPE ALGORITHM_^1*_]_^1KW150 RTJ NXTCHR_'GET NEXT CHARACTER IN PDT-NEXCAR_^1_%LDA =N$30_+CHECK ASCII 0_^1_%CAE- NEXCAR,I_(SKIP IF NEXCAR = $30_^1_%JMP* KW155_+NOT $30_^1_%ENA CR_.GET CR CHARAC._^1_%JMP* KW170_+GO STORE IN NEXT CHAR WORD_^1_%SPC 1_^1KW155 INA 1_/CHECK ASCII 1_^1_%CAE- NEXCAR,I_(SKIP IF€€ NEXCAR = $31_^1_%JMP* KW160_+NOT $31_^1_%JMP* KW165_+INDICATES ONE LF_^1_%SPC 1_^1KW160 INA 1_/CHECK ASCII 2_^1_%CAE- NEXCAR,I_(SKIP IF NEXCAR = $32_^1_%JMP* KW70_,IGNORE ESC - NOT VALID NEXT CHARAC._^1_%SEF- ESTAT1,7,1,I_#SET LINE FEED NEEDED TO GET 2ND LF._^1KW165 ENA LF_.GET LINE FEED CHARAC._^1KW170 STA- NEXCAR,I_(SET UP NEXT CHARACTER WORD_^1_%JMP* KW210_+GO SET CONTROL€€ FLAG_^1_%EJT 1_^1*_8SET UP PRINT BUFFER_^1*_]_^1KW200 AR1- ONEBIT_*INCREMENT PRINT CHARACTER COUNT_^1_%C1E D133_,SKIP IF MAXIMUM PRINT COUNT REACHED_^1_%JMP* KW220_+PRINT MAX NOT REACHED_^1_%SFZ- ESTAT1,1,1,I_#SKIP IF UNFORMATTED_^1_%JMP* KW205_+SET UP LINE END CONTROL FOR FWRITE_^1_%SEF- ESTAT1,5,1,I_#SET CONTROL FLAG TO FORCE OUTPUT FOR WRITE_^1_%JMP* KW220_^1_%SPC 1_^1KW205€€ LFA- ESTAT1,2,1,I_#FWRITE LINE END - REPLACE NEXCAR W/CONTROL_^1*_>SAVE NEXCAR FOR NEXT LINE_^1_%SAN KW207_.SKIP IF LAST FETCHED CHAR WAS UPPER_^1_%LDA- ECCOR,I_,GET NEXT DATA ADDRESS_^1_%INA -1_1DECREMENT DATA ADDRESS_^1_%STA- ECCOR,I_,RETURN DECREMENTED NEXT ADDRESS_^1KW207 ENA 4_2TOGGLE UPPER/LOWER CHAR BIT_^1_%EOR- ESTAT1,I_+*_^1_%STA- ESTAT1,I_+*_^1_%SEF- ESTAT1,7,1,I_'S€€ET LF NEEDED FLAG_^1_%JMP KWRITE_-GO HANDLE LF_^1*_8SET UP CONTROLS_^1KW210 SEF- ESTAT1,5,1,I_#SET CONTROL CHARACTER FLAG_^1_%SPC 1_^1KW215 SFN- ESTAT1,1,1,I_#SKIP IF FWRITE_^1_%JMP* KW220_+UNFORMATTED - DON'T COUNT LINES_^1_%RTJ PAGE_,HANDLE LINE COUNTING AND FORM FEED._^1_%SPC 1_^1*_8SET UP OUTPUT BUFFER_^1KW220 RTJ* FILL_,PUT NEXCAR IN BUFFER - UPDATE COUNTERS_^1_%SPC 1_€€^1KW230 SFZ- ESTAT1,5,1,I SKIP IF CONTROL FLAG NOT SET_^1_%JMP* KW240_+CONTROL, SEND BUFFER_^1_%JMP KWRITE_'GO BACK TO DETERMINE NEXT CHARACTER._^1_%SPC 1_^1*_]_^1*_8SHIP CURRENT FORMATTED DATA BUFFER TO PRINTER_^1*_]_^1KW240 RTJ* SENDIT_*SEND BUFFER_^1*_8CHECK IF LF OR EOT NEEDED_^1_%LFA- ESTAT1,8,2,I_#GET FLAGS_^1_%SAZ KW250_(SKIP IF FLAGS NOT SET_^1_%JMP KW40_,FLAG IS SET€€ - GO PROCESS IT_^1KW250 SFZ- ESTAT1,6,1,I SKIP IF LAST DATA FLAG IS NOT SET_^1_%JMP* KRETUR_*LAST DATA SENT - RETURN_^1*_8CHECK IF ANY DATA LEFT TO WRITE_^1_%LDA- ECCOR,I_)GET NEXT DATA ADDRESS_^1_%SUB- ELSTWD,I_(SUBTRACT LAST DATA+1 ADDRESS_^1_%SAP KRETUR_*SKIP IF NO MORE DATA TO SEND_^1_%ENA 0_^1_%XFA 1_,CLEAR PRINT CHARACTER COUNTER_-*_^1_%XFA 2_,CLEAR OUTPUT BUFFER COUNT€€ER_/*_^1_%JMP KWRITE_*GO BACK TO DETERMINE NEXT CHARACTER_^1KRETUR JMP (KPRT)_*RETURN TO DRIVER_^1_%EJT 1_^1*_]_^1*_$SENDIT - CALL CLA INTERFACE ROUTINE TO OUTPUT DATA/GET STATUS_^1*_]_^1_%SPC 2_^1SENDIT NUM 0_,ENTRY_^1_%SPC 1_^1*_8SET UP LWA+1 OF OUTPUT BUFFER_^1_%LDA- BEGBUF,I_(GET FWA OF OUTPUT BUFFER_^1_%STA* NEWBUF_*SAVE LOCALLY_^1_%CLF- ESTAT1,5,1,I_#CLEAR CONTROL CHAR €€FLAG_^1_%XF2 Q_/PUT CHAR COUNT IN Q_^1_%LRS 1_/CHANGE CHARAC. COUNT TO WORD COUNT_^1_%SAP SEND10_*SKIP IF EVEN # CHARACTERS_^1_%INQ 1_/ADD 1 WORD FOR ODD CHARAC_^1SEND10 ADQ- BEGBUF,I_(GET BUFFER FWA + # WORDS TO GET LWA+1_^1_%STQ- ENDBUF,I_(SAVE LWA+1 IN PDT_^1_%SAP SEND20_*SKIP IF EVEN CHARAC #_^1_%ENA 0_/GET FILL CHARACTER_^1_%SCA* (NEWBUF),2_%PAD LAST CHAR AFTER CONTROL W€€ITH FILL CHAR_^1_%SPC 1_^1SEND20 RTJ PRTREQ_'I/O REQUEST - RETURN WHEN I/O COMPLETE_^1*_]_^1*_2CONTINUATOR_>********_^1*_]_$*_^1_%STQ- I_,SAVE PDT_B*_^1_%RTJ PRTSTA_'ANALYZE STATUS_^1*_]_$*_^1_%SFZ- ESTAT1,15,1,I SKIP IF NO ERROR OCCURRED_1*_^1*_]_$*_^1_%JMP* KRETUR_'EXIT - FAULT_>*_^1*_[*********_^1_%JMP* (SENDIT)_$RETURN_^1_%EJT 1_^1*_$FILL - PUT NEXT CHARACTER IN OUTPUT BUFF€€ER_^1*_]_^1*_8PUT NEXT CHAR IN OUTPUT BUFFER_^1FILL_!NUM 0_,ENTRY_^1_%LDA- BEGBUF,I_(GET FWA OF OUTPUT BUFFER_^1_%STA* NEWBUF_*SAVE LOCALLY_^1_%LDA- NEXCAR,I_(GET NEXT CHARACTER_^1_%SCA* (NEWBUF),2_%PUT NEXT CHARACTER IN OUTPUT BUFFER_^1_%SPC 1_^1_%AR2- ONEBIT_'INCREMENT OUTPUT BUFFER COUNTER_^1_%SPC 1_^1*_8CHECK IF OUTPUT BUFFER FULL AND NEEDS CONTROL_^1_%C2E MAXOUT_*SKIP IF O€€UTPUT BUFFER FULL_^1_%JMP* FILL50_*NOT FULL_^1_%SFZ- ESTAT1,5,1,I_#SKIP IF NOT CONTROL CHARACTER_^1_%JMP* FILL50_*CONTROL CHARACTER_^1_%SEF- ESTAT1,5,1,I_#SET CONTROL FLAG TO SEND TO PRINTER_^1FILL50 JMP* (FILL)_'RETURN_^1NEWBUF NUM 0_,FWA OF NEWLY FORMATTED BUFFER_^1_%EJT 1_^1*_$FTNFMT - HANDLES SETTING UP PROPER PAPER MOTION_^1*_.FOR FORMATTED AND FORTRAN REQUESTS._^1_%SPC 2_^€€1FTNFMT NUM 0_^1_%SFN- ESTAT1,1,1,I SKIP IF FORMAT REQUEST_^1_%JMP* FTN050_*NOT FORMATTED - EXIT_^1_%SPC 1_^1_%RTJ* TRAILB_^1_%SPC 1_^1_%LDA- ELU,I_(GET CURRENT LU_^1_%CAE- FTNLU,I_%SKIP IF REQUEST TO FORTRAN LU_^1_%JMP* FTN030_*NON-FORTRAN UNIT - SINGLE SPACE_^1_%RTJ* NXTCHR_*FORTRAN UNIT - GET 1ST CHAR FOR CARRIAGECON_^1_%LDA =N$30_+CHECK ASCII 0_^1_%CAE- NEXCAR,I_(SKIP IF 0€€ (DOUBLE SPACE)_^1_%JMP* FTN010_-NOT 0_^1_%SEF- ESTAT1,7,1,I_'2ND LF (LINE FEED NEEDED FLAG)_^1_%JMP* FTN030_-GO SET 1ST LF._^1_%SPC 1_^1FTN010 INA 1_/CHECK ASCII 1_^1_%CAE- NEXCAR,I_(SKIP IF 1 (FORM FEED)_^1_%JMP* FTN020_-NOT 1_^1_%ENA FF_1YES 1 - GET FF_^1_%JMP* FTN040_^1_%SPC 1_^1FTN020 LDA =N$2B_+CHECK ASCII +_^1_%CAE- NEXCAR,I_(SKIP IF + (NO SPACE)_^1_%JMP* FTN030_-NOT +_€€^1_%JMP* FTN050_-YES - NO SPACING_^1FTN030 ENA LF_1SINGLE SPACE_^1FTN040 STA- NEXCAR,I_$PUT CONTROL WORD IN NEXT CHAR WORD._^1_%SEF- ESTAT1,5,1,I SET CONTROL FLAG_^1FTN050 JMP* (FTNFMT)_$RETURN_^1_%EJT 1_^1*_]_^1*_$TRAILB - TRAILING BLANKS DROP OFF_^1*_]_^1TRAILB NUM 0_^1TRA10 LDA- ELSTWD,I_$GET LAST WORD+1 ADDRESS_^1_%INA -1_+GET LAST WORD ADDRESS_^1_%TRA Q_,PUT LWA IN Q_^1€€_%SPC 1_^1_%SUB- ECCOR,I_%SUBTRACT FWA_^1_%SAZ TRA20_(SKIP IF ONLY ONE WORD LEFT TO SEND_^1_%LDA- (ZERO),Q_$GET LAST WORD_^1_%SPC 1_^1_%CAE =N$2020_%SKIP IF LAST WORD IS BLANKS_^1_%JMP* TRA20_(DONE_^1_%SPC 1_^1_%STQ- ELSTWD,I_$DECREMENT LWA+1 IN PDT_^1_%JMP* TRA10_(LOOK AT NEXT WORD_^1_%SPC 1_^1TRA20 JMP* (TRAILB)_$RETURN_^1_%EJT 1_^1*_$NXTCHR - FETCH NEXT CHARACTER_^1*_]_^€€1_%SPC 1_^1NXTCHR NUM 0_,ENTRY_^1_%ENA $4_+TOGGLE UPPER/LOWER CHAR. BIT_^1_%EOR- ESTAT1,I_(*_^1_%STA- ESTAT1,I_(*_^1_%SPC 1_^1_%AND- ONEBIT+2_$SAVE ONLY THE UPPER/LOWER BIT_^1_%LDQ- ECCOR,I_%GET NEXT CHARACTER FROM USER'S BUFFER_^1_%LDQ- (ZERO),Q_$*_^1_%SPC 1_^1_%SAN NXT010_'UPPER CHARACTER_^1_%RAO- ECCOR,I_%LOWER CHARACTER - BUMP TO NEXT WORD_^1_%LLS 8_,POSITION CHAR_^1NXT0€€10 LLS 8_,POSITION CHAR_^1_%AND- LPMSK+7_%SAVE 7-BIT CHARACTER_^1_%SPC 1_^1_%TRA Q_,PASS THROUGH A $7F_^1_%INQ -$7F_^1_%SQZ NXT030_*SKIP IF $7F_^1_%SPC 1_^1_%INA -$60_)CONVERT ANY LOWER CASE CHARACTERS_^1_%SAP NXT020_'TO UPPER CASE CHARACTERS_^1_%INA $20_^1NXT020 INA $40_^1NXT030 STA- NEXCAR,I_$SAVE NEXT CHARACTER IN PDT_^1_%JMP* (NXTCHR)_^1_%EJT 1_^1*_$PAGE - HANDLES LI€€NE COUNTING AND FORM FEED_^1*_]_^1_%SPC 2_^1PAGE_!NUM 0_,ENTRY_^1_%ENA FF_+CHECK FORM FEED_^1_%CAE- NEXCAR,I_(SKIP IF FORM FEED_^1_%JMP* PAGE5_+NOT FORM FEED_^1_%JMP* PAGE25_*YES - GO CLEAR LINE COUNT_^1_%SPC 1_^1PAGE5 ENA LF_+CHECK LINE FEED_^1_%CAE- NEXCAR,I_(SKIP IF LF_^1_%JMP* PAGE10_*NOT LF_^1_%RAO- LINCT,I_)LF - INCREMENT LINE COUNT_^1_%JMP* PAGE20_^1_%SPC 1_^1PAGE10 E€€NA VTAB_)CHECK VERTICAL TAB_^1_%CAE- NEXCAR,I_(SKIP IF VTAB_^1_%JMP* PAGE30_*NOT VTAB_^1_%LDA- LINCT,I_)GET LINE COUNT_^1_%ADD- VTABLF,I_(ADD VTAB LF INCREMENT_^1_%STA- LINCT,I_)RESTORE LINE COUNT TO PDT_^1_%SPC 1_^1PAGE20 LDA- MAXLIN,I_$GET MAXIMUM LINES PER PAGE_^1_%SUB- LINCT,I_%SUBTRACT LINE COUNT FROM MAX LINES_^1_%SAP PAGE30_*MAXIMUM NOT REACHED_^1_%ENA FF_.GET FORM FEED €šCHARACTER_^1_%STA- NEXCAR,I_(PUT IN NEXT CHAR WORD._^1PAGE25 CLF- LINCT,15,16,I_"MAX REACHED - ZERO LINE COUNT_^1PAGE30 JMP* (PAGE)_'RETURN_^1_%END_]_^__ šPRQ8277 CSY/ D71 P€1_%NAM RQ8277_$DECK-ID D71 PERIPH. DRIVERS 1.2C_%SUMMARY-_^1*_$1843-2 MATRIX PRINTER PSEUDO DRIVER - EXPAND I/O REQUEST_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 2_^1*_]_^1****_]_^1*E_]_^1*_MISC_^1*_>----_^1*_]_^1*_;PARAMETERS_^1*_;---€€-------_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT PRTREQ_^1_%ENT PRTSTA_^1_%ENT CPRT_^1*_9** EXTERNALS **_^1*_]_^1_%EXT TERMLU_'1X8 CLA LU_^1_%EXT PORTS_(START OF PORT TABLES_^1_%EXT EPORTS_'END OF PORT TABLES_^1_%EXT PLENTH_'LENGTH OF EACH TABLE_^1_%EXT LOG1A_(PDT ADDRESS TABLE_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_8PDT EQUATES_^1*_]_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK (CLA€€ TIMER)_^1_%EQU ELU(5)_'LU_^1_%EQU EPTR(6)_%PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU EREQST(8)_#REQUEST STATUS_^1_%EQU ESTAT1(9)_#STATUS WORD 1_^1_%EQU ECCOR(10)_#NEXT LOCATION FOR DATA_^1*_2(THIS VALUE INCREASED BY LENGTH OF DATA SENT_^1*_3AT CLA REQUEST COMPLETION)._^1_%EQU ESTAT2(12)_"LAST EQUIPMENT STATUS_^1_%EQU FLTCOD(16)_"FAULT CODE_^1_%EQU DIA€€GLU(17)_"DIAGNOSTIC LU_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER TIME OUT_^1_%EQU PORT(25)_$PORT NUMBER FOR DEVICE_^1_%EQU BEGBUF(26)_"FIRST DATA LOCATION FOR CURRENT I/O SEGMENT._^1_%EQU ENDBUF(27)_"LWA+1 OF CURRENT I/O SEGMENT._^1_%EQU RDBUF(28)_#READ FWA OF CALLER'S BUFFER_^1_%EQU NEWREQ(29)_"NEW REQUEST CODE, PRIORITIES_^1_%EQU NEWCOM(3€€0)_"NEW COMPLETION ADDRESS_^1_%EQU NEWTHD(31)_"NEW THREAD_^1_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADDRESS OF HEADER/BUFFER_^1_%EQU ELINK(40)_#PDT THREAD_^1_%EQU NCOMP(41)_#PSEUDO COMPLETION FOR NEW REQUEST_^1*_]_^1*_8LOW CORE EQUATES_^1*_]_^1_%EQU NEGONE($13)_!$FFFE_^1_%EQU ZERO($22)_#ZERO_^1_%€€EQU ADISP($EA)_"DISPATCHER_^1*_]_^1*_8FAULT CODE EQUATES_^1*_]_^1_%EQU ALARM(2)_^1_%EQU TIMOUT(0)_^1_%EQU PARITY(3)_^1*_]_^1*_8BUFFER HEADER EQUATES_^1*_]_^1_%EQU PORTNB(0)_#PORT NUMBER_^1_%EQU DSTAT1(1)_#STATUS_^1_%EQU CURPOS(2)_#CURSOR POSITION (NEG=NOT USED) / TERMINATION C_^1_%EQU NCHAR(3)_$NUMBER OF CHARACTERS READ_^1_%EQU DATADD(4)_#ADDRESS OF DATA BUFFER_^1*_]_^1*_8€€PORT TABLE EQUATES_^1*_]_^1_%EQU PORTEQ(11)_"PORT TABLE OFFSET FOR EWES_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1****_]_^1_%EJT 1_^1PRTREQ NUM 0_,ENTRY_^1_%SRI* PDT_*SAVE PDT ADDRESS_^1*_8CHECK IF DIAGNOSTIC LU_^1_%LDA- DIAGLU,I_(GET DIAGNOSTIC LU_^1_%CAE- ELU,I_+SKIP IF DIAGNOSTIC_^1_%JMP* CRT10_+NOT DIAGNOSTIC_^1_%RTJ* CRTWES_'YES DIAG, PUT EQUIP CODE IN PORT TABLES_^1*_8SET COMPLETI€€ON PRIORITY IN NEW REQUEST_^1CRT10 LDA- $EF_-PICK UP CURRENT PRIORITY LEVEL_^1_%SFA- NEWREQ,3,4,I_#STORE IN REQUEST_^1*_8SET LU OF 1X8 CLA IN NEW REQUEST_^1_%LDA =XTERMLU_(PICK UP LOGICAL UNIT OF CLA_^1_%STA- NEWVLU,I_(STORE IN REQUEST_^1*_8COMPUTE LENGTH OF DATA BUFFER FOR NEW REQUEST_^1_%LDA- ENDBUF,I_(PICK UP LWA+1_^1_%SUB- BEGBUF,I_(SUBTRACT FWA_^1_%ALS 1_/TIMES 2 FOR CHARAC€€TERS_^1_%STA- NEWNCH,I_(STORE IN REQUEST_^1*_8SET ADDRESS OF REQUEST BUFFER IN NEW REQUEST_^1_%LDQ- BEGBUF,I_(PICK UP FWA_^1_%INQ -5_/BACKUP 5 WORDS_^1_%STQ- NEWSHD,I_(STORE IN REQUEST_^1*_8SET PORT NUMBER IN NEW REQUEST_^1_%LDA- PORT,I_*PICK UP PORT NUMBER_^1_%STA- (ZERO),Q_(STORE IN REQUEST_^1*_8CLEAR STATUS AND READ TRANSFER COUNT,NEW REQ._^1_%CLR A_^1_%STA- DSTAT1,Q_(CLEAR STA€€TUS_^1_%STA- NCHAR,Q_)CLEAR READ CHARACTER TRANSFER COUNT._^1*_8INDICATE NO CURSOR POSITIONING IN NEW REQUEST_^1_%ENA -1_^1_%STA- CURPOS,Q_(PUT NEG VALUE IN CURSOR FLAG_^1*_8SET DATA BUFFER ADDRESS IN HEADER_^1_%LDA- BEGBUF,I_(GET DATA FWA_^1_%STA- DATADD,Q_(STORE IN REQUEST HEADER_^1_%SPC 1_^1*_8PUT IO REQUEST ADDRESS IN INDIRECT REQUEST_^1_%LDA* PDT_*GET PDT ADDRESS_^1_%INA NE€€WREQ_*ADD OFFSET TO NEW REQUEST_^1_%STA* RQST+2_*SAVE ADDRESS IN INDIRECT REQUEST_^1*_]_^1RQST_!INDIR RQST,1_$INDIRECT IO REQUEST (ADDRESS TO BE INSERTED)_^1*_]_^1_%JMP- (ADISP)_%WAIT FOR COMPLETION_^1_%SPC 2_^1*_]_^1*_]_^1*_8STORAGE_^1*_]_^1DATBUF NUM 0_,BUFFER DATA ADDRESS_^1NWORDS NUM 0_,DATA LENGTH IN WORDS_^1PDT_"NUM 0_,PDT ADDRESS_^1*_]_^1_%EJT 1_^1*_8COMPLETION ADDRESS€€_^1CPRT_!EQU CPRT(*)_%CONTINUATOR ADDRESS_%******_^1REQCOM NUM 0_^1*_8GET PDT ADDRESS OF THIS COMPLETION_^1_%LDA* REQCOM_*GET COMPLETION ADDRESS WITHIN PDT_^1_%INA -NCOMP-1_(BACK UP TO GET PDT START ADDRESS_^1_%STA- I_,RESTORE PDT ADDRESS TO I_^1*_]_^1*_8SEE IF ANY CHARACTERS HAVE BEEN TRANSFERRED_^1_%LDQ- NEWSHD,I_(HEADER ADDRESS TO Q_^1_%LDQ- NCHAR,Q_)PICK UP NUM CHARS_^1*_8DE€€TERMINE NUMBER OF WORDS_^1_%XFQ 1_/CHARACTER COUNT TO R1_^1_%LRS 1_/CONVERT LENGTH TO WORDS_^1_%SFZ- ESTAT1,0,1,I SKIP IF READ COMPLETION_^1_%JMP* REQ010_'GO TO DO WRITE COMPLETION_^1*_8DETERMINE IF ODD POSITION FILLER NEEDED_^1_%SAP REQ010_*SKIP IF EVEN NUM CHARS INPUT_^1_%LDA- BEGBUF,I_(GET DATA BUFFER FWA_^1_%STA* DATBUF_*SAVE BUFFER ADDRESS LOCALLY_^1_%ENA -0_.A=$FFFF_^1_%€€SCA* (DATBUF),1_%STORE $FF IN ODD CHARACTER POSITION_^1_%INQ 1_/ADD 1 TO NUM OF WORDS INPUT_^1REQ010 STQ* NWORDS_*SAVE NUMBER OF WORDS READ_^1_%SPC 2_^1_%SPC 1_^1REQ050 XFI Q_,PUT PDT ADDRESS IN Q_^1_%JMP* (PRTREQ)_$RETURN_^1_%EJT 1_^1*_]_^1*_)C R T S T A_^1*_]_^1*_$THIS ROUTINE USES THE STATUS WORD RETURNED BY THE CLA DRIVER_^1*_$IN THE EXPANDED I/O REQUEST, TO DO THE FOLLOWI€€NG._^1*_)1. STATUS SAVED IN PDT (ESTAT2,SINTER)._^1*_)2. IF ERROR INDICATED_^1*_/SET ERROR BITS IN PDT (ESTAT1,EREQST)._^1*_/DETERMINE FAULT CODE AND PUT IN PDT (FLTCOD)._^1*_)3. RETURN_^1*_]_^1*_]_^1PRTSTA NUM 0_,ENTRY_^1*_8SAVE STATUS IN PDT_^1_%LDQ- NEWSHD,I_(HEADER ADDRESS TO Q_^1_%LR1- DSTAT1,Q_(PICK UP RETURNED STATUS IN R1_^1_%SR1- ESTAT2,I_(SAVE IN PDT(LAST STATUS TAKEN)_€€^1_%SR1- SINTER,I_(SAVE IN PDT(STATUS AFTER INTERRUPT)_^1*_8CHECK IF ERROR FLAG SET_^1_%SFN- NEWVLU,15,3,I_"SKIP IF V-FIELD IN LU WORD IS SET_^1_%JMP* STA30_+NO ERROR - JUMP TO END._^1*_8SET ERROR BITS IN PDT_^1_%SEF- ESTAT1,15,1,I_"BIT 15 IN ESTAT1 - DEVICE ERROR_^1_%SEF- EREQST,14,1,I_"BIT 14 IN EREQST - HARDWARE ERROR_^1*_8DETERMINE FAULT CODE_^1_%ENA ALARM_+ASSUME ALARM - CHAN€€GE LATER IF OTHER._^1_%SFN- DSTAT1,10,1,Q_"SKIP IF TIMEOUT_^1_%JMP* STA10_+NOT TIMEOUT_^1_%SPC 1_^1_%ENA TIMOUT_*GET FAULT CODE FOR TIMEOUT_^1_%SR1- STIMEO,I_(SAVE STATUS IN PDT_^1_%JMP* STA20_+GO TO RETURN_^1STA10 SFN- DSTAT1,8,1,Q_#SKIP IF PARITY_^1_%JMP* STA20_+NOT PARITY_^1_%SPC 1_^1_%ENA PARITY_*GET FAULT CODE FOR PARITY_^1STA20 STA- FLTCOD,I_(STORE CODE IN PDT_^1_%SPC €€1_^1STA30 JMP* (PRTSTA)_$RETURN_^1_%EJT 1_^1*_]_^1*_)C R T W E S - ENTERED ONLY IF DIAGNOSTIC LU._^1*_8SETS EQUIPMENT CODE IN_^1*_81X8 CLA PORT TABLES TO VALUE_^1*_8IN 1X8 CLA PDT. THE VALUE MAY_^1*_8HAVE BEEN CHANGED IN PDT IF_^1*_8DIAGNOSTIC PARAMETER FOR EWES_^1*_8WAS CHANGED._^1_%SPC 1_^1CRTWES NUM 0_,ENTRY_^1_%LDQ =XTERMLU_$GET 1X8 CLA LU_^1_%LDQ LOG1A,Q_%GET PDT ADDRE€€SS OF 1X8 CLA_^1*_8SET CLA TIMER FOR ENTRY EVERY 60 MS._^1_%LDA- EDCLK,Q_%GET CLA TIMER WORD_^1_%EOR- NEGONE_'COMPARE WITHE $FFFE_^1_%SAN WES05_(SKIP IF TIMER ON (NOT $FFFE)_^1_%LDA* GOTIME_'GET MAX TIMER VALUE_^1_%STA- EDCLK,Q_%RESET CLA TIMER WORD_^1_%SPC 1_^1WES05 LFA- EWES,10,4,I_$GET EWES FOR 1X8 CLA FROM PERIPH PDT_^1_%SFA- EWES,10,4,Q_!SAVE EWES IN CLA PDT_^1_%LDQ =XPORT€€S_%GET PORT TABLE ADDRESS_^1WES10 ADQ =XPLENTH_$INCREASE Q BY PORT LENGTH_^1*_$CQE =XEPORTS_$SKIP IF END OF PORT TABLES REACHED_^1_%NUM $0405_^1_%NUM $E000_^1_%ADC EPORTS_^1_%SPC 1_^1_%JMP* WES20_(NOT END OF PORT TABLES_^1_%JMP* (CRTWES)_$RETURN_^1WES20 SFA- PORTEQ,10,4,Q STORE EWES IN NEXT PORT TABLE_^1_%JMP* WES10_(LOOP UNTIL ALL PORT TABLES ENTERED_^1_%SPC 1_^1GOTIME NU€(M 60_+CLA TIME OUT VALUE_^1_%END_]_^__ (PQ8331I CSY/ D72 P€1_%NAM Q18331_$DECK-ID D72 PERIPH. DRIVERS 1.2C_%SUMMARY-_^1*_$SYSTEM INITIALIZER DRIVER FOR DA,CU/33,858 DISK_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORP. 1977_^1*_]_^1_%SPC 2_^1************************************************************************_^1*_8ENTRY PARAMETERS (ANY COMBINATION)_^1*_9(A) = FW€€A OF BUFFER(FWAB)_^1*_=IF A EQUALS -0 THEN WRITE ADDRESS TAGS_^1*_8+(Q) = NO OF WORDS TO READ_^1*_8-(Q) = COMPLEMENT OF WORDS TO WRITE_^1*_9(I) = STARTING SECTOR ADDRESS_^1_%SPC 2_^1*_8EXIT PARAMETERS (NORMAL RETURN)_^1*_9(A) = -0 REQUEST OK_^1*_9(Q) = 0_^1*_9(I) = SAME AS ON ENTRY_^1_%SPC 2_^1*_8ERROR EXIT PARAMETERS_^1*_9(A) = 0_^1*_9(Q) = ERROR CODE_^1*_?14 NOT READY_^1*_?1€€7 SEEK ERROR_^1*_?70 CONNECT ERROR_^1*_?71 UNCORRECTABLE ECC ERROR_^1*_?74 LENGTH GREATER THAN REQUEST_^1*_?75 DATA TRANSFER ERROR_^1*_9(I) = LAST HARDWARE DA STATUS_^1************************************************************************_^1_%SPC 2_^1***_"PURPOSE ---_^1*_$------_^1*_$QSMD IS THE MASS STORAGE DEVICE (SMD) DRIVER FOR THE SYSTEM_^1*_$INITIALIZER. IT PERFORMS €€THESE FUNCTIONS UNDER THE CONTROL_^1*_$OF THE INITIALIZER._^1*_$(1) READ/WRITE DISK DURING SYSTEM BUILDING,_^1*_$(2) WRITE ADDRESS TAGS AND DATA, AND_^1*_$(3) THE DRIVER BROUGHT IN VIA AUTOLOAD TO READ THE MSOS CORE_^1*_)IMAGE._^1*_$THIS DRIVER IS STATUS DRIVEN,THUS IT CAN ONLY INTERFACE WITH A_^1*_$DRIVER VIA THE CU/33 ON THE DUAL CPU (CYBER 18-30) SYSTEM._^1*_]_^1*_$IN AUTOLOAD €€SECTION, IT CLEAR MOS MEMORY PARITY BY STORING ZERO_^1*_$(SELECTIVE SWITCH RESET) OR READ + STORE (SELECTIVE SWITCH SET)._^1*_]_^1_%SPC 2_^1****_!******_^1*_$ENTRY POINTS_^1*_$******_^1*_]_^1_%ENT MMINIT_'ENTRY FOR I2_^1_%ENT QMASS_(ENTRY TO DRIVER_^1_%ENT EMASS_(W,E,S FUNCTION CODE_^1_%ENT SIZMAS_'ROUTINE TO COMPUTE MM DEVICE SIZE_^1_%ENT MAXSEC_^1_%ENT NFILES_M121*4744_^1€€*_]_^1*_]_^1*_$******_^1*_$EXTERNAL_^1*_$******_^1*_]_^1_%EXT* I2RETN_'IN I2_^1*_]_^1_%SPC 2_^1*_]_^1*_$******_^1*_$EQUIVALENCE FOR SYSTEM_^1*_$******_^1*_]_^1*_1EQUIPMENT CODE AND UNIT ASSIGNMENTS_^1_%EQU UNIT(0)_%AUTOLOAD UNIT_^1_%EQU MAXSEC($7FFF)_^1_%EQU NFILES(1024)_G121*4744_^1DEVICE EQU DEVICE(14)_"EQUIPMENT NUMBER_^1*_1DEVICE PHYSICAL LIMITS_^1_%EQU CYLODN(410)_!NO.€€ OF CYLINDERS FOR LOW DENSITY_^1_%EQU CYHIDN(821)_!NO. OF CYLINDERS FOR HIGH DENSITY_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS IN A SECTOR_^1_%EQU SERTCK(64)_"NUMBER OF SECTORS PER TRACK_^1_%EQU TRKCYL(5)_#NUMBER OF TRACKS IN A CYLINDER_^1_%EQU SERPCY(320)_!NUMBER OF SECTORS PER CYLINDER_^1*_1ERROR RETRIAL COUNTS_^1_%EQU IOTRYS(3)_#NUMBER OF IO TRIES BEFORE LOG OF FAILURE_^1_%EQU €€CONTRY(10)_^1_%EQU BACKGD($3238) CHARACTER ('28') FOR BACKGROUND BUFFER_^1*_1ERROR CODES_^1_%EQU NRDERR(14)_"NOT READY ERROR CODE_^1_%EQU SKER(17)_$SEEK ERROR_^1_%EQU CERRCO(70)_"CONNECT ERROR CODE_^1_%EQU ECCER(71)_#UNCORRECTABLE ECC ERROR_^1_%EQU LENERR(74)_"LENGTH ERROR CODE_^1_%EQU DAER(75)_$DATA TRANSFER ERROR_^1*_]_^1****_]_^1*_]_^1****_]_^1*_$ANALYSIS ---_^1*_$------€€_^1*_$THIS DRIVER IS STATUS DRIVEN AND ITS PRIMARY FUNCTION IS TO_^1*_$READ/WRITE DATA FROM/TO THE DISK DURING SYSTEM BUILDING. THE_^1*_$OTHER FUNCTIONS ARE: (1) WRITE ADDRESS TAGS, AND (2) SET UP_^1*_$THE AUTOLOAD DRIVER TO READ IN THE MSOS CORE IMAGE. DUE TO ITS_^1*_$STATUS DRIVEN STRUCTURE AND THE USAGE BY THE 'SI', IT BECOMES_^1*_$THE ONLY INTERFACE WITH THE CU/33 EVEN THE SY€€STEM IS CONFIGU-_^1*_$RATED WITH DUAL CPU (CYBER 18-30). FURTHERMOVE, THE ADDRESSING_^1*_$FEATURE USED BY THE 'SI' IS ONE WORD, THUS THE ACCESSIBILITY OF_^1*_$THE DRIVER IS TO THE LOWER 32767 SECTORS FOR THE SYSTEM BUILD_^1*_$EVEN THE DRIVER IS CAPABLE TO ADDRESS THE WHOLE DISK. THE CORE_^1*_$ADDRESS IS LIMITED TO THE FIRST 65K ALSO._^1*_]_^1*_$THE WRITE ADDRESS TAGS FUNCTION, IF€€ USED, SETS UP THE LOGICAL_^1*_$SECTORS WITHIN A TRACK IN SEQUENTIAL FASHON (RANGE 0-63). IT_^1*_$ALSO ASSUMED THE FOLLOWING DATA:_^1*_$(1) 96 WORDS/SECTOR,_^1*_$(2) 64 SECTORS/TRACK, AND_^1*_$(3) 5 TRACKS/CYLINDER._^1*_$THE NUMBER OF CYLINDERS FOR THE DISK PACK IS SET UP BY EXAMINING_^1*_$THE DENSITY TYPE. THEY ARE: (1) 410, (2) 821 CYLINDERS FOR LOW_^1*_$AND HIGH DENSITY RESP€€ECTIVELY._^1*_]_^1*_$THE AUTOLOAD UNIT (OR MSOS SYSTEM UNIT) IS ASSIGNED TO UNIT ZERO._^1*_$THE EQUIPMENT CODE IS 14, AND THE STATION CODE IS ZERO._^1*_]_^1*_$THE ENTRY AND EXIT CONDITIONS FOR THIS ROUTINE ARE LISTED AS_^1*_$FOLLOWING:_^1*_]_^1*_8ENTRY PARAMETERS (ANY COMBINATION)_^1*_9(A) = FWA OF BUFFER(FWAB)_^1*_=IF A EQUALS -0 THEN WRITE ADDRESS TAGS_^1*_8+(Q) = NO OF WORDS TO €€READ_^1*_8-(Q) = COMPLEMENT OF WORDS TO WRITE_^1*_9(I) = STARTING SECTOR ADDRESS_^1*_?(WILL BE BIASED BY 4)_^1*_]_^1*_]_^1*_8EXIT PARAMETERS (NORMAL RETURN)_^1*_9(A) = -0 REQUEST OK_^1*_9(Q) = 0_^1*_9(I) = SAME AS ON ENTRY_^1*_]_^1*_]_^1*_8ERROR EXIT PARAMETERS_^1*_9(A) = 0_^1*_9(Q) = ERROR CODE_^1*_?14 NOT READY_^1*_?17 SEEK ERROR_^1*_?70 CONNECT ERROR_^1*_?71 UNCORRECTABLE €€ECC ERROR_^1*_?74 LENGTH GREATER THAN REQUESTED_^1*_?75 DATA TRANSFER ERROR_^1*_9(I) = LAST HARDWARE DA STATUS_^1*_]_^1*_$THE OPERATIONAL SEQUENCES FOR THE DRIVER ADDRESS TAGS AND AUTO-_^1*_$LOAD FUNCTIONS ARE DESCRIBED IN THE FOLLOWING:_^1*_]_^1*_$(1) DRIVER FUNCTION ---_^1*_$THE 'SI' CALLS THIS DRIVER TO READ/WRITE MASS MEMORY DURING_^1*_$SYSTEM BUILDING PHASE. SINCE THE SECTO€€R AND DATA BUFFER (CORE)_^1*_$ADDRESSES ARE PASSED TO THIS ROUTINE VIA THE I AND A REGISTERS,_^1*_$THEREFORE THE DISK AND CORE ADDRESSING MODES ARE RESTRICTED TO_^1*_$THE LOWEST 65K. OPERATION STEPS ARE:_^1*_]_^1*_$(A) SET UP READ (+) OR WRITE (-) FLAG AND CONVERT MASS MEMORY_^1*_)ADDRESS TO CYLINDER, TRACK AND SECTOR OUTPUT FORMAT._^1*_$(B) CONNECT CU AND DRIVE,_^1*_$(C) SEEK OPE€€RATION (LOAD CYLINDER ADDRESS OPERATION)_^1*_$(D) DATA TRANSFER OPERATION (OUTPUT LENGTH, FWA OF BUFFER, TRACK/_^1*_)SECTOR, AND READ/WRITE CODE),_^1*_$(E) UPDATE CYLINDER, TRACK, SECTOR, AND BUFFER ADDRESSES AS WELL_^1*_)AS LENGTH IF END OF CYLINDER IS ENCOUNTERED PRIOR TO END OF_^1*_)TRANSFER. OTHERWIES CALLER REGAINS CONTROL WITH REGISTERS_^1*_)SET._^1*_]_^1*_$STEPS B-E ARE IN €€A SUBROUTINE FORM AND CALLED BY OTHER FUNCTIONS,_^1*_$SUCH AS WRITE ADDRESS TAGS._^1*_]_^1*_$ERROR CONDITIONS ARE EXAMINED DURING I/O OPERATION SEQUECES:_^1*_$(A) CONNECTION OF CU AND DRIVE ARE TRIED FOR A MAXIMUM OF 10_^1*_)TIMES (DEFINED BY THE TERM 'CONTRY')._^1*_$(B) ALARM ON SEEK OPERATION IS RETRIED FOR A MAXIMUM OF 3 TIMES._^1*_]_^1*_$ECC RECOVERY TECHNIQUES ARE USED WHEN EC€€C ERROR (READ OPERATION)_^1*_$IS DETECTED._^1*_]_^1*_]_^1*_$FOR AUTOLOAD SET UP REQUEST, SECTOR IS ZERO, IT PICKS UP THE_^1*_$VALUE OF 'MSIZV4' FROM 'IDRIV' (STORED BY 'CONTRL' WHEN 'MSIZV4'_^1*_$IS ENCOUNTERED) AND SAVE IT FOR CLEARING MOS MEMORY PARITY._^1*_]_^1*_]_^1*_$(2) WRITE ADDRESS TAGS FUNCTION ---_^1*_$THE 5-WORD BUFFER DATA ASSIGNMENTS FOR ADDRESS TAGS ARE SHOWN_^1*_$BEL€€OW:_^1*_)WORD 1 FLAG BYTE (SET TO 0)_^1*_)WORD 2 FLAG BYTE (SET TO 0)_^1*_.3 CYLINDER ADDRESS BITS 0-9._^1*_.4 TRACK ADDRESS BITS 8-10, BIT 7 SET FOR LAST SECTOR_^1*_0SECTOR ADDRESS BITS 0-6._^1*_.5 NUMBER OF BYTES PER SECTOR MINUS ONE (BITS 15-8)_^1*_]_^1*_$THE SIZE OF THIS BUFFER IS 320 WORDS (OR 5*64 SECTORS)._^1*_$THE ADDRESS TAGS DATA IS SET UP ACCORDING TO THE ABOVE 5 WORDS'_€€^1*_$DEFINITION FOR ONE TRACK. THEN THE I/O ROUTINE (STEPS B-E OF_^1*_$DRIVER FUNCTION) IS CALLED TO WRITE THE ADDRESS TAGS DATA._^1*_$ADDRESSES, NAMELY TRACK AND CYLINDER, IF APPLIED ARE ADJUSTED._^1*_$I/O ROUTINE IS CALLED TO WRITE THE DATA. THE ABOVE PROCESS IS_^1*_$REPEATED UNTIL ALL CYLINDERS BEED WRITTEN. THEN THE DISK PACK_^1*_$IS FILLED WITH THESE 2 CHARACTERS '28'. THE€€ SIZE OF THE BUFFER,_^1*_$WHICH '28' IS SET UP IS 384 WORDS (OR 4X96, 4-SECTOR BUFFER)._^1*_]_^1*_$(3) AUTOLOAD DRIVER FUNCTION ---_^1*_$IT SET UP TO MOVE THE DRIVER PORTION OF THIS PROGRAM TO LOCATION_^1*_$'STMSV4' OF THE 'SPACE' ROUTINE OF MSOS._^1*_]_^1****_]_^1_%EJT_]_^1_%SPC 2_^1*_]_^1*_,-----_#P R O G R A M_#S T A R T_#-----_^1*_]_^1_%SPC 2_^1*------------------------------€€--------------------------------------_^1*_]_^1*_1SET UP AUTOLOAD STUFF_^1*_]_^1*--------------------------------------------------------------------_^1_%SPC 3_^1MMINIT LDQ =XDSKEND-START1+2_"AUTOLOAD PROGRAM LENGTH_^1_%LDA =XPART01-START1_$DISTANCE TO AUTOLOAD TABLE_^1_%RTJ I2RETN_'RETURN TO I2 WITH ADDRESS OF AUTOLOAD PROGRAM_^1_%SPC 2_^1*************************************€€***********************************_^1*_$AUTOLOAD PROGRAM FOR SMD_^1************************************************************************_^1START1 IIN 0_^1_%APM_/SET TO ABSOLUTE PAGE MODE_^1_%SPC 1_^1*_$CLEAR CORE (LOWER 65K) TO ZERO, OR RESET PARITY_^1*_$BY DOING A LOAD AND STORE._^1*_$CORE SIZE IS PASSED BY IDRIV VIA CONTRL AT SYSTEM_^1*_$INITIALIZATION WHEN THE AUTOLOAD€€ AREA IS WRITTEN_^1*_]_^1*_$IF THE SELECTIVE SKIP SWITCH IS._^1*_$SET_%- LOAD AND STORE MEMORY BEFORE SYSTEM READ_^1*_$NOT SET_!- ZERO MEMORY BEFORE SYSTEM IS READ IN_^1*_]_^1*_]_^1_%LDA* MSIZV4_'GET VALUE OF 'MSIZV4'_^1_%SUB =XDSKEND-START1_^1_%TRA Q_,END OF PGM TO END OF MEMORY_^1_%ENA 0_^1_%TRA M_,CLEAR IN CASE COME FROM DTLP 'A' OPT_^1CLR_"SWN STORE_(STORE ZERO IF SEL SKIP€€ NOT SET_^1_$LDA DSKEND,Q_K122*4808_^1STORE STA DSKEND,Q_K122*4808_^1_%SQZ GO_+SENSE DONE_;122*4808_^1_%INQ -1_+DECREMENT INDEX BY 1_^1_%JMP* CLR_*TO REPEAT FOR NEXT CELL_^1GO_#SPE 0_,CLEAR PARITY ERROR INDICATOR_)122-4808_^1_%LDQ =XDSKEND-LOOP+1 LENGTH TO BE MOVED_0122-4808_^1LOOP01 LDA* LOOP,Q_^1_%STA* (STMSV4),Q_^1_%SQZ CONT1_^1_%INQ -1_^1_%JMP* LOOP01_^1CONT1 JMP* (S€€TMSV4)_$GO TO LOOP AFTER IT HAS BEEN MOVED_^1_%SPC 2_^1*_$FWA OF CODE MOVED TO LOCATION STMSV4 IN SPACE PROGRAM_^1LOOP_!ENA 16_+SET A TO FIRST SECTOR OF CORE IMAGE_^1_%STA- I_,AS SECTOR TO BE READ_^1_%CLR A_,BEGINNING FWA_^1_%LDQ* STMSV4_'MODIFIED LENGTH OF PART 0_^1_%RTJ* QMASS_(READ IN PART 0 UP TO THE END OF SPACE_^1_%SAN GOON_)SKIP IF NO DISK ERROR_^1_%JMP* LOOP_)KEEP TRYIN€€G IF ERROR_^1GOON_!LDA* PART01_'PART 1 CORE IMAGE SECTOR ADDRESS_^1_%SAZ ONGO_)SKIP IF NO PART 1 TO LOAD_^1_%STA- I_^1_%LDA* PART1A_'MODIFIED CORE ADDRESS OF PART 1_^1_%LDQ* LPART1_'MODIFIED LENGTH OF PART 1_^1_%RTJ* QMASS_(READ IN PART 1_^1_%SAN ONGO_)SKIP IF NO DISK ERROR_^1_%JMP* GOON_)KEEP TRYING IF ERROR_^1ONGO_!EIN 0_,ENABLE INTERRUPT SYSTEM_^1_%JMP* LOOP-2_'AND GO TO REST€€RT IN SPACE PROGRAM_^1_%SPC 2_^1PART01 NUM 0_,PART 1 CORE IMAGE SECTOR ADDRESS_^1LPART1 NUM 0_,MODIFIED LENGTH OF PART 1_^1PART1A NUM 0_,MODIFIED CORE ADDRESS OF PART 1_^1STMSV4 NUM 0_,ADDRESS IN SPACE WHERE AUTOLOAD IS MOVED TO_^1MSIZV4 NUM 0_,CORE SIZE (TO BE FILLED)_^1************************************************************************_^1_%EJT_]_^1*--------------------€€----------------------------------------------_^1*_]_^1*_1STORAGE MODULE DEVICE DRIVER FOR 'SI'_^1*_]_^1*------------------------------------------------------------------_^1_%SPC 3_^1*_$ENTRY FOR THE BASIC DRIVER_^1QMASS NUM 0_^1_%STA* BFWA_)SAVE BUFFER FWA_^1_%EOR =N$FFFF_%CHECK FOR WRITE ADDRESS TAGS FUNCTION_^1_%SAN INCK_)SKIP IF NOT_^1_%JMP TAGS_)GO WRITE ADDRESS TAGS_^1€€INCK_!STQ* RDWTFG_'SAVE +(READ)/-(WRITE) FLAG_^1_%SQP INCKB_(SKIP IF READ (Q) WORDS_^1_%TCQ Q_,COMPLEMENT FOR WRITE WORD COUNT_^1INCKB STQ* NWORDS_'SAVE TRANSFER LENGTH_^1_%LDA- I_,FETCH_^1_%STA* SECADD_)AND SAVE SECTOR ADDRESS_^1_%SPC 1_^1*_1CHECK IF AUTO-LOAD SET-UP REQUEST_^1*_1FOR AUTO-LOAD REQUEST, PICK UP 'MSIZV4' FROM 'IDRIV'_^1*_]_^1_%INA -1_^1_%SAN NOTAUT_'SKIP IF NO€€T AUTOLOAD WRITE (SECTOR NOT 1)_^1_%LDQ* QMASS_^1_%LDA- 2,Q_*PICK 'MSIZV4' --- SIZE OF CORE 'LOWER 65K)_^1_%STA* MSIZV4_^1NOTAUT LDA* SECADD_'RECALL SECTOR ADDRESS_^1_%CLR Q_^1*_$CONVERT MSB/LSB TO SMD CYLINDER/TRACK/SECTOR_^1CONVRT ALS 1_^1_%LRS 1_^1_%DVI =XSERPCY_$DIVIDE BY SECTORS PER CYLINDER_^1_%STA* CYLIND_'SAVE CYLINDER_^1_%ENA 0_^1_%LRS 6_,MOVE SECTORS LESS THAN 64 TO€€ A_^1_%ALS 14_+MOVE OVER FOR FORMAT (SECTOR IN LOW BYTE)_^1_%LRS 8_,TRACK TO HIGH BYTE_^1_%STA* TRASEC_'SAVE FORMATTED TRACK/SECTOR_^1_%ENA 0_^1_%STA* IOFUN_(SET IO FUNCTION TO DATA_^1_%STA OFFIND_'INITIALIZE OFFSET JUMP INDEX_^1_%RTJ* SMDIO_^1_%JMP* (QMASS)_%RETURN TO CALLER_^1_%SPC 2_^1BFWA_!NUM 0_,STARTING ADDRESS OF BUFFER_^1NWORDS NUM 0_,WORDS TO TRANSFER_^1RDWTFG NUM €€0_,+READ/-WRITE FLAG_^1SECADD NUM 0_,INITIAL SECTOR ADDRESS_^1CYLIND NUM 0_,CYLINDER ADDRESS_^1TRASEC NUM 0_,TRACK/SECTOR_^1IOFUN NUM 0_,IO CODE FOR DATA OR ADDRESS_^1NUM7F NUM $7FFF_(MASK WORD_^1_%EJT_]_^1*-------------------------------------------------------------------_^1*_]_^1*_1I/O OPERATION INTERFACE ROUTINE_^1*_]_^1*--------------------------------------------------€€-----------------_^1_%SPC 3_^1ECNTR NUM 0_,ERROR CODE COUNTER_^1*_$I/O DRIVER_^1SMDIO ADC 0_^1SEEKA RTJ* CON_*GO CONNECT_^1_%SPC 3_^1*_]_^1*_,-----_#SEEK OPERATION_#-----_^1*_]_^1_%SPC 2_^1SEEK_!ENA 0_^1_%STA* IOERR_(INITIALIZE ERROR COUNTER_^1_%ENA SKER_)INITIALIZE ERROR COUNTER FOR SEEK ERROR_^1_%STA* ECNTR_^1SEKA_!LDQ* EMASS_^1_%INQ 5_,SET Q FOR SEEK FUNCTION_^1_%LDA€€* CYLIND_'FETCH CYLINDER ADDRESS_^1_%OUT REJT-*_'SEEK TO CYLINDER_^1SEKC_!RTJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP SEKD_)SKIP IF NOT BUSY_^1_%JMP* SEKC_)WAIT FOR BUSY TO DROP_^1SEKD_!ALS 12_+ALARM TO SIGN BIT_^1_%SAP SEKF_)SKIP IF NO ALARM_^1_%JMP DATALM_'GO PROCESS SEEK ALARM_^1SEKF_!INQ 1_,SET Q FOR DRIVE STATUS 2 READ_^1_%INP REJT-*_'READ DS 2 STATUS_^1_%ALS 11_€€+READY TO SIGN BIT_^1_%SAM SEKI_)SKIP IF READY_^1_%JMP CONN_)GO LOG NOT READY_^1SEKI_!ALS 4_,FAULT TO SIGN BIT_^1_%SAP SEKL_)SKIP IF NO FAULT_^1_%JMP* DATAM_^1SEKL_!ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM DATAI_(TO CLEAR SEEK INITIATED BIT_^1_%JMP* SEKC_^1_%SPC 3_^1*_]_^1*_,---_#CLEAR SEEK INITIATED BIT TO AVOID EXTRA SEEK_^1*_4INTERRUPT WHEN FIRST SEEK REQUEST BY MSOS_^1*_]€€_^1DATAI LDQ* EMASS_(SET UP TO CLEAR SEEK INITIATED BIT_^1_%INQ 1_^1_%LDA DRIVE_^1_%INA $40_^1_%OUT REJT-*_^1_%SPC 3_^1*_]_^1*_,-----_#DATA TRANSFER PORTION_#-----_^1*_]_^1_%SPC 2_^1*_$NOW SET UP FOR DATA TRANSFER_^1DATA_!ENA DAER_)SET ERROR COUNTER TO DATA ERROR_^1_%STA* ECNTR_^1_%LDQ* EMASS_^1_%LDA* NWORDS_^1_%OUT REJT-*_'SET UP TRANSFER BUFFER LENGTH_^1_%INQ $D_^1_%L€€DA* BFWA_^1_%OUT REJT-*_'SET BUFFER FIRST WORD ADDRESS_^1_%INQ -6_^1_%LDA* TRASEC_^1_%OUT REJT-*_'SELECT TRACK/SECTOR_^1DATAB INQ 2_,SET Q FOR READ_^1_%LDA* RDWTFG_'FETCH READ/WRITE FLAG_^1_%SAP DATAC_(SKIP IF READ_^1_%INQ 1_,SET Q FOR WRITE_^1DATAC LDA* IOFUN_(FETCH IO FUNCTION TYPE, DATA OR ADDRESS_^1_%OUT REJT-*_'START DATA TRANSFER_^1_%SPC 2_^1*_]_^1*_(---_$LOOP TO €€WAIT FOR DATA TRANSFER BUSY DROP_^1*_]_^1_%SPC 2_^1DATAF RTJ* DASTAT_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP DATAH_(SKIP IF NOT BUSY_^1_%JMP* DATAF_^1DATAH LDA DASTS_(FETCH DA STATUS_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAM DATAM_(SKIP IF ALARM_^1_%ALS 1_,TRANSFER COMPLETE STATUS TO SIGN BIT_^1_%SAP DATAL_(SKIP IF NOT COMPLETE_^1_%SPC 2_^1*_$DATA TRANSFER COMPLETE_^1DATAH€€1 LDA* SECADD_^1_%STA- I_,RESTORE I TO ENTRY CONDITION_^1_%RTJ CLRTDA_'CLEAR DA STATUS BEFORE LEAVING_^1_%CLR Q_^1_%SET A_^1_%JMP* (SMDIO)_^1_%SPC 2_^1DATAL ALS 13_+END OF CYLINDER STATUS TO SIGN BIT_^1_%SAM DATAN_(SKIP IF EOC_^1DATAM JMP DATALM_'GO PROCESS DATA ALARM_^1_%SPC 3_^1*_]_^1*_(---_$END OF CYLINDER CONDITION_^1*_]_^1_%SPC 2_^1*_$HAVE AN END OF CYLINDER WITH€€ NO EOT_^1DATAN LDA* TRASEC_'FETCH STARTING TRACK SECTOR_^1_%ARS 8_,SAVE TRACK ONLY_^1_%TCA Q_^1_%INQ TRKCYL-1_$4 MINUS TRACK TO Q_^1_%QLS 6_,MULTIPLY BY 64 TO GET SECTORS_^1_%LDA* TRASEC_^1_%AND =N$FF_(SAVE SECTORS_^1_%TCA A_^1_%INA 64_+64 - SECTOR TO A_^1_%AAQ A_,NO SECTORS TRANSFERED TO A_^1_%MUI =XWRDSEC_$CONVERT SECTORS TO WORDS TRANSFERED_^1_%STA* TEMPNW_'SAVE NO OF€€ WORDS_^1_%LDA* NWORDS_'FETCH INITIAL NUMBER OF WORDS_^1_%SUB* TEMPNW_'MINUS NUMBER TRANSFERED SO FAR_^1_%SAP DATAR_(SHOULD STILL BE POSITIVE_^1*_$NUMBER OF WORDS TRANSFERED GREATER THAN REQUESTED_^1_%ENQ LENERR_^1_%JMP* EREXIT_^1TEMPNW NUM 0_^1_%SPC 3_^1DATAR STA* NWORDS_'SAVE NEW NO OF WORDS TO TRANSFER_^1_%LDQ* BFWA_^1_%ADQ* TEMPNW_^1_%STQ* BFWA_)SAVE NEW BUFFER FIRST WORD €€ADDRESS_^1_%RAO* CYLIND_^1_%ENA 0_^1_%STA* TRASEC_^1_%STA* IOERR_(CLEAR THE ERROR COUNTER_^1_%RTJ CLRTDA_'CLEAR THE DA_^1_%JMP* SEEKA_^1_%SPC 2_^1REJT_!JMP* INTREJ_^1_%ENQ 6_,EXTERNAL REJECT_^1_%JMP* EXTREJ_^1INTREJ ENQ 5_,INTERNAL REJECT_^1EXTREJ JMP* EREXIT_^1_%SPC 2_^1DASTAT NUM 0_^1_%LDQ* EMASS_^1_%INQ 8_^1_%INP REJT-*_'READ DA STATUS_^1_%STA* DASTS_^1_%JMP* (DASTAT)_^€€1_%SPC 2_^1EMASS ADC DEVICE*128_^1IOERR NUM 0_,IO ERROR COUNTER_^1_%EJT_]_^1*-------------------------------------------------------------------_^1*_]_^1*_1ROUTINE TO CONNECT CU AND DRIVE_^1*_1(DRIVE 0 IS ASSIGNED TO AUTOLOAD)_^1*_]_^1*-------------------------------------------------------------------_^1_%SPC 3_^1CON_"ADC 0_,ENTRY_^1_%ENA 0_^1_%STA* CONERR_'INITIALIZE CONN€€ECT ERROR COUNT_^1CONB_!RTJ* CLRTDA_'GO CLEAR THE DA_^1_%INQ -5_+SET FOR CONNECT FUNCTION_^1_%LDA* DRIVE_^1_%OUT REJTA-*_%CONNECT TO CU_^1COND_!RTJ* DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAP CONF_)SKIP IF NO ALARM_^1_%RTJ* ERR_*CHECK ERROR COUNT_^1_%JMP* CONB_^1CONF_!ALS 2_,CONNECT TO SIGN BIT_^1_%SAM CONG_)SKIP IF CONNECTED_^1_%JMP* COND_)WAIT FOR SELECT OR ALARM_^1_%SPC €€ 2_^1*_$NOW CONNECT TO DRIVE_^1CONG_!LDQ* EMASS_^1_%INQ 3_^1_%LDA* DRIVE_^1_%OUT REJTA-*_%CONNECT TO DRIVE_^1_%RTJ* DASTAT_^1_%ALS 11_^1_%SAP CONL_)SKIP IF NO ALARM_^1_%RTJ* ERR_^1CONJ_!RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1_%JMP* CONB_^1CONL_!LDQ* EMASS_^1_%INQ 3_^1_%INP REJTA-*_%READ SELECT ACKNOWLEDGE STATUS_^1_%LDQ =XCYLODN_$0 - 410 CYLINDERS ON LOW DENSITY DRIVE_^1_%ALS€€ 8_,DRIVE DENSITY TO SIGN BIT_^1_%SAP CONM_)SKIP IF LOW DENSITY DRIVE_^1_%LDQ =XCYHIDN_$0 - 821 CYLINDERS ON HIGH DENSITY DRIVE_^1CONM_!STQ NCYL_)SAVE MAX DRIVE CYLINDER_^1_%ARS 8_^1_%AND =N$F_)SAVE DRIVE SELECTED_^1_%EOR* DRIVE_^1_%SAN CONP_)SKIP IF NOT SAME AS SELECTED_^1_%LDQ* EMASS_^1_%INQ 9_^1_%INP REJTA-*_%READ DRIVE 2 STATUS_^1_%ALS 11_^1_%SAM CONQ_)SKIP IF READY_€€^1CONN_!ENQ NRDERR_'SET NOT READY ERROR CODE_^1_%JMP* EREXIT_^1CONP_!RTJ* ERR_^1_%JMP* CONB_^1CONQ_!ALS 4_^1_%SAM CONT_)SKIP IF FAULT BIT SET_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM CONS_)SKIP IF ON CYLINDER_^1_%JMP* CONG_)WAIT FOR ON CYLINDER OR ERROR_^1CONS_!RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1_%JMP* (CON)_^1_%SPC 2_^1CONT_!LDQ* EMASS_^1_%INQ $C_^1_%INP REJTA-*_%REA€€D DRIVE FAULT STATUS_^1_%STA* DFSTS_^1_%ALS 8_^1_%SAP CONV_)SKIP IF NOT HEAD SELECT ERROR_^1_%INQ -5_^1_%ENA 0_^1_%OUT REJTA-*_%SELECT HEAD 0 TO CLEAR ERROR_^1CONV_!LDA* DFSTS_^1_%ALS 14_^1_%SAM CONW_)SKIP IF SEEK ERROR_^1_%JMP* CONJ_^1CONW_!RTJ* STSRTZ_'CLEAR STATUS WORDS WITH A RTZ SEEK_^1_%JMP* CONG_)GO WAIT FOR ON CYLINDER_^1_%SPC 2_^1*_$ROUTINE TO CLEAR STATUS AND DO R€€ETURN ZERO SEEK(RTZ)_^1STSRTZ ADC 0_^1_%LDQ* EMASS_^1_%INQ $C_^1_%LDA =N$F3_^1_%OUT REJTA-*_%CLEAR STATUS WORDS WITH RTZ SEEK_^1STS01 RTJ* DASTAT_'FETCH DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP STS02_(SKIP IF NOT BUSY_^1_%JMP* STS01_(WAIT FOR BUSY TO DROP_^1STS02 JMP* (STSRTZ)_^1_%EJT_]_^1*_]_^1*_(---_$CONNECT ERROR CHECK ROUTINE_^1*_]_^1_%SPC 2_^1ERR_"ADC 0_^1_%€€LDA* CONERR_^1_%INA -CONTRY_^1_%SAP ERR1_)SKIP IF ENOUGH ERROR TRIES_^1_%RAO* CONERR_^1_%JMP* (ERR)_^1ERR1_!ENQ CERRCO_'SET CONNECT ERROR CODE_^1EREXIT LDA* DASTS_(FETCH DA STATUS_^1_%STA- I_^1_%ENA 0_,ZERO FOR ERROR_^1_%JMP (SMDIO)_%RETURN WITH ERROR CODE IN Q_^1_%SPC 2_^1CONERR NUM 0_^1CUSTS NUM 0_,LAST CU STATUS_^1DS1STS NUM 0_,LAST DRIVE 1 STATUS_^1DFSTS NUM 0_,LAST€€ DRIVE FAULT STATUS_^1DASTS NUM 0_,LAST DA STATUS_^1DRIVE ADC UNIT_)LOGICAL DRIVE NUMBER_^1_%SPC 2_^1*_$ROUTINE TO CLEAR ALL STATUS WORDS_^1CLRSTS ADC 0_^1_%LDQ* EMASS_^1_%INQ $C_^1_%ENA $73_^1_%OUT REJTA-*_%CLEAR ALL STATUS WORDS_^1_%JMP* (CLRSTS)_^1_%SPC 2_^1*_$ROUTINE TO CLEAR DA INTERRUPT STATUS_^1CLRDAS ADC 0_^1_%LDQ* EMASS_^1_%INQ 8_^1_%ENA 2_^1_%OUT REJTA-*_^1_€€%JMP* (CLRDAS)_^1_%SPC 2_^1*_$ROUTINE TO CLEAR THE DA_^1CLRTDA ADC 0_^1_%LDQ* EMASS_^1_%INQ 8_^1_%ENA 3_^1_%OUT REJTA-*_^1_%JMP* (CLRTDA)_^1_%EJT_]_^1STATUS ADC 0_^1_%LDQ* EMASS_^1_%INQ $D_^1_%INP REJTA-*_%READ CU STATUS_^1_%STA* CUSTS_^1_%INQ -1_^1_%INP REJTA-*_%READ DRIVE FAULT STATUS_^1_%STA* DFSTS_^1_%INQ 2_^1_%INP REJTA-*_%READ DRIVE STATUS 1_^1_%STA* DS1STS_^1_%JM€€P* (STATUS)_^1_%SPC 2_^1REJTA JMP* REJTA1_^1REJTA2 ENQ 6_,EXTERNAL REJECT_^1_%JMP* EREXIT_^1REJTA1 ENQ 5_,INTERNAL REJECT_^1_%JMP* EREXIT_^1_%SPC 2_^1*_$ROUTINE TO CLEAR DA IF REQUIRED_^1*_$WILL RETURN AT P + 1 IF NO DA CLEAR DONE_^1*_$AT P + 2 IF CLEAR DA DONE_^1CLRDA NUM 0_^1_%LDA* DASTS_(FETCH DA STATUS_^1_%AND =N$0600_%CHECK THOSE ERRORS REQUIRING DA CLEAR_^1_%SAZ CLRI€€NT_'SKIP IF NO DA CLEAR NEEDED_^1_%RTJ* CLRTDA_'CLEAR THE DA AND STATUS_^1_%RTJ CON_*NEED TO RECONNECT AFTER CLEAR DA_^1_%RAO* CLRDA_(SET RETURN FOR P + 2_^1CLRINT JMP* (CLRDA)_^1_%EJT_]_^1*---------------------------------------------------------------_^1*_]_^1*_1THIS SEGMENT IS USED TO PROCESS SEEK OPERATION_^1*_1ALARM ERROR_^1*_]_^1*---------------------------------------------€€------------------_^1_%SPC 3_^1*_$ROUTINE TO PROCESS ALARM ERRORS_^1DATALM RTJ* STATUS_'FETCH STATUS WORDS_^1*_$MUST CLEAR ANY CU ERROR BEFORE DOING ANY FUNCTION COMMANDS_^1_%LDA* DASTS_(FETCH DA STATUS_^1_%ALS 1_,CU ERROR TO SIGN BIT_^1_%SAP ALMN0_(SKIP IF NO CU ERROR_^1_%RTJ* CLRDAS_'CLEAR DA STATUS_^1_%RTJ* CLRSTS_'CLEAR ALL STATUS WORDS_^1ALMN0 LDA* DFSTS_(FETCH DRIVE FAULT€€ STATUS_^1_%ALS 8_,HEAD SELECT ERROR TO SIGN BIT_^1_%SAP ALMN1_(SKIP IF NO HEAD ERROR_^1_%LDQ EMASS_^1_%INQ 5_^1_%ENA 0_^1_%OUT REJTA-*_%SELECT HEAD 0 TO CLEAR ERROR_^1ALMN1 LDA* DFSTS_^1_%ALS 14_+SEEK ERROR TO SIGN BIT_^1_%SAM ALMN3_(SKIP IF SEEK ERROR_^1_%RTJ* CLRDA_(CLEAR DA IF NECESSARY_^1_%JMP* CKRCV_(P + 1 RETURN NO DA CLEAR. CHECK FOR RECOVERY_^1_%RTJ* CLRSTS_'P + €€2 RETURN. DA CLEAR. CLEAR ALL STATUS WORDS_^1_%JMP* ALMN15_'GO TRY AGAIN_^1ALMN3 RTJ* CLRDA_^1_%NOP 0_,IGNORE P + 1 RETURN_^1_%RTJ* STSRTZ_'CLEAR STATUS AND DO RTZ SEEK_^1*_$MUST WAIT FOR NO ERROR AND ON CYLINDER_^1ALMN5 RTJ DASTAT_^1_%ALS 11_+ALARM TO SIGN BIT_^1_%SAM ALMN14_'SKIP IF ALARM_^1_%INQ 1_^1_%INP REJTA-*_%READ DRIVE STATUS 2_^1_%ALS 11_+UNIT READY TO SIGN BIT_^€€1_%SAM ALMN11_'SKIP IF READY_^1_%JMP CONN_)GIVE NOT READY ERROR_^1ALMN11 ALS 15_+ON CYLINDER TO SIGN BIT_^1_%SAM ALMN13_'SKIP IF ON CYLINDER_^1_%JMP* ALMN5_^1ALMN13 ALS 5_,FAULT ERROR TO SIGN BIT_^1_%SAP ALMN15_'SKIP IF NO FAULT_^1ALMN14 RTJ* ERRCK_(GO CHECK ERROR TRIES_^1_%JMP* ALMN3_^1ALMN15 RTJ* ERRCK_^1ALMN16 JMP SEKA_)RETURN TO SEEK. BYPASS ERROR RESET_^1_%SPC 5_^1*_]_€€^1*_(---_$CHECK FOR POSSIBLE ECC RECOVERY TRY_^1*_]_^1_%SPC 3_^1*_$CHECK IF HAVE RIGHT CONDITIONS FOR ERROR RECOVERY TRY_^1CKRCV LDA* CUSTS_^1_%ALS 13_+ECC ERROR BIT TO SIGN BIT_^1_%SAP CKRCV2_'SKIP IF DON T HAVE ECC ERROR_^1_%LDA IOFUN_(DATA OR ADDRESS I/O_^1_%SAN CKRCV2_'SKIP IF NOT DATA_^1_%LDA RDWTFG_'READ/WRITE FLAG_^1_%SAM CKRCV2_'SKIP IF WRITE_^1_%LDA* CUSTS_^1_€€%AND =N$FB_^1_%SAN CKRCV2_'SKIP IF OTHER CU ERROR_^1_%LDA* DS1STS_^1_%SAZ CKRCV4_'SKIP IF NO DRIVE STATUS ERROR_^1CKRCV2 JMP* CKRCV6_^1CKRCV4 LDA* DFSTS_^1_%SAN CKRCV6_'SKIP IF A DRIVE FAULT ERROR_^1_%LDA DASTS_^1_%SAM CKRCV6_'SENSE ECC ERROR IN ADDRESS FIELD_^1_%LDA ECINDX_'CHECK IF ECC IS HERE_^1_%EOR =N$60_^1_%SAN CKRCV6_'SKIP IF NOT_^1_%JMP* ECCALG_'TRY ECC RECOVERY_^1€€CKRCV6 RTJ* CLRSTS_'CLEAR STATUS WORDS_^1_%RTJ* ERRCK_(CHECK ERROR COUNT_^1_%JMP* ALMN16_'TO 'SEEK'_^1_%SPC 2_^1*_]_^1*_1ALARM ERROR CHECK ROUTINE_^1*_]_^1_%SPC 2_^1ERRCK ADC 0_^1_%RAO IOERR_(INCREMENT ERROR COUNTER_^1_%LDA IOERR_^1_%INA -IOTRYS_^1_%SAP ECK_*SKIP IF ENOUGH TRIES_^1_%JMP* (ERRCK)_^1ECK_"LDQ ECNTR_(SET IO ERROR CODE_^1_%JMP EREXIT_'GO EXIT WITH ERROR_^1_%EQ€€U DSKEND(*)_^1*_$ABOVE DEFINES THE END OF WHAT IS IN THE AUTOLOAD SECTORS_^1_%SPC 3_^1*_$*_"*_"*_"W A R N I N G_"*_"*_"*_"*_"*_"*_^1*_$THE ABOVE LOCATION MINUS 6 MUST BE LESS THAN $1E0 TO_^1*_$FIT INTO THE AUTOLOAD SECTOR AREA_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$ERROR CORRECTION ALOGRITHM TRY_^1*_]_^1********************€€****************************************************_^1_%SPC 3_^1ECCALG ENA ECCER_(SET FOR ECC ERROR CODE IN ERROR FLAG_^1_%STA ECNTR_^1_%RTJ ECC_*GO EXECUTE ECC ALGORIHM_^1_%JMP* ECX0_)P+1 RETURN_!NOT CORRECTABLE BY ECC_^1_%LDQ EMASS_(P+2 RETURN_!MAY BE CORRECTABLE_^1_%INQ 7_^1_%INP REJTC-*_%READ SECTOR AND HEAD_^1_%STA* TSA_^1_%LDA ECCA0_(FETCH UPPER ACCUMULATOR BYTE_^1_%€€ALS 8_^1_%EOR ECCA1_(MERGE TWO BYTES TOGETHER_^1_%STA* TSC_^1_%INA -7_+CHECK IF ERROR IS IN ECC_^1_%SAM ECX_*SKIP IF ERROR IS IN ECC_^1_%SUB =XWRDSEC*2_"SEE IF WITHIN SECTOR_^1_%SAP ECX0_)MUST BE 0-198 OR ERROR_^1_%JMP* ECX3N_(GO TRY ERROR CORRECTION_^1ECX0_!JMP ECN_^1*_$ERROR IS IN ECC BYTES_^1ECX_"RTJ* ECXEOT_^1_%RTJ CLRSTS_'CLEAR THE STATUS WORDS_^1_%RTJ CLRDAS_'CLEAR D€€A STATUS_^1*_$CHECK FOR END OF CYLINDER_^1*_$MUST CHECK TRACK/SECTOR FOR EOC AS STATUS NOT SET WITH ECC_^1ECX1_!LDA* TSA_*FETCH PHYSICAL TRACK/SECTOR_^1_%AND =N$7F_(SAVE SECTOR ONLY_^1_%INA -SERTCK+1_^1_%SAZ ECX2_)SKIP IF END OF TRACK_^1_%LDA* TSA_^1_%INA 1_^1_%JMP* ECX3_^1ECX2_!LDA* TSA_^1_%ARS 8_,SAVE TRACK ONLY_^1_%INA -TRKCYL+1_^1_%SAN ECX2A_(SKIP IF NOT EOC_^1_%JMP DAT€€AN_(GO TREAT AS NORMAL EOC_^1ECX2A LDA* TSA_^1_%ARS 8_,TRACK TO LOW BYTE_^1_%INA 1_,INCREMENT TRACK_^1_%ALS 8_^1ECX3_!LDQ EMASS_^1_%INQ 7_^1_%OUT REJTC-*_%SELECT TRACK/SECTOR_^1_%JMP DATAB_(GO CONTINUE_^1ECX3N LDA TRASEC_'FETCH STARTING TRACK SECTOR_^1_%ARS 8_,SAVE STARTING HEAD_^1_%TCA Q_,MINUS HEAD TO Q_^1_%LDA* TSA_^1_%ARS 8_,CURRENT HEAD_^1_%AAQ A_,CURRENT - START€€ING HEAD_^1_%JMP* ECX4_^1_%SPC 2_^1SNUM_!NUM $00FF_^1TSA_"NUM 0_,CURRENT HEAD SECTOR_^1TSB_"NUM 0_,FULL TRACKS CONVERTED TO SECTORS_^1TSC_"NUM 0_,A0, A1_^1TSN_"NUM 0_,NEW BFWA. INDEX FOR CORRECTION_^1ZERO_!NUM 0_^1_%EJT_]_^1*_$COMPUTE SECTORS TRANSFERED BEFORE ERROR_^1*_$INITIAL TRACK_(CENTER TRACKS_%END TRACK_^1*_$(64 - STARTING) + ((DELTA TRACKS - 1)*64) + (CURRENT + 1)€€_^1*_$COMPUTE SECTORS IN FULL CENTER TRACKS_^1ECX4_!INA -1_^1_%ALS 6_,*64 TO CONVERT TRACK TO SECTOR_^1_%STA* TSB_^1*_$COMPUTE SECTORS IN INITIAL TRACK_^1_%LDA TRASEC_'FETCH INITIAL HEAD SECTOR_^1_%AND* SNUM_)SAVE SECTOR ONLY_^1_%TCA Q_^1*_$COMPUTE SECTORS IN END TRACK_^1_%INQ SERTCK_'64 MINUS INITIAL SECTOR_^1_%LDA* TSA_*FETCH CURRENT SECTOR HEAD_^1_%AND* SNUM_)SAVE CURRENT S€€ECTOR ONLY_^1_%INA 1_^1_%AAQ A_,ADD PARTIAL STARTING AND END SECTORS_^1_%ADD* TSB_*PLUS SECTORS FROM FULL TRACKS_^1*_$CONVERT SECTORS TO WORDS_^1ECX9_!MUI =XWRDSEC_$NOW HAVE NUMBER OF WORDS TRANSFERED_^1*_$MAX 30720 WORDS PER CYLINDER. SHOULD NEVER GO INTO Q_^1_%ADD BFWA_)ADD WORDS TRANSFERED TO INITIAL BUFFER ADDRESS_^1_%INA -WRDSEC_^1_%STA* TSN_*SAVE NEW BUFFER FWA_^1_%LDA* €€TSC_*FETCH BYTE COUNT_^1_%INA 1_,GROUP PROPER BYTES TOGETHER FOR DIVISION_^1_%ARS 1_,DIVIDE BY 2 FOR WORD POINTER_^1_%INA -99_*INVERT MAGNITUDE_^1_%MUI =N$FFFE_%MULTIPLY BY MINUS 1 TO INVERT SIGN_^1_%INA 0_^1_%ADD* TSN_^1_%TRA Q_^1*_-DATA SECTOR_$ECC_^1*_%111_^1*_%999_-11_^1*_$********************************_^1*_%876_-10987 6543210_"BYTE CORRECTION BACK POINTER_^1*_$*BBB_-BB€€BBB*EEEEEEE*_^1*_$*000_"* * *_#11111*1234567*_!ASSOCIATED DATA BYTES AND ECC_^1*_$*000_"* * *_#88999*_%*_^1*_$*123_"* * *_#89012*_%*_^1*_$********************************_^1*_]_^1_%LDA* TSC_+FETCH OFFSET_^1_%ALS 15_+LOW BIT TO SIGN BIT_^1_%SAP ECXA_)SKIP IF BYTE COUNT EVEN_^1_%JMP* ECXE_)BYTE COUNT ODD_^1ECXA_!LDA ECCX1_(FETCH X0, X1 SYNDROME BYTES_^1_%RTJ STOECC_'MODIFY DATA I€€F WITHIN BUFFER_^1_%LDA* TSC_^1_%INA -8_^1_%SAZ ECXC_)SKIP IF INTO SYNC BYTES_^1_%INQ 1_^1_%LDA ECCX2_(FETCH X2, X3 SYNDROME BITS_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_^1ECXC_!JMP* ECXH_^1_%SPC 2_^1REJTC JMP* REJTC1_'INTERNAL REJECT_^1_%JMP REJTA2_'EXTERNAL REJECT_^1REJTC1 JMP REJTA1_^1_%SPC 2_^1*_$BYTE COUNT IS ODD_^1ECXE_!LDA ECCX1_(FETCH X0, X1 SYNDROME BITS_^1€€_%ARS 8_,SAVE X0_^1_%AND* SNUM_)ZERO OUT TOP BYTE_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_^1_%LDA* TSC_^1_%INA -7_^1_%SAZ ECXH_)SKIP IF INTO ECC BYTES_^1_%INQ 1_^1_%LDA ECCX1_(MUST USE BYTES 1 AND 2_^1_%AND* SNUM_)SAVE BUTE 1_^1_%EOR ECCX2_(HAVE BYTES 2 AND 1_^1_%ALS 8_,NOW 1 AND 2_^1_%RTJ STOECC_'MODIFY DATA IF WITHIN BUFFER_^1ECXH_!JMP* ECX_*GO CHECK EOT, EOC_^1ECX€€EOT ADC 0_^1_%LDA DASTS_^1_%ALS 12_^1_%SAP ECXJ_)SKIP IF NOT EOT_^1_%JMP DATAH1_'GO COMPLETE_^1ECXJ_!JMP* (ECXEOT)_^1_%SPC 1_^1*_'ROUTINE TO DETERMINE IF STORE ADDRESS FOR ECC CORRECT'N_^1*_+IS IN BUFFER AND STORE CORRECTION IF IT IS._^1*_)ENTRY - Q=STORE ADDRESS_^1*_1A=CORRECTION_^1_%SPC 1_^1STOECC 0_"0_^1_%STA* ECCORR_'SAVE CORRECTION_^1_%LDA BFWA_^1_%ADD NWORDS_'CALC.LA€€ST WORD+1(ELSTWD)_^1_%SQM STO2_^1_%SAP STO1_^1_%JMP* STO3_)(Q+,A-),OK_^1STO1_!TCA A_,(Q+,A+)_^1_%AAQ A_^1_%SAM STO3_)SENSE OK_^1_%JMP* STO4_^1STO2_!SAP STO4_)SENSE OUTSIDE BUFFER(Q-,A+)_^1_%TCA A_,(Q-,A-)_^1_%AAQ A_^1_%SAM STO4_)SENSE OUTSIDE BUFFER_^1STO3_!LDA* ECCORR_^1_%EOR* (ZERO),Q_$MAKE CORRECTION_^1_%STA* (ZERO),Q_^1_%JMP* (STOECC)_^1STO4_!JMP* ECXH_)TERMINATE ECC L€€OGIC IF CORRECTION_^1*_9OUTSIDE BUFFER_^1ECCORR NUM 0_^1_%SPC 1_^1_%EJT_]_^1*_$TRY OFFSET RECOVERY TECHNIQUES_^1*_$NOT CORRECTABLE BY ECC_^1ECN_"RTJ CLRSTS_'CLEAR ALL STATUS WORDS_^1_%RTJ CLRDAS_'CLEAR DA STATUS_^1_%LDA* OFFIND_'FETCH JUMP TABLE INDEX_^1_%SAN ECNB_)SKIP IF NOT INITIAL TIME_^1_%STA* OFFVAL_'INITIALIZE OFFSET VALUE_^1_%ENA 1_^1ECNB_!TRA Q_^1_%INA -9_+CHECK FO€€R END OF TRIES_^1_%SAP ECNC_)SKIP IF NO MORE COMBINATIONS TO TRY_^1_%LDA* OFFVAL_^1_%ADD* OFFSET_^1_%STA* OFFVAL_^1_%JMP* TBLSRT-1,Q_^1ECNC_!JMP ECK_*GO DETERMINE AND LOG ERROR_^1*_$JUMP TABLE FOR ERROR CORRECTION TRIES_^1*_$TABLE MUST REMAIN IN ORDER_^1TBLSRT JMP* TPOO_^1_%JMP* TMOO_^1_%JMP* TOOM_^1_%JMP* TOOP_^1_%JMP* TPOP_^1_%JMP* TMOP_^1_%JMP* TPOM_^1_%JMP* TMOM_^1*_$END OF J€€UMP TABLE_^1RDRCON NOP 0_,DO READ/ RECOVERY WITH WHAT IS IN A_^1_%LDQ EMASS_^1_%INQ $C_^1_%OUT REJTC-*_^1*_$MUST WAIT FOR DA TO DROP BUSY IF SEEK WAS INITIATED_^1RDRA01 RTJ DASTAT_'READ DA STATUS_^1_%ALS 15_+BUSY TO SIGN BIT_^1_%SAP RDRA02_'SKIP IF NOT BUSY_^1_%JMP* RDRA01_'WAIT FOR BUSY TO DROP_^1RDRA02 INQ 1_,SET FOR DRIVE STATUS 2 READ_^1RDRA_!INP REJTC-*_%READ DS2_^1_%€€ALS 11_+READY TO SIGN BIT_^1_%SAM RDRC_)SKIP IF READY_^1_%JMP CONN_)GO RECORD ERROR_^1RDRC_!ALS 4_,FAULT TO SIGN BIT_^1_%SAM RDRD_)SKIP IF FAULT_^1_%ALS 11_+ON CYLINDER TO SIGN BIT_^1_%SAM RDRE_)SKIP IF ON CYLINDER_^1_%JMP* RDRA_)WAIT FOR ERROR OR ON CYLINDER_^1RDRD_!JMP* ECN_*QUIT ON THIS TRY_^1RDRE_!JMP* (RDRCON)_^1*_$TIMING POSITIVE, OFFSET OFF_^1TPOO_!LDA =N$8000_%SET T€€IMING EARLY BIT_^1TPOOA RTJ* RDRCON_^1_%RAO OFFIND_'INCREMENT JUMP TABLE INDEX_^1_%JMP DATA_)GO TRY AGAIN_^1*_$TIMING MINUS, OFFSET OFF_^1TMOO_!ENA 0_^1_%STA OFFVAL_'CLEAR OFFSET INCREMENT_^1_%LDA =N$4000_%FETCH BIT FOR TIMING MINUS_^1_%JMP* TPOOA_^1*_$TIMING OFF,OFFSET POSITIVE_^1TOOP_!LDA* OFFVAL_'FETCH CURRENT INCREMENT_^1_%ALS 8_^1_%EOR =N$2000_%SET FOR OFFSET POSITIVE_€€^1TOOP1 RTJ* RDRCON_^1_%LDA* OFFVAL_'CHECK IF TIME TO INCREMENT COMBINATION_^1_%ADD* OFFSET_^1_%INA -16_^1_%SAM TOOP4_(SKIP IF ANOTHER LOOP FOR THIS ONE_^1_%ENA 0_^1_%STA* OFFVAL_'CLEAR OFFSET VALUE_^1_%RAO* OFFIND_'INCREMENT JUMP TABLE POINTER_^1TOOP4 JMP DATA_^1*_$TIMING POSITIVE, OFFSET POSITIVE_^1TPOP_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$A000_%SET OFFSET AND TIMING POSITIV€€E_^1_%JMP* TOOP1_^1*_$TIMING MINUS, OFFSET PLUS_^1TMOP_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$6000_%SET OFFSET POSITIVE AND TIMING NEGATIVE_^1_%JMP* TOOP1_^1*_$TIMING OFF, OFFSET MINUS_^1TOOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$1000_%SET OFFSET MINUS_^1_%JMP* TOOP1_^1*_$TIMING POSITIVE, OFFSET MINUS_^1TPOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$9000_%OFFSET MINUS AND TIMING POSITIVE_^1_%€€JMP* TOOP1_^1*_$TIMING MINUS, OFFSET MINUS_^1TMOM_!LDA* OFFVAL_^1_%ALS 8_^1_%EOR =N$5000_%OFFSET MINUS AND TIMING MINUS_^1_%JMP* TOOP1_^1OFFIND NUM 0_,JUMP TABLE INDEX_^1OFFVAL NUM 0_,CURRENT VALUE OF OFFSET INCREMENT_^1OFFSET NUM 15_+FIXED VALUE OF OFFSET INCREMENT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$SUBROUTINE TO CO€€MPUTE ECC OFFSET AND CORRECTION VALUES_^1*_]_^1************************************************************************_^1*_]_^1*_$ON RETURN QA CONTAINS THE BYTE DISPLACEMENT_^1*_1RETURNS TO P + 1 IF UNCORRECTABLE_^1*_1RETURNS TO P + 2 IF CORRECTABLE_^1_%SPC 3_^1ECC_"NOP 0_^1_%ENA 22_^1_%STA* ECCK_)INITIALIZE SHIFT COUNT_^1_%ENA 1_^1_%STA* ECCS_)INITIALIZE S SWITCH_^1_%LDA* NUM€€B0_^1_%STA* ECCA2_(INITIALIZE BYTE ACCUMULATOR_^1_%ENA 0_^1_%STA* ECCA0_^1_%STA* ECCA1_^1_%STA* ECCI_^1POHI_!LDQ EMASS_(FETCH EQUIPMENT CODE_^1_%INQ $B_^1_%INP REJTB-*_%READ ECC CONDITION STATUS_^1_%ALS 8_,P0 HIGH NEQ 0 TO SIGN BIT_^1_%SAM SHI_*SKIP IF STILL HIGH BITS_^1_%JMP* NO_+ALL BITS ARE IN 0 - 11_^1SHI_"LDA* ECCK_^1_%SAN SHIFT_(SKIP IF NOT 22 SHIFTS YET_^1_%JMP* (ECC)€€_(NOT CORRECTABLE WITHIN 22 SHIFTS. RETURN P+1_^1SHIFT INA -1_+DECREMENT SHIFT COUNTER_^1_%STA* ECCK_^1_%ENA $20_*SHIFT PO COMMAND FUNCTION BITS_^1_%OUT REJTB-*_%ECC CONTROL FUNCTION_^1FETCHI LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1ADDA_!RTJ ADD_*FETCH AND ADD POLYNOMIAL CONSTANT_^1_%SQM S1_+SKIP IF HAVE CARRY FROM HIGH BYTE_^1_%ENA $60_*INDEX TO FETCH MODULUS FOR ADD_^1_%JMP* A€€DDA_)GO ADD MODULUS_^1S1_#LDA* ECCS_)FETCH S SWITCH_^1_%SAZ U_^1_%JMP* POHI_)GO CHECK PO AGAIN_^1NO_#ENA $54_^1_%STA* ECCI_)SET NEW POLYNOMIAL INDEX_^1_%ENA 89_^1_%STA* ECCK_)SET NEW SHIFT COUNTER VALUE_^1U_$LDQ EMASS_^1_%INQ $B_^1_%INP REJTB-*_%READ IN THE ECC CONDITION STATUS_^1_%STA* ECCC_)SAVE CONDITION STATUS_^1*_$COMPUTE U VALUE FOR SWITCH CHECK_^1_%ALS 1_,MULTIPLY CON€€DITION STATUS BY 2_^1_%EOR* ECCC_^1_%AND =N$54_^1_%SAZ UZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. PARITY. RETURN AT P+1_^1_%SPC 2_^1NUMB0 NUM $B0_^1NUME0 NUM $E0_^1ECCK_!NUM 0_,SHIFT COUNTER_^1ECCI_!NUM 0_,INDEX INTO POLYNOMIAL TABLE_^1_%SPC 2_^1UZERO STA* ECCS_)SET S SWITCH TO ZERO_^1_%LDA* ECCI_)FETCH POLYNOMIAL INDEX_^1_%AND* ECCC_)AND WITH CONDITION STATUS_^1_%STA* ECCI_€€^1_%SAZ IZERO_^1_%LDA* ECCK_^1_%INA -1_+DECREMENT COUNTER_^1_%SAN SH123_(SKIP TO SHIFT IF NOT ZERO_^1_%JMP* (ECC)_(NOT CORRECTABLE. RETURN AT P+1_^1REJTB JMP* REJTI_^1_%JMP REJTA2_'EXTERNAL REJECT_^1REJTI JMP REJTA1_'INTERNAL REJT_^1SH123 STA* ECCK_)RESTORE K COUNTER_^1_%ENA $10_*COMMAND TO SHIFT P1,2,3 POLYNOMIAL REGISTERS_^1_%OUT REJTB-*_%SHIFT P1,2,3_^1_%JMP* FETCHI_'G€€O FETCH INDEX AND ADD_^1IZERO STA* ECCX2_(ZERO OUT X2, X3 SYNDROME BYTES_^1_%STA* ECCX1_(ZERO OUT X0, X1 SYNDROME BITS_^1_%STA* ECCI_)ZERO J SWITCH_^1_%LDA* ECCA1_^1_%ALS 8_^1_%EOR* ECCA2_(A HAS LOWER 2 ACCUMULATOR BYTES_^1_%LDQ* ECCA0_(Q HAS HIGH BYTE_^1_%LLS 8_^1_%LRS 7_,LEFT SHIFT ACCUMULATOR 1_^1_%SQP NOCARY_'SKIP IF NO CARRY_^1_%JMP* (ECC)_^1NOCARY STQ* ECCA0_^1_%ENQ 0_^€€1_%LLS 8_,MOVE MIDDLE BYTE TO Q_^1_%STQ* ECCA1_(RESTORE_^1_%ALS 8_^1_%STA* ECCA2_(SAVE LOW BYTE_^1NEXT_!LDA* ECCA2_^1_%SAZ A2ZRO_(SKIP IF A2 IS ZERO_^1_%ADD* NUME0_(ADD HEX 00E0_^1_%AND* NUMFF_(IGNORE ANY CARRY_^1_%STA* ECCA2_^1_%JMP* SHPO_^1A2ZRO LDA* ECCS_^1_%SAZ S2ZRO_(SKIP IF S SWITCH ZERO_^1_%JMP* END_^1_%SPC 2_^1NUMFF NUM $FF_^1ECCD_!NUM 0_^1ECCS_!NUM 0_,S SWITCH_^1€€ECCC_!NUM 0_,ECC_^1*_$CORRECTION BYTES_^1ECCX1 NUM 0_,SYNDROME BYTES X0, X1_^1ECCX2 NUM 0_,SYNDROME BYTES X2, X3_^1*_$ACCUMULATOR BYTES_^1ECCA0 NUM 0_,HIGH ORDER BYTE_^1ECCA1 NUM 0_,MIDDLE BYTE_^1ECCA2 NUM 0_,LOW BYTE_^1_%SPC 2_^1S2ZRO LDA* NUME0_^1_%STA* ECCA2_(SET A 2 TO $E0_^1_%LDQ EMASS_^1_%INQ $B_^1_%INP REJTB-*_%READ IN CONDITION STATUS_^1_%ALS 8_,P0 HIGH NEQ€€ 0 TO SIGN BIT_^1_%SAP P0HZRO_'SKIP IF P0 HIGH IS ZERO_^1_%JMP* END_*GO DUMP SYNDROME BITS_^1*_$A0 A1 MINUS 1_^1P0HZRO LDA* ECCA0_(DO A0A1-1_^1_%ALS 8_^1_%EOR* ECCA1_^1_%INA -1_^1_%ENQ 0_^1_%LLS 8_^1_%STQ* ECCA0_^1_%ALS 8_^1_%STA* ECCA1_^1*_$SHIFT P0_^1SHPO_!LDQ EMASS_^1_%INQ $B_^1_%ENA $20_*SET A TO SHIFT PO COMMAND_^1_%OUT REJTB-*_%ECC CONTROL. SHIFT PO_^1_%JMP* NEXT_^1€€END_"LDA* NUME0_^1_%STA* ECCA2_^1_%ENA 1_^1_%STA* ECCS_)SET S SWITCH TO 1_^1*_$GET D VALUE. ECC DATA BYTE_^1_%LDQ EMASS_^1_%INQ $A_^1_%INP REJTB-*_%READ ECC PATTERN_^1_%STA* ECCD_^1*_$BRANCH OFF VALUE OF J SWITCH_^1_%LDA* ECCI_^1_%INA -1_^1_%SAM LOOPA_(SKIP IF WAS 0_^1_%SAN LOOPC_(J WAS 2_^1_%JMP* LOOPB_(WAS 1_^1*_$J SWITCH 2_^1LOOPC LDA* ECCD_)FETCH ECC PATTERN_^1_%ALS 8_€€,MOVE TO UPPER BYTE_^1_%AND* ECCX2_(AND INTO X2 SYNDROME BYTE. X3 UNCHANGED_^1_%STA* ECCX2_(RESTORE BYTES X2, X3_^1_%RAO ECC_*INCREMENT RETURN FOR P+2_^1*_$ADD CHECK FOR OUT OF RANGE_^1_%JMP (ECC)_^1*_$J SWITCH 0_^1LOOPA LDA* ECCX1_(FETCH X0, X1 BYTES_^1_%ALS 8_,NOW X1, X0_^1_%LDQ* ECCD_)FETCH ECC PATTERN_^1_%LRS 8_,A HAS ECC PATTERN, X1_^1SAVEIT STA* ECCX1_(RESTORE X0, X1_^1€€_%RAO ECCI_)INCREMENT SWITCH_^1_%JMP* SHPO_)GO SHIFT PO AGAIN_^1*_$J SWITCH 1_^1LOOPB LDA =N$FC00_^1_%STA* ECCX2_(SET X2 TO $FC, X3 TO ZERO_^1_%LDA* ECCX1_^1_%AND =N$FF00_%SAVE X0 BYTE_^1_%EOR* ECCD_)OR IN ECC PATTERN_^1_%JMP* SAVEIT_^1_%EJT_]_^1************************************************************************_^1*_]_^1*_$ROUTINE TO ADD POLYNOMIAL CONSTANT TO THREE BYTE A€€CCUMULATOR_^1*_$WILL FIRST CALCULATE INDEX INTO CONSTANT TABLE_^1*_$WILL THEN DO THE BYTE BY BYTE ADDITION_^1*_$IF A CARRY OCCURS FROM THE HIGH ORDER BYTE Q WILL BE SET NEGATIVE_^1*_]_^1************************************************************************_^1*_]_^1*_$ON ENTRY A CONTAINS THE INDEX TO THE CONSTANT TABLE_^1_%SPC 3_^1ADD_"NOP 0_,A CONTAINS THE POLYNOMIAL INDEX_^1_%€€STA* ECIN_)SAVE INDEX SEARCHING FOR_^1_%ENQ 8_,INITIALIZE INDEX_^1FLOOP EOR* ECINDX,Q_$CHECK FOR INDEX MATCH_^1_%SAZ FOUND_(SKIP IF MATCH_^1_%INQ -1_+DECREMENT COUNT_^1_%SQM NOMATH_'SKIP IF NO MATCH FOUND_^1_%LDA* ECIN_)FETCH INDEX SEARCHING FOR_^1_%JMP* FLOOP_^1NOMATH JMP (ECC)_(ASSUME NOT CORRECTABLE_^1FOUND TRQ A_^1_%MUI =N3_*MULTIPLY BY THREE_^1_%TRA Q_,SET INDEX FOR €€CONSTANT TABLE_^1_%LDA* ECCA2_(FETCH LOW BYTE OF ACCUMULATOR_^1_%ADD* ECONST,Q_$ADD TABLE CONSTANT_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDM_)SKIP IF NO CARRY_^1_%RAO* ECCA1_(INCREMENT NEXT BYTE FOR CARRY_^1_%AND* NUMFF_(SAVE ONLY LOW BYTE_^1ADDM_!STA* ECCA2_^1_%LDA* ECCA1_(FETCH NEXT BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_$ADD CONSTANT_€€^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDB_)SKIP IF NO CARRY_^1_%RAO* ECCA0_(INCREMENT NEXT HIGHEST BYTE_^1_%AND* NUMFF_^1ADDB_!STA* ECCA1_(SAVE IN ACCUMULATOR_^1_%LDA* ECCA0_(FETCH HIGH ACCUMULATOR BYTE_^1_%INQ 1_,INCREMENT CONSTANT INDEX_^1_%ADD* ECONST,Q_^1_%ALS 7_^1_%ARS 7_,EXTEND CARRY BIT TO HIGH BIT_^1_%SAP ADDC_)SKIP IF NO CARRY_^1_%AND* NUMFF_^1_€€%SET Q_,SET Q NEGATIVE FOR CARRY FROM HIGH BYTE_^1ADDC_!STA* ECCA0_^1_%JMP* (ADD)_^1ECIN_!NUM 0_^1_%SPC 3_^1*_$INDICES TO CONSTANTS_^1ECINDX NUM_"$60_^1_%NUM_"$00_^1_%NUM_"$04_^1_%NUM_"$10_^1_%NUM_"$14_^1_%NUM_"$40_^1_%NUM_"$44_^1_%NUM_"$50_^1_%NUM_"$54_^1*_$CONSTANTS_!MUST REMAIN IN ORDER_^1ECONST NUM_"$20_(INDEX 60_#MODULUS_^1_%NUM_"$EE_^1_%NUM_"$8E_^1_%NUM_"$D0_(INDEX 00_#LOW€€_^1_%NUM_"$8D_5MIDDLE_^1_%NUM_"$91_5HIGH BYTE_^1_%NUM_"$A0_(INDEX 04_^1_%NUM_"$36_^1_%NUM_"$AF_^1_%NUM_"$A0_(INDEX 10_^1_%NUM_"$09_^1_%NUM_"$B3_^1_%NUM_"$60_(INDEX 14_^1_%NUM_"$2E_^1_%NUM_"$F1_^1_%NUM_"$A0_(INDEX 40_^1_%NUM_"$55_^1_%NUM_"$EE_^1_%NUM_"$40_(INDEX 44_^1_%NUM_"$8C_^1_%NUM_"$9D_^1_%NUM_"$40_(INDEX 50_^1_%NUM_"$5F_^1_%NUM_"$A1_^1_%NUM_"$00_(INDEX 54_^1_%NUM_"$84_^1_%NUM_€€"$DF_^1*_$END OF CONSTANT TABLE_^1_%EJT_]_^1*_$ROUTINE TO COMPUTE AND RETURN TOTAL # SECTORS ON DISK_^1_%SPC 1_^1SIZMAS NOP 0_^1_%LDA* NCYL_)PICK UP MAXIMUM CYLINDER NUMBER_%121*4793_^1_%INA 1_,COMPUTE NUMBER OF CYLINDERS_*121*4793_^1_%MUI =XSERPCY_$MULTIPLY BY # SECTORS/CYLINDER_^1_%LLS 1_,CONVERT TO SECTOR FORMAT_^1_%ALS 15_^1_%JMP* (SIZMAS)_$RETURN TO CALLER_^1_%EJT_]_^1*-€€----------------------------------------------------------------------_^1*_]_^1*_1WRITE ADDRESS TAGS AND BACKGROUND BUFFER_^1*_=WITH '28'_^1*_]_^1*-----------------------------------------------------------------------_^1_%SPC 3_^1*_]_^1*_1ADDRESS TAGS BUFFER SET UP (5 WORDS)_^1*_]_^1*_1WORD 1 FLAG BYTE_^1*_1WORD 2 FLAG BYTE_^1*_1WORD 3 CYLINDER ADDRESS_^1*_1WORD 4 TRACK AND €€SECTOR DATA_^1*_8(BIT 7 IS SET FOR LAST TRACK)_^1*_1WORD 5 NUMBER OF BYTE IN SECTOR_^1*_]_^1_%SPC 2_^1TAGS_!ENA 0_^1_%STA CYLIND_^1_%STA TRASEC_'INITIALIZE THE CYLINDER AND TRACK TO ZERO_^1*_$INITIALIZE THE DATA BUFFER_^1_%LDQ* BLN_*FETCH BUFFER LENGTH_^1_%INQ -1_+POINT Q TO LAST BUFFER LOCATION_^1_%SPC 1_^1*_1SET UP WORDS 1 + 2 --- FLAG BYTE AND WORD 5 NUMBER_^1*_1OF BYTE IN€€ SECTOR (BITS 15-8)_^1*_]_^1TAGS1 LDA* TAGWD5_^1_%STA BUFF,Q_'SET BYTES PER SECTOR MINUS ONE_^1_%INQ -3_+POINT Q TO FLAG BYTE WORD 2_^1_%ENA 0_^1_%STA BUFF,Q_'ZERO FLAG BYTE WORD 2_^1_%INQ -1_+POINT Q TO FLAG BYTE WORD 1_^1_%STA BUFF,Q_'ZERO FLAG BYTE WORD 1_^1_%INQ -1_+POINT Q TO NEXT 5 WORD ADDRESS BLOCK_^1_%SQM TAGS2_(SKIP IF DONE_^1_%JMP* TAGS1_^1TAGWD0 EQU TAGWD0(2*W€€RDSEC)_^1TAGWD1 EQU TAGWD1(TAGWD0-1)_^1TAGWD5 VFD X8/TAGWD1,N8/0_^1TAGS2 RTJ* SETA1_(COMPUTE ABSOLUTE ADDRESS OF BUFFER_^1SETA1 NOP 0_^1_%LDA* SETA1_^1_%ADD =XBUFF-SETA1_^1_%STA* BUFADS_'SAVE THE BUFFER ADDRESS_^1_%SPC 2_^1*_$SETUP THE CURRENT CYLINDER WORDS_^1*_]_^1*_1SET UP WORD 3 --- CYLINDER ADDRESS_^1*_]_^1TAGS4 LDQ* BLN_*FETCH BUFFER LENGTH_^1_%INQ -3_+POINT Q TO CYL€€INDER ADDRESS_^1TAGS5 LDA CYLIND_'FETCH CURRENT CYLINDER_^1_%STA BUFF,Q_'SET IN BUFFER_^1_%INQ -5_+POINT TO NEXT BLOCK_^1_%SQM TAGS6_(SKIP IF CYLINDER SET IN ALL TAGS_^1_%JMP* TAGS5_^1_%SPC 2_^1BUFADS NUM 0_,BUFFER FIRST WORD ADDRESS_^1BIT7_!NUM $80_^1CURSEC NUM 0_,CURRENT SECTOR_^1NCYL_!NUM 0_,NUMBER OF CYLINDERS ON THIS DRIVE_^1BLN_"ADC 5*SERTCK_$TAG WORDS PER TRACK_^1€€_%SPC 2_^1*_]_^1*_1SET UP WORD 4 TRACK/SECTOR DATA_^1*_1BITS 15-8 = TRACK_^1*_1BIT 7_"= SET FOR LAST SECTOR IN TRACK_^1*_1BITS 6-0 = SECTOR_^1*_]_^1*_$SETUP THE TRACK/SECTOR WORDS_^1TAGS6 LDQ* BLN_*FETCH BUFFER LENGTH_^1_%INQ -2_+POINT Q TO LAST TRACK/SECTOR WORD_^1_%LDA TRASEC_'FETCH TRACK/SECTOR_^1_%AND =N$FF00_%SAVE TRACK_^1_%INA SERTCK-1_$SET FOR MAX SECTOR_^1_%STA* CUR€€SEC_'SAVE TRACK/SECTOR_^1_%EOR* BIT7_)SET BIT TO INDICATE LAST SECTOR OF TRACK_^1TAGS7 STA* BUFF,Q_'SET TRACK/SECTOR IN TAG WORD_^1_%INQ -5_+POINT Q TO NEXT TAG BLOCK_^1_%SQM TAGS8_(SKIP IF DONE SETTING SECTORS_^1_%LDA* CURSEC_^1_%INA -1_+DECREMENT TO POINT TO NEXT SECTOR_^1_%STA* CURSEC_^1_%JMP* TAGS7_^1_%SPC 2_^1*_$SETUP DRIVER TO WRITE ONE TRACK OF ADDRESS TAGS_^1TAGS8 LDA€€* BIT7_^1_%STA IOFUN_(SET IO FUNCTION TO ADDRESS_^1_%LDA* BUFADS_'BUFFER FWA_^1_%STA BFWA_^1_%LDQ* BLN_*NO OF WORDS_^1_%STQ NWORDS_^1_%TCQ Q_,SET COMPLEMENT LENGTH FOR WRITE_^1_%STQ RDWTFG_^1_%RTJ SMDIO_(GO WRITE THIS TRACK_^1_%SAN TAGS9_(SKIP IF REQUEST OK_^1_%JMP (QMASS)_^1_%SPC 2_^1*_]_^1*_1HOUSEKEEPING TO MAKE SURE THE WHOLE DISK IS DONE_^1*_]_^1*_1UPDATE TRACK AND/OR €€CYLINDER ADDRESS_^1*_]_^1_%SPC 2_^1*_$CHECK IF ALL TRACKS ON THIS CYLINDER ARE DONE_^1TAGS9 LDA TRASEC_'FETCH TRACK/SECTOR WORD_^1_%ARS 8_,SHIFT OFF SECTOR_^1_%INA -TRKCYL+1_^1_%SAP TAGS10_'SKIP IF ALL TRACKS ON CYLINDER ARE DONE_^1_%LDA TRASEC_'FETCH TRACK_^1_%ADD =N$100_'INCREMENT TRACK BY 1_^1_%STA TRASEC_^1_%JMP* TAGS6_(GO DO NEXT TRACK_^1_%SPC 2_^1*_$CHECK IF ALL CYL€€INDERS ON DRIVE ARE DONE_^1TAGS10 LDA CYLIND_'FETCH LAST CYLINDER WRITTEN ON_^1_%SUB* NCYL_)MINUS CYLINDERS ON THIS DRIVE_^1_%SAP TAGS11_'SKIP IF ALL CYLINDERS ARE DONE_^1_%RAO CYLIND_'INCREMENT TO NEXT CYLINDER_^1_%ENA 0_^1_%STA TRASEC_'SET TRACK/SECTOR TO ZERO_^1_%JMP* TAGS4_^1_%SPC 3_^1*_]_^1*_1ADDRESS TAGS BEEN WRITTEN, BACKGROUND THE DISK_^1*_:WITH THESE TWO CHARACTERS €€'28'_^1*_]_^1*_1BUFFER, WHICH IS USED FOR BACKGROUND THE DISK,_^1*_1IS 384 WORDS (OR 4 SECTORS) LONG_^1*_]_^1_%SPC 2_^1*_$NOW WRITE DATA ON ENTIRE PACK_^1*_$WRITES ARE 4 SECTORS LONG (384 WORDS)_^1DATSWT NUM 11_+ZERO FOR TAGS, NONZERO IF TAGS AND DATA_^1TAGS11 LDA* DATSWT_^1_%SAN WRT_*SKIP IF DATA ALSO_^1_%JMP* WRT11_(GO EXIT_^1WRT_"ENA 0_^1_%STA TRASEC_'RESET TRACK SECTOR_^1€€_%STA CYLIND_'RESET CYLINDER TO ZERP_^1_%LDA =XBACKGD_$CHARACTERS (28) FOR BACKGROUND BUFFER_^1_%LDQ* DABLN_(FETCH BUFFER LENGTH FOR DATA_^1WRT1_!INQ -1_+SETUP BUFFER WITH DATA_^1_%STA BUFF,Q_^1_%SQZ WRT3_^1_%JMP* WRT1_^1WRT3_!ENA 0_^1_%STA IOFUN_(SET IO FUNCTION FOR DATA_^1_%LDA* DABLN_^1_%STA NWORDS_'SET NO OF WORDS TO TRANSFER_^1_%TCA A_^1_%STA RDWTFG_'SET COMPLEMENT L€€ENGTH FOR WRITE FLAG_^1_%RTJ SMDIO_(GO DO DATA TRANSFER_^1_%SAN WRT5_)SKIP IF NO ERROR OCCURED_^1_%JMP (QMASS)_%EXIT WITH ERROR FLAGS SET_^1_%SPC 2_^1*_$CHECK IF ALL TRACKS/SECTORS ARE DONE_^1WRT5_!LDA TRASEC_^1_%TRA Q_,TEMP SAVE IN Q_^1_%AND =N$7F_(SAVE ONLY SECTOR_^1_%INA -SERTCK-4_^1_%SAP WRT7_)SKIP IF DONE WITH TRACK_^1_%TRQ A_,RESTORE TRASEC_^1_%INA 4_,INCREMENT SEC€€TOR_^1_%JMP* WRT9_^1WRT7_!TRQ A_^1_%ARS 8_,SAVE TRACK_^1_%INA -TRKCYL+1_^1_%SAP WRT8_)SKIP IF ALL TRACKS ARE DONE_^1_%TRQ A_^1_%ARS 8_^1_%INA 1_,INCREMENT TRACK_^1_%ALS 8_,AND RESET SECTOR TO ZERO_^1_%JMP* WRT9_^1WRT8_!LDA CYLIND_'FETCH CYLINDER ADDRESS_^1_%SUB* NCYL_)MINUS CYLINDERS ON THIS DISK_^1_%SAP WRT11_(SKIP IF ALL CYLINDERS DONE_^1_%RAO CYLIND_^1_%ENA 0_^1WRT9_€Ü!STA TRASEC_^1_%JMP* WRT3_^1WRT11 SET A_^1_%CLR Q_^1_%JMP (QMASS)_%EXIT WITH PARAMETERS OK_^1DABLN ADC BUFSIZ_'DATA BUFFER LENGTH_^1_%BZS BUFF(384)_#GENERAL DATA BUFFER_^1BUFSIZ EQU BUFSIZ(*-BUFF)_^1_%END_]_^__ ÜPTRMDVR CSY/ D73 P€1_%NAM TRMDVR_'DECK-ID D73 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$ITOS TERMINAL I/O DRIVER_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 4_^1****_]_^1*_$ITOS TERMINAL DRIVER_^1*_]_^1*_]_^1*_$FUNCTION-_^1*_$--------_^1*_$THIS DRIVER MUST RUN AT OR ABOVE THE PRIORITY LEVEL_^1*_$OF A€€NY REQUESTOR._^1*_]_^1*_]_^1*_]_^1*_$INDEX OF DRIVER ROUTINES_^1*_$----- -- ----- ---------_^1*_*ITRMDV_'INITIATOR_^1*_*THREAD_'LOG2 THREAD ROUTINE_^1*_*CONECT_'CONNECT PROCESSOR_^1*_*DISCNT_'DISCONNECT PROCESSOR_^1*_*WRITE_(WRITE PROCESSOR_^1*_*READ_)READ PROCESSOR_^1*_*COMREQ_'COMPLETE REQUEST ROUTINE_^1*_*ETRMDV_'DIAGNOSTIC TIMER ROUTINE_^1*_*TIME_)PORT CLOCKS PROCESSOR_^1*_*ABS€€RED_'ABSOLUTIZE READ REQUEST_^1*_*FIXONE_'CONVERT PORT NUMBER_^1*_*UNFIX_(CONVERT PORT LOCATION_^1*_]_^1*_]_^1*_$ENTRY POINTS-_^1*_$----- ------_^1_%ENT ITRMNL_'EXTERNAL INITIATOR ENTRY_^1_%ENT ETRMNL_'DIAGNOSTIC CLOCK ENTRY_^1_%ENT COMREQ_'COMPLETE REQUEST_^1*_]_^1*_]_^1*_$EXTERNALS-_^1*_$---------_^1_%EXT LOG2_)LOGICAL UNIT TABLE_^1_%EXT PORTS_(START OF PORT TABLES_^1_%EXT €€EPORTS_'END OF PORT TABLES_^1_%EXT NBRLIN_'NUMBER OF PORT TABLES_^1_%EXT PLENTH_'PORT TABLE LENGTH_^1_%EXT INIPRT_'ROUTINE TO INITIALIZE PORT_^1_%EXT LOG_*ERROR LOG ROUTINE_^1*_]_^1*_]_^1*_$EQUIVALENCES- LOW CORE_^1*_$------------_^1_%EQU AMONI($F4)_^1_%EQU ADISP($EA)_"DISPATCHER ENTRY LOCATION_^1_%EQU ASABS($BD)_"ABSOLUTIZE S_^1_%EQU ACABS($BE)_^1_%EQU ANABS($BF)_^1_%EQU €€ ONEBIT($23)_^1_%EQU ZERO($22)_^1_%EJT_]_^1*_$EQUIVALENCES- PHYSICAL DEVICE TABLE_^1*_$------------_^1_%EQU ELVN(0)_%SCHEDULER CALL_^1_%EQU EDIN(1)_%DRIVER INITIATOR_^1_%EQU EDCN(2)_%DRIVER CONTINUATOR_^1_%EQU EDPGM(3)_$NOT USED_^1_%EQU EDCLK(4)_$NOT USED_^1_%EQU ELU(5)_'CURRENT LU_^1_%EQU EPTR(6)_%NOT USED_^1_%EQU EWES(7)_%NOT USED_^1_%EQU EREQST(8)_#NOT USED_^1_%EQU ES€€TAT1(9)_#NOT USED_^1_%EQU ECCOR(10)_#NOT USED_^1_%EQU ELSTWD(11)_"NOT USED_^1_%EQU ESTAT2(12)_"LAST EQUIP STATUS FROM CP_^1_%EQU MASLGN(13)_"NOT USED_^1_%EQU MASSEC(14)_"NOT USED_^1_%EQU RETURN(15)_"NOT USED_^1_%EQU CPCLK(16)_#15-12 NOT USED_^1*_811-08 WRITE CLOCK VALUE_^1*_807-04 NORMAL READ CLOCK VALUE_^1*_803-00 UI READ CLOCK VALUE_^1*_*_^1*************************************************************_^1CONECT NUM 0_^1_%LRQ- RDLOCN,1_$ABSOLUTIZE REQUEST IN PORT_^1_%ENA 0_^1_%STA- 2,Q_*CLEAR THREAD IN REQUEST_^1_%RTJ ABSRED_^1_%SEF- PSTATS,13,1,1 SET UI FLAG_^1_%LRA- RDLEN,1_%PICK UP UI LEN€€GTH_^1_%SFZ- LUWORD,12,1,Q SKIP IF CHARACTER MODE_^1_%ALS 1_,X2 FOR CHARACTERS_^1_%SRA- RDLEN,1_%STORE BACK IN PORT TABLE_^1_%SFA- (ZERO),15,12,1 SAVE IN R/C WORD BITS 15-04_^1_%RTJ INIPRT_'INITIALIZE PORT FOR I/O_^1_%JMP* (CONECT)_^1_%EJT_]_^1*************************************************************_^1*_8DISCNT_;*_^1*_Z*_^1*_$DISCONNECT REQUEST PROCESSOR_8*_^1*_$STOPS READ C€€LOCK._C*_^1*_$COMPLETES ACTIVE WRITE REQST_8*_^1*_Z*_^1*_$ENTRY_O*_^1*_*1-REG= PORT TABLE LOCN_9*_^1*_*I-REQ= PDT LOCN_@*_^1*_$RETURN_N*_^1*_*REGISTER I SAVED_?*_^1*************************************************************_^1DISCNT NUM 0_^1_%LRQ- RDLOCN,1_^1_%ENA 0_^1_%STA- 2,Q_*CLEAR THREAD IN REQUEST_^1_%CLF- PSTATS,13,1,1 CLEAR UI MODE_^1_%SEF- PCLOK,15,4,1 STOP READ CLOCK€€_^1_%LR2- ZERO_)SET RETURN STATUS_^1_%ENA 1_,COMPLETE ANY OUTSTANDING WRITE_^1_%RTJ* COMREQ_^1DIS8_!JMP* (DISCNT)_^1_%EJT_]_^1*************************************************************_^1*_8WRITE_<*_^1*_Z*_^1*_$WRITE REQUEST PROCESSOR_=*_^1*_Z*_^1*_$ENTRY_O*_^1*_*1-REG= PORT TABLE LOCN_9*_^1*_*I-REG= PDT LOCN_@*_^1*_$RETURN_N*_^1*_*I-REG SAVED_D*_^1*****************************€€********************************_^1WRITE NUM 0_^1_%CLF- PSTATS,9,1,1 CLEAR UI BUSY_^1_%SEF- PSTATS,11,1,1 SET WRITE BUSY_^1_%LRQ- WRLOCN,1_$REQUEST LOCN_^1_%RTJ- (ASABS)_%GET BUFFER LOCN_^1_%SRQ- WRBUF,1_%SAVE BUFFER ADDRESS_^1_%LFA- DSTAT1,3,4,Q GET SUB-REQUEST CODE_^1_%INA -3_^1_%SAZ WR8_*SKIP IF CODE IS WRITE-READ_^1_%JMP* WR16_)PROCESS NORMAL WRITE_^1WR8_"LR2- ONEBIT+9_$P€€RE-SET STATUS_^1_%SFN- PSTATS,13,1,1 SKIP IF PORT SET FOR UI_^1_%JMP* WR20_)ERROR_^1_%SEF- PSTATS,10,1,1 SET WRITE-READ MODE_^1_%LDA- NREAD,Q_%PICK UP READ LENGTH FROM HEADER_^1_%SRA- RDLEN,1_%SAVE FOR READ PORTION_^1WR16_!ENA 0_^1_%STA- NREAD,Q_%CLEAR CHARACTER COUNTER IN HEADER_^1_%LFA- CPCLK,11,4,I START WRITE CLOCK_^1_%SFA- PCLOK,11,4,1_^1_%LFA* SAVRC,2,1_#GET FORMAT WRITE BI€€T FROM REQUEST CODE_^1_%SFA- PSTATS,1,1,1 SAVE IN STATUS FLAG_^1_%SAZ WR18_)SKIP IF REGULAR WRITE_^1_%ENA 8_^1_%SFA- PSTATS,8,4,1 SET SPECIAL FUNCTION STEP TO 8_^1WR18_!LRQ- WRLOCN,1_$PARAMETER LIST ADDRESS TO Q_^1_%XFQ 4_,ALSO TO R4_^1_%RTJ- (ANABS)_%GET REQUEST LENGTH_^1_%SFZ- LUWORD,12,1,4 SKIP IF CHARACTER MODE REQUEST_^1_%QLS 1_,TIMES 2 FOR # CHARACTERS_^1_%SRQ- WRLEN,1_€€%SAVE CHARACTER COUNT_^1_%RTJ INIPRT_'INITIALIZE PORT FOR I/O_^1_%JMP* WR24_^1WR20_!ENA 2_,COMPLETE WRITE WITH ERROR_^1_%RTJ* COMREQ_^1WR24_!JMP* (WRITE)_^1_%EJT_]_^1*************************************************************_^1*_8READ_=*_^1*_Z*_^1*_$READ REQUEST PROCESSOR_>*_^1*_$SETS UP PORT FOR NORMAL READ_8*_^1*_Z*_^1*_$ENTRY_O*_^1*_*1-REG= PORT TABLE LOCN_9*_^1*_*I-REG= PD€€T LOCN_@*_^1*_$RETURN_N*_^1*_*I-REG SAVED_D*_^1*************************************************************_^1READ_!NUM 0_^1_%LR2- ONEBIT+9_$PRE-SET ERROR CODE_^1_%SFZ- PSTATS,13,1,1 SKIP IF PORT NOT SET FOR UI_^1_%JMP* RE4_*ERROR_^1_%LRQ- RDLOCN,1_$ABSOLUTIZE REQUEST TO PORT_^1_%RTJ ABSRED_^1_%LRQ- RDLOCN,1_$PARAMETER LIST ADDRESS TO Q_^1_%LRA- RDLEN,1_%REQUEST LENGTH TO A_^1_%€€SFZ- LUWORD,12,1,Q SKIP IF CHARACTER MODE_^1_%ALS 1_,WORDS*2=CHARACTERS_^1_%SRA- RDLEN,1_%SAVE AS READ CHARACTER LENGTH_^1_%LFA- CPCLK,7,4,I_!START CLOCK_^1_%SFA- PCLOK,15,4,1_^1_%SEF- PSTATS,12,1,1 SET PORT READ BUSY_^1_%ENA 2_^1_%SFA- PSTATS,8,4,1 SET SPECIAL FUNCTION STEP TO 2 FOR PROMPT_^1_%LR2- RDBUF,1_%READ BUFFER ADDRESS TO R2_^1_%ENA 0_^1_%SRA- TERMCD,2_$CLEAR TERMINATI€€ON CODE IN HEADER_^1_%SRA- NREAD,2_%CLEAR INPUT BYTE COUNT_^1_%RTJ INIPRT_'INITIALIZE PORT FOR I/O_^1_%JMP* (READ)_'RETURN_^1RE4_"ENA 1_,PROCESS ERROR_^1_%RTJ* COMREQ_'COMPLETE READ WITH ERROR_^1_%JMP* (READ)_'RETURN_^1_%EJT_]_^1*************************************************************_^1*_8COMREQ_;*_^1*_$COMPLETE REQUEST ROUTINE_<*_^1*_$COMPLETES SPECIFIED REQUEST TYPES_3*_^€€1*_Z*_^1*_$ENTRY_O*_^1*_*A-REG= REQUEST TYPE TO COMPLETE_0*_^1*_,BT 0=1 COMPLETE READ_9*_^1*_,BT 1=1 COMPLETE WRITE_8*_^1*_,BT 2=1 COMPLETE UI_;*_^1*_*1-REG= PORT TABLE LOCATION_5*_^1*_*2-REG= STATUS TO RETURN TO REQUESTOR_+*_^1*_*I-REG= PDT LOCATION_<*_^1*_$RETURN_N*_^1*_*REGISTERS 1,2,I SAVED_:*_^1*_*A-REG= STATUS_B*_^1*_,BT 0=1 READ COMPLETED_8*_^1*_,BT 1=1 WRITE COMPLETED_7*_^1€€*_,BT 2=1 UI COMPLETED_:*_^1*************************************************************_^1COMREQ NUM 0_^1_%STA* TEMP3_(SAVE OPERATION CODE_^1_%ENA 0_^1_%STA* RETSTS_'CLEAR RETURN STATUS_^1CM8_"SFN- PSTATS,12,1,1 SKIP IF PORT READ BUSY_^1_%JMP* CM12_)CHECK FOR UI_^1_%SFN* TEMP3,0,1_#SKIP IF READ COMPLETION REQUESTED_^1_%JMP* CM12_)CHECK FOR UI_^1*_]_^1*_$PROCESS READ COMPLETION_€€^1*_]_^1_%CLF- PSTATS,12,1,1 CLEAR READ BUSY_^1_%ENQ 1_^1_%OMQ* RETSTS_'SET RETURN STATUS_^1_%JMP* CM16_^1CM12_!SFN- PSTATS,9,1,1 SKIP IF PORT UI IS BUSY_^1_%JMP* CM20_)CHECK FOR WRITE_^1_%SFN* TEMP3,2,1_#SKIP IF UI COMPLETION REQUESTED_^1_%JMP* CM20_)CHECK FOR WRITE_^1_%ENQ 4_^1_%OMQ* RETSTS_'SET RETURN STATUS_^1_%LFA- (ZERO),15,12,1 PICK UP UI LENGTH_^1_%SRA- RDLEN,1_%RESET U€€I LENGTH_^1CM16_!CLF- PSTATS,9,1,1 CLEAR UI BUSY_^1_%SEF- PCLOK,15,4,1 STOP READ CLOCK_^1_%CLF- PSTATS,14,1,1 CLEAR 'PROMPT NEEDED' FLAG_^1_%JMP* CM36_^1CM20_!SFN- PSTATS,11,1,1 SKIP IF PORT WRITE BUSY_^1_%JMP* CM32_)FINISHED WITH PORT_^1_%SFN* TEMP3,1,1_#SKIP IF WRITE COMPLETION REQUESTED_^1_%JMP* CM32_)FINISHED WITH PORT_^1*_]_^1*_$PROCESS WRITE COMPLETION_^1*_]_^1_%SEF- PCLOK,€€11,4,1 STOP WRITE CLOCK_^1_%CLF- PSTATS,11,2,1 CLEAR WRITE BUSY AND WRITE READ_^1_%ENQ 2_^1_%OMQ* RETSTS_'SET RETURN STATUS_^1_%JMP* CM36_^1_%SPC 2_^1TEMP3 NUM 0_^1RETSTS NUM 0_^1VFIELD NUM 0_^1_%SPC 2_^1CM32_!LDA* RETSTS_'RETURN STATUS_^1_%JMP* (COMREQ)_^1CM36_!ENA 0_^1_%STA* VFIELD_'CLEAR V-FIELD FLAG_^1_%S2Z CM38-*-1_$SKIP IF NO ERROR_^1_%RAO* VFIELD_'SET V-FIELD FLAG_€€^1CM38_!TRQ A_,CHECK TYPE OF COMPLETION_^1_%LR4- WRLOCN,1_$PRE-SET WRITE REQST LOCN_^1_%INA -2_^1_%SAZ CM40_)SKIP IF WRITE COMPLETION_^1_%LR4- RDLOCN,1_$CHANGE TO READ REQST LOCN_^1_%INA -2_^1_%SAZ CM52_)SKIP IF UI COMPLETION_^1CM40_!LDA* VFIELD_'READ OR WRITE COMPLETION_^1_%SFA- LUWORD,15,1,4_!SET V-FIELD IN REQUEST_^1_%JMP* CM56_^1CM52_!LRA- PAR2,1_'SET UP UI COMPLETION_^1_%€€SAN CM54_)SKIP IF COMPLETION ADDRESS SPECIFIED_^1_%JMP* CM8_^1CM54_!STA* COMPL_(SET COMPLETION ADDRESS_^1_%LFA- (ZERO),3,4,1 SET CP_^1_%SFA* CM64,3,4_^1_%LRQ- RDBUF,1_%SET BUFFER LOCN_^1_%JMP* CM60_^1CM56_!ENA 0_^1_%SRA- THRD,4_'CLEAR REQUEST THREAD_^1_%XF4 Q_^1_%RTJ- (ACABS)_^1_%SQN CM58_)SKIP IF COMPLETION ADDRESS SPECIFIED_^1_%JMP* CM8_^1CM58_!STQ* COMPL_(SET COMPLETION ADD€€RESS_^1_%XF4 Q_^1_%LFA- (ZERO),3,4,Q SET CP_^1_%SFA* CM64,3,4_^1_%RTJ- (ASABS)_%SET BUFFER LOCN_^1CM60_!XF2 A_,PUT ENTRY STATUS INTO REQUEST BUFFER_^1_%ARS 4_^1_%SFA- DSTAT1,15,12,Q_^1_%RTJ* UNFIX_(GET PORT NUMBER IN Q_^1_%LDA* VFIELD_^1_%ALS 15_^1_%AAQ Q_,SET V-FIELD + PORT NBR TO RETURN_^1_%RTJ- (AMONI)_%SCHEDULE COMPLETION_^1CM64_!NUM $5200_^1COMPL ADC 0_^1_%JMP* CM8_*P€€ROCESS ANY OTHER REQUECTS ON THIS PORT_^1_%EJT_]_^1*************************************************************_^1*_8ETRMNL_;*_^1*_Z*_^1*_$DIAGNOSTIC CLOCK ENTRY_>*_^1*_*ENTERED ONCE PER MINUITE FROM DTIMER_+*_^1*************************************************************_^1_%SPC 3_^1ETRMNL STQ- I_,SAVE PHYSTB ADDRESS_^1_%ENA 60_^1_%STA- EDCLK,I_%RESET CLOCK FOR 60 SECOND TIMEO€€UT_^1_%ENA 1_^1_%RTJ* TIME_)PROCESS READ CLOCKS_^1_%ENA 2_^1_%RTJ* TIME_)PROCESS WRITE CLOCKS_^1_%JMP- (ADISP)_%EXIT TO DISPATCHER_^1_%EJT_]_^1*************************************************************_^1*_8TIME_=*_^1*_Z*_^1*_$PROCESS SPECIFIED CLOCK FIELD IN ALL PORT TABLES._"*_^1*_$COMPLETS TIMED-OUT REQUESTS WITH ERROR._-*_^1*_$SCHEDULES WAIT RETURN ON WAIT EXPIRATION._+*_^€€1*_$SCHEDULES INITIATOR IF REQUEST COMPLETED._+*_^1*_$CLOCK FIELD BITS 03-00_>*_^1*_*=1000_!CLOCK OFF_>*_^1*_*=1110_!CLOCK EXPIRED_:*_^1*_*=1111_!CLOCK STOPPED_:*_^1*_]_^1*_$ENTRY_O*_^1*_*A-REG= 1 PROCESS READ CLOCKS_3*_^1*_/= 2 PROCESS WRITE CLOCKS_2*_^1*_*I-REG= PDT LOCATION_<*_^1*_$RETURN_N*_^1*_*REGISTERS 2,3,I SAVED_:*_^1********************************************************€€*****_^1TIME_!NUM 0_^1_%XFA 4_,OPERATION CODE IN 4-REG_^1_%LDA =XPORTS_%SET 1-REG TO FIRST PORT TABLE_^1_%XFA 1_^1_%LRA* FLDSTR,4_$MODIFY FIELD INSTRUCTIONS AT TIM4, TIM12_^1_%SFA* TIM4+1,15,4_!SET CLOCK FIELD POSITION PER CLOCK TYPE_^1_%SFA* TIM12+1,15,4_^1TIM4_!LFA- PCLOK,15,4,1 GET CLOCK_^1_%TRA Q_^1_%AND- ONEBIT+3_^1_%SAZ TIM8_)SKIP IF CLOCK IS RUNNING_^1_%JMP* TIM28_(CL€€OCK NOT RUNNING OR NOT ON_^1TIM8_!TRQ A_^1_%INA -1_+DECREMENT CLOCK_^1TIM12 SFA- PCLOK,15,4,1_^1_%SAM TIM16_(SKIP IF CLOCK EXPIRED_^1_%JMP* TIM28_(CLOCK NOT EXPIRED_^1TIM16 LR2- ONEBIT+10_#SET TIMEOUT STATUS_^1_%XF4 A_^1_%RTJ COMREQ_'COMPLETE REQUEST_^1TIM28 XF1 A_,BUMP PORT TABLE LOCN_^1_%ADD =XPLENTH_^1_%XFA 1_^1_%SUB =XEPORTS_^1_%SAP TIM32_(SKIP IF END OF PORTS_^1_%€€JMP* TIM4_)CHECK NEXT PORT_^1TIM32 LDA- $EF_*SET CP_^1_%SFA* TIM36+1,3,4_^1_%XFI Q_^1TIM36 RTJ- (AMONI)_%SCHEDULE INITIATOR_^1_%NUM $5200_^1_%ADC ITRMNL_^1_%JMP* (TIME)_^1_%SPC 2_^1FLDSTR NUM 0_,CLOCK FIELD START VALUES_^1_%NUM 15_+READ_^1_%NUM 11_+WRITE_^1_%EJT_]_^1*************************************************************_^1*_8ABSRED_;*_^1*_Z*_^1*_$ABSOLUTIZE READ REQ€€UEST INTO PORT TABLE_-*_^1*_Z*_^1*_$ENTRY_O*_^1*_*1-REG= PORT TABLE LOCN_9*_^1*_*I-REG= PDT LOCN_@*_^1*_*Q-REG= REQUEST LOCN_<*_^1*_$RETURN_N*_^1*_*REGISTERS 1,2,3,I SAVED_8*_^1*************************************************************_^1ABSRED NUM 0_^1_%XFQ 4_,SAVE REQST LOCN_^1_%RTJ- (ANABS)_^1_%SRQ- RDLEN,1_%SET N_^1_%XF4 Q_^1_%RTJ- (ASABS)_^1_%SRQ- RDBUF,1_%SET S_^1_%XF4 €€ Q_^1_%RTJ- (ACABS)_^1_%SRQ- PAR2,1_'SET C_^1_%XF4 Q_^1_%LDA- (ZERO),Q_^1_%SFA- (ZERO),3,4,1 STORE IN PORT TABLE WORD 0 BITS 3-0_^1_%JMP* (ABSRED)_^1_%EJT_]_^1*************************************************************_^1*_8FIXONE_;*_^1*_Z*_^1*_$CONVERTS PORT NUMBER TO PORT TABLE ADDRESS_**_^1*_Z*_^1*_$ENTRY_O*_^1*_*1-REG= PORT NBR_@*_^1*_$RETURN_N*_^1*_*1-REG= PORT TABLE LOCN_€€9*_^1*_*REGISTERS 2,3,4,I SAVED_8*_^1*************************************************************_^1FIXONE NUM 0_^1_%XF1 A_^1_%MUI =XPLENTH_$PORT NBR * PORT TABLE LENGTH_^1_%ADD =XPORTS_%ADD START LOCN_^1_%XFA 1_^1_%JMP* (FIXONE)_^1_%EJT_]_^1*************************************************************_^1*_8UNFIX_<*_^1*_Z*_^1*_$CONVERTS PORT TABLE LOCATION TO PORT NUMBER_)*_^€T1*_$ENTRY_O*_^1*_*1-REG= PORT TABLE LOCN_9*_^1*_$RETURN_N*_^1*_*Q-REG= PORT NBR_@*_^1*_*REGISTERS 1,2,3,4,I SAVED_6*_^1*************************************************************_^1UNFIX NUM 0_^1_%XF1 A_^1_%SUB =XPORTS_%SUBTRACT START OF TABLES_^1_%CLR Q_^1_%DVI =XPLENTH_$DIVIDE BY LENGTH_^1_%TRA Q_^1_%JMP* (UNFIX)_^1_%END_]_^__ TPTRMIOR CSY/ D74 P€1_%NAM TRMIOR_'DECK-ID D74 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$TERMINAL DRIVER I/O PROCESSOR_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1*_$CONTINUATOR AND I/O ROUTINES FOR ITOS TERMINAL DRIVER_^1_%SPC 3_^1*_$ENTRY POINTS_^1_%SPC 1_^1_%ENT CTRMNL_'CONTINUATOR_^1_%ENT INIPRT_'ROU€€TINE TO INITIALIZE PORT FOR I/O_^1_%SPC 3_^1*_$EXTERNALS_^1_%SPC 1_^1_%EXT COMREQ_'COMPLETE REQUEST ROUTINE_^1_%EXT ITRMNL_'DRIVER INITIATOR_^1_%EXT EPORTS_'LAST ADDRESS +1 OF PORT TABLES_^1_%EXT S1811T_'1811 CONSOLE CRT STATUS ROUTINE_^1_%EXT I1811T_'1811 CONSOLE INITIALIZATION ROUTINE_^1_%EXT M1811T_'1811 CONSOLE MODE SET ROUTINE_^1_%EXT PROMTR_^1_%EXT PORTS_(START OF P€€ORT TABLES_^1_%EXT PLENTH_'PORT TABLE LENGTH_^1_%SPC 3_^1*_$EQUIVALENCES_^1_%SPC 1_^1_%EQU AMONI($F4)_^1_%EQU ADISP($EA)_^1_%EQU LPMASK(3)_^1_%EQU NZERO($12)_^1_%EQU ONEBIT($23)_^1_%EQU ZERO($22)_^1_%EQU ONE(ONEBIT)_^1_%EQU TWO(ONEBIT+1)_^1_%EJT_]_^1*_$EQUIVALENCES- PHYSICAL DEVICE TABLE_^1*_$------------_^1_%EQU ELVN(0)_%SCHEDULER CALL_^1_%EQU EDIN(1)_%DRIVER INITIATO€€R_^1_%EQU EDCN(2)_%DRIVER CONTINUATOR_^1_%EQU EDPGM(3)_$NOT USED_^1_%EQU EDCLK(4)_$NOT USED_^1_%EQU ELU(5)_'CURRENT LU_^1_%EQU EPTR(6)_%NOT USED_^1_%EQU EWES(7)_%NOT USED_^1_%EQU EREQST(8)_#NOT USED_^1_%EQU ESTAT1(9)_#NOT USED_^1_%EQU ECCOR(10)_#NOT USED_^1_%EQU ELSTWD(11)_"NOT USED_^1_%EQU ESTAT2(12)_"LAST EQUIP STATUS FROM CP_^1_%EQU MASLGN(13)_"NOT USED_^1_%EQU MASS€€EC(14)_"NOT USED_^1_%EQU RETURN(15)_"NOT USED_^1_%EQU CPCLK(16)_#15-12 NOT USED_^1*_811-08 WRITE CLOCK VALUE_^1*_807-04 NORMAL READ CLOCK VALUE_^1*_803-00 UI READ CLOCK VALUE_^1*_OF MEMORY TO BE DUMPED._^1*_<= $00 IF THE FIRST 65K IS TO BE DUMPED_^1*_>$20 IF THE SECOND 65K IS TO BE DUMPED_^1*_>$40 IF THE THIRD 65K IS TO BE €€DUMPED_^1*_>$60 IF THE FOURTH 65K IS TO BE DUMPED_^1*_>FOR ALL THE ABOVE VALUES OF BPR THE_^1*_>SCRATCH PAGE REGISTER MUST BE SET AND_^1*_>THE LOGICAL ADDRESS ADJUSTED TO USE_^1*_>THE SCRATCH PAGE REGISTER._^1*_>HOWEVER, IF_^1*_8BPR = $FFFF THE PAGE REGISTERS ARE ALREADY_^1*_>SET UP AND THE LOGICAL ADDRESS NEED NOT_^1*_=BE ADJUSTED_^1*_8SCRPAG = THE SCRATCH PAGE REGISTER ADDRESS_^1€€*_AIN THE TOP 5 BITS, ZERO IN THE_^1*_ABOTTOM 11 BITS._^1GETWD 0_"0_,Q= TTTTTBBBBBBBBBBB_^1_%LDA* BPR_^1_%SAM GET10_(SKIP IF PAGE REGS AND LOG ADD ARE ALREADY SET._^1_%CLR A_^1_%LLS 5_,Q= BBBBBBBBBBB00000 , A= 00000000000TTTTT_^1_%ADD* BPR_*A= 00000000000XXXXX ,WHERE XXXXX = TTTTT+BPR_^1_%QLS 11_+Q= 00000BBBBBBBBBBB_^1_%ADD* SCRPAG_'A= SSSSS000000XXXXX_^1_%ADQ* SCRPAG_'Q= SSSS€€SBBBBBBBBBBB_^1_%WPR A_,WRITE INTO THE SCRATCH PAGE_^1GET10 LDA* (ZERO),Q_$GET THE WORD TO DUMP FROM MEMORY_^1_%JMP* (GETWD)_%RETURN_^1_%EJT_]_^1LOGABS 0_"0_^1*_;FUNCTION_^1*_;--------_^1*_]_^1*_$THIS SUBROUTINE COMPUTES THE PHYSICAL ADDRESS (18 BITS)_^1*_$OF A LOCATION USING ITS LOGICAL ADDRESS (16 BITS)_^1*_]_^1*_]_^1*_6INPUT REQUIREMENT_^1*_6------------------_^1*_]_^1*_$THE €€LOGICAL ADDRESS (16 BITS) IS PASSED IN THE Q REGISTER._^1*_]_^1*_* EQUIPME€€NT * N.A.*<-- CONTROL ->*_^1*_]_^1*_]_^1*_5*************_^1*_5* Q CONTROL *_^1*_5*************_^1*_]_^1*_(Q4 Q3 Q2 Q1 Q0_$OUTPUT_-INPUT_^1*_(-- -- -- -- --_$------_------_^1*_)1 0 0 0 0_$CLEAR CONTROLLER_!DYNAMIC STATUS_^1*_)0 0 0 0 1_$DIRECTOR FUNCTION_^1*_)0 0 0 1 0_$LOAD FWA_*CURRENT WORD_^1*_)0 0 0 1 1_$BANK SELECT_'CURRENT BANK_^1*_)0 0 1 0 0_$LOAD FILE ADD€€RESS FILE STATUS_^1*_)0 0 1 0 1_$SENSE/ASS NXT RDY TRANSPORT STAT._^1*_)0 0 1 1 0_$UNIT SELECT_^1*_)0 0 1 1 1_$LOAD BLOCK LENGTH_^1*_)0 1 0 0 0_$BUS CONNECT_^1*_)0 1 0 0 1_$INTERRUPT REQUEST_^1*_]_^1*_3*********************_^1*_3* DIRECTOR FUNCTION *_^1*_3*********************_^1*_)A REGISTER VALUE_$FUNCTION_^1*_)----------------_$--------_^1*_10_,READ DATA_^1€€*_11_,ADVANCE RECORD_^1*_12_,SEARCH FILE MARK FORWARD_^1*_13_,SEARCH FILE MARK BACKWARD_^1*_14_,BACKSPACE RECORD_^1*_15_,WRITE DATA_^1*_16_,WRITE FILE MARK_^1*_17_,REWIND_^1*_18_,FIXED ERASE_^1*_19_,VARIABLE ERASE_^1*_0$A_,CONTROLLED BACKSPACE_^1*_0$B_,REWIND OFF-LINE_^1*_/$20_,LOW THRESHOLD READ_^1*_]_^1*_3******************_^1*_3* DYNAMIC STATUS *_^1*_3******************_^1*_]_^1€€*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,UNIT READY_^1*_11_,CONTROLLER BUSY_^1*_12_,INTERRUPT_^1*_13_,ALARM_^1*_]_^1*_14_,NOT ASSIGNED_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,END OF TAPE_^1*_]_^1*_18_,END OF OPERATION_^1*_19_,FILE MARK_^1*_010_,NOT ASSIGNED_^1*_011_,CORRECTED ERROR_^1*_]_^1*_012_,ON-BUS_^1*_013_,NOT ASSIGNED_^1*_014_,CONTROLLER PROTECTED_^1*_€€015_,BUS BUSY_^1*_]_^1*_7**********_^1*_7* ESTAT2 *_^1*_7**********_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,UNIT READY_^1*_11_,CONTROLLER BUSY_^1*_12_,INTERRUPT_^1*_13_,ALARM_^1*_]_^1*_14_,NOT ASSIGNED_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,NOT ASSIGNED_^1*_]_^1*_18_,END OF OPERATION_^1*_19_,END OF TAPE_^1*_010_,NOT ASSIGNED_^1*_011_,FILE MARK_^1*_]€€_^1*_012_,ON-BUS_^1*_013_,NOT ASSIGNED_^1*_014_,CONTROLLER PROTECTED_^1*_015_,BUS BUSY_^1*_]_^1*_]_^1*_7****************_^1*_7* ALARM STATUS *_"(FILES 10,11)_^1*_7****************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,TAPE DATA ERROR_^1*_11_,TAPE DATA ERROR_^1*_12_,TAPE DATA ERROR_^1*_13_,TAPE PARITY ERROR (ONLY PE)_^1*_]_^1*_14_,NO CHARACTER READ IN 25 FEET€€_^1*_15_,FILL_^1*_16_,FORMATTER REJECT_^1*_17_,BUS RELINQUISHED_^1*_]_^1*_18_,LOST DATA_^1*_19_,MEMORY PROTECT FAULT_^1*_010_,MEMORY ADDRESS ERROR_^1*_011_,MEMORY PARITY ERROR_^1*_]_^1*_012_,TRANSMISSION PARITY ERROR_^1*_013_,NOT ASSIGNED_^1*_014_,NOT ASSIGNED_^1*_015_,NOT ASSIGNED_^1*_]_^1_(EJT_^1*_]_^1*_5********************_^1*_5* TRANSPORT STATUS *_^1*_5********************_^1*€€_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,NOT ASSIGNED_^1*_11_,NRZI_^1*_12_,SPEED 50 IPS_^1*_13_,TRANSPORT CODE_^1*_]_^1*_14_,TRANSPORT CODE_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,NOT ASSIGNED_^1*_]_^1*_18_,REWINDING_^1*_19_,LOAD POINT_^1*_010_,WRITE PROTECTED_^1*_011_,NOT ASSIGNED_^1*_]_^1*_012_,NOT ASSIGNED_^1*_013_,NOT ASSIGNED_^1*_014_,DESELECT_^1*_0€€15_,OFF-LINE_^1*_]_^1*_]_^1*_0BITS_!4 3_"TRANSPORT_^1*_0-----------_"---------_^1*_70 0_"7 TRACK NRZI_^1*_70 1_"9 TRACK DUAL MODE_^1*_71 0_"9 TRACK NRZI_^1*_71 1_"9 TRACK PHASE ENCODING_^1*_]_^1_(EJT_^1****_]_^1*_]_^1*_]_^1PH7REC_!EQU_$PH7REC(3072) MAXIMUM PHYSICAL RECORD SIZE - 7 TRACK_^1IDRIVE_!EQU_$IDRIVE(*)_!COMMON EXIT ADDRESS (READ ENTRY)_^1MGREAD_!NUM_$0_*DRIVER ENTRY F€€OR DTLP-READ % REWIND_^1_(SAN_$READOP_^1_(JMP*_#REMOT_%SET MOTION REQUEST FOR REWIND_^1READOP_!JMP*_#RDWR_'SET FREAD REQUEST_^1MGDRIV_!NUM_$0_*DRIVER ENTRY FOR DTLP-WRITE DATA % EOF_^1_(LDQ*_#MGDRIV_$RETURN ADDRESS FOR WRITE_^1_(STQ*_#IDRIVE_^1_(SAN_$WRITOP_^1_(JMP*_#EOFMOT_$SET MOTION REQUEST FOR WRITE EOF % REWIND_^1WRITOP_!TCA_$A_*REG A < 0 FOR WRITE REQUEST_^1_(JMP*_#RDWR_'SET €€FWRIT REQUEST_^1RDWR_#SAP_$RDREQ_%SKIP IF READ REQUEST_^1_(TCA_$A_^1_(STA_$PLCTT0+10_"STA- ECCOR,I CURRENT LOC. IN BUFFER_^1_(LDA_$=XPH7REC_"GET BUFFER LENGTH_^1_(STA*_#NWMOT_%STORE NUMBER OF WORDS_^1_(LDA*_#FWRITE_^1_(STA*_#REQCOD_$SET FWRITE REQUEST CODE_^1_(JMP*_#STAREQ_$COUNTINUE BUILDING DUMMY REQUEST_^1RDREQ CLR Q_^1_%STQ- ESTAT1,I_^1_%STQ- FLTCOD,I_^1_%SAP GET_^1_%TCA €€ A_,IF NEGATIVE,ASCII MODE_^1GET_"STA PLCTT0+10_^1_%LDA =XPH7REC_$GET BUFFER LENGTH_^1_(STA*_#NWMOT_%STORE NUMBER OF WORDS_^1_(LDA*_#FREAD_^1_(STA*_#REQCOD_$SETFREAD REQUEST CODE_^1_(JMP*_#STAREQ_$COUNTINUE BUILDING DUMMY REQUEST_^1REMOT_"LDA*_#REWC_^1_(STA*_#NWMOT_%SET REWIND CODE_^1_(JMP*_#STMOT_%COUNTINUE MOTION_^1EOFMOT_!LDA*_#EOFRWC_^1_(STA*_#NWMOT_%SET END OF FILE % REWIND €€CODE_^1STMOT_"LDA*_#MOTION_^1_(STA*_#REQCOD_$SET MOTION REQUEST CODE_^1_(JMP_$STAREQ_$CONTINUE BUILDING DUMMY REQUEST_^1*_]_^1MOTION_!NUM_$$1C00_%MOTION REQUEST CODE_^1FREAD_"NUM_$$0800_%FREAD REQUEST CODE_^1FWRITE_!NUM_$$0C00_%FWRIT REQUEST CODE_^1*_]_^1REWC_#NUM_$$3000_%REWIND CODE FOR MOTION REQ._^1EOFRWC_!NUM_$$2300_%WRITE EOF % REWIND CODES FOR MOTION REQ._^1ISAVE_"NUM_$0_*SAV€€E I REGISTER_^1ASAVE NUM 0_^1*_]_^1REQCOD_!NUM_$0_*REQUEST CODE_^1COMP_#NUM_$0_*COMPLITION ADDRESS_%(NOT USED)_^1THRD_#NUM_$0_*THREAD_^1VMALU_"NUM_$0_*V-FEILD,MODE,LOGICAL-UNIT_^1NWMOT_"NUM_$0_*NUMBER OF WORDS OR MOTION CODES_^1STADD_"NUM_$0_*STARTING ADDRESS_^1*_]_^1STAREQ_!EQU_$STAREQ(*)_!CONTINUE BUILDING THE REQUEST_^1_(LDQ-_#I_*SAVE I REG. FOR RETURN_^1_(STQ*_#ISAVE_^1_(RTJ*€€_#HERE_^1HERE_#NUM_$0_*GET THE CURRENT ADDRESS_^1_(LDQ*_#HERE_^1_(ADQ_$=XPLCTT0-HERE CALCUALTE ADDRESS OF PDT_^1_(STQ-_#I_*SAVE PDT ADDRESS IN I REG._^1_(STQ*_#CURPDT_$UPDATE CURRENT PDT_^1_(LDQ-_#ECCOR,I_#GET STARTING BUFFER ADDRESS_^1_(STQ-_#ABUFF,I_#STARTING ADDRESS_^1_'STQ*_$STADD_%STARTING ADDRESS IN PSEUDO REQUST_^1_(ADQ*_#NWMOT_%ADD NUMBER OF WORDS_^1_(STQ-_#ELSTWD,I_"SAVE €€ IN LAST WORD ADDRESS_^1_(LDA*_#HERE_^1_(SUB_$=XHERE-REQCOD CALCULATE ADDRESS OF PSEUDO REQUEST_^1_(STA-_#EPTR,I_$SAVE IN REQUEST PARAMETER LOCATION_^1*_]_^1_(ENQ_$2_*FORMAT REQUEST_^1_(LDA*_#REQCOD_$GET REQUEST CODE_^1_(ALS_$5_^1_(SAP_$RD_(SKIP IF READ REQUEST_^1_(INQ_$1_)SET BIT FOR WRITE REQUEST_^1RD_%STQ-_#ESTAT1,I_"SAVE IN PDT_^1_(RTJ_$KLCTT_%PROCEED WITH PRESENT REQUEST_^1_(€€EJT_^1*_]_^1*_4*********_^1*_4* DLCTT *_^1*_4*********_^1*_]_^1* ENTERED BY REQUEST PROCESSOR_^1*_]_^1* FUNCTION:_^1*_'FIND NEXT REQUEST AND CALL KERNEL, UPON RETURN IF ERROR_^1*_'AND NOT DLU, LOG IT AND CALL ALTDEV. IF NO ERROR COMPLETE_^1*_'THE REQUEST._^1*_'IF MULTI PDT SEARCH ALL TABLES FOR REQUESTS BEFORE GIVING_^1*_'UP CONTROL TO DISPATCHER._^1*_]_^1_(LDA-_#ESTAT1,I_"CHECK FO€€R ERROR_^1_%SAP I21_^1_(LDA-_#ESTAT2,I_"IS END OF FILE READ_^1_(AND_$=XM0800_^1_(SAN_$EOF_(SKIP IF NO E.O.F._^1_(CLR_$A_^1_(LDQ-_#ESTAT2,I_"GET LAST HARDWARE STATUS_^1_(JMP*_#EXIT_^1I21_"JMP* I20_^1EOF_"CLR A,Q_^1EXIT_!STA* ASAVE_^1_%LDA* ISAVE_^1_%STA- I_^1_%LDA* ASAVE_^1_%JMP (IDRIVE)_$RETURN FOR DTLP_^1I20_$SET_$A,Q_(COMPLETE DTLP REQUEST_^1_(JMP*_#EXIT_^1*_]_^1CURPDT_!NUM_$0€€_*CURRENT PDT ADDRESS_^1UMODE_"EQU_$UMODE($0080) UNIT % SELECT CODE_^1LNLCTT_!EQU_$LNLCTT(0)_!DRIVER LENGTH_^1SLCTT_"EQU_$SLCTT($7FFF) STORAGE SECTOR NUMBER_^1MTEWES_!EQU_$MTEWES($601) EQUIPMENT CODE NUMBER_^1*_'PHYSICAL DEVICE TABLE FOR LCTT - UNIT 0_^1*S2_]_^1BFLCTT_!BSS_$BFLCTT(PH7REC*4/3+2) PACK/UNPACK BUFFER FOR 7 TRACK_^1PLCTT0_!NUM_$0_$00 ELVL_!- SCHEDULER CALL_$NOT USED_^€€1_(NUM_$0_$01 EDIN_!- INITIATOR ADDRESS_!N/U_^1_(NUM_$0_$02 EDCN_!- CONTINUATOR ADDRESS N/U_^1_(NUM_$0_$03 EDPGN - ERROR ADDRESS_%N/U_^1_(NUM_$0_$04 EDCLK - DIAGNOSTIC CLOCK_"N/U_^1_%NUM 10_+05 ELU - LOGICAL UNIT_^1_(NUM_$0_$06 EPTR_!- PARAMETER ADDRESS_^1EWES_#EQU_$EWES(*)_#EQUIPMENT CODE LOCATION (FOR DTLP)_^1EWES1_"EQU_#EWES1(*)_#EQUIPMENT CODE LOCATION (FOR DTLP)_^1EMT€€APE_!ADC_$MTEWES 07 EWES_!- CONVERTER,EQUIPMENT,STATION_^1_(NUM_$$0E06 08 EREQST - REQUEST STATUS_^1_(NUM_$0_$09 ESTAT1 - DRIVER STATUS_^1_(NUM_$0_$10 ECCOR - CURRENT LOCATION IN BUFFER_^1_(NUM_$0_$11 ELSTWD - LAST LOCATION OF BUFFER PLUS ONE_^1_(NUM_$0_$12 ESTAT2 - DEVICE STATUS_^1_(ADC_$LNLCTT 13 MASLGN - DRIVER LENGTH_%N/U_^1_(ADC_$SLCTT 14 MASSEC - MASS STORAGE SECTO€€R NUMBER N/U_^1_(NUM_$0_$15 RETURN - RETURN ADD.FOR FNR,MAKQ,COMPRQ N/U_^1_(NUM_$0_$16 FLTCOD - FAULT CODE_^1_(NUM_$0_$17 DIAGLU - DIAGNOSTIC LU._(N/U_^1_(NUM_$0_$18 GHOSTI - GHOST INTERRUPTS COUNT N/U_^1_(NUM_$0_$19 MICROI - MICRO INTERRUPT NUMBER N/U_^1_(NUM_$0_$20 TIMOUT - INTERRUPT TIMEOUT VALUE_"N/U_^1_(NUM_$0_$21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_(NUM_$0_$22 SIN€€TER - STATUS AFTER INTERRUPT_^1_(NUM_$0_$23 STIMEO - STATUS AFTER TIMEOUT ERROR_^1_(NUM_$0_$24 TRNSPT - TRANSPORT STATUS_^1_(NUM_$0_$25 RTRECV - RETURN FOR RECOVERY_^1_(NUM_$0_$26 OUTARG - A REGISTER AT LAST OUTPUT_^1_(NUM_$0_$27 OUTQRG - Q REGISTER AT LAST OUTPUT_^1_(ADC_#(UMODE) 28 UNTMOD - UNIT AND MODE SELECT CODE_^1_(NUM_$0_$29 QSTWD4 - WORD 4 OF REQUEST_^1_(NUM_$0_$30 €D RCNTFG - RECOVERY COUNT FLAG_^1_(NUM_$0_$31 RFLAG - RECOVERY FLAG BIT 15 = 1 - DISABLE_^1_(ADC_$PH7REC 32 PHSREC - MAXIMUM PHYSICAL RECOD SIZE 7-TRK._^1_(ADC_$BFLCTT 33 ABUFF - PACK/UNPACK BUFFER ADDRESS 7-TRK._^1_(NUM_$0_$34 ALRMST - ALARM STATUS WORD_^1_(NUM_$0_$35 ELINK - NEXT UNIT PDT_-N/U_^1*S2_]_^1_(END_^__DPQ18326 CSY/ D80 P€1_%NAM Q18326_'DECK-ID D80 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_'INITIALIZER DRIVER FOR 7 AND 9 TRACK LOW COST MAGNETIC TAPE_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1*_]_^1****_]_^1*_.INITIALIZER LCTT DRIVER_^1*_.***********************_^1*_]_^1*_'L C T T_!M A G_!T A P E_^1*_]_^1*_7FUNCTI€€ON_^1*_7--------_^1*_]_^1*_'THE KERNEL DRIVER PROCESSES MSOS/RTOS REQUESTS FOR_^1*_'THE LCTT MAG TAPE._^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_'THE KERNEL DRIVER INTERFACES BETWEEN THE OPERATING_^1*_'SYSTEM AND THE KERNEL FOR THE LCTT MAG TAPE. THE_^1*_'DRIVER FINDS NEXT REQUEST, CALLS THE KERNEL TO_^1*_'PROCESS THE REQUEST, PREPARES THE V-FIELD OF Q,_^1*_'LOGS €€ERRORS IN ENGINEERING FILE, AND CALLS THE_^1*_'ALTERNATE DEVICE HANDLER WHEN ERRORS OCCUR AND THE_^1*_'LOGICAL UNIT IS NON DIAGNOSTIC._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS MAKEQ TO SET V FIELD OF REQUEST_^1*_'2. CALLS LOG TO OUTPUT LU AND FAULT C€€ODE_^1*_'3. CALLS ALTERNATE DEVICE HANDLER TO OUTPUT_^1*_*ERROR MESSAGE TO OPERATOR_^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. ILCTT ENTRY - SCHEDULED BY THE REQUEST PROCESSOR_^1*_*Q REGISTER CONTAINS THE ADDRESS OF PDT WITH THE_^1*_*REQUEST_^1*_'2. I20 ENTRY - REQUEST COMPLETION ENTRY WHEN EOF_^1*_*OR END OF TAPE ENCOUNTERED_^1*_'3. NEXUNI ENTRY - PROCESS NEXT UNIT €€ENTRY AFTER_^1*_*REWIND CHECK_^1*_'4. EXIT - TO DISPATCHER WHEN DRIVER STILL NEEDED_^1*_*FOR REWIND CHECK ; TO MAS300 TO RELEASE DRIVER_^1*_*WHEN MASS RESIDENT (MSOS)_^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_'1. CHECK IF DRIVER BUSY, IF IT IS EXIT TO DISPATCHER._^1*_*IF NOT BUSY SET DRIVER BUSY, SAVE PDT ADDRESS IN I_^1*_*AND UPDATE ALTDEV SCHEDULER CALL._^1*_'2. IF UNIT REWINDING SKIP €€IT AND CHECK IF ANY UNIT_^1*_*THAT IS NOT REWINDING WANTS IN._^1*_'3. FIND NEXT REQUEST, IF NONE CHECK IF ANY UNIT WHICH_^1*_*IS NOT REWINDING WANTS IN._^1*_'4. CALL KERNEL TO PROCESS REQUEST. ON RETURN CALL_^1*_*MAKEQ. ON RETURN IF ERROR AND NOT DLU CALL LOG,_^1*_*SCHEDULE ALTDEV AND CHECK IF ANOTHER UNIT WANTS_^1*_*IN._^1*_'5. COMPLETE THE REQUEST AND CHECK IF ANOTHER REQUEST_^1*€€_*IS WAITING FOR THIS UNIT._^1*_]_^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'FNR - FIND NEXT REQUEST_^1*_'KLCTT - LCTT KERNEL_^1*_'MAKEQ - MAKE V-FIELD OF Q_^1*_'LOG - LOG ERROR IN ENGINEERING FILE_^1*_'ALTDEV - ALTERNATE DEVICE HANDLER_^1*_'COMPRQ - COMPLETE REQUEST_^1*_]_^1*_]_^1*_7PARAMETERS_^1*_]_^1*_7----------_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(€€ENT_$CURPDT_+CURRENT PDT ADDRESS_^1_(ENT_$I20_^1_(SPC_$1_^1_(SPC_$1_^1_(ENT_$QMTAPE_$ENTRY FOR SILP PROGRAM_^1_(ENT_$EMTAPE_$EQUIPMENT CODE LOCATION_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#KLCTT_,DRIVER KERNEL ENTRY_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M0800_"EQU_$M0800($800)_#ONEBIT+11_^1*_]_^1*_]_^1***_$PHYSICAL DEVIC€€E TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1*_$EQU EWES(7)_+CONVERTER, EQUIPMENT,STATION_^1_(EQU_€€$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU€€(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1€€_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRC€€K_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1*_]_^1*_7MESSAGES_^1*_7--------_^1*_]_^1*_'ALTERNATE DEVICE HANDLER WILL PRINT FAULT CODE_^1*_'FOR NON-DIAGNOSTIC LOGICAL UNITS._^1*_]_^1*_]_^1*_7MISCELLANEOUS_^1*_7-------------_^1*_]_^1*_'CYBER 18 LCTT - FORMATTER CONTROLLER REGISTER DEFINITIONS_^1*_]_^1*_]_^1*_3*********************_^1*_3* Q REGISTER FO€€RMAT *_^1*_3*********************_^1*_]_^1*_'-------------------------------------------------_^1*_'*15*14*13*12*11*10*09*08*07*06*05*04*03*02*01*00*_^1*_'-------------------------------------------------_^1*_'*<----- W ---->* EQUIPMENT * N.A.*<-- CONTROL ->*_^1*_]_^1*_]_^1*_5*************_^1*_5* Q CONTROL *_^1*_5*************_^1*_]_^1*_(Q4 Q3 Q2 Q1 Q0_$OUTPUT_-INPUT_^1*_(-- -- -- €€-- --_$------_------_^1*_)1 0 0 0 0_$CLEAR CONTROLLER_!DYNAMIC STATUS_^1*_)0 0 0 0 1_$DIRECTOR FUNCTION_^1*_)0 0 0 1 0_$LOAD FWA_*CURRENT WORD_^1*_)0 0 0 1 1_$BANK SELECT_'CURRENT BANK_^1*_)0 0 1 0 0_$LOAD FILE ADDRESS FILE STATUS_^1*_)0 0 1 0 1_$SENSE/ASS NXT RDY TRANSPORT STAT._^1*_)0 0 1 1 0_$UNIT SELECT_^1*_)0 0 1 1 1_$LOAD BLOCK LENGTH_^1*_)0 €€ 1 0 0 0_$BUS CONNECT_^1*_)0 1 0 0 1_$INTERRUPT REQUEST_^1*_]_^1*_3*********************_^1*_3* DIRECTOR FUNCTION *_^1*_3*********************_^1*_)A REGISTER VALUE_$FUNCTION_^1*_)----------------_$--------_^1*_10_,READ DATA_^1*_11_,ADVANCE RECORD_^1*_12_,SEARCH FILE MARK FORWARD_^1*_13_,SEARCH FILE MARK BACKWARD_^1*_14_,BACKSPACE RECORD_^1*_15_,WRITE DATA_^1*_16_,WRITE FILE€€ MARK_^1*_17_,REWIND_^1*_18_,FIXED ERASE_^1*_19_,VARIABLE ERASE_^1*_0$A_,CONTROLLED BACKSPACE_^1*_0$B_,REWIND OFF-LINE_^1*_/$20_,LOW THRESHOLD READ_^1*_]_^1*_3******************_^1*_3* DYNAMIC STATUS *_^1*_3******************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,UNIT READY_^1*_11_,CONTROLLER BUSY_^1*_12_,INTERRUPT_^1*_13_,ALARM_^1*_]_^1*_14_,NOT ASSIGNED_^1€€*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,END OF TAPE_^1*_]_^1*_18_,END OF OPERATION_^1*_19_,FILE MARK_^1*_010_,NOT ASSIGNED_^1*_011_,CORRECTED ERROR_^1*_]_^1*_012_,ON-BUS_^1*_013_,NOT ASSIGNED_^1*_014_,CONTROLLER PROTECTED_^1*_015_,BUS BUSY_^1*_]_^1*_7**********_^1*_7* ESTAT2 *_^1*_7**********_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,UNIT READY_^1*_11_,C€€ONTROLLER BUSY_^1*_12_,INTERRUPT_^1*_13_,ALARM_^1*_]_^1*_14_,NOT ASSIGNED_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,NOT ASSIGNED_^1*_]_^1*_18_,END OF OPERATION_^1*_19_,END OF TAPE_^1*_010_,NOT ASSIGNED_^1*_011_,FILE MARK_^1*_]_^1*_012_,ON-BUS_^1*_013_,NOT ASSIGNED_^1*_014_,CONTROLLER PROTECTED_^1*_015_,BUS BUSY_^1*_]_^1*_]_^1*_7****************_^1*_7* ALARM STATUS *_"(FILES€€ 10,11)_^1*_7****************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,TAPE DATA ERROR_^1*_11_,TAPE DATA ERROR_^1*_12_,TAPE DATA ERROR_^1*_13_,TAPE PARITY ERROR (ONLY PE)_^1*_]_^1*_14_,NO CHARACTER READ IN 25 FEET_^1*_15_,FILL_^1*_16_,FORMATTER REJECT_^1*_17_,BUS RELINQUISHED_^1*_]_^1*_18_,LOST DATA_^1*_19_,MEMORY PROTECT FAULT_^1*_010_,MEMORY ADDRESS ERROR_^1*€€_011_,MEMORY PARITY ERROR_^1*_]_^1*_012_,TRANSMISSION PARITY ERROR_^1*_013_,NOT ASSIGNED_^1*_014_,NOT ASSIGNED_^1*_015_,NOT ASSIGNED_^1*_]_^1_(EJT_^1*_]_^1*_5********************_^1*_5* TRANSPORT STATUS *_^1*_5********************_^1*_]_^1*_0BIT_+ASSIGNMENT_^1*_0---_+----------_^1*_]_^1*_10_,NOT ASSIGNED_^1*_11_,NRZI_^1*_12_,SPEED 50 IPS_^1*_13_,TRANSPORT CODE_^1*_]_^1*_14_,TRANSPO€€RT CODE_^1*_15_,NOT ASSIGNED_^1*_16_,NOT ASSIGNED_^1*_17_,NOT ASSIGNED_^1*_]_^1*_18_,REWINDING_^1*_19_,LOAD POINT_^1*_010_,WRITE PROTECTED_^1*_011_,NOT ASSIGNED_^1*_]_^1*_012_,NOT ASSIGNED_^1*_013_,NOT ASSIGNED_^1*_014_,DESELECT_^1*_015_,OFF-LINE_^1*_]_^1*_]_^1*_0BITS_!4 3_"TRANSPORT_^1*_0-----------_"---------_^1*_70 0_"7 TRACK NRZI_^1*_70 1_"9 TRACK DUAL MODE_^1*_71 0_"9 TRAC€€K NRZI_^1*_71 1_"9 TRACK PHASE ENCODING_^1*_]_^1_(EJT_^1****_]_^1*_]_^1*_]_^1PH7REC_!EQU_$PH7REC(96) MAXIMUM PHYSICAL RECORD SIZE - 7 TRACK_^1QMTAPE_!NUM_$0_*DRIVER ENTRY FOR SILP_^1_%JMP* RDREQ_(READ ONLY IN SILP_^1RDREQ SAP GET_^1_%TCA A_,IF NEGATIVE,ASCII MODE_^1GET_"STA PLCTT0+10_^1_%LDA =XPH7REC_$GET BUFFER LENGTH_^1_(STA*_#NWMOT_%STORE NUMBER OF WORDS_^1_(LDA*_#FREAD_^€€1_(STA*_#REQCOD_$SETFREAD REQUEST CODE_^1_(JMP*_#STAREQ_$COUNTINUE BUILDING DUMMY REQUEST_^1*_]_^1MOTION_!NUM_$$1C00_%MOTION REQUEST CODE_^1FREAD_"NUM_$$0800_%FREAD REQUEST CODE_^1FWRITE_!NUM_$$0C00_%FWRIT REQUEST CODE_^1*_]_^1REWC_#NUM_$$3000_%REWIND CODE FOR MOTION REQ._^1EOFRWC_!NUM_$$2300_%WRITE EOF % REWIND CODES FOR MOTION REQ._^1ISAVE_"NUM_$0_*SAVE I REGISTER_^1ASAVE NUM 0€€_^1*_]_^1REQCOD_!NUM_$0_*REQUEST CODE_^1COMP_#NUM_$0_*COMPLITION ADDRESS_%(NOT USED)_^1THRD_#NUM_$0_*THREAD_^1VMALU_"NUM_$0_*V-FEILD,MODE,LOGICAL-UNIT_^1NWMOT_"NUM_$0_*NUMBER OF WORDS OR MOTION CODES_^1STADD_"NUM_$0_*STARTING ADDRESS_^1*_]_^1STAREQ_!EQU_$STAREQ(*)_!CONTINUE BUILDING THE REQUEST_^1_(LDQ-_#I_*SAVE I REG. FOR RETURN_^1_(STQ*_#ISAVE_^1_(RTJ*_#HERE_^1HERE_#NUM_$0_*GET T€€HE CURRENT ADDRESS_^1_(LDQ*_#HERE_^1_(ADQ_$=XPLCTT0-HERE CALCUALTE ADDRESS OF PDT_^1_(STQ-_#I_*SAVE PDT ADDRESS IN I REG._^1_(STQ*_#CURPDT_$UPDATE CURRENT PDT_^1_(LDQ-_#ECCOR,I_#GET STARTING BUFFER ADDRESS_^1_(STQ-_#ABUFF,I_#STARTING ADDRESS_^1_'STQ*_$STADD_%STARTING ADDRESS IN PSEUDO REQUST_^1_(ADQ*_#NWMOT_%ADD NUMBER OF WORDS_^1_(STQ-_#ELSTWD,I_"SAVE IN LAST WORD ADDRESS_^1_(LD€€A*_#HERE_^1_(SUB_$=XHERE-REQCOD CALCULATE ADDRESS OF PSEUDO REQUEST_^1_(STA-_#EPTR,I_$SAVE IN REQUEST PARAMETER LOCATION_^1*_]_^1_(ENQ_$2_*FORMAT REQUEST_^1_(LDA*_#REQCOD_$GET REQUEST CODE_^1_(ALS_$5_^1_(SAP_$RD_(SKIP IF READ REQUEST_^1_(INQ_$1_)SET BIT FOR WRITE REQUEST_^1RD_%STQ-_#ESTAT1,I_"SAVE IN PDT_^1_(RTJ_$KLCTT_%PROCEED WITH PRESENT REQUEST_^1_(EJT_^1*_]_^1*_4*********_^1*€€_4* DLCTT *_^1*_4*********_^1*_]_^1* ENTERED BY REQUEST PROCESSOR_^1*_]_^1* FUNCTION:_^1*_'FIND NEXT REQUEST AND CALL KERNEL, UPON RETURN IF ERROR_^1*_'AND NOT DLU, LOG IT AND CALL ALTDEV. IF NO ERROR COMPLETE_^1*_'THE REQUEST._^1*_'IF MULTI PDT SEARCH ALL TABLES FOR REQUESTS BEFORE GIVING_^1*_'UP CONTROL TO DISPATCHER._^1*_]_^1_(LDA-_#ESTAT1,I_"CHECK FOR ERROR_^1_%SAP I21_^1_(LDA€€-_#ESTAT2,I_"IS END OF FILE READ_^1_(AND_$=XM0800_^1_(SAN_$EOF_(SKIP IF NO E.O.F._^1_(CLR_$A_^1_%LDQ- FLTCOD,I_^1_%LDA- ESTAT2,I_^1_%STA- I_^1_%CLR A_^1_%JMP (QMTAPE)_^1I21_"JMP* I20_^1EOF_"CLR A,Q_^1EXIT_!STA* ASAVE_^1_%LDA* ISAVE_^1_%STA- I_^1_%LDA* ASAVE_^1_%JMP (QMTAPE)_^1I20_$LDA*_#STADD_%COMPLETE SILP REQ. A = STARTING BUF. ADD._^1_(JMP*_#EXIT_^1*_]_^1CURPDT_!NUM_$0_*CURRE€€NT PDT ADDRESS_^1UMODE_"EQU_$UMODE($0080) UNIT % SELECT CODE_^1LNLCTT_!EQU_$LNLCTT(0)_!DRIVER LENGTH_^1SLCTT_"EQU_$SLCTT($7FFF) STORAGE SECTOR NUMBER_^1MTEWES_!EQU_$MTEWES($601) EQUIPMENT CODE NUMBER_^1*_'PHYSICAL DEVICE TABLE FOR LCTT - UNIT 0_^1*S2_]_^1BFLCTT_!BSS_$BFLCTT(PH7REC*4/3+2) PACK/UNPACK BUFFER FOR 7 TRACK_^1PLCTT0_!NUM_$0_$00 ELVL_!- SCHEDULER CALL_$NOT USED_^1_(NUM_€€$0_$01 EDIN_!- INITIATOR ADDRESS_!N/U_^1_(NUM_$0_$02 EDCN_!- CONTINUATOR ADDRESS N/U_^1_(NUM_$0_$03 EDPGN - ERROR ADDRESS_%N/U_^1_(NUM_$0_$04 EDCLK - DIAGNOSTIC CLOCK_"N/U_^1_%NUM 10_+05 ELU - LOGICAL UNIT_^1_(NUM_$0_$06 EPTR_!- PARAMETER ADDRESS_^1EWES_#EQU_$EWES(*)_#EQUIPMENT CODE LOCATION (FOR DTLP)_^1EWES1_"EQU_#EWES1(*)_#EQUIPMENT CODE LOCATION (FOR DTLP)_^1EMTAPE NUM€€ $0301_(07 EWES_^1_(NUM_$$0E06 08 EREQST - REQUEST STATUS_^1_(NUM_$0_$09 ESTAT1 - DRIVER STATUS_^1_(NUM_$0_$10 ECCOR - CURRENT LOCATION IN BUFFER_^1_(NUM_$0_$11 ELSTWD - LAST LOCATION OF BUFFER PLUS ONE_^1_(NUM_$0_$12 ESTAT2 - DEVICE STATUS_^1_(ADC_$LNLCTT 13 MASLGN - DRIVER LENGTH_%N/U_^1_(ADC_$SLCTT 14 MASSEC - MASS STORAGE SECTOR NUMBER N/U_^1_(NUM_$0_$15 RETURN - R€€ETURN ADD.FOR FNR,MAKQ,COMPRQ N/U_^1_(NUM_$0_$16 FLTCOD - FAULT CODE_^1_(NUM_$0_$17 DIAGLU - DIAGNOSTIC LU._(N/U_^1_(NUM_$0_$18 GHOSTI - GHOST INTERRUPTS COUNT N/U_^1_(NUM_$0_$19 MICROI - MICRO INTERRUPT NUMBER N/U_^1_(NUM_$0_$20 TIMOUT - INTERRUPT TIMEOUT VALUE_"N/U_^1_(NUM_$0_$21 SENTRY - STATUS AFTER INITIAL ENTRY_^1_(NUM_$0_$22 SINTER - STATUS AFTER INTERRUPT_^1_(NUM_$0_€€$23 STIMEO - STATUS AFTER TIMEOUT ERROR_^1_(NUM_$0_$24 TRNSPT - TRANSPORT STATUS_^1_(NUM_$0_$25 RTRECV - RETURN FOR RECOVERY_^1_(NUM_$0_$26 OUTARG - A REGISTER AT LAST OUTPUT_^1_(NUM_$0_$27 OUTQRG - Q REGISTER AT LAST OUTPUT_^1_(ADC_#(UMODE) 28 UNTMOD - UNIT AND MODE SELECT CODE_^1_(NUM_$0_$29 QSTWD4 - WORD 4 OF REQUEST_^1_(NUM_$0_$30 RCNTFG - RECOVERY COUNT FLAG_^1_(NUM_$0€_$31 RFLAG - RECOVERY FLAG BIT 15 = 1 - DISABLE_^1_(ADC_$PH7REC 32 PHSREC - MAXIMUM PHYSICAL RECOD SIZE 7-TRK._^1_(ADC_$BFLCTT 33 ABUFF - PACK/UNPACK BUFFER ADDRESS 7-TRK._^1_(NUM_$0_$34 ALRMST - ALARM STATUS WORD_^1_(NUM_$0_$35 ELINK - NEXT UNIT PDT_-N/U_^1*S2_]_^1_(END_^__PQK8326 CSY/ D81 P€1_%NAM QK8326_'DECK-ID D81 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT KERNEL_^1*_7***********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT KERNEL PERFORMS STATUS FUNCTIONS AND_^1*_'PERFORMS THE I/O BY CALLING ANCILLARY ROUTIN€€ES._^1*_'IT ALSO HANDLES DIAGNOSTIC TIMEOUT AND PROCESSES_^1*_'ERRORS._^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7--------------------_^1*_]_^1*_'THE KERNEL PROVIDES THE SKELETON FOR ANCILLARY_^1*_'ROUTINES CALLS FOR I/O PROCESSING._^1*_'IN ADDITION IT PROVIDES STATUS SUBROUTINES,THE_^1*_'FUNCTION(OUT) SUBROUTINE AND HANDLING OF TIMEOUT_^1*_'ERROR._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_€€7------------------_^1*_]_^1*_'KLCTT_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'ELCTT_^1*_*(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'FLCTT_^1*_*(A) REGISTER = FAULT CODE_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'SLCTT_^1*_*(Q) REGISTER = VALUE CORRESPONDING TO REQUESTED_^1*_9STATUS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL D€€EVICE TABLE_^1*_]_^1*_'QLCTT_^1*_*(A) REGISTER = VALUE APPROPRIATE FOR THIS FUNCTION_^1*_*(Q) REGISTER = VALUE CORRESPONDING TO REQUESTED_^1*_9FUNCTION_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'STATUU_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1_(EJT_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS ANCILLARY ROUTINES BLCTT,WLCTT,VLCTT,NLCTT_^1*_*AN€€D LLCTT DURING I/O PROCESSING._^1*_'2. UPDATES TIMEOUT STATUS WORD IN PDT WHEN TIMEOUT._^1*_'3. RETURNS TO CALLER OF SLCTT WITH REQUESTED STATUS_^1*_*IN (A) REGISTER._^1*_'4. UPDATES ESTAT2 WORD OF PDT AND RETURNS IT IN (A)_^1*_*REGISTER TO CALLER OF STATUU._^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. KLCTT ENTRY - ENTERED BY RETURN JUMP FROM DRIVER._^1*_'2. ELCTT ENTRY - E€€NTERED WHEN DIAGNOSTIC CLOCK_^1*_8BECOMES NEGATIVE._^1*_'3. FLCTT ENTRY - ENTERED WHEN ERROR LOGGING IS_^1*_8NEEDED._^1*_'4. SLCTT ENTRY - ENTERED WHEN A STATUS IS REQUIRED._^1*_'5. QLCTT ENTRY - ENTERED BY RETURN JUMP WHEN CONTROL_^1*_8FUNCTION IS SENT TO CONTROLLER._^1*_'6. STATUU ENTRY - ENTERED WHEN DYNAMIC STATUS IS_^1*_9REQUIRED._^1*_'7. EXIT - TO DRIVER (CALLING ROUTINE) WHE€€N FAULT OR_^1*_1ON NORMAL COMPLETION OF REQUEST._^1*_'8. EXIT - TO DISPATCHER WHEN TIMEOUT FOR REWINDING_^1*_1UNIT._^1*_'9. EXIT - TO CALLER WHEN STATUS OR FUNCTION ARE_^1*_1REQUIRED._^1*_]_^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'KLCTT_^1*_*1. CALL BLCTT ANCILLARY ROUTINE._^1*_*2. ON RETURN CALL WLCTT ANCILLARY ROUTINE._^1*_*3. ON RETURN CALL VLCTT ANCILLARY ROUTINE._^1*_*4. ON €€RETURN CALL NLCTT ANCILLARY ROUTINE._^1*_*5. ON RETURN EXIT TO DRIVER IF REQUEST COMPLETED,_^1*_-OTHERWISE CALL WLCTT AGAIN(2.)._^1*_]_^1*_'ELCTT_^1*_*1. GET AND SAVE DYNAMIC STATUS IN STIMEO._^1*_*2. IF UNIT REWINDING EXIT TO DISPATCHER.ELSE CALL_^1*_-LLCTT TO LOG TIMEOUT ERROR._^1*_]_^1*_'FLCTT_^1*_*1. CALL LLCTT TO LOG ERROR._^1*_*2. ON RETURN EXIT TO DRIVER TO COMPLETE REQUEST.€€_^1*_]_^1*_]_^1*_'SLCTT_^1*_*1. SAVE (Q) REGISTER OF INP IN OUTQRG. SET OUTARG._^1*_*2. PERFORM INP INSTRUCTION._^1*_*3. IF REPLY RETURN TO CALLER. IF INTERNAL REJECT_^1*_-LOG THE ERROR. IF EXTERNAL REJECT THE FIRST TIME_^1*_-TRY ONCE MORE. OTHERWISE LOG THE ERROR._^1*_]_^1*_'QLCTT_^1*_*1. SAVE (Q) AND (A) REGISTERS OF OUT IN OUTQRG AND_^1*_-OUTARG._^1*_*2. PERFORM OUT INSTRUCTION_€€^1*_*3. IF REPLY RETURN TO CALLER. IF INTERNAL REJECT_^1*_-LOG THE ERROR. IF EXTERNAL REJECT TRY ONCE MORE._^1*_-IF EXTERNAL REJECT SECOND TIME, GET DYNAMIC_^1*_-STATUS AND CHECK IF BUS RELINQUISHED. IF OFF-BUS_^1*_-LOG THE ERROR WITE CODE 21. OTHERWISE LOG THE_^1*_-ERROR WITH CODE 6._^1*_]_^1*_'STATUU_^1*_*1. CALL SLCTT TO GET DYNAMIC STATUS._^1*_*2. MOVE EOF AND EOT BITS 2 BITS T€€O THE LEFT._^1*_*3. SAVE MODIFIED STATUS IN ESTAT2 AND RETURN TO_^1*_-CALLER WITH MODIFIED STATUS IN (A) REGISTER._^1*_]_^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'BLCTT - CONNECT BUS AND SELECT UNIT._^1*_'WLCTT - SET DIAGNOSTIC CLOCK AND RETURN_^1*_/WHEN INTERRUPT._^1*_'VLCTT - GET STATUS AND VERIFY THE INTERRUPT._^1*_'NLCTT - PERFORM I/O._^1*_'LLCTT - SAVE FAULT COD€€E AND SET HARDWARE FAILURE_^1*_/BIT OF EREQST._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$KLCTT_^1_(ENT_$FLCTT_,KERNEL FAULT ENTRY_^1_(ENT_$SLCTT_,KERNEL STATUS ENTRY_^1_(ENT_$QLCTT_,KERNEL FUNCTION ENTRY_^1_(ENT_$STATUU_+KERNEL DYNAMIC STATUS ENTRY_^1*_]_^1_(EJT_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#BLCTT_,KERNEL BEGIN ANCILLARY ROUT€€INE_^1_(EXT*_#WLCTT_,KERNEL WAIT ANCILLARY ROUTINE_^1_(EXT*_#VLCTT_,KERNEL VERIFY ANCILLARY ROUTINE_^1_(EXT*_#NLCTT_,KERNEL NEXT ANCILLARY ROUTINE_^1_(EXT*_#LLCTT_,KERNEL LOG ANCILLARY ROUTINE_^1_(EXT*_#CURPDT_+CURRENT PDT ADDRESS_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M1000_"EQU_$M1000($1000)_"ONEBIT+12_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1€€_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQU€€EST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC€€ LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26€€)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMS€€T(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1****_]_^1*_]_^1*_]_^1*_7*********_^1*_7* KLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1KLCTT_"NUM_$0_^1_(RTJ_$BLCTT_,BEGIN I/O_^1KCONT_"RTJ_$WLCTT_,WAIT FOR INTERRUPT_^1_(RTJ_$VLCTT_,VERIFY THE INTERRUPT_^1_(RTJ_$NLCTT_,DO NEXT I/O_^1_(SAZ_$1_0SKIP IF REQUEST COMPLETE_^1_(JMP*_#KC€€ONT_,CONTINUE I/O_^1_(JMP*_#(KLCTT)_*COMPLETE THE REQUEST_^1*_]_^1*_]_^1*_]_^1*_]_^1* ERROR_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND FAULT CODE_^1* IN (A) REGISTER_^1*_]_^1*_]_^1FLCTT_"RTJ_$LLCTT_,LOG THE ERROR_^1_(JMP*_#(KLCTT)_*COMPLETE THE REQUEST_^1*_]_^1_(EJT_^1*_]_^1* STATUS_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND APPROPRIATE_^1* VALUE IN (Q) REGISTER_^1*€€_]_^1*_]_^1SLCTT_"NUM_$0_^1_(ADQ-_#EWES,I_^1_(ENA_$-0_^1INPUT_"INP_$SREJ-*_^1_(CLR_$Q_^1_(STQ*_#RCOUNT_^1_(JMP*_#(SLCTT)_^1SREJ_#JMP*_#INTREJ_^1_(LDA*_#RCOUNT_^1_(SAN_$EXTERN_^1_(RAO*_#RCOUNT_^1_(JMP*_#INPUT_^1EXTERN_!CLR_$A_^1_(STA*_#RCOUNT_^1_(JMP*_#EXTREJ_^1*_]_^1*_]_^1* FUNCTION_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER AND APPROPRIATE_^1* VALUES IN (A) AND (Q) REGISTERS_^€€1*_]_^1*_]_^1QLCTT_"NUM_$0_^1_(ADQ-_#EWES,I_^1_(STA-_#OUTARG,I_)SAVE A REGISTER_^1_(STQ-_#OUTQRG,I_)SAVE Q REGISTER_^1OUTPUT_!OUT_$QREJ-*_^1_(CLR_$Q_^1_(STQ*_#RCOUNT_^1_(JMP*_#(QLCTT)_^1QREJ_#JMP*_#INTREJ_^1_(LDA*_#RCOUNT_^1_(SAN_$SECOND_+SKIP IF SECOND TIME_^1_(RAO*_#RCOUNT_^1_(LDA-_#OUTARG,I_^1_(JMP*_#OUTPUT_^1SECOND_!RTJ*_#STATUU_^1_(AND_$=XM1000_#IS ON BUS_^1_(SAZ_$1_0SKIP IF O€€FF-BUS_^1EXTREJ_!ENA_$-78_.EXTERNAL REJECT_^1_(INA_$84_/BUS RELEINQUISHED ERROR CODE=21_^1_(JMP*_#FLCTT_^1INTREJ_!ENA_$5_^1_(JMP*_#FLCTT_^1RCOUNT_!NUM_$0_^1*_]_^1* MODIFIED DYNAMIC STATUS_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1*_]_^1STATUU_!NUM_$0_^1_(ENQ_$$F_/SAVE DYNAMIC STATUS_^1_(RTJ*_#SLCTT_^1_(STA-_#ESTAT2,I_^1_(AND_$=N$280_+GET EOF AND EOT BITS_^1_(ALS_$2_^1_(T€€RA_$Q_^1_(LDA-_#ESTAT2,I_^1_(AND_$=N$F57F_^1_(AAQ_$A_^1_(STA-_#ESTAT2,I_)EOF AND EOT BITS SHIFTED_^1_(JMP*_#(STATUU)_^1_(END_^__€PQB8326 CSY/ D82 P€1_%NAM QB8326_'DECK-ID D82 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT BEGIN_^1*_7**********_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT BEGIN ASSURES BUS CONNECT AND UNIT SELECT_^1*_'BEFORE REQUEST PROCESSING IS CONTINUED._^1*_]_^€€1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE BEGINS PROCESSING THE REQUEST BY_^1*_'INITIALIZING SOME WORDS IN THE APPROPRIATE PDT AND_^1*_'IN THE DRIVER. THEN IT CHECKS IF BUS CONNECTED. IF_^1*_'OFF-BUS A BUS CONNECT IS PERFORMED FOLLOWED BY EXIT_^1*_'TO CALLER. IF ON-BUS OR AFTER BUS CONNECT HAS BEEN_^1*_'ESTABLISHED, UNIT SELECT IS PERFORMED AND EXIT I€€S_^1*_'MADE TO CALLER._^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'UNTSEL_^1*_*(A) REGISTER = (ONEBIT+7)_^1*_]_^1*_'SELECT_^1*_*(A) REGISTER = APPROPRIATE UNIT SELECT CODE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SETS SENTRY,SINTER AND STIMEO WORDS IN PDT._^1*_'2. CLEARS R€€TRECV WORD IN PDT AND DELTA,ERSCNT AND_^1*_*EOT WORDS IN DRIVER._^1*_'3. CALLS KERNEL QLCTT AND STATUU SUBROUTINES._^1*_'4. UPDATES SENTRY WORD IN PDT WITH CURRENT STATUS._^1*_'5. UPDATES ESTAT1 AND UNTMOD WORDS IN PDT ACCORDING_^1*_*TO NEEDS._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_'1. BLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. CONBUS ENTRY - ENTERED FROM RW€€LCTT FOR REWIND_^1*_9CHECK._^1*_'3. UNTSEL ENTRY - ENTERED FROM VLCTT TO PROVIDE UNIT_^1*_:SELECT._^1*_'4. SELMOD ENTRY - ENTERED FROM RLCTT TO SELECT UNIT_^1*_9WITH ORIGINALLY REQUESTED MODE._^1*_'5. SELECT ENTRY - ENTERED FROM RLCTT TO SELECT UNIT_^1*_9WITH REVERSED MODE._^1*_'6. EXIT - TO KERNEL (CALLING ROUTINE) AFTER_^1*_1PERFORMING A FUNCTION._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_€€^1*_]_^1*_'BLCTT_^1*_*1. SET SENTRY,SINTER AND STIMEO WORDS IN PDT._^1*_*2. CLEAR RTRECV WORD IN PDT AND DELTA,ERSCNT_^1*_-AND EOT WORDS IN DRIVER._^1*_*3. CALL QLCTT TO REQUEST EOP INTERRUPT._^1*_*4. ON RETURN CALL STATUU AND SAVE MODIFIED_^1*_-DYNAMIC STATUS IN SENTRY WORD IN PDT._^1*_*5. CHECK BUS. IF ON-BUS JUMP TO UNTSEL. IF_^1*_-OFF-BUS SET BUS CONNECT BIT OF ESTAT1 (BIT 7)._€€^1*_*6. ENTER BUS CONNECT VALUE TO (Q) REGISTER._^1*_*7. CALL QLCTT TO PERFORM FUNCTION._^1*_*8. ON RETURN EXIT TO CALLER WITH TIMEOUT PERIOD_^1*_-IN (A) REGISTER._^1*_]_^1*_'UNTSEL_^1*_*1. SET UNIT SELECT BIT OF ESTAT1 (BIT 8)_^1*_]_^1*_'SELMOD_^1*_*2. UPDATE MODE BIT IN UNTMOD IN PDT ACCORDING TO_^1*_-REQUEST._^1*_]_^1*_'SELECT_^1*_*3. ENTER UNIT SELECT VALUE TO (Q) REGISTER AND_€€^1*_-JUMP TO BLCTT 7._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'QLCTT - KERNEL FUNCTION SUBROUTINE_^1*_'STATUU - KERNEL MODIFIED DYNAMIC STATUS SUBROUTINE._^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$BLCTT_^1_(ENT_$UNTSEL_+UNIT SELECT ENTRY_^1_(ENT_$SELMOD_+MODE SELECT ENTRY_^1_(ENT_$SELECT_+UNIT SELECT FUNCTION ENTRY_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_€€7-------------------_^1*_]_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#STATUU_+KERNEL DYNAMIC STATUS SUBROUTINE_^1_(EXT*_#DELTA,ERSCNT,EOT_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M0008_"EQU_$M0008($8)_%ONEBIT+3_^1M0080_"EQU_$M0080($80)_$ONEBIT+7_^1M0100_"EQU_$M0100($100)_#ONEBIT+8_^1M100_#EQU_$M1000($1000)_"ONEBIT+12_^1M2000_"EQU_$M2000($2000)_"O€€NEBIT+13_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES€€(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMP€€RQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT €€STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%€€EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1*_]_^1*_]_^1*_]_^1****_]_^1*_7*********_^1*_7* BLCTT *_^1*_7*********_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1BLCTT_"NUM_$0_^1_(ENA_$-0_^1_(STA-_#SENTRY,I_^1_(STA-_#SINTER,I_^1_(ENA_$0_0INITIALIZE NECESSARY WORDS_^1_(STA-_#RTR€€ECV,I_^1_(STA_$DELTA_^1_(STA_$ERSCNT_^1_(STA_$EOT_^1_(RTJ_$STATUU_$SAVE DYNAMIC STATUS_^1_(STA-_#SENTRY,I_^1_(AND_$=XM1000_#IS BUS CONNECT_^1_(SAZ_$2_0SKIP IF OFF BUS_^1_(CLR_$A_0SELECT UNIT_^1_(JMP*_#UNTSEL_^1_(LDA-_#ESTAT1,I_)SET BUS CONNECT BIT (BIT 7 OF ESTAT1_^1_(ADD_$=XM0080_^1_(STA-_#ESTAT1,I_^1_(LDA_$=XM0080_#CONNECT BUS_^1_(ENQ_$7_^1OUTPUT_!RTJ_$QLCTT_^1_(ENA_$1_^1_(JMP*_#€€(BLCTT)_*RETURN TO KERNEL_^1*_]_^1*_]_^1* UNIT SELECT_^1*_]_^1UNTSEL_!EOR-_#ESTAT1,I_)CLEAR BUS CONNECT BIT_^1_(ADD_$=XM0100_#SET UNIT SELECT BIT (BIT 8 OF ESTAT1_^1_(STA-_#ESTAT1,I_^1* MODE UPDATE_^1SELMOD_!LDA-_#ESTAT1,I_)CHECK REQUEST MODE_^1_(AND_$=XM0008_^1_(SAZ_$2_*SKIP IF BINARY_^1_(LDA_$=XM2000_#SET ASCII MODE_^1_(ADD-_#UNTMOD,I_)SELECT UNIT_^1SELECT_!ENQ_$5_^1_(JMP*_#OUTPU€T_^1_(END_^__ PQW8326 CSY/ D83 P€1_%NAM QW8326_'DECK-ID D83 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT WAIT_^1*_7*********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT WAIT SETS UP THE DIAGNOSTIC CLOCK AND_^1*_'RETURNS CONTROL TO CALLER WHEN INTERRUPT._^1*_]€€_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE ENTERS THE APPROPRIATE TIMEOUT PERIOD_^1*_'IN DIAGNOSTIC CLOCK AND PROVIDES THE CONTINUATOR_^1*_'ENTRY OF THE DRIVER._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'WLCTT_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_*(A) REGISTER = TIMEOUT PERIOD_^1*_'CLCTT_^1*_*(Q) REGIST€€ER = ADDRESS OF UNIT 0 PDT_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SETS UP EDCLK WORD IN PDT._^1*_'2. RETURNS TO CALLER WITH UNIT 0 PDT ADDRESS_^1*_*IN (I) REGISTER._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_]_^1*_'1. WLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. CLCTT ENTRY - ENTERED WHEN INTERRUPT._^1*_'3. EXIT - TO DISPATCHER WHEN WAITING FOR EO€€P._^1*_'4. EXIT - TO KERNEL (CALLING ROUTINE) WHEN INTERRUPT._^1*_]_^1_(EJT_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'WLCTT_^1*_*1. SET UP DIAGNOSTIC CLOCK._^1*_*2. EXIT TO DISPATCHER._^1*_]_^1*_'CLCTT_^1*_*1. SAVE UNIT 0 PDT ADDRESS IN (I) REGISTER._^1*_*2. RETURN TO CALLER._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$WLCTT_^1*_]_^1*_5EXTERNAL REFERENCES_^1*_5-------€€------------_^1_(EXT*_#STATUU_$STATUS ROUTINE IN 'KLCTT'_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7----------------_^1*_]_^1M0100_"EQU_$M0100($100)_^1M0102_"EQU_$M0102($102)_^1*_]_^1_(EJT_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_€€)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU€€_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQ€€U_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF€€ REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1_(EJT_^1****_]_^1*_7*********_^1*_7* WLCTT *_^1*_7*********_^1*_]_^1*_]_^1*_]_^1*_]_^1*_'ON €ENTRY REG. I = PDT ADDRESS_^1*_]_^1*_]_^1*_]_^1*_]_^1WLCTT_"NUM_$0_^1AG_%RTJ_$STATUU_$GET ESTAT2 IN REGISTER A_^1_(AND_$=XM0102_#MASK FOR WAIT ON ESTAT2_^1_(EOR_$=XM0100_#CHECK IF EOP AND UNIT READY_^1_(SAZ_$OK_^1_(JMP*_#AG_^1OK_%JMP*_#(WLCTT)_#RETURN TO KERNEL_^1_(END_^__PQV8326 CSY/ D84 P€1_%NAM QV8326_'DECK-ID D84 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT VERIFY_^1*_7***********_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT VERIFY CHECKS THE INTERRUPT FOR GHOST_^1*_'INTERRUPT BEFORE PROCESSING IT._^1*_]_^1*_]_^1*_7€€GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE VERIFIES THAT A REQUEST IS BEING_^1*_'PROCESSED WHEN AN INTERRUPT HAS OCCURED. IF NO_^1*_'REQUEST THE INTERRUPT IS A GHOST INTERRUPT AND_^1*_'AN EXIT IS MADE TO DISPATCHER. IF THERE IS A_^1*_'REQUEST PRESENT THE INTERRUPT IS CHECKED TO BE_^1*_'ELECTRONICALLY VALID. IF VALID IT IS DETERMINED_^1*_'WHETHER THE OPERAT€€ION WAS A BUS CONNECT. IF IT_^1*_'WAS BUS CONNECT AN EXIT IS MADE TO SELECT UNIT,_^1*_'OTHERWISE CONTROL RETURNS TO CALLER._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'(I) REGISTER = ADDRESS OF UNIT 0 PDT_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS KERNEL QLCTT AND STATUU SUBROUTINES._^1*_'2. UPDATES SINTER WORD OF PDT WHEN NOT GHOST_^1*_*INTE€€RRUPT._^1*_'3. INCREMENTS GHOSTI WORD OF PDT WHEN INTERRUPT_^1*_*ELECTRONICALLY NOT VALID._^1*_'4. RESETS DIAGNOSTIC CLOCK IF INTERRUPT VALID._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. VLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. EXIT - TO DISPATCHER WHEN INTERRUPT ILLEGAL._^1*_'3. EXIT - TO UNTSEL (IN BLCTT) TO SELECT UNIT._^1*_'4. EXIT - TO KERNEL (CA€€LLING ROUTINE) IF INTERRUPT_^1*_1WAS NOT DUE TO BUS CONNECT._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'VLCTT_^1*_*1. CHECK IF A REQUEST IS BEING PROCESSED._^1*_-EXIT TO DISPATCHER IF NO REQUEST._^1*_*2. SAVE REQUEST PDT ADDRESS IN (I) REGISTER._^1*_-GET MODIFIED DYNAMIC STATUS AND SAVE IT IN_^1*_-SINTER WORD OF PDT._^1*_*3. CHECK IF INTERRUPT ELECTRONICALLY VALID. IF_^1*_-ELECTRON€€ICALLY INVALID INCREMENT GHOSTI WORD_^1*_-OF PDT AND EXIT TO DISPATCHER._^1*_*4. RESET DIAGNOSTIC CLOCK, CLEAR THE INTERRUPT_^1*_-AND REQUEST EOP INTERRUPT._^1*_*5. IF INTERRUPT WAS DUE TO BUS CONNECT GO TO_^1*_-UNTSEL (EXTERNAL). OTHERWISE RETURN TO CALLER._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'QLCTT - KERNEL FUNCTION SUBROUTINE_^1*_'STATUU - KERNEL MODIFIED DYN€€AMIC STATUS SUBROUTINE_^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$VLCTT_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#UNTSEL_+UNIT SELECT ENTRY_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M0080_"EQU_$M0080($80)_$ONEBIT+7_^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)€€_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_€€(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_€€^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER €€AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM S€dTATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1_(EJT_^1*_]_^1****_]_^1*_7*********_^1*_7* VLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1VLCTT_"NUM_$0_^1_(LDA-_#ESTAT1,I_)WAS BUS CONNECT_^1_(AND_$=XM0080_^1_(SAN_$1_0SKIP IF BUS CONNECTED_^1_(JMP*_#(VLCTT)_*RETURN TO KERNEL_^1_(JMP_$UNTSEL_+SELECT UNIT_^1_(END_^__ dPQN8326 CSY/ D85 P€1_%NAM QN8326_'DECK-ID D85 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT NEXT_^1*_7*********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT NEXT EXECUTES ALL I/O FUNCTIONS, CHECKS_^1*_'THEIR FULFILMENT AFTER EXECUTION AND CALLS RE€€COVERY_^1*_'AND ERROR LOGGING WHEN NEEDED._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'LCTT NEXT IS THE PROGRAM THAT ACTUALLY PERFORMS_^1*_'THE REQUESTS. IT CONSISTS OF THREE MAIN SECTIONS._^1*_]_^1*_'THE FIRST SECTION GAINS CONTROL RIGHT AFTER A_^1*_'UNIT SELECT IS ACCOMPLISHED. IT INITIATES THE_^1*_'DSA TRANSFER WHEN READ/FREAD AND WRITE/FWRITE_^1*_'R€€EQUESTS. IT INITIATES TAPE MOTION WHEN MOTION_^1*_'REQUESTS._^1*_]_^1*_'THE SECOND SECTION GAINS CONTROL WHEN OPERATIONS_^1*_'INITIATED BY THE FIRST SECTION COME TO AN END. IT_^1*_'CALLS A SUBROUTINE (THIRD SECTION) TO CHECK ALARM_^1*_'CAUSES WHEN OPERATION TERMINATED ABNORMALLY. IF_^1*_'TRANSFER WAS FAILURE FREE IT PROCEEDS THE REQUEST_^1*_'OR TERMINATES IT ACCORDING TO NEEDS._^1*€€_]_^1*_'THE THIRD SECTION CHECKS FOR ALARM REASONS AND_^1*_'DECIDES WHETHER TO LOG THE ERRORS OR TO CALL_^1*_'RECOVERY._^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_*ESTAT2 = LAST MODIFIED DYNAMIC STATUS_^1*_]_^1*_'FRSTWD_^1*_*(A) REGISTER = FIRST WORD ADDRESS FOR NEXT DSA_^1*_]_^1*_'FUNCT€€N_^1*_*(A) REGISTER = APPROPRIATE FUNCTION CODE_^1*_]_^1*_'FILEST_^1*_*(A) REGISTER = FILE ADDRESS_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. CALLS KERNEL QLCTT AND SLCTT SUBROUTINES._^1*_'2. CALLS COMPV4 FOR 16 BIT ARITHMETIC._^1*_'3. CALLS MAKEQ TO SET V FIELD IN REQUEST._^1*_'4. INCREMENTS REWINDS COUNTER - RWC._^1*_'5. CALLS SEVENT AND SEVNRD TO HANDLE 7 TRACK_^1*_*TAPE REQUES€€TS._^1*_'6. UPDATES TRANSPORT STATUS WORD - TRNSPT._^1*_'7. UPDATES FOLLOWING BITS OF ESTAT1 :_^1*_,BIT 5 - MOTION REQUEST BIT_^1*_,BIT 6 - UNIT REWINDING BIT_^1*_,BIT 8 - UNIT SELECT BIT_^1*_,BIT 10 - LOW THRESHOLD READ BIT_^1*_'8. SAVES TRANSFER LENGTH OR MOTION PARAMETERS_^1*_*IN QSTWD4 (IN PDT)._^1*_'9. UPDATES UNIT SELECT CODE WORD - UNTMOD._^1*_'10. SETS EOT BIT (BIT 9) OF ES€€TAT2._^1*_'11. SETS EOF BIT (BIT 14) OF EREQST._^1*_'12. UPDATES CURRENT WORD ADDRESS - ECCOR._^1*_'13. ASSIGNS FOLLOWING ERROR CODES :_^1*_-1 - LOST DATA_^1*_-2 - IRRECOVERABLE ERROR_^1*_-3 - PARITY ERROR_^1*_,13 - AN ATTEMPT TO WRITE WITHOUT RING_^1*_,14 - DEVICE NOT READY_^1*_,21 - BUS RELINQUISHED_^1*_,27 - NO CHARACTER READ IN 25 FEET_^1*_,31 - SHORT RECORD_^1*_,36 - TRANSMISS€€ION PARITY ERROR_^1*_,51 - ILLEGAL DENSITY SELECT_^1*_,60 - ILLEGAL MOTION CODE_^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. NLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. FRSTWD ENTRY - ENTERED FROM RLCTT (RECOVERY) TO_^1*_9REPEAT LAST I/O._^1*_'3. FUNCTN ENTRY - ENTERED FROM RLCTT (RECOVERY) TO_^1*_9PERFORM FUNCTION._^1*_'4. NEXMOT ENTRY - ENTERED FROM RWL€€CTT (REWIND CHECK)_^1*_9AFTER REWIND COMPLETION TO PERFORM_^1*_9NEXT MOTION._^1*_'5. TRNSOK ENTRY - ENTERED FROM RLCTT (RECOVERY)_^1*_9WHEN RECOVERY HAS BEEN SUCCESSFUL_^1*_9TO CONTINUE PROCESSING THE REQUEST._^1*_'6. ALARM ENTRY - CALLED BY RLCTT (RECOVERY) WHEN_^1*_8ERROR IN READ._^1*_]_^1*_'7. FILEST ENTRY - CALLED BY RLCTT (RECOVERY) TO GET_^1*_9FILE STATUS._^1*_'8. EXIT - TO R€€WNDCK (IN RWLCTT) TO CHECK REWIND_^1*_1STATUS AFTER UNIT SELECT._^1*_'9. EXIT - TO KERNEL (CALLING ROUTINE) TO WAIT FOR_^1*_1EOP OR TO COMPLETE THE REQUEST._^1*_'10. EXIT - TO FLCTT TO LOG ERRORS._^1*_'11. EXIT - TO VARIOUS ENTRY POINTS IN RLCTT AFTER_^1*_2EOP OF LAST CONTROLLER FUNCTION_^1*_2REQUESTED._^1*_'12. EXIT - TO SCHEDN (IN RWLCTT) TO SCHEDULE REWIND_^1*_2CHECK._^1*_'13. E€€XIT - TO I20 (IN DLCTT) TO COMPLETE REQUEST_^1*_2WHEN EOF OR EOT ENCOUNTERED._^1*_'14. EXIT - TO RLCTT FOR LOW THRESHOLD READ OR FOR_^1*_2ERROR RECOVERY._^1*_'15. EXIT - TO CALLER OF ALARM SUBROUTINE._^1*_'16. EXIT - TO CALLER OF FILEST SUBROUTINE._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'NLCTT_^1*_*1. CHECK BUS. IF BUS RELINQUISHED EXIT TO FLCTT_^1*_-TO LOG ERROR (CODE = 21)._^1€€*_*2. GET TRANSPORT STATUS AND SAVE IT IN TRNSPT,I._^1*_*3. CHECK UNIT SELECT BIT OF ESTAT1 (BIT 8). IF_^1*_-OPERATION WAS NOT UNIT SELECT GO TO CKTRNS (56.)._^1*_*4. CLEAR UNIT SELECT BIT AND GO TO RWNDCK_^1*_-(EXTERNAL) IF UNIT REWINDING (BIT 6 OF ESTAT1)._^1*_*5. IF UNIT NOT READY EXIT TO FLCTT TO LOG ERROR_^1*_-(CODE = 14)._^1*_*6. IF REQUEST IS MOTION REQUEST GO TO MOTREQ (16.€€)._^1*_*7. CALCULATE TRANSFER LENGTH AND SAVE IT IN_^1*_-QSTWD4,I._^1*_*8. IF LENGTH NOT GREATER THAN 2 EXIT TO FLCTT_^1*_-TO LOG ERROR (CODE = 31)._^1*_]_^1*_'LENGOK_^1*_*9. CHECK TRANSPORT TYPE (BIT 9 OF ESTAT1). IF_^1*_-7 TRACK CALL SEVENT (EXTERNAL). ON RETURN_^1*_-(A) REGISTER CONTAINS CURRENT TRANSFER LENGTH._^1*_-IF 7 TRACK LOAD (Q) REGISTER WITH PACK/UNPACK_^1*_-BUFFER ADDR€€ESS. IF 9 TRACK LOAD (A) FROM_^1*_-QSTWD4,I._^1*_)10. SAVE TRANSFER LENGTH (IN (A) REGISTER) IN_^1*_-NUMBR AND FIRST WORD ADDRESS (IN (Q) REGISTER)_^1*_-IN FWA._^1*_]_^1*_'FRSTWD_^1*_)11. LOAD CONTROLLER WITH FIRST WORD ADDRESS GIVEN_^1*_-IN (A) REGISTER, AND SELECT FIRST BANK._^1*_)12. LOAD CONTROLLER WITH CURRENT BLOCK LENGTH_^1*_-SAVED IN NUMBR._^1*_)13. IF WRITE REQUEST AND RIN€€G MISSING EXIT TO_^1*_-FLCTT TO LOG ERROR (CODE = 13). IF RING OK_^1*_-LOAD (A) REGISTER WITH WRITE FUNCTION CODE_^1*_-(5). IF READ REQUEST GO TO 15.._^1*_]_^1*_'FUNCTN_^1*_)14. CALL QLCTT TO PERFORM DIRECTOR FUNCTION GIVEN_^1*_-IN (A) REGISTER AND EXIT TO KERNEL TO WAIT FOR_^1*_-EOP._^1*_)15. LOAD (A) REGISTER WITH READ/LOW THRESHOLD READ_^1*_-FUNCTION CODE (0/$20) AND GO TO FUNCT€€N (14.)._^1*_]_^1*_'MOTREQ_^1*_)16. CLEAR DENCOD, SET MOTION BIT OF ESTAT1 (BIT 5)_^1*_-AND SAVE MOTION PARAMETER WORD IN QSTWD4,I._^1*_)17. IF REQUEST NON ITERATIVE SAVE DENSITY CODE_^1*_-IN DENCOD AND GO TO DOMOT (20.)._^1*_)18. IF LU IS DLU GO TO DIAGNS (29.)._^1*_)19. IF NUMBER OF ITERATIONS EQUALS ZERO GO TO_^1*_-COMPLT (44.). ELSE SAVE IT IN MOTITR._^1*_]_^1*_'DOMOT_^1*_)20. €€SAVE CURRENT PARAMETER STRING IN QSTWD4,I_^1*_-AND SAVE CURRENT MOTION CODE IN MOTCOD AND_^1*_-IN (Q) REGISTER. GO TO SUBMOT,Q._^1*_]_^1*_'SUBMOT_^1*_)21. GO TO DONEM (41.)._!MOTION CODE = 0_^1*_)22. GO TO RECDBK(45.)._!MOTION CODE = 1_^1*_)23. GO TO WRFM (47.)._!MOTION CODE = 2_^1*_)24. GO TO REW_!(48.)._!MOTION CODE = 3_^1*_)25. GO TO REWUN (50.)._!MOTION CODE = 4_^1*_)26. GO TO€€ SCFMFD(51.)._!MOTION CODE = 5_^1*_)27. GO TO SCFMBK(52.)._!MOTION CODE = 6_^1*_)28. GO TO ADVRCD(54.)._!MOTION CODE = 7_^1*_]_^1*_'DIAGNS_^1*_)29. IF NUMBER OF ITERATIONS/WORDS EQUALS ZERO_^1*_-GO TO COMPLT (44.). ELSE SAVE IT IN MOTITR._^1*_)30. SAVE MOTION CODE IN MOTCOD. IF MOTION CODE_^1*_-NOT SPECIAL FOR DIAGNOSTIC LOAD (Q) REGISTER_^1*_-FROM MOTCOD AND GO TO SUBMOT,Q._^1*_)3€€1. IF NEW MOTION CODE ILLEGAL EXIT TO FLCTT TO_^1*_-LOG ERROR (CODE = 60)._^1*_)32. LOAD (Q) REGISTER WITH VALUE OF NEW MOTION_^1*_-CODE MINUS 8 AND GO TO NEW,Q._^1*_]_^1*_'NEW_^1*_)33. GO TO CNBKSP (36.). MOTION CODE = 8_^1*_)34. GO TO VARERS (40.). MOTION CODE = 9_^1*_]_^1*_'FIXERS_^1*_)35. LOAD (A) REGISTER_"MOTION CODE = 10_^1*_-WITH FIXED ERASE FUNCTION CODE_^1*_-AND GO TO F€€UNCTN (14.)._^1*_]_^1*_'CNBKSP_^1*_)36. CALL LOAD POINT CHECK ROUTINE LPCHK (55.)._^1*_)37. ON RETURN (TAPE NOT AT LOAD POINT) CALL_^1*_-QLCTT TO LOAD BLOCK LENGTH GIVEN IN MOTITR_^1*_-AND LOAD (A) REGISTER WITH CONTROLLED_^1*_-BACKSPACE FUNCTION CODE._^1*_]_^1*_'GOON_^1*_)38. SET MOTITR TO 1._^1*_]_^1*_'DOIT_^1*_)39. GO TO FUNCTN (14.)._^1*_]_^1*_'VARERS_^1*_)40. CALL QLCTT TO LOA€€D BLOCK LENGTH GIVEN IN_^1*_-MOTITR. ON RETURN LOAD (A) REGISTER WITH_^1*_-VARIABLE ERASE FUNCTION CODE AND GO TO_^1*_-GOON (38.)._^1*_]_^1*_'DONEM_^1*_)41. IF DENCOD EQUALS ZERO GO TO COMPLT (44.)._^1*_-ELSE IF TAPE NOT AT LOAD POINT GO TO_^1*_-DENERR (43.)._^1*_)42. IF REQUESTED DENSITY SELECT IMPOSSIBLE ON_^1*_-TRANSPORT GO TO DENERR (43.). ELSE UPDATE_^1*_-UNIT SELECT WORD - UN€€TMOD,I AND GO TO_^1*_-COMPLT (44.)._^1*_]_^1*_'DENERR_^1*_)43. EXIT TO FLCTT TO LOG ERROR (CODE = 51)._^1*_]_^1*_'COMPLT_^1*_)44. IF EOT NOT ENCOUNTERED DURING REQUEST_^1*_-EXECUTION EXIT TO KERNEL TO COMPLETE REQUEST._^1*_-ELSE SET EOT BIT OF ESTAT2 AND GO TO EOF (71.)._^1*_]_^1*_'RECDBK_^1*_)45. CALL LOAD POINT CHECK ROUTINE LPCHK (55.)._^1*_)46. ON RETURN (TAPE NOT AT LOAD POINT€€) LOAD (A)_^1*_-REGISTER WITH BACKSPACE FUNCTION CODE AND_^1*_-GO TO DOIT (39.)._^1*_]_^1*_'WRFM_^1*_)47. IF RING MISSING EXIT TO FLCTT TO LOG ERROR_^1*_-(CODE = 13). ELSE LOAD (A) REGISTER WITH_^1*_-WRITE EOF FUNCTION CODE AND GO TO DOIT (39.)._^1*_]_^1*_]_^1*_'REW_^1*_)48. CALL LOAD POINT CHECK ROUTINE LPCHK (55.)._^1*_)49. ON RETURN (TAPE NOT AT LOAD POINT) LOAD (A)_^1*_-REGISTE€€R WITH REWIND FUNCTION CODE AND_^1*_-GO TO DOIT (39.)._^1*_]_^1*_'REWUN_^1*_)50. LOAD (A) REGISTER WITH REWIND OFF-LINE_^1*_-FUNCTION CODE AND GO TO DOIT (39.)._^1*_]_^1*_'SCFMFD_^1*_)51. LOAD (A) REGISTER WITH SEARCH EOF FORWARD_^1*_-FUNCTION CODE AND GO TO DOIT (39.)._^1*_]_^1*_'SCFMBK_^1*_)52. CALL LOAD POINT CHECK ROUTINE LPCHK (55.)._^1*_)53. ON RETURN (TAPE NOT AT LOAD POINT)€€ LOAD (A)_^1*_-REGISTER WITH SEARCH EOF BACKWARD FUNCTION_^1*_-CODE AND GO TO DOIT (39.)._^1*_]_^1*_'ADVRCD_^1*_)54. LOAD (A) REGISTER WITH ADVANCE RECORD FUNCTION_^1*_-CODE AND GO TO DOIT (39.)._^1*_]_^1*_'LPCHK_^1*_)55. IF TAPE NOT AT LOAD POINT RETURN TO CALLER._^1*_-ELSE SET MOTITR TO 1 AND GO TO NEXMOT (61.)._^1*_]_^1*_]_^1*_'CKTRNS_^1*_)56. LOAD (A) REGISTER WITH ALARM BIT ST€€ATUS AND_^1*_-(Q) REGISTER FROM RTRECV,I. GO TO CNTINU,Q._^1*_]_^1*_'CNTINU_^1*_)57. IF (A) REGISTER DIFFERENT FROM ZERO CALL_^1*_-ERROR ANALYSING ROUTINE ALARM (80.)._^1*_)58. IF NOT MOTION REQUEST GO TO TRNSOK (64.)._^1*_)59.IF MOTION WAS REWIND INCREMENT REWINDS_^1*_-COUNTER RWC (EXTERNAL), SET REWIND BIT OF_^1*_-ESTAT1 (BIT 6) AND EXIT TO SCHEDN (EXTERNAL)_^1*_-TO SCHEDULE REWI€€ND CHECK PROGRAM._^1*_)60. IF MOTION WAS REWIND OFF-LINE GO TO DONEM (41.)._^1*_]_^1*_'NEXMOT_^1*_)61. IF NON ITERATIVE MOTION REQUEST SHIFT_^1*_-PARAMETER WORD TO GET CURRENT CODE ON THE_^1*_-RIGHT AND GO TO DOMOT (20.)._^1*_)62. DECREMENT MOTITR AND GO TO COMPLT (44.) IF_^1*_-ZERO NOW._^1*_)63. IF MOTION SPECIAL FOR DIAGNOSTICS GO TO_^1*_-FIXERS (35.). ELSE LOAD (Q) REGISTER WITH€€_^1*_-MOTION CODE AND GO TO SUBMOT,Q._^1*_]_^1*_'TRNSOK_^1*_)64. IF READ REQUEST GO TO RDRQST (70.)._^1*_)65. IF 9 TRACK GO TO COMPLT (44.)._^1*_)66. IF FORMATTED WRITE GO TO COMPLT (44.)._^1*_]_^1*_'CONTIO_^1*_)67. CALL COMPV4 (EXTERNAL) TO CALCULATE NEXT_^1*_-TRANSFER LENGTH._^1*_)68. ON RETURN IF NO MORE TO TRANSFER GO TO_^1*_-COMPLT (44.)._^1*_)69. SAVE TRANSFER LENGTH IN QSTWD€€4,I AND_^1*_-GO TO LENGOK (9.)._^1*_]_^1*_'RDRQST_^1*_)70. IF EOF NOT ENCOUNTERED GO TO NOEOF (74.)._^1*_]_^1*_'EOF_^1*_)71. SET EOF BIT OF EREQST,I (BIT 14)._^1*_)72. CALL MAKEQ (EXTERNAL) TO SET V-FIELD OF_^1*_-REQUEST._^1*_)73. ON RETURN GO TO I20 (EXTERNAL) TO COMPLETE_^1*_-THE REQUEST._^1*_]_^1*_'NOEOF_^1*_)74. CALL FILEST (89.) TO GET NUMBER OF WORDS_^1*_-NOT YET TRANSFERED._€€^1*_)75. ON RETURN CALL COMPV4 (EXTERNAL) TO CALCULATE_^1*_-NUMBER OF WORDS TRANSFERED ON LAST READ. IF_^1*_-RECORD READ IS NOT NOISE RECORD GO TO_^1*_-NONOIS (77.)._^1*_)76. IF LAST READ WAS LOW THRESHOLD READ RESET LOW_^1*_-THRESHOLD READ BIT (BIT 10) OF ESTAT1, LOAD_^1*_-(A) REGISTER FROM FWA AND GO TO FRSTWD (11.)_^1*_-TO READ NEXT RECORD. ELSE EXIT TO RLCTT TO_^1*_-TRY LOW THR€€ESHOLD READ._^1*_]_^1*_'NONOIS_^1*_)77. CLEAR LOW THRESHOLD READ BIT OF ESTAT1_^1*_-(BIT 10) AND CALL SLCTT TO GET CURRENT WORD_^1*_-ADDRESS._^1*_)78. ON RETURN ((A) REGISTER CONTAINS CURRENT_^1*_-WORD ADDRESS) IF 7 TRACK CALL SEVNRD (EXTERNAL)_^1*_-TO CONTINUE._^1*_)79. IF FORMATTED READ GO TO COMPLT (44.) .ELSE GO_^1*_-TO CONTIO (67._^1*_]_^1*_'ALARM_^1*_)80. IF DEVICE NOT READY €€EXIT TO FLCTT TO LOG_^1*_-ERROR (CODE = 14)._^1*_)81. CALL FILEST (89.) TO GET ALARM STATUS. ON_^1*_-RETURN SAVE IT IN ERRORS._^1*_)82. IGNORING BUS RELINQUISH CHECK IF ANY ERRORS_^1*_-IN ALARM STATUS. IF NO ERROR FOUND INCREMENT_^1*_-EOT AND RETURN TO CALLER._^1*_)83. IF IRRECOVERABLE ERRORS EXIT TO FLCTT TO_^1*_-LOG ERROR (CODE = 2)._^1*_)84. IF NO CHARACTER FOUND IN 25 FEET EXIT€€ TO_^1*_-FLCTT TO LOG ERROR (CODE = 27)._^1*_)85. IF TRANSMISSION PARITY ERROR ENTER (A)_^1*_-REGISTER 36 (ERROR CODE) AND EXIT TO RLCTT_^1*_-TO TRY RECOVERY._^1*_)86. IF LOST DATA ENTER (A) REGISTER 1 (ERROR CODE)_^1*_-AND EXIT TO RLCTT TO TRY RECOVERY._^1*_)87. IF ANY PARITY ERROR ENTER (A) REGISTER 3_^1*_-(ERROR CODE) AND EXIT TO RLCTT TO TRY RECOVERY._^1*_)88. RETURN TO CALLER.€€_^1*_]_^1*_'FILEST_^1*_)89. CALL QLCTT TO LOAD FILE ADDRESS GIVEN IN_^1*_-(A) REGISTER._^1*_)90. ON RETURN CALL SLCTT TO GET FILE STATUS._^1*_)91. ON RETURN FILE STATUS IS IN (A) REGISTER._^1*_-RETURN TO CALLER._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7------------_^1*_]_^1*_'SLCTT - KERNEL STATUS SUBROUTINE_^1*_'QLCTT - KERNEL FUNCTION SUBROUTINE_^1*_'SEVENT - SEVEN TRACK HANDLER PROGRAM€€_^1*_'SEVNRD - SEVEN TRACK READ ROUTINE_^1*_'RLCTT - KERNEL RECOVERY ANCILLARY ROUTINE_^1*_'COMPV4 - 16 BIT SUBTRACTION ROUTINE_^1*_'MAKEQ - MAKE V-FIELD OF Q_^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$NLCTT_^1_(ENT_$FRSTWD_+FIRST WORD ADDRESS FUNCTION ENTRY_^1_(ENT_$FUNCTN_+DIRECTOR FUNCTION ENTRY_^1_(ENT_$CNTINU_+REFERENCE ADDRESS FOR RECOVERY_^1_(ENT_$NEXMOT_€€+NEXT MOTION ENTRY_^1_(ENT_$MOTITR_+MOTION ITERATIONS NUMBER_^1_(ENT_$TRNSOK_+RECOVERED ERROR ENTRY_^1_(ENT_$ALARM_,ALRAM ANALYSIS ENTRY_^1_(ENT_$FWA_.CURRENT FIRST WORD ADDRESS_^1_(ENT_$NUMBR_,CURRENT TRANSFER LENGTH_^1_(ENT_$EOT_.END OF TAPE WORD_^1_(ENT_$FILEST_+FILE STATUS SUBROUTINE ENTRY_^1*_]_^1*_]_^1*_]_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_€€(EXT*_#SLCTT_,KERNEL STATUS SUBROUTINE_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#FLCTT_,KERNEL FAULT ENTRY_^1_(EXT*_#SEVENT_+SEVEN TRACK ROUTINES ENTRY_^1_(EXT*_#RWNDCK_+ADDRESS OF RETURN TO REWIND CHECK_^1_(EXT*_#I20_.REQUEST COMPLETION ENTRY_^1_(EXT*_#SEVNRD_+SEVEN TRACK READ HANDLER_^1_(EXT*_#RLCTT_,RECOVERY ROUTINE ENTRY_^1_(EXT*_#COMPV4_%16 BIT ADDRESS SUBTRACTION €€ROUTINE_^1*_]_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1*_]_^1M0007_"EQU_$M0007($7)_%LPMASK+3_^1M000F_"EQU_$M000F($F)_%LPMASK+4_^1M001F_"EQU_$M001F($1F)_$LPMASK+5_^1M07FF_"EQU_$M07FF($7FF)_#LPMASK+11_^1M0FFF_"EQU_$M0FFF($FFF)_#LPMASK+12_^1M1FFF_"EQU_$M1FFF($1FFF)_"LPMASK+13_^1M7FFF_"EQU_$M7FFF($7FFF)_"LPMASK+15_^1*MFDFF_"EQU_$MFDFF($FDFF)_"ZROBIT+9_^1*MFF7F_"EQU_$€€MFF7F($FF7F)_"ZROBIT+7_^1*MFBFF_"EQU_$MFBFF($FBFF)_"ZROBIT+10_^1M0001_"EQU_$M0001($1)_$ONEBIT+0_^1M0002_"EQU_$M0002($2)_%ONEBIT+1_^1M0008_"EQU_$M0008($8)_%ONEBIT+3_^1M0020_"EQU_$M0020($20)_$ONEBIT+5_^1M0040_"EQU_$M0040($40)_$ONEBIT+6_^1M0080_"EQU_$M0080($80)_$ONEBIT+7_^1M0100_"EQU_$M0100($100)_#ONEBIT+8_^1M0200_"EQU_$M0200($200)_#ONEBIT+9_^1M0400_"EQU_$M0400($400)_#ONEBIT+10_^1M080€€0_"EQU_$M0800($800)_#ONEBIT+11_^1M1000_"EQU_$M1000($1000)_"ONEBIT+12_^1M4000_"EQU_$M4000($4000)_"ONEBIT+14_^1*M8000_"EQU_$M8000($8000)_"ONEBIT+15_^1*_]_^1*_]_^1_(EQU_$NOISLN(2)_^1*_]_^1*_]_^1_(EJT_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU€€_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS €€ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT V€€ALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)€€_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1*_]_^1_(EJT_^1*_]_^1****_]_^1*_7*********_^1*_7* NLCTT *_^1*_7*********_^1*_]_^1*€€_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1NLCTT_"NUM_$0_^1_(LDA-_#ESTAT2,I_)CHECK IF BUS RELINQUISHED_^1_(AND_$=XM1000_^1_(SAN_$2_0SKIP IF ON-BUS_^1_(ENA_$84_/BUS RELINQUISHED ERROR CODE=84_^1_(JMP*_#ERR_.LOG THE ERROR_^1_(ENQ_$4_0SAVE TRANSPORT STATUS_^1_(RTJ_$SLCTT_^1_(STA-_#TRNSPT,I_^1_(LDA-_#ESTAT1,I_)WAS UNIT JUST SELECTED_^1_(AND_$=XM0100_^1_(SAN_$2_0SKIP IF UNI€€T JUST SELECTED_^1_(JMP_$CKTRNS_+CHECK TRANSFER_^1_(EOR-_#ESTAT1,I_)CLEAR UNIT SELECT BIT (BIT 8 OF ESTA_^1_(STA-_#ESTAT1,I_^1_(LDA-_#ESTAT2,I_)IS UNIT READY_^1_(AND_$=XM0001_^1_(SAN_$2_0SKIP IF UNIT READY_^1_(ENA_$14_/UNIT NOT READY ERROR CODE=14_^1_(JMP*_#ERR_.LOG THE ERROR_^1_(LDQ-_#EPTR,I_+CHECK IF MOTION REQUEST_^1_(LDA+_#0,Q_^1_(ARS_$9_^1_(AND_$=XM001F_^1_(INA_$-14_^1_(SAN_$N€€OTMOT_+SKIP IF NOT MOTION REQUEST_^1_(JMP*_#MOTREQ_+PROCESS MOTION REQUEST_^1NOTMOT_!LDA-_#ELSTWD,I_)SAVE NUMBER OF WORDS TO TRANSFER_^1_(LDQ-_#ECCOR,I_^1_(RTJ_$COMPV4_^1_(STA-_#QSTWD4,I_^1_(INA_$-NOISLN-1_(IS NUMBER OF WORDS LEGAL_^1_(SAP_$LENGOK_+SKIP IF NUMBER OK_^1_(ENA_$31_/RECORD TOO SHORT,ERROR CODE=31_^1_(JMP*_#ERR_.LOG THE ERROR_^1LENGOK_!LDQ-_#ECCOR,I_*FIRST WORD ADDRESS €€TO Q_^1_(LDA-_#ESTAT1,I_)CHECK TRANSPORT TYPE_^1_(AND_$=XM0200_^1_(SAZ_$NINETR_+SKIP IF NINE TRACK TRANSPORT_^1_(RTJ_$SEVENT_+PREPARE FOR 7 TRACK TRANSFER_^1_(LDQ-_#ABUFF,I_*FIRST WORD ADDRESS TO Q (7 TRCK)_^1_(JMP*_#NINETR+1_^1NINETR_!LDA-_#QSTWD4,I_)GET TRANSFER LENGTH_^1_(STA-_#0_0SAVE CURRENT TRANSFER LENGTH_^1NUMBR_"NUM_$0_0NUMBER OF WORDS TO TRANSFER_^1_(STQ-_#0_0SAVE CURRENT€€ FIRST WORD ADDRESS_^1FWA_$NUM_$0_0FIRST WORD ADDRESS_^1_(TRQ_$A_0FIRST WORD ADDRESS TO A_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND FIRST WORD ADDRESS IN (A) REGISTER_^1*_]_^1FRSTWD_!ENQ_$1_0FIRST WORD ADDRESS TO CONTROLLER_^1_(RTJ_$QLCTT_^1_(CLR_$A_0SELECT FIRST BANK_^1_(ENQ_$2_^1_(RTJ_$QLCTT_^1_(LDA*_#NUMBR_,BLOCK LENGTH TO CONTROLLER_^1_(ENQ_$6_^1_(RTJ_$QL€€CTT_^1_(LDA-_#ESTAT1,I_)READ/WRITE_^1_(AND_$=XM0001_^1_(SAZ_$READ_-SKIP IF READ/FREAD REQUEST_^1_(LDA-_#TRNSPT,I_)IS WRITE ENABLED (RING?)_^1_(AND_$=XM0400_^1_(SAZ_$2_0SKIP IF WRITE ENABLED_^1_(ENA_$13_/WRITE PROTECTED,ERROR CODE=13_^1ERR_$JMP*_$ERR1_%EXIT WITH ERROR_^1_(ENA_$5_0WRITE FUNCTION CODE_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND FUNCTION CODE IN (A€€) REGISTER_^1*_]_^1FUNCTN_!ENQ_$0_0DIRECTOR FUNCTION_^1_(RTJ_$QLCTT_^1_(ENA_$30_/TIMEOUT PERIOD TO A_^1RTRN_#JMP*_#(NLCTT)_*RETURN TO KERNEL_^1READ_#LDA-_#ESTAT1,I_)CHECK IF LOW THRESHOLD READ_^1_(AND_$=XM0400_^1_(SAZ_$1_0SKIP IF NORMAL READ_^1_(ENA_$$20_.READ WITH LOW THRESHOLD_^1_(JMP*_#FUNCTN_+EXECUTE FUNCTION_^1MOTREQ_!STA*_#DENCOD_+CLEAR DENSITY CODE WORD_^1_(LDA-_#ESTAT1,I_)S€€ET MOTION BIT (BIT 5 OF ESTAT1)_^1_(ADD_$=XM0020_^1_(STA-_#ESTAT1,I_^1_(LDA-_#4,Q_.SAVE PARAMETER WORD_^1_(STA-_#QSTWD4,I_^1_(SAM_$NODENS_+SKIP IF ITERATIVE TYPE MOTION_^1_(AND_$=XM000F_#SAVE DENSITY CODE_^1_(STA*_#DENCOD_^1_(JMP*_#DOMOT_,PERFORM FIRST MOTION_^1NODENS_!LDA-_#ELU,I_,IS DIAGNOSTIC LOGICAL UNIT_^1_(EOR-_#DIAGLU,I_^1_(SAN_$1_0SKIP IF NOT DLU_^1_(JMP*_#DIAGNS_+HANDLE DL€€U REQUEST_^1_(LDA-_#QSTWD4,I_)GET NUMBER OF ITERATIONS_^1_(AND_$=XM0FFF_^1_(SAN_$1_0SKIP IF NUMBER GREATER THAN ZERO_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(STA*_#MOTITR_+SAVE NUMBER OF ITERATIONS_^1DOMOT_"EOR-_#QSTWD4,I_)SAVE MOTION CODES_^1_(STA-_#QSTWD4,I_^1_(ARS_$12_/SAVE CURRENT MOTION CODE_^1_(AND_$=XM0007_^1_(STA*_#MOTCOD_^1_(TRA_$Q_0MOTION CODE TO Q_^1_(JMP*_#SUBMOT,Q_)P€€ERFORM CURRENT MOTION_^1SUBMOT_!JMP*_#DONEM_,NO MOTION TO PROCESS_^1_(JMP*_#RECDBK_+BACKSPACE ONE RECORD_^1_(JMP*_#WRFM_-WRITE FILE MARK_^1_(JMP*_#REW_.REWIND_^1_(JMP*_#REWUN_,REWIND AND UNLOAD_^1_(JMP*_#SCFMFD_+SEARCH FILE MARK FORWARD_^1_(JMP*_#SCFMBK_+SEARCH FILE MARK BACKWARD_^1_(JMP*_#ADVRCD_+ADVANCE ONE RECORD_^1DIAGNS_!LDA-_#QSTWD4,I_)GET NUMBER OF WORDS OR ITERATIONS_^1_(AN€€D_$=XM07FF_^1_(SAN_$1_0SKIP IF NUMBER NOT ZERO_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(STA*_#MOTITR_+SAVE NUMBER_^1_(EOR-_#QSTWD4,I_)SAVE MOTION CODE_^1_(STA-_#QSTWD4,I_^1_(ARS_$11_^1_(AND_$=XM000F_^1_(STA*_#MOTCOD_^1_(INA_$-8_/CHECK IF NEW MOTION_^1_(SAP_$NEWMOT_+SKIP IF NEW MOTION_^1_(LDQ*_#MOTCOD_+PERFORM REQUESTED MOTION_^1_(JMP*_#SUBMOT,Q_^1NEWMOT_!INA_$-3_/IS MOTION CODE L€€EGAL_^1_(SAM_$PERMOT_+SKIP IF LEGAL CODE_^1_(ENA_$60_/ILLEGAL CODE , ERROR CODE = 60_^1ERR1_#JMP*_#ERROR_%EXIT WITH ERROR_^1PERMOT_!INA_$3_0REGAIN MOTION CODE_^1_(TRA_$Q_0PERFORM REQUESTED MOTION_^1_(JMP*_#NEW,Q_^1NEW_$JMP*_#CNBKSP_+CONTROLLED BACKSPACE_^1_(JMP*_#VARERS_+VARIABLE ERASE_^1FIXERS_!ENA_$8_0FIXED ERASE_^1_(JMP*_#FUNCTN_+PERFORM FIXED ERASE_^1CNBKSP_!RTJ*_#LPCHK_,CHECK €€IF TAPE AT LOAD POINT_^1_(LDA*_#MOTITR_+NOT AT LOAD POINT , LOAD BLOCK LENGT_^1_(ENQ_$6_^1_(RTJ_$QLCTT_^1_(ENA_$$A_/FUNCTION CODE TO A_^1GOON_#ENQ_$1_0SET MOTITR TO 1_^1_(STQ*_#MOTITR_^1DOIT_#JMP*_#FUNCTN_+PERFORM MOTION_^1VARERS_!LDA*_#MOTITR_+LOAD BLOCK LENGTH_^1_(ENQ_$6_^1_(RTJ_$QLCTT_^1_(ENA_$9_0FUNCTION CODE TO A_^1_(JMP*_#GOON_-CONTINUE_^1MOTCOD_!NUM_$0_0CURRENT MOTION CODE_^€€1DENCOD_!NUM_$0_0DENSITY CODE_^1MOTITR_!NUM_$0_0ITERATION NUMBER_^1DONEM_"LDA*_#DENCOD_+GET DENSITY CODE_^1_(SAN_$1_0SKIP IF ANY DENSITY REQUEST_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(LDA-_#TRNSPT,I_)IS TAPE AT LOAD POINT_^1_(ALS_$6_^1_(SAM_$1_0SKIP IF TAPE AT LOAD POINT_^1_(JMP*_#DENERR_+ILLEGAL REQUEST,LOG THE ERROR_^1_(LDQ*_#DENCOD_+DENSITY CODE TO Q_^1_(ALS_$5_0CHECK TRANSP€€ORT TYPE_^1_(SAP_$BOTH_-SKIP IF TWO DENSITIES AVAILABLE_^1_(ALS_$1_0CHECK NRZI/PE_^1_(SAP_$NRZI_-SKIP IF NRZI_^1_(INQ_$-4_/IS DENSITY CODE LEGAL FOR THIS TRANS_^1XIT_$SQZ_$1_0SKIP IF REQUEST LEGAL_^1_(JMP*_#DENERR_+ILLEGAL DENSITY,LOG THE ERROR_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1NRZI_#INQ_$-1_/IS DENSITY CODE LEGAL FOR THIS TRANS_^1_(JMP*_#XIT_^1BOTH_#ALS_$1_0IS 7 OR 9 TRACK €€TRANSPORT_^1_(SAP_$TRCK7_,SKIP IF 7 TRACK TRANSPORT_^1_(LDA-_#UNTMOD,I_)UPDATE DENSITY MODE_^1_(AND_$=XM7FFF_^1_(INQ_$-1_^1_(SQZ_$LOWDEN_^1_(INQ_$-3_^1_(SQZ_$HIGHDN_^1_(JMP*_#DENERR_+ILLEGAL DENSITY,LOG THE ERROR_^1TRCK7_"LDA-_#UNTMOD,I_)UPDATE DENSITY MODE_^1_(AND_$=XM7FFF_^1_(INQ_$-1_^1_(SQZ_$HIGHDN_^1_(INQ_$-1_^1_(SQZ_$LOWDEN_^1DENERR_!ENA_$51_/ILLEGAL DENSITY,ERROR CODE=51_^1ER€€ROR_"JMP_$FLCTT_,LOG THE ERROR_^1LOWDEN_!ADD_$=N$8000_#SET LOW DENSITY BIT_^1HIGHDN_!STA-_#UNTMOD,I_)SAVE NEW UNIT SELECT CODE_^1COMPLT_!LDA_$EOT_.WAS EOT ENCOUNTERED_^1_(SAN_$NEOT_'SKIP IF EOT ENCOUNTERED_^1_(JMP_$RTRN_'COMPLETE THE REQUEST_^1NEOT_#LDA-_#ESTAT2,I_"SET EOT BIT OF ESTAT2_^1_(AND_$=N$FDFF_^1_(ADD_$=N$FDFF_^1_(STA-_#ESTAT2,I_^1_(JMP*_#EOF_^1RECDBK_!RTJ*_#LPCHK_,CHECK €€IF TAPE AT LOAD POINT_^1_(ENA_$4_0NO, BACKSAPCE RECORD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1WRFM_#LDA-_#TRNSPT,I_)IS WRITE ENABLED (RING?)_^1_(AND_$=XM0400_^1_(SAZ_$2_0SKIP IF WRITE ENABLED_^1_(ENA_$13_/WRITE IMPOSSIBLE,ERROR CODE=13_^1_(JMP*_#ERROR_,LOG THE ERROR_^1_(ENA_$6_0WRITE FILE MARK CODE TO A_^1_(JMP*_#DOIT_-PERFORM DIRECTOR FUNCTION_^1REW_$RTJ*_#LPCHK_,CHECK IF TAPE€€ AT LOAD POINT_^1_(ENA_$7_0NOT AT LOAD POINT,REWIND CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1REWUN_"ENA_$11_/REWIND AND UNLOAD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1SCFMFD_!ENA_$2_0SEARCH FM CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1SCFMBK_!RTJ*_#LPCHK_,CHECK IF TAPE AT LOAD POINT_^1_(ENA_$3_0NO,SEARCH FM BACKWARD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1ADVRCD_!ENA_$1_0A€€DVANCE RECORD CODE TO A_^1_(JMP*_#DOIT_-PERFORM MOTION_^1LPCHK_"NUM_$0_0LOAD POINT CHECK_^1_(LDA-_#TRNSPT,I_)CHECK FOR LOAD POINT_^1_(AND_$=XM0200_^1_(SAN_$1_0SKIP IF AT LOAD POINT_^1_(JMP*_#(LPCHK)_*RETURN TO CALLER_^1_(ENA_$1_0PROCESS NEXT MOTION_^1_(STA*_#MOTITR_^1_(JMP*_#NEXMOT_^1CKTRNS_!LDA-_#ESTAT2,I_)GET ALARM BIT_^1_(AND_$=XM0008_^1_(LDQ-_#RTRECV,I_)CONTINUE_^1_(JMP*_#CNTIN€€U,Q_^1CNTINU_!SAZ_$1_0SKIP IF NO ALARM_^1_(RTJ*_#ALARM_,CHECK ALARM CAUSE_^1_(LDA-_#ESTAT1,I_)PROCESSING POSSIBLE,CHECK FOR MOTION_^1_(AND_$=XM0020_^1_(SAN_$1_0SKIP IF MOTION REQUEST_^1_(JMP*_#TRNSOK_+PROCESS DATA TRANSFER_^1_(LDQ*_#MOTCOD_+CHECK FOR REWIND_^1_(INQ_$-3_^1_(SQN_$NOTRW_,SKIP IF NOT REWIND_^1_(LDA-_#ESTAT1,I_)SET REWIND BIT (BIT 6 OF ESTAT1)_^1_(ADD_$=XM0040_^1_(STA-_€€#ESTAT1,I_^1_%JMP DONEM_(NO MOTION AFTER REWIND_^1NOTRW_"INQ_$-1_/CHECK FOR REWIND AND UNLOAD_^1_(SQN_$1_0SKIP IF NOT REWIND AND UNLOAD_^1_(JMP*_#DONEM_,COMPLETE THE REQUEST_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1NEXMOT_!LDA-_#QSTWD4,I_)GET PARAMETER WORD_^1_(SAM_$NZITR_,SKIP IF ITERATIVE TYPE REQUEST_^1_(ALS_$4_0GET NEXT MOTION CODE_^1_(JMP_$DOMOT+1_*PRO€€CESS NEXT MOTION_^1NZITR_"LDQ*_#MOTITR_+DECREMENT ITERATION NUMBER_^1_(INQ_$-1_^1_(STQ*_#MOTITR_^1_(SQZ_$MOTEXT_+SKIP IF NO MORE ITERATIONS TO DO_^1_(LDQ*_#MOTCOD_+IS NEW MOTION CODE_^1_(INQ_$-8_^1_(SQP_$DIAG_-SKIP IF DLU CODE_^1_(INQ_$8_^1_(JMP_$SUBMOT,Q_)PERFORM NEXT MOTION_^1DIAG_#JMP_$FIXERS_+PERFORM FIXED ERASE_^1MOTEXT_!JMP*_#COMPLT_+COMPLETE THE REQUEST_^1*_]_^1*_]_^1* ENTER€€ED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1TRNSOK_!LDA-_#ESTAT1,I_)IS READ OR WRITE_^1_(ALS_$15_^1_(SAM_$1_0SKIP IF WRITE REQUEST_^1_(JMP*_#RDRQST_+PROCESS READ REQUEST_^1_(ALS_$7_07 OR 9 TRACK_^1_(SAM_$1_0SKIP IF 7 TRACK TRANSPORT_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(AND_$=XM0080_#FORMATTED/UNFORMATTED_^1_(SAZ_$1_0SKIP IF UNFORMATTED_^1_(JMP*_#COMPLT_+COMPLETE THE REQUEST_^€€1CONTIO_!LDA-_#ELSTWD,I_)CALCULATE NEXT TRANSFER LENGTH_^1_(LDQ-_#ECCOR,I_^1_(RTJ_$COMPV4_^1_(SAN_$1_0SKIP IF DATA TO TRANSFER_^1CMPLT_"JMP*_#COMPLT_+COMPLETE THE REQUEST_^1_(STA-_#QSTWD4,I_)SAVE UPDATED TRANSFER LENGTH_^1_(JMP_$LENGOK_+PERFORM DATA TRANSFER_^1RDRQST_!LDA-_#ESTAT2,I_)WAS FILE MARK ENCOUNTERED_^1_(AND_$=XM0800_^1_(SAZ_$NOEOF_,SKIP IF NO FILE MARK ENCOUNTERED_^1EOF_$€€LDA-_#EREQST,I_)SET EOF BIT OF EREQST,I(BIT 14)_^1_(ADD_$=XM4000_^1_(STA-_#EREQST,I_^1_%LDA- ESTAT1,I_^1_%ADD =N$8000_^1_%STA- ESTAT1,I_^1_%CLR A,Q_^1_%JMP (NLCTT)_^1_(JMP_$I20_.COMPLETE THE REQUEST_^1NOEOF_"ENA_$8_0REST OF WORDS TO READ_^1_(RTJ*_#FILEST_^1_(SAM_$1_^1_(INA_$1_^1_(INA_$0_^1_(TRA_$Q_0REST OF WORDS TO READ TO Q_^1_(LDA_$NUMBR_,ORIGINAL TRANSFER LENGTH TO A_^1_(RTJ_€€$COMPV4_+ACTUAL NUMBER OF WORDS READ_^1_(INA_$-NOISLN-1_(WAS IT A NOISE RECORD_^1_(SAP_$NONOIS_+SKIP IF NOT NOISE_^1_(LDA-_#ESTAT1,I_)CHECK IF LOW THRESHOLD READ(BIT 10)_^1_(AND_$=XM0400_^1_(SAN_$2_0SKIP IF LOW THRESHOLD_^1RECOVR_!JMP_$RLCTT_,TRY RECOVERY_^1_(EOR-_#ESTAT1,I_)CLEAR LOW THRESHOLD BIT (BIT 10)_^1_(STA-_#ESTAT1,I_^1_(LDA_$FWA_.FIRST WORD ADDRESS TO A_^1_(JMP_$FRSTWD_+P€€ERFORM THE REQUEST ANEW_^1NONOIS_!LDA-_#ESTAT1,I_)CLEAR LOW THRESHOLD BIT (BIT 10)_^1_(AND_$=N$FBFF_^1_(STA-_#ESTAT1,I_^1_(ENQ_$1_0GET CURRENT ADDRESS_^1_(RTJ_$SLCTT_^1_(LDQ-_#ESTAT1,I_)7 OR 9 TRACK_^1_(QLS_$6_^1_(SQM_$TRCK7N_+SKIP IF 7 TRACK TRANSPORT_^1_(STA-_#ECCOR,I_*UPDATE CURRENT ADDRESS WORD_^1_(QLS_$8_0FORMATTED/UNFORMATTED_^1_(SQM_$3_0SKIP IF FORMATTED_^1_(JMP*_#CONTIO_+CO€€NTINUE READING_^1TRCK7N_!RTJ_$SEVNRD_+HANDLE 7 TRACK TRANSFER_^1_(JMP*_#CMPLT_,TRANSFER COMPLETED,COMPLETE THE REQU_^1*_]_^1*_]_^1* ALARM ANALYSIS_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1ALARM_"NUM_$0_^1_(LDA-_#ESTAT2,I_)IS DEVICE READY ?_^1_(AND_$=XM0001_^1_(SAN_$2_0SKIP IF UNIT READY_^1_(ENA_$14_/UNIT NOT READY,ERROR CODE=14_^1_(JMP*_#FAULT_,LOG THE ERROR_^1_(ENA_$10€€_/SAVE ALARM STATUS_^1_(RTJ*_#FILEST_^1_(STA-_#ALRMST,I_)SAVE ALARM STATUS_^1_(LDA-_#TRNSPT,I_)CHECK TRANSPORT MODE_^1_(AND_$=XM0002_^1_(SAZ_$PEMODE_+SKIP IF PE MODE_^1_(ENA_$-8_^1PEMODE_!ADD_$=XM1FFF_#MASK UNASSIGNED BITS_^1_(AND_$=N$FF7F_#IGNORE BUS RELINQUISHED BIT_^1_(AND-_#ALRMST,I_^1_(SAN_$CKERR_,SKIP IF ERROR_^1_(RAO-_#0_0SET EOT WORD_^1EOT_$NUM_$0_0END OF TAPE WORD_^1_(JMP*€€_#(ALARM)_*RETURN TO CALLER_^1CKERR_"STA-_#ALRMST,I_^1_(AND_$=N$E40_+CHECK FOR IRRECOVERABLE ERRORS_^1_(SAZ_$3_0SKIP IF NONE_^1_(ENA_$2_0LOG ALARM, ERROR CODE=2_^1FAULT_"JMP_$FLCTT_,LOG THE ERROR_^1_(LDA-_#ALRMST,I_)ERRORS TO A_^1_(ALS_$11_/NO CHARACTER READ IN 25 FEET ?_^1_(SAP_$2_^1_(ENA_$87_^1_(JMP*_#FAULT_,LOG THE ERROR_^1_(ALS_$8_0CHECK FOR TRANSMISSION PARITY ERROR_^1_(SAP_$N€€OTRPA_+SKIP IF NO TRANS. PARITY ERROR_^1_(ENA_$36_/TRANSMISSION PARITY ERROR CODE TO A_^1_(JMP*_#RECOVR_+TRY RECOVERY_^1NOTRPA_!ALS_$4_0CHECK IF LOST DATA_^1_(SAP_$NOLSDT_+SKIP IF NOT LOST DATA_^1_(ENA_$1_0LOST DATA ERROR CODE TO A_^1_(JMP*_#RECOVR_+TRY RECOVERY_^1NOLSDT_!AND_$=XM07FF_#CHECK IF PARITY ERROR_^1_(SAZ_$2_0SKIP IF NO PARITY ERROR_^1PARERR_!ENA_$3_0PARITY ERROR CODE TO €@A_^1_(JMP*_#RECOVR_+TRY RECOVERY_^1_(JMP*_#(ALARM)_*RETURN TO CALLER_^1*_]_^1*_]_^1* FILE STATUS_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND FILE ADDRESS IN (A) REGISTER_^1*_]_^1FILEST_!NUM_$0_^1_(ENQ_$3_0LOAD FILE ADDRESS_^1_(RTJ_$QLCTT_^1_(ENQ_$3_0GET FILE STATUS_^1_(RTJ_$SLCTT_^1_(JMP*_#(FILEST)_^1_(END_^__@PQL8326 CSY/ D86 P€1_%NAM QL8326_'DECK-ID D86 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT LOG_^1*_7********_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT LOG PREPARES THE DRIVER AND PHYSICAL_^1*_'DEVICE TABLE BEFORE ERROR LOGGING._^1*_]_^1*_]_^1*€€_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ANCILLARY ROUTINE SAVES ERROR CODE IN PDT_^1*_'AND SETS HARDWARE FAILURE BIT OF EREQST. IT TAKES_^1*_'ALSO SPECIAL CARE WHEN UNIT PERFORMED A REWIND._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'(I) REGISTER = PHYSICAL DEVICE TABLE ADDRESS_^1*_'(A) REGISTER = FAULT CODE_^1*_]_^1*_]_^1*_7OUTPUT_€€^1*_7------_^1*_]_^1*_'1. SAVES ERROR CODE IN FLTCOD WORD OF PDT._^1*_'2. CLEARS REWIND BIT OF ESTAT1 (BIT 6) IF_^1*_*UNIT PERFORMED A REWIND._^1*_'3. DECREMENTS REWINDS COUNTER IF UNIT_^1*_*PERFORMED A REWIND._^1*_'4. SETS HARDWARE FAILURE BIT OF EREQST,I._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. LLCTT ENTRY - ENTERED BY RETURN JUMP FROM KERNEL._^1*_'2. EXIT - TO €€KERNEL (CALLING ROUTINE)._^1*_]_^1_(EJT_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'LLCTT_^1*_*1. SAVE ERROR CODE (IN (A) REGISTER) IN FLTCOD,I._^1*_*2. IF UNIT PERFORMED A REWIND CLEAR REWIND BIT_^1*_-OF ESTAT1 (BIT 6) AND DECREMENT REWINDS_^1*_-COUNTER - RWC (EXTERNAL)._^1*_*3. SET HARDWARE FAILURE BIT OF EREQST (BIT 14)_^1*_-AND RETURN TO KERNEL (CALLING ROUTINE)._^1*_]_^1*_]_^1*_7ENTR€€Y POINTS_^1*_7------------_^1*_]_^1_(ENT_$LLCTT_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M0040_"EQU_$M0040($40)_$ONEBIT+6_^1M4000_"EQU_$M4000($4000)_"ONEBIT+14_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1€€)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(C€€URRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_€€#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LA€€ST OUTPUT_^1_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1_(EJT€€_^1*_]_^1****_]_^1*_]_^1*_7*********_^1*_7* LLCTT *_^1*_7*********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND ERROR CODE IN (A) REGISTER_^1*_]_^1*_]_^1LLCTT_"NUM_$0_^1_(STA-_#FLTCOD,I_)SAVE ERROR CODE_^1_(LDA-_#ESTAT1,I_)IS UNIT REWINDING_^1_(AND_$=XM0040_^1_(SAZ_$NOTRW_,SKIP IF UNIT NOT REWINDING_^1_(EOR-_#ESTAT1,I_)CLEAR REWIND BIT (BIT 6 OF ESTAT1)_^1_(STA-€_#ESTAT1,I_^1NOTRW_"LDA-_#EREQST,I_)SET HARDWARE FAILURE BIT OF EREQST,I_^1_(ADD_$=XM4000_^1_(STA-_#EREQST,I_^1_(LDA-_#ESTAT1,I_"SET ERROR BIT IN ESTAT1 INSTAD OF MAKQ_^1_(EOR_$=N$8000_^1_(STA-_#ESTAT1,I_^1_(JMP*_#(LLCTT)_*COMPLETE THE REQUEST_^1_(END_^__PQX8326 CSY/ D87 P€1_%NAM QX8326_'DECK-ID D87 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT REWIND CHECK_^1*_7*****************_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT REWIND CHECK IS RUN TO CHECK REWIND_^1*_'COMPLETION. IF REWIND NOT YET COM€€PLETED THE_^1*_'PROGRAM SCHEDULES ITSELF FOR ANOTHER CHECK._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE IS FIRST ENTERED AFTER A REWIND MOTION_^1*_'HAS BEEN INITIATED. IT IS THEN SCHEDULED TO RUN IN_^1*_'LOWER PRIORITY. THEN A BUS CONNECT AND UNIT SELECT_^1*_'ARE ESTABLISHED TO ENABLE STATUS SAMPLE. IF ERROR_^1*_'CONDITION THE REQUEST WILL €€BE COMPLETED. IF NO_^1*_'ERROR AND REWIND NOT COMPLETED THE PROGRAM IS_^1*_'RESCHEDULED. IF NO ERROR AND REWIND COMPLETED_^1*_'CONTROL IS TRANSFERED TO NLCTT TO CONTINUE REQUEST_^1*_'PROCESSING._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'RWLCTT_^1*_*(Q) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'RWNDCK_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL €€DEVICE TABLE_^1*_]_^1*_'SCHEDN_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. UPDATES DRIVER BUSY WORD - CURPDT IF DRIVER_^1*_*WAS FOUND NOT BUSY._^1*_'2. SCHEDULES ITSELF WHEN NEEDED._^1*_'3. RESETS AND SETS DIAGNOSTIC CLOCK EDCLK,I._^1*_'4. CLEARS REWIND BIT OF ESTAT1 (BIT 6) WHEN REWIND_^1*_*COMPLETED._^1*_'5. SETS MOTITR T€€O 1 ((MOTITR) = NUMBER OF ITERATIONS)._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'RWLCTT ENTRY - SCHEDULED FROM INTERNAL PARTS._^1*_'RWNDCK ENTRY - ENTERED FROM NLCTT TO CHECK STATUS._^1*_'SCHEDN ENTRY - ENTERED FROM NLCTT AFTER REWIND BEGIN._^1*_'EXIT - TO DISPATCHER AFTER RWLCTT RESCHEDULE._^1*_'EXIT - TO FLCTT TO LOG ERROR._^1*_'EXIT - TO DISPATCHER AFTER SCHEDULING €€NEXT PART TO_^1*_.RUN AT DRIVER PRIORITY._^1*_'EXIT - TO CONBUS TO ESTABLISH UNIT SELECT._^1*_'EXIT - TO NEXMOT TO CONTINUE REQUEST PROCESSING._^1*_'EXIT - TO NEXUNI AFTER RWLCTT RESCHEDULE TO_^1*_.PROCESS NEXT UNIT._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'RWLCTT_^1*_*1. SAVE PDT ADDRESS GIVEN BY (Q) REGISTER IN_^1*_-(I) REGISTER AND INHIBIT INTERRUPTS._^1*_*2. IF DRIVER BUSY EN€€ABLE INTERRUPTS AND SCHEDULE_^1*_-RWLCTT (1.) AGAIN (PRIORITY = 3)._^1*_*3. SET DRIVER BUSY AND ENABLE INTERRUPTS._^1*_*4. IF TIMEOUT ERROR EXIT TO FLCTT TO LOG ERROR_^1*_-(ERROR CODE = 0)._^1*_*5. SAVE DIAGNOSTIC CLOCK CONTENTS, SCHEDULE_^1*_-CONECT (6.) AT DRIVER PRIORITY AND EXIT_^1*_-TO DISPATCHER._^1*_]_^1*_'CONECT_^1*_*6. SAVE PDT ADDRESS GIVEN BY (Q) REGISTER IN_^1*_-(I) REG€€ISTER AND EXIT TO CONBUS (IN BLCTT)._^1*_]_^1*_'RWNDCK_^1*_*7. IF UNIT OFF-LINE EXIT TO FLCTT TO LOG ERROR_^1*_-(ERROR CODE = 14)._^1*_*8. IF UNIT NOT READY (REWIND NOT COMPLETE) GO_^1*_-TO RESCHD (10.)._^1*_*9. REWIND IS COMPLETED - DECREMENT RWC, CLEAR_^1*_-REWIND BIT OF ESTAT1 (BIT 6), SET MOTITR_^1*_-(EXTERNAL) TO 1 AND EXIT TO NEXMOT._^1*_]_^1*_'RESCHD_^1*_)10. LOAD (A) REGIST€€ER WITH PRESAVED DIAGNOSTIC_^1*_-CLOCK CONTENTS._^1*_]_^1*_'SCHEDN_^1*_)11. RESTORE DIAGNOSTIC CLOCK EDCLK,I._^1*_)12. SCHEDULE RWLCTT (1.) AND EXIT TO NEXUNI._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$RWNDCK_+REWIND STATUS CHECK ENTRY_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_^1_(EXT*_#CURPDT_+CURRENT PDT ADDRESS_^1_(EXT*_#MOTITR_+MOT€€ION ITERATIONS NUMBER_^1_(EXT*_#NEXMOT_+NEXT MOTION PROCESSING ENTRY_^1_(EXT*_#FLCTT_,KERNEL FAULT ENTRY_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M0001_"EQU_$M0001($1)_%ONEBIT+0_^1*MFFBF_!EQU_$MFFBF($FFBF)_"ZROBIT+6_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE EQUATES_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER IN€€ITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCAT€€ION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_€€*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1€€_%EQU_#UNTMOD(28)_*UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1_(EJT_^1*_]_^1***€€*_]_^1*_]_^1*_7**********_^1*_7* RWLCTT *_^1*_7**********_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1RWNDCK_!LDA-_#TRNSPT,I_)CHECK IF UNIT REWINDING_^1_(SAP_$ONLN_'SKIP IF UNIT ON LINE_^1_(ENA_$14_/UNIT NOT READY ERROR CODE=14_^1_(JMP_$FLCTT_%EXIT WITH ERROR_^1ONLN_#LDA-_#ESTAT2,I_"IS REWIND COMPLETE?_^1_(AND_$=XM0001_^1_(SAZ_$RESCHD_+SKIP IF UNIT STILL€Þ REWINDING_^1_(LDA-_#ESTAT1,I_)CLEAR REWIND IN PROGRESS BIT_^1_(AND_$=N$FFBF_^1_(STA-_#ESTAT1,I_^1_(ENA_$1_0SET MOTITR TO 1_^1_(STA_$MOTITR_^1_(JMP_$NEXMOT_+PERFORM NEXT MOTION_^1RESCHD_!JMP*_#RWNDCK_$TRY AGAIN_^1_(END_^__ÞPQR8326 CSY/ D88 P€1_%NAM QR8326_'DECK-ID D88 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT RECOVERY_^1*_7*************_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT RECOVERY CONTROLS RECOVERY ATTEMPTS_^1*_'FOR CERTAIN HARDWARE FAILURES._^1*_]_^1*_€€]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THE LCTT RECOVERY ANCILLARY ROUTINE HANDLES ERROR_^1*_'RECOVERY TRIALS FOR READ/FREAD AND WRITE/FWRITE_^1*_'REQUESTS. IT IS CALLED WHEN A NOISE RECORD IS_^1*_'ENCOUNTERED TO BACKSPACE THE RECORD AND READ IT_^1*_'AGAIN IN LOW THRESHOLD. MORE SOFISTICATED ACTIONS_^1*_'ARE PERFORMED WHEN IT IS CALLED TO RECOVER DATA_^1*_'T€€RANSFER ERRORS SUCH AS LOST DATA AND PARITY FAULTS._^1*_'THESE RECOVERIES ARE ATTEMPTED ONLY FOR NON_^1*_'DIAGNOSTIC LOGICAL UNITS. IF RECOVERY IS SUCCESSFUL_^1*_'PROCESSING OF REQUEST IS CONTINUED. IF RECOVERY_^1*_'FAILS ERROR LOGGING COMPLETES THE REQUEST._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7------------------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSIC€€AL DEVICE TABLE_^1*_]_^1*_'RLCTT_^1*_*(A) REGISTER = 0 IF NOISE RECOVERY_^1*_*(A) REGISTER = ERROR CODE IF NON NOISE RECOVERY_^1*_]_^1*_'BKSPRN_^1*_*(A) REGISTER = ALARM BIT STATUS_^1*_]_^1*_'BKREAD_^1*_*(A) REGISTER = ALARM BIT STATUS_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. SETS LOW THRESHOLD BIT (BIT 10) OF ESTAT1._^1*_'2. ENTERS PROPER VALUE INTO RTRECV,I._^1*_'3. SAVE€€S ERROR CODE IN FLTCOD,I IF NON NOISE RECOVERY._^1*_'4. SETS AND RESETS MODE BIT (BIT 3) OF ESTAT1 WHEN_^1*_*NEEDED FOR 7 TRACK TAPE RECOVERY._^1*_'5. ASSIGNS VALUE 15 FOR SWITCH MODE ERROR CODE._^1*_'6. SETS AND RESETS LOW THRESHOLD READ BIT (BIT 10)_^1*_*OF ESTAT1 DURING READ RECOVERY._^1*_'7. CALLS ALARM ANALYSIS ROUTINE - ALARM._^1*_'8. CALLS FILE STATUS ROUTINE - FILEST._^1*_'€€9. CALLS KERNEL QLCTT ROUTINE TO ISSUE FUNCTION._^1*_'10. INCREMENTS EOT WORD WHEN EOT ENCOUNTERED DURING_^1*_+WRITE RECOVERY._^1*_'11. ASSIGNS VALUE 32 FOR TAPE DEFECT ERROR CODE_^1*_+WHEN WRITE RECOVERY IMPOSSIBLE._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'RLCTT ENTRY - ENTERED FROM NLCTT TO TRY RECOVERY._^1*_'REREAD ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_€€6AFTER UNIT HAS BEEN SELECTED IN_^1*_6OPPOSITE MODE._^1*_'NOT7TR ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER RESTORING ORIGINAL MODE._^1*_'BKSPRN ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER A RECORD HAS BEEN BACKSPACED._^1*_'BKREAD ENTRY - ENTERED FROM NLCTT (THROUGH RTRECV,I)_^1*_6AFTER A RECORD HAS BEEN READ._^1*_'EXIT - TO FRSTWD (IN NLCTT) TO REREAD RE€€CORD._^1*_'EXIT - TO SELECT (IN BLCTT) TO SELECT UNIT IN_^1*_.OPPOSITE MODE._^1*_'EXIT - TO SELMOD (IN BLCTT) TO SELECT UNIT IN_^1*_.ORIGINAL MODE._^1*_'EXIT - TO TRNSOK (IN NLCTT) TO CONTINUE REQUEST_^1*_.PROCESSING._^1*_'EXIT - TO FUNCTN (IN NLCTT) TO PERFORM TAPE MOTIONS._^1*_'EXIT - TO FLCTT TO LOG ERROR._^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'RLCTT_^1*_*1. IF NOT NOISE REC€€OVERY GO TO NONOIS (5.)._^1*_*2. CALL BACKSPACE SUBROUTINE - BKSPC (32.). ON_^1*_-RETURN SET LOW THRESHOLD BIT (BIT 10) OF ESTAT1._^1*_]_^1*_]_^1*_'REDOIO_^1*_*3. CLEAR RTRECV,I._^1*_*4. LOAD (A) REGISTER FROM FWA AND EXIT TO FRSTWD._^1*_]_^1*_'NONOIS_^1*_*5. SAVE ERROR CODE IN FLTCOD,I._^1*_*6. IF DIAGNOSTIC LOGICAL UNIT GO TO FAILD (31.)._^1*_*7. LOAD (Q) REGISTER FROM DELTA AND €€GO TO START,Q._^1*_]_^1*_'START_^1*_*8. IF WRITE/FWRITE REQUEST GO TO WRTRCV (47.)._^1*_]_^1*_'RDRCV_^1*_*9. ENTER (A) REGISTER THE VALUE 5 AND SAVE IT_^1*_-IN MM._^1*_*10. SAVE (A) REGISTER IN NN AND ENTER THE VALUE 2_^1*_.IN PP._^1*_]_^1*_'REREAD_^1*_*11. CALL BACKSPACE SUBROUTINE - BKSPC (32.). ON_^1*_.RETURN CALL READRC (41.)._^1*_*12. ON NORMAL RETURN GO TO READOK (20.), ELSE_€€^1*_.CONTINUE._^1*_*13. IF PP LESS THAN 2 GO TO PLSTN2 (16.)._^1*_*14. DECREMENT NN. IF NN NOT ZERO NOW GO TO_^1*_.REREAD (11.)._^1*_*15. IF 9 TRACK TRANSPORT GO TO NOT7TR (23.)._^1*_]_^1*_'PLSTN2_^1*_*16. IF PP EQUALS ZERO GO TO RESTMD (19.)._^1*_*17. DECREMENT PP. IF PP NOT EQUAL TO 1 GO TO_^1*_.REREAD (11.)._^1*_*18. UPDATE RTRECV,I FOR RETURN TO REREAD (11.),_^1*_.LOAD (A) REGI€€STER WITH UNIT SELECT CODE WITH_^1*_.SWITCHED MODE AND EXIT TO SELECT (IN BLCTT)._^1*_]_^1*_'RESTMD_^1*_*19. UPDATE RTRECV,I FOR RETURN TO NOT7TR (23.)_^1*_-AND EXIT TO SELMOD (IN BLCTT)._^1*_]_^1*_'READOK_^1*_*20. IF PP EQUALS 2 CLEAR RTRECV,I AND EXIT TO_^1*_.TRNSOK (IN NLCTT)._^1*_*22. ENTER (A) REGISTER WITH MODE ERROR CODE_^1*_.(=15) AND EXIT TO FLCTT TO LOG ERROR._^1*_]_^1*_'€€NOT7TR_^1*_*23. CLEAR BB._^1*_*24. CALL BACKSPACE SUBROUTINE - BKSPC (32.)._^1*_.ON RETURN IF TAPE AT LOAD POINT GO TO_^1*_.NOMORE (26.)._^1*_*25. INCREMENT BB. IF BB NOT EQUAL TO 4 GO TO_^1*_.(24.)._^1*_]_^1*_'NOMORE_^1*_*26. IF BB EQUALS 1 GO TO LASTRD (28.)._^1*_*27. DECREMENT BB AND CALL READRC (41.).ON RETURN_^1*_.GO TO NOMORE (26.)._^1*_]_^1*_'LASTRD_^1*_*28. CALL READRC (41.€€). ON NORMAL RETURN CLEAR_^1*_.RTRECV,I AND EXIT TO TRNSOK (IN NLCTT)._^1*_.ON ABNORMAL RETURN CONTINUE._^1*_*29. DECREMENT MM. IF MM NOT EQUAL ZERO NOW, ENTER_^1*_.(A) REGISTER THE VALUE 5 AND GO TO (10.)._^1*_*30. REVERSE LOW THRESHOLD READ BIT (BIT 10) OF_^1*_.ESTAT1. IF BIT NOW SET GO TO RDRCV (9.)._^1*_]_^1*_'FAILD_^1*_*31. LOAD (A) REGISTER FROM FLTCOD,I AND EXIT_^1*_.TO FLCT€€T TO LOG ERROR._^1*_]_^1*_'BKSPC_^1*_*32. UPDATE RTRECV,I FOR RETURN TO BKSPRN (35.)._^1*_]_^1*_'CODE_^1*_]_^1*_*33. ENTER (A) REGISTER THE VALUE 4 (BACKSPACE_^1*_.FUNCTION CODE)._^1*_*34. EXIT TO FUNCTN (IN NLCTT)._^1*_]_^1*_'BKSPRN_^1*_*35. RESTORE CODE (33.) TO ENABLE BACKSPACE ON_^1*_.NEXT CALL OF BKSPC._^1*_*36. IF (A) REGISTER EQUALS ZERO (NO ALARM) RETURN_^1*_.TO CALLER OF B€€KSPC (32.)._^1*_*37. IF UNIT NOT READY ENTER (A) REGISTER THE VALUE_^1*_.14 (ERROR CODE) AND EXIT TO FLCTT TO LOG ERROR._^1*_*38. CALL FILEST (EXTERNAL) TO GET ALARM STATUS._^1*_*39. ON RETURN IF NO FATAL ERRORS RETURN TO CALLER_^1*_.OF BKSPC (32.)._^1*_*40. ENTER (A) REGISTER THE VALUE 2 (ALARM ERROR_^1*_.CODE) AND EXIT TO FLCTT TO LOG ERROR._^1*_]_^1*_'READRC_^1*_*41. UPDATE RTRE€€CV,I FOR RETURN TO BKREAD (42.)_^1*_.AND GO TO (4.)._^1*_]_^1*_'BKREAD_^1*_*42. IF (A) REGISTER EQUALS ZERO (NO ALARM) RETURN_^1*_.TO CALLER OF READRC (41.)._^1*_*43. UPDATE DELTA FOR RETURN TO RETRN (45.) AND_^1*_.CALL ALARM (EXTERNAL)._^1*_*44. ON NORMAL RETURN GO TO (46.)._^1*_]_^1*_'RETRN_^1*_*45. INCREMENT RETURN ADDRESS IN READRC (41.)._^1*_*46. CLEAR DELTA AND RETURN TO CALL€€ER OF_^1*_.READRC (41.)._^1*_]_^1*_]_^1*_]_^1*_'WRTRCV_^1*_*47. CALL FILEST (EXTERNAL) TO GET BLOCK LENGTH_^1*_.STATUS._^1*_*48. ON RETURN SAVE THE NUMBER OF WORDS ALREADY_^1*_.WRITTEN IN TEMP._^1*_*49. CALL QLCTT TO LOAD BLOCK LENGTH._^1*_*50. ON RETURN CHANGE CONTENT OF CODE (33.) TO_^1*_.ENABLE CONTROLLED BACKSPACE ON CALL OF_^1*_.BKSPC (32.)._^1*_*51. CALL BKSPC (32.) AND ON RE€€TURN CALL QLCTT_^1*_.TO LOAD BLOCK LENGTH KEPT IN TEMP._^1*_*52. ON RETURN CHANGE CONTENT OF CODE (33.) TO_^1*_.ENABLE VARIABLE ERASE ON CALL OF BKSPC (32.)._^1*_*53. CALL BKSPC (32.) AND ON RETURN INCREMENT_^1*_.EOT IF END OF TAPE ENCOUNTERED._^1*_*54. INCREMENT ERSCNT._^1*_*55. IF ERSCNT LESS THAN $100 GO TO REDOIO (3.)._^1*_*56. LOAD (A) REGISTER WITH TAPE DEFECT ERROR_^1*_.CODE€€ (32) AND EXIT TO FLCTT TO LOG ERROR._^1*_]_^1*_]_^1*_7SUBROUTINES_^1*_7-----------_^1*_]_^1*_'QLCTT - KERNEL FUNCTION SUBROUTINE_^1*_'FILEST - FILE STATUS ROUTINE_^1*_'ALARM - ALARM ANALYSIS ROUTINE_^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$RLCTT_^1_(ENT_$DELTA_,RETURN CORRECTION FOR ALARM IN RECOV_^1_(ENT_$ERSCNT_+ERASE COUNT_^1*_]_^1*_]_^1*_7EXTERNAL REFEREN€€CES_^1*_7-------------------_^1*_]_^1_(EXT*_#FLCTT_,KERNEL FAULT ENTRY_^1_(EXT*_#FWA_.FIRST WORD ADDRESS WORD_^1_(EXT*_#FRSTWD_+FIRST WORD ADDRESS FUNCTION ENTRY_^1_(EXT*_#FUNCTN_+DIRECTOR FUNCTION ENTRY_^1_(EXT_$CNTINU_+BASE ADDRESS FOR RECOVERY RETURN_^1_(EXT*_#FILEST_+FILE STATUS SUBROUTINE_^1*_]_^1_(EJT_^1*_]_^1_(EQU_$DIAG(0)_^1_(IFA_$DIAG,EQ,0_^1*_]_^1*_]_^1*_7EXTERNAL REFEREN€€CES_^1*_7-------------------_^1*_]_^1_(EXT*_#QLCTT_,KERNEL FUNCTION SUBROUTINE_^1_(EXT*_#TRNSOK_+RECOVERED ERROR ENTRY_^1_(EXT*_#SELECT_+UNIT SELECT FUNCTION ENTRY_^1_(EXT*_#SELMOD_+MODE SELECT ENTRY_^1_(EXT*_#NUMBR_,NUMBER OF WORDS TO TRANSFER WORD_^1_(EXT*_#EOT_.END OF TAPE WORD_^1_(EXT*_#ALARM_,ALARM ANALYSIS SUBROUTINE_^1_(EIF_^1*_]_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1€€*_7-----------------_^1*_]_^1M0001_"EQU_$M0001($1)_%ONEBIT+0_^1M0008_"EQU_$M0008($8)_%ONEBIT+3_^1M0100_"EQU_$M0100($100)_#ONEBIT+8_^1M0200_"EQU_$M0200($200)_#ONEBIT+9_^1M0400_"EQU_$M0400($400)_#ONEBIT+10_^1M2000_"EQU_$M2000($2000)_"ONEBIT+13_^1*_]_^1*_]_^1***_$PHYSICAL DEVICE TABLE_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU€€_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DIRECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU€€_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMB€€ER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_%EQU_#UNTMOD(28)_*UN€€IT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1*_]_^1*_]_^1_(EJT_^1*_]_^1****_]_^1*_7€€*********_^1*_7* RLCTT *_^1*_7*********_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* AND (A) REGISTER = 0 IF NOISE RECOVERY_^1*_#(A) REGISTER = ERROR CODE IF NON NOISE RECOVERY_^1*_]_^1RLCTT_"SAZ_$1_0SKIP IF NOISE RECOVERY_^1_(JMP*_#NONOIS_+PROCESS NON NOISE RECOVERY_^1_(RTJ_$BKSPC_%BACKSPACE ONE RECORD_^1_(LDA-_#ESTAT1,I_)SET LOW THRESHOLD READ BIT_^1_(ADD_$=€€XM0400_^1_(STA-_#ESTAT1,I_^1REDOIO_!ENQ_$0_0CLEAR RETURN FOR RECOVERY_^1_(STQ-_#RTRECV,I_^1_(LDA_$FWA_.PERFORM I/O ANEW_^1_(JMP_$FRSTWD_^1_(IFA_$DIAG,EQ,1_^1NONOIS_!JMP*_#UNRCVD_^1ERSCNT NUM 0_^1DELTA NUM 0_^1_(EIF_^1_(IFA_$DIAG,EQ,0_^1NONOIS_!STA-_#FLTCOD,I_)SAVE ERROR CODE_^1_(LDA-_#ELU,I_,IS DIAGNOSTIC LOGICAL UNIT_^1_(EOR-_#DIAGLU,I_^1_(SAN_$1_0SKIP IF NOT DLU_^1_(JMP*_#FAIL€€D_,LOG THE ERROR_^1_(LDA-_#RFLAG,I_*IS RECOVERY ENABLED?_^1_(SAP_$1_0YES,SKIP_^1_(JMP*_#FAILD_,NO,LOG ERROR_^1_(LDQ*_#DELTA_^1_(JMP*_#START,Q_*CONTINUE_^1START_"LDA-_#ESTAT1,I_)READ OR WRITE_^1_(AND_$=XM0001_^1_(SAZ_$RDRCV_,SKIP IF READ RECOVERY_^1_(JMP_$WRTRCV_^1RDRCV_"ENA_$5_0INITIALIZE RECOVERY COUNTERS_^1_(STA-_#0_^1MM_%NUM_$0_0RETRY COUNT_^1_(STA-_#0_^1NN_%NUM_$0_0REREAD COUNT€€_^1_(ENA_$2_^1_(STA-_#0_^1PP_%NUM_$0_0OPPOSITE MODE RETRY COUNT_^1REREAD_!RTJ*_#BKSPC_,BACKSPACE ONE RECORD_^1_(RTJ*_#READRC_+REREAD_^1_(JMP*_#READOK_+READ OK, FINISH RECOVERY_^1_(LDQ*_#PP_/WAS MODE CHANGED_^1_(INQ_$-2_^1_(SQZ_$1_0SKIP IF MODE UNCHANGED_^1_(JMP*_#PLSTN2_+HANDLE REREAD IN CHANGED MODE_^1_(LDQ*_#NN_/DECREMENT REREAD COUNT_^1_(INQ_$-1_^1_(STQ*_#NN_^1_(SQZ_$1_0SKIP IF €€TRIED ENOUGH_^1_(JMP*_#REREAD_+REREAD ONCE MORE_^1_(LDA-_#ESTAT1,I_)7 OR 9 TRACK_^1_(AND_$=XM0200_^1_(SAN_$1_0SKIP IF 7 TRACK TRANSPORT_^1_(JMP*_#NOT7TR_^1PLSTN2_!LDQ*_#PP_/IS OPPOSITE MODE RETRY OVER_^1_(SQN_$1_0SKIP IF NOT_^1_(JMP*_#RESTMD_+RESTORE MODE_^1_(INQ_$-1_/DECREMENT OPPOSITE MODE RETRY COUNT_^1_(STQ*_#PP_^1_(INQ_$-1_/WAS OPPOSITE MODE SELECTED_^1_(SQZ_$1_0SKIP IF OPPOSI€€TE MODE TO SELECT_^1_(JMP*_#REREAD_+REREAD_^1_(LDA_$=XREREAD_)UPDATE RECOVERY RETURN_^1_(SUB_$=XCNTINU_^1_(STA-_#RTRECV,I_^1_(LDA-_#ESTAT1,I_)SWITCH MODE_^1_(AND_$=XM0008_^1_(TRA_$Q_^1_(CLR_$A_^1_(SQN_$2_^1_(LDA_$=XM2000_^1_(ADD-_#UNTMOD,I_^1_(JMP_$SELECT_+SELECT UNIT_^1RESTMD_!LDA_$=XNOT7TR_)UPDATE RECOVERY RETURN_^1_(SUB_$=XCNTINU_^1_(STA-_#RTRECV,I_^1_(JMP_$SELMOD_+SELECT UNIT W€€ITH ORIGINAL MODE_^1READOK_!LDQ*_#PP_/WAS MODE CHANGED_^1_(INQ_$-2_^1_(SQN_$4_*SKIP IF OPPOSITE MODE_^1RECVRD_!STA-_#RTRECV,I_)CLEAR RECOVERY RETURN WORD_^1_(RAO-_#RCNTFG,I_)INDEX RECOVERY COUNT_^1_(JMP_$TRNSOK_+CONTINUE DATA TRANSFER_^1_(ENA_$86_/MODE ERROR CODE TO A_^1_(JMP*_#UNRCVD_+LOG THE ERROR_^1NOT7TR_!ENA_$0_0CLEAR BACKSPACE COUNTER_^1_(STA-_#0_^1BB_%NUM_$0_0BACKSPACE COUNT€€_^1_(RTJ*_#BKSPC_,BACKSPACE ONE RECORD_^1_(LDA-_#TRNSPT,I_)IS TAPE AT LOAD POINT_^1_(AND_$=XM0200_^1_(SAN_$NOMORE_+SKIP IF TAPE AT LOAD POINT_^1_(RAO*_#BB_/INCREMENT BACKSPACE COUNT_^1_(LDA*_#BB_/MORE TO BACKSPACE_^1_(INA_$-4_^1_(SAZ_$NOMORE_+SKIP IF ALREADY 3 BACKSPACES_^1_(JMP*_#BB+1_-BACKSPACE ONCE MORE_^1NOMORE_!LDA*_#BB_/IS NEXT RECORD BAD ONE_^1_(INA_$-1_^1_(SAZ_$LASTRD_+SKIP€€ IF NEXT RECORD TO RECOVER_^1_(STA*_#BB_^1_(RTJ*_#READRC_+READ RECORD_^1_(NOP_$0_^1_(JMP*_#NOMORE_+CHECK HEAD POSITIONING_^1LASTRD_!RTJ*_#READRC_+READ THE RECORD_^1_(JMP*_#RECVRD_+READ OK, RECOVERY SUCCESFUL_^1_(LDA*_#MM_/RETRIED ENOUGH?_^1_(INA_$-1_^1_(STA*_#MM_^1_(SAZ_$2_0SKIP IF RETRIED ENOUGH_^1_(ENA_$5_0RETRY AGAIN_^1_(JMP*_#MM+1_^1_(LDA-_#ESTAT1,I_)CHANGE LOW THRESHOLD READ B€€IT_^1_(EOR_$=XM0400_^1_(STA-_#ESTAT1,I_^1_(AND_$=XM0400_#WAS LOW THRESHOLD READ ALREADY USED?_^1_(SAZ_$1_0SKIP IF YES_^1_(JMP*_#RDRCV_,TRY RECOVERY WITH LOW THRESHOLD READ_^1FAILD_"LDA-_#FLTCOD,I_)READ IRRECOVERABLE,LOG THE ERROR_^1_(JMP*_#UNRCVD_^1DELTA_"NUM_$0_0RETURN CORRECTION FOR ALARM IN RECOV_^1_(EIF_^1*_]_^1*_]_^1* BACKSPACE RECORD ROUTINE_^1*_]_^1BKSPC_"NUM_$0_^1_(LDA_$=XB€€KSPRN_)UPDATE RETURN FOR RECOVERY_^1_(SUB_$=XCNTINU_^1_(STA-_#RTRECV,I_^1CODE_#ENA_$4_0BACKSPACE ONE RECORD_^1_(JMP_$FUNCTN_^1BKSPRN_!LDQ_$=N$A04_+RESTORE BACKSPACE CAPABILITY_^1_(STQ*_#CODE_^1_(SAN_$1_0SKIP IF ALARM_^1_(JMP*_#(BKSPC)_*RETURN TO CALLER_^1_(LDA-_#ESTAT2,I_)IS UNIT READY ?_^1_(AND_$=XM0001_^1_(SAN_$2_0SKIP IF UNIT READY_^1_(ENA_$14_/UNIT NOT READY,ERROR CODE=14_^1_(J€€MP*_#UNRCVD_+LOG THE ERROR_^1_(ENA_$10_/GET ALARM STATUS_^1_(RTJ_$FILEST_^1_(AND_$=N$D0_,ANY FATAL ERRORS_^1_(SAN_$1_0SKIP IF FATAL ERRORS_^1_(JMP*_#(BKSPC)_*RETURN TO CALLER_^1_(ENA_$2_0LOG ALARM,ERROR CODE=2_^1UNRCVD_!JMP_$FLCTT_^1_(IFA_$DIAG,EQ,0_^1*_]_^1*_]_^1* READ RECORD ROUTINE_^1*_]_^1READRC_!NUM_$0_^1_(LDA_$=XBKREAD_)UPDATE RETURN FOR RECOVERY_^1_(SUB_$=XCNTINU_^1_(STA-_#R€€TRECV,I_^1_(JMP_$REDOIO+2_)REDO I/O_^1BKREAD_!SAZ_$BACK_-SKIP IF NO ALARM_^1_(LDA_$=XRETRN-START_#UPDATE RETURN FOR ALARM_^1_(STA*_#DELTA_^1_(RTJ_$ALARM_,ANALYSE ALARM CAUSE_^1_(JMP*_#RETRN+1_*RECOVERED_^1RETRN_"RAO*_#READRC_+NOT RECOVERED_^1_(CLR_$A_0CLEAR RETURN FOR ALARM_^1_(STA*_#DELTA_^1BACK_#JMP*_#(READRC)_)RETURN TO CALLER_^1*_]_^1*_]_^1* WRITE RECOVERY_^1*_]_^1WRTRCV_!ENA_$€€8_0GET BLOCK LENGTH STATUS_^1_(RTJ_$FILEST_^1_(SAM_$1_^1_(INA_$1_^1_(INA_$0_^1_(SUB_$NUMBR_,GET NUMBER OF WORDS ALREADY WRITTEN_^1_(TCA_$A_^1_(STA-_#0_0SAVE IT_^1TEMP_#NUM_$0_^1_(ENQ_$6_0BLOCK LENGTH TO CONTROLLER_^1_(RTJ_$QLCTT_^1_(LDA_$=N$A0A_+ENABLE CONTROLLED BACKSPACE_^1_(STA*_#CODE_^1_(RTJ*_#BKSPC_,PERFORM CONTROLLED BACKSPACE_^1_(LDA*_#TEMP_-NUMBER OF WORDS TO A_^1_(ENQ_$6_0€€BLOCK LENGTH TO CONTROLLER_^1_(RTJ_$QLCTT_^1_(LDA_$=N$A09_+ENABLE VARIABLE ERASE_^1_(STA*_#CODE_^1_(RTJ*_#BKSPC_,PERFORM VARIABLE ERASE_^1_(LDA-_#ESTAT2,I_)WAS EOT ENCOUNTERED_^1_(AND_$=XM0200_^1_(LDA_$=XM0100_#NUMBER OF ERASES TOO HIGH?_^1_(SAZ_$2_0SKIP IF EOT NOT ENCOUNTERED_^1_(RAO_$EOT_.INCREMENT EOT WORD_^1_(RAO-_#0_0INCREMENT ERASE COUNT_^1ERSCNT_!NUM_$0_0ERASE COUNTER_^1_(SU€ØB*_#ERSCNT_^1_(SAN_$2_0SKIP IF NUMBER OF ERASES ACCEPTABLE_^1_(ENA_$32_/TAPE DEFECT,ERROR CODE=32_^1_(JMP*_#UNRCVD_+LOG THE ERROR_^1_(RAO-_#RCNTFG,I_)INDEX RECOVERY COUNT_^1_(JMP_$REDOIO_+REDO I/O_^1_(EIF_^1_(END_^__ØPQS8326 CSY/ D89 P€1_%NAM QS8326_'DECK-ID D89 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_7LCTT 7 TRACK HANDLER_^1*_7********************_^1*_]_^1*_]_^1*_7FUNCTION_^1*_7--------_^1*_]_^1*_'THE LCTT 7 TRACK HANDLER SUPPLIES PACK AND UNPACK_^1*_'PROCEDURES FOR DATA TR€€ANSFER ON 7 TRACK TAPE_^1*_'TRANSPORT._^1*_]_^1*_]_^1*_7GENERAL DESCRIPTION_^1*_7-------------------_^1*_]_^1*_'THIS ROUTINE CONTROLS SPLITTING OF REQUEST ACCORDING_^1*_'TO DRIVER BUFFER. WHEN ASCII MODE DATA IS CONVERTED_^1*_'TO BCD IF WRITE AND FROM BCD IF READ. WHEN BINARY_^1*_'MODE DATA IS UNPACKED IF WRITE AND PACKED IF READ._^1*_]_^1*_]_^1*_7INPUT REQUIREMENTS_^1*_7----------€€--------_^1*_]_^1*_'ALL ENTRY POINTS_^1*_*(I) REGISTER = ADDRESS OF PHYSICAL DEVICE TABLE_^1*_]_^1*_'SEVNRD_^1*_*(A) REGISTER = CURRENT WORD ADDRESS_^1*_*(Q) REGISTER = ESTAT1 6 LEFT SHIFTED_^1*_]_^1*_]_^1*_7OUTPUT_^1*_7------_^1*_]_^1*_'1. UPDATES ECCOR,I AND QSTWD4,I._^1*_'2. CALLS COMPV4 FOR 16 BIT ARITHMETIC._^1*_'3. ON RETURN TO CALLER OF SEVENT (A) REGISTER_^1*_*CONTAINS BLOC€€K LENGTH FOR NEXT TRANSFER._^1*_]_^1*_]_^1*_7ENTRY/EXIT_^1*_7----------_^1*_]_^1*_'1. SEVENT ENTRY - ENTERED BY RETURN JUMP FROM NLCTT._^1*_'2. SEVNRD ENTRY - ENTERED BY RETURN JUMP FROM NLCTT._^1*_'3. EXIT - TO NLCTT (CALLING ROUTINE)._^1*_]_^1*_]_^1*_]_^1*_]_^1*_7FLOW_^1*_7----_^1*_]_^1*_'SEVENT_^1*_*1. IF REQUEST NEEDS NO SPLITTING GO TO NUMOK (3.)._^1*_*2. CALCULATE BLOCK LENGT€€H FOR NEXT TRANSFER._^1*_]_^1*_'NUMOK_^1*_*3. SAVE BLOCK LENGTH IN NUMBR._^1*_*4. IF ASCII MODE GO TO ASCII (6.)._^1*_*5. CALCULATE PACK/UNPACK BUFFER SIZE AND UPDATE_^1*_-NUMBR ACCORDINGLY._^1*_]_^1*_'ASCII_^1*_*6. IF WRITE/FWRITE REQUEST GO TO (8.)._^1*_]_^1*_'EXIT_^1*_*7. LOAD (A) REGISTER FROM NUMBR AND EXIT TO_^1*_-CALLER OF SEVENT._^1*_*8. SAVE LAST WORD ADDRESS (IN DRIVER BU€€FFER)_^1*_-IN LWA._^1*_*9. IF BINARY MODE CALL UNPK SUBROUTINE AND ON_^1*_-RETURN GO TO EXIT (7.)._^1*_)10. CALL ASCBCD SUBROUTINE AND ON RETURN GO TO_^1*_-EXIT (7.)._^1*_]_^1*_]_^1*_'UNPK_^1*_*UNPACK USER DATA INTO DRIVER BUFFER AND_^1*_*RETURN TO CALLER._^1*_]_^1*_]_^1*_'ASCBCD_^1*_*CONVERT USER DATA INTO DRIVER BUFFER FROM_^1*_*ASCII CODE TO BCD CODE AND RETURN TO CALLER._^1*_]_€€^1*_]_^1*_'SEVNRD_^1*_*1. SAVE (A) REGISTER IN LWA._^1*_*2. IF ASCII MODE CALL BCDASC SUBROUTINE AND_^1*_-ON RETURN GO TO (4.)._^1*_*3. CALL PACK SUBROUTINE AND CONTINUE ON RETURN._^1*_*4. IF FORMATTED READ RETURN TO CALLER OF SEVNRD._^1*_*5. IF NO MORE TO READ RETURN TO CALLER OF SEVNRD._^1*_*6. SAVE NUMBER OF WORDS LEFT TO READ IN QSTWD4,I_^1*_-AND GO TO SEVENT._^1*_]_^1*_]_^1*_'€€PACK_^1*_*PACK DATA IN DRIVER BUFFER INTO USER BUFFER_^1*_*AND RETURN TO CALLER._^1*_]_^1*_]_^1*_'BCDASC_^1*_*CONVERT DATA IN DRIVER BUFFER FROM BCD TO_^1*_*ASCII INTO USER BUFFER AND RETURN TO CALLER._^1*_]_^1*_]_^1*_7ENTRY POINTS_^1*_7------------_^1*_]_^1_(ENT_$SEVENT_^1_(ENT_$SEVNRD_+7 TRACK READ HANDLER ENTRY_^1*_]_^1*_]_^1*_7EXTERNAL REFERENCES_^1*_7-------------------_^1*_]_€€^1_(EXT_$COMPV4_+16 BIT ADDRESS SUBTRACTION ROUTINE_^1*_]_^1_(EJT_^1*_]_^1*_7EQUATE REFERENCES_^1*_7-----------------_^1*_]_^1M0003_"EQU_$M0003($3)_%LPMASK+2_^1M00FF_"EQU_$M00FF($FF)_$LPMASK+8_^1*MFF00_!EQU_$MFF00($FF00)_"NZERO+8_^1M0001_"EQU_$M0001($1)_%ONEBIT+0_^1M0002_"EQU_$M0002($2)_%ONEBIT+1_^1M0004_"EQU_$M0004($4)_%ONEBIT+2_^1M0008_"EQU_$M0008($8)_%ONEBIT+3_^1*_]_^1*_]_^1***_€€$PHYSICAL DEVICE TABLE_^1*_]_^1_(EQU_$ELVL(0)_*SCHEDULER CALL WITH PRIORITY LEVEL_^1_(EQU_$EDIN(1)_*DRIVER INITIATOR ENTRY_^1_(EQU_$EDCN(2)_*DRIVER CONTINUATOR ENTRY_^1_(EQU_$EDPGM(3)_)DRIVER DIAGNOSTIC ENTRY_^1_(EQU_$EDCLK(4)_)DIAGNOSTIC CLOCK_^1_(EQU_$ELU(5)_+LOGICAL UNIT NUMBER ASSIGNED_^1_(EQU_$EPTR(6)_*REQUEST PARAMETER LOCATION_^1_(EQU_$EWES(7)_*CONVERTER,EQUIPMENT,STATION,DI€€RECTOR_^1_(EQU_$EREQST(8)_(REQUEST STATUS_^1_(EQU_$ESTAT1(9)_(DRIVER STATUS_^1_(EQU_$ECCOR(10)_(CURRENT LOCATION IN BUFFER_^1_(EQU_$ELSTWD(11)_'LAST LOCATION OF BUFFER PLUS ONE_^1_(EQU_$ESTAT2(12)_'DEVICE STATUS_^1_(EQU_$MASLGN(13)_'DRIVER LENGTH_^1_(EQU_$MASSEC(14)_'MASS STORAGE SECTOR NUMBER_^1_(EQU_$RETURN(15)_'RETURN ADDRESS FOR FNR,MAKQ,COMPRQ_^1_(EQU_$FLTCOD(16)_'FAULT CODE_€€^1_(EQU_$DIAGLU(17)_'DIAGNOSTIC LOGICAL UNIT_^1_(EQU_$GHOSTI(18)_'GHOST INTERRUPTS COUNT_^1_%EQU_#MICROI(19)_*MICRO INTERRUPT NUMBER_^1_%EQU_#TIMOUT(20)_*INTERRUPT TIMEOUT VALUE_^1_(EQU_$SENTRY(21)_'STATUS AFTER INITIAL ENTRY_^1_(EQU_$SINTER(22)_'STATUS AFTER INTERRUPT_^1_(EQU_$STIMEO(23)_'STATUS AFTER TIMEOUT ERROR_^1_(EQU_$TRNSPT(24)_'TRANSPORT STATUS_^1_(EQU_$RTRECV(25)_'RETURN €€FOR RECOVERY_^1_(EQU_$OUTARG(26)_'A REGISTER AT LAST OUTPUT_^1_(EQU_$OUTQRG(27)_'Q REGISTER AT LAST OUTPUT_^1_(EQU_$UNTMOD(28)_'UNIT AND MODE SELECT CODE_^1_%EQU_#QSTWD4(29)_*WORD 4 OF REQUEST_^1_%EQU_#RCNTFG(30)_*RECOVERY COUNT FLAG_^1_%EQU_#RFLAG(31)_+RECOVERY FLAG BIT 15=1 - DISABLE_^1_%EQU_#PHSREC(32)_*MAXIMUM PHYSICAL RECORD SIZE (7 TRCK_^1_%EQU_#ABUFF(33)_+PACK/UNPACK BUFFER €€ADDRESS_!(7 TRCK_^1_(EQU_$ALRMST(34)_'ALARM STATUS WORD_^1_(EQU_$ELINK(35)_(NEXT UNIT PDT_^1*_]_^1*_]_^1*_'ADDITIONAL EQUIVALENTS_^1*_]_^1_(EQU_$NOISLN(2)_^1*_]_^1_(EJT_^1*_]_^1****_]_^1*_]_^1*_7**********_^1*_7* SEVENT *_^1*_7**********_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1*_]_^1SEVENT_!NUM_$0_^1_(LDA-_#PHSREC,I_)IS TRANSFER LENGTH < PHYSICAL RECORD_^1_(LDQ-_€€#QSTWD4,I_^1_(RTJ_$COMPV4_^1_(SAP_$NUMOK_,SKIP IF LENGTH OK_^1_(LDA-_#QSTWD4,I_)SPLIT TRANSFER_^1_(ENQ_$0_^1_(DVI-_#PHSREC,I_^1_(INQ_$-NOISLN-1_^1_(LDA-_#ESTAT1,I_^1_(AND_$=XM0002_^1_(SAZ_$1_^1_(ENQ_$1_^1_(LDA-_#PHSREC,I_^1_(SQP_$1_^1_(INA_$-NOISLN_^1_(JMP*_#NUMOK+1_^1NUMOK_"LDA-_#QSTWD4,I_^1_(STA*_#NUMBR_,SAVE ACTUAL TRANSFER LENGTH_^1_(LDA-_#ESTAT1,I_)ASCII /BINARY_^1_(AND_$=XM00€€08_^1_(SAN_$ASCII_,SKIP IF ASCII MODE_^1_(LDA*_#NUMBR_,COMPUTE SIZE OF PACK/UNPACK BUFFER_^1_(MUI_$=XM0004_^1_(DVI_$=XM0003_^1_(SQZ_$1_^1_(INA_$1_^1_(STA*_#NUMBR_,SAVE SIZE_^1ASCII_"LDA-_#ESTAT1,I_)READ/WRITE_^1_(AND_$=XM0001_^1_(SAN_$WRITE_,SKIP IF WRITE REQUEST_^1EXIT_#LDA-_#0_0NUMBER OF WORDS TO A_^1NUMBR_"NUM_$0_^1_(JMP*_#(SEVENT)_)RETURN TO CALLER_^1WRITE_"LDQ-_#ABUFF,I_*SAVE €€LAST BUFFER WORD+1_^1_(ADQ*_#NUMBR_^1_(STQ_$LWA_^1_(AND_$=XM0008_^1_(RTJ*_#UNPK_-UNPACK_^1_(JMP*_#EXIT_-RETURN TO CALLER_^1*_]_^1*_]_^1* UNPACK USER DATA_^1*_]_^1UNPK_#NUM_$0_0BINARY DISASSEMBLY_^1_(LDA-_#ABUFF,I_*INITIALIZE CURRENT WORD TO UNPACK_^1_(STA_$CURR_^1_(CLR_$Q_^1NXTCYC_!RTJ*_#GETFST_+GET CURRENT WORD TO UNPACK_^1_(LLS_$6_^1_(QLS_$2_^1_(LLS_$6_^1_(RTJ*_#STRDAT_+STORE UNP€€ACKED DATA_^1_(LLS_$4_^1_(RTJ*_#GETFST_+GET NEXT WORD_^1_(LLS_$2_0UNPACK_^1_(QLS_$2_^1_(LLS_$6_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(LLS_$6_^1_(QLS_$2_^1_(LLS_$2_^1_(RTJ*_#GETFST_+GET NEXT WORD_^1_(LLS_$4_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(LLS_$6_^1_(QLS_$2_^1_(LLS_$6_^1_(RTJ*_#STRDAT_+STORE UNPACKED DATA_^1_(JMP*_#NXTCYC_+CONTINUE UNPACKING_^1GETFST_!NUM_$0_^1_(STQ*_#QS€€AV_-SAVE Q_^1_(LDA-_#ELSTWD,I_)MORE WORDS TO UNPACK ?_^1_(SUB-_#ECCOR,I_^1_(SAN_$1_0SKIP IF MORE WORDS TO UNPACK_^1_(JMP*_#(GETFST)_)RETURN TO CALLER (A=0)_^1_(LDQ-_#ECCOR,I_*GET NEXT WORD_^1_(LDA+_#0,Q_^1_(LDQ-_#0_0RESTORE Q_^1QSAV_#NUM_$0_^1_(RAO-_#ECCOR,I_*TALLY CURRENT WORD_^1_(JMP*_#(GETFST)_)RETURN TO CALLER_^1STRDAT_!NUM_$0_^1_(STQ_$(CURR)_$STORE UNPACKED DATA_^1_(TRA_$Q_^1_€€(RAO*_#CURR_-MORE WORDS TO UNPACK ?_^1_(LDA*_#CURR_^1_(EOR*_#LWA_^1_(SAN_$CURNOT_+SKIP IF MORE TO UNPACK_^1_(JMP*_#(UNPK)_+DISASSEMBLY COMPLETE,RETURN TO CALLE_^1CURNOT_!TRQ_$A_^1_(CLR_$Q_^1_(JMP*_#(STRDAT)_)CONTINUE UNPACKING_^1*_]_^1*_]_^1*_]_^1CURR_#NUM_$0_^1LWA_$NUM_$0_^1*_]_^1*_]_^1*_]_^1* ENTERED WITH PDT ADDRESS IN (I) REGISTER_^1* CURRENT WORD ADDRESS IN (A) REGISTER AND_^1€€* ESTAT1 6 LEFT SHIFTED IN (Q) REGISTER_^1*_]_^1SEVNRD_!NUM_$0_^1_(STA*_#LWA_.SAVE LAST WORD ADDRESS IN DRIVER BUF_^1_(RTJ*_#PACK_-PACK_^1_(LDA-_#ESTAT1,I_)FORMATTED/UNFORMATTED_^1_(AND_$=XM0002_^1_(SAZ_$1_0SKIP IF UNFORMATTED READ_^1_(JMP*_#(SEVNRD)_)COMPLETE THE REQUEST_^1_(LDA-_#ELSTWD,I_)MORE TO READ ?_^1_(LDQ-_#ECCOR,I_^1_(RTJ_$COMPV4_^1_(SAN_$1_0SKIP IF MORE TO READ_^1_(JMP*_€€#(SEVNRD)_)COMPLETE THE REQUEST_^1_(STA-_#QSTWD4,I_)SAVE REST OF WORDS TO READ_^1_(JMP_$SEVENT+1_)CONTINUE PROCESSING THE REQUEST_^1*_]_^1*_]_^1* PACK DATA INTO USER BUFFER_^1*_]_^1PACK_#NUM_$0_^1_(LDA-_#ABUFF,I_*INITIALIZE CURRENT WORD TO PACK_^1_(STA*_#CURR_^1NXTGET_!RTJ*_#GETFWA_+GET CURRENT WORD TO PACK_^1_(CLR_$Q_^1_(LLS_$8_^1_(ALS_$2_^1_(LLS_$6_^1_(RTJ*_#GETFWA_+GET NEXT WORD€€_^1_(ALS_$2_^1_(LLS_$4_^1_(RTJ*_#STRFST_+STORE PACKED DATA_^1_(LLS_$2_^1_(ALS_$2_^1_(LLS_$6_^1_(RTJ*_#GETFWA_+GET NEXT WORD_^1_(ALS_$2_^1_(LLS_$6_^1_(ALS_$2_^1_(LLS_$2_^1_(RTJ*_#STRFST_+STORE PACKED DATA_^1_(LLS_$4_^1_(RTJ*_#GETFWA_+GET NEXT WORD_^1_(ALS_$2_^1_(LLS_$6_^1_(ALS_$2_^1_(LLS_$6_^1_(RTJ*_#STRFST_+STORE PACKED DATA_^1_(JMP*_#NXTGET_+CONTINUE PACKING_^1GETFWA_!NUM_$0_^1_(L€€DA*_#CURR_-MORE WORDS TO PACK ?_^1_(EOR*_#LWA_^1_(SAN_$NOTCUR_+SKIP IF MORE WORDS TO PACK_^1_(JMP*_#(PACK)_+ASSEMBLY COMPLETE,RETURN TO CALLER_^1NOTCUR_!LDA*_#(CURR)_+TALLY CURRENT WORD_^1_(RAO*_#CURR_^1_(JMP*_#(GETFWA)_)CONTINUE PACKING_^1STRFST_!NUM_$0_^1_(STA*_#QSAV1_,SAVE A_^1_(TRQ_$A_0STORE PACKED DATA_^1_(LDQ-_#ECCOR,I_^1_(STA+_#0,Q_^1_(LDA-_#0_0RESTORE A_^1QSAV1_"NUM_$0_^1_(€|CLR_$Q_^1_(RAO-_#ECCOR,I_*TALLY CURRENT ADDRESS IN USER BUFFER_^1_(JMP*_#(STRFST)_)RETURN TO CALLER_^1*_]_^1*_]_^1_(END_^__ |PQCOMP CSY/ D90 P€1_%NAM QCOMP_(DECK-ID D90 PERIPH. DRIVERS 1.2C SUMMARY-122_^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS LA JOLLA DIVISION, LA JOLLA, CA._^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1****_]_^1*E_]_^1*_]_^1*_0LCTT COMPV4_^1*_0************_^1*_]_^1*_0FUNCTION_^1*_0--------_^1*_]_^1*_'THE LCTT COMPV4 SUBROUTINE CHECK THE VALUE OF A AND Q_^1*_'REGESTERS AND GIVES THE DIFFERENCE€€ ON RETURN._^1*_]_^1*_0GENERAL DESCRIPTION_^1*_0-------------------_^1*_]_^1*_'THIS SUBROUTINE CALLED BY THE DRIVER WHEN COMPARE_^1*_'OF ADDRESS IS NEEDED_^1*_'ON ENTRY REG.A % REG.Q HOLD THE ADDRESS_^1*_'ON EXIT :_^1*_0A.GT.Q_$DIFFERENCE RETURNED IN A_^1*_0A.EQ.Q_$A EQUAL 0_^1*_0A.LT.Q_$A SET TO $FFFF_^1_(SPC_$2_^1*_]_^1****_]_^1*_]_^1_(ENT_$COMPV4_^1*_]_^1COMPV4_!NUM_$0_^1_(IIN_^€d1_(SAM_$AUPPER_$A IN UPPER BANK_^1_(SQP_$BTHSAM_$BOTH IN LOWER BANK_^1_(JMP*_#QBIGR_%A IN LOWER Q IN UPPER_^1AUPPER_!SQM_$BTHSAM_$BOTH IN UPPER BANK_^1_(TCQ_$Q_*A IN UPPER Q IN LOWER_^1_(AAQ_$A_*GET DIFFERENCE IN A_^1_(JMP*_#ABIGR_^1BTHSAM_!TCQ_$Q_^1_(AAQ_$A_*SUBTRACT Q FROM A_^1_(SAP_$ABIGR_^1QBIGR_"SET_$A_*Q IS BIGGER_^1ABIGR JMP* (COMPV4)_^1_(END_^__dPDPP560 CSY/ P€1_%NAM DPP560_'DECK-ID D91 PERIPH. DRIVERS 1.3C_^1*_$PSEUDO DRIVER FOR THE TAB 560 CARD PUNCH ON THE 1843-2._^1*_$PERIPHERAL DRIVERS 1.2C_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 1_^1*_]_^1****_]_^1*E_]_^1*_8FUNCTION_^1*_8--------_^1*_]_^1*_$TAB 560 CARD PUNCH DRIVER_^1*_]_^1*_0GENERAL DESCRIPTION_^1*_/-€€------ -----------_^1*_]_^1*_$DPP560_^1*_$THIS DRIVER DOES ALL SYSTEM INTERFACE NECESSARY FOR HANDLING_^1*_$AN MSOS IO REQUEST._^1*_]_^1*_$KP560_^1*_$FORMAT DATA FOR TAB 560 CARD PUNCH._^1*_]_^1*_$NECESSARY EDITING IS DONE OF THE REQUEST BUFFER FOR WRITE AND_^1*_$FWRITE REQUESTS IN BINARY AND ASCII MODE, AS FOLLOWS:_^1*_]_^1*_$DATA IS FORMATTED IN RECORDS OF FROM 1 TO 80 COLUMNS,_^€€1*_$TERMINATED BY AN ASCII CARRIAGE RETURN._^1*_$DATA IS EITHER BINARY DATA, OR ASCII (64 CHARACTER SET)._^1*_$ASCII CONTROL CHARACTERS ARE INSERTED PRECEDING THE DATA TO_^1*_$INDICATE BINARY OR ASCII FORMAT._^1*_$CONTROL CHARACTERS USED ARE_^1*_*CR - $0D(CARRIAGE RETURN) - END OF RECORD_^1*_*LF - $0A(LINE FEED)_%- ASCII FOLLOWING_^1*_*HT - $09(HORIZONTAL TAB) - BINARY FOLLOWING_€€^1*_]_^1*_6INPUT REQUIREMENTS_^1*_6------------------_^1*_]_^1*_$THE PDT ADDRESS IS EXPECTED IN THE Q REGISTER FOR A LOGICAL_^1*_$UNIT SERVICED BY THIS DRIVER._^1*_]_^1*_=OUTPUT_^1*_=------_^1*_]_^1*_$EDITED OUTPUT BUFFER IS SENT TO PRINTER VIA SUBROUTINE SENDIT._^1*_]_^1*_;ENTRY/EXIT_^1*_;----------_^1*_]_^1*_$THE ENTRY POINT IS SCHEDULED BY THE REQUEST PROCESSOR._^1*_$EXIT IS MAD€€E TO THE DISPATCHER WHEN THERE ARE NO MORE REQUESTS_^1*_(TO PROCESS._^1*_]_^1*_;SUBROUTINES_^1*_;-----------_^1*_]_^1*_*SYSTEM ROUTINES_^1*_$FNR_"- FIND NEXT REQUEST._^1*_$ALTDEV - ALTERNATE DEVICE HANDLER._^1*_$LOG_"- LOG ERROR IN ENGINEERING FILE._^1*_$COMPRQ - COMPLETE REQUEST_^1*_]_^1*_*OTHER ROUTINES_^1*_*LOCAL_^1*_]_^1*_$IP560 - PUNCH_!DRIVER ENTRY POINT_^1*_$KP560 - KERNEL_€€^1*_$ASCFOR - FORMAT ASCII DATA_^1*_$ASCUL - CHANGE ASCII LOWER CAST TO UPPER CASE IF NECESSARY_^1*_$BINEOR - ADD BINARY END OF RECORD CHAR TO OUTPUT BUFFER_^1*_$BINFOR - FORMAT BINARY DATA_^1*_$MAKEV - DEFINE V FIELD IN ESTAT1._^1*_$MOTREQ - HANDLE MOTION REQUESTS TO DEVICE_^1*_$SENDIT - CALL CLA REQUEST FORMATTER TO MAKE PUNCH REQUEST_^1*_.FOR PREPARED BUFFER VIA CLA._^1*_*EXTE€€RNAL_^1*_$RQP560 - INTERFACE BETWEEN PSEUDO DRIVER AND CLA DRIVER_^1*_$STA560 - GETS STATUS AND FAULT CODES_^1*_MISC_^1*_>----_^1*_]_^1*_;PARAMETERS_^1*_;----------_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT IP560_(INITIATOR ENTRY_^1*_]_^1*_9** EXTERNALS **_^1*_]_^1_%EXT ALTDEV_'ALTERNATE DEVICE HANDLER_^1_%EXT CP560_(DRIVER'S €€CONTINUATOR._^1_%EXT LOG_*ENGINEERING FILE LOG ROUTINE_^1_%EXT MAS300_'MASS MEMORY EXECUTIVE_^1_%EXT* RQP560_'REQUEST FORMATTER FOR 1843-2_^1_%EXT* STA560_'CHECK STATUS VIA 1843-2_^1*_]_^1_%EJT 1_^1*_:** EQUATES **_^1*_]_^1************************************************************************_^1*_]_'*_^1*_5PHYSICAL DEVICE TABLE EQUATES_2*_^1*_]_'*_^1***************************€€*********************************************_^1_%SPC 2_^1_%EQU ELVL(0)_%SCHEDULAR CALL_^1_%EQU EDIN(1)_%INITIATOR ADDRESS_^1_%EQU EDCN(2)_%CONTINUATOR ADDRESS_^1_%EQU EDPGM(3)_$TIMEOUT ERROR ADDRESS_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK_^1_%EQU ELU(5)_'LOGICAL UNIT_^1_%EQU EPTR(6)_%REQUEST PARAMETER LIST ADDRESS_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU EREQST(8)_#REQUEST STA€€TUS_^1_%EQU ESTAT1(9)_#DRIVER STATUS_^1_%EQU ECCOR(10)_#NEXT LOCATION FOR DATA_^1_%EQU ELSTWD(11)_"LAST LOCATION+1 FOR DATA_^1_%EQU ESTAT2(12)_"LAST EQUIPMENT STATUS_^1_%EQU MASLGN(13)_"DRIVER LENGTH IF MASS MEMORY_^1_%EQU MASSEC(14)_"MASS MEMORY ADDRESS OF DRIVER_^1_%EQU RETURN(15)_"FNR RETURN ADDRESS._^1_%EQU FLTCOD(16)_"FAULT CODE_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LOGICAL_€€^1_%EQU GHOSTI(18)_"COUNT OF GHOST INTERRUPTS_^1_%EQU MICROI(19)_"MICRO INTERRUPT NUMBER_^1_%EQU TIMOUT(20)_"INTERRUPT TIME OUT VALUE_^1_%EQU SENTRY(21)_"STATUS AFTER INITIAL ENTRY_^1_%EQU SINTER(22)_"STATUS AFTER INTERRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER TIMEOUT._^1_%EQU FLAGWD(24)_"FLAGWORD_^1_%EQU PORT(25)_$CLA PORT NUMBER FOR THIS DEVICE_^1_%EQU BEGBUF(26)_"START ADDR€€ESS FOR CONVERTED BUFFER_^1_%EQU ENDBUF(27)_"LAST LOCATION+1 OF CONVERTED BUFFER_^1_%EQU NEXWRD(28)_"NEXT WORD FOR OUTPUT BUFFER_^1_%EQU NEWREQ(29)_"NEW REQUEST CODE, PRIORITIES_^1_%EQU NEWCOM(30)_"NEW COMPLETION ADDRESS_^1_%EQU NEWTHD(31)_"NEW THREAD_^1_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADD€€RESS OF HEADER/BUFFER_^1_%EQU CYCLE(35)_#BINARY PACKING CYCLE ADDRESS OFFSET_^1_%EQU SEQUEN(36)_"SEQUENCE NUMBER_^1_%EQU MOTION(37)_"REQUEST MOTION CODE_^1_%EQU CHKSUM(38)_"CHECKSUM WORD_^1_%EQU EOFCOD(39)_"END OF FILE CODE_^1_%EQU ELINK(40)_#PDT LINK_^1_%EQU NCOMP(41)_#PSUEDO COMPLETION FOR NEW ADDRESS_^1_%EJT 1_^1*_]_^1*_$FLAGS USED IN ESTAT1_^1*_*BIT 0 = 0=READ/1=WRITE_^€€1*_*BIT 1 = 0=UNFORMATED/1=FORMATED_^1*_*BIT 3 = 0=BINARY/1=ASCII_^1*_*BIT 4 = FIRST CHARACTER_^1*_*BIT 6 = LAST DATA_^1*_*BIT 7 = MOTION REQUEST_^1*_]_^1*_8COMMUNICATIONS REGION_^1*_]_^1_%EQU LPMSK($2)_#$0000_!START OF LOWER ONES MASKS._^1_%EQU NZERO($12)_"$FFFF_!START OF LOWER ZEROS MASKS._^1_%EQU ZERO($22)_#$0000_!MASK CONTAINING A ZERO._^1_%EQU ONEBIT($23)_!$0001_!START OF €€SPECIFIC BIT ONE MASK._^1_%EQU ZROBIT($33)_!$FFFE_!START OF SPECIFIC BIT ZERO MASK._^1_%EQU AFNR($B5)_#ADDRESS OF FIND-NEXT-REQUEST ROUTINE_^1_%EQU ACMPRQ($B6)_!ADDRESS OF COMPLETE-REQUEST ROUTINE_^1_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1*_]_^1*_8MISCELLANEOUS EQUATES_^1*_]_^1ASTER EQU ASTER($2A)_"ASTERISK ASCII CHARACTER_^1EORLO EQU EORLO($0D)_"END OF RECORD CONTROL FOR€€ LOWER CHAR POSITION_^1BINSIZ EQU BINSIZ(80)_"BINARY RECORD MAXIMUM SIZE_^1ASCSIZ EQU ASCSIZ(40)_"ASCII RECORD MAXIMUM SIZE_^1MOTCOD EQU MOTCOD(4)_#WORD IN REQUEST CONTAINING MOTION CODE_^1_%EJT_]_^1************************************************************************_^1*_$THIS CODE IS CALLED BY THE MASS MEMORY DRIVER_^1*_$EXECUTIVE. IT IS CALLED ONLY AFTER THE DRIVER HAS_^€€1*_$BEEN READ INTO MEMORY BY THE EXECUTIVE._^1*_$IT IS NOT CALLED IF THE DRIVER IS CORE RESIDENT._^1*_$ITS PURPOSE IS_^1*_$TO INITIALIZE THE PHYSICAL DEVICE TABLES THAT THIS_^1*_$DRIVER USES._^1*_$ENTRY IS WITH :_^1*_2Q = PDT ADDRESS._^1*_2A = ABSOLUTE ADDRESS OF DRIVER._^1_%SPC 2_^1BEGIN STQ- I_,SAVE PHYSTAB ADDRESS IN I._^1_%STQ* STRPDT_'SAVE STARTING PHYSTAB ADDRESS._^1_%STA* €€LOCN_)SAVE ABSOLUTE DRIVER ADDRESS._^1BEGIN1 LDA* LOCN_)CALCULATE_^1_%TRA Q_,DRIVER INITIATOR ADDRESS AND_^1_%INQ IP560-BEGIN_!PLUG IT INTO_^1_%STQ- 1,I_*THE PHYSTAB._^1_%LDQ =XCP560_%CALCULATE_^1_%SBQ =XBEGIN_%THE_^1_%AAQ Q_,DRIVER CONTINUATOR ADDRESS AND_^1_%STQ- 2,I_*PLUG IT INTO THE PHYSTAB._^1_%LDA- ELINK,I_%CHECK IF THER ARE_^1_%TRA Q_,MORE PHYSTABS TO INITIALIZE_^1_%SU€€B* STRPDT_^1_%SAZ IP560_(SKIP IF FINISHED._^1_%STQ- I_,PUT ADDRESS OF NEXT PHYSTAB INTO THE I REG._^1_%JMP* BEGIN1_'INITIALIZE THE NEXT PHYSTAB ON THE THREAD._^1************************************************************************_^1_%SPC 3_^1*_8STORAGE_^1*_]_^1LOCN_!NUM 0_,STARTING ADDRESS OF THE DRIVER._^1STRPDT NUM 0_,STARTING PHYSTAB ADDRESS._^1*_]_^1*_8CONSTANTS_^1*_]_^€€1BINCON NUM $0900_(BINARY-RECORD-FOLLOWS CONTROL CHAR TO PUNCH_^1ASCCON NUM $0A00_(ASCII-RECORD-FOLLOWS CONTROL CHAR TO PUNCH_^1EORUP NUM $400D_(END OF RECORD CONTROL FOR UPPER CHAR POSITION_^1_%EJT 1_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1*_$INITIATOR(IP560)_^1*_(.FIND THE NEXT REQUEST FOR A NON-BUSY PDT, VIA FNR._^1*_(.IF NONE EXISTS GO TO DISPATCHER._^1*_(.CALL KERNAL TO PROCESS€€ THE I/O FOR REQUEST FOUND._^1*_(.ON RETURN, CALL MAKEQ TO SET UP V-FIELD IN ESTAT1._^1*_(.IF AN ERROR HAS OCCURED, AND NOT DIAGNOSTIC LU,_^1*_+LOG THE ERROR IN ENG. FILE AND GO TO THE ALTERNATE_^1*_+DEVICE HANDLER._^1*_(.CCOMPLETE THE REQUEST._^1*_(.START AT FIRST STEP._^1*_]_^1****_]_^1_%EJT 1_^1*_]_^1*_,DRIVER_^1*_]_^1_%SPC 1_^1IP560 STQ- I_,SAVE PHYSICAL DEVICE TABLE ADDRESS€€_^1_%STQ* PDT1_)SAVE PDT FOR CIRCULAR SEARCH_^1_%SPC 1_^1*_8SHOULD WE FIND NEXT REQUEST FOR THIS PDT._^1I10_"SFN- EREQST,15,1,I_"SKIP IF BUSY BIT SET_^1_%JMP* IFNR_,NOT BUSY - FNR_^1_%SFZ- EREQST,14,1,I_"SKIP IF ERROR BIT NOT SET_^1_%JMP* IFNR_,BUSY WITH ERROR INDICATES ALTDEV ENTRY- FNR_^1_%SPC 1_^1*_8IS THERE ANOTHER PDT TO LOOK AT._^1I20_"LRI- ELINK,I_)GET NEXT PDT ON THREAD_^€€1_%CIE PDT1_,SKIP IF NEXT PDT = LAST CURRENT PDT_^1_%JMP* I10_-GO LOOK AT NEXT PDT._^1_%JMP+ MAS300_'EXIT TO DISPATCHER (VIA MASS MEMORY EXEC)_^1_%SPC 1_^1IFNR_!RTJ- (AFNR)_'FIND NEXT REQUEST_^1_%JMP* I20_-1 NO REQUEST THIS PDT_^1_%SRI* PDT1_,2 FOUND REQUEST - SAVE CURRENT PDT ADDRESS_^1_%SPC 1_^1_%RTJ* KP560_(CALL KERNEL TO PERFORM I/O_^1_%SPC 1_^1_%RTJ* MAKEV_(MAKE V-FIELD IN€€ ESTAT1_^1*_8SEE IF ERRORS WERE MADE_^1_%SFN- ESTAT1,15,1,I_"SKIP IF ERROR BIT SET_^1_%JMP* I30_-NO ERROR_^1_%LDQ- ELU,I_+GET CURRENT LOGICAL UNIT_^1_%CQE- DIAGLU,I_(SKIP IF CURRENT = DIAGNOSTIC LU_^1_%JMP* I40_-ERROR FOUND AND NOT DIAGNOSTIC LU_^1_%SPC 1_^1I30_"RTJ- (ACMPRQ)_$COMPLETE THE REQUEST_^1_%JMP* IFNR_)LOOP BACK TO SEARCH FOR NEXT REQUEST_^1_%SPC 1_^1I40_"QLS 6_,SHIFT €€LU TO 15-6 OF Q-REG_^1_%ADQ- FLTCOD,I_$PUT FAULT CODE IN 5-0 OF Q-REG_^1_%RTJ LOG_*LOG THE ERROR IN THE ENGINEERING FILE_^1_%JMP ALTDEV_'GO TO THE ALTERNATE DEVICE HANDLER._^1_%SPC 2_^1PDT1_!NUM 0_,LAST CURRENT PDT_^1_%EJT 1_^1*_]_^1*_$MAKEV - CHECKS FOR A SHORT READ IF NO ERROR OCCURRED AND_^1*_-INPUT REQUEST._^1*_-IF SHORT READ, SETS BIT 14 IN ESTAT1 AND PUTS_^1*_-NEXT AVAIL€€ABLE LOCATION IN LAST WORD OF BUFFER._^1*_]_^1_%SPC 1_^1MAKEV NUM 0_,SUBROUTINE ENTRY POINT_^1*_8CHECK IF READ AND NO ERROR_^1_%SFZ- ESTAT1,15,1,I_"SKIP 1 IF NO ERROR OCCURRED_^1_%JMP* MAK10_+ERROR OCCURRED - EXIT_^1_%SFN- ESTAT1,0,1,I_#SHIP 1 IF READ REQUEST_^1_%JMP* MAK10_+WRITE REQUEST - EXIT_^1*_8CHECK IF SHORT READ_^1_%LDA- ECCOR,I_)GET NEXT AVAILABLE LOCATION_^1_%SUB- ELST€€WD,I_(SUBTRACT LAST WORD ADDRESS + 1_^1_%SAP MAK10_+SKIP TO EXIT - NOT SHORT READ_^1*_8STORE NEXT AVAILABLE LOCATION IN LAST WORD_^1_%LDA- ECCOR,I_)GET NEXT AVAIL LOCATION_^1_%LDQ- ELSTWD,I_(GET LAST ADDRESS + 1 OF BUFFER_^1_%INQ -1_.DECREMENT Q TO LAST WORD ADDRESS OF BUFFER_^1_%STA- (ZERO),Q_(STORE NEXT AVAIL IN LWA_^1*_]_^1_%SEF- ESTAT1,14,1,I SET SHORT READ BIT IN ESTAT1 V-FI€€ELD_^1_%SPC 1_^1MAK10 JMP* (MAKEV)_%RETURN_^1_%EJT 1_^1*_]_^1*_3KERNEL INITIATOR_^1*_]_^1*_]_^1KP560 NUM 0_^1*_8SET STATUS WORDS TO $FFFF_^1_%SET A_^1_%STA- SENTRY,I_$ENTRY STATUS_^1_%STA- SINTER,I_(INTERRUPT STATUS_^1_%STA- STIMEO,I_(TIMEOUT STATUS_^1*_8CLEAR PDT WORDS_^1_%CLR A_^1_%STA- ESTAT2,I_(HARDWARE STATUS_^1_%STA- ENDBUF,I_(END OF NEWLY FORMATTED BUFFER_^1*_8IF MOTI€€ON REQUEST RETURN_^1_%LDQ- EPTR,I_*Q = PARAMETER LIST ADDRESS_^1_%LFA- (ZERO),13,5,Q_"REQUEST CODE TO A_^1_%INA -14_-TEST FOR MOTION REQUEST_^1_%SAN K10_-SKIP IF NOT MOTION_^1_%RTJ* MOTREQ_#HANDLE MOTION REQUEST_^1_%JMP KRETUR_*RETURN IF MOTION_^1K10_"SFZ- ESTAT1,0,1,I_#SKIP IF READ_^1_%JMP* KPUNCH_*GO HANDLE WRITE_^1_%JMP KRETUR_*READ NOT POSSIBLE - RETURN_^1_%EJT 1_^1*_]_^1*€€_*MOTREQ - HANDLE MOTION REQUESTS TO CARD PUNCH_^1*_]_^1MOTREQ NUM 0_^1_%SEF- ESTAT1,7,1,I SET MOTION FLAG_^1_%LDA- MOTCOD,Q_$PICK UP MOTION CODE_^1MOT10 STA- MOTION,I_$SAVE MOTION CODE_^1_%LFA- MOTION,15,4,I GET CURRENT MOTION COMMAND_^1_%SAN MOT20_(SKIP IF NO MORE MOTION COMMANDS_^1_%JMP* MOT60_(NO MORE MOTION COMMANDS_^1MOT20 INA -2_+CHECK FOR WRITE EOF_^1_%SAZ MOT30_(SKI€€P IF EOF_^1_%SPC 1_^1_%INA -2_+CHECK FOR REW/UNLOAD_^1_%SAN MOT25_(SKIP IF NOT REW/UNL_^1_%JMP* MOT50_(GO DO REW/UNL_^1_%SPC 1_^1MOT25 JMP* MOT40_(KEEP CHECKING_^1_%SPC 1_^1*_*EOF - PUNCH EOF, ZERO SEQUENCE NUM, CONTINUE MOT REQ_^1*_]_^1MOT30 STA- SEQUEN,I_$ZERO SEQUENCE NUMBER_^1_%LDQ- BEGBUF,I_$GET FWA OF NEW BUFFER_^1_%LDA* BINCON_'GET BINARY CONTROL CHARACTER_^1_%STA- (Z€€ERO),Q_$PUT CONTROL IN 1ST CHAR OF NEWBUFFER_^1_%LFA- EOFCOD,11,6,I GET END OF FILE CODE (1ST 6 BITS)_^1_%EOR- ONEBIT+6_$SET BINARY DATA FLAG_^1_%SFA- (ZERO),5,6,Q PUT 1ST 6 BITS IN LOWER CHAR,1ST WORD._^1_%LFA- EOFCOD,5,6,I GET END OF FILE CODE (2ND 6 BITS)_^1_%INQ 1_,INCREMENT NEW BUFFER ADDRESS_^1_%EOR- ONEBIT+6_$SET BINARY DATA FLAG_^1_%SFA- (ZERO),13,6,Q PUT 2ND 6 BITS IN U€€PPER CHAR,2ND WORD_^1_%ENA EORLO_(GET END OF RECORD CONTROL CHARACTER_^1_%SFA- (ZERO),7,8,Q PUT EOR CHAR IN NEW BUFFER_^1_%INQ 1_,INCREMENT Q TO LWA+1 OF NEW BUFFER_^1_%STQ- ENDBUF,I_$SAVE IN PDT_^1_%JMP KP500_(PUNCH EOF_^1_%SPC 1_^1MOT40 LDA- MOTION,I_$GET MOTION CODE_^1_%LLS 4_,SHIFT UP NEXT MOTION COMMAND_^1_%JMP* MOT10_(GO PROCESS NEXT MOTION COMMAND_^1_%SPC 1_^1*_*REW/€€UNL - ZERO SEQUENCE NUMBER, TERMINATE REQUEST._^1*_]_^1MOT50 STA- SEQUEN,I_$ZERO SEQ NUM_^1_%SPC 1_^1MOT60 JMP* (MOTREQ)_$RETURN_^1_%EJT 1_^1KPUNCH SFN- ESTAT1,3,1,I SKIP IF ASCII_^1_%JMP* KB10_)GO HANDLE BINARY_^1_%JMP KA10_)GO HANDLE ASCII_^1*_]_^1*_*BINARY_^1*_]_^1KB10_!CLF- CYCLE,15,16,I CLEAR CYCLE STEP COUNTER_^1_%LDQ- BEGBUF,I_$GET FWA OF NEW BUFFER_^1_%LDA BINCON_'GE€€T BINARY CONTROL CHARACTER_^1_%STA- (ZERO),Q_$PUT CONTROL INN 1ST CHAR OF NEWBUFFER_^1_%STQ- ENDBUF,I_$SAVE NEXT CHAR ADDRESS_^1_%SPC 1_^1_%SFZ- ESTAT1,1,1,I SKIP IF UNFORMATTED_^1_%JMP* KB100_(GO HANDLE BINARY FWRITE_^1*_]_^1*_]_^1*_]_^1*_*UNFORMATTED BINARY - PUNCH ONLY USER DATA_^1*_=60 WORDS OR LESS PER RECORD (CARD)_^1*_=(80 12-BIT WORDS)_^1*_]_^1KB20_!LDQ- ECCOR,I_%GET NEXT€€ CALLER WORD ADDRESS_^1_%LDQ- (ZERO),Q_$GET NEXT CALLER WORD_^1_%STQ- NEXWRD,I_$SAVE FOR BINFOR_^1_%RTJ* BINFOR_'GO PUT NEXWRD IN NEW BUFFER_^1_%RAO- ECCOR,I_%INCREMENT NEXT CALLER WORD ADDRESS_^1_%LDA- ECCOR,I_%GET NEXT CALLER WORD ADDRESS_^1_%CAE- ELSTWD,I_$SKIP IF NEXT ADDRESS = LWA+1 (ALL DATA MOVED)._^1_%JMP* KB30_)SEE IF PUNCH RECORD FULL_^1_%SEF- ESTAT1,6,1,I SET LAST DATA €€FLAG_^1_%JMP* KB40_)GO SEND DATA_^1KB30_!LDA- BEGBUF,I_$GET FWA OF NEWBUFFER_^1_%SUB- ENDBUF,I_$SUBTRACT LWA_^1_%INA BINSIZ_'ADD UNFORMATTED BINARY RECORD SIZE_^1_%SAZ KB40_)SKIP IF PUNCH RECORD IS FULL_^1_%JMP* KB20_)GO HANDLE NEXT DATA WORD_^1KB40_!RTJ BINEOR_'ADD BINARY END OF RECORD CHAR TO OUTPUT BUFFER_^1_%JMP KP500_(SHIP OUT COMPLETED RECORD_^1_%EJT 1_^1*_]_^1*_*FORMATT€€ED BINARY - PUNCH SEQUENCE NUMBER,_^1*_=7,9 PUNCH,_^1*_=COMPLEMENT OF RECORD LENGTH (ON 1ST CARD)_^1*_=USER DATA,_^1*_=CHECKSUM (ON LAST CARD)._^1*_=60 WORDS OR LESS PER RECORD (CARD)._^1*_=(80 12-BIT WORDS)._^1KB100 SFZ- ESTAT1,4,1,I SKIP IF 1ST CARD_^1_%JMP* KB120_(NOT 1ST CARD_^1_%LDQ- ECCOR,I_%GET FWA USER BUFFER_^1_%LDA- (ZERO),Q_$GET FIRST WORD CALLER BUFFER_^1_%ARS 8_,SHI€€FT TO LOWER BITS_^1_%INA -ASTER_'CHECK FOR AN *_^1_%SAN KB110_(SKIP IF NOT *_^1*_'IF ASTERISK FIRST CHAR, LENGTH.LE.40; CHANGE REQUEST TO ASCII_^1_%LDA- ELSTWD,I_$LWA+1 OF CALLER BUFFER_^1_%SUB- ECCOR,I_%GET LENGTH OF BUFFER_^1_%INA -41_^1_%SAP KB110_(SKIP IF REC.GE.40_^1_%SEF- ESTAT1,3,1,I CHANGE BINARY FLAG TO ASCII_^1_%JMP KA10_)GO PROCESS AS ASCII REQUEST_^1_%SPC 2_^1KB1€€10 ENA 0_,SET 1ST CARD SEQUENCE NUM TO ZERO_^1_%STA- CHKSUM,I_$CLEAR CHECKSUM WORD_^1_%LDA- (ZERO),Q_$GET FWA USER BUFFER_^1_%EOR =N$2050_%COMPARE WITH NAM BLOCK_^1_%SAZ KB130_(SKIP IF NAM CARD_^1_%SPC 2_^1KB120 LDA- SEQUEN,I_$GET NEXT SEQUENCE NUMBER_^1_%AND- LPMSK+8_%MODULO 256_^1KB130 STA- SEQUEN,I_$SAVE SEQUENCE NUMBER_^1_%RAO- SEQUEN,I_$INCREMENT TO SET NEXT SEQ NUMBER_€€^1_%ALS 8_,SHIFT TO UPPER CHAR CURRENT SEQ NUMBER_^1_%INA $50_*ADD 7,9 PUNCH_^1_%STA- NEXWRD,I_$SET UP NEXT PUNCH WORD_^1_%RTJ* BINFOR_'FORMAT WORD IN NEW BUFFER_^1_%SFZ- ESTAT1,4,1,I SKIP IF FIRST CARD_^1_%JMP* KB150_(NOT FIRST CARD_^1_%SEF- ESTAT1,4,1,I SET FLAG TO NOT FIRST CARD_^1_%LDA- ECCOR,I_%GET FWA OF CALLER BUFFER_^1_%SUB- ELSTWD,I_$SUBTRACT LWA+1 TO GET COMPLETED LEN€€GTH_^1_%STA- NEXWRD,I_$SET UP NEXT PUNCH WORD_^1_%RTJ* BINFOR_'FORMAT WORD IN NEW BUFFER_^1KB140 LDQ- ECCOR,I_%GET NEXT USER WORD ADDRESS_^1_%LDA- (ZERO),Q_$GET NEXT USER WORD_^1_%STA- NEXWRD,I_$SET UP NEXT PUNCH WORD_^1_%RTJ* BINFOR_'FORMAT WORD IN NEW BUFFER_^1_%SPC 1_^1_%RAO- ECCOR,I_%INCREMENT NEXT CALLER WORD ADDRESS_^1_%LDA- BEGBUF,I_$GET FWA OF NEW BUFFER_^1_%SUB- ENDBUF,I€€_$SUBTRACT LWA_^1_%INA BINSIZ_'ADD BINARY RECORD SIZE_^1_%SAZ KB160_(SKIP IF PUNCH RECORD IS FULL_^1_%SPC 1_^1KB150 LDA- ECCOR,I_%GET NEXT CALLER WORD ADDRESS_^1_%CAE- ELSTWD,I_$SKIP IF NEXT ADDRESS=LWA+1 (ALL DATA MOVED)_^1_%JMP* KB140_(GO HANDLE NEXT DATA WORD_^1_%SEF- ESTAT1,6,1,I SET LAST DATA FLAG_^1_%LDA- CHKSUM,I_$GET THE CHECK SUM_^1_%TCA A_,COMPLEMENT THE CHECKSUM_^1€€_%STA- NEXWRD,I_$SET UP NEXT PUNCH WORD_^1_%RTJ* BINFOR_'FORMAT WORD IN NEW BUFFER_^1KB160 RTJ* BINEOR_'ADD BINARY END OF RECORD CHAR TO OUTPUT BUF_^1_%JMP KP500_^1_%EJT 1_^1*_]_^1*_$BINFOR - FORMAT BINARY DATA._^1*_.FROM REQUEST BUFFER GET NEXT 6 BITS AND STORE IN_^1*_.OUTPUT BUFFER IN NEXT 8-BIT BYTE, RIGHT JUSTIFIED._^1*_.THEN SET BIT 6 OF EACH OUTPUT BYTE TO SET BINARY BYTE_€€^1*_.FLAG FOR PUNCH._^1*_.THE ROUTINE WORKS AS A 3 STEP CYCLE SINCE 3 IS THE_^1*_.SMALLEST NUMBER OF 16-BIT WORDS TO CONTAIN AN EVEN_^1*_.NUMBER OF 6 BIT UNITS._^1*_.SINCE THE FIRST BYTE IN THE OUTPUT BUFFER MUST_^1*_.BE AN ASCII CONTROL CHARACTER, THE SECOND BYTE_^1*_.STARTS THE FORMATTED BINARY DATA._^1*_]_^1*_]_^1BINFOR NUM 0_,SUBROUTINE ENTRY_^1_%LDQ- CHKSUM,I_$UPDATE THE CHEC€€KSUM._^1_%ADQ- NEXWRD,I_^1_%STQ- CHKSUM,I_^1_%LDQ- CYCLE,I_%GET CURRENT CYCLE OFFSET_^1_%JMP* BCYCLE,Q_$GO HANDLE NEXT STEP IN CYCLE_^1*_]_^1*_(3 STEP CYCLE TABLE_^1BCYCLE JMP* BCYCL1_'FORMAT 1ST WORD_^1_%JMP* BCYCL2_'FORMAT 2ND WORD_^1_%JMP* BCYCL3_'FORMAT 3RD WORD_^1*_]_^1*_]_^1BCYCL1 LDQ- ENDBUF,I_$GET NEXT WORD ADDRESS OUTPUT BUFFER._^1_%LFA- NEXWRD,15,6,I GET NEXT 6 BITS FROM €€REQUEST BUFFER._^1_%EOR- ONEBIT+6_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),6,7,Q STORE 6 BITS IN NEXT BYTE OF OUTPUT BUFFER_^1_%INQ 1_,INCREMENT OUTPUT BUFFER NEXT ADDRESS_^1_%LFA- NEXWRD,9,6,I GET NEXT 6 BITS FROM REQUEST BUFFER._^1_%EOR- ONEBIT+6_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),14,7,Q STORE 6 BITS IN NEXT BYTE OF OUTPUT BUFFER_^1_%LFA- NEXWRD,3,4,I GET REMAINING 4 BITS FRO€€M CURRENT REQ WORD._^1_%EOR- ONEBIT+4_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),6,5,Q STORE 4 BITS IN NEXT BYTE OF OUTPUT BUFFER_^1_%CLF- (ZERO),1,2,Q ZERO BITS NOT YET WITH DATA IN NEW BUFFER_^1_%SPC 1_^1_%STQ- ENDBUF,I_$SAVE OUT PUT BUFFER NEXT ADDRESS_^1_%RAO- CYCLE,I_%INCREMENT STEP NUMBER FOR THIS CYCLE._^1_%JMP* BEXIT_(COMPLETED STEP 1 OF CYCLE_^1_%SPC 1_^1BCYCL2 LDQ- ENDBUF,€€I_$GET NEXT WORD ADDRESS OUTPUT BUFFER_^1_%LFA- NEXWRD,15,2,I GET NEXT 2 BITS FROM REQUEST BUFFER_^1_%SFA- (ZERO),1,2,Q STORE LAST 2 BITS IN CURRENT OUTPUT BYTE_^1_%INQ 1_,INCREMENT OUTPUT BUFFER NEXT ADDRESS_^1_%LFA- NEXWRD,13,6,I GET NEXT 6 BITS FROM REQUEST BUFFER_^1_%EOR- ONEBIT+6_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),14,7,Q STORE 6 BITS IN NEXT OUTPUT BYTE_^1_%LFA- NEXWRD,7,€€6,I GET NEXT 6 BITS FROM REQUEST BUFFER_^1_%EOR- ONEBIT+6_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),6,7,Q STORE 6 BITS IN NEXT OUTPUT BYTE_^1_%LFA- NEXWRD,1,2,I GET NEXT 2 BITS FROM REQUEST BUFFER_^1_%INQ 1_,INCREMENT OUTPUT BUFFER LENGTH_^1_%EOR- ONEBIT+2_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),14,3,Q STORE 2 BITS IN NEXT OUTPUT BYTE._^1_%SPC 1_^1_%CLF- (ZERO),11,12,Q ZERO BITS NOT€€ YET WITH DATA IN NEW BUFFER_^1_%STQ- ENDBUF,I_$SAVE OUTPUT BUFFER NEXT ADDRESS_^1_%RAO- CYCLE,I_%INCREMENT STEP NUMBER FOR THIS CYCLE_^1_%JMP* BEXIT_(COMPLETED STEP 2 OF CYCLE_^1_%SPC 1_^1BCYCL3 LDQ- ENDBUF,I_$GET NEXT WORD ADDRESS OUTPUT BUFFER_^1_%LFA- NEXWRD,15,4,I GET NEXT 4 BITS FROM REQUEST BUFFER_^1_%SFA- (ZERO),11,4,Q STORE 4 BITS IN NEXT OUTPUT BYTE_^1_%LFA- NEXWRD,11,6,€€I GET NEXT 6 BITS FROM REQUEST BUFFER_^1_%EOR- ONEBIT+6_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),6,7,Q STORE 6 BITS IN NEXT OUTPUT BYTE_^1_%INQ 1_,INCREMENT OUTPUT BUFFER NEXT ADDRESS_^1_%LFA- NEXWRD,5,6,I GET NEXT 6 BITS FROM REQUEST BUFFER_^1_%EOR- ONEBIT+6_$SET BYTE BINARY FLAG_^1_%SFA- (ZERO),14,7,Q STORE 6 BITS IN NEXT OUTPUT BYTE_^1_%STQ- ENDBUF,I_$SAVE OUTPUT BUFFER NEXT ADD€€RESS_^1_%CLR A_^1_%STA- CYCLE,I_%COMPLETED STEP 3 OF CYCLE - NEXT STEP 1_^1BEXIT JMP* (BINFOR)_$RETURN_^1_%EJT 1_^1*_]_^1*_*BINEOR - ADD BINARY END OF RECORD CHARACTER TO OUTPUT BUF_^1*_]_^1BINEOR NUM 0_,ENTRY SUBROUTINE_^1_%LDA- CYCLE,I_%GET CYCLE STEP_^1_%INA -2_+IF STEP 2, A=0._^1_%SAZ BEOR10_^1_%INA 2_,IF STEP 0, A=0; IF STEP 1, A=1._^1BEOR10 TRA Q_^1_%ADQ- ENDBUF,I_$SE€€T UP NEXT FULL CHARACTER ADDRESS_^1_%SAZ BEOR20_'SKIP IF NEXT CYCLE STEP IS 0 OR 2._^1_%LDA EORUP_^1_%STA- (ZERO),Q_$PUT END RECORD IN UPPER CHAR FOR CYCLE-STEP 1_^1_%JMP* BEOR30_^1BEOR20 ENA EORLO_(GET END OF RECORD CONTROL CHARACTER_^1_%SFA- (ZERO),7,8,Q PUT END RECORD IN LOWER CHAR FOR STEPS 0,2._^1BEOR30 INQ 1_^1_%STQ- ENDBUF,I_$SET LWA+1 OF NEW BUFFER_^1_%JMP* (BINEOR)_$R€€ETURN_^1_%EJT 1_^1*_*ASCII_^1*_.UNFORMATTED - PUNCH 2 HOLLERITH COL FOR EACH WORD._^1*_*_^1_%JMP* (SENDIT)_$RETURN_=********_^1_%END_]_^__ VPRQP560 CSY/ P€1_%NAM RQP560_'DECK-ID D92 PERIPH. DRIVERS 1.3C_^1*_$REFORMAT MSOS REQUEST FOR 1X8 CLA DRIVER_^1*_$OPERATIONAL DIAGNOSTIC SYSTEM (ODS)_^1*_$DATA SYSTEMS-LA JOLLA DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1977_^1*_]_^1_%SPC 2_^1*_]_^1****_]_^1*E_]_^1*_MISC_^1*_>----_^1*_]_^1*_;PARAMETERS_^1*_;----------_^1*_]_^1*_8** ENTRY POINTS **_^1*_]_^1_%ENT RQP560_^1€€_%ENT CP560_^1_%ENT STA560_^1*_9** EXTERNALS **_^1*_]_^1_%EXT TERMLU_'1X8 CLA LU_^1_%EXT PORTS_(START OF PORT TABLES_^1_%EXT EPORTS_'END OF PORT TABLES_^1_%EXT PLENTH_'LENGTH OF EACH TABLE_^1_%EXT LOG1A_(PDT ADDRESS TABLE_^1*_]_^1*_:** EQUATES **_^1*_]_^1*_8PDT EQUATES_^1*_]_^1_%EQU EDCLK(4)_$DIAGNOSTIC CLOCK (CLA TIMER)_^1_%EQU ELU(5)_'LU_^1_%EQU EPTR(6)_%PARAMETER LIST €€ADDRESS_^1_%EQU EWES(7)_%EQUIPMENT CODE_^1_%EQU EREQST(8)_#REQUEST STATUS_^1_%EQU ESTAT1(9)_#STATUS WORD 1_^1_%EQU ECCOR(10)_#NEXT LOCATION FOR DATA_^1*_2(THIS VALUE INCREASED BY LENGTH OF DATA SENT_^1*_3AT CLA REQUEST COMPLETION)._^1_%EQU ESTAT2(12)_"LAST EQUIPMENT STATUS_^1_%EQU FLTCOD(16)_"FAULT CODE_^1_%EQU DIAGLU(17)_"DIAGNOSTIC LU_^1_%EQU SINTER(22)_"STATUS AFTER INTE€€RRUPT_^1_%EQU STIMEO(23)_"STATUS AFTER TIME OUT_^1_%EQU PORT(25)_$PORT NUMBER FOR DEVICE_^1_%EQU BEGBUF(26)_"FIRST DATA LOCATION FOR CURRENT I/O SEGMENT._^1_%EQU ENDBUF(27)_"LWA+1 OF CURRENT I/O SEGMENT._^1_%EQU RDBUF(28)_#READ FWA OF CALLER'S BUFFER_^1_%EQU NEWREQ(29)_"NEW REQUEST CODE, PRIORITIES_^1_%EQU NEWCOM(30)_"NEW COMPLETION ADDRESS_^1_%EQU NEWTHD(31)_"NEW THREAD_^1€€_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADDRESS OF HEADER/BUFFER_^1_%EQU ELINK(40)_#PDT THREAD_^1_%EQU NCOMP(41)_#PSEUDO COMPLETION FOR NEW REQUEST_^1*_]_^1*_8LOW CORE EQUATES_^1*_]_^1_%EQU NEGONE($13)_!$FFFE_^1_%EQU ZERO($22)_#ZERO_^1_%EQU ADISP($EA)_"DISPATCHER_^1*_]_^1*_8FAULT CODE EQUATES_^1*€€_]_^1_%EQU ALARM(2)_^1_%EQU TIMOUT(0)_^1_%EQU PARITY(3)_^1*_]_^1*_8BUFFER HEADER EQUATES_^1*_]_^1_%EQU PORTNB(0)_#PORT NUMBER_^1_%EQU DSTAT1(1)_#STATUS_^1_%EQU CURPOS(2)_#CURSOR POSITION (NEG=NOT USED) / TERMINATION C_^1_%EQU NCHAR(3)_$NUMBER OF CHARACTERS READ_^1_%EQU DATADD(4)_#ADDRESS OF DATA BUFFER_^1*_]_^1*_8PORT TABLE EQUATES_^1*_]_^1_%EQU PORTEQ(11)_"PORT TABLE OFFS€€ET FOR EWES_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1****_]_^1_%EJT 1_^1RQP560 NUM 0_,ENTRY_^1_%SRI* PDT_*SAVE PDT ADDRESS_^1*_8CHECK IF DIAGNOSTIC LU_^1_%LDA- DIAGLU,I_(GET DIAGNOSTIC LU_^1_%CAE- ELU,I_+SKIP IF DIAGNOSTIC_^1_%JMP* CRT10_+NOT DIAGNOSTIC_^1_%RTJ* CRTWES_'YES DIAG, PUT EQUIP CODE IN PORT TABLES_^1*_8SET COMPLETION PRIORITY IN NEW REQUEST_^1CRT10 LDA- $EF_-PICK UP CURRENT€€ PRIORITY LEVEL_^1_%SFA- NEWREQ,3,4,I_#STORE IN REQUEST_^1*_8SET LU OF 1X8 CLA IN NEW REQUEST_^1_%LDA =XTERMLU_(PICK UP LOGICAL UNIT OF CLA_^1_%STA- NEWVLU,I_(STORE IN REQUEST_^1*_8COMPUTE LENGTH OF DATA BUFFER FOR NEW REQUEST_^1_%LDA- ENDBUF,I_(PICK UP LWA+1_^1_%SUB- BEGBUF,I_(SUBTRACT FWA_^1_%ALS 1_/TIMES 2 FOR CHARACTERS_^1_%STA- NEWNCH,I_(STORE IN REQUEST_^1*_8SET ADDRESS OF €€_%EQU NEWVLU(32)_"NEW V-FIELD, LOGICAL UNIT_^1_%EQU NEWNCH(33)_"NEW NUMBER OF CHARACTERS_^1_%EQU NEWSHD(34)_"NEW START ADDRESS OF HEADER/BUFFER_^1_%EQU ELINK(40)_#PDT THREAD_^1_%EQU NCOMP(41)_#PSEUDO COMPLETION FOR NEW REQUEST_^1*_]_^1*_8LOW CORE EQUATES_^1*_]_^1_%EQU NEGONE($13)_!$FFFE_^1_%EQU ZERO($22)_#ZERO_^1_%EQU ADISP($EA)_"DISPATCHER_^1*_]_^1*_8FAULT CODE EQUATES_^1*€€_]_^1_%EQU ALARM(2)_^1_%EQU TIMOUT(0)_^1_%EQU PARITY(3)_^1*_]_^1*_8BUFFER HEADER EQUATES_^1*_]_^1_%EQU PORTNB(0)_#PORT NUMBER_^1_%EQU DSTAT1(1)_#STATUS_^1_%EQU CURPOS(2)_#CURSOR POSITION (NEG=NOT USED) / TERMINATION C_^1_%EQU NCHAR(3)_$NUMBER OF CHARACTERS READ_^1_%EQU DATADD(4)_#ADDRESS OF DATA BUFFER_^1*_]_^1*_8PORT TABLE EQUATES_^1*_]_^1_%EQU PORTEQ(11)_"PORT TABLE OFFS€€ET FOR EWES_^1*_]_^1*_>FLOW_^1*_>----_^1*_]_^1****_]_^1_%EJT 1_^1RQP560 NUM 0_,ENTRY_^1_%SRI* PDT_*SAVE PDT ADDRESS_^1*_8CHECK IF DIAGNOSTIC LU_^1_%LDA- DIAGLU,I_(GET DIAGNOSTIC LU_^1_%CAE- ELU,I_+SKIP IF DIAGNOSTIC_^1_%JMP* CRT10_+NOT DIAGNOSTIC_^1_%RTJ* CRTWES_'YES DIAG, PUT EQUIP CODE IN PORT TABLES_^1*_8SET COMPLETION PRIORITY IN NEW REQUEST_^1CRT10 LDA- $EF_-PICK UP CURRENT€€ PRIORITY LEVEL_^1_%SFA- NEWREQ,3,4,I_#STORE IN REQUEST_^1*_8SET LU OF 1X8 CLA IN NEW REQUEST_^1_%LDA =XTERMLU_(PICK UP LOGICAL UNIT OF CLA_^1_%STA- NEWVLU,I_(STORE IN REQUEST_^1*_8COMPUTE LENGTH OF DATA BUFFER FOR NEW REQUEST_^1_%LDA- ENDBUF,I_(PICK UP LWA+1_^1_%SUB- BEGBUF,I_(SUBTRACT FWA_^1_%ALS 1_/TIMES 2 FOR CHARACTERS_^1_%STA- NEWNCH,I_(STORE IN REQUEST_^1*_8SET ADDRESS OF €€REQUEST BUFFER IN NEW REQUEST_^1_%LDQ- BEGBUF,I_(PICK UP FWA_^1_%INQ -5_.BACKUP 5 WORDS_^1_%STQ- NEWSHD,I_(STORE IN REQUEST_^1*_8SET PORT NUMBER IN NEW REQUEST_^1_%LDA- PORT,I_*PICK UP PORT NUMBER_^1_%STA- (ZERO),Q_(STORE IN REQUEST_^1*_8CLEAR STATUS AND READ TRANSFER COUNT,NEW REQ._^1_%CLR A_^1_%STA- DSTAT1,Q_(CLEAR STATUS_^1_%STA- NCHAR,Q_)CLEAR READ CHARACTER TRANSFER COUNT._^€€1*_8INDICATE NO CURSOR POSITIONING IN NEW REQUEST_^1_%ENA -1_^1_%STA- CURPOS,Q_(PUT NEG VALUE IN CURSOR FLAG_^1*_8SET DATA BUFFER ADDRESS IN HEADER_^1_%LDA- BEGBUF,I_(GET DATA FWA_^1_%STA- DATADD,Q_(PUT IN HEADER_^1_%SPC 1_^1*_8PUT IO REQUEST ADDRESS IN INDIRECT REQUEST_^1_%LDA* PDT_*GET PDT ADDRESS_^1_%INA NEWREQ_*ADD OFFSET TO NEW REQUEST_^1_%STA* RQST+2_*SAVE ADDRESS IN INDIR€€ECT REQUEST_^1*_]_^1RQST_!INDIR RQST,1_$INDIRECT IO REQUEST (ADDRESS TO BE INSERTED)_^1*_]_^1_%JMP- (ADISP)_%WAIT FOR COMPLETION_^1_%SPC 2_^1*_]_^1*_]_^1*_8STORAGE_^1*_]_^1DATBUF NUM 0_,BUFFER DATA ADDRESS_^1NWORDS NUM 0_,DATA LENGTH IN WORDS_^1PDT_"NUM 0_,PDT ADDRESS_^1*_]_^1_%EJT 1_^1*_8COMPLETION ADDRESS_^1CP560 EQU CP560(*)_$CONTINUATOR ADDRESS_^1REQCOM NUM 0_^1*_8GET €€PDT ADDRESS OF THIS COMPLETION_^1_%LDA* REQCOM_*GET COMPLETION ADDRESS WITHIN PDT_^1_%INA -NCOMP-1_(BACK UP TO GET PDT START ADDRESS_^1_%STA- I_,RESTORE PDT ADDRESS TO I_^1*_]_^1*_8SEE IF ANY CHARACTERS HAVE BEEN TRANSFERRED_^1_%LDQ- NEWSHD,I_(HEADER ADDRESS TO Q_^1_%LDQ- NCHAR,Q_)PICK UP NUM CHARS_^1*_8DETERMINE NUMBER OF WORDS_^1_%XFQ 1_/CHARACTER COUNT TO R1_^1_%LRS 1_/CONVER€€T LENGTH TO WORDS_^1_%SFZ- ESTAT1,0,1,I SKIP IF READ COMPLETION_^1_%JMP* REQ010_'GO TO DO WRITE COMPLETION_^1*_8DETERMINE IF ODD POSITION FILLER NEEDED_^1_%SAP REQ010_*SKIP IF EVEN NUM CHARS INPUT_^1_%LDA- BEGBUF,I_(GET DATA BUFFER FWA_^1_%STA* DATBUF_*SAVE BUFFER ADDRESS LOCALLY_^1_%ENA -0_.A=$FFFF_^1_%SCA* (DATBUF),1_%STORE $FF IN ODD CHARACTER POSITION_^1_%INQ 1_/ADD 1 TO NU€€M OF WORDS INPUT_^1REQ010 STQ* NWORDS_*SAVE NUMBER OF WORDS READ_^1_%SPC 2_^1_%SPC 1_^1REQ050 XFI Q_,PUT PDT ADDRESS IN Q_^1_%JMP* (RQP560)_$RETURN_^1_%EJT 1_^1*_]_^1*_)S T A 5 6 0_^1*_]_^1*_$THIS ROUTINE USES THE STATUS WORD RETURNED BY THE CLA DRIVER_^1*_$IN THE EXPANDED I/O REQUEST, TO DO THE FOLLOWING._^1*_)1. STATUS SAVED IN PDT (ESTAT2,SINTER)._^1*_)2. IF ERROR INDICATED€€_^1*_/SET ERROR BITS IN PDT (ESTAT1,EREQST)._^1*_/DETERMINE FAULT CODE AND PUT IN PDT (FLTCOD)._^1*_)3. RETURN_^1*_]_^1*_]_^1STA560 NUM 0_,ENTRY_^1*_8SAVE STATUS IN PDT_^1_%LDQ- NEWSHD,I_(HEADER ADDRESS TO Q_^1_%LR1- DSTAT1,Q_(PICK UP RETURNED STATUS IN R1_^1_%SR1- ESTAT2,I_(SAVE IN PDT(LAST STATUS TAKEN)_^1_%SR1- SINTER,I_(SAVE IN PDT(STATUS AFTER INTERRUPT)_^1*_8CHECK IF ERROR F€€LAG SET_^1_%SFN- NEWVLU,15,3,I_"SKIP IF V-FIELD IN LU WORD IS SET_^1_%JMP* STA30_+NO ERROR - JUMP TO END._^1*_8SET ERROR BITS IN PDT_^1_%SEF- ESTAT1,15,1,I_"BIT 15 IN ESTAT1 - DEVICE ERROR_^1_%SEF- EREQST,14,1,I_"BIT 14 IN EREQST - HARDWARE ERROR_^1*_8DETERMINE FAULT CODE_^1_%ENA ALARM_+ASSUME ALARM - CHANGE LATER IF OTHER._^1_%SFN- DSTAT1,10,1,Q_"SKIP IF TIMEOUT_^1_%JMP* STA10_+N€€OT TIMEOUT_^1_%SPC 1_^1_%ENA TIMOUT_*GET FAULT CODE FOR TIMEOUT_^1_%SR1- STIMEO,I_(SAVE STATUS IN PDT_^1_%JMP* STA20_+GO TO RETURN_^1STA10 SFN- DSTAT1,8,1,Q_#SKIP IF PARITY_^1_%JMP* STA20_+NOT PARITY_^1_%SPC 1_^1_%ENA PARITY_*GET FAULT CODE FOR PARITY_^1STA20 STA- FLTCOD,I_(STORE CODE IN PDT_^1_%SPC 1_^1STA30 JMP* (STA560)_$RETURN_^1_%EJT 1_^1*_]_^1*_)C R T W E S - ENTERE€€D ONLY IF DIAGNOSTIC LU._^1*_8SETS EQUIPMENT CODE IN_^1*_81X8 CLA PORT TABLES TO VALUE_^1*_8IN 1X8 CLA PDT. THE VALUE MAY_^1*_8HAVE BEEN CHANGED IN PDT IF_^1*_8DIAGNOSTIC PARAMETER FOR EWES_^1*_8WAS CHANGED._^1_%SPC 1_^1CRTWES NUM 0_,ENTRY_^1_%LDQ =XTERMLU_$GET 1X8 CLA LU_^1_%LDQ LOG1A,Q_%GET PDT ADDRESS OF 1X8 CLA_^1*_8SET CLA TIMER FOR ENTRY EVERY 60 MS._^1_%LDA- EDCLK,Q_%GE€€T CLA TIMER WORD_^1_%EOR- NEGONE_'COMPARE WITHE $FFFE_^1_%SAN WES05_(SKIP IF TIMER ON (NOT $FFFE)_^1_%LDA* GOTIME_'GET MAX TIMER VALUE_^1_%STA- EDCLK,Q_%RESET CLA TIMER WORD_^1_%SPC 1_^1WES05 LFA- EWES,10,4,I_$GET EWES FOR 1X8 CLA FROM PERIPH PDT_^1_%SFA- EWES,10,4,Q_!SAVE EWES IN CLA PDT_^1_%LDQ =XPORTS_%GET PORT TABLE ADDRESS_^1WES10 ADQ =XPLENTH_$INCREASE Q BY PORT LENGTH_€l^1*_$CQE =XEPORTS_$SKIP IF END OF PORT TABLES REACHED_^1_%NUM $0405_^1_%NUM $E000_^1_%ADC EPORTS_^1_%SPC 1_^1_%JMP* WES20_(NOT END OF PORT TABLES_^1_%JMP* (CRTWES)_$RETURN_^1WES20 SFA- PORTEQ,10,4,Q STORE EWES IN NEXT PORT TABLE_^1_%JMP* WES10_(LOOP UNTIL ALL PORT TABLES ENTERED_^1_%SPC 1_^1GOTIME NUM 60_+CLA TIME OUT VALUE_^1_%END_]_^1 MON_]_^1*U_]_^__ lPCR2629 CSY/ P€1_%NAM CR2629_'DECK-ID D93 PERIPH. DRIVERS 1.3C SUMMARY-126_^1*_$CARD READER HOLLERITH TO ASCII CONVERSION TABLES_(126*4303_^1*_$PERIPHERAL DRIVERS 1.0C_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_$THIS ROUTINE ALLOWS THE CARD READER DRIVER -D1829- TO_!126*4303_^1*_$OPTIONALLY OPERATE IN 026 OR 029 CONVERSION MOD€€E_(126*4303_^1*_$DEPENDING UPON A FLAG SET IN THE PHYSTB FOR THIS DRIVER 126*4303_^1_%SPC 2_R126*4303_^1*_]_^1_%ENT CDRD26_'TABLE FOR 026 HOLLERITH-TO-ASCII_$126*4303_^1*_]_^1CDRD26 NUM $3120_N126*4303_^1_%NUM $3332_^1_%NUM $3534_^1_%NUM $3736_^1_%NUM $3938_^1_%NUM $3D26_^1_%NUM $3A27_^1_%NUM $223E_^1_%NUM $2F30_^1_%NUM $5453_^1_%NUM $5655_^1_%NUM $5857_^1_%NUM $5A5€€9_^1_%NUM $2C5C_^1_%NUM $2528_^1_%NUM $405F_^1_%NUM $4A2D_^1_%NUM $4C4B_^1_%NUM $4E4D_^1_%NUM $504F_^1_%NUM $5251_^1_%NUM $2421_^1_%NUM $5D2A_^1_%NUM $5E3B_^1_%NUM $412B_^1_%NUM $4342_^1_%NUM $4544_^1_%NUM $4746_^1_%NUM $4948_^1_%NUM $2E3F_^1_%NUM $5B29_^1_%NUM $233C_^1_%EJT_U126*4303_^1_%ENT CDRD29_'TABLE FOR 029 HOLLERITH-TO-ASCII_$126*4303_^1_%SPC 2_^1CDRD29€€ NUM $3120_N126*4303_^1_%NUM $3332_^1_%NUM $3534_^1_%NUM $3736_^1_%NUM $3938_^1_%NUM $233A_^1_%NUM $2740_^1_%NUM $223D_^1_%NUM $2F30_^1_%NUM $5453_^1_%NUM $5655_^1_%NUM $5857_^1_%NUM $5A59_^1_%NUM $2C5C_^1_%NUM $5F25_^1_%NUM $3F3E_^1_%NUM $4A2D_^1_%NUM $4C4B_^1_%NUM $4E4D_^1_%NUM $504F_^1_%NUM $5251_^1_%NUM $245D_^1_%NUM $292A_^1_%NUM $5E3B_^1_%NUM $4126_^1€Š_%NUM $4342_^1_%NUM $4544_^1_%NUM $4746_^1_%NUM $4948_^1_%NUM $2E5B_^1_%NUM $283C_^1_%NUM $212B_^1_%SPC 2_R126*4303_^1_%END_]_^__ Š END/