1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-15 08:03:19 +00:00
PDP-10.its/src/sysen1/dcrock.41
2018-06-12 06:46:54 -07:00

492 lines
6.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.

; -*-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