/////////////////////////////////////// PAL8-V10A NO DATE PAGE 1 ///////////////////////////////////////////////////////////////////// // // Sample Program // INTRODUCTION TO PROGRAMMING 1968 p. 5-17 // // The previously described routines for typing text and numeric trans- // lation are combined in the following program example which is similar // to the final program of Chapter 3. This program performs the same // numeric sort; however, the numbers to be placed in order are supplied // from the keyboard. // // Any number of elements may be supplied; the end of input is sig- // naled by typing a dollar sign ($). The program includes routines to // exclude any nonoctal digits from input and type a question mark. Only // positive octal numbers (0-3777) are allowed as input to the program. // // Changes: // // 1) Corrected bug - initial TLS should not be done in the START loop. // Output after printing ordered group results now has two CR LF's. // // This may have been Ok with the original Teletype interface, but // with SIMH, a TLS sending a NULL character immediately after sending // a LF, and not waiting for output to be completed, overwrites the LF // in the output. This may be a bug in SIMH or pidp8i. // // 2a) When running uder OS/8, input from the pseudo Teletype keyboard does // not have bit 8 set, unlike a real Teletype. // Therefore constants for comparison K260 etc have been conitionally // coded as octal 60 etc with IFNDEF DUBL, which is not defined in PAL8 // // 2b) When running under bare metal and assembling with 'palbart' input does // have bit 8 set. Assemble octal 260 with IFDEF DUBL, defined in palbart. // ///////////////////////////////////////////////////////////////////// /////////////////////////////////////// PAL8-V10A NO DATE PAGE 2 ///////////////////////////////////////////////////////////////////// // INITIALISATION AND INPUT CODING ///////////////////////////////////////////////////////////////////// 0200 *200 00200 6046 INIT, TLS / TLS TO SET PRINTER FLAG 00201 7300 START, CLA CLL / no TLS in loop - kills last LF 00202 1122 TAD BUFF / SET UP STORAGE AREA 00203 3123 DCA BUFFPT 00204 3137 DCA AMOUNT / SET AMOUNT TO 0 / ACCEPT ONE DIGIT 00205 4106 ACCEPT, JMS CRLF / RETURN CARRIAGE 00206 1124 TAD M4 / SET UP COUNTER 00207 3125 DCA DIGCTR / FOR 4 DIGITS 00210 1126 TAD TEMP1 / SET A POINTER TO 00211 3127 DCA TEMP / TO TEMPORARY INPUT STORAGE 00212 4114 NEWDIG, JMS LISN / GET A CHARACTER 00213 3527 DCA I TEMP / STORE IT / CHECK THE CHARACTER 00214 1527 CHECK, TAD I TEMP 00215 1152 TAD MDOLAR / IS CHARACTER A $ ? 00216 7650 SNA CLA 00217 5261 JMP ORDER / YES: ORDER THE INPUT 00220 1527 TAD I TEMP / NO: CHECK FOR OCTAL INPUT 00221 1153 TAD M260 / IS ASCII LESS THAN 260 ? 00222 7510 SPA 00223 5342 JMP ERROR / YES: ERROR 00224 1134 TAD M10 / NO: SUBTRACT 10 00225 7700 SMA CLA 00226 5342 JMP ERROR / ASCII is GREATER THAN 267 00227 2127 ISZ TEMP 00230 2125 ISZ DIGCTR / 4 DIGITS YET ? 00231 5212 JMP NEWDIG / NO: GET ANOTHER / YES: PACK THE 4 DIGITS INTO ONE NUMBER 00232 1126 PACK, TAD TEMP1 / SET POINTER TO STORAGE LOC 00233 3127 DCA TEMP 00234 3136 DCA HOLD / CLEAR LOCATION HOLD 00235 1124 TAD M4 / SET COUNTER FOR 4 DIGITS 00236 3125 DCA DIGCTR /////////////////////////////////////// PAL8-V10A NO DATE PAGE 3 00237 1136 DIGPCK, TAD HOLD / CONTENTS OF HOLD INTO AC 00240 7104 CLL RAL / ROTATE INTO CLEARED LINK 00241 7006 RTL / ROTATE TWICE MORE 00242 1527 TAD I TEMP / ADD ONE ASCII CHARACTER 00243 1153 TAD M260 / SUBTRACT OUT THE 260 00244 3136 DCA HOLD / STORE AC IN HOLD 00245 2127 ISZ TEMP / INCREMENT STORAGE POINTER 00246 2125 ISZ DIGCTR / PACKED 4 DIGITS YET ? 00247 5237 JMP DIGPCK / NO: PACK ANOTHER 00250 1136 TAD HOLD / YES: STORE PACKED NUMBER 00251 3523 DCA I BUFFPT 00252 1523 TAD I BUFFPT / NEGATIVE INPUT ? 00253 1135 TAD K4000 00254 7700 SMA CLA 00255 5342 JMP ERROR / YES: REJECT ENTRY 00256 2137 ISZ AMOUNT / NO: COUNT THE ENTRIES 00257 2123 ISZ BUFFPT / SET UP FOR A NEW ENTRY 00260 5205 JMP ACCEPT / GET A NEW ENTRY ///////////////////////////////////////////////////////////////////// // PUT THE NUMBERS IN INCREASING ORDER ///////////////////////////////////////////////////////////////////// 00261 1137 ORDER, TAD AMOUNT / SET UP A TALLY 00262 7041 CIA / TO COUNT THE 00263 7001 IAC / NUMBER OF 00264 3141 DCA TALLY / COMPARISONS 00265 3140 DCA FLAG / CLEAR THE FLAG 00266 1122 TAD BUFF / SET THE POINTERS 00267 3142 DCA X1 / (X1 and X2) TO THE 00270 1122 TAD BUFF / PROPER DATA LOCATIONS 00271 7001 IAC / X2=X1+1 00272 3143 DCA X2 00273 1543 TEST, TAD I X2 / COMPARE X1 AND X2 00274 7041 CIA 00275 1542 TAD I X1 00276 7740 SMA SZA CLA / REVERSE ENTRIES IF 00277 4346 JMS REVERSE / X2 IS LESS THAN X1 00300 2142 ISZ X1 / INCREMENT THE POINTERS 00301 2143 ISZ X2 00302 2141 ISZ TALLY / DONE COMPARING YET ? 00303 5273 JMP TEST / NO: COMPARE MORE ENTRIES 00304 1140 TAD FLAG / YES: IS FLAG SET ? 00305 7640 SZA CLA 00306 5261 JMP ORDER / YES: MAKE ANOTHER PASS / NO: TYPE THE ORDERED DATA /////////////////////////////////////// PAL8-V10A NO DATE PAGE 4 ///////////////////////////////////////////////////////////////////// // PRINT OUT THE ORDERED NUMBERS ///////////////////////////////////////////////////////////////////// 00307 4106 JMS CRLF / RETURN THE CARRIAGE 00310 1122 TAD BUFF / SET THE BUFFER POINTER 00311 3123 DCA BUFFPT 00312 1137 TAD AMOUNT / SET LIMIT FOR OUTPUT 00313 7041 CIA 00314 3144 DCA PRNTCT 00315 4106 ANOTHR, JMS CRLF / RETURN CARRIAGE 00316 1124 TAD M4 / COUNT THE DIGITS OUTPUT 00317 3125 DCA DIGCTR 00320 3136 DCA HOLD / CLEAR HOLD LOCATION 00321 1523 TAD I BUFFPT / GET A CHARACTER 00322 7104 CLL RAL / ROTATE INTO CLEARED LINK 00323 1136 MORE, TAD HOLD / ADD HOLD TO AC 00324 7004 RAL / ROTATE THREE TIMES LEFT 00325 7006 RTL 00326 3136 DCA HOLD / STORE AC IN HOLD 00327 1136 TAD HOLD 00330 0145 AND MASK7 / MASK OUT FIRST 9 BITS 00331 1146 TAD K260 00332 4100 JMS TYPE / TYPE OUT ONE DIGIT 00333 2125 ISZ DIGCTR / TYPED OUT 4 DIGITS ? 00334 5323 JMP MORE / NO: TYPE ANOTHER DIGIT 00335 2123 ISZ BUFFPT / YES: INCREMENT BUFFER LOC 00336 2144 ISZ PRNTCT / TYPED ALL ENTRIES ? 00337 5315 JMP ANOTHR / NO: TYPE ANOTHER ENTRY 00340 4106 JMS CRLF / YES: RETURN CARRIAGE AND 00341 5201 JMP START / ACCEPT MORE NUMBERS TO SORT /////////////////////////////////////// PAL8-V10A NO DATE PAGE 5 ///////////////////////////////////////////////////////////////////// // SUBROUTINEs ///////////////////////////////////////////////////////////////////// 00342 7200 ERROR, CLA / TYPE '?' 00343 1151 TAD QUEST 00344 4100 JMS TYPE 00345 5205 JMP ACCEPT / DISREGARDS ILLEGAL ENTRY 00346 0000 REVERSE,0 / SWITCH X'S 00347 1542 TAD I X1 00350 3136 DCA HOLD 00351 1543 TAD I X2 00352 3542 DCA I X1 00353 1136 TAD HOLD 00354 3543 DCA I X2 00355 7340 CLA CLL CMA / SET FLAG WHENEVER 00356 3140 DCA FLAG / A SWITCH IS MADE 00357 5746 JMP I REVERSE 0360 END=. ///////////////////////////////////////////////////////////////////// // PAGE 0 SUBROUTINES ///////////////////////////////////////////////////////////////////// 0100 *100 00100 0000 TYPE, 0 / TYPE OUTPUT SUBROUTINE 00101 6041 TSF / TEST TELETYPE DONE FLAG 00102 5101 JMP .-1 / BUSY WAIT 00103 6046 TLS / PRINT CHARACTER IN AC 00104 7200 CLA 00105 5500 JMP I TYPE 00106 0000 CRLF, 0 / TYPE CR AND LF 00107 1150 TAD K215 00110 4100 JMS TYPE 00111 1147 TAD K212 00112 4100 JMS TYPE 00113 5506 JMP I CRLF 00114 0000 LISN, 0 / LISN INPUT SUBROUTINE 00115 6031 KSF / TEST INPUT DONE FLAG 00116 5115 JMP .-1 / BUSY WAIT 00117 6036 KRB / GET CHARACTER 00120 6046 TLS / ECHO CHARACTER (no wait !?) 00121 5514 JMP I LISN /////////////////////////////////////// PAL8-V10A NO DATE PAGE 6 ///////////////////////////////////////////////////////////////////// // CONSTANTS CODING ///////////////////////////////////////////////////////////////////// 00122 0360 BUFF, END / (no test for overflow !?) 00123 0000 BUFFPT, 0 00124 7774 M4, 7774 00125 0000 DIGCTR, 0 00126 0130 TEMP1, TEMBUF / INITIAL POINTER TO TEMP BUFFER 00127 0000 TEMP, 0 / POINTER TO TEMP BUFFER 00130 0000 TEMBUF, 0 / TEMP BUFFER 00131 0000 0 00132 0000 0 00133 0000 0 / ROOM FOR 4 DIGITS 00134 7770 M10, -10 00135 4000 K4000, 4000 00136 0000 HOLD, 0 00137 0000 AMOUNT, 0 00140 0000 FLAG, 0 00141 0000 TALLY, 0 00142 0000 X1, 0 00143 0000 X2, 0 00144 0000 PRNTCT, 0 00145 0007 MASK7, 7 IFDEF DUBL < / defined for palbart assembler K260, 260 / '0' K212, 212 / LF K215, 215 / CR QUEST, 277 MDOLAR, -244 M260, -260 > IFNDEF DUBL < / NOT defined for PAL8 assembler 00146 0060 K260, 60 / '0' 00147 0012 K212, 12 / LF 00150 0015 K215, 15 / CR 00151 0077 QUEST, 77 00152 7734 MDOLAR, -44 00153 7720 M260, -60 > $ /////////////////////////////////////// PAL8-V10A NO DATE PAGE 7 ACCEPT 0205 AMOUNT 0137 ANOTHR 0315 BUFF 0122 BUFFPT 0123 CHECK 0214 CRLF 0106 DIGCTR 0125 DIGPCK 0237 END 0360 ERROR 0342 FLAG 0140 HOLD 0136 INIT 0200 K212 0147 K215 0150 K260 0146 K4000 0135 LISN 0114 MASK7 0145 MDOLAR 0152 MORE 0323 M10 0134 M260 0153 M4 0124 NEWDIG 0212 ORDER 0261 PACK 0232 PRNTCT 0144 QUEST 0151 REVERS 0346 START 0201 TALLY 0141 TEMBUF 0130 TEMP 0127 TEMP1 0126 TEST 0273 TYPE 0100 X1 0142 X2 0143 ERRORS DETECTED: 0 LINKS GENERATED: 0