mirror of
https://github.com/PDP-10/its.git
synced 2026-01-15 08:03:19 +00:00
492 lines
6.7 KiB
Plaintext
Executable File
492 lines
6.7 KiB
Plaintext
Executable File
; -*-MIDAS-*-
|
||
|
||
TITLE DIGITAL CROCK
|
||
|
||
; Original program hacked up by GLS.
|
||
; 10X/20X version hacked by EAK.
|
||
; Modified by KLH for DM2500's.
|
||
|
||
if1 {
|
||
its==1 ; can run on either ITS or
|
||
tnx==1 ; 10X or 20X
|
||
.insrt system
|
||
}
|
||
|
||
; If not ITS, can't use ^P codes. Must define terminal type explicitly.
|
||
ifndef t%its, t%its==its ; ITS ^P codes
|
||
ifndef t%hz15, t%hz15==0 ; Hazeltine 1500
|
||
ifndef t%dm25, t%dm25==0 ; Datamedia 2500
|
||
ifndef t%vt52, t%vt52==0 ; VT52
|
||
ifndef t%c100, t%c100==0 ; Concept 100
|
||
ifn t%its+t%hz15+t%dm25+t%vt52+t%c100-1, .fatal You must specify exactly one terminal type.
|
||
|
||
|
||
; ACs
|
||
A=1
|
||
B=2
|
||
C=3
|
||
D=4
|
||
E=5
|
||
F=6
|
||
G=7
|
||
H=10
|
||
S=14
|
||
X=15
|
||
Y=16
|
||
P=17
|
||
|
||
call=pushj p,
|
||
return=popj p,
|
||
|
||
ifn its,{
|
||
toch=17
|
||
.insrt syseng;$call macro
|
||
}
|
||
ifn 20x,{
|
||
TM%DPY=1_35.
|
||
VTSOP=JSYS 635
|
||
RTMOD=JSYS 636
|
||
STMOD=JSYS 637
|
||
RTCHR=JSYS 640
|
||
}
|
||
|
||
equals var,.scalar
|
||
|
||
ifn tnx, var oldmod
|
||
lpdl==40
|
||
var pdl(lpdl)
|
||
|
||
|
||
dcrock: move p,[-lpdl,,pdl-1]
|
||
ifn its,{
|
||
$call open,[#toch,[sixbit/tty/]][][#%tjdis+.uao]
|
||
.lose %lsfil
|
||
}
|
||
ifn tnx,{
|
||
movei a,.priin
|
||
rfmod
|
||
movem b,oldmod ; save old status
|
||
trz b,tt%dam ; set to 8-bit i/o
|
||
ifn t%its,{ ; VTS
|
||
tro b,1_7 ; turn on output translation
|
||
}
|
||
sfmod ; zap
|
||
ifn t%its,{
|
||
rtmod
|
||
tlo b,(tm%dpy)
|
||
stmod
|
||
}
|
||
}
|
||
ifn its,{
|
||
move a,[440700,,frame]
|
||
movei b,lframe
|
||
.call [ setz ? sixbit /siot/
|
||
1000,,toch ? a ? b ((setz))]
|
||
.lose %lsfil
|
||
}
|
||
ifn tnx,{
|
||
movei a,.priou
|
||
hrroi b,frame
|
||
movni c,lframe
|
||
sout
|
||
}
|
||
move a,[440700,,ob]
|
||
movem a,obp
|
||
movei a,lob
|
||
movem a,obc
|
||
repeat 6, setzm screen+.rpcnt
|
||
seto h,
|
||
hackit:
|
||
ifn its,{
|
||
.rdtime s,
|
||
.rtime c,
|
||
camn c,h
|
||
.value [asciz /:Clock not set./]
|
||
move h,c
|
||
}
|
||
ifn tnx,{
|
||
time
|
||
move s,a
|
||
seto 2, ; get current time
|
||
setz 4, ; with no funny daylight savings or timezone stuff
|
||
odcnv ; get time
|
||
movei a,(d)
|
||
camn a,h
|
||
jrst hackit
|
||
move h,a
|
||
movei c,0
|
||
idivi a,60.*60.
|
||
call sixn
|
||
move a,b
|
||
idivi a,60.
|
||
call sixn
|
||
move a,b
|
||
call sixn
|
||
}
|
||
MOVNI D,6
|
||
LOOP: LSHC B,6
|
||
ANDI B,17
|
||
MOVE E,DIGITS(B)
|
||
MOVE F,E
|
||
EXCH F,SCREEN+6(D)
|
||
XOR F,E
|
||
JUMPE F,NEXT
|
||
MOVNI G,43
|
||
CYCLE: JUMPGE F,NXTBIT
|
||
hlrz x,chpos+43(g)
|
||
add x,horiz+6(d)
|
||
hrrz y,chpos+43(g)
|
||
addi y,4+2
|
||
call movcur
|
||
jumpge e,blank
|
||
movei a,"#
|
||
call outb
|
||
jrst nxtbit
|
||
blank: call clchar
|
||
nxtbit: lshc e,1
|
||
aojl g,cycle
|
||
next: aojl d,loop
|
||
movei y,22.
|
||
movei x,69.
|
||
call movcur
|
||
call force
|
||
ifn its,{
|
||
.listen a,
|
||
jumpn a,quit
|
||
addi s,28.
|
||
movn s,s
|
||
.sleep s,
|
||
jrst hackit
|
||
}
|
||
ifn tnx,{
|
||
movei a,.priin
|
||
ife t%vt52,{
|
||
sibe
|
||
jrst quit
|
||
}
|
||
ifn t%vt52,{
|
||
sibe
|
||
jrst [ bin
|
||
caie b,^S
|
||
jrst quit
|
||
;X; sibe
|
||
;X; caia
|
||
;X; jrst quit
|
||
bin
|
||
caie b,^Q
|
||
jrst quit
|
||
jrst .+1 ]
|
||
|
||
}
|
||
time
|
||
add a,b
|
||
sub a,s
|
||
jumpl a,hackit
|
||
imuli a,1000.
|
||
idiv a,b
|
||
subi a,7
|
||
disms
|
||
jrst hackit
|
||
}
|
||
|
||
subttl Output
|
||
|
||
lob==200.
|
||
var ob(<lob+4>/5)
|
||
var obp
|
||
var obc
|
||
|
||
outb: idpb a,obp
|
||
sosg obc
|
||
call force
|
||
return
|
||
|
||
|
||
subttl Operating system subroutines
|
||
|
||
ifn its,{
|
||
|
||
force: push p,b
|
||
movei b,lob
|
||
sub b,obc
|
||
jumpe b,for1
|
||
push p,a
|
||
move a,[440700,,ob]
|
||
movem a,obp
|
||
addm b,obc
|
||
$call siot,[#toch,a,b]
|
||
.lose %lsfil
|
||
pop p,a
|
||
for1: pop p,b
|
||
return
|
||
|
||
|
||
quit: .logout 1,
|
||
}
|
||
|
||
ifn tnx,{
|
||
|
||
|
||
force: push p,c
|
||
movei c,lob
|
||
exch c,obc
|
||
subi c,lob
|
||
jumpe c,for1
|
||
push p,a
|
||
push p,b
|
||
movei a,.priou
|
||
move b,[440700,,ob]
|
||
movem b,obp
|
||
sout
|
||
pop p,b
|
||
pop p,a
|
||
for1: pop p,c
|
||
return
|
||
|
||
|
||
quit: movei x,0
|
||
movei y,23.
|
||
call movcur
|
||
call force
|
||
movei 1,.priin
|
||
move 2,oldmod
|
||
sfmod ; Restore old modes
|
||
haltf
|
||
jrst dcrock
|
||
|
||
|
||
sixn: push p,a
|
||
push p,b
|
||
idivi a,10.
|
||
lsh c,6
|
||
addi c,'0(a)
|
||
lsh c,6
|
||
addi c,'0(b)
|
||
pop p,b
|
||
pop p,a
|
||
return
|
||
}
|
||
|
||
subttl Terminal subroutines
|
||
|
||
movcur: push p,a
|
||
ifn t%its,{
|
||
movei a,^P
|
||
call outb
|
||
movei a,"V
|
||
call outb
|
||
movei a,10(y)
|
||
call outb
|
||
movei a,^P
|
||
call outb
|
||
movei a,"H
|
||
call outb
|
||
movei a,10(x)
|
||
call outb
|
||
}
|
||
ifn t%dm25,{
|
||
movei a,^L ; DM2500 abs move
|
||
call outb
|
||
movei a,(x)
|
||
trc a,140
|
||
call outb
|
||
movei a,(y)
|
||
trc a,140
|
||
call outb
|
||
}
|
||
ifn t%hz15,{
|
||
movei a,"~
|
||
call outb
|
||
movei a,^Q
|
||
call outb
|
||
movei a,(x)
|
||
caig a,30.
|
||
addi a,140
|
||
call outb
|
||
movei a,140(y)
|
||
call outb
|
||
}
|
||
ifn t%vt52,{
|
||
movei a,33
|
||
call outb
|
||
movei a,"Y
|
||
call outb
|
||
movei a,40(y)
|
||
call outb
|
||
movei a,40(x)
|
||
call outb
|
||
}
|
||
ifn t%c100,{
|
||
movei a,33
|
||
call outb
|
||
movei a,"a
|
||
call outb
|
||
movei a,40(y)
|
||
call outb
|
||
movei a,40(x)
|
||
call outb
|
||
}
|
||
pop p,a
|
||
return
|
||
|
||
|
||
clchar: push p,a
|
||
ifn its&t%its,{
|
||
movei a,^P
|
||
call outb
|
||
movei a,"K
|
||
call outb
|
||
}
|
||
ife its&t%its,{
|
||
movei a,40
|
||
call outb
|
||
;X; movei a,^H
|
||
;X; call outb
|
||
}
|
||
pop p,a
|
||
return
|
||
|
||
SCREEN: BLOCK 6
|
||
|
||
RADIX 2.
|
||
DIGITS: 011101000110011101011100110001011100
|
||
001000110000100001000010000100011100
|
||
011101000100001000100010001000111110
|
||
011101000100001011100000110001011100
|
||
000100011001010100101111100010000100
|
||
111111000010000111100000110001011100
|
||
011101000110000111101000110001011100
|
||
111110000100001000100010001000100000
|
||
011101000110001011101000110001011100
|
||
011101000110001011110000110001011100
|
||
RADIX 8.
|
||
|
||
; For each terminal definition, HAKCLR specifies bytes to clear screen,
|
||
; HAKMOV to move cursor to given X, Y, and HACK takes a string
|
||
; generating the appropriate bytes for commands Up, Down, Back, and Forward.
|
||
; Unrecognized chars are simply output (eg "$").
|
||
|
||
ifn t%its,{
|
||
DEFINE HAKCLR
|
||
^P ? "C
|
||
TERMIN
|
||
DEFINE HAKMOV X,Y
|
||
^P ? "H ? 10+<X>
|
||
^P ? "V ? 10+<Y>
|
||
TERMIN
|
||
DEFINE HACK CHARS
|
||
IRPC X,,[CHARS]
|
||
IFSE X,$, "$
|
||
IFSE X,U, ^P ? "U
|
||
IFSE X,D, ^P ? "D
|
||
IFSE X,B, ^P ? "B
|
||
IFSE X,F, 40
|
||
TERMIN
|
||
TERMIN
|
||
}
|
||
ifn t%vt52,{
|
||
DEFINE HAKCLR
|
||
33 ? "H ? 33 ? "J
|
||
TERMIN
|
||
DEFINE HAKMOV H,V
|
||
33 ? "Y ? 40+<V> ? 40+<H>
|
||
TERMIN
|
||
DEFINE HACK CHARS
|
||
IRPC X,,[CHARS]
|
||
IFSE X,$, "$
|
||
IFSE X,U, 33 ? "A
|
||
IFSE X,D, ^J
|
||
IFSE X,B, ^H
|
||
IFSE X,F, 40
|
||
TERMIN
|
||
TERMIN
|
||
}
|
||
ifn t%c100,{
|
||
DEFINE HAKCLR
|
||
^L
|
||
TERMIN
|
||
DEFINE HAKMOV H,V
|
||
33 ? "a ? 40+<V> ? 40+<H>
|
||
TERMIN
|
||
DEFINE HACK CHARS
|
||
IRPC X,,[CHARS]
|
||
IFSE X,$, "$
|
||
IFSE X,U, 33 ? ";
|
||
IFSE X,D, ^J
|
||
IFSE X,B, ^H
|
||
IFSE X,F, 40
|
||
TERMIN
|
||
TERMIN
|
||
}
|
||
ifn t%dm25,{
|
||
DEFINE HAKCLR
|
||
37 ? 37
|
||
TERMIN
|
||
DEFINE HAKMOV X,Y
|
||
^L ? 140#<X> ? 140#<Y>
|
||
TERMIN
|
||
DEFINE HACK CHARS
|
||
IRPC X,,[CHARS]
|
||
IFSE X,U, ^Z .STOP
|
||
IFSE X,D, ^J .STOP
|
||
IFSE X,B, ^H .STOP
|
||
IFSE X,F, ^\ .STOP
|
||
"X
|
||
TERMIN
|
||
TERMIN
|
||
}
|
||
ifn t%hz15,{
|
||
DEFINE HAKCLR
|
||
"~ ? 34
|
||
TERMIN
|
||
DEFINE HAKMOV X,Y
|
||
"~ ? ^Q
|
||
IFG <X>-30.,{<X>} .ELSE {140+<X>}
|
||
140+<Y>
|
||
TERMIN
|
||
DEFINE HACK CHARS
|
||
IRPC X,,[CHARS]
|
||
IFSE X,U, "~ ? ^L .STOP
|
||
IFSE X,D, "~ ? ^K .STOP
|
||
IFSE X,B, ^H .STOP
|
||
IFSE X,F, ^P .STOP
|
||
"X
|
||
TERMIN
|
||
TERMIN
|
||
}
|
||
FRAME: .BYTE 7
|
||
HAKCLR
|
||
HAKMOV 8.,4.
|
||
HACK $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
||
HACK DB$DB$DB$DB$DB$DB$DB$DB$DB$DB$
|
||
HACK BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$
|
||
HACK BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$
|
||
HACK BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$
|
||
HACK BB$BB$
|
||
HACK UB$UB$UB$UB$UB$UB$UB$UB$UB$
|
||
HAKMOV 8.+1+2+5+3+5+2, 4+3
|
||
HACK $$BBD$$BBDD$$BBD$$
|
||
HAKMOV 8.+1+2+5+3+5+6+5+3+5+2, 4+3
|
||
HACK $$BBD$$BBDD$$BBD$$
|
||
LFRAME==.BYTC
|
||
.BYTE
|
||
|
||
|
||
CHPOS:
|
||
IRPC Y,,[0123456]
|
||
IRPC X,,[01234]
|
||
X,,Y
|
||
TERMIN
|
||
TERMIN
|
||
|
||
HORIZ: 8+1+2
|
||
8+1+2+5+3
|
||
8+1+2+5+3+5+6
|
||
8+1+2+5+3+5+6+5+3
|
||
8+1+2+5+3+5+6+5+3+5+6
|
||
8+1+2+5+3+5+6+5+3+5+6+5+3
|
||
|
||
PATCH: BLOCK 40
|
||
|
||
END DCROCK
|