1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-28 04:57:43 +00:00
Files
PDP-10.its/src/sysen1/nwatch.38
Lars Brinkhoff f78c65e3cc Build NWATCH.
2016-12-06 07:45:05 -08:00

197 lines
4.7 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 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