/ Program Interrupt Demonstration Program / / This program is from INTRODUCTION TO PROGRAMMING, 1970, pp. 5-32 - 5-40. / / This program is a demonstration program to run on the program interrupt / facility. It contains a bit rotating program, the speed and direction of / which is determined by the switch register settings. The foreground / program is an ordering program. It has the capability to accept 4-digit / positive octal input from the teletype keyboard automatically terminating / each 4-digit number with a carriage return and line feed. Upon receipt of / a typed dollar sign ($), the program will place the data in increasing / order, and type the ordered data on the printer. The program will not / accept negative numbers or nonoctal digits. / Start address is 200. / Switch Register 0 determines the direction of rotation of the AC, / Switch Register 3-11 determine the speed of rotation. / To inspect the rotation, let the AC be displayed on the KC8-EA console / while running the program. *0 /FIRST INSTRUCTIONS AFTER AN INTERRUPT. 0 JMP I 2 SERV *50 /CONSTANTS STORED ON PAGE 0. MODE, 0 /INPUT=0; OUTPUT=-1. SW1, 0 /NUMBER STATUS SWITCH SW2, 0 /OUTPUT:CR=0,LF=-1,DATA=1. SW3, 0 /MODE BYPASS SWITCH AC, 0 /SAVE AC AND L, 0 /L DURING AN INTERRUPT. PRINTR, TP /FOLLOWING ARE POINTERS FOR KEYBRD, KB /THE RESPECTIVE ROUTINES. ORDPTR, ORDER EXITPT, EXIT M7000, 1000 /ORDER SUB-PROGRAM CONSTANTS BUFF, END BUFFPT, 0 M4, 7774 DIGCTR, 0 TEMP1, .+2 TEMP, 0 0 0 0 0 MDOLAR, 7534 M10, -10 HOLD, 0 HOLDL, 0 M260, 7520 AMOUNT, 0 FLAG, 0 TALLY, 0 X1, 0 X2, 0 PRNTCT, 0 K7, 7 K260, 260 K212, 212 K215, 215 QUEST, 277 K4000, 4000 /SUBROUTINES STORED ON PAGE 0. CR, TAD K215 /CARRIAGE RETURN ROUTINE TLS CLA CMA DCA SW2 JMP I EXITPT LF, TAD K212 /LINE FEED ROUTINE TLS CLA TAD SW3 SNA CLA JMP SW2SET DCA SW3 /TURN OFF MODE BYPASS. DCA SW2 /SET SW2 FOR CR. JMP I EXITPT SW2SET, CLA CLL IAC DCA SW2 /SET SW2 FOR DATA. JMP I EXITPT *200 /NEXT INSTRUCTIONS INITIALIZE THE PROGRAM. /FURTHER INITIALIZATION DONE BY RESTART. START, IOF /INTERRUPT OFF DURING INITIALIZATION. CLA CLL DCA MODE DCA SW1 DCA SW2 DCA SW3 TAD BUFF DCA BUFFPT DCA AMOUNT ION /ROTATE SUB-PROGRAM BEGINS HERE. ROTATE, CLA CLL CML BEGIN, DCA SAVEAC RAL DCA SAVEL TAD K7000 /ALWAYS SET BITS 0,1 AND 2. OSR DCA COUNT /MAXCOUNT IS -1000. OSR RAL /PUT BIT 0 IN LINK. SZL CLA JMS LEFT JMS RIGHT CLL GO, TAD SAVEL RAR TAD SAVEAC INSTR, HLT /OVERWRITTEN BY RAR OR RAL. ISZ COUNTR JMP INSTR+1 ISZ COUNT JMP INSTR+1 JMP BEGIN SAVEAC, 0 SAVEL, 0 K7000, 7000 COUNTR, 0 COUNT, 0 /SUBROUTINES TO DETERMINE DIRECTION. LEFT, 0 ISZ LEFT /SKIP INSTR AFTER JMS LEFT. TAD KRAL DCA INSTR JMP I LEFT /STORE 'RAL' IN 'INSTR'. RIGHT, 0 TAD KRAR DCA INSTR JMP I RIGHT /STORE 'RAR' IN 'INSTR'. KRAR, RAR KRAL, RAL /SKIP CHAIN TO SERVICE ROUTINES SERV, DCA AC /SAVE AC AND L RAL DCA L TSF SKP JMP I PRINTR KSF SKP JMP I KEYBRD HLT /ORDER SUB-PROGRAM ORDER, CLA CLL TAD AMOUNT /SET TALLY FOR COMPARISONS. CIA IAC DCA TALLY DCA FLAG /CLEARS FLAG FOR EACH PASS TAD BUFF DCA X1 TAD BUFF IAC DCA X2 TEST, TAD I X2 CIA TAD I X1 /IS X2 LESS THAN X1? SPA SNA CLA JMP INCPTR /NO: DON'T REVERSE. REVERSE,TAD I X1 /YES: REVERSE X2 AND X1 DCA HOLD TAD I X2 DCA I X1 TAD HOLD DCA I X2 CLA CLL CMA /SET FLAG TO SIGNAL DCA FLAG /THAT A REVERSE WAS DONE INCPTR, ISZ X1 /INCREMENT X POINTERS. ISZ X2 ISZ TALLY /COMPARED ALL ENTRIES? JMP TEST /NO: COMPARE NEXT X'S. TAD FLAG /YES: ORDER DONE YET? SZA CLA JMP ORDER /NO: MAKE ANOTHER PASS. CLA CMA DCA MODE /YES: SET OUTPUT MODE. TAD BUFF /SET POINTER TO FIRST ENTRY. DCA BUFFPT DCA SW1 /CLEAR NUMBER STATUS SWITCH. TAD AMOUNT /SET A TALLY FOR OUTPUT. CIA DCA PRNTCT / TLS /TO TRIGGER NEXT INTERRUPT. JMP I EXITPT *400 /KEYBOARD SERVICE ROUTINE KB, KCC TAD MODE /INPUT MODE DOES NOT SZA CLA /HONOR KEYBOARD REQUEST. JMP EXIT TAD SW1 SZA CLA /CHECK FOR A NEW NUMBER JMP CNTDIG /OR A CONTINUED DIGIT. TAD M4 DCA DIGCTR TAD TEMP1 DCA TEMP CNTDIG, KRS /READ KEYBOARD CHARACTER. TLS /TYPE IT ON PRINTER. DCA I TEMP /STORE DIGIT TEMPORARILY. CHECK, TAD I TEMP TAD MDOLAR /CHECK FOR TERMINAL $ SNA CLA JMP I ORDPTR TAD I TEMP TAD M260 /ASCII LESS THAN 260? SPA JMP ERROR /YES: ERROR. TAD M10 /NO: SUBTRACT 10. SPA /GREATER THAN 267? JMP LEGAL /NO: DIGIT IS LEGAL. ERROR, CLA IAC /NOT AN OCTAL NUMBER. DCA SW3 /SET TO TYPE ?,CR,LF. DCA SW1 /SET FOR A NEW NUMBER. / TLS JMP EXIT LEGAL, CLA CMA /SET SW1 TO SIGNAL DCA SW1 /A CONTINUED NUMBER. ISZ TEMP ISZ DIGCTR /HAVE 4 DIGITS? JMP EXIT /NO: GET NEXT DIGIT. PACK, TAD TEMP1 /YES: PUT NUMBER TOGETHER. DCA TEMP DCA HOLD TAD M4 DCA DIGCTR DIGPCK, TAD HOLD /NEXT 7 INSTRUCTIONS RAL CLL /COMBINE THE 4 OCTAL DIGITS RTL /INTO ONE MEMORY WORD. TAD I TEMP TAD M260 DCA HOLD ISZ TEMP ISZ DIGCTR JMP DIGPCK /PACK ANOTHER DIGIT. TAD HOLD DCA I BUFFPT /STORE THE OCTAL NUMBER. TAD I BUFFPT /CHECK FOR NEGATIVE ENTRY. TAD K4000 SPA CLA JMP NOTNEG /ENTRY IS LEGAL. IAC /SET SW3 TO TYPE A "?". JMP DISALO /DISALOW NEGATIVE ENTRY. NOTNEG, ISZ BUFFPT ISZ AMOUNT /COUNT THE ENTRIES. CLA CMA /TYPE A CR,LF DISALO, DCA SW3 /AFTER THE ENTRY. DCA SW1 /CLEAR SW1 FOR NEXT PASS. / TLS JMP EXIT /PRINTER SERVICE ROUTINE TP, TCF TAD SW3 /CHECK MODE-BYPASS-SWITCH. SNA CLA JMP MODCHK /NO BYPASS, CHECK MODE. TAD SW3 SPA CLA JMP RETLF /NODE-BYPASS, DO A CR & LF. TAD QUEST /MODE BY PASS SET FOR "?". TLS CLA CMA /AFTER TYPING THE ? SET SW3. DCA SW3 /TO TYPE THE CR & LF. JMP EXIT MODCHK, TAD MODE /CHECK MODE. SNA CLA JMP EXIT /INPUT MODE: IGNORE REQUEST! RETLF, TAD SW2 /OUTPUT MODE: BEGIN OUTPUT. SNA CLA JMP CR /FIRST PASS, CARRIAGE RETURN. TAD SW2 SPA CLA JMP LF /LINE FEED ON SECOND PASS. DATA, TAD SW1 /PRINT DATA ON THIRD PASS. SZA CLA /NEW NUMBER? JMP DIGTYP /NO: TYPE ANOTHER DIGIT. TAD M4 /YES: RESET DIGIT COUNTER. DCA DIGCTR DCA HOLD /CLEAR THESE LOCATIONS. DCA HOLDL TAD I BUFFPT /SET NUMBER TO BE PRINTED. DIGTYP, TAD HOLDL CLL RAL /ROTATE INTO THE LINK. TAD HOLD /THESE TWELVE INSTRUCTIONS RAL /PRINT OUT THE NEXT DIGIT. RTL DCA HOLD RAR DCA HOLDL TAD HOLD AND K7 TAD K260 TLS CLA CMA /SET FOR ANOTHER DIGIT. DCA SW1 ISZ DIGCTR /WORD COMPLETE? JMP EXIT /NO: GET ANOTHER DIGIT. CLA /YES: SIGNAL A NEW NUMBER. DCA SW1 DCA SW2 /TYPE A CR & LF ISZ BUFFPT ISZ PRNTCT /ALL NUMBERS PRINTED? JMP EXIT /NO: WAIT FOR NEW NUMBER. RESTART,CLA CLL /YES: SET UP FOR NEW INPUT. DCA MODE DCA SW1 DCA SW2 CMA /SET BYPASS SWITCH DCA SW3 /TO TYPE A CR & LF. TAD BUFF DCA BUFFPT DCA AMOUNT JMP EXIT /ROUTINE TO RETURN TO ROTATE PROGRAM EXIT, CLA CLL TAD L RAR TAD AC RIB /RESTORE DATA INST FIELD ION /IF EXTENDED MEMORY. JMP I 0 /0 CONTAINS RETURN ADDRESS. END=. $