///////////////////////////////////////////////////////////////////// // // Sample Program // INTRODUCTION TO PROGRAMMING 1968 p. 5-19 // // Modified to run as a task under OSCAR8 VERS 4 // // Enter a sequence of 4 digit positive octal numbers (<= 3777) // Entering '$' will cause this sequence to be sorted and output // Entering '.' will turn off interrupts and cause return to OS/8 // // While this is going on the OSCAR8 background task will toggle // the L indicator at 1 second intervals and display the contents // of a location in the switch register in the AC lights. // ///////////////////////////////////////////////////////////////////// / ************* / * * / * OSCAR-8 * / * * / ************* / SYSTEM PARAMETERS / VERSION 4 30-MAY-77 / ACCUMULATORS LINK, MQ REGISTER AND PROGRAM COUNTER / ARE SAVED IN THE TASK CONTROL BLOCK FOR EACH TASK. / ALSO SAVED ARE LOCATIONS 16 TO 27 WHICH MAY BE USED / AS PRIVATE REGISTERS BY EACH TASK. LOCATIONS 16 AND / 17 ARE AUTO-INCREMENTING. LOCATION 15 IS USED BY / THE OPERATING SYSTEM AND SHOULD NOT BE USED. / TASK CONTROL BLOCK STRUCTURE / 0 ! AC ! ACCUMULATOR / 1 ! WC ! WAIT COUNT / 2 ! BP ! BACK POINTER / 3 ! LK ! LINK / 4 ! PC ! PROGRAM COUNTER / 5 ! MQ ! MULTIPLIER QUOTIENT / 6 ! 16 ! LOCATION 16 / . . .. . / / 17 ! 27 ! LOCATION 27 / 20 IPC INTIAL PROGRAM COUNTER / 21 ICW INITIALISATION CONTROL WORD / . . .. . OPTIONAL INITIAL VALUES, ONE FOR / . . .. . EVERY BIT OF THE ICW / OSCAR8 VERS 4 TASK QUEUE TL= 20 / TCB LENGTH TQ= 720 / START OF TASK QUEUE / SYSTEM SYNCHRONISING ROUTINES WAIT= 34 / WAIT FOR AN EVENT POST= 35 / POST AN EVENT LOWER= 36 / LOWER A SEMAPHORE RAISE= 37 / RAISE A SEMAPHORE / SYSTEM I/O ROUTINES KGET= 40 / TTY IN (NO ECHO) TPUT= 41 / TTY OUT READ= 42 / HIGH SPEED READER PUNCH= 43 / HIGH SPEED PUNCH / EVENT CONTROL WORDS FOR I/O KECW= 44 / ECW FOR TTY IN TECW= 45 / ECW FOR TTY OUT RECW= 46 / ECW FOR HIGH SPEED READER PECW= 47 / ECW FOR HIGH SPEED PUNCH ///////////////////////////////////////////////////////////////////// // CONSTANTS CODING ///////////////////////////////////////////////////////////////////// *100 BUFF, END / (no test for overflow !?) BUFFPT, 0 M4, 7774 DIGCTR, 0 TEMP1, TEMBUF / INITIAL POINTER TO TEMP BUFFER TEMP, 0 / POINTER TO TEMP BUFFER M10, -10 K4000, 4000 HOLD, 0 AMOUNT, 0 FLAG, 0 TALLY, 0 X1, 0 X2, 0 PRNTCT, 0 MASK7, 7 IFDEF DUBL < / defined for palbart assembler K260, 260 / '0' K212, 212 / LF K215, 215 / CR QUEST, 277 MDOLAR, -244 M260, -260 MDOT, -256 > IFNDEF DUBL < / NOT defined for PAL8 assembler K260, 60 / '0' K212, 12 / LF K215, 15 / CR QUEST, 77 MDOLAR, -44 M260, -60 MDOT, -56 > OS8ADR, 7600 / RESTART OS/8 (WITH INTERRUPT OFF) *TQ+0 / TASK QUEUE ENTRY 0 TCBA *1000 TCBA, *.+TL / TASK CONTROL BLOCK FOR TASK A INIT / START OF TASK A CODE 0 / ALL PRIVATE REGISTERS CLEARED TEMBUF, 0 / TEMP BUFFER 0 0 0 / ROOM FOR 4 DIGITS ///////////////////////////////////////////////////////////////////// // INITIALISATION AND INPUT CODING ///////////////////////////////////////////////////////////////////// *1200 INIT, DCA KECW / CLEAR TTY IN EVENT CONTROL WORD (AC=0) STA / -1 DCA TECW / SET TTY OUT EVENT CONTROL WORD (ASSUMED READY) START, CLA CLL / no TLS in loop - kills last LF TAD BUFF / SET UP STORAGE AREA DCA BUFFPT DCA AMOUNT / SET AMOUNT TO 0 / ACCEPT ONE DIGIT ACCEPT, JMS CRLF / RETURN CARRIAGE TAD M4 / SET UP COUNTER DCA DIGCTR / FOR 4 DIGITS TAD TEMP1 / SET A POINTER TO DCA TEMP / TO TEMPORARY INPUT STORAGE NEWDIG, JMS I KGET / GET A CHARACTER (NO ECHO) DCA I TEMP / STORE IT TAD I TEMP JMS I TPUT / ECHO INPUT CHARACTER / CHECK THE CHARACTER CHECK, TAD I TEMP TAD MDOLAR / IS CHARACTER A $ ? SNA CLA JMP ORDER / YES: ORDER THE INPUT TAD I TEMP / NO: CHECK FOR OCTAL INPUT TAD M260 / IS ASCII LESS THAN 260 ? SPA JMP ERROR / YES: ERROR TAD M10 / NO: SUBTRACT 10 SMA CLA JMP ERROR / ASCII is GREATER THAN 267 ISZ TEMP ISZ DIGCTR / 4 DIGITS YET ? JMP NEWDIG / NO: GET ANOTHER / YES: PACK THE 4 DIGITS INTO ONE NUMBER PACK, TAD TEMP1 / SET POINTER TO STORAGE LOC DCA TEMP DCA HOLD / CLEAR LOCATION HOLD TAD M4 / SET COUNTER FOR 4 DIGITS DCA DIGCTR DIGPCK, TAD HOLD / CONTENTS OF HOLD INTO AC CLL RAL / ROTATE INTO CLEARED LINK RTL / ROTATE TWICE MORE TAD I TEMP / ADD ONE ASCII CHARACTER TAD M260 / SUBTRACT OUT THE 260 DCA HOLD / STORE AC IN HOLD ISZ TEMP / INCREMENT STORAGE POINTER ISZ DIGCTR / PACKED 4 DIGITS YET ? JMP DIGPCK / NO: PACK ANOTHER TAD HOLD / YES: STORE PACKED NUMBER DCA I BUFFPT TAD I BUFFPT / NEGATIVE INPUT ? TAD K4000 SMA CLA JMP ERROR / YES: REJECT ENTRY ISZ AMOUNT / NO: COUNT THE ENTRIES ISZ BUFFPT / SET UP FOR A NEW ENTRY JMP ACCEPT / GET A NEW ENTRY ///////////////////////////////////////////////////////////////////// // PUT THE NUMBERS IN INCREASING ORDER ///////////////////////////////////////////////////////////////////// ORDER, TAD AMOUNT / SET UP A TALLY CIA / TO COUNT THE IAC / NUMBER OF DCA TALLY / COMPARISONS DCA FLAG / CLEAR THE FLAG TAD BUFF / SET THE POINTERS DCA X1 / (X1 and X2) TO THE TAD BUFF / PROPER DATA LOCATIONS IAC / X2=X1+1 DCA X2 TEST, TAD I X2 / COMPARE X1 AND X2 CIA TAD I X1 SMA SZA CLA / REVERSE ENTRIES IF JMS REVERSE / X2 IS LESS THAN X1 ISZ X1 / INCREMENT THE POINTERS ISZ X2 ISZ TALLY / DONE COMPARING YET ? JMP TEST / NO: COMPARE MORE ENTRIES TAD FLAG / YES: IS FLAG SET ? SZA CLA JMP ORDER / YES: MAKE ANOTHER PASS / NO: TYPE THE ORDERED DATA ///////////////////////////////////////////////////////////////////// // PRINT OUT THE ORDERED NUMBERS ///////////////////////////////////////////////////////////////////// JMS CRLF / RETURN THE CARRIAGE TAD BUFF / SET THE BUFFER POINTER DCA BUFFPT TAD AMOUNT / SET LIMIT FOR OUTPUT CIA DCA PRNTCT ANOTHR, JMS CRLF / RETURN CARRIAGE TAD M4 / COUNT THE DIGITS OUTPUT DCA DIGCTR DCA HOLD / CLEAR HOLD LOCATION TAD I BUFFPT / GET A CHARACTER CLL RAL / ROTATE INTO CLEARED LINK MORE, TAD HOLD / ADD HOLD TO AC RAL / ROTATE THREE TIMES LEFT RTL DCA HOLD / STORE AC IN HOLD TAD HOLD AND MASK7 / MASK OUT FIRST 9 BITS TAD K260 JMS I TPUT / TYPE OUT ONE DIGIT ISZ DIGCTR / TYPED OUT 4 DIGITS ? JMP MORE / NO: TYPE ANOTHER DIGIT ISZ BUFFPT / YES: INCREMENT BUFFER LOC ISZ PRNTCT / TYPED ALL ENTRIES ? JMP ANOTHR / NO: TYPE ANOTHER ENTRY JMS CRLF / YES: RETURN CARRIAGE AND JMP START / ACCEPT MORE NUMBERS TO SORT ERROR, CLA TAD I TEMP / LAST INPUT CHARACTER TAD MDOT / IS IT '.' ? SZA CLA JMP ER1 / NO IOF / YES JMP I OS8ADR / RESTART OS8 ER1, TAD QUEST JMS I TPUT JMP ACCEPT / DISREGARDS ILLEGAL ENTRY ///////////////////////////////////////////////////////////////////// // SUBROUTINE TO SWITCH X'S ///////////////////////////////////////////////////////////////////// REVERSE,0 TAD I X1 DCA HOLD TAD I X2 DCA I X1 TAD HOLD DCA I X2 CLA CLL CMA / SET FLAG WHENEVER DCA FLAG / A SWITCH IS MADE JMP I REVERSE ///////////////////////////////////////////////////////////////////// // TYPE CR LF ///////////////////////////////////////////////////////////////////// CRLF, 0 / TYPE CR AND LF TAD K215 JMS I TPUT TAD K212 JMS I TPUT JMP I CRLF END=. $