1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-04 07:43:02 +00:00

Build NWATCH.

This commit is contained in:
Lars Brinkhoff
2016-12-04 22:25:49 +01:00
committed by Eric Swenson
parent 95cb6f4a9e
commit f78c65e3cc
5 changed files with 318 additions and 1 deletions

196
src/sysen1/nwatch.38 Executable file
View File

@@ -0,0 +1,196 @@
; NWATCH - Watch for non-TVs -*-MIDAS-*-
versio==.fnam2
title Digital watch
.insrt syseng;$call macro
.insrt eak;macros >
bp=d
cc=e
tyoc==1
lpdl==10
lcmdbuf==10
var stime ; sleep time, i.e. time between updates
var oline ; output line no.
var linel ; terminal line length
var pagel ; terminal page length
var pdl(lpdl) ; stack
var cmdbuf(lcmdbuf) ; command buffer
var obuf(4) ; output buffer
flag ovr ; set if TTY can't overprint
flag mil ; use 24 hour (military) time
flag pact ; use the paacific time zone
flag secs ; include seconds in display
nwatch: move p,[-lpdl,,pdl-1] ; set up stack
.suset [.roption,,f]
trz f,%fovr+%fmil+%fsecs ; init flags
movei t,5*30. ; init sleep time to 5 seconds
movem t,stime ; ...
setzm oline ; use top line for output
.open tyoc,[.uio,,'tty]
.lose %lsfil
$call cnsget,[#tyoc][pagel,linel,t,t,a]
.lose %lssys ; too bad
tlne a,%toovr ; copy %TOOVR into %FOVR
tro f,%fovr
aos linel ; include continuation column in linel
tlnn f,optcmd ; superior have a command line for us?
jrst cmd3
move t,[cmdbuf,,cmdbuf+1] ; clear command buffer
setzm cmdbuf
blt t,cmdbuf+lcmdbuf-1
.break 12,[5,,cmdbuf] ; read command from superior
move a,[440700,,cmdbuf] ; b.p. to command buffer
movei b,0
ldb t,[350700,,cmdbuf] ; get first char of JCL
caie t,"? ; requesting doc?
jrst cmd1
sout #tyoc,,"NWATCH command line options:
<number> No. of seconds between updates (5 sec default)
/B Display on bottom line of screen
/M Use 24 hour time
/S Display seconds
/P Convert time to pacific time zone
"
jrst quit
cmd1: ildb t,a ; take no. of seconds to sleep from
cail t,"0 ; command line and convert to binary
caile t,"9
jrst cmd2
imuli b,10. ; multiply previous crap by 10
addi b,-"0(t) ; add in this digit
jrst cmd1
cmd2: imuli b,30. ; convert to 30ths
skipe b ; don't allow a zero sleep time
movem b,stime ; store sleep time
caia ; character already in T, skip ILDB
cmd2a: ildb t,a ; get next character
caie t,^M ; CR or ^C?
cain t,^C
jrst cmd3
caie t,"/ ; terminator a slash?
jrst cmd2a
ildb t,a ; get character after slash
cail t,"a ; lowercase letter?
caile t,"z
caia
subi t,40 ; convert to uppercase
cain t,"M ; /M?
tro f,%fmil ; /M, use 24 hour time
move b,pagel ; get bottom line no.
cain t,"B ; /B?
movem b,oline ; /B, make output line the bottom line
cain t,"S ; /S?
tro f,%fsecs ; /S, include seconds in output
cain t,"P ; /P?
tro f,%fpact ; /P, use pacific time zone
jrst cmd2a
cmd3: tlne f,optddt
.value [asciz ":FORGET "] ; start running
update: move bp,[440700,,obuf] ; buffer ptr
movei cc,0 ; character count
move a,[440700,,[asciz "SV"]]
pushj p,ascout ; buf ^PV for setting vertical position
move t,oline ; get output line no.
addi t,8 ; add 8 for ITS
idpb t,bp ; store vertical position
aos cc ; ...
move a,[440700,,[asciz "H"]]
pushj p,ascout ; buf ^PH for setting horizontal position
move t,linel ; get horizontal position
subi t,5 ; subtract no. of chars in time
trne f,%fsecs ; seconds too?
subi t,3 ; need three more chars
addi t,8 ; add 8 for ITS
idpb t,bp ; move there
aos cc
trnn f,%fovr ; can TTY overprint?
jrst l1 ; no, don't need to erase to end of line
move a,[440700,,[asciz "L"]] ; output an erase to end of line
pushj p,ascout
l1: $call rqdate,,a ; get date
.lose %lssys
movei a,(a) ; time is low 18 bits
idivi a,60.*2 ; convert from half seconds to minutes
push p,b ; now minutes in a, half seconds in b
idivi a,60. ; convert to hours and minutes
trnn f,%fpact ; pacific time zone?
jrst l1.5
subi a,3 ; we're 3 hours behind
jumpge a,l1.5 ; no wrap to worry about
addi a,24. ; correct to the previous day
l1.5: trne f,%fmil ; 24 hour time?
jrst l2
cail a,12. ; convert from 24 hour to 12 hour time
subi a,12.
cain a,0 ; in 12-hour mode the first hour after midnight
addi a,12. ; is called 12 o'clock too.
l2: pushj p,deczs ; put out hours
movei t,":
idpb t,bp ; put in ":"
aos cc
move a,b
pushj p,decout ; put out minutes
pop p,a ; restore half seconds
trnn f,%fsecs ; seconds?
jrst l3
movei t,":
idpb t,bp ; put in ":"
aos cc
lsh a,-1 ; convert to seconds
pushj p,decout
l3: move a,[440700,,[asciz "R"]]
pushj p,ascout
move bp,[440700,,obuf]
$call siot,[#tyoc,bp,cc],#%tjdis+%tjctn
.lose %lsfil
; $call finish,#tyoc
; .lose %lsfil
move t,stime
.sleep t, ; sleep peacefully
jrst update
ascout: ildb t,a
jumpe t,cpopj
idpb t,bp
aos cc
jrst ascout
cpopj: popj p,
deczs: push p,b
idivi a,10.
addi a,"0
cain a,"0
movei a,40
jrst dec1
decout: push p,b
idivi a,10.
addi a,"0
dec1: idpb a,bp
aos cc
addi b,"0
idpb b,bp
aos cc
pop p,b
popj p,
quit: .break 16,140000
.value
constants
variables
end nwatch