PDP-9 FORTRAN II INTERRUPT I/O 7/7/66 /INTERRUPT SERVICE ENTRY ROUTINES INTRP, DAC Z#C RSF SKP JMP TAPINT /PERFORATED TAPE READER PSF SKP JMP PUNINT /PERFORATED TAPE PUNCH TSF SKP JMP TYPINT /TELETYPE TELEPRINTER IORS  /INPUT/OUTPUT STATUS TO AC HLT KRB  /READ KEYBOARD BUFFER. DISMIS=JMP . LAC 0 RAL LAC ZC ION JMP I 0 /CLEAR ALL FLEA BAGS CLFLAG, CAF CLA LAC (JMP INTRP DAC 1 ION EXIT /TAPE INTERRUPT ROUTINE GCR, LAC TAPO  /INITIALIZED TO LAW TAPBUF SAD (LAW TAPBUF+TN JMP GCR2  /HALF BUFFER FILLED GCR0, ISZ TAPCNT JMP GCR1  /GET ANOTHER CHARACTER LAC R#ON  /NO MORE CHARACTERS IN BUFFER SPA  /IF FLAG SET, TURN READER ON AGAIN RSA DZM RON LAC TAPCNT  /WAIT FOR PTR INTERRUPT SMA JMP .-2 JMP GCR0 GCR1, LAC MEDIAT  /INITIALIZED TO 0 SZA JMP GCR6 LAC I TAPO  /GET A CHARACTER ISZ TAPO GCR4, SKP  /MODIFIED, DEPENDING IN WHICH HALF OF RING CHAR IS CONTAINED RAR9 GCR5, XX  /SKP IF FIODEC, NOP IF ASCII JMS ATF GCR7, AND (77  /CHAR. IN RIGHT HALF OF AC EXIT GCR6, DZM MEDIAT LAC TAPCNT TAD (-0 DAC TAPCNT LAC ITEMB JMP GCR7 /START AT BEGINNING OF BUFFER, OTHER HALF OF WORD GCR2, LAW TAPBUF DAC TAPO LAC GCR4 XOR (SKP-NOP /MODIFY SKP + NOP DAC GCR4  /NOP IF CHAR ALREADY IN RIGHT HALF OF WORD JMP GCR0 WAIT=JMS . 0 LAC PON SZA JMS OPB LAC PON SNA JMP .-2 JMP I WAIT-JMS /COME HERE ON A TAPE INTERRUPT TAPINT, RRB JMS ENDTAP  /CHECK END OF TAPE RSA SNA DISMIS  /BLANK TAPE TAPX, DAC TA#PTEM TAPY, AND (100  /MODIFIED, JMP TAPINY IF ASCII SZA DISMIS  /DELETED CHAR TAPIN4, LAC TAPTEM RTL RTL RTL RTL RAL ADD TAPTEM  /FORM BUFFER RING XOR I TAPI AND TAPMSK /HALF OF BUFFER BEING FILLED DETERMINED XOR I TAPI /BY TAPMSK DAC I TAPI ISZ TAPI LAC TAPI SAD (LAW TAPBUF+TN JMP TAPIN2 /HALF OF BUFFER FILLED /COUNT AND CHECK FOR FULL BUFFER TAPIN1, LAM -1 ADD TAPCNT DAC TAPCNT SAD (-TN-TN+1 JMP TAPINW /NO MORE ROOM IN BUFFER TO READ IN CHARS DISMIS /SWITCH WORD HALFS, AND SET POINTER TO BEGINNING OF BUFFER TAPIN2, LAC TAPMSK CMA  /MASK OUT OTHER HALF OF WORD DAC TAPMSK LAW TAPBUF /RESET POINTER DAC TAPI JMP TAPIN1 ENDTAP, 0 DAC RRRB# IORS AND (1000  /BIT 8, PTR EMPTY SZA JMP .+3  /NO MORE TAPE IN PTR LAC RRRB JMP I ENDTAP DZM RON  /DO NOT SELECT READER AGAIN DISMIS /SET NEXT INTERRUPT TO TURN OFF READER TAPINW, LAC RON SPA DISMIS LAC (JMP .+3 /LET PROCESSING CATCH UP DAC TAPINT DISMIS LAC . 4  /COME HERE ON NEXT INTERRUPT DAC TAPINT CLC DAC RON  /SET FLAG TO TURN READER ON AGAIN RRB JMS ENDTAP JMP TAPINT 3 /INITIALIZE READER AND PUNCH SERVICE ROUTINES STREAD, LAW TAPBUF DAC TA#PI DAC TA#PO DZM R#ON LAC (SKP DAC GCR4 DAC OPBM LAC (777 DAC TAPM#SK DAC PUNM#SK LAW PUNBUF DAC PU#NO DAC PU#NI LAM -PN-PN+1 DAC P#UNCNT CLC DAC P#ON DAC TAP#CNT DZM OPBF#LG RSA LAS AND (200 SZA JMP TAPINX /ASCII INPUT LAC (AND KONA DAC TAPY LAC (SKP DAC GCR5 TAPINZ, DZM MEDIA#T LAC (200 DAC AFC#ASE DZM FTACAS EXIT KONA, 100 TAPINX, LAC (JMP TAPINY DAC TAPY LAC (NOP DAC GCR5 JMP TAPINZ TAPINY, SAD (377 DISMIS JMP TAPIN4 /PUNCH FOR INTERRUPT IPB, AND (377 DAC IPBTTM LAS AND (400 SZA JMS FTA  /BIT 9, ASCII OUTPUT LAC IPBTTM RCL RTL RTL RTL RTL ADD IPBT#TM /FORM BUFFER RING XOR I PUNI AND PUNMSK /PUNMSK DETERMINES IN WHICH HALF OF WORD CHARACTERS ARE BEING PUT XOR I PUNI DAC I PUNI ISZ PUNI LAC PUNI SAD (LAW PUNBUF+PN /CHECK END OF BUFFER HALF JMP IPB1 /CHECK COUNT FOR FULL BUFFER AND LEAVE IPB0, ISZ P#UNCNT EXITR LAC P#ON  /NO MORE ROOM IN BUFFER SPA JMS OPB  /TURN PUNCH ON AGAIN IF OFF LAC PUNCNT /LET PUNCHING CATCH UP SMA JMP .-2 EXITR /CHANGE WORD HALFS, START AT BUFFER BEGINNING IPB1, LAC PUNMSK CMA  /MASK OTHER HALF OF WORD DAC PUNMSK LAW PUNBUF /RESET BUFFER POINTER DAC PUNI JMP IPB0 /GET A CHARACTER FROM THE BUFFER AND PUNCH IT /COME HERE ON PUNCH INTERRUPT PUNINT, JMS OPB DISMIS /PUNCH ONE CHARACTER FROM THE PUNCH BUFFER OPB, 0 LAC OPBFLG /CARRIAGE RETURN FLAG SZA JMP OPBLF  /IF LAST CHAR PUNCHED A CR, PUNCH A LINE FEET TOO LAC PUNO SAD (LAW PUNBUF+PN JMP OPB1  /SWITCH BUFFER HALFS LAC PUNCNT SAD (-PN-PN+1 JMP OPBF  /NOTHING LEFT IN BUFFER TO PUNCH TAD (-0 DAC PUNCNT LAC I PUNO ISZ PUNO OPBM, SKP  /IN NOP, DEPENDING ON WHICH HALF OF BUFFER JMP OPBM1  /CHARACTER IN LEFT HALF, SHIFT OVER AND (377 SAD (215 ISZ OPBFLG /CARRIAGE RETURN, SET FLAG OPBPUN, JMS NOTAPE PLS DZM PON JMP I OPB OPBLF, DZM OPBFLG LAC (212  /LINE FEED JMP OPBPUN OPB1, LAW PUNBUF /SET BUFFER PNTR DAC PUNO LAC OPBM XOR (SKP-NOP /SKP IF IN RIGHT HALF OF BUFFER ALREADY DAC OPBM JMP OPB+4 OPBM1, RAR RTR RTR RTR RTR JMP OPBM+2 OPBF, PCF  /TURN OFF PUNCH INTERRUPT, LET BUFFER FILL UP CLC DAC PON  /SET FLAG TO RE-ENABLE IT JMP I OPB NOTAPE, 0 DAC PUNTEN# IORS AND (400  /BIT 9, PTP EMPTY SNA JMP .+4  /RETURN CLC  /IF NO MORE TAPE IN PTP HLT  /SET AC TO ALL ONES AND JMP .-6  /WAIT TIL PUNCH REFILLED LAC PUNTEN JMP I NOTAPE /TYPE TYPIT, 0 DAC TYP#BTA 703301 SKP JMS BTA TLS JMS TYPTES JMP . JMP I TYPIT TYPINT, TCF ISZ DISMIS TYPTES, 0 LAC TYPIT RAL LAC TYPBTA JMP I TYPTES /BAUDOT TO ASCII CONVERSION BTA, 0 AND (37 SAD (37 JMP BLETT SAD (33 JMP BFIG ADD (LAC BTAT DAC BTAA LAC B#FLC RAL BTAA, XX SNL RAR9 JMP I BTA BLETT, CLA!SKP BFIG, CLC DAC BFLC JMS TYPTES JMP I TYPIT BTAT, 200200 324265 215215 317271 240240 310243 316254 315256 212212 314251 322264 307246 311270 320260 303272 326273 305263 332242 304244 302277 323211 331266 306241 330257 301255 327262 312247 200200 325267 321261 313250 200200 /FIODEC TO ASCII FTA, 0 LAC PLK DAC FTAPL#K LAC IPBTTM AND (77 SAD (72 JMP FTAL SAD (74 JMP FTAU SAD (77 JMP FTACR ADD (LAC TFTA DAC FTAA LAC FT#ACAS RAR FTAA, XX SZL RAR9 FTAX, AND (377 DAC IPBTTM LAC FTAPLK DAC PLK JMP I FTA FTAL, CLA!SKP FTAU, LAW 1 DAC FTACAS CLC JMP FTAX FTACR, LAC (215 JMP FTAX TFTA, 240240 242261 247262 337263 245264 241265 246266 274267 276270 336271 200200 214214 377377 377377 377377 377377 300260 277257 323323 324324 325325 326326 327327 330330 331331 332332 377377 275254 377377 377377 211211 377377 244377 312312 313313 314314 315315 316316 317317 320320 321321 322322 377377 377377 253255 335251 334243 333250 377377 301301 302302 303303 304304 305305 306306 307307 310310 311311 377377 252256 377377 377377 377377 215215 /ASCII TO FIODEC ATF, 0 AND (377 TAD (-237 SPA JMP ATFL /NOT IN TABLE - LOW TAD (-77 SMA JMP GCR /NOT IN TABLE - HIGH, EXIT TAD (400100 RCR ADD (IASC DAC .+1 XX SNL RAR9 DAC IT#EMB AND (300 XOR AFCASE /INITIALLY 200 SNA JMP ATFC ATF1, LAC ITEMB JMP I ATF ATFL, SAD (-26 LAC (236 /TAB SAD (-23 LAC (13 /STOP CODE SAD (-22 LAC (277 /CARRIAGE RETURN SPA ATF4, JMP GCR /ELIMINATE ANY OTHER "LOW" CHARS JMP I ATF ATFC, LAC AFCASE CMA AND (300 DAC AFCASE SAD (100 CLA!SKP LAM -1 TAD (274 ISZ MEDIAT JMP I ATF /TABLE FOR ASCII TO FIODEC CONVERSION /CODE TRANSLATION CONVENTIONS ARE THOSE OF CANUTE /WITH THE TWO EMENDATIONS, VIZ, /(1) ASCII NUMBER SIGN SERVES AS FIODEC OVERBAR /(2) ASCII DOLLAR SIGN SERVES AS FIODEC UNDERBAR /COLON AND SEMICOLON ARE TRANSLATED AS SPACES /NINE BIT CODES FOR EVEN ASCII MOD(240) IN LEFT HALF, ODD ASCII RIGHT HALF /CASE CARRIED AS 100 FOR LC, 200 FOR UC, ALL LETTERS LC /INITIAL BIT IS PARITY BIT IN NINE BIT EQUIVALENCE SCHEME IASC, 500605 201556 240204 606202 157555 273254 533154 173521 120101 102503 104505 506107 110511 500500 207633 210621 220161 162563 164565 566167 170571 541542 143544 145146 547550 151522 123524 125126 527530 131257 656655 611603 START