Inter-Office MemorandumToF LudolphDateFebruary 13, 1978FromJR CucinittiLocationPalo AltoSubject Disk DiagnosticOrganization SDD/CS/SDXEROX Filed on: Diskdiag.memoThe Disk Diagnostic pack has two diagnostics written in four different places in anticipation of loosing one ormore of them. One diagnostic is booted by using just the boot button in the first case, and depressing the 0 keyand pushing the boot button in the next. The other diagnostic is booted with the K key and boot button, andthe V key and the boot button.The diagnostic booted with no keys and the 0 key will write one pass on the disk and then start into a readloop, we call it write once, read forever. To run the diagnostic just type 40001B (this sets an error breakpoint),40000P (sends the Alto to 40000 to fetch the first instruction). The diagnostic booted with the K or V key willwrite, read, write, read,...... To run this diagnostic type 1001B (sets the error breakpoint), 1000P (fetches theinstruction from 1000). To halt the diagnostic just depresss the Swat key, this will display four registers, tocontinue depress the P (procede) key.The knowledge of the location of the diagnostics in the Alto memory is of some use. The diagnostic booted bythe 0 key resides from 40000 thru 42154 and uses memory locations from 1000 thru 37777 for the datahandling area. The diagnostic booted by the K key resides from 1000 thru 3153 and uses 40000 thru 176777 forthe data handling area. The first 777 locations are used to run the display and keyboard and should not bechanged. You may note that the listing does not reflect the true memory locations but do indicate the locationsrelative to the starting locations of the diagnostics.The debugger located in the first 1000 locations will allow you to modify any memory location and remember itonly knows about octal numbers. The commands to the debugger are:n/ opens and displays memory location ncr inserts the typed information in n and closes the location_ modifies, closes location n, and opens location n+1^ modifies, closes location n, and opens location n-1A displays accumulators 0-3nB set a breakpoint at location nnD deletes breakpoint n (1-9)nP procede from this locationWhen you do get an error you will see something like this:DATA COMPARE FAILED0:123456 1:123455 2:012345 3:001612AC0 = Data that was to be written on the diskAC1 = Data that was read from the disk (this may indicate a memory problem)AC2 = Memory location the disk data was written intoAC3 = Of no intrest concerns the text on the displayCONTROLLER REPORTS BAD STATUS:0:002310 1:007541 2:034523 3:001612AC0 = Of no intrestAC1 = Disk controller statusAC2 = Pointer to disk control block that failedAC3 = Of no intrest concerns the text on the displaySee the Alto hardware manual for the orginization of the disk command blocks. To continue from an error breakpoint just type P.]h p cq]-7B ^] -7B Yp-U PW" JP Ikpq HZRpq Gpq D+pq$ CfLpq  B)pq[pqpq @>pqpq ?q >rpq ;N :K 9~D) 8Ad 7f 56 3MR 2B0rpq$r/pq#rq.Ypqrqrq-pqrqrq+pq*rpqr)erpq((rpq %C:"p!& q- K 4 [4p& *q  / s4 M /pq f =]=2Some of the intresting locations in the diagnostic:0562 Current sector (0-13) updated by the diagnostic0563 Minimum sector number0564 Maximum sector number0565 Current head number (0=upper, 1=lower)0566 Minimum head number0567 Maximum head number0570 Current drive (0 or 1)0571 Minimum drive number0572 Maximum drive number0573 Current track number0574 Minimum track (never less than 100)0575 Maximun trackThese locations may be changed to write only with one head and just in one sector on one track. If 0574 ischanged you may write over the boot loader so never have it less than 100.Some samples of the disk command blocks that are used for alignment:Four cylinder seek1000/20002000/10001001/02001/01002/440022002/440021003/02003/01004/02004/01005/02005/01006/02006/01007/02007/01010/02010/01011/102011/50At this time set location 521 to 1000, when this location has some value other than 0 the disk microcode will goto that location for the disk command block. To halt the loop set location 521 to 0.Track 0 or restore adjustment1000/20002000/10001001/02001/01002/440022002/440021003/02003/01004/02004/01005/02005/01006/02006/01007/02007/01010/02010/01011/02011/51For head alignment set the command block as follows:1000/10001001/01002/440021003/01004/01005/01006/01007/01010/01011/1510(upper head), 1011/1514(lower head)The data burst is adjusted with the same block by changing only location 1011.1011/1440(upper head), 1011/1444(lower head)The disk address may be changed at any time and the microcode will ddo the right thing, so you need not stopthe disk (521/0) to switch from one head to the other.Gfs bAq3 a5 _ ^ ]M, \ Z Y XY W U T) Se Pdpq O.pqpq M4DKJ,I},H@ , G,E,D,CL,B,@,?, =^ ;U9d8',6,5 , 4p,33,1,0,/|,.?,-, *4)K(& %$W#! c&, No, P 6X 3=]3This is the listing of the diagnostic, if the diagnostic is loaded at 1000 then the first address is not 0 but 1000and the listing reflects the locations relative to 1000, if loaded at 40000 all locations are relative to 40000. 0001 ALTKDGfs bAp h aT ]Mq  ]*= %4 ; ; ;ALTO DISK DIAGNOSTIC ; ;E. MCCREIGHT ; ; 102513 .DALCSG=SUBL# 0,0,SNC 102512 .DALCSLE=SUBL# 0,0,SZC .TITLALTKD .NREL .EXTN PHIAD,MESSAGE 000001 .TXTM 1 ; ;ALTO CONSTANTS ; 000521 KBCON=521;DISK BLOCK ADDRESS 000420 DASCON=420;DISPLAY BLOCK ADDRESS 000452 WWCON=452;WAKEUPS WAITING ADDRESS 000501 IVCON=501;VECTOR OF INTERRUPT NEW PC'S 061001 EIR=61001;OPCODE FOR ENABLE INTERRUPTS 061000 DIR=61000;OPCODE FOR DISABLE INTERRUPTS 061002 BRI=61002;OPCODE FOR RETURN FROM INTERRUPT 000527 TRPC=527;BEFORE A TRAP THE PC GOES HERE 000530 TRPVEC=530;THE VECTOR OF 37 TRAP LOCATIONS GOES HERE 062000 ERROR=62000;UNIMPLEMENTED I/0 OPERATION WHICH TRAPS ; ;THE OLD FORMAT OF A DISK CONTROL BLOCK ; 000000 POINTER=0 000001 STATUS=1 000002 DSKCOMM=2 000003 LABEL=3 000004 DATA=4 000005 HDRWD=5 000006 DSKADR=6 000007 SUCCESS=7 000010 FAILURE=10 000011 HEADER=11 000012 FINISHUP=12 000013 INTSDONE=13 000014 SERRS=14 000015 DCBEND=15 ; ;INITIALIZE THE DISK ; 00000'000402 INIT:JMP.+2;SKIP OVER ERROR BREAK 00001'002411 BREAK:JMP@.RR2;PUT DEBUGGER BREAKPOINT HERE !!! 00002'006401 JSR@.+1;SET UP THE INTERRUPT SYSTEM 00003'001500'SIZEM 00004'126400 SUB1,1;ZERO THE ERROR COUNTER 00005'000406 JMPINITA;SKIP OVER THE DISPLAY CONTROL BLOCK 00006'000000 DB:0;MUST BE AN EVEN ADDDRESS 0002 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D) CL' B @ ?& >X = ; : 9d 8' 6 5 4p 33 1 0 /| .? - + * )K ( & % $W # !$  c &  # o 2 P 0Nv5 00007'000040 40 00010'000000 DBMP:0 00011'000536 350. 00012'001473'.RR2:RR2 00013'044011-INITA:STA1,SERRCNT;ZERO SOFT ERROR COUNT 00014'044012-STA1,HERRCNT;AND HARD ERROR COUNT 00015'022433 LDA@0,.RBOT;REASON TABLE RESET TO EMPTY 00016'042433 STA@0,.RTOP 00017'006401 JSR@ .+1 00020'001042'SUINT 00021'030004-LDA2,KBLKADR;SET UP ILLEGAL CURRENT ADRESS TO 00022'020425 LDA0,ALLONES;FORCE A SEEK 00023'041002 STA0,2,2 00024'030003-LDA2,DASTART 00025'020425 LDA0,DBLKAD 00026'041000 STA0,0,2;START THE DISPLAY 00027'006424 JSR@SDBAD;SET UP DISK CONTROL BLOCK CHAINS 00030'101010 MOV#0,0;NOP 00031'002401 REDO:JMP@.+1 00032'000033'WRTIT 00033'006456 WRTIT:JSR@SMAD 00034'000446 JMPIDONE 00035'030417 IMORE:LDA2,WRTBLK;SET UP TO WRITE AT CURRENT DISK ADDRESS 00036'004466 JSRMKDCB 00037'101010 MOV#0,0;NOP 00040'006453 JSR@ARGEN;INITIALIZE DATA BLOCK 00041'101010 MOV#0,0;NOP 00042'006401 JSR@.+1;ENTER CPTR IN COMMAND QUEUE 00043'000414'EQUE 00044'006446 JSR@IAD;GET THE NEXT DISK ADDRESS 00045'000415 JMPRDIT;IF NONE EXIST, READ THE RECORDS 00046'000767 JMPIMORE;OTHERWISE, DO IT AGAIN 00047'177777 ALLONES:177777 00050'000356'.RBOT:RSNBOT 00051'000400'.RTOP:RSNTOP 00052'000006'DBLKAD:DB 00053'000775'SDBAD:SUDB 00054'000055'WRTBLK:.+1 00055'000106'WRTALL 00056'000107'IHDR 00057'000001-CODAD 00060'000110'NOPAD 00061'000601'ANOERR:NOERR ; ;READ ALL RECORDS ON THE DISK AND COMPARE THEM WITH WHAT ;WAS WRITTEN ; 00062'006427 RDIT:JSR@SMAD;GO BACK TO THE MINIMUM DISK ADDRESS 00063'000417 JMPIDONE;(IF ERROR) 00064'030406 RDMORE:LDA2,RDBLK;READ A BLOCK AT THE CURRET ADDRESS 00065'004427 JSRDODCB 00066'101010 MOV#0,0;NOP 00067'006423 JSR@IAD;GET NEXT DISK ADDRESS 0003 ALTKDGfs bAq a _ ^ ]M \ Z ' Y ' XY"  W U T Se $ R( " P O Nq M4"  K"  J I} H@ G E D CL'' B @ ?"  >X = ; :"  9d"  8'"  6 5 4p 33 1 0 /| .? - + * )K ( & %7 $W # ! $# c &" ){"   o 2  8N6 00070'000412 JMPIDONE;IF WE ARE AT THE END, EMPTY THE QUEUE 00071'000773 JMPRDMORE;OTHERWISE GET A NEW QUEUE ENTRY AND TAKE OFF 00072'000073'RDBLK:.+1 00073'000077'CHRR 00074'000101'SUBST 00075'000001-CODAD 00076'000100'ACDAT 00077'000120 CHRR:120;CHECK HEADER AND LABEL, READ REST OF SECTOR 00100'000615'ACDAT:CDAT; 00101'000000 SUBST:0 00102'006401 IDONE:JSR@.+1;MAKE SURE COMMAND QUEUE EMPTIES 00103'000464'FLUSH 00104'002401 SMASH:JMP@.+1 00105'000031'REDO 00106'000374 WRTALL:374 00107'171717 IHDR:171717 00110'000602'NOPAD:CKDERR; 00111'000474'SMAD:SETMIN 00112'000506'IAD:INCAD 00113'000650'ARGEN:RGEN ; ;MAKE UP A DISK CONTROL BLOCK AND QUEUE IT FOR THE DISK ; 00114'054407 DODCB:STA3,R3DOD 00115'004407 JSRMKDCB;MAKE UP THE PROPER DCB 00116'101010 MOV#0,0;NOP 00117'006401 JSR@.+1;QUEUE IT 00120'000414'EQUE 00121'034402 LDA3,R3DOD 00122'001401 JMP1,3 00123'000000 R3DOD:0 ; ;MAKE UP A DISK CONTROL BLOCK. REGISTER 2 CONTAINS A POINTER ;TO A FOUR-WORD BLOCK OF POINTERS TO ITEMS TO BE INCLUDED ;IN THE CONTROL BLOCK: (0) THE DISK COMMAND ;(1) THE HEADER WORD ;(2) THE DISK ADDRESS ;(3) THE FINISHUP ROUTINE ; 00124'054422 MKDCB:STA3,R3MKD 00125'050422 STA2,MKDPARM 00126'004422 JSRGCB;GET AN AVAILABLE COMMAND BLOCK 00127'101010 MOV#0,0;NOP 00130'030002-LDA2,CPTR;THE COMMAND BLOCK 00131'034416 LDA3,MKDPARM 00132'023400 LDA@0,0,3;THE DISK COMMAND 00133'041002 STA0,DSKCOMM,2 0004 ALTKDGfs bAq% a" , _ ^ ]M \ Z Y XY W U+ T Se R( P O"  Nq M4 K J I} H@ G E D CL B @ ? >X =6 ; : 9d 8' 6 5 4p 33 1 0 /| .? - +; *8 )K* ( & % $W # !  c &   o 2  9MN7 00134'023401 LDA@0,1,3;THE HEADER WORD 00135'041005 STA0,HDRWD,2 00136'023402 LDA@0,2,3;THE DISK ADDRESS 00137'041006 STA0,DSKADR,2 00140'023403 LDA@0,3,3;THE FINISHUP ROUTINE 00141'041012 STA0,FINISHUP,2 00142'102400 SUB0,0;MARK BLOCK AS UNPROCESSED BY INTERRUPT 00143'041013 STA0,INTSDONE,2;ROUTINE 00144'034402 LDA3,R3MKD 00145'001401 JMP1,3 00146'000000 R3MKD:0 00147'000000 MKDPARM: 0 ; ;GET A POINTER TO AN AVAILABLE COMMAND BLOCK IN CPTR. ALWAYSSKIPS. ; 00150'054414 GCB:STA3,R3G 00151'030005-GC1:LDA2,AS;TRY TO ALLOCATE ONE FROM AVAILABLE STACK 00152'151015 MOV#2,2,SNR; 00153'000406 JMPSTKEMP 00154'025000 LDA1,POINTER,2;POP THE AVAILABLE STACK 00155'044005-STA1,AS 00156'050002-STA2,CPTR 00157'034405 LDA3,R3G 00160'001401 JMP1,3 00161'004404 STKEMP:JSRGETQE 00162'000767 JMPGC1 00163'000766 JMPGC1 00164'000000 R3G:0 ; ;REMOVE A FINISHED ENTRY FROM THE COMMAND QUEUE, AND PUT ;IT IN THE AVAILABLE STACK. ALWAYS SKIP. ; 00165'054557 GETQE:STA3,R3Q 00166'101010 GQ1:MOV#0,0;NOP 00167'030006-LDA2,KQF;CHECK IF COMMAND QUEUE IS EMPTY. IF SO GIVE ERROR 00170'151015 MOV#2,2,SNR; 00171'002553 JMP@R3Q;DON'T SKIP IF ERROR 00172'025001 LDA1,STATUS,2;CHECK THE STATUS OF THE QUEUE FRONT 00173'125014 MOV#1,1,SZR 00174'000535 JMPPULLIT;CONTROLLER GOT TO IT 00175'034004-LDA3,KBLKADR;MAKE SURE CONTROLLER IS RUNNING 00176'021400 LDA0,0,3 00177'101004 MOV0,0,SZR 00200'000766 JMPGQ1;IT'S RUNNING. RETRY. 00201'021001 LDA0,STATUS,2;GET THE STATUS WORD FOR KQF 00202'101014 MOV#0,0,SZR 00203'000763 JMPGQ1;COMMAND AT KQF IS DONE. PROCESS IT. 00204'050007-RES:STA2,KQM;(FOR THE INTERRUPT ROUTINE) 00205'051400 STA2,0,3;DISK CONROLLER IS STOPPED AND HAS NOT PROCESSED 00206'000760 JMPGQ1;THE COMMAND AT KQF. RESTART IT. 0005 ALTKDGfs bAq a _ ^ ]M \ Z& Y $ XY W U T Se R( P O Nq; M4 K J I}" ( H@ G E $ D CL B @ ? >X = ; : 9d 8' 6 5 4p7 33' 1 0 /| .? -1 + * )K " # ( & % $ $W # !  "  c &# "  / o 2   :vP88 00207'010011-AAUGH:ISZSERRCNT;THERE WAS AN ERROR. ADD ONE TO SOFT 00210'101010 MOV#0,0;ERROR COUNT. 00211'022004-LDA@0,KBLKADR;WAIT FOR CONTROLLER TO STOP 00212'101014 MOV#0,0,SZR 00213'000776 JMP.-2 00214'034542 LDA3,RSNBOT;CLASSIFY THE ERROR 00215'020563 SRCHLP:LDA0,RSNTOP 00216'116512 SLE0,3 00217'000421 JMPLOOK 00220'020557 LDA0,RSNEND;THIS ERROR NOT IN TABLE 00221'116513 SG0,3 00222'000434 JMPHARDYET;AND NO TABLE SPACE IS LEFT, SIGH! 00223'021001 LDA0,STATUS,2;MAKE TABLE ENTRY FOR THIS ERROR 00224'041400 STA0,0,3 00225'102400 SUB0,0 00226'041401 STA0,1,3 00227'161400 INC3,0;MOVE UP THE TOP OF THE TABLE 00230'101400 INC0,0 00231'040547 STA0,RSNTOP 00232'054513 STA3,R3SL;A NEW ERROR STATUS IS SEEN 00233'025001 LDA1,STATUS,2;SHOW STATUS TO DIAGNOSTICIAN 00234'006000-JSR@PMSG 00235'002135'NEWER 00236'034507 LDA3,R3SL 00237'062000 ERROR 00240'021001 LOOK:LDA0,STATUS,2;SEE IF OUR STATUS MATCHES TABLE, 00241'024507 LDA1,NOKCON;EXCEPT FOR SECTOR NUMBER 00242'123400 AND1,0 00243'025400 LDA1,0,3 00244'106400 SUB0,1 00245'020503 LDA0,NOKCON 00246'107405 AND0,1,SNR 00247'000404 JMPEFND;YES, IT DOES 00250'175400 INC3,3;NO, IT DOESN'T. GO TO NEXT ENTRY. 00251'175400 INC3,3 00252'000743 JMPSRCHLP 00253'021401 EFND:LDA0,1,3;INCREMENT NUMBER OF OCCURRENCES 00254'101400 INC0,0 00255'041401 STA0,1,3 00256'021014 HARDYET: LDA0,SERRS,2;NUMBER OF SOFT ERRORS FOR THIS BLOCK 00257'101400 INC0,0 00260'041014 STA0,SERRS,2 00261'024470 LDA1,HARDTH;HAS SOFT ERROR HARDENED? 00262'106513 SG0,1 00263'000407 JMPSOFT 00264'010012-ISZHERRCNT;YES, SEND MESSAGE TO THAT EFFECT 00265'101010 MOV#0,0 00266'006000-JSR@PMSG 0006 ALTKDGfs bAq$# a _ ^ $ ]M \ Z Y"  XY W U T Se"  R( P" ! O Nq "  M4 K J I} H@ G E D CL"  B "  @ ? >X = ; : ' 9d$ 8' 6 5 4p 33 1" 0! /| .? - +' * )K ( & '$ % $W # !"   c &   o 2 b 6N9 00267'002116'HARDERR 00270'062000 ERROR 00271'000444 JMPREMOVE;GIVE UP ON THIS DCB AND TRY THE NEXT ONE 00272'024460 SOFT:LDA1,RESTH;SHOULD WE DO A RESTORE? 00273'106513 SG0,1 00274'000423 JMPAGAIN;NO, JUST RETRY. 00275'021006 LDA0,DSKADR,2;YES, FIGURE OUT WHICH DISK IS INVOLVED 00276'025002 LDA1,DSKCOMM,2 00277'127000 ADD1,1 00300'123000 ADD1,0 00301'024452 LDA1,DSKBIT 00302'123400 AND1,0 00303'024451 LDA1,RSTBIT;COMPUTE A RESTORE DISK ADDRESS BY 00304'123000 ADD1,0;ADDING RESTORE BIT TO BIT FOR AFFECTED 00305'040506 STA0,RKADR;DISK. 00306'034004-LDA3,KBLKADR;FORCE A SEEK ON NEXT OPERATION 00307'024446 LDA1,MONE 00310'045402 STA1,2,3 00311'020470 LDA0,.RESTOR;START THE DISK CONTROLLER ON A RESTORE 00312'041400 STA0,0,3 00313'021400 LDA0,0,3;HAS IT STOPPED YET? 00314'101014 MOV#0,0,SZR 00315'000776 JMP.-2;NO -- ASK AGAIN. 00316'045402 STA1,2,3;FORCE A SEEK ON NEXT OPERATION 00317'050427 AGAIN:STA2,R2ZAP;SCAN THE CHAIN, RESETTING DCBS 00320'151005 ZAPLP:MOV2,2,SNR 00321'000405 JMPRESTART 00322'006401 JSR@.+1;CLEAR DCB FOR RE-ENTRY ON QUEUE 00323'001565'SETLAB 00324'031000 LDA2,POINTER,2 00325'000773 JMPZAPLP 00326'030420 RESTART: LDA2,R2ZAP 00327'034004-LDA3,KBLKADR 00330'000654 JMPRES 00331'006401 PULLIT:JSR@.+1;VERIFY THAT THE CORRECT INTERRUPT 00332'001442'CKINT;HAPPENED ON THIS BLOCK 00333'007012 JSR@FINISHUP,2;DO THE FINISHUP ROUTINE 00334'000653 JMPAAUGH;THINGS DID NOT GO SO WELL 00335'035000 REMOVE:LDA3,POINTER,2;GET NEXT QUEUE FRONT ADDRESS 00336'054006-STA3,KQF 00337'024005-LDA1,AS;PUSH THE ENTRY ON AVAILABLE STACK 00340'045000 STA1,POINTER,2; 00341'050005-STA2,AS 00342'034402 LDA3,R3Q 00343'001401 JMP1,3 00344'000000 R3Q:0 00345'000000 R3SL:0 0007 ALTKDGfs bAq a _ ^$( ]M \' Z Y"  XY W $& U T Se R( P O Nq" ! M4& K"  J I} $ H@ G E D " & CL B @"  ? >X = ;"  : 9d' 8' 6 5 4p 33 1 0 /| .? - + *" ! )K ( "  &"  %" + $W #! !  c &   o 2  7.N10 00346'000000 R2ZAP:0 00347'170000 OKCON:170000 00350'007777 NOKCON:7777 00351'000010 HARDTH:10;NUMBER OF SOFT ERRORS TO HARDEN 00352'000003 RESTH:3;NUMBER OF SOFT ERRORS TO TRIGGER RESTORE 00353'000002 DSKBIT:2 00354'000001 RSTBIT:1 00355'177777 MONE:177777 00356'000357'RSNBOT:.+1 000020 .BLK20;ERRORS ARE CATEGORIZED IN THIS TABLE: ;(0) ERROR STATUS (EXCEPT FOR SECTOR NO.) ;(1) NUMBER OF OCCURRENCES 00377'000377'RSNEND:. 00400'000000 RSNTOP:0 00401'000402'.RESTOR:.+1 00402'000000 0 00403'000000 0 00404'044002 44002 00405'000000 0 00406'000000 0 00407'000000 0 00410'000000 0 00411'000000 0 00412'000000 0 00413'000000 RKADR:0 ; ;PLACE AN ENTRY IN THE COMMAND QUEUE AND START THE ;CONTROLLER IF APPROPRIATE. ; 00414'054456 EQUE:STA3,R3F 00415'030002-LDA2,CPTR;THE ENTRY TO BE ADDED 00416'126400 SUB1,1 00417'045000 STA1,POINTER,2;GIVE IT A 0 POINTER AND 00420'045014 STA1,SERRS,2;NO SOFT ERRORS 00421'020442 LDA0,VALID;MARK THIS AS A VALID COMMAND 00422'025002 LDA1,DSKCOMM,2 00423'107000 ADD0,1 00424'045002 STA1,DSKCOMM,2 00425'006401 JSR@.+1;CLEAR STATUS AND INTS DONE AND LABEL BLOCK 00426'001565'SETLAB 00427'024006-LDA1,KQF 00430'125014 MOV#1,1,SZR;CHECK QUEUE FOR EMPTINESS 00431'000405 JMPNOTEMP 00432'050006-STA2,KQF;STORE THIS ENTRY IN QUEUE FRONT IF QUEUE IS EMPTY 00433'034004-LDA3,KBLKADR 00434'045400 STA1,0,3;IDLE THE DISK CONTROLLER, JUST IN CASE. 00435'000403 JMPEQCOM 00436'034010-NOTEMP:LDA3,KQR 00437'051400 STA2,POINTER,3;POINT CURRENT REAR ENTRY TO NEW ENTRY 00440'050010-EQCOM:STA2,KQR;SET REAR POINTER TO NEW ENTRY 0008 ALTKDGfs bAq a _ ^ ]M( \ Z Y XY W U T% Se( R( P O Nq M4 K J I} H@ G E D CL B @ ? >X = ; : 9d1 8' 6 5 4p 33 1 0 $ /| " .?"  - + * )K* ( & % $W # !1  c' &   $% o$ 2 P 8;N11 00441'030006-FIRELP:LDA2,KQF;IS THE DISK CONTROLLER QUEUE EMPTY? 00442'151015 MOV#2,2,SNR 00443'000416 JMPEQDON;IF SO, WE ARE DONE 00444'034004-LDA3,KBLKADR;IS THE DISK CONTROLLER RUNNING? 00445'021400 LDA0,0,3 00446'101014 MOV#0,0,SZR 00447'000412 JMPEQDON;IF SO, WE ARE DONE 00450'021001 LDA0,STATUS,2;CHECK THE STATUS OF THE QUEUE FRONT 00451'101014 MOV#0,0,SZR 00452'000404 JMPEXTRACT;IF DONE, PULL IT OFF THE QUEUE 00453'050007-STA2,KQM;(FOR THE INTERRUPT ROUTINE) 00454'051400 STA2,0,3;START THE DISK CONTROLLER 00455'000404 JMPEQDON 00456'006415 EXTRACT:JSR@.GETQE 00457'101010 MOV#0,0;NOP 00460'000761 JMPFIRELP 00461'034411 EQDON:LDA3,R3F; 00462'001401 JMP1,3 00463'044000 VALID:44000 ; ;FLUSH THE COMMAND QUEUE INTO AVAILABLE SPACE AS THE CONTROLLER ;FINISHES IT. ; 00464'054406 FLUSH:STA3,R3F 00465'006406 FL1:JSR@.GETQE 00466'000402 JMPFLDON;ERROR RETURN MEANS QUEUE IS EMPTY 00467'000776 JMPFL1 00470'034402 FLDON:LDA3,R3F 00471'001401 JMP1,3 00472'000000 R3F:0 00473'000165'.GETQE:GETQE ; ;POINTERS, COMMAND BLOCKS, AND OTHER GOODIES ; .ZREL 00000-177777 PMSG:MESSAGE 00001-000000 CODAD:0 00002-000000 CPTR:0 00003-000420 DASTART:DASCON 00004-000521 KBLKADR:KBCON 00005-000000 AS:0;TOP OF STACK OF AVAILABLE DCB'S 00006-000000 KQF:0;FRONT OF COMMAND QUEUE. 0 MEANS QUEUE IS EMPTY. 00007-000000 KQM:0;CURRENT ACTION POINT IN COMMAND QUEUE. ; USED AND MAINTAINED BY INTERRUPT ROUTINES. 00010-000000 KQR:0;REAR OF COMMAND QUEUE. 00011-000000 SERRCNT:0;COUNT OF SOFT ERRORS 00012-000000 HERRCNT:0;COUNT OF HARD ERRORS 00013-000452 WWLOC:WWCON 00014-000501 INTVEC:IVCON 0009 ALTKDGfs bAq$# a _"  ^ $ ]M \ Z"  Y " # XY W"  U T Se R( P O Nq M4 K J I} H@ G E D> CL B @ ? >X! = ; : 9d 8' 6 5 4p 33+ 1 0 /| .? - + * )K ( &/ %& $W- # !  c &   o 2  CURTAB 00500'000427 JMPENCODE;DONE 00501'025001 LDA1,1,2;GET MIN FOR THIS FIELD 00502'045000 STA1,0,2;MAKE IT CURRENT 00503'024474 LDA1,TABINC 00504'133000 ADD1,2;MOVE TO NEXT FIELD 00505'000771 JMPMINLP 00506'054452 INCAD:STA3,R3T 00507'030452 LDA2,TABMIN 00510'024466 INCLP:LDA1,TABMAX 00511'132513 SG1,2;SKIP IF TABMAX>CURTAB 00512'000444 JMPOFFEND;CARRY PROPAGATED TO NON-EXISTENT FIELD 00513'025000 LDA1,0,2;GET CURRENT VALUE FOR THIS FIELD 00514'125400 INC1,1;ADD 1 00515'021002 LDA0,2,2;GET MAXIMUM VALUE FOR THIS FIELD 00516'122512 SLE1,0;IF CURRENT<=MAX, UPDATE CURRENT AND QUIT 00517'000403 JMPCARRY 00520'045000 STA1,0,2;UPDATE CURRENT 00521'000406 JMPENCODE 00522'025001 CARRY:LDA1,1,2;GET MINIMUM VALUE FOR THIS FIELD 00523'045000 STA1,0,2;STORE IT IN CURRENT 00524'024453 LDA1,TABINC;MOVE TO NEXT FIELD 00525'133000 ADD1,2 00526'000762 JMPINCLP 00527'024433 ENCODE:LDA1,SECTOR 00530'125020 MOVZ1,1;FORCE A ZERO CARRY 00531'125120 MOVZL1,1 00532'125120 MOVZL1,1 00533'125120 MOVZL1,1 00534'125120 MOVZL1,1 00535'125120 MOVZL1,1 00536'125120 MOVZL1,1 00537'125120 MOVZL1,1 00540'125120 MOVZL1,1 00541'125120 MOVZL1,1 00542'030431 LDA2,CYL 00543'147000 ADD2,1 00544'125120 MOVZL1,1 00545'030420 LDA2,HEAD 00546'147000 ADD2,1 00547'125120 MOVZL1,1 00550'030420 LDA2,DSKNO 00551'147000 ADD2,1 00552'125120 MOVZL1,1 0010 ALTKDGfs bAq a _ ^ ]M2 \4 Z9 Y XY W U T Se R("  P O Nq M4 K J I} H@ G E D" & CL B @ ?( >X = ; : 9d$ 8' 6"  5 4p 33 1 0 /| .? - + * )K ( & % $W # !  c &   o 2  6N13 00553'044001-STA1,CODAD 00554'034404 LDA3,R3T 00555'001401 JMP1,3 00556'034402 OFFEND:LDA3,R3T 00557'001400 JMP0,3 00560'000000 R3T:0 00561'000562'TABMIN:SECTOR 00562'000000 SECTOR:0 00563'000000 0 00564'000013 13 00565'000000 HEAD:0 00566'000000 0 00567'000001 1 00570'000000 DSKNO:0 00571'000000 0 00572'000000 0 00573'000000 CYL:0 00574'000100 100;DON'T WIPE OUT THE BOOT AREA 00575'000312 312 00576'000576'TABMAX:. 00577'000003 TABINC:3 00600'000001 C1:1 ; ;REGARDLESS OF THE FINAL STATUS, GIVE A SKIP RETURN ; 00601'001401 NOERR:JMP1,3 ; ;CHECK THAT THE COMMAND COMPLETED CORRECTLY. ; 00602'025001 CKDERR:LDA1,STATUS,2;GET THE FINISHING STATUS 00603'020411 LDA0,ERMSK 00604'107415 AND#0,1,SNR 00605'001401 JMP1,3;CORRECT RETURN 00606'054405 STA 3 CKDRET 00607'006000-JSR@ PMSG 00610'001616'CDER 00611'062000 ERROR 00612'002401 JMP@ CKDRET 00613'000000 CKDRET:0 00614'000277 ERMSK:277 ; ;COMPARE THE RECORD READ WITH THE ONE ORIGINALLY WRITTEN ; 00615'054427 CDAT:STA3,R3C 00616'004764 JSRCKDERR;CHECK THE STATUS 0011 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ?2 >X = ; : 9d 8' 6+ 5 4p 33 ' 1 0 /| .? - + * )K ( & % $W # !  c &7   o 2  7Nf14 00617'002425 JMP@R3C;IF ERROR 00620'050422 STA2,R2C 00621'021005 LDA0,HDRWD,2 00622'024421 LDA1,IHDR1 00623'106414 SUB#0,1,SZR;CHECK THAT SUBSTITUTION REALLY WORKS 00624'000406 JMPLNOTEQ 00625'006422 JSR@ARTST;COMPARE THE RANDOM DATA 00626'000411 JMPNOTEQ;IF ERROR 00627'030413 LDA2,R2C;COMPARE IS OK 00630'034414 LDA3,R3C 00631'001401 JMP1,3 00632'061000 LNOTEQ:DIR 00633'006000-JSR@ PMSG 00634'001641'LFAIL 00635'061001 EIR 00636'062000 ERROR 00637'030403 NOTEQ:LDA2,R2C 00640'034404 LDA3,R3C 00641'001400 JMP0,3 00642'000000 R2C:0 00643'171717 IHDR1:171717 00644'000000 R3C:0 00645'000010 C8:10 00646'000400 C256:400 00647'000732'ARTST:RTST ; ;RANDOM DATA GENERATOR -- GENERATES INTO LAB AND DAT ; 00650'054447 RGEN:STA3,R3RG 00651'050447 STA2,R2RG 00652'024440 LDA1,DWDMX 00653'044440 STA1,DWDCT 00654'031003 LDA2,LABEL,2;R2 POINTED TO THE DCB 00655'034444 LDA3,APRO 00656'024436 LDA1,PRMX;COPY THE STARTUP PARAMETERS TO THE 00657'044436 STA1,PRCT;LABEL BLOCK 00660'025400 RGLPO:LDA1,0,3 00661'045000 STA1,0,2 00662'151400 INC2,2 00663'175400 INC3,3 00664'014431 DSZPRCT 00665'000773 JMPRGLPO 00666'030432 LDA2,R2RG 00667'031004 LDA2,DATA,2;ADDRESS OF DATA BLOCK 00670'102400 SUB0,0 00671'024423 RGLP:LDA1,PRMX 00672'044423 STA1,PRCT 00673'034426 LDA3,APRO 00674'025400 RGLPA:LDA1,0,3 00675'123000 ADD1,0 0012 ALTKDGfs bAq a _ ^ ]M$ \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ? >X = ;3 : 9d 8' 6 5 4p "  33 1" 0 /| .? - + * )K ( & % $W"  # !  c &   o 2 < 5N15 00676'041400 STA0,0,3 00677'041000 STA0,0,2 00700'014413 DSZDWDCT 00701'151401 INC2,2,SKP 00702'000405 JMPRGOK 00703'014412 DSZPRCT 00704'175401 INC3,3,SKP 00705'000764 JMPRGLP 00706'000766 JMPRGLPA 00707'034410 RGOK:LDA3,R3RG 00710'030410 LDA2,R2RG 00711'001401 JMP1,3 00712'000400 DWDMX:400 00713'000000 DWDCT:0 00714'000010 PRMX:10 00715'000000 PRCT:0 00716'000000 RBEGAD:0 00717'000000 R3RG:0 00720'000000 R2RG:0 00721'000722'APRO:PRO 00722'177777 PRO:177777 00723'166666 166666 00724'155555 155555 00725'144444 144444 00726'133333 133333 00727'122222 122222 00730'111111 111111 00731'100000 100000 ; ;RANDOM DATA TEST ROUTINE ; 00732'054765 RTST:STA3,R3RG 00733'050765 STA2,R2RG 00734'024756 LDA1,DWDMX 00735'044756 STA1,DWDCT 00736'025003 LDA1,LABEL,2 00737'044757 STA1,RBEGAD 00740'031004 LDA2,DATA,2 00741'102400 SUB0,0 00742'024752 RTLP:LDA1,PRMX 00743'044752 STA1,PRCT 00744'034752 LDA3,RBEGAD 00745'025400 RTLPA:LDA1,0,3 00746'123000 ADD1,0 00747'041400 STA0,0,3 00750'025000 LDA1,0,2 00751'106414 SUB#0,1,SZR 00752'000410 JMPRTERR 00753'014740 DSZDWDCT 00754'151401 INC2,2,SKP 00755'000415 JMPRTOK 00756'014737 DSZPRCT 00757'175401 INC3,3,SKP 0013 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p 33 1 0 /| .? - + * )K ( & % $W # !  c &   o 2 z N16 00760'000762 JMPRTLP 00761'000764 JMPRTLPA 00762'061000 RTERR:DIR 00763'006000-JSR@ PMSG 00764'001664'DATF 00765'061001 EIR 00766'062000 ERROR 00767'034730 LDA3,R3RG 00770'030730 LDA2,R2RG 00771'001400 JMP0,3 00772'034725 RTOK:LDA3,R3RG 00773'030725 LDA2,R2RG 00774'001401 JMP1,3 ; ;THIS ROUTINE SETS UP DISK DATA AND CONTROL BLOCKS 00775'054434 SUDB:STA3,R3SUD 00776'020434 LDA 0 NBUFS 00777'100400 NEG0,0 01000'176400 SUB3,3;SET UP ZERO LINK FOR FIRST BLOCK 01001'030432 LDA2 FIRBUF 01002'055000 SULP:STA3,POINTER,2;SET STACK LINK 01003'034431 LDA3,HDRDIS 01004'157000 ADD2,3 01005'055011 STA3,HEADER,2;SET HEADER LINK 01006'034427 LDA3,DCBLEN 01007'157000 ADD2,3 01010'055003 STA3,LABEL,2;SET LABEL LINK 01011'034425 LDA3,DLLEN 01012'157000 ADD2,3 01013'055004 STA3,DATA,2;SET DATA LINK 01014'034424 LDA3,CS2;SUCCESS INTERRUPT 01015'055007 STA3,SUCCESS,2 01016'034423 LDA3,CS4;FAILURE INTERRUPT 01017'055010 STA3,FAILURE,2 01020'155000 MOV2,3;CURRENT BLOCK BECOMES OLD BLOCK 01021'030416 LDA2,BLKLEN;LENGTH OF A BLOCK 01022'173000 ADD3,2;ADDRESS OF NEW BLOCK 01023'101404 INC0,0,SZR;DONE ENOUGH BLOCKS YET? 01024'000756 JMPSULP;NO 01025'054005-STA3,AS;SET UP THE AVAILABLE STACK 01026'040006-STA0,KQF;THE DISK QUEUE IS EMPTY 01027'034402 LDA3,R3SUD 01030'001401 JMP1,3 01031'000000 R3SUD:0 01032'000000 NBUFS:0 01033'000000 FIRBUF:0 01034'000005 HDRDIS:HDRWD-POINTER 01035'000015 DCBLEN:DCBEND-POINTER 01036'000025 DLLEN:DCBEND-POINTER+10 01037'000425 BLKLEN:DCBEND-POINTER+10+400 01040'000002 CS2:2 01041'000004 CS4:4 0014 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K1 J I} H@ G E D CL B ){ @ ? >X $ = ; : " 9d 8' 6" 5 4p 33 1 0 /|"  .? - + * )K ( & % $W # !  c &   o 2  1FN17 ; ;SET UP AND ENABLE INTERRUPTS ; 01042'054450 SUINT:STA3,R3SU 01043'034455 LDA3,ATRVEC;INITIALIZE TRAP VECTOR TO 01044'020453 LDA0,CS40;JMP@ TRPC 01045'040455 STA0,ISUCNT 01046'020453 LDA0,ARETROU 01047'041400 TSULP:STA0,0,3 01050'175400 INC3,3 01051'014451 DSZISUCNT 01052'000775 JMPTSULP 01053'034004-LDA3,KBLKADR 01054'020440 LDA0,CS10;TURN ON DISK SECTOR INTERRUPTS 01055'041403 STA0,3,3 01056'020451 LDA0,ABADINT 01057'034014-LDA3,INTVEC 01060'024435 LDA1,NBADI 01061'044441 STA1,ISUCNT 01062'024431 LDA1,CY1 01063'030433 LDA2,DBUGAD;DON'T MESS WITH THE DEBUGGER'S INT 01064'156414 ISULP:SUB#2,3,SZR;SKIP OVER DEBUGGER INTERRUPT 01065'041400 STA0,0,3;INITIALLY MARK ALL INTERRUPTS AS BAD 01066'175400 INC3,3 01067'122400 SUB1,0;THIS LETS US FIND OUT WHICH INTERRUPT 01070'014432 DSZISUCNT 01071'000773 JMPISULP 01072'034014-LDA3,INTVEC;NOW FILL IN THE GOOD INTERRUPTS 01073'020430 LDA0,ASIR;THE SECTOR INTERRUPT ROUTINE 01074'041403 STA0,3,3 01075'020427 LDA0,AXER;TRANSFER ERROR ROUTINE 01076'041402 STA0,2,3 01077'020426 LDA0,AXNER;TRANSFER NO-ERROR ROUTINE 01100'041401 STA0,1,3 01101'034013-LDA3,WWLOC;ENABLE ALL INTERRUPTS 01102'102400 SUB0,0 01103'041401 STA0,1,3;MASK OFF ALL INTERRUPTS 01104'061001 EIR 01105'041400 STA0,0,3;WIPE OUT PENDING INTERRUPTS 01106'020420 LDA0,ALLINTS 01107'041401 STA0,1,3;UNMASK ALL INTERRUPTS 01110'034402 LDA3,R3SU 01111'001401 JMP1,3 01112'000000 R3SU:0 01113'000001 CY1:1 01114'000010 CS10:10 01115'000020 NBADI:20;NUMBER OF INTERRUPTS 01116'000517 DBUGAD:IVCON+16;DEBUGGER'S INTERRUPT 01117'000040 CS40:40 01120'000530 ATRVEC:TRPVEC 01121'001466'ARETROU: RETROU 01122'000000 ISUCNT:0 01123'001263'ASIR:SIR 01124'001350'AXER:XER 01125'001267'AXNER:XNER 0015 ALTKDGfs bAq a _ ^ ]M"  \"  Z Y XY W U T Se R( P O Nq M4 K J I}" " H@$ G" $ E D% CL B @"  ?"  >X ="  ; :"  9d 8' 6"  5 4p"  33 1"  0 /|"  .? - + * )K ( & % $W #$ !  c &   o 2  1SN18 01126'177777 ALLINTS: 177777 01127'001150'ABADINT: BADINT ; ;BAD INTERRUPT. THIS SHOULDN'T HAPPEN. ; 01130'010522 ISZWHY 01131'010521 ISZWHY 01132'010520 ISZWHY 01133'010517 ISZWHY 01134'010516 ISZWHY 01135'010515 ISZWHY 01136'010514 ISZWHY 01137'010513 ISZWHY 01140'010512 ISZWHY 01141'010511 ISZWHY 01142'010510 ISZWHY 01143'010507 ISZWHY 01144'010506 ISZWHY 01145'010505 ISZWHY 01146'010504 ISZWHY 01147'010503 ISZWHY 01150'054574 BADINT:STA3,R3XX 01151'006401 JSR@.+1 01152'001376'IREE 01153'020477 LDA0,WHY;IS THIS A PARITY INTERRUPT? 01154'101014 MOV#0,0,SZR 01155'000463 JMPNONPAR 01156'022475 PARITY:LDA@0,.DSPL;SAVE THE DISPLAY POINTER 01157'040475 STA0,ODSPL 01160'102400 SUB0,0;TURN OFF THE DISPLAY 01161'042472 STA@0,.DSPL 01162'020475 LDA0,BIGNO;WAIT FOR DISPLAY TO QUIESCE 01163'040475 STA0,DLY 01164'014474 DSZDLY 01165'000777 JMP.-1 01166'022004-LDA@0,KBLKADR;WAIT FOR THE DISK TO STOP 01167'101014 MOV#0,0,SZR 01170'000776 JMP.-2 01171'061000 DIR;TURN OFF PARITY BIT IN WW 01172'022464 LDA@0,.WW 01173'024462 LDA1,PARCON 01174'124000 COM1,1 01175'123400 AND1,0 01176'042460 STA@0,.WW 01177'061001 EIR 01200'152400 SUB2,2;SET UP FOR A MEMORY PASS TO LOOK FOR PARITY 01201'050461 STA2,NFND;NUMBER OF ERRORS FOUND ON THIS PASS 01202'020457 LDA0,LIMIT 01203'040455 STA0,DLY 01204'021000 PARLP:LDA0,0,2;PICK UP A WORD 0016 ALTKDGfs bAq a _ ^ ]M \% Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ? >X =$ ; : 9d 8' 6 5"  4p 33 1 0 /| $ .? - + * )K ( & % $W # ! + c$# &   o' 2 P 4HN19 01205'101000 MOV 0 0;GIVE THE INTERRUPT TIME TO TRY TO HAPPEN 01206'026450 LDA 1 @.WW 01207'125212 MOVR# 1 1 SZC 01210'000416 JMPFNDIT;YES .. AC2 POINTS TO THE CULPRIT 01211'151400 PARNX:INC2,2;NO .. TRY NEXT WORD 01212'014446 DSZDLY 01213'000771 JMPPARLP 01214'020440 LDA0,ODSPL;START UP THE DISPLAY AGAIN 01215'042436 STA@0,.DSPL 01216'020444 LDA0,NFND;IF AT LEAST ONE ERROR WAS FOUND, IT 01217'101004 MOV0,0,SZR;WAS NOT A PHANTOM 01220'000424 JMPREINT 01221'061000 DIR 01222'006000-JSR@ PMSG 01223'001701'NOPE 01224'062000 ERROR;PARITY ERROR, NO BAD WORD FOUND 01225'000417 JMPREINT 01226'010434 FNDIT:ISZNFND;WE FOUND ANOTHER ERROR 01227'061000 DIR 01230'006000-JSR@ PMSG 01231'001717'REALP 01232'062000 ERROR;PARITY ERROR AC2 POINTS TO BAD WORD, AC0 HAS DATA READ 01233'022423 LDA 0 @.WW;TURN OFF THE P.E. BIT IN WW 01234'101200 MOVR 0 0 01235'101120 MOVZL 0 0 01236'042420 STA 0 @.WW 01237'000752 JMPPARNX;TRY FOR ANOTHER BAD WORD 01240'061000 NONPAR:DIR 01241'006000-JSR@ PMSG 01242'001735'XXI 01243'062000 ERROR;UNEXPECTED INTERRUPT, NOT PARITY 01244'010406 REINT:ISZWHY;MAKE SURE WHY IS POSITIVE 01245'014405 DSZWHY 01246'000777 JMP.-1 01247'034475 LDA3,R3XX 01250'002401 JMP@.+1 01251'001425'IRET 01252'000000 WHY:0 01253'000420 .DSPL:420 01254'000000 ODSPL:0 01255'000001 PARCON:1 01256'000452 .WW:452 01257'177777 BIGNO:177777 01260'000000 DLY:0 01261'137777 LIMIT:137777 01262'000000 NFND:0;NUMBER OF ERRORS FOUND ON THIS PASS ; ;SECTOR INTERRUPT ROUTINE. ADD ONE TO SECTOR COUNTER AND 0017 ALTKDGfs bAq) a _ ^ ]M \ Z Y XY W"  U T Se$# R( P O Nq M4 K J I} H@ G E"  D CL B @7 ?  >X = ; : 9d 8' 6 5 4p 33 1 0"  /| .? - + * )K ( & % $W # !  c &#   o7 2  :N20 ;RETURN. ; 01263'010403 SIR:ISZSECTCNT 01264'101010 MOV#0,0;NOP 01265'061002 BRI 01266'000000 SECTCNT: 0 ; ;TRANSFER NO-ERROR ROUTINE ; 01267'054455 XNER:STA3,R3XX 01270'006401 JSR@.+1 01271'001376'IREE 01272'030007-LDA2,KQM 01273'021001 LDA0,STATUS,2;PICK UP THE DCB'S STATUS 01274'024451 LDA1,CX7677 01275'123400 AND1,0 01276'024450 LDA1,CX7400 01277'106415 SUB#0,1,SNR 01300'000404 JMP .+4 01301'006000-JSR@ PMSG 01302'001753'WRSTAT 01303'062000 ERROR;ERROR STATUS OR NO STATUS 01304'024443 LDA1,CX1;NEW INTERRUPT PROCESSED WORD 01305'021013 XCOM:LDA0,INTSDONE,2;GET OLD INTERRUPT PROCESSED WORD 01306'101015 MOV#0,0,SNR;SHOULD BE 0 01307'000404 JMP .+4 01310'006000-JSR@ PMSG 01311'002001'IAP 01312'062000 ERROR;ALREADY PROCESSED BY INTERRUPT 01313'045013 STA1,INTSDONE,2;STORE NEW VALUE 01314'031000 LDA2,POINTER,2;MOVE TO NEXT COMMAND BLOCK 01315'050007-STA2,KQM 01316'151015 MOV#2,2,SNR;CHECK FOR NULL LINK 01317'000422 JMPXRET 01320'021001 LDA0,STATUS,2;GET THE STATUS OF THE OPERATION 01321'101015 MOV#0,0,SNR 01322'000417 JMPXRET;NOT YET FINISHED 01323'024422 LDA1,CX7677;ENSURE THAT THE INTERRUPT HAPPENS 01324'123400 AND1,0 01325'024421 LDA1,CX7400 01326'106414 SUB#0,1,SZR 01327'000403 JMPXER1 01330'021007 LDA0,SUCCESS,2;GET NO-ERROR INTERRUPT WORD 01331'000402 JMPXSHR 01332'021010 XER1:LDA0,FAILURE,2;GET ERROR INTERRRUPT WORD 01333'026013-XSHR:LDA@1,WWLOC;OR THE INTERRUPT WORD INTO WW 01334'111000 MOV0,2 01335'133400 AND1,2 01336'146400 SUB2,1 01337'123000 ADD1,0 01340'042013-STA@0,WWLOC 01341'034403 XRET:LDA3,R3XX 01342'002401 JMP@.+1 01343'001425'IRET 0018 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 "  K J I} H@ G E D CL B @ ){ ? >X = ; : 9d $ 8' $ 6 5 4p 33 "  1 0 /|" ! .? - + * )K $ ( & ){ %' $W # !  c &   o 2 * 6N21 01344'000000 R3XX:0 01345'007677 CX7677:7677 01346'007400 CX7400:7400 01347'000001 CX1:1 ; ;TRANSFER ERROR INTERRUPT ROUTINE ; 01350'054774 XER:STA3,R3XX 01351'006401 JSR@.+1 01352'001376'IREE 01353'030007-LDA2,KQM 01354'021001 LDA0,STATUS,2;GET THIS DCB'S STATUS 01355'024770 LDA1,CX7677 01356'123400 AND1,0 01357'024767 LDA1,CX7400 01360'106414 SUB#0,1,SZR 01361'000404 JMP .+4 01362'006000-JSR@ PMSG 01363'002022'NESE 01364'062000 ERROR;STATUS IS NO ERROR 01365'123400 AND1,0 01366'122415 SUB#1,0,SNR 01367'000404 JMP .+4 01370'006000-JSR@ PMSG 01371'002050'NSSE 01372'062000 ERROR;NO STATUS STORED 01373'024402 LDA1,CX2 01374'000711 JMPXCOM 01375'000002 CX2:2 ; ;REENABLE DEBUGGER INTERRUPT AND SAVE STATE ; 01376'040421 IREE:STA0,R0X 01377'044421 STA1,R1X 01400'050421 STA2,R2X 01401'022414 LDA 0 @TPCP;SAVE TRAP PC IN CASE WE WERE INTERRUPTED OUT OF ATRAP 01402'040414 STA 0 OTPC 01403'030013-LDA2,WWLOC 01404'021001 LDA0,1,2;SAVE CURRENT INTERRUPT MASK 01405'040415 STA0,CMASK 01406'020415 LDA0,DBMSK 01407'041001 STA0,1,2;SET NEW MASK FOR ONLY DEBUGGER 01410'030014-LDA2,INTVEC 01411'021377 LDA0,-1,2;SAVE INTERRUPT OLD PC 01412'040412 STA0,OLDPC 01413'061001 EIR 01414'001401 JMP1,3 01415'000527 TPCP:527 01416'000000 OTPC:0 01417'000000 R0X:0 0019 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P "  O Nq M4 K J I} H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p* 33 1 0 /| .? 2 - + * )K"  ( & %"  $W #"  !  c &   o 2  ( 9P822 01420'000000 R1X:0 01421'000000 R2X:0 01422'000000 CMASK:0 01423'040000 DBMSK:40000;THE DEBUGGER INTERRUPT ONLY 01424'000000 OLDPC:0 ; ;REENABLE ALL INTERRUPTS AND RETURN CONTROL TO INTERRUPTEDSTUFF ; 01425'061000 IRET:DIR 01426'020770 LDA 0 OTPC 01427'042766 STA 0 @TPCP 01430'030013-LDA2,WWLOC 01431'020771 LDA0,CMASK 01432'041001 STA0,1,2;RESTORE ORIGINAL MASK 01433'030014-LDA2,INTVEC 01434'020770 LDA0,OLDPC 01435'041377 STA0,-1,2;RESTORE OLD PC 01436'020761 LDA0,R0X 01437'024761 LDA1,R1X;RESTORE REGISTERS 01440'030761 LDA2,R2X 01441'061002 BRI ; ;THIS ROUTINE VERIFIES THAT AN INTERRUPT WAS PROCESSED FOR ;THIS DCB AND THAT ITS TYPE WAS CONSISTENT WITH THE ;STATUS ENTERED IN THE DCB. ; 01442'054423 CKINT:STA3,R3CKS 01443'021001 LDA0,STATUS,2;GET THE DCB'S STATUS WORD 01444'024701 LDA1,CX7677 01445'123400 AND1,0 01446'024700 LDA1,CX7400 01447'106414 SUB#0,1,SZR 01450'000413 JMPCKIER 01451'024676 LDA1,CX1;PROPER INTERRUPT TYPE FOR NO ERROR 01452'021013 CKINCOM: LDA0,INTSDONE,2;ACTUAL TYPE 01453'106415 SUB#0,1,SNR 01454'000405 JMP .+5 01455'061000 DIR 01456'006000-JSR@ PMSG 01457'002073'WINT 01460'062000 ERROR;WRONG TYPE OR NO TYPE 01461'034404 LDA3,R3CKS 01462'001401 JMP1,3 01463'024712 CKIER:LDA1,CX2;PROPER INTERRUPT TYPE FOR ERROR 01464'000766 JMPCKINCOM 01465'000000 R3CKS:0 ; ;RETURN FROM TRAP ROUTINE 0020 ALTKDGfs bAq a _ ^ ]M \ Z9 Y XY W U T Se R( P"  O Nq M4" K J"  I} H@ G E D CL B @9 ?2 >X = ; : "  9d 8' 6 5 4p 33" 1 ){ 0 /| .? - + * )K ( & %$ $W # !  c &   o 2   9P823 ; 01466'054407 RETROU:STA3,R3RU 01467'036407 LDA@3,ATRPC 01470'054407 STA3,LOCPC 01471'002401 JMP@.+1;JUMP TO BREAKPOINTED INSTRUCTION 01472'000001'BREAK 01473'034402 RR2:LDA3,R3RU 01474'002403 JMP@LOCPC 01475'000000 R3RU:0 01476'000527 ATRPC:TRPC 01477'000000 LOCPC:0 ;SIZE AND PARCEL OUT MEMORY. IF THERE IS SPACE BETWEEN 1000 ;AND THE BOTTOM OF THE PROGRAM, WE USE IT FOR DISK BUFFERS 01500'054453 SIZEM:STA 3 SIZRET 01501'030455 LDA 2 EOM;SIZE THE MEMORY 01502'126520 SUBZL 1 1 01503'045001 SIZEL:STA 1 1 2 01504'021001 LDA 0 1 2 01505'132400 SUB 1 2 01506'122404 SUB 1 0 SZR 01507'000774 JMP SIZEL 01510'052447 STA 2 @PLIM 01511'020443 LDA 0 SOMEM;START OF MEMORY 01512'024443 LDA 1 SOP;START OF PROGRAM 01513'106414 SUB# 0 1 SZR 01514'000403 JMP SIZED ;OTHERWISE, WE USE SPACE FROM THE END OF THE DEBUGGER TO THE ENDOF ;CORE 01515'145000 MOV 2 1 01516'020442 LDA 0 EOP 01517'042442 SIZED:STA 0 @PBUFS;AC0 CONTAINS THE START OF THE BUFFERS,AC1 THEEND 01520'042442 STA 0 @DBMS 01521'036442 LDA@ 3 BUFSZ 01522'152401 SUB 2 2 SKP 01523'151400 BUFL:INC 2 2 01524'163000 ADD 3 0 01525'106032 ADCZ# 0 1 SZC;SKGE 01526'000775 JMP BUFL 01527'052435 STA 2 @NBP;AC2 = NUMBER OF BUFFERS WHICH WILL FIT IN THE GIVENAREA ;NOW WE GO THROUGH MEMORY AND CORRECT PARITY 01530'061001 EIR 01531'102400 SUB 0 0 01532'042420 STA 0 @UGHX;CLEAR NWW 01533'036424 LDA 3 @PLIM 01534'152520 SUBZL 2 2 01535'021400 PQLP:LDA 0 0 3 01536'041400 STA 0 0 3 01537'025400 LDA 1 0 3 01540'106414 SUB# 0 1 SZR 01541'000401 JMP .+1 01542'026410 LDA 1 @UGHX;CHECK FOR ERROR 01543'125213 MOVR# 1 1 SNC 01544'000402 JMP .+2 01545'000401 JMP .+1;BREAK HERE TO GET THE BAD NEWS 0021 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O< Nq: M4 K J I} H@ G E D CL B  @ ? >X =@ ; : 9d 8' 6 $. 5 4p 33 1 0 /| .?  - + 4 * )K (, & % $W  # !  c &   o  2   { x X;PR~24 01546'156404 SUB 2 3 SZR 01547'000766 JMP PQLP 01550'034403 LDA 3 SIZRET 01551'001401 JMP 1 3 01552'000452 UGHX:452 01553'000000 SIZRET:0 01554'001000 SOMEM:1000 01555'000000'SOP:INIT 01556'176777 EOM:176777 01557'001261'PLIM:LIMIT;TOP OF MEMORY FOR PARITY SCAN 01560'177777 EOP:PHIAD 01561'001033'PBUFS:FIRBUF 01562'000010'DBMS:DBMP 01563'001037'BUFSZ:BLKLEN 01564'001032'NBP:NBUFS ; ;CLEAR THE STATUS AND INTERRUPTS DONE FIELDS ;IF THE LABEL BLOCK IS TO BE CHECKED, CLEAR IT FIRST ; 01565'054424 SETLAB:STA3,R3SET 01566'102400 SUB0,0 01567'041001 STA0,STATUS,2;CLEAR DCB'S STATUS 01570'041013 STA0,INTSDONE,2;AND INTERRUPTS PROCESSED 01571'021002 LDA0,DSKCOMM,2 01572'024420 LDA1,CKLM 01573'123400 AND1,0 01574'024417 LDA1,CKLV 01575'106414 SUB#0,1,SZR 01576'000411 JMPESETLAB;NOT CHECKING THE LABEL 01577'020415 LDA0,SL10;LENGTH OF THE LABEL BLOCK 01600'040415 STA0,SLCNT 01601'035003 LDA3,LABEL,2 01602'102400 SUB0,0 01603'041400 SETLLP:STA0,0,3;CLEAR A WORD 01604'175400 INC3,3 01605'014410 DSZSLCNT 01606'000775 JMPSETLLP 01607'034402 ESETLAB: LDA3,R3SET 01610'001401 JMP1,3 01611'000000 R3SET:0 01612'000060 CKLM:60;MASKS ONLY LABEL PART OF COMMAND 01613'000020 CKLV:20;VALUE OF LABEL FIELD IF CHECKING 01614'000010 SL10:10;LENGTH OF LABEL BLOCK 01615'000000 SLCNT:0 CDER:.TXT/ CONTROLLER REPORTED BAD STATUS<15>/ 01616'020040 0022 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K+ J3 I} H@ G E D CL "  B $ @ ? >X = ; : 9d"  8' 6 5 4p 33 1 0 /|$ .? - + * )K ( & % $W # !  c &  ) o 2  2N25 01617'020040 01620'020103 01621'047516 01622'052122 01623'047514 01624'046105 01625'051040 01626'051105 01627'050117 01630'051124 01631'042504 01632'020102 01633'040504 01634'020123 01635'052101 01636'052125 01637'051415 01640'000000 LFAIL:.TXT/ LABEL BLOCK SUBSTITUTION FAILED<15>/ 01641'020040 01642'020040 01643'020114 01644'040502 01645'042514 01646'020102 01647'046117 01650'041513 01651'020123 01652'052502 01653'051524 01654'044524 01655'052524 01656'044517 01657'047040 01660'043101 01661'044514 01662'042504 01663'006400 DATF:.TXT/ DATA COMPARE FAILED<15>/ 01664'020040 01665'020040 01666'020104 01667'040524 01670'040440 01671'041517 01672'046520 01673'040522 01674'042440 01675'043101 01676'044514 01677'042504 01700'006400 NOPE:.TXT/ PHANTOM PARITY ERROR<15>/ 01701'020040 01702'020040 01703'020120 01704'044101 01705'047124 01706'047515 0023 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K* J I} H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p 33 1 0 /| .? - + * )K ( & % $W # !  c &   o 2  1vN26 01707'020120 01710'040522 01711'044524 01712'054440 01713'042522 01714'051117 01715'051015 01716'000000 REALP:.TXT/ PARITY ERROR DETECTED<15>/ 01717'020040 01720'020040 01721'020120 01722'040522 01723'044524 01724'054440 01725'042522 01726'051117 01727'051040 01730'042105 01731'052105 01732'041524 01733'042504 01734'006400 XXI:.TXT/ UNEXPECTED INTERRUPT<15>/ 01735'020040 01736'020040 01737'020125 01740'047105 01741'054120 01742'042503 01743'052105 01744'042040 01745'044516 01746'052105 01747'051122 01750'052520 01751'052015 01752'000000 WRSTAT:.TXT/ NO-ERROR INTERRUPT GAVE WRONG STATUS<15>/ 01753'020040 01754'020040 01755'020116 01756'047455 01757'042522 01760'051117 01761'051040 01762'044516 01763'052105 01764'051122 01765'052520 01766'052040 01767'043501 01770'053105 01771'020127 01772'051117 01773'047107 01774'020123 01775'052101 01776'052125 0024 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p 33" / 1 0 /| .? - + * )K ( & % $W # !  c &   o 2  9N27 01777'051415 02000'000000 IAP:.TXT/ INTERRUPT ALREADY PROCESSED<15>/ 02001'020040 02002'020040 02003'020111 02004'047124 02005'042522 02006'051125 02007'050124 02010'020101 02011'046122 02012'042501 02013'042131 02014'020120 02015'051117 02016'041505 02017'051523 02020'042504 02021'006400 NESE:.TXT/ NO-ERROR STATUS FROM ERROR INTERRUPT<15>/ 02022'020040 02023'020040 02024'020116 02025'047455 02026'042522 02027'051117 02030'051040 02031'051524 02032'040524 02033'052523 02034'020106 02035'051117 02036'046440 02037'042522 02040'051117 02041'051040 02042'044516 02043'052105 02044'051122 02045'052520 02046'052015 02047'000000 NSSE:.TXT/ NO STATUS FROM ERROR INTERRUPT<15>/ 02050'020040 02051'020040 02052'020116 02053'047440 02054'051524 02055'040524 02056'052523 02057'020106 02060'051117 02061'046440 02062'042522 02063'051117 02064'051040 02065'044516 02066'052105 0025 ALTKDGfs bAq a _& ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K J I}/ H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p 33 1 0 /| .? -) + * )K ( & % $W # !  c &   o 2  6N28 02067'051122 02070'052520 02071'052015 02072'000000 WINT:.TXT/ WRONG INTERRUPT TYPE FOR ERROR<15>/ 02073'020040 02074'020040 02075'020127 02076'051117 02077'047107 02100'020111 02101'047124 02102'042522 02103'051125 02104'050124 02105'020124 02106'054520 02107'042440 02110'043117 02111'051040 02112'042522 02113'051117 02114'051015 02115'000000 HARDERR: .TXT/ SOFT ERROR HAS HARDENED<15>/ 02116'020040 02117'020040 02120'020123 02121'047506 02122'052040 02123'042522 02124'051117 02125'051040 02126'044101 02127'051440 02130'044101 02131'051104 02132'042516 02133'042504 02134'006400 NEWER:.TXT/ NEW ERROR STATUS NOTICED<15>/ 02135'020040 02136'020040 02137'020116 02140'042527 02141'020105 02142'051122 02143'047522 02144'020123 02145'052101 02146'052125 02147'051440 02150'047117 02151'052111 02152'041505 02153'042015 02154'000000 .END 0026 ALTKDGfs bAq a _ ^ ]M) \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D " " CL B @ ? >X = ; : 9d 8' 6 5 4p 33 1 0" # /| .? - + * )K ( & % $W # !  c &   o  L2YM29AAUGH000207'ABADI001127'ACDAT000100'AGAIN000317'ALLIN001126'ALLON000047'ANOER000061'APRO000721'ARETR001121'ARGEN000113'ARTST000647'AS000005-ASIR001123'ATRPC001476'ATRVE001120'AXER001124'AXNER001125'BADIN001150'BIGNO001257'BLKLE001037'BREAK000001'BRI061002BUFL001523'BUFSZ001563'C1000600'C256000646'C8000645'CARRY000522'CDAT000615'CDER001616'CHRR000077'CKDER000602'CKDRE000613'CKIER001463'CKINC001452'CKINT001442'CKLM001612'CKLV001613'CMASK001422'CODAD000001-CPTR000002-CS10001114'CS2001040'CS4001041'CS40001117'CX1001347'CX2001375'CX740001346'CX767001345'CY1001113'CYL000573'DASCO000420DASTA000003-DATA000004DATF001664'DB000006'DBLKA000052'DBMP000010'DBMS001562' 0027 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T2 Se R( P O Nq M4 K J I} H@2 G E D2 CL B2 @ ? >X = ; : 9d 8' 6 5 4p 33 1 0 /| .?2 -2 + * )K ( & % $W # !  c &2   o 2   VNZ30DBMSK001423'DBUGA001116'DCBEN000015DCBLE001035'DIR061000DLLEN001036'DLY001260'DODCB000114'DSKAD000006DSKBI000353'DSKCO000002DSKNO000570'DWDCT000713'DWDMX000712'EFND000253'EIR061001ENCOD000527'EOM001556'EOP001560'EQCOM000440'EQDON000461'EQUE000414'ERMSK000614'ERROR062000ESETL001607'EXTRA000456'FAILU000010FINIS000012FIRBU001033'FIREL000441'FL1000465'FLDON000470'FLUSH000464'FNDIT001226'GC1000151'GCB000150'GETQE000165'GQ1000166'HARDE002116'HARDT000351'HARDY000256'HDRDI001034'HDRWD000005HEAD000565'HEADE000011HERRC000012-IAD000112'IAP002001'IDONE000102'IHDR000107'IHDR1000643'IMORE000035'INCAD000506'INCLP000510'INIT000000'INITA000013'INTSD000013INTVE000014-IREE001376' 0028 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R(( P O2 Nq M4 K J I} H@ G E D CL B @ ? >X =2 ; : 9d 8' 6 5 4p 33 1 0 /| .?( - + * )K (2 & % $W # !  c &   o 2   NZ31IRET001425'ISUCN001122'ISULP001064'IVCON000501KBCON000521KBLKA000004-KQF000006-KQM000007-KQR000010-LABEL000003LFAIL001641'LIMIT001261'LNOTE000632'LOCPC001477'LOOK000240'MESSA000000-XMINLP000476'MKDCB000124'MKDPA000147'MONE000355'NBADI001115'NBP001564'NBUFS001032'NESE002022'NEWER002135'NFND001262'NOERR000601'NOKCO000350'NONPA001240'NOPAD000110'NOPE001701'NOTEM000436'NOTEQ000637'NSSE002050'ODSPL001254'OFFEN000556'OKCON000347'OLDPC001424'OTPC001416'PARCO001255'PARIT001156'PARLP001204'PARNX001211'PBUFS001561'PHIAD001560'XPLIM001557'PMSG000000-POINT000000PQLP001535'PRCT000715'PRMX000714'PRO000722'PULLI000331'R0X001417'R1X001420'R2C000642'R2RG000720'R2X001421'R2ZAP000346' 0029 ALTKDGfs bAq a _ ^ ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p 33 1 0 /| .? - + * )K ( & % $W # !  c &   o 2   NZ32R3C000644'R3CKS001465'R3DOD000123'R3F000472'R3G000164'R3MKD000146'R3Q000344'R3RG000717'R3RU001475'R3SET001611'R3SL000345'R3SU001112'R3SUD001031'R3T000560'R3XX001344'RBEGA000716'RDBLK000072'RDIT000062'RDMOR000064'REALP001717'REDO000031'REINT001244'REMOV000335'RES000204'RESTA000326'RESTH000352'RETRO001466'RGEN000650'RGLP000671'RGLPA000674'RGLPO000660'RGOK000707'RKADR000413'RR2001473'RSNBO000356'RSNEN000377'RSNTO000400'RSTBI000354'RTERR000762'RTLP000742'RTLPA000745'RTOK000772'RTST000732'SDBAD000053'SECTC001266'SECTO000562'SERRC000011-SERRS000014SETLA001565'SETLL001603'SETMI000474'SIR001263'SIZED001517'SIZEL001503'SIZEM001500'SIZRE001553'SL10001614'SLCNT001615'SMAD000111' 0030 ALTKDGfs bAq a _ ^2 ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @ ? >X = ; : 9d 8' 6 5 4p 33 1 0 /| .? - + * )K ( & % $W #2 !  c &   o 2   VNZ33SMASH000104'SOFT000272'SOMEM001554'SOP001555'SRCHL000215'STATU000001STKEM000161'SUBST000101'SUCCE000007SUDB000775'SUINT001042'SULP001002'TABIN000577'TABMA000576'TABMI000561'TPCP001415'TRPC000527TRPVE000530TSULP001047'UGHX001552'VALID000463'WHY001252'WINT002073'WRSTA001753'WRTAL000106'WRTBL000054'WRTIT000033'WWCON000452WWLOC000013-XCOM001305'XER001350'XER1001332'XNER001267'XRET001341'XSHR001333'XXI001735'ZAPLP000320'.DSPL001253'.GETQ000473'.RBOT000050'.REST000401'.RR2000012'.RTOP000051'.WW001256'Gfs bAq a _ ^2 ]M \ Z Y XY W U T Se R( P O Nq M4 K J I} H@ G E D CL B @( ?( >X = ; : 9d 8' 62 5 4p 33 1 0 /| .? - +