1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-26 20:22:22 +00:00

TVREAD - read a file and display on TV.

This commit is contained in:
Lars Brinkhoff
2018-07-30 15:40:51 +02:00
parent 36d0a0c2f5
commit d3faaf224f
3 changed files with 346 additions and 0 deletions

341
src/sysen2/tvread.82 Executable file
View File

@@ -0,0 +1,341 @@
TITLE PICTURE INPUT
;; Type TVREAD <file-name> CR to read binary image file onto your TV-screen.
;; [Parameter following "/" is sent along as expansion factor to ZAP]
;; [Parameter following "" is another user's tty number, to snarf his
;; screen instead.]
;; (If file is not a binary image file, bits are packed onto your screen
;; as they are found in file. The result may not look very informative.)
;;
;; Image is placed at the top of the screen and left-justified (for now).
;; Default file-name is SCREEN >.
;;
;; Type CR to refresh display -- that is do it over again.
;; Type anything else to quit (:KILL).
;;
;; (Type RUBOUT to dump your screen in XGP ;SCAN format using bkph;zap.)
;;
A=1
B=2
C=3
D=4
E=5
F=6
G=7
P=17
tvpage==370 ;last ten pages in core
tv==tvpage*2000 ;address of beg of tv buffin
tvend==tvpage*2000+10*2000-1 ;black/white bit and frame start number
ttyin==1
ttyot==2
dtyoc==3
BEG: MOVE P,[-20,,pdl]
.open ttyin,[sixbit / $TTY/]
jrst failur
.CALL [SETZ
SIXBIT /CNSGET/
1000,,TTYIN
2000,,A
2000,,B
402000,,C]
JRST FAILUR
CAIE C,5 ;CHECK IF TV CONSOLE
JRST KILL ;NO -- STOP THE LOSER !
PUSHJ P,TVMAPC
SETZM TTYNUM'
PUSHJ P,READNM ;get file name if any
SKIPN B,TTYNUM ;if ttynum is 0, don't need to hack .TVCREG
JRST RESTAR
tlo b,400000 ;<tty>
.call [setz ? 'tvwher ? b ? movem b ? setzm b]
.lose %lssys
.suset [.rtvcreg,,a] ;get our tvcreg
tlz a,1774 ;mask out our buffer number
lsh b,2
tso a,b ;put in his
.suset [.stvcreg,,a] ;set it (isn't memory mapping fun?)
restar: pushj p,readhd ;read headin of image file
pushj p,bull ;move cursor
pushj p,clears ;clear screen
pushj p,unpack ;unpack things onto screen
.call [ setz
sixbit \close \
setz inchn]
jrst failur
surlp: skipe quick ;quick exit?
jrst kill
.iot ttyin,a ;await user's command
cain a,177
.value valmes ;magic .value stuff -- call ZAP for XGP
cain a,15
jrst restar ;do it again
exit: pushj p,clears
kill: .break 16,124000
failur: .value [asciz /:err
:vp
/]
jrst kill ;an open failed -- exit
badfil: movei a,[asciz $Not an Image File$]
loser: .open ttyot,[1,,(sixbit /tty/)]
jrst failur
pushj p,string ;type bad file message
pushj p,carret
jrst kill
badbts: movei a,[asciz $Too many Bits per Pixel$]
jrst loser
badlin: movei a,[asciz $Image lines too long$]
jrst loser
string: hrli a,440700 ;turn into byte pointer
strlop: ildb b,a
skipn b
popj p, ;hit a zero byte
.iot ttyot,b
jrst strlop
carret: .iot ttyot,[15]
.iot ttyot,[12]
popj p,
TVMAPC: MOVE A,[-10,,tvpage]
MOVEI B,0
.CALL [ SETZ
SIXBIT \CORBLK\
1000,,600000
1000,,-1
A
1000,,-2
SETZ B]
jrst failur
POPJ P,
unpack: movei c,tv ;destination address
move e,headin+4
sub e,headin+3 ;YHIGH-YLOW
aoj e,
caile e,454.
movei e,454. ;454. lines max on screen
movn a,headin+2 ;words per line
hrlz a,a
hrri a,buffin ;make up i/o pointer
movem a,bufpnt
readlp: move a,bufpnt ;read a line of image
.call [ setz
sixbit /iot /
,,inchn
setz a]
jrst failur
movei d,buffin ;source address
pushj p,blknup ;unpack 8 words of it
addi c,9.
addi d,8.
pushj p,blknup ;unpack another 8. words
addi c,9.
; addi d,8.
sojg e,readlp
popj p,
bull: .open dtyoc,[sixbit / 1TTY/]
jrst failur
.iot dtyoc,[^P]
.iot dtyoc,["T] ;home cursor up
.iot dtyoc,[^P]
.iot dtyoc,["B] ;MOVE TO RIGHT OF FRAME
.close dtyoc,
popj p,
blknup: move a,(d) ;get first word
lshc a,-4. ;shift 4 bits out
lsh a,4. ;left justify
movem a,(c) ;store in TV screen
lshc a,32.-28.
move b,1(d)
lshc a,28.
lsh a,4.
movem a,1(c)
lshc a,32.-24.
move b,2(d)
lshc a,24.
lsh a,4.
movem a,2(c)
lshc a,32.-20.
move b,3(d)
lshc a,20.
lsh a,4
movem a,3(c)
lshc a,32.-16.
move b,4(d)
lshc a,16.
lsh a,4
movem a,4(c)
lshc a,32.-12.
move b,5(d)
lshc a,12.
lsh a,4
movem a,5(c)
lshc a,32.-8.
move b,6(d)
lshc a,8.
lsh a,4
movem a,6(c)
lshc a,32.-4.
move b,7(d)
lshc a,4.
lsh a,4
movem a,7(c)
movem b,8(c)
popj p,
READHD: .call [ setz
sixbit /open /
5000,,6
,,inchn
,,infnm
,,infnm+1
,,infnm+2
setz infnm+3]
jrst failur
MOVE A,[-200,,headin]
.call [ setz
sixbit /iot /
,,inchn
setz a]
jrst failur
move a,headin ;test first word
aojn a,badfil
move a,headin+1 ;bits per pixel
caile a,44
jrst badbts
move a,headin+2 ;words per line
caile a,4000
jrst badlin
POPJ P,
readnm: .break 12,[5,,jcl] ;get job control language
move c,[440700,,jcl]
movei f,infnm+1
scanon: move d,[440600,,g] ;first file name ?
setz g,
cntrlp: ildb a,c
skipn a ;look for end of jcl
popj p,
cain a,"
jrst param
cain a,^q
jrst quoted
caig a,40
jrst cntrlp
goblop: cain a,":
jrst colons
cain a,";
jrst semico
cain a,"/
jrst slash
cain a,"$
jrst quiset
cain a,^q
jrst quoted
caig a,40
jrst spacer ;space
putint: caige a,140
subi a,40 ;lower case
idpb a,d
ildb a,c
jrst goblop
quoted: ildb a,c
jrst putint
spacer: jumpe g,scanon
movem g,(f)
movei f,infnm+2 ;ready for second file name
jrst scanon
semico: movem g,infnm+3 ;user name
jrst scanon
colons: movem g,infnm ;device
jrst scanon
slash: ildb a,c
move b,[260700,,valmes+2] ;yech! what a way to do it!
idpb a,b
jrst spacer
param: ildb a,c ;ignore for now (the slash)
cain a,"t
jrst param ;flush the T in T53...
cain a,"T
jrst param
cail a,"0
caile a,"7
jrst spacer
subi a,"0
move b,ttynum
imuli b,10
add b,a
movem b,ttynum
jrst param
quiset: setom quick ;quick return flag
jrst spacer
clears: movsi f,-10*2000+1
move a,[setzm tv(f)]
move b,[aobjn f,a]
move c,[popj p,]
jrst a
inchn: 4
infnm: sixbit /dsk /
sixbit /screen/
sixbit /> /
0
valmes: asciz $:bkph;zap /1
:vp
$
quick: 0 ;QUICK EXIT FLAG
bufpnt: 0 ;i/o pointer
constants
variables
jcl: block 20
pdl: block 20
headin: block 200
buffin: block 4000
-1
end beg