* I$MA - I$MB - I$MC - MAY 29 2006 - VERSION 1 * * I$MA: READ MAGTAPE IN BCD MODE, 2 CHARS PER WORD * I$MB: READ MAGTAPE IN BIN MODE, 2 CHARS PER WORD * I$MC: READ MAGTAPE IN BIN MODE, 3 CHARS PER WORD * * HONEYWELL X16 16 BIT COMPUTER SOFTWARE * * PROGRAM LENGTH: 104 WORDS * * THIS SOURCE IS RECREATED FROM THE EXISTING SLST FILE: * - SLST-DAP-16.IMG (WHICH ORIGINATES FROM HONEYWELL) * * THE SOURCE IS RECREATED BY: THEO ENGEL (THEO.ENGEL@HETNET.NL) * * CALLING SEQUENCE: * CALL I$MX * DAC BUFFER ADDRESS * DEC WORD COUNT * DEC LOGICAL TAPE UNIT * (RECORD UNREADABLE RETURN) * (END OF TAPE RETURN) * (END OF FILE RETURN) * (NORMAL RETURN) * * X-REG IS UNCHANGED AFTER RETURN * A-REG = 0 IN CASE OF NORMAL RETURN AND THE NUMBER OF READ WORDS * IN CASE OF ERROR * SUBR I$MA SUBR I$MB SUBR I$MC REL I$MA DAC *-* READ BCD, 2 CHARS PER WORD LDA BCD ='1500 JMP I1 I$MB DAC *-* READ BIN, 2 CHARS PER WORD LDA *-1 STA I$MA LDA BIN2 ='1400 JMP I1 I$MC DAC *-* READ BIN, 3 CHARS PER WORD LDA *-1 STA I$MA LDA BIN3 ='1700 * I1 STA MODE SET READ MODE MASK LDA 0 STA SVX SAVE X LDA* I$MA GET BUFFER ADDRESS ADD IFL SET INDEX FLAG IRS I$MA POINTER TO WORD COUNT ADD* I$MA + WORD COUNT STA PIB PIB = INDEXED POINTER TO BUFFER LDA* I$MA GET WORD COUNT TCA - WORD COUNT STA LEN BUFFER LENGTH = - WORD COUNT IRS I$MA POINTER TO LOGICAL TAPE UNIT LDA* I$MA GET LOGICAL TAPE UNIT NUMBER CALL M$UNIT CONVERT TO PHYSICAL DEVICE NUMBER STA DEV DEV = PHYSICAL DEVICE NUMBER ADD OCP = OCP 151X STA OCP1 BACKSPACE 1 RECORD ERA MODE MAKE APPLICABLE READ MODE COMMAND ****************************************************************** * MODE * * OCP 151X ERA 1500 = OCP 001X = READ BCD, 2 CHARS PER WORD * * OCP 151X ERA 1400 = OCP 011X = READ BIN, 2 CHARS PER WORD * * OCP 151X ERA 1700 = OCP 021X = READ BIN, 3 CHARS PER WORD * ****************************************************************** STA OCP2 READ MODE COMMAND LDA INA INA 1010 ADD DEV PHYSICAL DEVICE NUMBER STA INA1 INA 101X INPUT COMMAND LDA SKS SKS 110 ADD DEV PHYSICAL DEVICE NUMBER STA SKS1 SKS 11X = SKIP IF NOT BUSY STA SKS2 ADD B1 ='100 STA SKS3 => SKS 21X = SKIP IF NO ERROR ADD B2 ='300 STA SKS4 => SKS 51X = SKIP IF NO END OF TAPE ADD B1 ='100 STA SKS5 => SKS 61X = SKIP IF NO END OF FILE ERA B3 ='1200 STA SKS6 => SKS 141X = SKIP IF NOT REWINDING LDA MO12 ='-12 STA RTRY RETRY COUNT = -10 I5 JST RDY IF TAPE UNIT IS READY, START RECORD INPUT LDA LEN STA 0 X = - WORD COUNT OCP2 OCP 0 START READING IN APPLICABLE MODE SKS1 SKS 0 SKS 11X = SKIP IF NOT BUSY JMP INA1 BUSY READING, GOTO INPUT SKS5 SKS 0 SKS 61X = SKIP IF NO END OF FILE JMP EOF EOF DETECTED JMP SKS3 INA1 INA 0 INA 101X = CLEAR A AND INPUT FROM TCU IF READY JMP SKS1 INPUT NOT READY YET STA* PIB STORE 2 CHARS IN BUFFER IRS 0 POINT TO NEXT BUFFER ENTRY JMP INA1 READ NEXT JST RDY RECORD INPUT READY, WAIT FOR UNIT READY SKS3 SKS 0 SKS 21X = SKIP IF NO ERROR JMP ERR ERROR DETECTED SKS4 SKS 0 SKS 51X = SKIP IF NO END OF TAPE JMP EOT EOT DETECTED IRS I$MA EOF IRS I$MA EOT IRS I$MA UNRE IRS I$MA LDA SVX IMA 0 RESTORE X SZE SUB LEN JMP* I$MA RETURN * AN ERROR IS DETECTED ERR IRS RTRY JMP OCP1 NO 10* RETRIED YET JMP UNRE RETRY COUNT EXHAUSTED => UNREADABLE RECORD OCP1 OCP 0 OCP 151X = BACKSPACE ON RECORD JMP I5 RESTART RECORD INPUT * RDY DAC *-* TAPE UNIT READY? SKS2 SKS 0 SKS 11X = SKIP IF NOT BUSY JMP *-1 SKS6 SKS 0 SKS 141X = SKIP IF NOT REWINDING JMP *-1 JMP* RDY * * WORKSPACE * MODE OCT 0 SELECTED READ MODE MASK SVX OCT 0 SAVED X PIB OCT 0 INDEXED POINTER TO READ BUFFER LEN OCT 0 BUFFER LENGTH = - WORD COUNT RTRY OCT 0 RETRY COUNTER IN CASE OF ERROR DEV OCT 0 UNIT => DEVICE NUMBER MO12 OCT 177766 B3 OCT 1200 B2 OCT 300 B1 OCT 100 SKS SKS '110 INA INA '1010 OCP OCP '1510 IFL OCT 40000 INDEX FLAG BIN3 OCT 1700 MASK BIN 3 CH PER WORD READ MODE BIN2 OCT 1400 MASK BIN 2 CH PER WORD READ MODE BCD OCT 1500 MASK BCD READ MODE END