(* ------------------- VERSION 10 22.04.86 ------------------- *) PACKET privileged operations DEFINES (* Autor: J.Liedtke *) block , calendar , collect garbage blocks , define collector , fixpoint , info password , prio , save system , send , set clock , set date , shutup , unblock : LET prio field = 6 , cr = ""13"" , archive channel = 31 , ack = 0 , garbage collect code = 1 , fixpoint code = 2 , shutup code = 4 , shutup and save code = 12 , reserve code = 19 , release code = 20 ; INT PROC prio (TASK CONST task) : pcb (task, prio field) ENDPROC prio ; PROC prio (TASK CONST task, INT CONST new prio) : pcb (task, prio field, new prio) ENDPROC prio ; TEXT VAR date text ; PROC collect garbage blocks : system operation (garbage collect code) ENDPROC collect garbage blocks ; PROC fixpoint : system operation (fixpoint code) ENDPROC fixpoint ; PROC info password (TEXT CONST old info password, new info password) : INT VAR error code ; IF online THEN say (""3""5""10"") FI ; IF LENGTH new info password < 10 THEN infopw (old info password + cr, new info pw, error code) ; IF error code = 0 THEN shutup ELSE errorstop ("Falsches Info-Passwort") FI ELSE errorstop ("Passwort zu lang (max. 9 Zeichen)") FI ; cover tracks . new info pw : IF new info password = "-" THEN "-" + 9 * "0" ELSE new info password + "cr" FI . ENDPROC info password ; PROC shutup : system operation (shutup code) ; IF command dialogue THEN wait for configurator ; page ; set date FI ENDPROC shutup ; PROC save system : INT VAR reply ; TASK VAR channel owner ; enable stop ; reserve archive channel ; IF yes ("Leere Floppy eingelegt") THEN reserve archive channel ; system operation (shutup and save code) ; release archive channel ; IF command dialogue THEN wait for configurator ; page ; set date FI FI ; release archive channel . reserve archive channel : channel owner := task (archive channel) ; IF NOT is niltask (channel owner) THEN ask channel owner to reserve the channel ; IF channel owner does not reserve channel THEN errorstop ("Task """ + name (channel owner) + """ gibt Kanal " + text (archive channel) + " nicht frei") FI FI . ask channel owner to reserve the channel : forget (ds) ; ds := nilspace ; pingpong (channel owner, reserve code, ds, reply) . channel owner does not reserve channel : (reply <> ack) AND task exists . task exists : reply <> -1 . release archive channel : forget (ds) ; ds := nilspace ; pingpong (channel owner, release code, ds, reply) . ENDPROC save system ; PROC system operation (INT CONST code) : INT VAR size, used ; storage (size, used) ; IF used <= size THEN sys op (code) ELSE errorstop ("Speicherengpass") FI ENDPROC system operation ; DATASPACE VAR ds := nilspace ; PROC wait for configurator : INT VAR i , receipt ; FOR i FROM 1 UPTO 20 WHILE configurator exists REP pause (30) ; forget (ds) ; ds := nilspace ; ping pong (configurator, ack, ds, receipt) UNTIL receipt >= 0 PER . configurator exists : disable stop ; TASK VAR configurator := task ("configurator") ; clear error ; NOT is niltask (configurator) . ENDPROC wait for configurator ; BOOL VAR hardware clock ok ; REAL VAR now ; PROC set date : hardware clock ok := TRUE ; try to get date and time from hardware ; IF NOT hardware clock ok THEN get date and time from user FI ; define date and time . try to get date and time from hardware : disable stop ; REAL VAR previous now ; now := 0.0 ; INT VAR try ; FOR try FROM 1 UPTO 3 WHILE hardware clock ok REP previous now := now ; now := date (hardwares today) + time (hardwares time) UNTIL now = previous now OR is error PER ; clear error ; enable stop . get date and time from user : line (2) ; put (" Bitte geben Sie das heutige Datum ein :") ; date text := date ; TEXT VAR exit char ; editget (date text, cr, "", exit char) ; now := date (date text) ; line ; put (" und die aktuelle Uhrzeit :") ; date text := time of day ; editget (date text, cr, "", exit char) ; now INCR time (date text) ; IF NOT last conversion ok THEN errorstop ("Falsche Zeitangabe") FI . hardwares today : calendar (3) + "." + calendar (4) + "." + calendar (5) . hardwares time : calendar (2) + ":" + calendar (1) . define date and time : set clock (now) . ENDPROC set date ; TEXT PROC calendar (INT CONST index) : INT VAR bcd ; control (10, index, 0, bcd) ; IF bcd < 0 THEN hardware clock ok := FALSE ; "" ELSE text (low digit + 10 * high digit) FI . low digit : bcd AND 15 . high digit: (bcd AND (15*256)) DIV 256 . ENDPROC calendar ; PROC infopw (TEXT CONST old, new, INT VAR error code) : EXTERNAL 81 ENDPROC infopw ; PROC sys op (INT CONST code) : EXTERNAL 90 ENDPROC sys op ; PROC set clock (REAL CONST time) : EXTERNAL 103 ENDPROC set clock ; PROC pcb (TASK CONST task, INT CONST field, value) : EXTERNAL 105 ENDPROC pcb ; PROC unblock (TASK CONST task) : EXTERNAL 108 ENDPROC unblock ; PROC block (TASK CONST task) : EXTERNAL 109 ENDPROC block ; PROC send (TASK CONST from, to, INT CONST order, DATASPACE VAR ds, INT VAR receipt) : EXTERNAL 127 ENDPROC send ; PROC define collector (TASK CONST task) : EXTERNAL 128 ENDPROC define collector ; ENDPACKET privileged operations ;