* F4$IOS-B - DEC 12 2006 - VERSION 1 * * FORTRAN COMPILER IO SELECTOR * * WHEN THE COMPILER IS STARTED, REGISTER A SPECIFIES THE DEVICES * TO BE USED FOR SOURCE INPUT, OBJECT OUTPUT AND FOR LISTING OUTPUT. * THE IOS SELECTOR HONORS THIS SELECTION BY ACTIVATING THE SELECTED * DEVICES FOR THESE TASKS. * * THE FOLOWING OPTIONS ARE SUPPORTED: * * A[ 8-10] SOURCE INPUT DEVICE (1=TTY 2=CR 3=HSR 4=MAGTAPE-UNIT 1) * A[11-13] LISTING DEVICE (0=SUP 1=TTY 2=LP 4=MAGTAPE-UNIT 2) * A[14-16] OBJECT OUTPUT DEVICE (0=SUP 1=PTP 2=TTY 4=MAGTAPE-UNIT 2) * THE LISTED DEVICE ALLOCATION IS SET BY F4IOS * THIS VERSION OF F4IOS DOES NOT, WITHOUT MODIFICATION, SUPPORT OTHER * DEVICES FOR THE SPECIFIED TASKS. * THIS ALSO MEANS THAT TAPE UNIT 2 CAN EITHER BE USED FOR * OBJECT OUTPUT OR FOR LISTING OUTPUT * * IN CASE NO DEVICE SELECTION IS SPECIFIED IN REGISTER A, A DEFAULT * SELECTION IS MADE BY F4IOS: * - SOURCE INPUT 3=HSR * - LISTING OUTPUT 1=TTY * - OBJECT OUTPUT 1=PTP * * F4IOS LINKS, TO SUPPORT THE SPECIFIED IO, THE DRIVERS FOR THESE DEVICES. * HOWEVER, IF FOR INSTANCE NO MAGTAPE IS AVAILABLE IN A PARTICULAR * INSTALLATION, THE MAGTAPE DRIVER CAN BE REPLACED BY A DUMMY DRIVER. * THE COMPILER FOOTPRINT IN MEMORY BECOMES SMALLER THEN. DO NOT LINK * THE MAGTAPE DRIVER IN THAT CASE. THE F4$DUM MODULE RESOLVES THE CALLS * TO THE MAGTAPE DRIVER AND MUST BE THAT LAST MODULE TO BE LINKED. * * HONEYWELL X16 16 BIT COMPUTER SOFTWARE * * PROGRAM LENGTH: 415 WORDS * * THIS SOURCE IS RECREATED FROM THE EXISTING SLST FILE: * - SLST-FRTN.IMG (WHICH ORIGINATES FROM HONEYWELL) * * THE SOURCE IS RECREATED BY: THEO ENGEL (THEO.ENGEL@HETNET.NL) * * SUBR F4$INT,F4IN IO INITIALISATION ROUTINE * SUBR F4$IN,F4SI GENERAL SOURCE INPUT ROUTINE * SUBR F4$OUT,F4OO GENERAL OBJECT OUTPUT ROUTINE * SUBR F4$SYM,F4LO GENERAL LISTING OUTPUT ROUTINE * SUBR F4$END,F4EN END COMPILATION * * SUBR F4$DUI,IL1 DUMMY SOURCE INPUT DRIVER * SUBR F4$DUO,OL4 DUMMY OBJECT OUTPUT DRIVER * SUBR F4$DUS,LL9 DUMMY LISTING OUTPUT DRIVER * SUBR F4$INT,F4IN SUBR F4$IN,F4SI SUBR F4$OUT,F4OO SUBR F4$SYM,F4LO SUBR F4$END,F4EN * SUBR F4$DUI,IL1 SUBR F4$DUO,OL4 SUBR F4$DUS,LL9 REL * ******************************************************************* * F4$INT -- INIT COMPILER DATA POOL AND STORE IO DEVICE SELECTION * ******************************************************************* * F4IN DAC *-* JST SDEV SET THE SELECTED DEVICES JST PUTR PUNCH LEADER IN CASE PTP IS OBJECT DEVICE CALL F4$INI SET THE SIZE OF THE DATA POOL CRA STA SCNT SOURCE INPUT RECORD COUNTER/LINENUMBER = 0 IRS INFL SET 1ST-TIME-CALL FLAG FOR LISTING DRIVER JMP* F4IN * ************************************** * GENERAL SOURCE INPUT ROUTINE * * CALLING SEQUENCE: * * CALL F4$IN * * DAC SOURCEBUFFER * ************************************** * F4SI DAC *-* SOURCE INPUT DRIVER LDA* F4SI GET SOURCE BUFFER ADDRESS STA IB1 AND STORE STA IB2 STA IB3 STA IB4 STA IB5 STA IB6 IL6 LDA DSRC LOAD SELECTED SOURCE DEVICE JST SWCH JMP SWITCH JMP IL1 0 NON JMP IL2 1 TTY JMP IL3 2 CR JMP IL4 3 HSR JMP IL5 4 MAG TAPE JMP IL1 5 NON JMP IL1 6 NON * DUMMY SOURCE INPUT DEVICE DRIVER: SELECT PROPER DEVICE IL1 LDA MO5 7 NON =-5 MESSAGE LENGTH, 5 WORDS LONG JST PRBF DAC MDEV MESSAGE: DEVICE? (NO DRIVER FOR REQUESTED DEVICE) JST STOP SET DEFAULT OR NEW DEVICE SELECTION JMP IL6 * IL2 CALL I$AA TTY = SOURCE INPUT DEVICE IB1 DAC *-* SOURCE BUFFER ADDRESS JMP IL2 EOM/EOF RETURN JMP IL7 NORMAL RETURN IL3 CALL I$CA CR = SOURCE INPUT DEVICE IB2 DAC *-* SOURCE BUFFER ADDRESS JMP IL3 EOM/EOF RETURN JMP IL7 NORMAL RETURN IL4 CALL I$PA HSR = SOURCE INPUT DEVICE IB3 DAC *-* SOURCE BUFFER ADDRESS JMP IL4 JMP IL7 IL5 CALL I$MA MT = SOURCE INPUT DEVICE IB4 DAC *-* SOURCE BUFFER ADDRESS OCT 50 BUFFER LENGTH (WORDS) OCT 1 TAPE UNIT 1 = SOURCE DECK JMP ERR0 RECORD NOT READABLE RETURN JMP ERR1 END OF TAPE RETURN JMP IL5 END OF FILE RETURN; READ NEXT FILE CALL C$6TO8 NORMAL RETURN; CONVERT RECORD TO ASCII IB5 DAC *-* SOURCE BUFFER ADDRESS OCT 50 BUFFER LENGTH IL7 LDA SCNT SOURCE RECORD COUNTER ADD N1 =1 SSP STA SCNT SOURCE RECORD COUNTER IRS F4SI SET RETURN ADDRESS JMP* F4SI * ************************************** * GENERAL OBJECT OUTPUT ROUTINE * * CALLING SEQUENCE: * * A = OBJECT BUFFER ADDRESS * * X = - BUFFER LENGTH (WORDS) * * CALL F4$OUT * ************************************** * F4OO DAC *-* OBJECT OUTPUT DRIVER STA OSRC EXTERNAL OBJECT BUFFER ADDRESS LDA 0 - BUFFER LENGTH (WORDS) TCA STA OBFL + BUFFER LENGTH (WORDS) STA MTBL ADD OPTR POINTER TO OUTPUT BUFFER ADD IFLG INDEX FLAG STA ODES INDEXED DESTINATION OL1 LDA* OSRC MOVE OBJECT TO INTERNAL OUTPUT BUFFER STA* ODES IRS 0 JMP OL1 OL6 LDA DOBJ JST SWCH JMP SWITCH JMP* F4OO 0 SUPPRESS OBJECT OUTPUT JMP OL2 1 PTP JMP OL3 2 TTY JMP OL4 3 NON JMP OL5 4 MAG TAPE JMP OL4 5 NON JMP OL4 6 NON * DUMMY OBJECT OUTPUT DEVICE DRIVER: SELECT PROPER DEVICE OL4 LDA MO5 7 NON =-5 JST PRBF DAC MDEV MESSAGE: DEVICE? JST STOP SET DEFAULT OR NEW DEVICE SELECTION JST PUTR PUNCH TRAILER IN CASE PTP IS SELECTED JMP OL6 * OL2 CALL O$PB PTP = OBJECT OUTPUT DEVICE DAC OBUF OUTPUT BUFFER ADDRESS JMP* F4OO EXIT OL3 CALL O$AB TTY = OBJECT OUTPUT DEVICE DAC OBUF OUTPUT BUFFER ADDRESS JMP* F4OO EXIT OL5 CALL O$MB MAG TAPE = OBJECT OUTPUT DEVICE DAC OBUF+1 BUFFER ADDRESS MTBL OCT 0 BUFFER LENGTH (WORDS) OCT 2 TAPE UNIT 2 = OBJECT DECK JMP ERR1 END OF TAPE RETURN JMP* F4OO EXIT * ************************************** * GENERAL LISTING OUTPUT ROUTINE * * CALLING SEQUENCE: * * CALL F4$SYM * * DAC LINEBUFFER * ************************************** * F4LO DAC *-* LISTING OUTPUT DRIVER LDA SPSP STA OBUF SET LINENUMBER FIELD STA OBUF+1 (6 CHARS) TO SPACES STA OBUF+2 LDA* F4LO EXTERNAL BUFFER ADDRESS ADD ILPB +INDEX / LENGTH STA OSRC INDEXED EXTERNAL BUFFER ADDRESS LDA MO50 ='-50 STA 0 X = INDEX INTO THE LINE BUFFER LL1 LDA* OSRC MOVE LINE TO INTERNAL DRIVER BUFFER STA LBUF,1 IRS 0 JMP LL1 LL10 LDA INFL NON-ZERO WITH 1ST CALL SNZ JMP LL2 EQUAL 0 * 1ST CALL OF LISTING DRIVER LDA* F4LO EXTERNAL BUFFER ADDRESS ERA IB6 EQUAL TO SOURCE BUFFER ADDRESS?? SZE JMP LEX NOT EQUAL; EXIT LDA DLST YES; GET REQUIRED LISTING DEVICE ERA N2 EQUAL 2 ? (LP) SZE JMP LL2 NOT LP CALL O$LH YES, LP. INIT THE HEADER DAC OBUF LL2 LDA* F4LO EXTERNAL BUFFER ADDRESS ERA IB6 EQUAL TO SOURCE BUFFER ADDRESS?? SZE JMP LL3 NO LDA TPTR YES, EQUAL TO SOURCE BUFFER STA TEMP TEMP = PTR TO DEC CONV TAB LDA SCNT GET SOURCE LINE NUMBER STA NUMB LINENUMBER TO PRINT * WITH ZERO BEING TRUE, LEADING ZERO'S OF THE LINENUMBER ARE SUPPRESSED IRS ZERO LEADING ZERO FLAG IS TRUE (SET TO FALSE WITH 1ST NONZERO) JST CDIG DIGIT 1 JST CDIG DIGIT 2 JST CDIG DIGIT 3 JST CDIG DIGIT 4 JST CDIG DIGIT 5 LL3 LDA DLST WHICH DRIVER TO OUTPUT LISTING? JST SWCH JMP SWITCH JMP LL4 0 SUPPRESS LISTING JMP LL5 1 TTY JMP LL6 2 LP JMP LL9 3 NON JMP LL8 4 MAG TAPE JMP LL9 5 NON JMP LL9 6 NON * DUMMY LISTING OUTPUT DEVICE DRIVER: SELECT PROPER DEVICE LL9 LDA MO5 7 NON =-5 JST PRBF DAC MDEV MESSAGE: DEVICE? JST STOP SET DEFAULT OR NEW DEVICE SELECTION JMP LL10 * LL5 LDA O43 TTY = LISTING OUTPUT DEVICE (35 WORDS) LL13 STA 0 REMOVE TRAILING BLANKS LDA OBUF,1 ERA SPSP SZE JMP LL11 LDA 0 SNZ JMP LL12 SUB N1 JMP LL13 LL11 IRS 0 LDA 0 TCA A = - LENGTH (IN WORDS) OF THE LINE TO PRINT LL12 JST PRBF PRINT THE LINE DAC OBUF JMP LL4 LL6 CALL O$LA LP = LISTING OUTPUT DEVICE DAC OBUF OUTPUT BUFFER (60 WORDS) JMP LL4 LL8 CALL C$8TO6 MAG TAPE = LISTING OUTPUT DEVICE (UNIT 2) DAC OBUF OUTPUT BUFFER OCT 50 BUFFER LENGTH (WORDS) CALL O$MA DAC OBUF OUTPUT BUFFER OCT 50 BUFFER LENGTH (WORDS) OCT 2 TAPE UNIT 2 = OBJECT DECK JMP ERR1 EOT RETURN LL4 CRA NORMAL RETURN STA INFL RESET 1ST-TIME-CALL FLAG OF THE LISTING DRIVER LEX IRS F4LO SET RETURN ADDRESS JMP* F4LO * * CONVERT 1 DIGIT FOR PRINTING A 5 DIGIT LINENUMBER * USED BY THE OUTPUT LISTING DRIVER CDIG DAC *-* CRA STA 0 X=0 (COUNT=0) LDA NUMB NUMBER (OR RESIDUAL OF NUMBER) BEING CONVERTED CV1 SUB* TEMP TEMP = POINTER INTO CONVERSION TABLE SPL JMP CV2 NEGATIVE STA NUMB STILL POSITIVE IRS 0 COUNT + 1 JMP CV1 CV2 IRS TEMP TEMP = POINTER TO NEXT ITEM IN CONVERSION TABLE LDA TPTR POINTER TO TABLE SUB TEMP MINUS THE CURRENT POINTER TO THE TABLE STA T1 ADD N1 +1 TCA LGR 1 = INDEX IN BUFFER IMA 0 A = COUNT SNZ JMP CV3 COUNT = 0 => DIGIT WOULD BE 0 CV4 ADD O20 ='20 (TO MAKE ASCII DIGIT OF SPACE) CV5 ALR '10 IRS T1 JMP CV5 ADD OBUF,1 STA OBUF,1 CRA STA ZERO RESET THE LEADING ZERO FLAG JMP* CDIG CV3 LDA ZERO NONZERO IF STILL LEADING ZERO'S SZE JMP* CDIG NONZERO, SO STILL A LEADING ZERO JMP CV4 ZERO, SO NOT A LEADING ZERO, SO OUTPUT * ************************************** * STOP COMPILATION: F4$END * ************************************** * F4EN DAC *-* LDA DOBJ OBJECT DEVICE? JST PUTR PUNCH TRAILER IN CASE OF PTP LDA DOBJ ERA N1 PTP? SNZ OCP '102 YES; PTP OFF ERA N5 OBJECT DEVICE MAGTAPE? SNZ JMP LE1 YES LDA DLST LISTING DEVICE MAGTAPE? ERA N4 SZE JMP LE2 NO LE1 CALL O$ME WRITE EOF ON UNIT 2 (OBJECT OR LISTING DEVICE) OCT 2 UNIT 2 LE2 LDA MO6 ='-6 JST PRBF PRINT EOJ MESSGE DAC MEOJ JST STOP STOP LDA DEFT JMP* F4EN AND RESTART MEOJ OCT 106612 END OF JOB MESSAGE BCI 1,EN BCI 1,D BCI 1,OF BCI 1, J BCI 1,OB * ************************************** * STOP AND (RE)LOAD DEVICE SELECTION * ************************************** * CALLED BY SOURCE, OBJECT AND LISTING (DUMMY) DRIVERS OF F4-IOS * CALLED BY F4$END (WHICH IS ALSO PART OF F4-IOS) * STOP DAC *-* LDA DEFT LOAD DEFAULT DEVICE SETTINGS HLT STOP AND POSSIBLY ADAPT THE SETTING JST SDEV SET THE NEW DEVICE SELECTION JMP* STOP * ************************************************************** * SAVE DEVICE SELECTION AS DEFINED DURING COMPILER (RE)START * ************************************************************** * DEVICE SELECTION AS SPECIFIED IN REG-A (SOURCE, LIST, OBJECT), OR DEFAULT * SDEV DAC *-* SET SELECTED DEVICES SZE STA DEFT STORE REQUESTED DEVICES LDA DEFT LOAD DEFAULT IF NOTHING SPECIFIED, LRL 6 ANA M7 STA DSRC SOURCE DEVICE CRA LLL 3 STA DLST LISTING DEVICE CRA LLL 3 STA DOBJ OBJECT DEVICE JMP* SDEV * ****************************************************************** * PUNCH LEADER/TRAILER IN CASE PTP IS THE SELECTED OBJECT DEVICE * ****************************************************************** * A[14-16] = SELECTED OBJECT DEVICE * PUTR DAC *-* ERA N1 =1 PUNCHER SELECTED? SNZ CALL O$PLDR YES; PUNCH LEADER/TRAILER JMP* PUTR * ************************************** * PRINT MESSAGE FROM BUFFER ON TTY * ************************************** * CALLING SEQUENCE: * JST PRBF A = - MESSAGE LENGTH IN WORDS * DAC MESSAGE * PRBF DAC *-* PRINT BUFFER STA 0 X = A = - BUFFER LENGTH LDA* PRBF BUFFER ADDRESS IRS PRBF SET RETURN ADDRESS STA BA STORE BUFFER ADDRESS SKS '104 TTY READY? JMP *-1 OCP '104 SET OUTPUT MODE LDA CRLF JST PRA PRINT 2 CHARS IN A LDA 0 SNZ JMP* PRBF P1 LDA* BA GET 2 CHARS JST PRA PRINT 2 CHARS IN A IRS BA IRS 0 JMP P1 JMP* PRBF * ************************************** * PRINT 2 CHARS FROM REG-A ON TTY * ************************************** * PRA DAC *-* LRL '10 OTA 4 JMP *-1 LLL '10 OTA 4 JMP *-1 JMP* PRA * ************************************** * SWITCH VIA JUMP-TABLE * ************************************** * CALLING SEQUENCE: * LDA INDEX INTO JUMP-TABLE * JST SWCH * JMP -- JUMP-TABLE ENTRY 0 (INDEX 0) * JMP -- JUMP-TABLE ENTRY 1 (INDEX 1) * ETC * SWCH DAC *-* SWITCH ADD SWCH STA SWCH JMP* SWCH * ************************************** * ERROR HANDLING ROUTINES * ************************************** * STRT EQU '1000 COMPILER START ADDRESS ERR0 LDA MO2 =-2 JST PRBF DAC MUR MESSAGE: UR (RECORD UNREADABLE) JMP ERR2 ERR1 LDA MO3 =-3 JST PRBF DAC MEOT MESSAGE: EOT (END OF TAPE) ERR2 JST STOP LDA DEFT LOAD DEVICE SETTINGS (REG-A) JMP STRT RESTART COMPILATION * ************************************** * F4-IOS DATA AREA * ************************************** * DEFT OCT 311 DEFAULT SELECTION OF IO DEVICES (I 3=HSR; L 1=TTY; O 1=PTP) * DECIMAL CONVERION TABLE (USER FOR PRINTING NUMBERS) DTAB OCT 23420 =10000 OCT 1750 =1000 OCT 144 =100 OCT 12 =10 OCT 1 =1 DSRC OCT 0 SOURCE INPUT DEVICE AS SPECIFIED DURING START DLST OCT 0 LISTING DEVICE AS SPECIFIED DURING START DOBJ OCT 0 OBJECT OUTPUT DEVICE AS SPECIFIED DURING START IB6 OCT 0 SOURCE BUFFER ADDRESS SCNT OCT 0 SOURCE RECORD COUNTER INFL OCT 0 FLAG LISTING DRIVER (NONZERO WITH 1ST-TIME-CALL) OSRC OCT 0 POINTER TO EXTERNAL OBJECT BUFFER BA EQU * BUFFER ADDRESS TEMP EQU * TEMP POINTER TO DECIMAL CONVERSION TABLE ODES OCT 0 INDEXED POINTER TO INTERNAL OBJECT BUFFER NUMB OCT 0 TEMP STORAGE FOR LINENUMBER TO CONVERT/PRINT ZERO OCT 0 SET TO 0 WITH 1ST NONZERO DIGIT IN LINENUMBER T1 OCT 0 OPTR DAC OBUF POINTER TO OUTPUT BUFFER TPTR DAC DTAB POINTER TO DECIMAL CONVERSION TABLE * OBFL EQU * OUTPUT BUFFER LENGTH FOR BINARY OUTPUT (WORDS) OBUF OCT 4 OUTPUT BUFFER (60 WORDS; MUST NOT EXCEED 60 WORDS) OCT 300 OCT 0 OCT 2 OCT 302 BCI 3, BCI 3,EOB BCI 3,000300 BCI 1, BCI 3,000000 BCI 1, BCI 3,000002 BCI 3, BCI 3, BCI 3, BCI 3, BCI 3, BCI 3, BCI 3, LBUF BCI 3, END OF LISTING BUFFER BCI 3, BCI 3, BCI 3, BCI 3, BCI 2, * CRLF EQU * * MESSAGE: DRIVER? (NO DEVICE DRIVER FOR REQUESTED DEVICE) 5 WORDS LONG MDEV OCT 106612 MESSAGE: DEVICE? BCI 1,DE BCI 1,VI BCI 1,CE BCI 1,? * MEOT OCT 106612 MESSAGE: EOT (END OF TAPE) BCI 1,EO BCI 1,T MUR OCT 106612 MESSAGE: UR (UNREADABLE RECORD) BCI 1,UR MO3 OCT 177775 MO2 OCT 177776 M7 OCT 7 MO6 OCT 177772 N4 OCT 4 N5 OCT 5 O20 OCT 20 O43 OCT 43 N2 OCT 2 MO50 OCT 177730 ='-50 ILPB OCT 40050 INDEX LISTING BUFFER SPSP OCT 120240 IFLG OCT 40001 INDEX FLAG MO5 OCT 177773 N1 OCT 1 END