file system 12/2/70 pbs.=3 /physical block spacing (must be >2) ffb.=12 /first free tape block dirl.=4 /directory length dir1.=6 /address of directory 1 dir2.=773 /address of directory 2 cbl.=6000-cbf /character buffer length 0/ jmp in /load new file system, save directory 1/ jmp ini /initialize entire tape 2/ jmp file /normal entry point 3/ jmp nme /rename tape 4/ cbf /address of character buffer 5/ cbl /maximum length of buffer 6/ jmp invk /invoke file system 7/ text .12/2/70. /date of assembly 12/ /constants used in first page before file system read in const1, dirlxi dir1 const2, dirlxi i dir2 const3, 607600 const4, lai e21=e23+2 /text / 2_/ invk, clf 7 stf 1 jmp file 1 file, clf 7 iam law cbf dac tyin lio 0 /([ffb-dirl-1]xi 1 law 400 ivk 16 /read file system jmp trr /tape error while reading directory szf i 1 jdp bdmp jmp rdir swd, jdp wdy rdir, lio const1 /dirlxi dir1 law 6000 ivk 16 jmp trr rdir1, lio const2 /dirlxi i dir2 law ntb ivk 16 jmp trr law (dirlxi dir2 dap rdir1 /setup for directory swap dzm wpm /turn on software write permit law e21 / 2_ jdp chd /check directory 2 jmp bdir /bad directory jdp dswp /look at dir 1 law e20 / 1_ jdp chd /check dir 1 jmp bdir jdp dcom /compare 2 good directories jmp dok /both ok and the same idx wpm /turn off write permit law e22 /directories don't match jdp txp jmp dok bdir, jdp dswp law e23 / 1 and 2_ jdp chd idx wpm /turn off write permit dok, skp i jdp dswp law 600 xor dok dap dok jmp . 1 law rst dap .-2 jmp cr txp, 0 dap txy txy, lio idx .-1 lac const3 rcl 6s sad const4 /lai jmp i txp sad . 2 jmp txy swp tyo lia jmp txy 2 trr, law m1 jdp txp dsm m1, text /tape error while reading directory_/ repeat ifp .-400,[ printx / data on first page exceeds space provided /] >>35<< dcom, 0 /skip on bad comparison lxr (1-dirlx400 lac i ntb dirlx400-1 sas i 6000 dirlx400-1 jmp dbad SXX> jmp .-4 jmp i dcom dbad, idx dcom jdp dbad jmp i dcom dswp, 0 lxr (1-dirlx400 lac i ntb dirlx400-1 lio i 6000 dirlx400-1 dio i ntb dirlx400-1 dac i 6000 dirlx400-1 SXX> jmp .-5 jmp i dswp tbl, 660000 fil /command table - 4000 bit indicates no args needed 304000 name /print name of tape 650000 edi 610000 app 220000 sav 204000 tap0 /0F 014000 tap1 /1F 024000 tap2 /2F 034000 tap3 /3F 240000 uns 440000 mer 640000 del 670000 go 430000 loa 510000 ren 470000 pri 230000 tex 274000 swd /swap directories 674000 goa 454000 ctn /certainly loc 0 630000 ecm /edit and assemble m 450000 ecn /edit and assemble n 634000 ctm /certainly loc 2 654000 et /go to et 624000 ddt 474000 pr1 /print directory 264000 won /turn write permit on tble, bdmp, 0 law cbf dac tyin clc dac cbf jmp i bdmp u wdy, 0 lac wpm wtd, szf i sza jmp i wdy /don't even try to write if permit is off law (add jdp chd jmp wda lio (10 /directory ok law 6000 jdp tpe /read name lxr (-ffb wdy3, lac i ffb dbt sad i 6000 ffb jmp wdy2 jdp bdmp /dump character buffer law e24 /anomalous tape jmp rst1 wdy2, SXX= jmp wdy3 law dir2 jdp dirb law dir1 jdp dirb clc jdp tpe cla dap wtd jmp i wdy dirb, 0 lio (dirlxi dap rd1 A+II lac (add ntb jdp tpe lxr (-3 rd1, law . XMAI cmi CXA sal 8s add (6000 jdp tpe SXX> jmp rd1 jdp dcom jmp i dirb jdp bdmp /dump character buffer law e25 /hardware failure jmp rst1 WDA= IDX WPM ?TURN OFF WRITE PERMIT CR= LEM T"= CLI>>05<>05<>05<>05<P jmp t0 /backup to beginning of line t3, tyi dio i cbf szs 30 jmp t4 lai sad (75 /backspace jmp t2 sad (40 /_ jmp t0 sad (77 /cr jmp t6 t4, SXXA sas (cbl-1 jmp t3 q, law cr jda txp 742172 add t6, cla>>05<>32<< /read symbol and terminator /name in van, value in pnu, flag 1 if not a number /skip 0, 1, 2 times if terminator is comma, c.r., space ll, dap ell clf 1 lxr (-4 dzm i pnu SXX> jmp .-2 law van dap lp1 stf 6 ti, aam lio tyin idx tyin TIIAP clf 6 szf 6 jmp ti lxr (-2 sad i tit 2 jmp lle SXX> jmp .-3 TAX lp1, lac cli rcl 6s sza jmp .-2 rcl 6s sza jmp tia X>>05< stf 1 lac pnu TXI rir 3s rcl 3s dac pnu jmp ti tia, lac lp1 sas (lac van 3 idx lp1 dzm van 3 jmp lp1 tit, 0 /2 77 /1 33 /0 lle, CXX aam ell, jmp p /read file names and search directory /skip if end with cr, no skip if comma /return pointer to last directory block in AC, XR /F2 on to construct new blocks if name not found gef, 0 dzm sga clf 6 clf 5 lac ntb dac sfp gea, jsp ll jmp gel /, jmp gel /cr jmp gen-1 /space gel, stf 6 TXA dac sx lxr (ntb gen, law 777 and sfp skp 5 jmp guc sza i jmp gun /name not found lxr sfp jdp ttx law ntb X+AXI lac i 0 dac sfp lac van sza i jmp gou /no name typed dio sga sas i 1 jmp gen lac van 1 sas i 2 jmp gen lac van 2 sas i 3 jmp gen skp 6 /name found jmp got lac i 4 /more names to type sma jmp gea-1 er1, jdp car /"no subfile" error law e1 jdp txp jdp prn jmp cd r gun, TXXA dap gua jdp gfa lac sfp gua, dac sas ntb jmp . 4 law ntb XMAA dac ntb dzm i 0 lac van sza i jmp gos dac i 1 lac van 1 dac i 2 lac van 2 dac i 3 TXXA dac sga skp i 6 jmp gub lac (add dac i 4 jmp got gub, stf 5 law 4 A+XA dap guc jdp gfa jmp gea guc, dac add (ntb TAAX jmp gua 1 er3, jdp car lxr (van-1 jdp prn law e3 jdp txp jmp cd gos, lac (add xct guc law i 1 adm pdp sad (dac pdl-1 jmp erg 1 TXXA jdp flh gou, lxr sga TXXP| jmp erg got, lac gef add sx dap . 2 TXXA jmp w /get a directory block, demands F2 on /return it in sfp, XR /set across = -0, down = 0 gfa, 0 skp i 2 jmp er3 lac ntb 1 sza i jmp er2 dac sfp add (ntb TAAX lio i 0 dio ntb 1 pdp, dac pdl idx .-1 sad (dac pdl 37 jmp pce /push down list full clc dac i 0 dzm i 4 jmp i gfa pce, law e32 jdp txp jmp cd er2, jdp car /"directory full" error law e2 jdp txp cd, skp i jmp rem jdp bdmp law i 1 adm pdp sad (dac pdl-1 jmp rst dap . 1 lac jdp flh jmp cd 2 /delete all blocks of a file_.initial block number or zero in ac /anthing negative or low half = 0 ends it. xr saved uch, 0 sma jmp i uch and (777 TAAIP| jmp i uch X.IX lac i dbt dzm i dbt TIX jmp uch 1 rst, law pdl dap pdp rsp, lxr (ntb 2 rsa, lac i 4 TAAI|P jmp rsj TAAM and (lac TA=| jmp rsb rsd, lac i 4 jdp uch clc dac i 4 lac ntb 1 dac i 0 law ntb XMAA dac ntb 1 rsb, law 5 A+XAX sas (ntb 1000 jmp rsa skp 3 jmp q jmp cr rsj, TXXA jdp flh jmp rsp flh, 0 dac fla TAX lac i 4 ral 1 spa jmp i flh flz, lxr fla fli, lac i 4 spq jmp flb add (ntb 4 dap . 1 lac and (lac sza jmp flb law ntb lio i 4 A+IX lio i 0 sni i jmp .-3 jmp fli , flb, lac (lac ior i 4 dac i 4 lio i 0 dzm i 0 dio fle TIIM| jmp i flh law ntb dac svl XMAA sad ntb jmp fp5 dac flf lxr (-776 lio (5 flg, sad i ntb 1000 jmp fp0 sad i ntb 1004 jmp fp4 X+IX>= jmp flg jmp fp1 fp0, law ntb 1000 skp i fp4, law ntb 1004 A+XAX dac svl lac fle dac i 0 fp1, law ntb add flf sas fla jmp flz jmp i flh fp5, dio ntb jmp i flh l e1, text /no subfile of _/ e2, text /directory full_/ e3, text / not found_/ e4=e6+5 /text/field _/ e5, text / not assigned_/ e6, text /can't assign field _/ e7, text /illegal field number_/ e8, text / has subfiles_/ e11, text /tape error _/ e12, text /tape full_/ e13, text /anomalous directory_/ e14, text /anomalous text _/ e15, text /no write permit, type an "r" to try again _/ e20, text / 1_/ e22, text /directories do not match - both are ok_/ e23, text / 1 and 2_/ e24, text /anomalous tape_/ e25, text /hardware failure_/ e26, text /write not allowed_/ e27, text /drum error_/ e30, text /tape _/ e31, text / busy _/ e32, text /push down capacity exceeded _/ /format of directory entries /word 0_. pointer to next block on this level /word 1_. 1st three chars of name /word 2_. 2nd three /word 3_. 3rd three /word 4_. pointer to value / bit 0 => value is a file_,otherwise, list of subfiles / if bit 0 = 1 then the format of word 4 is the same as the / format of a tape block word /ntb contains pointer to directory /ntb+1 contains free directory block list /ntb+2 to ntb+777 contain 146 directory blocks /format of tape block entries in directory /each word has bit 0 = 1 /the right half of each word is a pointer to the next tape block /bits 2-8 of each word indicate the number of all-zero blocks to be /placed before the next block /a right half that is all 0 indicates that this is the last block of /a file that is nonzero. All zero blocks may follow. /dbt to dbt 777 contains 1000 tape block words /the file system and the directories occupy tape blocks 0-11 and /773-777. These blocks are chained together starting at word 0. /The tape name is encoded in the zero block field (bits 2-8) of /dbt to dbt 11 gnu, 0 jsp ll skp i stf 2 lac pnu skp i 1 jmp i gnu erg, jdp car stf 3 jmp cd /check field number in af /F2 on . want to write on it, assign if necessary /skip if pseudo field tf, 0 law i 40 lio af A^IA> jmp er7 sub (27 sma jmp er7 law 40 A^IAP jmp i tf idx tf law flexo tf arq sza jmp i tf skp i 2 /not assigned jmp er5 law flexo af arq jmp er6 jmp i tf ( , /read file name from typewriter, going to read file /put initial tape block in bkp and AC /point ucp and drd at value word /skip if end with comma, no skip if c.r. gtf, 0 jdp gef idx gtf law 4 X+AA dap ucp dap drd lac i 4 dac bkp spa jmp i gtf jdp car er8, jdp prn /"has subfiles" error law e8 jmp ex er5, xct er7 jmp era jdp car /"field n not assigned" law e4 jdp txp lac af jdp ocp law e5 ex, jdp txp jmp cd er6, jdp car /"can't assign field n" law e6 jdp txp lac af jdp ocp jmp cd ocp, 0 lio (law rcl 3s sni jmp .-2 sza opa, sni lio . 3 tyo cli rcl 620 sza jmp opa jmp i ocp b, 0 20400 1 del, jdp gef skp i stf 2 jdp flh skp i 2 jmp del jmp wre ren, jdp gef skp i jmp q dac reu lac i 1 dac sve lac i 4 dac rsi law 600 dap cd dac i 1 dzm i 4 stf 2 jdp gef jmp er4 TXA dac snx flt, lxr snx lac i 4 spq jmp flu add (ntb jdp flh jmp flt flu, jdp uch lac rsi dac i 4 lac reu jdp flh jmp wre er4, stf 3 rem, lxr reu lac sve dac i 1 lac rsi dac i 4 jmp cd 2 >>16<< go, jdp gnu sza dac af skp 2 jmp goa jdp gnu dac as skp i 2 jmp erg goa, clf 2 jdp tf nop gob, jdp rew lio af rir 6s law 7777 and as add (i-2 dap gol 1 dap gol 3 sad (i gol 2 jmp gol1 gol, lac (dcc dac . ZA jmp . gol1, lac (dcc dac gol 2 ZA jmp gol 2 ddt, jdp rew dsm rew, 0 jdp wdy clc>>05<>05<>34<< drum, 0 dcc skp i jmp i drum law e27 jmp drer /drum error tpe, 0 dac tpe1 dio tpe2 and (-7777 lio wpm TIIP /skip if write permit on sas (add /skip if trying to write jmp tpa law e26 drer, jdp txp jmp fps fpt, law e15 jdp txp tyi law char rr A~IP jmp fps tpa, jdp tpb sad (6 jmp fpt jdp tpb dac ter law e11 jdp txp lac ter jdp ocp fps, idx wpm jmp cd tpb, 0 lac tpe1 lio tpe2 ivk 16 jmp i tpb jmp i tpe z edi, law 61 ed0, dac fld1 ed1, law 2 ed2, dac fld2 lac (and 400 dac b jdp eet lac fld1 dac af lac fld2 ed3, dac as jmp gob et, law 61 dac af jmp et1 ecm, law 62 jmp ed0 ecn, law 62 dac fld1 cla jmp ed2 ctm, law 62 dac af et1, law 2 jmp ed3 ctn, law 62 dac af cla jmp ed3 app, jdp afp jmp apr tex, lac (and 400 dac b apr, jdp eet jmp rst fil, stf 2 jdp gtf skp i jmp erg clf 2 jdp afp stf 2 law i 400 add b dac hig lac (and jmp sav3 eet, 0 /read text files beginning at drum address in b law 6400 dap eea dap eeb . eec, jdp gtf /read file name from typewriter jmp eek eea, dac . /save initial block idx eea jmp eec eek, xct eea eeb, lac . dac bkp /initial block idx eeb sub eea sad (lac-dac 2 jmp eel /no more files law i 7777 and b ral 6s dac af law 7777 and b jdp dro lac 6377 sad (131313 jmp eep add b sub (and 400 dac sb sub afn sub ofs lia law 400 spi A+IA> jmp ant add (5777 dap . 1 lac sad (131313 jmp een ant, law e14 /"anomalous text" error jdp txp lac eeb sub (lac 6400 jdp ocp jdp car eep, lac ofs add afn skp i een, lac sb /next drum address dac b jmp eeb eel, lio (20372 mta 1 law b lio (2 jdp drum jmp i eet 4 /check that text on drum is in good form, put end+1 in b afp, 0 law 2 dac af law 600 dap er7 jdp tf hlt law 372 mta law b lio (20001 jdp drum afs, law i 1 add b dac drum /save pointer to 131313 word of text ral 6s and (17 sub af sza i jmp afr spa jmp era idx af jdp tf hlt jmp afs afr, law 7777 and drum /load pointer to 131313 word of text mta lac af rar 6s SAI law tf jdp drum lac tf sas (131313 jmp era jmp i afp /read file and put on drum /initial tape block in bkp, initial field in af /initial drum address in AC /after return, afn+ofs = next drum address and field /splits fields properly -- F6 . split transfer /F5 . zero blocks being written on drum dro, 0 dac ofs clf 2 xct merg /skip if merge operation stf 2 jdp tf jmp er7 dro1, clf 6 lio af rir 6s dio afn lac (177777 lio bkp A^IAP| jmp i dro and (777 dac blk /block to be read lac (177000 clf 5 A^IAP stf 5 law 7777 and ofs sad ofs jmp drp dac ofs drr, idx af lac (i adm afn jdp tf jmp er7 skp 6 jmp sp2 /finishing a split transfer drp, szf 5 jmp drp2 lio blk law 7777 A^II law 6000 jdp tpe /read a block jmp drp1 drp2, law i 1000 adm bkp lxr (-400 dzm i 6400 SXX= jmp .-2 drp1, law 377 add ofs and (-7777 sza jmp sp1 /overlaps fields merg, skp i 600 jmp nmerg /no merge-this is normal mode lac ofs mta law 400 ior afn lia law 6400 jdp drum /read current block from drum lxr (-400 lac i 7000 xor i 6400 dac i 6400 /xor new and old field SXX= jmp .-4 nmerg, lac afn add ofs mta lio (400 law 6000 sp4, jdp drum /write on field drs, law 400 skp i 6 adm ofs drt, lxr blk lac i dbt szf i 5 /still working on current pointer dac bkp /next block number jmp dro1 sp1, lac (i /need to split the drum transfer sub ofs lia>>05<>17<< pri, jdp gef skp i stf 2 lxr i 4 jmp prh pr1, szf i 6 stf 2 /print top level lxr ntb /print all prh, TXX> jmp erp jdp crp law c0 jdp txp prm, TXX|= jmp prp jdp ttx law ntb X+AX lac (dac pdl sub pdp dac nid sza i 2 jmp prv stf 6 jmp prw prv, jdp crp lac nid ZIP tyo SAA> jmp .-2 jdp prn prw, lac i 4 sma jmp phi jdp prz pru, swp adm bck lxr i 0 jmp prm phi, lac i 0 xct pdp idx pdp sad (dac pdl 37 jmp pce lxr i 4 jmp prm erp, TXXA jdp prz lai jdp ocp jmp rst prz, 0 cli and (777 sza i jmp i prz add (dbt dap . 2 SII lac jmp prz 2 z prp, law i 1 adm pdp dap . 1 lxr sas (dac pdl-1 jmp prm jdp crp jdp car law i 1000-ffb TAX lio i dbt 1000 sni SAA SXX= jmp .-4 dac sve /free blocks szs i 10 jdp ocp law c1 szs i 10 jdp txp law i 1 CAX lxr i ntb SAA TXXP jmp .-3 dac rsi /free directory entries mul (3 lac sve AMI>= /print if less than 1/6 of directory blocks free law 60 AMI>= /or less than 10 blocks free jmp rst lac rsi jdp ocp law c2 szs i 10 rst1, jdp txp jmp rst c0, text / file blocks _/ c1, text / free blocks _/ c2, text / free directory entries _/ crp, 0 lac bck TA|M jmp crq lio (5736 tyo sir 6s skp 6 tyo lac bck a jdp ocp lio (55 skp 6 tyo crq, clc 6 dac bck jdp car jmp i crp bck, -0 d dri, 0 dac ofs dzm fb /current tape position dzm dir /current tape direction dzm eflg /use to determine if tape is full dre, dzm t drl, law 400 dap afn adm ofs dip afn sub hig spa jmp drg drn, skp 2 skp 4 jmp drn2 jmp drh drn1, law rst1 dac dri /tape full drn2, lac t ior (add xct drd law e12 /tape full message jmp i dri drh, stf 4 drg, law 7777 and ofs mta lio afn law 6000 jdp drum lac t sad (177000 jmp drk law i 400 TAX sas i 6400 jmp drk /block is nonzero SXX= jmp .-3 law 1000 adm t /block is all zero jmp drl nxtblk, 0 next, lac fb rar 8s xor dir and (1 ior (776 sub fb sma sad fb isp dir /always skips TAAX| jmp next dac fb jmp i nxtblk j drk, skp i 4 jmp tbp law 377 lio b A^IA= dio 6377 tbp, lxr fb tbp1, lio i dbt /load tape block descriptor block TII=| jmp tbp2 jdp nxtblk /get next block, block ptr left in A,X sas (777 jmp tbp1 lio eflg TIIP| jmp drn1 dzm eflg jmp tbp1 tbp2, lac (add A+XIA ior t drd, dac and (777 add (dbt dap drd idx eflg /have found free block on this pass law 7777 A^II lac (add 6000 jdp tpe repeat pbs,jdp nxtblk /skip pbs blocks jmp dre >>76<< sav, law 1 dac as dac tem1 stf 2 jdp gtf jmp sav1 clf 2 jdp gnu dac af dac as dac tem1 szf 2 jmp sav1 jdp gnu dac as szf i 2 jmp erg sav1, clf 2 sav2, jdp tf nop lac af sad as jmp . 3 idx af jmp sav2 lio as lac tem1 AMII SAA rar 6s rir 6s AMII dio hig sub (i 400 sav3, dac drum law i 7777 ucp, ior jdp uch lac drum wre-1, jdp dri wre, law 600 dap wtd jmp rst g loa, law 1 dac fld1 dzm fld2 jdp gtf jmp loa1 clf 2 jdp gnu dac fld1 dac af szf 2 jmp loa1 jdp gnu dac as dac fld2 szf i 2 jmp erg loa1, cla jdp dro lac fld1 dac af lac fld2 dac as jmp goa name, lxr (-10. nam1, law 77 lio i dbt 10. ril 9s tyo A^II A~IP| jmp . 3 SXX= jmp nam1 jmp rst f repeat if2,[ printo [ffb-4]x400-. printx / /] 3000/ ntb, ntb 1000/ /directory blogks (146x5 words + 2 word header) dbt, dbt 1000/ /tape blocks 5000/ /program area 2 5000-5377 car, 0 cli>>05<P jmp erb mul (1 div . 1 5 law 1000 XMA> sni i jmp erb jmp i ttx constants repeat ifp [.-5400],[printx / data in program area 2 exceeds 400 words /] repeat if2,[printo 5400-. printx / /] n 5400/ /variables pdl, .+40/ af, 0 as, 0 sfp, 0 sx, 0 sga, 0 snx, 0 fla, 0 fle, 0 svl, 0 flf, 0 t, 0 bkp, 0 reu, 0 sve, 0 rsi, 0 ter, 0 sb, 0 ofs, 0 afn, 0 blk, 0 sp3, 0 nid, 0 hig, 0 bnl, 0 eflg, 0 dir, 0 fb, 0 tpe1, 0 tpe2, 0 fld1, 0 fld2, 0 wpm, 0 tem1, 0 van, van 4/ pnu, 0 tyin, 0 /pointer to character buffer cbf, 0 /character buffer 6000/ /tape-drum buffer 6000/ /second directory buffer 6000-7777 6400/ /merge buffer 6400-6777 7400/ /character buffer 7400-7777 d /initialization 6000/ jmp in /replace file system /here to initialize entire tape ini, iam clf 7 law m69 jdp txp lxr (-1000 dzm i dbt 1000 SXX= jmp .-2 jdp dirset cli>>05<>05<>05<P jmp foob1 /not enough free blocks law 773 dac n /block currently being moved go1, lxr n lac i dbt sza i jmp index /index n lac (add A+XI lxr (dbt ffb lac i and (400777 A~IP| jmp found /found block pointing to n SXXA sas (dbt 1000 jmp .-6 lxr (ntb 6 /look in directory blocks go2, lac i /load value pointer and (400777 A~IP| jmp found /found pointer to block to be moved law 5 A+XXA sas (ntb 1004 jmp go2 hlt /not in directory blocks e.ther found, /XR points to pointer to be redirected TXI lxr (dbt lac i /find free block sza i jmp found2 /found free block SXXA sas (773 dbt jmp .-5 hlt /no free block this can't happen found2, X.IX /X contains pointer to block to be redirected law 777 A^II cma y and i /I contains pointer to free block A>>05<