From 43a514defe1f6779e7d87215a90b41ccaea8e841 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Sat, 10 Dec 2016 18:39:29 -0800 Subject: [PATCH] Added MSPLIT. --- README.md | 1 + build/build.tcl | 4 + src/sysen2/msplit.13 | 313 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 318 insertions(+) create mode 100644 src/sysen2/msplit.13 diff --git a/README.md b/README.md index efb878ff..93722893 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ There's a [DDT cheat sheet](doc/DDT.md) for Unix users. - METER, displays system metering information. - MLDEV, MLSLV, Allows access to remote systems as devices (e.g. DB:). - MODEMS, modems gragon. + - MSPLIT, split a file into smaller parts. - MTBOOT, make bootable tapes. - NAME, Shows logged in users and locations, aka FINGER. - NETIME, network time dragon. diff --git a/build/build.tcl b/build/build.tcl index 25db23e1..0a40babc 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -851,6 +851,10 @@ expect ":KILL" respond "*" ":midas sys2;ts loadp_sysen1;loadp\r" expect ":KILL" +# MSPLIT +respond "*" ":midas sys2;ts msplit_sysen2;msplit\r" +expect ":KILL" + # ndskdmp tape respond "*" ":link kshack;good ram,.;ram ram\r" respond "*" ":link kshack;ddt bin,.;@ ddt\r" diff --git a/src/sysen2/msplit.13 b/src/sysen2/msplit.13 new file mode 100644 index 00000000..b4873a41 --- /dev/null +++ b/src/sysen2/msplit.13 @@ -0,0 +1,313 @@ +; -*- Midas -*- + +title MSPLIT - Split a mail file into smaller pieces. + +a=:1 +b=:2 +c=:3 +d=:4 +e=:5 +t=:6 +tt=:7 +x=:10 +y=:11 +z=:12 +bc=:13 +bp=:14 + +p=:17 + +ch==:0,,-1 +chttyi==:1 +chttyo==:2 +chdski==:3 +chdsko==:4 +chprobe==:5 + +%fr==:0,,525252 +%fl==:1,,525252 + +call=:pushj p, +return=:popj p, +save==:push p, +rest==:pop p, +flose=:.lose %lsfil +slose=:.lose %lssys +pause=:.break 16,100000 +quit=:.logout 1, +tyi=:.iot chttyi, +tyo=:.iot chttyo, + +define bltdup org,len + move tt,[,,+1] + blt tt,+-1 +termin + +define syscall name,args + .call [setz ? .1stwd sixbit /name/ ? args(400000)] +termin + +define conc foo,bar +foo!bar!termin + +; JSP T,LOSE is like .LOSE %LSSYS(TT) or SLOSE (TT) +lose: syscall lose,[movei %lssys(tt) ? movei -2(t)] + slose + +popj1: aos (p) +cpopj: return + +rfn"$$pfn==:1 +rfn"$$rfn==:1 +.insrt dsk:syseng;rfn > + +rsixtp: cain a,", + aos (p) +psixtp: return + +format"$$pfn==:1 +format"pfn==:rfn"pfn +format"$$pcode==:1 +.insrt dsk:syseng;format > + +outstr: syscall siot,[movei chttyo ? a ? b] + slose + return + +define format &string&,args + call [ + call $format +.zzz.==-1 +irp arg,,[args] + save arg +.zzz.==.irpcnt +termin + hrroi a,[ascii string] + movei b,.length string + movni c,.zzz.+1 + jrst format"format] +termin + +$forma: save a + save b + save c + call @-3(p) + rest c + rest b + rest a + rest (p) + return + +.vector pdl(lpdl==:100.) +.vector buffer(lbuffer==:4000) + +usrvar: sixbit /OPTION/ ? tlo %opint\%opopc + sixbit /MASK/ ? move [%pipdl] + sixbit /SNAME/ ? movem ifile+3 + sixbit /XUNAME/ ? movem ifile+1 + sixbit /OPTION/ ? movem a +lusrvar==:.-usrvar + +go: move p,[-lpdl,,pdl-1] + .open chttyi,[.uai,,'tty ? setz ? setz] + slose + .open chttyo,[.uao\%tjdis,,'tty ? setz ? setz] + slose + move t,[-lusrvar,,usrvar] + syscall usrvar,[movei %jself ? t] + slose + move t,[ifile,,ofile] + blt t,ofile+3 + tlnn a,%opcmd + jrst go1 + setzm buffer+0 + bltdup buffer,lbuffer-1 + movsi t,(.byte 7 ? ^M ? ^M) + movem t,buffer+lbuffer-1 + .break 12,[..rjcl,,buffer] + move d,[440700,,buffer] + movei b,ifile + call rfn"rfn + move t,[ifile,,ofile] + blt t,ofile+3 + caie a,", + jrst go1 + movei b,ofile + call rfn"rfn +go1: syscall open,[movsi .bai ? movei chdski ? move ifile+0 + move ifile+1 ? move ifile+2 ? move ifile+3] + flose + syscall rfname,[movei chdski ? movem ifile+0 + movem ifile+1 ? movem ifile+2 ? movem ifile+3] + slose + move a,ifile+2 + lsh a,-6 + tlo a,(sixbit /_/) + syscall open,[movsi .bai\%donrf\%donlk ? moves tt + movei chprobe ? move ifile+0 + move ifile+1 ? move a ? move ifile+3] + jsp t,go2 + exch a,ifile+2 + movei t,ifile + format "~&File ~F exists. Perhaps a crash occured",t + exch a,ifile+2 + format "~&during a previous attempt to split ~F?",t + quit + +go2: caie tt,%ensfl + jrst lose + movei t,ifile + format "~&Renaming ~F",t + exch a,ifile+2 + format " to be ~F.",t + syscall renmwo,[movei chdski ? move ifile+1 ? move ifile+2] + slose + setom bufflg + call newbuf + jumpe bc,done + move a,ofile+2 + call sixnrm +loop: movem a,ofile+2 + syscall open,[movsi .bai\%donrf\%donlk ? moves tt + movei chprobe ? move ofile+0 + move ofile+1 ? move ofile+2 ? move ofile+3] + jsp t,loop1 +next: move a,ofile+2 + call sixaos + jrst loop + +loop1: caie tt,%ensfl + jrst lose + movei t,ofile + format "~&Creating ~F.",t + syscall open,[movsi .uao ? movei chdsko ? move ofile+0 + move ofile+1 ? move ofile+2 ? move ofile+3] + flose + setzi a, + jrst outlp + +out: syscall siot,[movei chdsko ? move bp ? move bc] + slose + call newbuf + jumpe bc,done +outlp: add a,bc + camge a,size + jrst out + move b,bp + move c,bc +scan: ildb t,b + caie t,^_ + sojg c,scan + sojle c,out + ildb t,b + caie t,^M + sojg c,scan + sojle c,out + ildb t,b + caie t,^J + sojg c,scan + sojl c,out + exch c,bc + sub c,bc + syscall siot,[movei chdsko ? move bp ? move c] + slose + jumpg bc,next + call newbuf + jumpg bc,next +done: movei t,ifile + format "~&Deleting ~F.",t + syscall delewo,[movei chdski] + slose + quit + +.scalar bufflg ; -1 if nothing held + +newbuf: move bp,[440700,,buffer] + move buffer+lbuffer-1 + movem buffer+0 + move t,[-,,buffer+1] + aosn bufflg + move t,[-lbuffer,,buffer] + .iot chdski,t + jumpl t,newbf1 + movei bc,5* + return + +newbf1: setom bufflg ; Nothing held back now... + movei bc,-buffer(t) + jumpe bc,cpopj + imuli bc,5 + ldb tt,[.bp <177_1>,-1(t)] + caie tt,^C + cain tt,^@ + soja bc,.+2 + return + ldb tt,[.bp <177_8>,-1(t)] + caie tt,^C + cain tt,^@ + soja bc,.+2 + return + ldb tt,[.bp <177_15.>,-1(t)] + caie tt,^C + cain tt,^@ + soja bc,.+2 + return + ldb tt,[.bp <177_22.>,-1(t)] + caie tt,^C + cain tt,^@ + soj bc, + return + +sixaos: move t,a + andi t,77 + cail t,'A + caile t,'Z + jrst sixao1 + aos a + caie t,'Z + return + lsh a,-6 + call sixaos + lsh a,6 +sixao1: trz a,77 + tro a,'A + return + +sixnrm: movei t,77 + movei tt,'A +sixnr1: tdne a,t + return + tdo a,tt + lshc t,6 + jrst sixnr1 + +tsint: +loc 42 + -ltsint,,tsint +loc tsint + 400000,,p +ltsint==:.-tsint + +dismis: setz ? sixbit /DISMIS/ ? movsi 400000 ? setz p + +size: 5*2000*30. ; Aim for 30 blocks + +cnstnts: +constants +variables + +ifile: sixbit /DSK/ + -1 + sixbit /MAIL/ + -1 + +ofile: block 4 + +patch:: +pat: block 100. +epatch: -1 ; Make memory exist, end of patch area + +ffaddr: +ffpage==:_-12 + +end go