///////////////////////////////////////////////////////////////////// // // OSCAR-8 TEST // TEST SEMAPHORE OPERATIONS // // Enter digits 1, 2 or 3 at the keyboard without echo. // (entering any other character returns control back to OS/8). // Each of the 3 inputs POSTS a different EVENT CONTROL WORD, // which are WAITED for in 3 other lower priority tasks. // These tasks print out a line of 120 1's, 2's or 3's each // followed by a CR LF. The lines are each printed in a mutually // exclusive section guarded by a common semaphore. // // REQUIRES OSCAR-8 VERS 4 J.E. WULFF 30-MAY-77 // ///////////////////////////////////////////////////////////////////// / ************* / * * / * 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 / 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 / OSCAR VERS 4 TASK QUEUE TL= 20 / TCB LENGTH TQ= 720 / START OF TASK QUEUE ///////////////////////////////////////////////////////////////////// // OVERLAYED TASK QUEUE ///////////////////////////////////////////////////////////////////// *TQ+0 / TASK QUEUE ENTRY 0 TCBA TCBB TCBC TCBD // TASK A /////////////////////////////////////////////////////////// *1000 TCBA, *.+TL / TASK CONTROL BLOCK FOR TASK A TASKA / IPC -START OF TASK A CODE 0 / ICW - ALL PRIVATE REGISTERS CLEARED TASKA, DCA KECW / CLEAR TTY IN EVENT CONTROL WORD (AC=0) STA / -1 DCA TECW / SET TTY OUT EVENT CONTROL WORD (ASSUMED READY) IAC DCA SEMA / INITIALISE SEMAPHORE COUNT TO +1 DCA SEMA+1 / SEMAPHORE LINK TO 0 LOOPA, JMS I KGET / GET KEYBOARD CHARACTER (NO ECHO) DCA CHA TAD CHA TAD MCH1 / IS IT '1' ? SZA CLA JMP L2 / NO IOF / YES - POST TASK B JMS I POST ECW1 JMP LOOPA L2, TAD CHA TAD MCH2 / IS IT '2' ? SZA CLA JMP L3 / NO IOF / YES - POST TASK C JMS I POST ECW2 JMP LOOPA L3, TAD CHA TAD MCH3 / IS IT '3' ? SZA CLA JMP L4 / NO IOF / YES - POST TASK D JMS I POST ECW3 JMP LOOPA L4, IOF TAD OS8ADR SNA HLT / BARE METAL JMP I OS8ADR / RESTART OS8 ///////////////////////////////////////////////////////////////////// // VARIABLES AND CONSTANTS ///////////////////////////////////////////////////////////////////// CHA, 0 IFDEF DUBL < / defined for palbart assembler MCH1, -261 MCH2, -262 MCH3, -263 > IFNDEF DUBL < / NOT defined for PAL8 assembler MCH1, -61 MCH2, -62 MCH3, -63 > OS8ADR, 7600 SEMA, 0 0 // TASK B /////////////////////////////////////////////////////////// TCBB, *.+TL / TASK CONTROL BLOCK FOR TASK B INIT / ICP - COMMON RE-ENTRANT PROGRAM 700 / ICW - INITIALISE LOC 20 TO 22 ECW1 / LOC 20 - INDIRECT POINTER TO ECW1 -120 / LOC 21 - OWN INITIAL COUNT 61 / LOC 22 - OWN CHARACTER ECW1, 0 / TASKS OWN ECW // TASK C /////////////////////////////////////////////////////////// TCBC, *.+TL / TASK CONTROL BLOCK FOR TASK C INIT / ICP - COMMON RE-ENTRANT PROGRAM 700 / ICW - INITIALISE LOC 20 TO 22 ECW2 / LOC 20 - INDIRECT POINTER TO ECW2 -120 / LOC 21 - OWN INITIAL COUNT 62 / LOC 22 - OWN CHARACTER ECW2, 0 / TASKS OWN ECW // TASK D /////////////////////////////////////////////////////////// TCBD, *.+TL / TASK CONTROL BLOCK FOR TASK D INIT / ICP - COMMON RE-ENTRANT PROGRAM 700 / ICW - INITIALISE LOC 20 TO 22 ECW3 / LOC 20 - INDIRECT POINTER TO ECW3 -120 / LOC 21 - OWN INITIAL COUNT 63 / LOC 22 - OWN CHARACTER ECW3, 0 / TASKS OWN ECW ///////////////////////////////////////////////////////////////////// // RE-ENTRANT PROGRAM ///////////////////////////////////////////////////////////////////// *1200 INIT, DCA I 20 / CLEAR ECW LOOP, IOF JMS I WAIT / WAIT FOR CORRECT CHARACTER 20 / THIS IS USED INDIRECTLY IOF / START OF CRITICAL SECTION JMS I LOWER SEMA TAD 21 / OWN INITIAL COUNT DCA 23 / INITIALISE OWN COUNTER MORE, TAD 22 / OWN CHARACTER JMS I TPUT / OURPUT CHARACTER ISZ 23 / COUNT DOWN - DONE ? JMP MORE / NO JMS CRLF / YES IOF / END OF CRITICAL SECTION JMS I RAISE SEMA JMP LOOP ///////////////////////////////////////////////////////////////////// // TYPE CR LF ///////////////////////////////////////////////////////////////////// CRLF, 0 / TYPE CR AND LF TAD K215 JMS I TPUT TAD K212 JMS I TPUT JMP I CRLF K215, 15 / CR K212, 12 / LF $