File VEP210.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/VEP210 FLOPPY DISK EXORCISER  16-JUN-77
*631	/ GENERALIZED STATUS ACCUMULATION, HANDLER SPEEDUP.

/ START  ADDRESS IS 0200
/	TYPES ID, ASKS "DRIVE #'S"
/	OPERATOR SHOULD RESPOND WITH DESIRED DRIVE #'S  "012<CR>"

/RESTART ADDRESS IS 0201
/	TYPES LIST OF OPTIONS : "A, B, F, S, R, V OR D"
/ OPERATOR TYPES KEY LETTER TO SELECT DESIRED OPTION

/ (A)	ACCEPTANCE TEST - DOES SET-TEST ERROR FLAGS, (B)UFFER TEST
/		 (S)EQUENTIAL WRT/READ
/		 (R)ANDOM WRT/READ, AND (S)EQ READ ONLY-TESTS
/ (B)	BUFFER FILL-EMPTY TEST - FILLS, EMPTIES, CHECKS SECTOR BUF
/		CHECKS COMPUTER<=>CONTROLLER DATA PATH
/		TYPES "F E F8E8" BEFORE STARTING SUBTEST.
/ (S)	SEQUENTIAL WRITE/READ
/		TYPES "W" OR "R" BEFORE WRITE OR READ PASS BEGINS
/ (R)	RANDOM WRITE/READ
/		TYPES "*" TO INDICATE IN RANDOM MODE
/ (D)	SET UP DEVICE CODE(S)   USER TYPES IN 3 DIGIT DEVICE CODE
/		EX. FOR DEVICE 76 TYPE "760 " <SPACE TERMINATOR>
/		PROGRAM RETURNS WITH NEXT ENTRY, USER TYPES <CR>
/		FOR MULTIPLE SYSTEMS TYPE DESIRED CODES
/		AND TERMINATE WITH A CR TO DEVICE: 0
/		AFTER LAST DESIRED CODE.
/		THE LOW DIGIT TYPED E.G. 3 IN 753 OVERRIDES
/		THE INITIAL DRIVE # VALUES TYPED IN IF IT IS
/		NOT ZERO..  751= SINGLE DRIVE, 752 = DUAL DRIVE
/		AND 753 = 3 DRIVE.
/		TYPING SPACE ALLOWS EXAMINATION WITHOUT MODIFYING

/ (V)	VERIFY ALL SYSTEMS FUNCTIONAL.  DOES SHORT (A) THEN GOES
/		AND DOES A FULL LENGTH (A) ON ALL SELECTED UNITS.

/ (F)	FORMAT DISKETTE:  ASKS "FORMAT UNIT #:"
/		OPERATOR TYPES DESIRED DRIVE # AND <CR>.
/		ASKS "SEQUENTIAL FORMAT? "  RESPOND WITH "Y" FOR
/		STANDARD SEQUENTIAL FORMAT, "N" FOR 4 WAY INTER-
/		LEAVED FORMAT FOR SLOWER PROCESSORS.

/ (CTRL T)	TYPES TOTAL SYSTEM STATUS OF ALL SYSTEMS, DRIVES.

/ (W)		OPEN SOFTWARE SWITCH REGISTER FOR MODIFICATION.
/		ANY NON-ZERO VALUE ENTERED SUPERCEDES VALUE IN
/		FRONT PANEL SWITCHES.


/SWITCH 0 UP SUPPRESSES PRINTING OF ERROR MESSAGES

/SWITCH 1 UP SUPPRESSES USE OF INTERRUPT BY DRIVER.
/	ALSO DISABLES INTERRUPT RELATED ERROR CHECKS.

/SWITCH 2 UP SUPPRESSES PRINTING OF HARDWARE STATUS ERRORS
/SWITCH 5 UP INHIBITS CYCLING WHEN MULTIPLE SYSTEMS ARE SELECTED
/	USING "D. THE PROGRAM IS THEN FROZEN AT THE CURRENT DEVICE
/SWITCH 8 UP USES SEQUENTIALLY INCREMENTING DATA
/SWITCH 9 UP USES CONSTANT DATA (PRIORITY OVER 8)
/SWITCH 10 UP ALLOWS PRINT OF ALL COMPARE ERRORS

/SWITCH 11 UP ENABLES READ ONLY MODE

/SWITCHES 3-4 AND 6-7 NOT USED
/
/CONTROL C	RETURN TO MONITOR (7605)
/CONTROL D	INTERRUPT DISPATCH TO 200
/CONTROL R	INTERRUPT DISPATCH TO 201
/CONTROL I	INTERRUPT INIT THEN RESTART
/CONTROL K	INTERRUPT DISPATCH TO KPAK
/		 ( R DOES INVISIBLE RETURN)
/CONTROL T	TYPE CUMMULATIVE STATUS: CONTINUE
/	 A	ACCEPTANCE TEST (DOES B,S,R)
/	 B	BUFFER FILL - EMPTY  TEST
/		ALSO CHECKS THAT ERROR FLAG CAN BE SET
/	 F	FORMAT SELECTED DISKETTE.
/	 S	SEQUENTIAL TEST
/	 R	RANDOM TEST
/	 D	SET DEVICE CODES.
/
/ USEFUL PARAMETER - VARIABLE LOCATIONS.
/
/ 021		BLKLIM: HIGHEST BLOCK TESTED
/ 022		NUMSCT: # PAGES TRANSFERRED EACH FLOPPY CALL
/ 025		PRNTER: # ERRORS PRINTED EACH SECTOR.
/ 063		MAXERR: MAX # ERROR LINES PRINTED BEFORE INHIBIT
/ 064		BUFPT: POINTER TO DATA BUFFER
/ 1400-1403	FIRST BLOCKS FOR UNITS 0-3
/ 1404-1407	LAST BLOCKS FOR UNITS 0-3
/ 142		DATA1: FIXED DATA, USED WHEN SW9=1
/ 143		DATA2: DATA STORED PREVIOUS TO READ
/ 144		N: OFFSET DATA, USED WHEN SW8=1
/ 200		START: START OF VEP (ASKS LOGICAL DISK NO.'S)
/			RESETS ALL STATUS COUNTS
/ 201		CONT: RESTART ADDRESS (ASKS "A,B,F,S,R,D OR V)
/
/ ERROR HALT LOCATIONS AND MEANINGS
/ 457, 466, 471, 474, 477	UNEXPECTED DISK INTERRUPT
/ 501	UN IDENTIFIED INTERRUPT

SA2000=CLA STL RTR SA4000=CLA STL RAR SA1=CLA IAC SA2=CLA STL RTL SA3= CLA STL IAC RAL SA4=CLA CLL IAC RTL SAM2=7344 SAM3=7346 INITS= JMS I IINITS SDNFS= JMS I ISDNFS X0=10 X1=11 X2=12 X3=13 X4=14 / DEFS FOR FIELD 1 MULTI DEVICE STATUS AND BUFFER ALLOCATION NUMDEV=4 / MAX # DEVICES RUNNABLE NUMDRV=3 / MAX # DRIVES EACH DEVICE STLDRV=40 / # WORDS ALLOCATED FOR STATUS ACCUM EACH DRIVE RTOTL=0 / OFFSET INTO DEV-DRV STATUS WTOTL=2 / OFFSET FOR # WRITES INTO DEV-DRV STATUS CETOTL=4 / OFFSET FOR # COMPARISON ERRRORS DETECTED. HETOTL=6 / OFFSET FOR # HARDWARE ERRORS DETECTED. STTOTL=10 STLDEV=140 / STATUS LENGTH FOR EACH DEVICE STTBUF=1000 / 0-STTBUF = CIRC DUMP BUFFER / MUST HAVE ONLY 1 BIT SET IN ADDRESS. STTBFL=STTBUF+600 / MAXDRV*STLDRV*NUMDEV+STTBUF DATBUF=3600 / ALLOWS 20(8) PAGE TRANSFERS BEFORE WIPING OUT OS8 PRINT= JMS I PTEXTX /PRINT A TEXT STRING PRNT2C= JMS I IPRN2C /PRINT 2 CHARS FOLLOWING CALL. PRNTO= JMS I POCTX /PRINT AC IN OCTAL PRINTO= PRNTO PRNTCR= JMS I PCRLFX /PRINT A CR AND LF
/ FLOPPY DISK INTERFACE OPERATION FOR DSD 210-8 / DEFS FOR INTERFACE OPERATION. LCDR=6751 / LOAD COMMAND REG: CLEAR AC. / XX XX XX XX MA SZ DH DR FN FN FN XX / MA = 1 FOR MAINTAINANCE MODE. / SZ = DATA WORD SIZE: 0=>12 BITS, 1=>8 BITS. / DH = HIGH DRIVE SELECT IF 3 DRIVES. / DR = DRIVE SELECT. 0=>DRIVE 0, 1=>DRIVE 1 / FN = FUNCTION (0 - 7) / 0=FILL BUFFER: GET 64 12 BIT WDS OR 128 8 BIT WDS / 1=EMPTY BUFFER(VERIFIES DATA: DOESEN'T CHANGE BUF) / 2=WRITE SECTOR 3 = READ SECTOR / 4= NOP 5 = READ STATUS (.25 SEC) SEE XDR BIT DEF / 6= WRITE DELETED DATA SECTOR / 7= READ ERROR REG: SEE PAGE 3 ERROR CODES. XDR=6752 / TRANSFER DATA REGISTER: BIDIRECTIONAL. / IF READ JAMS DATA INTO AC / IF WRITE LOADS FROM AC, AC UNCHANGED. / AC4= DRIVE READY / AC5= DELETED DATA MARK DETECTED IN ID / AC9= INITIALIZE COMPLETE. / AC10=PARITY ERROR ON CONTROL INF. / AC11=CRC ERROR DETECTED IN DATA. / NOTE: AFTER A LCD COMMAND FINISHED STATUS IS AVAILABLE. / XX XX XX XX DR DD XX XX WP ID PA CRC / DR =1 DRIVE READY - SELECTED UNIT READY AND UP TO SPEED / DD =1 DELETED DATA WAS READ BY LAST LCD COMMAND. / WP =1 (LCD 5 ONLY) DISKETTE IS WRITE PROTECTED. / ID =1 INITIALIZE DONE - SET AFTER INIT OR POWER FAIL / PA =1 PARITY ERROR / CRC=1 CRC ERROR DETECTED ON DATA READ. STRF=6753 / SKIP ON TRANSFER REQUEST. / AN XDR INSTRUCTION IS DESIRED. SERF=6754 / SKIP ON ERROR FLAGS SET. / DONE FLAG ALSO SET WHEN TRUE. SDNF=6755 / SKIP ON DONE FLAG SET AND CLEAR DONE. / ATTACHED TO INTERRUPT LINE. SINTR=6756 / SET INTERRUPT STATE / AC11=1 ENABLES INTERRUPT ON DONE FLAG SET. / AC11=0 DISABLES FLOPPY INTERRUPT. INIT=6757 / INIT THE FLOPPY CONTROLLER - INTERFACE.
/ ERROR CODES GIVEN BY READ ERROR REGISTER FUNCT (MODE 7) / CODE LIGHT # MEANING / 10 2 DRIVE 0 FAILED TO HOME ON INIT OR DIDN'T SELECT / 20 2 DRIVE 1 FAILED TO HOME ON INIT OR DIDN'T SELECT / 30 2 FOUND HOME WHEN STEPPING OUT 10 TRACKS FOR INIT. / 40 2 TRACK GREATER THAN 77. OR UNIT SELECT ERROR. / 50 2 HOME BEFORE DESIRED TRACK FOUND. / 70 2 DESIRED SECTOR COULD NOT BE FOUND AFTER 2 REVS. / / 100 3 WRITE PROTECT ERROR. / 110 MORE THAN 40 USEC AND NO SEPERATED CLOCK FOUND. / 120 0 NO PREAMBLE WAS FOUND ( 24 BITS OF 0'S) / 130 0 PREAMBLE FOUND BUT NO I/O MARK WITHIN WINDOW. / 140 0 CRC ERROR ON WHAT APPEARED TO BE HEADER. / 150 2 HEADER TRACK ADDRESS OF A GOOD HEADER DIDN'T / MATCH DESIRED TRACK. / 160 0 TOO MANY TRIES FOR AN I.D. ADDRESS MARK. / 170 0 DATA ADDRESS MARK NOT FOUND IN ALLOTED TIME. / 200 0 CRC ERROR ON READING SECTOR FROM DISK. / RXES STATUS BIT 11 ALSO SET. / 210 1 PARITY ERROR (INTERFACE <=> CONTROLLER) / RXES STATUS BIT 10 ALSO SET. / 220 2 DRIVE 2 FAILED TO HOME ON INIT. / 230 2 DRIVE 3 FAILED TO HOME ON INIT. / 240 3 FORMATTER ENABLE ERROR. / 250 0 EXPECTED HEADER NOT FOUND AFTER TRACK FORMAT. / 260 0 INDEX MARK NOT FOUND IN EXPECTED RANGE. / (FORMAT NOT BEGUN) / 270 0 INDEX MARK NOT FOUND IN EXPECTED RANGE. / (FORMAT HAS OCCURED) / LIGHTS MEANING / 0 FRONT DATA TYPE ERROR / 1 FRONT PARITY ERROR BETWEEN CONTROLLER-INTERFACE. / 2 FRONT SEEK TYPE ERRORS / 3 FRONT SWITCH CONFLICT ERROR OR CONTROLLER ERROR. / INCLUDES WRITE PROTECT OR FORMAT INHIBIT ERRORS. / BOARD LIGHTS / 4 UP-LEFT CONTROLLER WAITING FOR BUS INTERFACE READY. / 5 UP-RGHT INIT IN PROGRESS. / 6 LW-LEFT READ IN PROGRESS / 7 LW-RGHT WRITE IN PROGRESS.
*0 ZERO, 0; JMP I IPIPRO /THIS OCCURS DURING AN INTERRUPT / AUTO INDEX REGISTERS X0 - X4 (10-14) RESERVED / *20 MFIELD, 10 /MEMORY FIELD USED AS BUFFER (MULTIPLE OF 10) BLKLIM, 755 /HIGHEST BLOCK NO. TESTED VERMAX, 0 / OVERRIDES BLKLIM VALUE WHEN NONZERO. NUMSCT, 16 / MAX NUM PAGES TRANSFERRED AT ONE CALL. NMSCT, 16 / ACTUAL # PAGES TRANSFERRED: LOADED BY BDOK. PRNTER, -3 / MAX # DATA ERRS PRINTED EACH SECTOR. SECTOR, 0 / LAST SECTOR ACCESSED TRACK, 0 / LAST TRACK ACCESSED. BLKN, 0 /CURRENT BLOCK NUMBER DSKN, 0 /CURRENT DRIVE NUMBER PASCNT, -1 /COUNT OF NUMBER OF PASSES DBPT, DRVB0 /POINTER TO BEGIN BLOCK NO. TABLE DEPT, DRVE0 /POINTER TO END BLOCK NO. TABLE DCOUNT, 0 /COUNTING VARIABLE USED IN DATGEN,DATCOM TEMP, 0 / AVAILABLE TEMPORARY. (FORMAT, XDSUB) RXA, 0123 /RXA,RXB,RXC IS A TRIPLE PRECISION RXB, 4567 /RANDOM NUMBER RXC, 7654 ERRSTT, 0 / ERROR STATUS FROM HANDLER. ERRCNT, 0 /COUNT OF THE NUMBER OF ERRORS IN A BUFFER. SEQERR, 0 / FLAG FOR ERRORS DETECTED IN A PASS. JLOOKTB, LOOKTB / START OF LOOK UP TABLE OF STATUS ERRORS. JSTLDRV, STLDRV / LENGTH OF STATUS LENGTH EACH DRIVE. JSTBUF, STTBUF / START OF STATUS IN FIELD 1 STTPTS, 0 / STATUS POINTER FOR CURRENT SYSTEM DSK0: STTPTD, 0 / STATUS FOR CURRENT DRIVE, DEVICE STTPTR, 0 / WORKING STATUS TABLE POINTER. BLKPTR, 0 / STATUS POINTER FOR LOW ORDER COUNTS. PRGPTR, 0 / POINTER TO CURRENT DEVICE FOR PURGING. DSKDON, 0 /SET TO -1 ON DISK DONE INTERRUPT / MUST BE PRESET=4000 BEFORE INTERRUPT. TTIFLG, 0 /NOT ZERO WHEN CHAR READY YTTICH, 0 /LOADED WITH CHAR VALUE TTOFLG, 0 /0 WHEN READY FOR A CHARACTER DSKINE, 0 / DISK INTRPT ENABLE FLAG: 0=DISABLED 1=ENABLED PNTENF, -400 / NEGATIVE TO ENABLE PRINTING. MAXERR, -400 / MAX LINES OF ERROR COUNTER. /POINTERS / BUFPT, DATBUF / BEGINNING OF DATA BUFFER. IPIPRO, PIPROC /INTERRUPT PROCESSOR ICONT, CONT / CONTINUE POINTER. IDISPT, DISPAT /DISPATCH ROUTINE (CALL WITH IOF) IINIT, INITV /INITIALIZE FLAGS ICKSWT, CHKSWT /SKIP IF SWITCH IS SET ICYCLE, CYCLE / ROUTINE FOR CYCLEING THROUGH CONTROLLERS. RSAVEX, RSAVE /SAVES RANDOM GENERATOR PARAMETER RPUTX, RPUT /RESTORES RANDOM GENERATOR PARAMETER BREAKX, BREAK /OPERATOR BREAK TEST SEQTSX, SEQTSB / SEQUENTIAL WRITE-READ SUB. SEQRDX, SEQRDS / SEQUENTIAL READ ONLY PASS. IBLKIN, BLKINC /BLOCK # INCREMENT ROUTINE. RDITX, RDIT /READ A BLOCK ROUTINE WRTITX, WRTIT /WRITE A BLOCK ROUTINE DATCMX, DATCOM /DATA COMPARE ROUTINE IDCERR, DCERR / DATA ERROR PRINT ROUTINE. IACSET, ACSET / TYPE "ACSET " IF AC NOT 0. (SW2 INHIBITS) RANDX, RANDOM /RANDOM NUMBER GENERATOR IGTCHR, GETCHR / GET A CHAR FROM KEYBOARD. IOCTIN, OCTIN / OCTAL INPUT ROUTINE. PTEXTX, PTEXT /PRINT A TEXT STRING IPRN2C, PRN2C / PRINT 2 CHARS FOLLOWING CALL. IOCTPN, OCTPNT / PRINT WITHOUT LEAD ZERO SUPPR. POCTX, POCT /PRINT THE AC IN OCTAL PCHARX, PCHAR /PRINT THE CHARACTER IN THE AC PCRLFX, PCRLF /PRINT A CR LF PDSKAD, DSKADR / PRINT DISK ADDRESS. ILABCY, LABCYC / PRINT DEVICE IF CYCLEING. ICOMNDS, COMNDS / FLOPPY COMMAND SUB, WAITS THEN LOADS COMMAND ISTERF, SETERF / ROUTINE TO SET AND TEST ERROR FLAGS. ISDNFS, SDNFSB / SKIP ON DONE SET SUBROUTINE WITH TIMEOUT IINITS, INITSB / INIT CURRENT DSD-210 DEVICE. ISETDON, SETDON / SET DONE FLAG WITH MODE 4 COMMAND. ISETBKP, SETBKP / SET UP STATUS BLOCK POINTERS. / /CONSTANTS B3, 3 / UNIT MASK. B4, 4 B7, 7 B10, 10 B12, 12 B15, 15 B77, 77 B177, 177 B200, 200 B240, 240 B260, 260 / DATA1, 5252 / FIXED DATA, WRITTEN AND READ IF SW9=1. DATA2, 2525 / AND FOR FIRST 10 DATA LOCS EACH SECTOR. N, 0 / WHEN SW8=1. BUFF INITIALIZED TO INCREMENTING DATA / LOC: BUFPT+2.....BUFPT+177..; BUFPT+202.....BUFPT+377 /DATA: BUFPT+2+N...BUFPT+177+N; BUFPT+202+N...BUFPT+377+N DATA3, 7602 /DATA STORED PRIOR TO READ. M4, -4 M13, -13 / ROTATE COUNTER. MASTER, -50 / # ASTERISK "W" PAIRS EACH LINE. M170, -170 M13D, -15 / - 13 DECIMAL USED IN HANDLER M13T8D, -150 / - (8*13.) E00,
/START AT 200 TO SELECT DRIVES AND RESET STATUS. /START AT 201 TO SELECT TEST AND START / /////////////////////////// / *200 STARTV, JMS I IINIT /SETUP INTERRUPT FLAGS AND SKIP CONT, JMP RESTAR PRINT; TNAME /NAME AND VERSION PRNTCR PRINT; TEXDEV / DEVICE TAD CURDEV; PRINTO / DEVICE CODE PRNTCR LOGERR, PRINT; TLOGDV /LOGICAL DISK NUMBERS RETURN CLA CMA TAD DEPT DCA X0 TAD M4 DCA X1 DCA I X0 /SET ALL DISKS TO DISABLED ISZ X1; JMP .-2 STAR1, JMS I IGTCHR / WAIT FOR CHAR. TAD MAXDRV / UPPER CHAR LIMIT. SMA; JMP LOGERR / ERROR IF > 2 ( 0, 1, 2 VALID ) TAD B3 SPA; JMP STAR3 / TERMINATOR IF < 0 TAD DEPT; DCA STARA / SET POINTER TO END BLK TABLE TAD BLKLIM; DCA I STARA / LOAD MAX NO. OF BLOCKS JMP STAR1 STAR3, PRNTCR JMS RESTTU / RESET STATUS COUNTS STAR4, PRNTCR PRINT; TOPTON /F,S,R,K,OR D; JMS I IGTCHR / GET A CHAR FOR TEST DISPATCH. IOF JMS I IDISPT / CHECK FOR A MATCH "A; ACCEPTS / ACCEPTANCE TEST SEQUENCE "B; BUFWAT / BUFFER FILL EMPTY TEST "F; FORMAT / FORMAT SPECIFIED FLOPPY "S; SEQSTR / SEQUENTIAL TEST "R; RNDTST / RANDOM TEST "D; DEVCHG / SET DEVICE CODES "T-100; CSTATU / COMPLETE STATUS - ALL DRIVES, SYSTEMS "V; VERIFY / SHORT ACCEPTANCE TEST. "W; SWRMOD / SWITCH REG MODIFICATION. "Z; DEBUGX / GET IT IN THERE. 0 ION JMP STAR4 /CHARACTER NOT IDENTIFIED /ASK FOR S,R,W,K,OR D AGAIN SEQSTR, JMS RANSEQ JMP SEQTST / DO SEQUENTIAL TEST. RNDTST, JMS RANSEQ JMP RANTST / DO RANDOM TEST. VERIFY, JMS RANSEQ JMP VERIFR / /START ACTUAL TESTS / RANSEQ, SEQSTR+1 GOTOIT, PRNTCR STA; DCA PASCNT /SET UP FOR PASS TYPEOUT DCA VERMAX / RESET "V" MAX OVERRIDE. JMP I RANSEQ / GO DO IT. RESTAR, JMS I IINIT / RESTART AT 201 STARA, 0 /TEMP STORE JMP STAR4 ///////////////// / /SUBROUTINE TO TEST FOR OPERATOR BREAK REQUEST; / BREAK, 0 JMS GTLSCH / GET LAST CHAR TYPED JMP I BREAK / NOTHING NEW IOF JMS I IDISPT / CHECK FOR CERTAIN CHARS TYPED. "T-100; CUMSTT / CTRL T "W; SWRMOD / OPEN SWR WORD 0 JMP STAR4 / NONE OF ABOVE. / /TYPE COUNTER VALUES IN OCTAL / CUMSTT, PRNTCR JMS I PDSKADR / PRINT "DEV XYYZ DSKN BLK=YYYY" JMS PDRVST / PRINT #READS, #WRITES, #ERRS THIS DRIVE BRKRET, PRNTCR JMP I BREAK PDRVST, 0 PRNTCR PRINT; TTOTRD / "TOT. READ= JMS PTDBST; RTOTL PRINT; TTOTWT / "TOT. WRITE= JMS PTDBST; WTOTL PRINT; TTOTER / "TOT. ERRORS= JMS PTDBST; CETOTL / COMPARISON ERRORS. PRINT; THDWER / HARDWARE ERRORS. JMS PTDBST; HETOTL JMS ESTATD / PRINT ERROR STATUS IF ANY. JMP I PDRVST / RETURN ///////////////// / RESTART TEST WITH RESTORE ON CTRL I REST, JMS I IINIT / CTRL I - INIT AND RESTART TEST MAXDRV, -"3 / NON-EXECUTED WORD. JMP GOTOIT E02, PAGE
/INTERRUPT PROCESSOR / PIPROC, DCA SAVAC RAR; DCA SAVLNK / SAVE LINK ALSO PITTI, KSF; JMP PITTO KRB; AND B177 TAD B200; DCA YTTICH / WITH PARITY BIT SET. TAD MAXERR; DCA PNTENF / INIT PRINT ENABLE FLAG. JMS I IDISPT /CHECK FOR INTERRUPT DISPATCH "C-100; OS8DIS /CTRL/C = OS8 MONITOR RETURN. "D-100; STARTV /CTRL/D = RESTART AT BEGINNING. "S-100; CONSTT /CTRL/S = PRINT CURRENT STATUS. "R-100; RESTAR /CTRL/R = RESTART AT F,S,R,OR K" "I-100; REST /CTRL/I = RESTART TEST AT BEGINNING "K-100; KDISNT /CTRL/K = KPAK DISPAT "O-100; CTRLO / CTRL/O = PRINT INHIBIT. 0 TAD YTTICH; DCA TTIFLG / LOAD SO CHAR RECOGNIZED. JMP PIRET / CTRL T IS HANDLED IN BREAK ROUTINE. PITTO, TSF; JMP SDNF1 / CHECK FOR DISK INT. DCA TTOFLG TCF JMP PIRET / DSKDON SET = 4000 IF INTERRUPT IS EXPECTED / 0 IF NO INTERRUPT EXPECTED / -1 AFTER INTERRUPT IS PROCESSED. SDNF1, SDNF; JMP PIUNK / UNKNOWN INTERRUPT: HLT. TAD ZERO; DCA SAVDSK / SAVE LOC OF LAST DISK INT. SA4000; TAD DSKDON / INIT. TO 4000 FOR INT EXPECTED. SNA CLA; JMP DSKINT / EXPECTED INTERRUPT. TAD DSKINE; SNA CLA; JMP .+3 / INTERRUPT ENABLE FOR ERROR TAD DSKDON; NOP / UNEXPECTED DISK INT. DSKINT, STA; DCA DSKDON / INIT TO -1 FOR CHECK. JMP PIRET SAVDSK, 0 / LOCATION FROM WHICH LAST DISK INT CAME. PIUNK, SDNF-40; SKP; HLT / DEVICE 71 SDNF-10; SKP; HLT / DEVICE 74 SDNF; SKP; HLT / DEVICE 75 SDNF+20; SKP; HLT / DEVICE 77 NOP / UNIDENTIFIED INTERRUPT. SKP HLT / STILL UNIDENTIFIED. I7000, NOP / ROOM FOR OTHER DEVICE CLEAR. PIRET, SZA; HLT / HALT IF AC NOT CLEAR. TAD SAVLNK; CLL RAL TAD SAVAC RMF ION JMP I ZERO SAVAC, 0 SAVLNK, 0 / KPAK DISPATCH ON INTERRUPT KDISNT, IOF / TURNED ON BY DISPAT DCA YTTICH / INSURE NO RE-DISPATCH JMS I I7000 JMP PIRET / RETURN CTRLO, SA4000; TAD PNTENF; DCA PNTENF / COMPLEMENT PRINT INHIBIT JMP PIRET E04, PAGE
/ SEQUENTIAL AND RANDOM TESTS OF DISK. / /SEQUENTIAL TEST / /THIS TEST STARTS AT BLOCK O DISK O AND PROCEEDS TO /WRITE BLOCKS UNTIL LAST BLOCK OF LAST SELECTED DISK. / NO BLOCKS OUTSIDE THE LIMITS ARE WRITTEN ON. THE TEST /THEN READS THE BLOCKS IN THE SAME FASHION CHECKING /FOR ERRORS. BEFORE EACH READ PASS A R IS PRINTED. /BEFORE THE WRITE PASS A "W" IS PRINTED / SEQTST, JMS SEQTSB / SUBROUTINIZED FOR SEQUENTIAL TESTS JMP SEQTST SEQTSB, 0 JMS I ICKSWT; 1 / SW11 = 1 => READ ONLY. JMP SEQRD /SW11=1 - READ ONLY. TAD ("W / PRINT "W" WHEN WRITING. JMS I PCHARX / /WRITE ALL BLOCKS / DCA DSKN /SET DISK 0 SEQWT, TAD DSKN TAD DBPT DCA SSQTA / POINTER TO 1ST BLK USED FOR UNIT. TAD I SSQTA DCA BLKN /LOAD BEGINNING BLOCK NUMBER SQT3, JMS I WRTITX /WRITE A BLOCK JMP SQT1 /ILLEGAL BLOCK OR DISK JMS I ISQTER /DISK I/O ERROR JMS I IBLKINC /INCREMENT BLOCK NUMBER WTOTL /INCREMENT WTOTAL COUNTER JMP SQT3 / DO NEXT WRITE. SQT1, ISZ DSKN /INCREMENT THE DISK NUMBER SAM3; TAD DSKN / MAXIMUM OF 3 ALLOWED. SPA CLA /ALL BLOCKS AND DISKS DONE? JMP SEQWT /NO, DO NEXT DISK JMS I ICYCLE; JMP SEQWT-1 / CYCLE THROUGH OTHER DEVICES. / /READ AND COMPARE ALL BLOCKS / SEQRD, JMS SEQRDS / DO SEQ RD JMP I SEQTSB / RETURN TO CALLER. SEQRDS, 0 DCA SEQERR / TOTAL ERRORS IN SEQ SCAN. ISZ PASCNT / # OF ASTERISKS ON LINE. JMP .+4 / LINE NOT FULL YET. TAD MASTER; DCA PASCNT PRNTCR TAD ("R; JMS I PCHARX / PRINT A "R" DCA DSKN SQRD, TAD DSKN; TAD DBPT DCA SSQTA / POINTER TO FIRST BLK USED FOR UNIT. TAD I SSQTA; DCA BLKN /LOAD BEGINNING BLOCK NUMBER SQT5, JMS I RDITX /READ ONE BLOCK JMP SQT6 /ILLEGAL BLOCK OR DISK JMS I ISQTER /DISK I/O ERROR JMS I DATCMX /COMPARE DAT READ JMS I IBLKINC /INCREMENT BLOCK NUMBER RTOTL /INCREMENT RTOTAL COUNTER JMP SQT5 /DO READ AGAIN SQT6, ISZ DSKN /INCREMENT DSK NUMBER SAM3; TAD DSKN / 0-2 ARE ONLY VALID UNITS. SPA CLA; JMP SQRD /ALL BLOCKS AND DISKS CHECKED? JMS I ICYCLE; JMP SQRD-1 / CYCLE THROUGH OTHER DEVICES. /ONE PASS COMPLETE / JMP I SEQRDS / RETURN FOR ANOTHER PASS OR ? ISQTER, SQTER SSQTA, 0 / ACCEPTANCE TEST ROUTINE. / VERIFY - DO SHORT ACCEPTANCE TEST THEN REPEAT LONG / VERSION INDEFINATELY VERIFR, CLA; TAD B77 / DO ONLY FIRST 10. TRACKS JMS ACCEPS PRNTCR PRINT; TPROC / PRINT PROCEDING MESSAGE. / DOES A SEQUENCE OF TESTS AND REPEATS. / 1) SEQUENTIAL WRITE / 2) SEQUENTIAL READ / 3) SECTOR BUFFER FILL - EMPTY TEST (B COMMAND) / 4) RANDOM READ/WRITE FOR 500 READS / 5) SEQUENTIAL READ THEN 3 IF NO ERRORS. / OTHERWISE RESTARTS AT 1 ACCEPT, / RESET TO DO ENTIRE DISKETTE. JMS ACCEPS; JMP .-1 / DO INDEFINATE REPEAT. ACCEPS, 0 DCA VERMAX / SET "V"MAX OVERRIDE. JMS I ISTERF / CHECK FOR ALL ERROR FLAGS SETABLE JMS BUFTSB / DO FILL-EMPTY BUFFER TEST. JMS SEQTSB / DO SEQUENTIAL WRITE THEN SEQ READ. JMS RANTSB / DO WRITES AND READS UNTIL 500. READS. JMS SEQRDS / DO A SEQUENTIAL READ PASS FOR ERROR SCAN TAD SEQERR; SZA CLA; JMP ACCEPS+4 JMP I ACCEPS / SWRMOD - SWITCH REGISTER MODIFY ROUTINE / DISPATCH HERE FROM BREAK ON "W" TYPED SWRMOD, TAD SWITCH; PRINTO PRNT2C; 7240 / ": " JMS I IOCTIN / MODIFY THE VALUE? 0 / FLAG SWITCH, 0 JMP BRKRET / RESTTU - RESET STATUS ROUTINE. RESTTU, 0 STA; TAD JSTBUF; DCA X0 / CLEAR STATUS AREA. CDF 10 DCA I X0 TAD X0; TAD (-STTBFL+1 / END OF BUFFER? SPA CLA; JMP .-4 CDF 0 JMP I RESTTU / RETURN E06, PAGE
/RANDOM TEST / / RANDOMLY SELECT EITHER A READ OR A WRITE SUBJECT TO SW11. / RANDOMLY SELECT A DRIVE AND BLOCK ON A SELECTED DRIVE AND DO IT. / THEN CYCLE TO NEXT DEVICE. TERMINATED BY KEYBOARD RANTST, JMS RANTSB JMP RANTST / RETURNS EVERY 4096 READS RANTSB, 0 TAD RDCNTV; DCA RREADT / SET # READS BEFORE RETURN. RANTSL, JMS I ICYCLE; NOP / INSURE ALL DISKS WRITTEN. JMS I RANDX /GET A RANDOM NO. RDCNTV, RTR /IF EVEN, WE WILL WRITE SZL; JMP RNREAD /IF ODD, WE WILL READ /WRITE A BLOCK / RNWRT, JMS I ICKSWT; 1 /CHECK SW11 FOR READ ONLY JMP RNREAD / GO READ IT INSTEAD. JMS I RANDX AND BLKMSK DCA BLKN /GET RANDOM BLOCK NUMBER JMS I RANDX AND B3 DCA DSKN /GET RANDOM DISK JMS I WRTITX /WRITE A RANDOM BLOCK JMP RNWRT /ILLEGAL BLOCK OR DISK JMS SQTER /DISK I/O ERROR JMS I IBLKINC / BUMP BLK AND TRANSFER COUNTER WTOTL JMP RANTSL /READ A BLOCK / RNREAD, JMS I RANDX AND BLKMSK / INSURE MINIMAL ILLEGAL BLOCK #'S. DCA BLKN /GET RANDOM BLOCK NUMBER JMS I RANDX /GET RANDOM DISK NUMBER AND B3; DCA DSKN / SET RANDOM DRIVE # JMS I RDITX /READ A RANDOM BLOCK JMP RNREAD /ILLEGAL BLOCK OR DISK NO. JMS SQTER /DISK I/O ERROR JMS I DATCMX /CHECK DATA JMS I IBLKINC / BUMP BLKN AND READ TOTALS. RTOTL ISZ RREADT / EXIT COUNTER. JMP RANTSL / DO ANOTHER JMP I RANTSB / EXIT. BLKMSK, 777 / MAXIMUM BLOCK # MASK. RREADT, 0 / READ TRANSFER COUNTER.
/READ OR WRITE ERROR / /PRINT FOLLOWING LINE THEN RETURN TO CALL: /READ(WRITE) ERROR LLLL BLOCK=BBBB STATUS=SSSS DSKN / SQTER, 0 JMS I ICKSWT; 1000; JMP SQTERC / SUPPRESS ERROR IF UP. TAD MASTER; DCA PASCNT PRNTCR TAD FUNCT / DETERMINE IF LAST OPERATION WAS WRITE SZA CLA; JMP .+4 / SKIP IF WRITE PRINT; TEXT14 / WRITE ERR. JMP .+3 PRINT; TEXT13 / RD. ERR. SQTER1, / PRINT DEVICE LABEL IF CYCLEING AND JMS I PDSKADR / PRINT DSKN BLK= MMMM PRINT; TEXT12 / STATUS= TAD ERRSTT; PRINTO / PRINT DEFINITIVE ERROR STATUS. TAD ERRSTT; JMS INCSTT / BUMP ERROR COUNTS SQTERC, JMS INCCNT; HETOTL / INCREMENT HARDWARE ERROR COUNTS JMP I SQTER / CONSTT - CONTROL S DISPATCH FOR PRINTOUT OF HUNG STATUS. CONSTT, SDNF; JMP CHKTRQ PRINT; TNTDON CHKTRQ, STRF; JMP CHKERF PRINT; TTRREQ CHKERF, SERF; JMP CHKXES PRINT; TERFST CHKXES, PRINT; TRXESE / RXES = XDRS1, XDR; PRINTO XDRS2, XDR; PRINTO JMS GETERS / READ DEFINITIVE ERROR STATUS. PRINT; TEXT12 / STATUS= TAD ERRSTT; PRINTO / READ DEFINITIVE STATUS AND PRINT PRNTCR JMS I RPUTX / RESTORE RANDOM # PARAMS. JMP I STTRT STTRT, CONT / LOADED BY RDIT, WRTIT / ACSET - TYPE "AC SET = <VAL> @ <LOC> ACSET, 0 SNA; JMP I ACSET / EXIT IF CLEAR DCA SACSET SA2; JMS INCSTT / BUMP ERROR COUNT FOR #2. JMS I ICKSWT; 1000; JMP I ACSET / SUPPRESS IF SW2 = 1 PRINT; TACSET TAD SACSET; PRINTO PRINT; TAT TAD ACSET; PRINTO PRNTCR JMP I ACSET SACSET, 0 E10, PAGE
/PRINT TEXT /PRINT TEXT IS TRIMMED ASCII UNTIL A ZERO /CHARACTER IS FOUND / /JMS PTEXT /TEXT /LOCATION OF TEXT / PTEXT, 0 CLA CLL TAD I PTEXT DCA PTXTA /SAVE TEXT ADDRESS ISZ PTEXT PTXT1, TAD I PTXTA /GET WORD BSW /GET HIGH 6 BITS. JMS PTXT2 /PRINT LEFT CHAR TAD I PTXTA JMS PTXT2 /PRINT RIGHT CHAR ISZ PTXTA JMP PTXT1 /GET NEXT CHAR POCTA, PTXTA, 0 PTXT2, 0 AND B77 SNA /RETURN IF CHAR IS ZERO JMP I PTEXT TAD B240 /CONVERT CHAR TO ASCII AND B77 TAD B240 JMS PCHAR /PRINT CHARACTER JMP I PTXT2 / GET THE NEXT CHAR. / PRN2C - PRINT 2 CHARS FOLLOWING CALL AS TEXT STRING / JMS PRN2C; 0140 / PRINTS "A " / CAUTION: DO NOT CALL WITH A 00 VALUE IN EITHER 6 BIT CHAR POS. PRN2C, 0 CLA; TAD I PRN2C; BSW JMS PTXT2 / PRINT FIRST CHAR TAD I PRN2C; JMS PTXT2 ISZ PRN2C JMP I PRN2C
/PRINT AC IN OCTAL / OCTPNT, 0 / PRINT WITHOUT LEAD ZERO SUPPR. DCA POCTA TAD OCTPNT; DCA POCT CLA IAC; JMP POCT+2 / SET FLAG. POCT, 0 DCA POCTA DCA PTEXT / LEAD ZERO FLAG. TAD M4; DCA PTXT2 / DIGIT COUNTER. POCTLP, TAD POCTA RTL RAL DCA POCTA TAD POCTA RAL AND B7 SZA; JMP .+4 / A ZERO? TAD PTEXT; SNA CLA; JMP POCTLC / IGNORE LEADING ZEROS. TAD B260; JMS PCHAR / TYPE THE DIGIT. ISZ PTEXT / BUMP LEAD ZERO FLAG. POCTLC, ISZ PTXT2; JMP POCTLP / ANOTHER DIGIT. TAD PTEXT; SZA CLA; JMP .+3 / ANYTHING TYPED? TAD B260; JMS PCHAR / NO: TYPE A 0. JMP I POCT / /PRINT THE CHARACTER IN THE AC / PCHAR, 0 DCA TTOCHR ION /JUST IN CASE TAD PNTENF; SMA CLA; JMP I PCHAR / ALLOW PRINT DISABLE. TAD TTOFLG; SZA CLA; JMP .-2 / WAIT TILL NOT BUSY. TAD TTOCHR TLS DCA TTOFLG JMP I PCHAR TTOCHR, 0 EJECT / / GETCHR - GET A CHAR ROUTINE / GETCHR, 0 CLA TAD TTIFLG; SNA; JMP .-2 JMS PCHAR DCA TTIFLG TAD YTTICH JMP I GETCHR GTLSCH, 0 CLA TAD TTIFLG; SNA CLA; JMP I GTLSCH DCA TTIFLG; TAD YTTICH ISZ GTLSCH JMP I GTLSCH / /DISPAT: DISPATCH TO A SPECIFIED ADDRESS BY CHAR TYPED; /CALL WITH IOF; DOES ION ON DISPATCH; /NO ION ON FALL THROUGH. / DISPAT, 0 CLA TAD I DISPAT ISZ DISPAT SNA JMP I DISPAT /RETURN; NO DISPATCH IDENTIFIED CIA TAD YTTICH SNA CLA JMP DISPX ISZ DISPAT JMP DISPAT+1 DISPX, TAD I DISPAT /DISPATCH IDENTIFIED DCA DISPAT ION JMP I DISPAT /GO TO IDENTIFIED DISPATCH / /PRINT CARRIAGE RETURN LINE FEED / PCRLF, 0 CLA; JMS PCHAR TAD PTXT1+2; JMS PCHAR / FOR TTY GLITCH. TAD PTXT1+2; JMS PCHAR / PRINT CR TAD B12; JMS PCHAR / PRINT LF TAD PNTENF; IAC; SMA; CLA / INCREMENT IF NEGATIVE DCA PNTENF / ZERO IF POSITIVE. JMP I PCRLF E12, PAGE /////////////////////////// / /LOGICAL DISK LIMIT TABLE / ////////////////////////// / DRVB0, 0 /LIST OF BEGINNING BLOCK 0 /NUMBERS FOR EACH LOGICAL DISK. 0 0 DRVE0, 0 /LIST OF ENDING BLOCK NUMBERS 0 /FOR EACH LOGICAL DISK. A 0 /0000 INDICATES THAT DISK 0 /IS NOT TO BE TESTED. IF
/VEP READ, WRITE, BLOCK CHECK / /CHECK BLOCK AND DISK NUMBER /TAKE ERROR EXIT IF /1. BLOCK NUMBER .GT. ENDING BLOCK NUMBER /2. BLOCK NUMBER .LT. BEGENNING BLOCK NUMBER /3. ENDING BLOCK NUMBER IS 0 / /JMS BDOK /ERROR RETURN /NORMAL RETURN BDOK, 0 CLA TAD DSKN; TAD DEPT; DCA BDOKA TAD I BDOKA /GET ENDING BLOCK NUMBER SNA JMP CHKRND /ENDING BLOCK=0, DONT TEST DCA DCOUNT / SAVE BLOCK LIMIT FOR CHECKING. / CHECK FOR SHORT TEST LIMITS. TAD VERMAX; SZA; DCA DCOUNT / UPDATE WITH MAX BLK # TAD DCOUNT; STL CIA /COMPARE TO ENDING BLK NO. TAD BLKN; SNL SZA CLA /IS BLKN .GT. ENDING BLOCK JMP CHKRND /BLOCK NO. TOO LARGE JMS I BREAKX / TEST FOR OPERATOR BREAK. / CHECK FOR BLKN + NUMBER BLKS IN TRANSFER TOO LARGE. STA / NO DIFFERENCE IF 1 OR 2 PAGES TAD NUMSCT; CLL RAR / OFFSET FOR LAST BLK WRITTEN TAD BLKN; CLL CIA TAD DCOUNT / LAST LEGAL BLK - FINAL BLK TO BE WRITTEN. SZL; CLA / IF TO BIG DECREASE # PAGES TRANSFERRED. CLL RAL / CONVERT BACK TO PAGES. TAD NUMSCT; DCA NMSCT / CHECK THAT GREATER THAN FIRST BLK. TAD DSKN; TAD DBPT; DCA BDOKA / PTR TO FIRST BLK. TAD I BDOKA; CLL CIA /GET BEG BLOCK NUMBER TAD BLKN SZL SNA CLA /IS BLKN .GE. STARTING BLOCK ISZ BDOK /INCREMENT CALL IF BLKN IS OK TAD DSKN; TAD DSK0X; DCA DSKIO / GET DRIVER ENTRANCE TAD I DSKIO; DCA DSKIO / AND SET IT FOR CALL. JMS I ICKSWT; 2000 / INTERRUPT ENABLED? STA; IAC / YES IF SW1 = 0 DCA DSKINE JMP I BDOK BDOKA, 0 CHKRND, TAD RXA; TAD RXB; SZA CLA; JMP I BDOK / DON'T RESET TAD .-2; DCA RXA / RESET IF BOTH 0 JMP I BDOK
/WRITE ROUTINE / /THIS ROUTINE GENERATES A BLOCK OF DATA /AND WRITES IT ON THE DISK. /ENTER WITH BLOCK NO. IN BLKN AND DISK NO. IN DSKN / /JMS WRTIT /ERROR RETURN /BLOCK OR DISK NO. NOT OK /ERROR RETURN /DISK I/O ERROR /NORMAL RETURN / /////////////////////////// / WRTIT, 0 STA; TAD WRTIT; DCA STTRT / SET UP FOR CTRL S: RETRY. JMS BDOK /ARE BLOCK AND DISK NO. OK JMP I WRTIT /NO, EXIT CALL+1 ISZ WRTIT JMS I IDATGE /GENERATE A DATA BUFFER TAD BLKN; DCA WRT1 / LOAD BLOCK #. TAD NMSCT; CLL RTL; RTL; RTL / # PAGES TO BE TRANSFERRED. TAD WRTSEL TAD MFIELD; DCA WRT1-2 / LOAD FUNCTION WORD. TAD BUFPT; DCA WRT1-1 / LOAD BUFFER ADDRESS. NOP JMS I DSKIO /CALL MULTI DSK HANDLER 4200 /WRITE 2 PAGES DATBUF WRT1, 0 /BLOCK NUMBER JMP I WRTIT /DISK ERROR, EXIT CALL+2 NOP ISZ WRTIT JMP I WRTIT /NORMAL EXIT IDATGE, DATGEN WRTSEL, 4000 EJECT /READ ROUTINE /THIS ROUTINE READS A BLOCK OF DATA FROM THE DISK /ENTER WITH BLOCK NO. IN BLKN AND DISK NO. IN DSKN / /JMS RDIT /ERROR RETURN /BLOCK OR DISK NO. NOT OK /ERROR RETURN /DISK I/O ERROR /NORMAL RETURN RDIT, 0 JMS BDOK /IS BLOCK AND DISK NO. OK JMP I RDIT /NO, EXIT CALL+1 ISZ RDIT CLA IAC; TAD RDIT; DCA STTRT / CTRL S: DO NORMAL RETURN. TAD BLKN; DCA RDIT1 / LOAD BLOCK #. TAD NMSCT; CLL RTL; RTL; RTL / # PAGES TRANSFERRED TAD MFIELD; DCA RDIT1-2 / INIT FUNCTION WORD. TAD BUFPT; DCA RDIT1-1 NOP JMS I DSKIO /CALL THE MULTI DSK HNDLR 0200 /READ 2 PAGES DATBUF RDIT1, 0 /BLOCK NUMBER JMP I RDIT /DISK ERROR, EXIT CALL+2 NOP ISZ RDIT JMP I RDIT /NORMAL EXIT DSKIO, 0 /WILL BE LOADED WITH POINTER /TO MULTI DISK HANDLER DSK0X, .+1 ENTDX0; ENTDX1; ENTDX2; ENTDX2 E14, PAGE
/DATA GENERATOR AND BUFFER INITIALIZATION. / /JMS DATGEN; (RANDOM NUMBER) / RETURNS / / C(NMSCT) PAGES OF 128 WORDS EACH ARE GENERATED; /EACH PAGE IS FORMATTED AS FOLLOWS..... / 1ST WORD = BLOCK NUMBER / 2ND WORD = PAGE NUMBER IN BIT 0 / LOGICAL DISK NUMBER IN BITS 9-11 / 3RD-6TH = ALTERNATING 5252,2525 SEQUENCE / 7TH = ALL ONES (7777) / 8TH = ALL ZEROES / 9TH-128TH WORDS DEPEND ON SW9,SW8 AS FOLLOWS: /SW8 SW9 / 0 0 10TH WORD = RANDOM NUMBER STATE FOR RANDGEN / USED FOR INITING RANDGEN FOR / GENERATION OF REMAINING WORDS / 11TH-128TH = RANDOM NUMBERS / 0 1 9TH-128TH = DATA1 (CONSTANT DATA) / 1 X 9TH-128TH = SEQUENTIALLY INCREMENTING DATA WITH / N (LOC 144) AS OFFSET PARAMETER. DATGEN, 0 STA; TAD BUFPT; DCA X0 / BUFFER BEGINNING JMS I RANDX / DO IT NOW SINCE ALWAYS RESTORES JMS I RSAVEX / INIT DATA FORMAT MODE. JMS I ICKSWT; 10; JMP .+5 / DATA1=CONSTANT DATA. JMS I ICKSWT; 4; JMP .+4 / SEQUENTIAL DATA. JMP .+4 TAD (SW8G; SKP TAD (SW9G; DCA ISWG / INIT POINTER TO FORMATTING ROUTINE. TAD MFIELD; TAD DATGEX; DCA DATLP / INIT MEM FIELD. DCA SCTCNT / INIT SECTOR COUNTER. DATLP, CDF 0 TAD SCTCNT; CLL RAR / EVEN/ODD PAGE TO LINK. TAD BLKN; DCA I X0 CLA RAR; TAD DSKN / SET BIT 0 IF HIGH PAGE DCA I X0 / LOAD PAGE- DSKN TAD M170; DCA DCOUNT / # DATA WORDS. / FIXED DATA SECTION: 6 WORDS: 5252,2525,5252,2525,7777,0000 TAD DATA1; DCA I X0 / 5252 WD 2 TAD DATA2; DCA I X0 / 2525 WD 3 TAD DATA1; DCA I X0 / 5252 WD 4 TAD DATA2; DCA I X0 / 2525 WD 5 STA; DCA I X0 / 7777 WD 6 DCA I X0 / 0000 WD 7 TAD ISWG; SZA CLA; JMP DGFXDT / DO FIXED DATA FORMAT / FORMAT WITH RANDOM DATA. TAD RXA; DCA RXB / INIT ALL TO SAME 12 BIT STATUS. TAD RXA; DCA RXC TAD RXA; DCA I X0 / LOAD THE STATUS. ISZ DCOUNT DGR1LP, CLA; TAD M13; DCA X2 / LOAD SHIFT COUNTER. JMS I RANDX CLL / ENSURE LINK STATUS SAME. DGR2LP, DCA X3; TAD X3 DCA I X0 / LOAD DATA WORD. ISZ DCOUNT; SKP; JMP DATGEX / FIN A SECTOR WORTH TAD X3; RAR ISZ X2; JMP DGR2LP JMP DGR1LP / GET ANOTHER RANDOM #. ISWG, 0 SCTCNT, 0 / SECTOR # BEING FORMATTED. SW9G, 0 / SUB TO GENERATE CONSTANT DATA FOR SW9 TAD DATA1 JMP I SW9G SW8G, 0 IAC; TAD X0; TAD N JMP I SW8G DGFXDT, JMS I ISWG / GET SPECIFIED FIXED DATA. DCA I X0 ISZ DCOUNT; JMP DGFXDT DATGEX, CDF 0 ISZ SCTCNT / BUMP FOR NEXT PAGE. TAD NMSCT; SNA; JMP .+5 / EXIT AFTER 1 IF 0. CIA; TAD SCTCNT SPA CLA; JMP DATLP / DO ANOTHER SECTOR. JMS I RPUTX / RESTORE RANDGEN. JMP I DATGEN / FINISHED NMSCT SECTORS.
/BLKINC - BLOCK AND COUNTER INCREMENT ROUTINE. / JMS BLKINC / OFFSET TO DOUBLE PRECISION STATUS COUNTER. / RETURNS. BLKINC, 0 CLA; TAD I BLKINC; ISZ BLKINC / GET OFFSET JMS I ISETBKP / SET UP POINTERS. CLL; TAD NMSCT; TAD I BLKPTR; DCA I BLKPTR SZL CLA; ISZ I STTPTR / CARRY TO HIGH ORDER. CDF 0 TAD NMSCT; CLL RAR / BUMP BLOCK #. TAD BLKN; DCA BLKN JMP I BLKINC / INCCNT - INCREMENT A DOUBLE PRECISION COUNTER. INCCNT, 0 CLA TAD I INCCNT; ISZ INCCNT / GET POINTER OFFSET JMS I ISETBKP / SET UP POINTERS AND DATA FIELD ISZ I BLKPTR; SKP; ISZ I STTPTR CDF 0 JMP I INCCNT E16, PAGE
/DATA COMPARE / /JMS DATCOM / /DATA IS COMPARED ACCORDING TO THE FORMAT IN /WHICH IT WAS GENERATED. SEE DATGEN FOR DETAILS. / / DATCOM, 0 STA; DCA FRSTER / FLAG FOR PRINTING ID IN DCERR. STA; TAD BUFPT; DCA X0 / BUFF BEGINNING. JMS I RSAVEX / SAVE RANDOM # STATE. / DECODE SWITCH SELECTION OF DATA FORMAT. JMS I ICKSWT; 10; JMP .+5 / SW9=1 => CONSTANT DATA. JMS I ICKSWT; 4; JMP .+4 / SW8=1 => SEQUENTIAL DATA. JMP .+4 / LEAVE 0 FOR RANDOM. TAD (SW8G; SKP TAD (SW9G; DCA ISWC DCA SCTCTR / SECTOR # FROM 0 = FIRST PAGE. TAD MFIELD; TAD DATCSX; DCA DATCDF / INIT DATA FIELD. DCA TERRCT / TOTAL # ERROR COUNTER. DATCLP, TAD PRNTER; DCA DERRCT / COUNT OF MAX # ERRORS PRINTED TAD SCTCTR; CLL RAR / BLOCK OFFSET TAD BLKN; JMS DATCMS / CHECK WORD 00 = BLK # TAD SCTCTR; CLL RAR; CLA RAR / PAGE BIT. TAD DSKN; JMS DATCMS / CHECK WORD 01 = PAGE, DSKN TAD M170; DCA DCOUNT / SET UP FOR REMAINDER OF DATA. / DO 6 WORDS OF FIXED DATA TAD DATA1; JMS DATCMS / 5252 WD 02 TAD DATA2; JMS DATCMS / 2525 WD 03 TAD DATA1; JMS DATCMS / 5252 WD 04 TAD DATA2; JMS DATCMS / 2525 WD 05 STA; JMS DATCMS / 7777 WD 06 JMS DATCMS / 0000 WD 07 TAD ISWC; SZA CLA; JMP DCFXDT / DO RANDOM DATA. TAD DATCDF; DCA .+1 / SET BUFFER DATA FIELD CDF N TAD I X0; DCA RXA / INIT RANDOM # GENERATOR. TAD RXA; DCA RXB TAD RXB; DCA RXC ISZ DCOUNT / 175 PREDICTED WORDS. DCR1LP, CLA; TAD M13; DCA X2 / SHIFT COUNTER. JMS I RANDX CLL DCR2LP, DCA X3 RAR; DCA X4 / SAVE LINK. TAD X3; JMS DATCMS / CHECK RANDOM DATA. ISZ DCOUNT; SKP; JMP DATCEX TAD X3; CLL RAR; TAD X4 / DO END AROUND CARRY ISZ X2; JMP DCR2LP JMP DCR1LP DATCMS, 0 DCA X3 / SAVE PREDICTED DATA. DATCDF, CDF N TAD I X0; CIA; TAD X3 SNA CLA; JMP DATCSX STA; TAD X0; DCA X0 / RESET BACK ONE. TAD I X0 / GET READ DATA CDF 0 / RESTORE MEMORY FIELD. JMS I IDCERR / AND PRINT ERROR JMS INCCNT; CETOTL / INCREMENT COMPARISON ERROR COUNT DATCSX, CDF 0 JMP I DATCMS DCFXDT, JMS I ISWC; JMS DATCMS / COMPARE SEQUENTIAL/FIXED DATA ISZ DCOUNT; JMP DCFXDT DATCEX, ISZ SCTCTR TAD SCTCTR; CIA; TAD NMSCT SMA SZA CLA; JMP DATCLP / DO ANOTHER SECTOR. TAD DERRCT; SPA SNA CLA; JMP DATCEZ /INHIBIT SUMMARY PRINT JMS I ICKSWT; 4000; JMP DATCEZ PRINT; TERRTO / "ERRS= " TAD TERRCT; PRINTO DATCEZ, JMS I RPUTX / RESTORE RANDOM # GENERATOR. / PRINT TOTAL # COMPARISON ERRORS IF DERRCT > 0 JMP I DATCOM ISWC, 0 / POINTER TO DATA GENERATOR ROUTINE. SCTCTR, 0 / SECTOR COUNTER: 0 - NUMSCT-1 DERRCT, 0 / ENABLE COUNTER FOR # ERRORS PRINTED. TERRCT, 0 / TOTAL # COMPARISON ERRORS THIS TRANSFER. E20, PAGE
/DATA COMPARE ERROR HANDLER / /PRINTS: /COMPARE ERROR LLLL BLK=BBBB DSKN /ADDR=AAAA WRITTEN=WWWW READ=RRRR DCERR, 0 ISZ SEQERR / SEQUENTIAL ERROR CHECK FLAG. DCA RDVAL / DATA READ. JMS I ICKSWT; 4000; JMP I DCERR / BUMP TOTAL ERROR COUNT. ISZ FRSTER; JMP ERPLOC / SKIP HEADER ON MULTIPLE ERRORS STA; DCA PASCNT PRNTCR PRINT; TEXT30 /DATA ERROR JMS DSKADR / PRINT <DEV XX> "DSK(N) BLK=(N)" JMP ERPNT ERPLOC, ISZ DERRCT NOP / TRANSFER ERROR COUNTER. JMS I ICKSWT; 2; JMP .+4 / PRINT ALL ERRORS. TAD DERRCT; SMA SZA CLA; JMP I DCERR / COUNT EXCEDED. PRNTCR ERPNT, PRINT; TEXT33 / ADDR= TAD X0; PRNTO / PRINT BUFFER ADDR. PRINT; TEXT34 / WROTE= TAD X3; PRNTO / PRINT WRITTEN WORD. PRINT; TEXT35 / READ= TAD RDVAL; PRNTO / DATA READ. JMP I DCERR / MORE DATA ERRORS? FRSTER, 0 / SET =-1 IN DATCOM TO FLAG FIRST ERROR RDVAL, 0
/ DSKADR - PRINTS DISK # AND CURRENT BLOCK # ON TTY DSKADR, 0 JMS I ILABCYC / PRINT DEVICE LABEL IF CYCLEING. PRINT; TATDSK TAD DSKN; TAD B260 / MAKE AN ASCII #. JMS I PCHARX PRINT; TBLKEQ TAD BLKN; PRNTO / PRINT BLK # PRINT; TTSP / " T,S=" TAD TRACK; PRINTO / PRINT TRACK # PRINT; TSPACE / SPACE TAD SECTOR; PRINTO / PRINT SECTOR# AT TRANSFER END. PRINT; TSPACE JMP I DSKADR / PTDBST - PRINT DOUBLE PRECISION STATUS FOR SYSTEM, DRIVE / JMS PTDBST; OFFSET PTDBST, 0 CLA TAD I PTDBST; ISZ PTDBST / GET OFFSET. JMS SETBKP / SET UP POINTERS TAD I STTPTR / GET COUNT CDF 0 SZA; PRINTO / PRINT HIGH ORDER CDF 10 TAD I BLKPTR CDF 0 JMS I IOCTPNT / PRINT LOW ORDER WITHOUT LEAD ZERO SUPR. JMP I PTDBST / CSTATU - COMPLETE STATUS FOR ALL UNITS. CSTATU, DCA DSKN / START WITH DRIVE 0 EACH SYS. PRNTCR JMS I ILABCY / PRINT DEVICE AND DSKN CSTATD, PRINT; TATDSK TAD DSKN; TAD B260 JMS I PCHARX JMS PDRVST / PRINT STATUS FOR DRIVE CSTNDK, ISZ DSKN SAM3; TAD DSKN / VALID DRIVE? SMA CLA; JMP CSTATN / NO - CYCLE TO NEXT SYS TAD DSKN; TAD DEPT; DCA DSKADR / SEE IF ENABLED TAD I DSKADR; SNA CLA; JMP CSTNDK / NEXT SEQ DSK? JMP CSTATD CSTATN, JMS I ICYCLE; JMP CSTATU / NEXT SYSTEM JMP I ICONT / SETBKP - SET STTPTR - BLKINC POINTERS FOR DSKN, SYSTEM / JMS SETBKP / C(AC) = OFFSET / RETURNS WITH DATA FIELD SET = 10 / STTPTR POINTS ACCORDING TO OFFSET, BLKPTR=STTPTR+1 SETBKP, 0 TAD STTPTS; DCA STTPTR / DO FOR FIRST DRIVE. / OFFSET ACCORDING TO DRIVE #. STA; TAD DSKN SNA; JMP .+4 / DRIVE 1 SMA CLA; TAD JSTLDRV SZA; TAD JSTLDRV TAD STTPTR; DCA STTPTR / PUT IN DRIVE OFFSET. TAD STTPTR; CLL IAC; DCA BLKPTR CDF 10 JMP I SETBKP E22, PAGE
/ RANDOM NUMBER GENERATOR / /GENERATE A RANDOM NUMBER BY MULTIPLYING THE PREVIOUS /RANDOM NUMBER BY 2**17+3. START WITH A TRIPLE /PRECISION NUMBER IN RXA,RXB, AND RXC AND PUT THE /RESULTS INTO THESE LOCATIONS. RXA IS MOST SIGNIFICANT /AND IS USED AS THE 12 BIT RANDOM NUMBER. / /X(N) = (2**17+3)*X(N-1) / /////////////////////////// / PAGE RANDOM, 0 CLA CLL TAD RXC RAL AND RGM1 DCA RGC4 TAD RXB AND RGM2 TAD RGC4 RTL; RTL; RAL; DCA RGC2 TAD RXC; AND RGM2 RTL; RTL; RAL TAD RXB; DCA RGC3 SZL; ISZ RGC2; NOP TAD RXC; CLL RAL SZL; ISZ RGC3 SKP; ISZ RGC2; NOP CLL; TAD RXC; DCA RXC TAD RXB; RAL SZL; ISZ RGC2; NOP CLL TAD RGC3; DCA RXB TAD RXA; RAL TAD RXA; TAD RGC2; DCA RXA TAD RXA /EXIT WITH RANDOM IN AC JMP I RANDOM RGM2, 177 RGM1, 7400 RGC2, 0 RGC3, 0 RGC4, 0 / /ROUTINE TO SAVE RANDOM GENERATOR PARAMETER / RSAVE, 0 CLA TAD RXA; DCA DGA TAD RXB; DCA DGB TAD RXC; DCA DGC JMP I RSAVE / /ROUTINE TO RESTORE RANDOM GENERATOR PARAMETER / RPUT, 0 CLA TAD DGA; DCA RXA TAD DGB; DCA RXB TAD DGC; DCA RXC JMP I RPUT DGA, 0 DGB, 0 DGC, 0
/INITIALIZE FLAGS, POINTERS / INITV, 0 SA4000; DCA DSKDON / ALLOW AN INTERRUPT. CDF 0 / JUST IN CASE. TAD KCYCTB / RESET CYCPTR DCA I JCYCPT / TO BEGINNING OF CYCLE. TAD ICONT; DCA I JSTTRT TAD PRXA; DCA RXA TAD PRXB; DCA RXB TAD PRXC; DCA RXC / DELAY FOR PRINTING IN PROGRESS ISZ DCOUNT; JMP .-14 INITS / INIT ALL DRIVES JMS I ICYCLE JMP .-2 ISZ INITV DCA TTIFLG DCA TTOFLG PRNTCR JMP I INITV KCYCTB, CYCTBL JCYCPT, CYCPTR JSTTRT, STTRT PRXA, 0123 PRXB, 4567 PRXC, 7654 /SWITCH CHECK ROUTINE /SKIP IF SWITCH SPECIFIED AFTER CALL IS CLEAR = DOWN. / CHKSWT, 0 CLA; TAD SWITCH / ALLOW OVERRIDE OF HARDWARE SWR SNA; LAS / OR IN CASE OF 8/A WITHOUT SWR AND I CHKSWT ISZ CHKSWT SNA CLA; ISZ CHKSWT JMP I CHKSWT OS8DIS, PRINT; TREALL / PRINT AWHILE IOF 6007 / DO AN INIT. JMP I .+1; 7605 DEBUGX, JMS DEBENT JMP I ICONT E24, PAGE / ESTATD - ERROR STATUS DUMP ESTATD, 0 STA; TAD JLOOKTB; DCA ERPTR / START WITH FIRST ONE. ESTATL, ISZ ERPTR TAD I ERPTR / GET A STATUS VALUE FOR LOOKING AT SNA; JMP ESTATF JMS I JLOOKST / LOOK IT UP AND SET POINTERS. NOP / IGNORE NOT FOUND RETURN TAD I STTPTR; CDF 0 / GET VALUE AND RESET FIELD SNA; JMP ESTATL / TRY NEXT ONE IF NO ERRORS OF THIS TYPE DCA DCOUNT PRINT; TSTEQ / " ST=" TAD I ERPTR; PRINTO / PRINT STATUS I.D. PRINT; TNUMEQ / " #=" TAD DCOUNT; PRINTO JMP ESTATL ERPTR, 0 ESTATF, CDF 10 TAD I STTPTR; CDF 0 SNA; JMP ESTATX DCA DCOUNT PRINT; TOTHER / PRINT " OTHER=" TAD DCOUNT; PRINTO ESTATX, PRNTCR JMP I ESTATD JLOOKST, LOOKST
/VEP TEXT STRINGS / / TNAME, TEXT "DSD VEP210-V4E" TLOGDV, TEXT "DRIVE #'S :" TOPTON, TEXT "A,B,F,S,R,V OR D:" TNTDON, TEXT " DONE SET " TTRREQ, TEXT " TRN-REQ SET " TSPACE=.-1 STNOEF, 1617 / TEXT "NO" TERFST, TEXT " ERROR FLAG SET " TRXESE, TEXT " RXES = " TORMAT, TEXT "ORMAT DRIVE :" TENBLF, TEXT " ENABLED? F" TREALL, TEXT " REALLY? " TPROC, TEXT " PROCEDING " TACSET, TEXT "AC SET=" TAT, TEXT " @ " TNOINT, TEXT " NO INTERRUPT! " STIMOT, TEXT " TIME-OUT " TEXT12, TEXT "STATUS=" TEXT13, TEXT "READ ERR." TEXT14, TEXT "WRITE ERR" TEXT30, TEXT "DATA ERR." TEXT33, TEXT "ADDR=" TEXT34, TEXT " WROTE=" TEXT35, TEXT " READ=" TTOTRD, TEXT " TOT READS=" TTOTWT, TEXT " WRITES=" TTOTER, TEXT " DATA-ERRS=" THDWER, TEXT " HDW ERRS=" TERRTO=THDWER+2 TATDSK, TEXT " DSK" TBLKEQ, TEXT " BLK=" TTSP, TEXT " T,S=" TEXDEV, TEXT " DEV " TDELDT, TEXT "DELETED DATA ERR:" TSTATR, TEXT " STATUS ERR - " TEXPC, TEXT " EXP " TSTEQ, TEXT " ST=" TNUMEQ, TEXT " #=" TOTHER, TEXT " OTHER=" / SECTOR LIST FOR A 4 WAY INTERLEAVE FOR SLOWER PROCESSORS. / THIS RESULTS IN AN EFFECTIVE 4 WAY INTERLEAVE WHEN ACCESSED IN / THE OS/8 SECTOR # SEQUENCE OF 1,3,5,7,11...31,2,4,6,10,...30,32 SCT4WY, 1; 2; 17; 20 3; 4; 21; 22 5; 6; 23; 24 7; 10; 25; 26 11; 12; 27; 30 13; 14; 31; 32 15; 16 E30, PAGE
/ FORMAT FUNCTION - WRITES SECTOR I.D. MARKS AND INITIALIZES / DATA TO "IBM EMPTY" FORMAT. / CONTROLLER DOES FORMAT WHEN A WRITE TO SECTOR 152 / IS SPECIFIED ON A TRACK. / THE CONTROLLER THEN EXPECTS A SEQUENCE OF 26 SECTOR #'S. / TO BE XDR'D INTO IT AND THEN WRITES OUT THOSE SECTOR / NUMBERS IN THE ORDER GIVEN ONTO THE SPECIFIED TRACK. JWRTDL, WRTDLF FMTSCT, 152 / SPECIFY FORMAT MODE. MENDBF, -DATBUF-177 FMTNSC, -32 / FORMAT WITH 26 SECTORS. SCTLSP, 0 / SECTOR LIST POINTER FMTERR, 0 PRINT; TENBLF FORMAT, PRINT; TORMAT / FORMAT DRIVE : JMS I IOCTIN / GET AN OCTAL # FMTFLG, 0 FMTUNT, 0 TAD FMTFLG; SZA CLA / NO VALID # TYPED. SAM3; TAD FMTUNT / VALID UNIT # SMA CLA; JMP I ICONT SA3; AND FMTUNT; CLL RAL; STL RTL; RAL / 20 * UNIT # + 4 DCA WRTCMD TAD WRTCMD; TAD B10 / GENERATE A WRITE DELETED DATA DCA I JWRTDLF / SET UP FOR DELETED DATA. PRNTCR PRINT; TSEQFM / " SEQUENTIAL FORMAT? " JMS I IGTCHR / "N" TO DO INTERLEAVED FORMAT TAD (-"N; SNA CLA / NO SKIP IF N TYPED TAD (SCT4WY-SCTLST / DO INTERLEAVED TAD (SCTLST-1 / OTHERWISE DO SEQUENTIAL FORMAT. DCA SCTLSP DCA TRACK / START AT TRACK 0 INITS / FORCE INTERRUPT DISABLED AND CLEAR FLAGS. SSERFA, SERF / SKIP TO CLEAR FLAG. LSTTRK, 114 / FORMAT TRACKS 0-76 INCLUSIVE. FMTSCL, SDNFS / WAIT FOR DONE TO COME UP. TAD WRTCMD LCDRF, LCDR; JMS I IACSET / CHECK AC CLEARED. TAD FMTSCT; JMS XDRLD; JMS FMTERR / "FORMAT SECTOR" TAD TRACK; JMS XDRLD; JMS FMTERR / ON THIS TRACK FMTOK, TAD SCTLSP; DCA X0 / GET POINTER TO SECTOR LIST TAD FMTNSC; DCA DCOUNT FSCTLP, TAD I X0; JMS XDRLD; JMS FMTERR / LOAD THE SECTOR LIST ISZ DCOUNT; JMP FSCTLP ISZ TRACK / DO ANOTHER TRACK? TAD TRACK; CIA; TAD LSTTRK SMA CLA; JMP FMTSCL / YES / DATA INITIALIZATION TO IBM FORMAT FOR EMPTY DISHETTE TAD (FMTTBL-1; DCA 17 / SET UP TO INIT DATA IN TRACK 0 DCA TRACK / FORCE TO TRACK 0. SDNFS / WAIT FOR DONE SET. DATINT, STA; TAD BUFPT; DCA 16 TAD I 17; SNA; JMP FMTXT / CHECK FOR TABLE END. DCA WRTSUB / SUBROUTINE TO WRITE OUT THE SECTOR. TAD I 17; DCA SECTOR TAD I 17; DCA LSTSCT CHRLP, STA; DCA DCOUNT TAD I 17; SNA; JMP I WRTSUB /END OF SECTOR - GO WRITE SMA; JMP .+3 DCA DCOUNT TAD I 17; DCA TEMP TAD TEMP CDF 10; DCA I 16; CDF 0 ISZ DCOUNT; JMP .-5 TAD MENDBF / CHECK FOR .LE. 128. BYTES TAD 16; SMA SZA CLA; HLT /DON'T RUN ON JMP CHRLP WRTSUB, 0 WRTNRM, JMS LDBUF /LOAD THE BUFFER FROM CORE BUFFER JMS EXTKSC /LOAD IN 8 BIT MODE. WRTCMD, 24 / WRITE NORMAL DATA UNIT 1. JMS FMTERR / ERROR WRTRET, ISZ SECTOR TAD SECTOR; CIA; TAD LSTSCT SMA CLA; JMP I WRTSUB /LOOP TILL FIN JMP DATINT FMTXT, STA; TAD SECTOR; TAD FMTNSC SZA CLA; HLT JMP I ICONT LSTSCT, 0 / LAST SECTOR # TO BE WRITTEN. E32, PAGE
/ WRTDEL - WRITE DELETED DATA ON CURRENT SECTOR, TRACK / LOADS BYTE 11, 12 WITH CURRENT SECTOR #. WRTDEL, TAD WEB0 / INIT HIGH DIGIT OF SECTOR NUMBER CDF 10; DCA I JDATBF / IN DATBUF TO EBCDIC 0 TAD SECTOR TAD WM12; SPA; JMP .+3 ISZ I JDATBFE; JMP .-4 / GET HIGH DECIMAL DIGIT TAD B12; TAD WEB0 / LOW DIGIT OF SECTOR # DCA I JDATBFE+1 / LOAD IT. CDF 0 / RESTORE TO THIS FIELD. JMS LDBUF / LOAD BUFFER (8 BIT MODE.) JMS EXTKSC / WRITE DELETED DATA SPECIFIED UNIT WRTDLF, 14 / 14 + 20 * UNIT #. JMS I JFMTERR / ERROR JMP I .+1; WRTRET JFMTER, FMTERR JDATBF, DATBUF+11; DATBUF+12 WEB0, EB0 WM12, -12 / EXTKSC - EXECUTE COMMAND FOLLOWING CALL / USE CONTENTS OF SECTOR, TRACK AS DATA. / JMS EXTKSC; COMMAND / ERROR RETURN / NORMAL RETURN EXTKSC, 0 M200, CLA+400; TAD I EXTKSC; ISZ EXTKSC / GET THE COMMAND. LCDRF1, LCDR JMS I IACSET TAD SECTOR; JMS XDRLD; JMP EXTKER TAD TRACK; JMS XDRLD; JMP EXTKER / TRACK ISZ EXTKSC / SKIP RETURN = GOOD EXTKER, SDNFS / WAIT FOR DONE TO COME UP. JMP I EXTKSC
/ XDRLD - LOAD A WORD INTO SECTOR BUFFER XDRLD, 0 DCA XDRTMP SERFF, SERF; SKP; JMP I XDRLD / ERROR RETURN STRFF2, STRF; JMP .-4 TAD XDRTMP XDRF1, XDR; CIA; TAD XDRTMP JMS I IACSET SERFF1, SERF; SKP; JMP I XDRLD / CHECK AFTER 2ND TRANSFER. ISZ XDRLD JMP I XDRLD XDRTMP, 0 / LDBUF8 - LOAD SECTOR BUF IN 8 BIT MODE FROM DATBUF LDBUF, 0 STA; TAD BUFPT; DCA X0 / DATA BUFFER TAD FILBF8 LCDRF2, LCDR JMS I IACSET TAD M200; DCA DCOUNT LDBFLP, CDF 10; TAD I X0; CDF 0 JMS XDRLD; JMP .+3 ISZ DCOUNT; JMP LDBFLP SDNFS / INSURE IN SYNC. JMS I IACSET JMP I LDBUF FILBF8, 100 / FILL BUFFER IN 8 BIT MODE. TSEQFM, TEXT " SEQUENTIAL FORMAT? " SCTLST, 1; 2; 3; 4 5; 6; 7; 10 11; 12; 13; 14 15; 16; 17; 20 21; 22; 23; 24 25; 26; 27; 30 31; 32
/ FMTTBL TO INIT TRACK 0 TO IBM INITIAL STATE / ENTRY FORMAT. / WD 0 POINTER TO WRITE OUT ROUTINE. / WD 1-2 FIRST - LAST SECTOR WITH FOLLOWING DATA / WD 3-N DATA SPECIFIER WORDS. SINGLE CHAR VAL IF POSITIVE / REPEAT COUNT IF NEGATIVE, FOLLOWED BY CHAR VALUE WORD. / ABOVE REPEATED UNTIL 0 TERMINATOR WORD FOUND. / NEXT ENTRY OR TABLE TERMINATOR WORD OF 0. BLANK=100 / EBCDIC BLANK EBA=301 / EBCDIC CHAR DEFS. EBB=EBA+1 EBD=EBA+3 EBE=EBA+4 EBH=EBA+7 EBI=EBA+10 EBL=323 EBM=EBL+1 EBO=EBL+3 EBP=EBL+4 EBR=EBL+6 EBT=343 EBV=EBT+2 EBW=EBT+3 EBX=EBT+4 EB0=360 EB1=EB0+1 EB2=EB0+2 EB3=EB0+3 EB4=EB0+4 EB5=EB0+5 EB6=EB0+6 EB7=EB0+7 EB8=EB0+10 EB9=EB0+11 DECIMAL FMTTBL, WRTNRM / WRITE NORMAL DATA AS SPECIFIED 1; 4 / SECTORS 1-4 -80; BLANK -48; 0 0 WRTNRM 5; 5 / SECTOR 5 EBE / "ERMAP" IN EBCDIC EBR EBM EBA EBP -75; BLANK -48; 0 0 WRTNRM 6; 6 / SECTOR 6 -80; BLANK -48; 0 0 WRTNRM 7; 7 / SECTOR 7 EBV / "VOL1IBMIRD" IN EBCDIC EBO EBL EB1 EBI EBB EBM EBI EBR EBD -69; BLANK EBW / "W" -48; 0 0 WRTNRM 8; 8 / SECTOR 8 EBH / "HDR1 DATA 080 01001" EBD EBR EB1 BLANK EBD EBA EBT EBA -15; BLANK EB0 EB8 / LOGICAL RECORD LENGTH OF 80. CHARS. EB0 BLANK EB0 EB1 EB0 EB0 EB1 BLANK EB7 / END OF EXTENT INITIALIZED AS EB3 / TRACK 73 EB0 EB2 / SECTOR 26 EB6 -35; BLANK EB0 / END OF DATA INITIALIZED AS EB1 / TRACK 1 EB0 / SECTOR 1 EB0 EB1 BLANK -48; 0 0 / REMAINING SECTORS WRITTEN AS DELETED DATA CONTAIN DIRECTORY WRTDEL 9; 26 EBD EBD EBR EB1 BLANK EBD EBA EBT EBA EB0 / SECTOR #, HIGH DIGIT EB0 / SECTOR #, LOW DIGIT. -13; BLANK EB0 / LOGICAL RECORD LENGTH EB8 / INITED AS 080 EB0 BLANK EB7 / BEGINNING OF EXTENT INITED AS 73 EB4 EB0 / SECTOR 1 EB0 EB1 BLANK EB7 / END OF EXTENT INITIALIZED AS TRACK 73 EB3 EB0 / SECTOR 26 EB2 EB6 -35; BLANK EB7 / END OF DATA INITIALIZED AS TRACK 74 EB4 EB0 EB0 EB1 BLANK -48; 0 0 0 / END OF TABLE OCTAL PAGE
/ DEVCHG - DEVICE CODE CHANGE: / HERE ON "D" TO "A,B,F,S,R OR D:" DEVCHG, TAD JCYCTB; DCA CYCPTR / INIT TO FIRST DEVICE. DEVGLP, PRINT; TEXDEV / PRINT DEVICE # TAD I CYCPTR; PRINTO / CURRENT VALUE. PRNT2C; 7240 / ": " JMS I IOCTIN / GET NEW VAL DEVFLG, 0 CURDEV, LCDR-ION / CURRENT VALUE TAD DEVFLG; SZA CLA; JMP DEVNXT-2 TAD YTTICH; CIA; TAD B240 / WAS IT A SPACE SNA CLA; JMP DEVNXT / YES - JUST LOOK JMP DEVSET / NO - GO TERMINATE THE LIST. TAD CURDEV; TAD (-500 / MUST BE .GE. 500 SMA CLA; JMP DEVGLP TAD CURDEV; DCA I CYCPTR DEVNXT, ISZ CYCPTR TAD CYCTBN; TAD CYCPTR / END OF TABLE? SPA CLA; JMP DEVGLP / GET NEXT DEV CODE. DEVSET, DCA I CYCPTR / INSERT A TERMINATOR TAD CYCTBL; JMS DEVCSB / SET THE DEVICE CODE INITS / ROOM FOR AN INIT ON CYCLE. JMP I ICONT / RESTART AT "ABFSRD OR V" CYCTBN, -BLKLMT+2 / CYCLE -CYCLE THROUGH DEVICE #'S (0XY0) IN CYCTBL. / INITIALIZED BY INIT / IF NO ENTRIES (CYCTBL=0) DOES NOTHING AND TAKES SKIP RET / IF ONLY ONE ENTRY LOADS THAT DEV CODE & TAKES RECYCLE RET / IF > 1 ENTRY CYCLES THROUGH ALL DEVICES ENTERED. / TABLE IS TERMINATED BY 0 / JMS CYCLE; RETURNS IF ANOTHER DEVICE; RECYCLE RETURN CYCLE, 0 JMS I ICKSWT; 0100; JMP NOCYCLE / DISABLE IF SW5 UP. TAD CYCPTR; SZA CLA; JMP .+4 / RESET IF 0 TAD JCYCTB; DCA CYCPTR ISZ CYCLE / EXIT SET UP WITH FIRST ENTRY. CYCPUR, TAD I CYCPTR; SNA; JMP CYCXT / NO MORE ENTRIES. SMA; JMP .+3 / PURGED IF NEGATIVE. ISZ CYCPTR; JMP CYCPUR / PURGED - TRY NEXT ENTRY. JMS DEVCSB / DEVICE CHANGE SUB. JMS I ISETDON TAD CYCPTR; CMA; TAD JCYCTB / GET DEVICE OFFSET. DCA DCOUNT TAD CDEVLN ISZ DCOUNT; JMP .-2 TAD CSTBUF; DCA STTPTS / POINTER TO STT BLK THIS DEVICE TAD CYCPTR; DCA PRGPTR / INIT PURGE POINTER. STL CLA IAC RAL; AND I CYCPTR / LOW 2 BITS OF CODE SNA; JMP CYCFIN / DON'T CHANGE IF 0. TAD BLKLMT; DCA X0 / ARE USED FOR TABLE OFFSET TAD I X0; DCA X0 / GET ACTUAL ENTRY PTR. STA; TAD DEPT; DCA X1 / PTR TO DRIVE END BLK TABLE SAM3; DCA DCOUNT / COUNTER. BLKLML, TAD I X0; DCA I X1 / LOAD DRVE0 TABLE. ISZ DCOUNT; JMP BLKLML CYCFIN, ISZ CYCPTR / NEXT DEVICE CODE CYCXT, TAD I CYCPTR; SNA CLA; DCA CYCPTR / SET TO 0 IF END JMP I CYCLE / EXIT, DO ANOTHER ENTRY. NOCYCLE, ISZ CYCLE; JMP I CYCLE CDEVLN, STLDEV / STATUS LENGTH EACH DEVICE. CSTBUF, STTBUF-STLDEV JCYCTB, CYCTBL / POINTER TO CYCLE TABLE. CYCPTR, 0 / POINTER INTO CYCTBL: 0 ON RECYCLE. CYCTBL, LCDR-ION / LIST OF DEVICE CODES IN FORM 0XYD,0ZAD,0 0 ZBLOCK NUMDEV / ALLOCATE FOR DEVICE CODES. BLKLMT, .-1 / AUTO INDEX BASE FOR BLOCK LIMIT TABLE. FLPONE-1 / SINGLE DRIVE FLPTWO-1 / 2 DRIVE SYSTEM. FLPTHR-1 / 3 DRIVES FLPONE, 755; 0; 0 FLPTWO, 755; 755; 0 FLPTHR, 755; 755; 755 / LABCYC - PRINTS " DEV XY" WHERE XY IS MIDDLE 6 BITS / OF CURRENT ENTRY IN CYCTBL / DOES NOTHING UNLESS 2 OR MORE ENTRIES IN CYCTBL. LABCYC, 0 CLA TAD CYCTBL+1; SNA CLA; JMP I LABCYC / EXIT IF NOT >1ENTRY PRINT; TEXDEV / " DEV " TAD CURDEV; PRINTO JMP I LABCYC PAGE
/ ROUTINE TO ACTUALLY PATCH DEV-CODES. PATSUB, 0 AND MSKDEV DCA CURDEV PATLP, TAD I PATSUB; SNA; JMP I DEVCSB / RETURN TO CALLER DCA DEVPTR /ADDRESS OF IOT TO BE CHANGED TAD I DEVPTR AND IOTSTR TAD CURDEV /NEW DEVICE CODE DCA I DEVPTR ISZ PATSUB JMP PATLP MSKDEV, 0770 IOTSTR, 7007 DEVPTR, 0 / ROUTINE TO ACTUALLY CHANGE THE DEVICE CODE. DEVCSB, 0 JMS PATSUB IOTLST, CURDEV; LCDRD ERLCDR LCDRF; LCDRF1; LCDRF2; LCDRX XDRS1; XDRS2 XDRD XDRD1; XDRD2; XDRF1 CHKTRQ; STRFD; STRFF2 CKSTEQ+1 CHKERF; SSERFA; SERFF; SERFF1; SERFD SDNF1; CONSTT; TIMEDX ERSDNF; SDNFSL; SETERF+1; SETERF+2 SINTRD; XX3; ERINTRD XX4; XX4A; XX5; XX6 XX7; XX9; XX10; XX12; XX14 STFG1; STFG2 INITSB+1 0; 0 / TABLE OF ACCUMULATED STATUS VALUES USED TO ESTABLISH / COUNT POSITIONS IN STTBUF LOOKTB, 40; 50; 70; 100 110; 120; 140; 150 160; 170; 200; 210 1; 2; 3; 0; 0 / LOOKST - LOOK UP STATUS VALUE IN AC IN LOOKTB / JMS LOOKST / C(AC) = STATUS TO BE LOOKED UP. / RETURNS IF NOT FOUND WITH STTPTR SET AT END / RETURNS WITH STTPTR POINTING TO COUNT FOR VALUE. LOOKST, 0 DCA STATVL TAD (LOOKTB-1; DCA STTPTR LOOKSL, ISZ STTPTR TAD I STTPTR; SNA; JMP LOOKSX / DO NOT FOUND RET CIA; TAD STATVL SZA CLA; JMP LOOKSL / TRY AGAIN. ISZ LOOKST LOOKSX, TAD STTPTR; TAD (-LOOKTB+10 / CONVERT TO OFFSET VALUE JMS I ISETBKP / SET STTPTR FOR THIS OFFSET, DRIVE JMP I LOOKST STATVL, 0 / INCSTT - INCREMENT SINGLE PRECISION STATUS AND PURGE IF / COUNT .GE. MAXERR / JMS INCSTT / STATUS VAL IN AC / RETURNS WITH STTPTR SET TO CURRENT STATUS / CURRENT STATUS IS INCREMENTED AND CHECKED AGAINST MAXERR INCSTT, 0 JMS LOOKST / LOOK IT UP NOP / FIRST 0 STATUS = OTHER ISZ I STTPTR TAD I STTPTR; TAD MAXERR CDF 0 SPA CLA; JMP I INCSTT / DON'T PURGE TAD I PRGPTR; CLL RAL; STL RAR / SET HIGH BIT TO PURGE DCA I PRGPTR JMS I ICYCLE; NOP JMP I INCSTT E42, PAGE
/ COMNDS WAIT FOR DONE SET - IF INTERRUPT OCCURS SETS DSKDON / THEN START EXECUTION OF COMMAND IN AC. COMNDS, 0 DCA WTDNAC DCA DCOUNT / INIT TIMEOUT COUNTER TO 0 OR 1. / SA4000; DCA DSKDON / ALLOW INITIAL INTERRUPT IF DONE SET. NOP; NOP TAD DSKINE / IS INTERRUPT ENABLED? SINTRD, SINTR / SET INTERRUPT STATUS. SNA CLA; JMP SDNFL / GO WAIT FOR DONE FLAG TO SKIP. TAD DELCT; DCA WT25CT / INIT DOUBLE PREC DELAY INTLP, TAD DSKDON; CMA SNA CLA; JMP WTDNX / SET UP FOR NEXT INT. ISZ DCOUNT; JMP INTLP / INNER DELAY LOOP ISZ WT25CT; JMP INTLP / FINALLY TIMED OUT. JMP PNOINT / WAIT LOOP FOR INTERRUPT DISABLED. SDNFL, SDNFS / WAIT FOR DONE FLAG SET AND TO SKIP DCA DSKDON; JMP WTDNX / PRINT "NO INTERRUPT ERROR MESSAGE!" PNOINT, JMS I ICKSWT; 3000; JMP TIMEDX PRNTCR PRINT; TNOINT /NO INTERRUPT ! TIMEDX, SDNF / IF STILL NO INTERRUPT JMS I PDSKADR / THEN TYPE FROM WHERE IT WAS LOST JMP WTDNX INITS / ALLOW AN INIT IF DESIRED. WTDNX, TAD DSKINE; CLL RTR / 1=> 4000, 0=>0 DCA DSKDON TAD WTDNAC LCDRD, LCDR JMS I IACSET JMP I COMNDS WTDNAC, 0
WT250, 0 TAD DELCT; DCA WT25CT / -130 (8) TAD DSKDON; TAD DSKINE / HAS AN INTERRUPT OCCOURED? SNA CLA; JMP WT25X ISZ WT25CT; JMP .-5 ISZ DCOUNT; JMP WT25X PRINT; STIMOT JMP I WT250 WT25X, ISZ WT250 JMP I WT250 WT25CT, 0 / GETERS - GET ERROR STATUS (LOADS ERRSTT) / DOES DEFINITIVE ERROR STATUS AND STARTS AN INIT. GETERS, 0 CLA ERINTRD, SINTR / DISABLE INTERRUPTS. XDRD1, XDR; DCA RXES / READ RXES STATUS. TAD RXES; MQL ERSDNF, SDNF; ISZ WT25CT; JMP ERSDNF / CLEAR DONE FOR WAIT. JMS I IACSET TAD RDERST / GET FUNCTION 7 ERLCDR, LCDR JMS I IACSET SDNFS / WAIT FOR DONE. XDRD2, XDR; DCA ERRSTT JMS SETDON / RAISE DONE FLAG. JMP I GETERS RXES, 0 / MODE 5 STATUS STORED HERE. RDERST, 116 / READ STATUS IN 8 BIT MODE. / ROUTINE TO WAIT FOR DONE SET AND TIME OUT AFTER 1 SEC. / PRINTS DEVICE - DISK ADDR, TIMEOUT MESSAGE. / SDNFS = JMS I ISDNFS SDNFSB, 0 CLA; TAD DELCT; DCA WT25CT SDNFSL, SDNF; SKP; JMP I SDNFSB / NORMAL EXIT. ISZ DCOUNT; JMP SDNFSL ISZ WT25CT; JMP SDNFSL / TIMED OUT - PRINT IT AND TRY TO INIT. JMS I PDSKADR / PRINT DEVICE AND DISK ADDR. PRINT; STIMOT TAD SDNFSB; PRINTO SA1; JMS INCSTT / BUMP TIMEOUT STATUS PRNTCR NOP / INITS / OPTIONAL INIT ON TIMEOUT. JMP I SDNFSB DELCT, -240 / ROUTINE TO DO AN INIT / INITS = JMS I IINITS INITSB, 0 INIT JMP I INITSB / SETDON - ROUTINE TO SET DONE FLAG AGAIN WITHOUT INITING. SETDON, 0 CLA TAD X7130 LCDRX, LCDR JMS I IACSET TAD X7130; DCA DCOUNT ISZ DCOUNT; JMP .-1 JMP I SETDON X7130, 7130 E44, PAGE
/ STANDARD OS/8 CALL SEQUENCE USED BY DRIVER. / JMS SYS / AC CLEARED ON ENTRANCE AND NORMAL RETURN / FUNCTION WORD / W P P P P P F F F X X X / / W = 1 FOR WRITE. / / PPPPP = #128. WD PAGES XFERRED. / / FFF = DATA TRANSFER MEMORY FIELD. / STARTING CORE TRANSFER ADDRESS. / STARTING LOGICAL DISK BLOCK (0-755) (2 PAGES/BLOCK) / ERROR RETURN / AC = 4000 / NORMAL RETURN / NO ERRORS DETECTED FUNCT, 0 / 0 = WRITE, 2 = READ. TRNADR, 0 / CORE TRANSFER ADDRESS. SECADR, 0 / 4 * OS/8 BLOCK #. WRDCNT, 0 / - # WORDS TO BE TRANSFERRED. / CMDSUB - WAITS FOR DONE THEN DOES LOAD COMMAND. / CMDSUB, 0 / DCA XDSUB / ABORT KLUDGE. / TAD P7600 / KRS / OR IN LAST CHAR TYPED. / TAD MCTRLC / 7603+175 = 0 / SZA CLA / CTRL C TYPED? / JMP .+3 / NO: NOT RECENT CTRL C CDIFZR, CDF CIF 0 / RESTORE DATA AND INSTRUCTION FIELDS. / JMP I P7600 / GO TO MONITOR. / START OF ACTUAL CMDSUB / SDNF / JMP CMDSUB+2 / INCLUDE CTRL C CHECKER. / TAD XDSUB / RESTORE COMMAND. / LCDR / JMP I CMDSUB / XDSUB - TRANSFER DATA SUB. XDSUB, 0 DCA TEMP / ALLOW TIMEOUT DCA DCOUNT JMP .+3 / DON'T WAIT UNNECESSARILY. JMS WT250; JMP ERRHND / TIME-OUT GET ERROR STATUS. STRFD, STRF; JMP .-3 TAD TEMP XDRD, XDR JMP I XDSUB
/ DRIVER ENTRANCE FOR DRIVE # 0. ENTDX0, 0 P7600, CLA+400 JMP DRV0ENT UNITCD, 0 / DRIVER ENTRANCE FOR DRIVE # 1. ENTDX1, 0 CLA TAD ENTDX1; DCA ENTDX0 STL RTL / AC = 2, L=0 JMP DRV0EN /DRIVER ENTRANCE FOR DRIVE # 2. ENTDX2, 0 CLA; TAD ENTDX2; DCA ENTDX0 CLA CLL IAC RTL / AC=4, L=0 DRV0EN, STL RTL / AC = 2, 12, 22 FOR DRV 0, 1, 2. RAL / DRIVE 0 = 4, DRIVE 1 = 24, DRIVE 2 = 44. DCA UNITCD / UNIT CODE RDF / GET CALLING FIELD. TAD CDIFZR DCA CDFRET / SET UP RETURN FIELD. CLA STL RAR / AC = 4000, L=0 TAD I ENTDX0 / FUNCTION WORD AND P70 / GET TRANSFER FIELD. TAD CDFDAT DCA XFRFLD / SET DATA TRANSFER FIELD. CML RTL / AC=0 IF WRITE, =2 IF READ. DCA FUNCT TAD I ENTDX0 / GET PAGE COUNT RAL / MAKE INTO WORD COUNT. AND P7600 CIA / MAKE NEGATIVE. DCA WRDCNT ISZ ENTDX0 TAD I ENTDX0 / GET TRANSFER ADDRESS. DCA TRNADR ISZ ENTDX0 TAD I ENTDX0 / GET FLOPPY BLOCK #. MQL / DISPLAY IT. TAD I ENTDX0 / SET UP FOR SECTOR MAPPING. CLL RTL / 4 * BLOCK #. DCA SECADR ISZ ENTDX0 / DO THE READ OR WRITE. TAD FUNCT; SNA CLA; JMP RDWRITE / 2 => READ. TRNDTL, TAD WRDCNT; AND B77 / NEW SECTOR ? SZA CLA; JMP XFDTA / NO - TRANSFER DATA. JMS XEQSUB ISZ SECADR RDWRIT, TAD FUNCT JMS I ICOMNDS /CMDSUB / DO FILL OR EMPTY BUFFER CMD. XFRFLD, CDF 0 / LOADED IN CALL SEQ. DECODE. XFDTA, TAD I TRNADR JMS XDSUB DCA I TRNADR ISZ TRNADR P70, 70 ISZ WRDCNT; JMP TRNDTL TAD FUNCT; SNA CLA; JMS XEQSUB / DO FINAL WRITE. ISZ ENTDX0 / DO OK RETURN CDFRET, CDF CIF 0 JMP I ENTDX0 / XEQSUB - XEQUTE A READ OR WRITE SECTOR. XEQSUB, 0 CLL CLA RETRY, TAD FUNCT / 2=READ, 0=WRITE. TAD UNITCD JMS I ICOMNDS / CMDSUB DCA TRACK DCA TRACKH / ACCUMULATE HIGH ORDER SEPERATELY TAD SECADR / 4 * BLOCK # AS INCREMENTED. SECMCV, TAD M13T8D / COARSE CALCULATION IN 4 TRACK INCREMENTS SPA; JMP NRMCNV ISZ TRACKH JMP SECMCV / REMAINDER OF SECADR STILL IN AC BUT WRONG SIGN. NRMCNV, TAD (150 / MAKE POSITIVE AGAIN FOR REMAINING CALC. STL / SET LINK FOR INTERLEAVE CALCULATION BELOW CNVLP, SZL ISZ TRACK TAD M13D / SECTORS / TRACK REVOLUTION. SMA; JMP CNVLP CML RAL / 2*(-#SECTORS+LINK VAL) TAD P27 / MAKE INTO SECTOR OFFSET. JMS XDSUB / SEND THE SECTOR DCA SECTOR / NORMALLY CLA TAD TRACKH / MAKE TRACK CORRECT CLL RTL TAD TRACK JMS XDSUB DCA TRACK TAD P7130; JMS I ICOMNDS / RESTORE DONE FLAG AFTER WAIT. SERFD, SERF; JMP I XEQSUB ERRHND, JMS GETERS / GET ERROR STATUS AND INIT. JMP CDFRET P7130, STL RAR / FATAL ERROR INDICATOR. P27, 33 / # SECTORS + 1 CDFDAT, CDF 0 TRACKH, 0 PAGE
/ FILL - EMPTY BUFFER CHECK FOR PDP-8 BUFWAT, SDNFS / ENTER HERE ON "B JMS BUFTSB JMP .-2 BUFTSB, 0 / SUB TO STEP THROUGH ALL POSSIBILITIES. JMS I ISETDON / RAISE DONE FLAG IF NOT ALREADY SET SDNFS XX3, SDNF; JMP .+4 PRINT; TNTDON / SHOULD BE CLEARED BY FIRST SKIP. JMS I ILABCYC JMS BUFTST; 0; 0640; NOP / <F > -100; 140 / FILL BUFFER. JMS BUFTST; 2; 0540; STA / <E > -100; 140 / EMPTY BUFFER. JMS BUFTST; 100; 0670; NOP / <F8> -200; 077 / FILL BUF (8 BIT MODE) JMS BUFTST; 102; 0570; CLA / <E8> -200; 077 / EMPTY BUFFER 8 BIT MODE. JMS I ISETDON / INITS / LEAVE DONE FLAG UP. JMS I ICYCLE; JMP BUFTSB+1 / DO ALL DEVICES. JMP I BUFTSB / LEAVES DONE FLAG SET. BUFTST, 0 CLA TAD I BUFTST; DCA COMMAND / LOAD THE COMMAND. ISZ BUFTST TAD I BUFTST; DCA IDSTRN+1 ISZ BUFTST TAD I BUFTST; DCA INITAC / INIT THE AC. ISZ BUFTST TAD I BUFTST; DCA TRNCTR / # BYTES TO TRANSFER. ISZ BUFTST TAD I BUFTST; DCA INITDT / INITIAL DATA. ISZ BUFTST / INIT TO FILL BUFFER COMMAND. IDSTRN, PRNT2C; 4040 / PRINT ID STRING. TAD NUMPAS; DCA PASCTR OUTLP, CLA NOP; NOP TAD COMMAND / 0 = FILL, 2 = EMPTY XX4, LCDR JMS I IACSET / ERROR IF AC NOT ZERO TAD TRNCTR; DCA CTR TAD INITDT; DCA DATA LOOP, TAD DATA; MQL CLA TAD DATA XX4A, STRF; JMP .-1 INITAC, NOP / SET TO NOP, STA OR CLA XX5, XDR; DCA RDDTA TAD RDDTA; NOP / HALT FOR LOOKING AT. CIA; TAD DATA / CHECK THE DATA AND DATMSK SNA CLA; JMP ERRFIN / DATA CHECKS OK? JMS I ILABCY / PRINT DEVICE CODE. TAD RDDTA; PRINTO PRINT; TSPACE MQA; PRINTO ERRFIN, ISZ DATA; NOP ISZ CTR JMP LOOP XX6, CKTRNQ, STRF; JMP CHKDON / SHOULD FALL THROUGH PRNTCR PRINT; TTRREQ / EXTRA TRANSFER REQUESTS UP JMS I ILABCYC / PRINT DEVICE ID XX7, XDR IAC JMP CKTRNQ / RETRY TILL FINALLY CLEARED. XX9, CHKDON, SDNF; JMP CKTRNQ XX10, SDNF; JMP NXTPAS / SHOULD NEVER HALT. PRNTCR PRINT; TNTDON / ERROR - DONE SET AFTER SDNF SKIPS JMS I ILABCYC NXTPAS, ISZ PASCTR; JMP OUTLP JMP I BUFTST COMMAND, 0 / LOADED WITH FILCMD OR EMPCMD INITDT, 140 / INITIAL DATA VALUE. DATA, 0 / DATA COUNTS STARTING WITH INITDT TRNCTR, -100 / 100 IN 12 BIT MODE, 200 IN 8 BIT MODE. CTR, 0 NUMPAS, -2000 RDDTA, 0 DATMSK, 7777 PASCTR, 0 PAGE / PROG TO READ ERROR STATUS. RDSTT, SDNFS CLA TAD RDSCM XX12, LCDR CLA SDNFS XX14, XDR HLT JMP I .+1; BUFWAT+2 RDSCM, 116 / TEST TO SET ERROR FLAG AND CHECK FOR SKIP SETERF, 0 SDNF / INITS / SHOT GUN IT AGAIN. SINTR / SET INTERRUPT STATUS TO 0. CLA IAC; DCA SECTOR / DO READ FROM TRACK 78!! TAD TRK80; DCA TRACK / SET TO TRACK 80. JMS EXTKSC; 7 JMP STFG1+2 / SERF ALREADY SKIPPED. ISZ DCOUNT; JMP .-1 STFG1, SERF; JMS EXPERR NOP DCA TRACK DCA SECTOR JMS EXTKSC; 7 / READ SECTOR 0 - SETS LIGHT 2. JMP STFG2+3 / SERF ALREADY SKIPPED. ISZ DCOUNT; JMP .-1 STFG2, SERF; JMS EXPERR NOP / DO A DELETED DATA CHECK AS WELL CLA IAC; DCA SECTOR DCA TRACK / START AT TRACK 0 CHKWDL, JMS EXTKSC; 114 / WRITE DELETED DATA FUNCTION. JMS ERDELD / ERROR WRITING DELETED DATA JMS CKSTEQ; 100 / STATUS SHOULD EQUAL 100 ISZ TRACK TAD TRACK; TAD (-115 SPA CLA; JMP CHKWDL NOP / NOW READ IT BACK DCA TRACK CHKRDL, JMS EXTKSC; 6 / READ THE SECTOR JMS ERDELD JMS CKSTEQ; 100 / SHOULD SET DELETED DATA FLAG. ISZ TRACK TAD TRACK; TAD (-115 SPA CLA; JMP CHKRDL NOP JMS I ICYCLE; JMP SETERF+1 / DO ALL DEVICES. JMP I SETERF TRK80, 120 / TRACK 80. EXPERR, 0 PRNTCR PRINT; STNOEF / NO ERROR FLAG JMS I ILABCYC / PRINT DEVICE ID TAD EXPERR; PRINTO JMP I EXPERR / ERDELD - ERROR ON DELETED DATA ERDELD, 0 TAD .-1; PRINTO / PRINT ADDRESS DETECTED. PRINT; TDELDT PRNTCR JMP I ERDELD / CKSTEQ - CHECK THAT STATUS EQUALS SPECIFIED VALUE CKSTEQ, 0 XDR; DCA DSTATT / SAVE TEMP STATUS. TAD DSTATT; CIA; TAD I CKSTEQ / IS IT THE SAME AND STTMSK / ONLY LOOK AT LOW BYTE. SNA CLA; JMP CKSTQX JMS I ILABCYC / PRINT DEVICE ID PRINT; TSTATR / "STATUS ERR @" TAD CKSTEQ; PRINTO PRINT; TRXESE / "RXES = " TAD DSTATT; PRINTO PRINT; TEXPC TAD I CKSTEQ; PRINTO PRNTCR SA3; JMS INCSTT / STATUS # 3. CKSTQX, ISZ CKSTEQ JMP I CKSTEQ DSTATT, 0 STTMSK, 377 PAGE
/ ODT FOR FLPEXR / COMMANDS AS IMPLEMENTED. / (/) OPENS CURRENT LOC FOR MODIFICATION / (N/) OPEN CONTENTS OF LOC N / (@) USE CONTENTS OF LAST OPEN LOC AS ADDRESS OF NEXT OPEN / (LF) OPEN NEXT LOCATION AFTER LAST OPEN LOC. / (^) = UP ARROW OPENS LOC PREVIOUS TO LAST ONE OPEN. / (>) OPENS LOC ADDRESSED BY CURRENT LOC IF IT IS A MRI / FOLLOWS A LEVEL OF INDIRECT IF SET. / (F) SETS MEMORY FIELD FOR G, P, SEARCH COMMANDS. / (R) RETURN TO CALLER. / (M) MASK FOR SEARCHES / (M+<LF>) LOWER LIMIT FOR SEARCH / (M<LFLF>) UPPER LIMIT FOR SEARCH / (N,M(D)) DUMP MEMORY FROM N THROUGH M 8 WORDS / LINE. / ROUTINES USED - OCTIN, OCTOUT, ADDROUT, GETCHR, PCHAR / DISPAT, PSTR4C DEBRET, JMP I DEBENT / RETURN TO CALLER DEBENT, 0 DEBUGC, PRNTCR / TYPE A CRLF DEBUG, JMS I IOCTIN / SEE IF A NUMBER FIRST. FRSFLG, 0 / FLAG FOR VALID FIRST ARGUMENT. / ALSO LOADS HGHDGT WITH 5TH DIGIT ENTERED. FRSARG, 0 / FIRST ARGUMENT. IOF JMS I IDISPT / CHECK IF TERMINATOR IS VALID COMMAND "/; OPEN / OPEN LOC 212; OPNNXT / <LF> = OPEN NEXT. 215; CLOSCR / <CR> = CLOSE CURRENT. "^; OPNPRV / UP ARROW = OPEN PREVIOUS. "<; OPNRET / RETURN TO PREVIOUS LF- ^ SEQUENCE ">; OPNMRI / OPEN LOC ADDRESSED BY CURRENT LOC "@; OPNADR / OPEN LOC AT ADDRESS OF CURRENT OPEN ",; DEBSCD / GET A SECOND ARGUMENT "D; DEBDMP / DUMP MEMORY RANGE SPECIFIED. "R; DEBRET / RETURN TO CALLER. 0 PRNT2C; 7740 / "? " JMP DEBUGC / VARIABLES USED BY DEBUG PACKAGE CUROPN, 0 / CURRENT OPEN LOCATION LSTCON, 0 / CONTENTS OF LOC CUROPN OPNSEQ, 0 / LAST SEQUENTIAL LOC LOOKED AT BEFORE @ OR ^ OPNFLG, 0 / MODIFYABLE IF = -1 OPEN, TAD FRSFLG; SNA; JMP OPNCUR TAD M4; SPA SNA CLA; JMP CURFLD TAD HGHDGT; TAD CDFZR0 / SET UP DATA FIELD INSTRUCTIONS. DCA OPNFLD / SET CURRENT DATA FIELD TAD OPNFLD; DCA LODFLD / FOR GETWRD AND LOADIT CURFLD, TAD FRSARG; DCA CUROPN OPNCUR, JMS GETWRD / GET A DATA WORD FROM CURRENT OPEN LOC. JMS I IOCTPNT / PRINT OPEN VALUE PRINT; TSPACE STA; DCA OPNFLG / SET SO MODIFYABLE JMP DEBUG CLOSCR, JMS LOADIT / LOAD ARG ON CR TYPED. JMP DEBUGC / ENTRANCE FOR LINE FEED TYPED. OPNNXT, JMS LOADIT / LOAD NEW CONTENTS IF ANY TAD B15; JMS I PCHARX / DO A CR ONLY ISZ CUROPN D177, 177 JMP OPNPSL-2 / SAVE FOR PREV SEQ RESTORE. / "^" = UP ARROW TYPED FOR PREV LOC. OPNPRV, JMS LOADIT STA; TAD CUROPN / DECREASE BY ONE SETCUR, DCA CUROPN PRNTCR TAD CUROPN; DCA OPNSEQ / LOAD FOR CURRENT SEQUENCE CONT OPNPSL, JMS PRNADR / PRINT CURRENT OPEN ADDRESS. PRNT2C; 5740 / "/ " JMP OPNCUR / "<" RETURN TO PREVIOUS LF OR ^ SEQUENCE AFTER A @ OR > BREAK OPNRET, JMS LOADIT / MODIFY IF SPECIFIED TAD OPNSEQ; IAC / OPEN NEXT IN SEQUENCE JMP SETCUR / LOC ADDRESSED BY ON ">" TYPED OPNMRI, JMS LOADIT TAD CUROPN; AND D7600; DCA CUROPN / EXTRACT PAGE ID TAD LSTCON; AND (200; SNA CLA; DCA CUROPN / PAGE 0 ? TAD LSTCON; AND D177; TAD CUROPN / GET DIRECT ADD DCA CUROPN / SET NEW CURRENT ADDRESS. TAD LSTCON; AND (400 / IS IT INDIRECT? SNA CLA; JMP OPNPSL / NO - USE CURRENT LOC OPNIND, JMS GETWRD / GET THE INDIRECT LOC ADDR DCA CUROPN PRNT2C; 5540 / "- " JMP OPNPSL / PRINT "- <ADDR>/ <CONTENTS>" D7600, 7600 / INDIRECT OPEN ON @ TYPED OPNADR, JMS LOADIT JMP OPNIND / GETWRD - GET WORD AT CUROPN IN CURRENT FIELD. GETWRD, 0 OPNFLD, CDF 0 TAD I CUROPN CDFZR0, CDF 0 DCA LSTCON; TAD LSTCON / UPDATE VAL OF LAST OPEN CONTENTS JMP I GETWRD / LOADIT - LOAD FRSVAL THROUGH CUROPN IF FRSFLG AND OPNFLG ARE SET LOADIT, 0 TAD FRSFLG; SZA CLA; ISZ OPNFLG; JMP I LOADIT TAD FRSARG; DCA LSTCON / UPDATE LAST CONTENTS LODFLD, CDF 0 TAD FRSARG; DCA I CUROPN / LOAD IT CDF 0 JMP I LOADIT PAGE / PRNADR - PRINT CURRENT OPEN ADDRESS AS A 5 DIGIT # PRNADR, 0 CLA / SAVE MEMORY TAD OPNFLD; CLL RAR; RTR / GET MEM FIELD NUMBER AND B7; SZA / DON'T PRINT IF 0 TAD B260; JMS I PCHARX / PRINT FIELD TAD CUROPN; JMS I IOCTPNT / PRINT ADDR. JMP I PRNADR
/ OCTAL DUMP ROUTINE. / PRINTS <ADDR> / <CONTENTS OF NEXT 8 OR 12 WORDS> / <BEGIN>,<END>D / 2ND ARG OPTIONAL. DEBDMP, TAD SCNARG; CIA; TAD FRSARG / VALID ADDRESS RANGE? SMA; STA / DO ONE ANYWAY STL RAR; STL RAR; STL RAR / NUMBER OF LINES DCA HGHDGT TAD FRSFLG; SNA CLA; JMP .+4 TAD FRSARG; AND P7770; DCA CUROPN DMPLP, PRNTCR JMS PRNADR / PRINT INITIAL ADDRESS. PRNT2C; 5740 / "/ " SAM2; DCA OCTNUM / DO 2 GROUPS OF 4 DMP4WD, TAD M4; DCA OCTDIG / # WORDS / GROUP JMS GETWRD; JMS I IOCTPNT / NO LZ SUPPRESS PRINT; TSPACE ISZ CUROPN ISZ OCTDIG; JMP DMP4WD+2 PRNT2C; 4040 / 3 SPACES IN MIDDLE ISZ OCTNUM; JMP DMP4WD ISZ HGHDGT; SKP; JMP DEBUGC JMS GTLSCH; JMP DMPLP JMP DEBUGC / EXIT ON CHAR TYPED. P7770, 7770
/ "," = GET SECOND ARGUMENT DEBSCD, JMS OCTIN / GET A VAL 0 / FLAG SCNARG, 0 / SECOND ARGUMENT. JMP FRSARG+1 / DON'T CLEAR FRSFLG / OCTIN - OCTAL INPUT ROUTINE / ACCEPTS 5 DIGIT OCTAL NUMBERS LEAVING THE HIGH DIGIT / IN HGHDGT FOR USE AS A MEMORY FIELD SET. / THE FIFTH DIGIT ONLY GETS MODIFIED WHEN 5 OR MORE DIGITS TYPED. / RUBOUT DECREASES THE # OF DIGITS STORED BY ONE WITH 5 AS MAX. / CALLING SEQUENCE / JMS I IOCTIN / FLAG / = NUMBER OF DIGITS TYPED / VALUE / OF LOW 4 DIGITS. / RETURNS. OCTIN, 0 CLA; DCA OCTNUM / CLEAR DIGIT SHIFT WORD DCA I OCTIN / CLEAR # TYPED FLAG. DCA HGHDGT OCTILP, JMS I IGTCHR / GET AN ASCII CHAR WITH PARITY SET TAD (-"0; SPA; JMP OCTEXT DCA OCTDIG TAD OCTDIG; TAD P7770 / OCTAL DIGIT? SMA CLA; JMP OCTINR / RUBOUT ASSUMED IF > 8 TAD OCTNUM; AND P7000; BSW / PUT IN MEM FIELD LOC DCA HGHDGT TAD OCTNUM; CLL RAL; CLL RAL; CLL RAL TAD OCTDIG; DCA OCTNUM ISZ I OCTIN / BUMP DIGIT COUNTER. JMP OCTILP OCTEXT, TAD I OCTIN; SNA CLA; JMP OCTNMD FLDUNC, ISZ OCTIN TAD OCTNUM; DCA I OCTIN / LOAD MODIFIED VALUE ISZ OCTIN JMP I OCTIN OCTNMD, ISZ OCTIN JMP .-3 OCTINR, TAD YTTICH; TAD (-377 / A RUBOUT? SZA CLA; JMP OCTEXT / NO - JUST EXIT. TAD I OCTIN; SNA CLA; JMP OCTIN+1 / CLEAR IT COMPLETELY PRNT2C; 7440 / \ = BACK SLASH TAD OCTNUM; CLL RAR; CLL RAR; CLL RAR DCA OCTNUM STA; TAD I OCTIN / DECREMENT DIGIT COUNT JMP OCTILP-2 / SET NO # FLAG. OCTNUM, 0 OCTDIG, 0 HGHDGT, 0 P7000, 7000 PAGE $ $ $ $ $ $ $ $
$ $ $ $ $ $ $ $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search