From 01533d458cf5ad0f68c7f6c2b33aea2a7d298d48 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Fri, 21 Sep 2018 12:52:24 +0200 Subject: [PATCH] ZAP - dump TV bitmap as an XGP scan file. --- Makefile | 2 +- build/misc.tcl | 5 + doc/programs.md | 1 + src/bkph/zap.17 | 277 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 src/bkph/zap.17 diff --git a/Makefile b/Makefile index a353ace9..db458d51 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ SRC = syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ tensor transl wgd zz graphs lmlib pratt quux scheme gsb ejs mudsys \ draw wl taa tj6 budd sharem ucode rvb kldcp math as imsrc gls demo \ macsym lmcons dmcg hack hibou agb gt40 rug maeda ms kle aap common \ - fonts zork 11logo kmp info aplogo + fonts zork 11logo kmp info aplogo bkph DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \ xfont maxout ucode moon acount alan channa fonts games graphs humor \ diff --git a/build/misc.tcl b/build/misc.tcl index 5bdc8429..71ee61db 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -985,6 +985,11 @@ respond "*" ":link sys1; ts imprin, sys1; ts imprnt\r" respond "*" ":link sys1; ts ardprn, sys1; ts imprnt\r" respond "*" ":link sys1; ts tekprn, sys1; ts imprnt\r" +# Dump TV bitmap as XGP scan file. +# TVREAD expects the binary in BKPH. +respond "*" ":midas bkph; ts zap_zap\r" +expect ":KILL" + # View bitmap file on TV. respond "*" ":midas sys2; ts tvread_sysen2; tvread\r" expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 52f17737..766e1474 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -282,3 +282,4 @@ - XXFILE, feed scripted input to a STY session. - YAHTZE, the game of Yahtzee. - YOW, print Zippyisms. +- ZAP, dump TV bitmap as an XGP scan file. diff --git a/src/bkph/zap.17 b/src/bkph/zap.17 new file mode 100644 index 00000000..fea4d084 --- /dev/null +++ b/src/bkph/zap.17 @@ -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 + \ No newline at end of file