1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-09 09:50:59 +00:00

ZAP - dump TV bitmap as an XGP scan file.

This commit is contained in:
Lars Brinkhoff
2018-09-21 12:52:24 +02:00
parent 55f2dde6ed
commit 01533d458c
4 changed files with 284 additions and 1 deletions

277
src/bkph/zap.17 Normal file
View File

@@ -0,0 +1,277 @@
TITLE FRAME DUMP
.mllit=1
a=1
b=2
c=3 ;column count-down
d=4 ;row count-down
e=5 ;line-number on XGP
f=6 ;TV buffer byte pointer (8 bit)
g=7 ;disk buffer byte pointer (16 bit)
t=10 ;temporary
u=11 ;duplicity factor 1, 2 or 3
p=17
tvpage==370 ;top 10 pages of core for tv
tv=tvpage*2000 ;address of first word in tv screen
dskc==1
start: move p,[-20,,pdl]
movei u,1 ;DEFAULTS TO 1
pushj p,readnm
skipe unames
.suset [.ssname,,unames]
.open dskc,dskfil
.value
move a,[-10,,tvpage]
setz b,
.call cormap
.value
pushj p,tblini ;initialise magic table
movei d,455. ;455. lines to do
movei e,400. ;two inches clear of top on XGP
move f,[441000,,tv] ;8 bits at a shove
cain u,1
move f,[442000,,tv] ;16 bits at a shove
pushj p,linout ;write out the whole frame
move g,[442000,,dskbuf]
movei a,2 ;2 (PDP-11 words) long
idpb a,g
addi e,400. ;two inches clear at bottom of XGP
move a,e
iori a,100000 ;sign-bit on -> paper cut
idpb a,g
move a,[-1,,dskbuf]
.iot dskc,a ;write this record
move g,[442000,,dskbuf]
movei a,2 ;2 (PDP11 words) long
idpb a,g
setz a, ;line-number=0 -> EOF
idpb a,g
move a,[-1,,dskbuf]
.iot dskc,a
.close dskc,
.break 16,124000
.value
linout: pushj p,dumlin ;set up buffer pointer, enter XGP line number
pushj p,headin ;put in heading, mode switches and so on
pushj p,gobble ;transform the line
cain u,3
jrst wrtnow
setz a,
idpb a,g ;PDP11 words worth of white
idpb a,g ;PDP11 words worth of white
idpb a,g ;PDP11 words worth of white
wrtnow: pushj p,wrtlin ;write the line
caig u,1
jrst gumpa
pushj p,dumlin ;update line-number
pushj p,wrtlin ;write it again
gumpa: caig u,2
jrst gumpb
pushj p,dumlin ;update line-number
pushj p,wrtlin ;write it again
gumpb: sojg d,linout
popj p,
headin: cain u,3
jrst imagen
setz a, ;(0,0) enter run-length mode
idpb a,g
move a,lftmar
andi a,377
idpb a,g ;(200,0) 8 PDP11 words worth of white
idpb a,g ;(200,0) 8 PDP11 words worth of white
caie u,1
jrst whteno
idpb a,g ;(200,0) 8 PDP11 words worth of white
idpb a,g ;(200,0) 8 PDP11 words worth of white
whteno: setz a, ;(0,0) escape to command mode
idpb a,g
movei a,2
idpb a,g ;(2,0) enter image mode - and 8 bits of white
popj p,
imagen: movei a,2*400 ;(0,2) enter image mode
idpb a,g
popj p,
wrtlin: movn a,nmbwrd(u)
lsh a,-1
hrlz a,a
hrri a,dskbuf
.iot dskc,a
aos e ;up line-count
popj p,
dumlin: move g,[442000,,dskbuf]
move a,nmbwrd(u) ;number of PDP11 words in line
idpb a,g
idpb e,g ;line-number
popj p,
gobble: movei c,44 ;36. PDP10 words per line
cain u,1
jrst gobonc
cain u,2
jrst gobtwc
jrst gobtrc
gobonc: ildb a,f ;16 bits from tv
circ a,-20 ;reverse bits into b
idpb b,g ;16 bits to disk
sojg c,gobonc
popj p,
gobtwc: ildb a,f ;get 8 bits from tv
move b,dbltbl(a) ;look up doubled and reversed
idpb b,g ;put 16 bits to disk
ildb a,f ;get 8 bits from tv
move b,dbltbl(a) ;look up doubled and reversed
idpb b,g ;put 16 bits to disk
sojg c,gobtwc
popj p,
gobtrc: ildb a,f ;get 8 bits from TV
move a,dbltbl(a) ;look up 24 bits
ildb b,f ;get next 8 bits
move b,dbltbl(b) ;look up 24 bits
lsh b,14 ;left-justify (24. + 12. = 36.)
lshc a,-10 ;move 8 across to second word
move t,b ;save it for now
circ a,-20 ;reverse it
idpb b,g ;put 16 bits into disk buffer
move b,t ;next batch
lshc a,20 ;suck out 16
move t,b ;save rest for now
circ a,-20 ;reverse it
idpb b,g
move b,t
lshc a,20 ;suck out remaining 16 bit
circ a,-20 ;reverse it
idpb b,g
sojg c,gobtrc
popj p,
; if white-out on XGP is a problem, it may help to generate
; white bits in duplicate and triplicate mode.
tblini: cain u,1
popj p,
movei d,377
tbllup: move a,d ;get number
movei c,10 ;8 bits to do
dbllup: lshc a,-1 ;move one bit over
ash b,-1 ;duplicate it (make lsh to generate white)
caie u,2
ash b,-1 ;duplicate it (make lsh to generate whit)
sojg c,dbllup
caie u,2
jrst shovth
lshc a,20 ;bring back into a
circ a,-20 ;reverse into b
movem b,dbltbl(d)
sojge d,tbllup
popj p,
shovth: lshc a,30
movem a,dbltbl(d) ;store it
sojge d,tbllup
popj p,
readnm: .break 12,[5,,jcl] ;get job control language
move c,[440700,,jcl]
movei f,dskfil+1
scanon: move d,[440600,,g] ;first file name ?
setz g,
cntrlp: ildb a,c
skipn a
popj p,
caig a,40
jrst cntrlp
goblop: cain a,":
jrst colons
cain a,";
jrst semico
cain a,"/
jrst param
caig a,40
jrst spacer ;space
caige a,140
subi a,40 ;number
idpb a,d
ildb a,c
jrst goblop
spacer: skipn g
jrst scanon
movem g,(f)
movei f,dskfil+2
jrst scanon
semico: movem g,unames
jrst scanon
colons: hlrm g,dskfil ;oh, really?
jrst scanon
param: ildb u,c
subi u,60
caile u,3
movei u,3
skipg u
movei u,1
jrst spacer
dskfil: 7,,(sixbit/dsk/)
sixbit /frame/
sixbit />/
cormap: setz
'corblk
1000,,600000
1000,,-1
a
1000,,-2
setz b
nmbwrd: 0
2+1+4+2+44+3
2+1+2+2+44+44+3
2+1+44+44+44-3 ;number of PDP11 words in record (better be even!)
lftmar: 200 ;0 < lftmar < 400 (left margin of white)
unames: 0 ;potential place for luser name
dbltbl: block 400 ;tripled up bits
dskbuf: block 70 ;65 max of 53. words
pdl: block 20
jcl: block 20
-1
end start