P0H(I#+/n3.7;N? C GN K((@''U'!V.XUK5eX_UfJUQXU _efmUt'U''U''U''U''U''U''U''U''U''UJQUX_UfmU''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U''U I4&K<&O!.]]sM.[M XQrDRbbFcbUUs_SrWGs(*zaGdG(z6mn@G(/"Y% Gi EVG_p"ODqQw.S^  K M"Ih 9 \?" e(.K!D5(xH"!`BL ($q9O[EJ\ ?A*%1d'e"  G2 $@V *$ / / .ZAP *.R1 / / $END >. @r I(Bpp60K60p;*MP^ EN60V9 7#/E!J-Y TAD CSECLS /Reset sector list pointer DCA SECPTR JMS RDSEC /Read the third sector of block 0 JMS MT8 /Read the sector to 7600-7777 TAD C7600 /Reset pointer DCA BTPTR JMS RDSEC /Read the first sector of block 66. CDF 10 /Want to read the first half to 17600 LP4, JMS BTXDR /Get a byte. CLL RTL DCA TEMPLC /Do this again TAD TEMPLC CLL RTL DCA I BTPTR /Stash the first ISZ BTPTR /Point to next TAD TEMPLC BSW DCA I BTPTR ISZ BTPTR /Done yet? JMP LP4 /Keep trying ISZ LPCTR /Read  "F 6 N$6%FQ%J$:$ N%$c n |`(!z{| {K(Q(  ~G}&06z|0b!{if>f;<"FnziQ@ pD3&!LM.K0yK(xK(Q0zI]AyY4TMAR0 X ES3  e@BP@F/@ )W3K<_ lra&N ,[_b(ze[ ^6 ^Cx(w_e`Fnx`cVdW6Ca.^ L^0?/.E"`9z^c(:z f[&V VbJ n VbV n^d ^C`Xc'LU,~(/y]9c @0`v9= _B}]&]]6] /e|2v_b Lw v]&ef?&o}?x"""Bu(~""ts"&x0 t$k;CM(&"@"z6"bc70~"0CjMG 0r }0&@/3~"66&C|%{q)~0"~p'&@>uo %u&sr&4H/Cz)< hhC(M{<>|9>>4| bm)m`T)jG)s0.bwY(/v)uy)ts)r)2}" EzqCRc IGw Kp( b n chc(Y0| {| {)co7vF *:&3 OT)08D`B7N^taFA,&d=b=fn,h==t==2D 8%=&2&0.fo =; }a 0V>bVbnVVbn`~)-J}) ff }9>J !6 j8W!|{l <}!Hzr{)d: >f!.)d>!by`)W xwdnv})>& )8j@?0 @ cY0DJ^`J n~} l <|| <{zsyxwC v@J nux# KHxStJ nsr'xq0Fnpb KJN0FB1MR0A4MY0JN5JL5AG5SP1OT0NV3DC1e h0mq;v{;< LLL $L'+L.3LDT T ?A@K@FpdP6@t?+MT @BLO5 A@P0EEI@@O@DOD$0A@P#ARL 3PTNU$U@AL SCM3O@PF0V@K G2l>n>Pp>r>t^@vNxNz|>~zoCpz oFPoFToFRoFVoFXoFZo/`^6q~&$}"H|r~H. f0!b{bl <&Jnk56g08f))f))f n;"<=&0b,dz0'y2ti%'xy0ki?Neimi?ki?mi?mi?m)?EiFf~w ?v|3H td"fuP"(ZU#8CVR1R@VR A@18IHvy!fn$(/]"@zr0!f0r (z(/$X!f$"k><*]#*|y\Z*X0"r(]g#fc@n#2f~"2gr"r#r'gp'&0b*0r ((}  ..r|/r{/r@ubo./F2fzy'x & gw ' .bH/bnf g '2"2yevV$qW} !>cnFd 72 '5 '5$R;*&lui%j(Z"&"J.x"btt)#@>&&7%cn"%Zz!X(@*d0;)9#.'/~',(/0&}C< lv_|q)zvn /&{Cz |Cytx7 w'vC}2FXon~v <cGu22P3b85f&@>/>&/&'>/&%c.>&>j &z.%'>.&)L2g02fsgrtphU#"wGR9"a>% ?^##a&cU{"%7#& U67 C (Oe6(+"+b(ekly|3xJ szr2) pv&xE |'^\8.PZtW@0?Votrqpn}ePdKr2*whgD*%xDuTd#iBpN &W ?|Ki- & C! d h?#"@~~J. n,~}28b }id@ N0b*% %%b&*kL#A RG2N VR1MDR O R0Sx;RRCx``xXOX ?U!,]+ . njj` z(j{~z ~)jv?R?y   cQ6Uot's type DCA I RX2PT JMP I C7400 /Start the secondary boot. BTREAD, RD4BT /Fake return first time thru SDN JMP .-1 /Wait for done flag to set BTRD1, AC0006 /Send read sector command LCD TAD I SECPTR /Get sector number JMS LOAD /To the RX FIXSEC, AC0001 /Assume track 1 until secondary boot. JMS LOAD /Send to RX CLA CLL TAD C102 /Empty buffer, 8-bit mode SDN /Wait for done. JMP .-1 LCD /To RX RX1SKP, SKP /Cleared if we are an RX02 JMS LOAD /If RX02, do an extra XDR JMP I BTREAD /All done. TEMP=. LOAD, 0 STR /Wait for TR flag JMP .-1 XDR /Send/get byte JMP I LOAD ENPUNCH / The coding for the handler /follows. The first page contains the entry point at /7607 for SYS:, some initialization code, /several subroutines, and the return. The "main line" /is in the second page, which acquires and decodes the /arguments, then executes the read or write routine, /which does the byte/word translation. Each byte is /sent or fetched by the first page routine CHKSEC /which also reads or writes a new sector when /necessary. Three sectors are used to store each /block, and every three sectors are interleaved. /The total number of blocks (658) is mapped /sequentially up the floppy. Block 0 uses track 1, sectors /1, 4, and 7. Block 1 uses track 1, sectors 10, 13, 16, etc. /Track 0 is not used. *200 /First handler page RELOC 7600 /Loads into field 0 locn. 7600-7777 ZBLOCK 7 /Actually starts at 7607. SYSENT, DISK0, VERSION /Entry point for SYS: and RBA0: K7600, 7600 /Clears the AC. JMP SETDRV /Set drive to zero and continue. IFNZRO .-7612 WASTE, 3 /Flag as 2-page. /Put some constants here to pad the CIF below to 7642: KM32, -32 K32, 32 CDIF0, CIF CDF 0 /The entry point for drive one: DISK1, 0 CLA CLL TAD DISK1 /Move the user call pointer to the common location DCA DISK0 TAD K20 /Get the bit selecting drive 1 /And fall thru to the common code. /Get the user's data field for return. SETDRV, DCA FLMTCD /Set the drive bit of the command. RDF /Where was I called from? TAD CDIF0 /Create a CIF CDF for the guy's field DCA RTNDF /Stash it away where it will do the most good. TAD I DISK0 /Get the first argument (read/write) RAL /Put read/write bit in link (1 is write) SNL CLA /Skip if write, if skipping set fill buffer cmd. CLA CLL CML RTL /Put fill buffer cmd in AC, leave link 0 TAD FLMTCD /Get the drive number already set. DCA FLMTCD /Stash command. /Now, link=0 for read, 1 for write. TAD K7600 /Set byte count for write. K20, SNL /Skip if write. STA /Want an immediate read. DCA BYTCNT /Set counter: -1 for read, 7600 for write. TAD DISK0 /Get the argument pointer for the other page. IFNZRO .-7642 CIF 20 /This must be at 7642 for BASIC and F4! JMP PAGE2 /Start the I/O on the other page. WRTRT, JMS DSKRW /Return from write RDRT, ISZ DISK0 /Point to normal return BADRT, RTNDF, HLT /Set to user's field CIF CDF. JMP I DISK0 /Return. CHKSEC, 0 /This checks the byte count for a sector. CLA CLL /Zap out the AC ISZ BYTCNT /Done the buffer yet? JMP CHKRTN /Nope. JMS DSKRW /Read or write it. ISZ BKNO3 /Point to the next sector. TAD FLMTCD /Give the control the data transfer command - JMS LOAD0 /Read or write buffer as set earlier. ISZ CHKSEC /Skip on return to tell him it's a new sector. TAD K7600 DCA BYTCNT /Reset the counter. CHKRTN, CIF 20 JMP I CHKSEC /Finis! /This routine is used to load registers in the RX. /If done is set, it loads a command (after setting the 8-bit /mode bit). If transfer request comes up, it will transfer a /byte to the RX. It assumes that the caller knows the state /of the flags and where the data is going. There is also a /routine in field 0 for calling this from field 2. LOAD0, HLT /Load RX registers LOADDN, SDN /Done flag up? JMP TESTTR /No - check xfer req. TAD K100 /Oh Boy! let's see...set the byte mode... LCD /Then to the RX as a command.... RXSKP, /Set at boot time to SKP (RX01) or NOP (RX02) IFZERO RXTYP-1 /RX01 instruction for BUILD time IFNZRO RXTYP-1 /RX02 instruction for BUILD time SKP JMP I LOAD0 /And return! Easy, huh? TESTTR, STR /Is the xfer req flag up? JMP LOADDN /Neither flag yet. Hope one will come up soon. XDR /Transfer a byte to or from RX (depends on function). JMP I LOAD0 /Back to the caller! DSKRW, 0 /This reads/writes the sector. AC0004 /This bit makes read/write out of fill/empty TAD F|pppGw^ ! gAZ%xM!ELG^L('8Z@+ 2#,* AD"L"3"4 o -* D.$ps^ @` P-v P O*OZD"L"3A HA@$  YBB"l,\BB")"`,Tb8\B"7"c&AT <**m*ML@ D2DL"O"P @ 7 O I*k k DD*LO*A@@@k",2 002Q0OD+L++  0@@@p  :0D+L+AHAHAHA@   m032)222 2\2`R2K]2Ob 202?23]ROb202<20]ROb2-2E2-]ROb)2-2B *]ROb32-2?2']ROb=2-2<2$PPR:2)@E SDE+LV+W+\K1 z P 0, DCA CALENT /Save the```!-  r0r0DE+LV+A LHHHHBIFK1J)fB]A@lv `LTSF`2JiL      D4K, . jTR<T+UQ&k-s. EDJLbUbVck number. (Go@`ords!) TAD @O. q`DJ.LU.AHA@\ *.a. R`q.qb}o`field 0 SOB D.L$.%.or counter. BUFSAV, /Save buffer  `ere too. BUFCDF,  0 /Change to t@```h` /o@`@`D.L$.A LHTb2 D&/`].H.A2` SLO`  ]BOr3rQbch,<R  4<-o  ,B>r{b{b|pYSDS/L^/_/ _gx 4 f the block, and /th Xpz/z_DSLr^|Ap\/z//d/?/O5 DLr!r"CxKSEC /Start the read.@ 0@ DIS 0/ =pD/L!/AHAHA@4[/ B_p -Brp4Brpnp]^ r/n/-/P]T =/  / G!E2Me by two (there are two @`rds ` -E M AHA@  A-\OP\rSO,\/-    A@FE` Ml m MS RXTRNS /Get a byte @` TL f PE`MlA HH5B/ <  \\-\a gu%> ) gW g@ )RL )A ) )Y !P 8EV Mb c guy's buffer. TA@`/Get the \ ~PEVMbA HH5B& <%!!\M\a \,! -]~g })gW~ g! EE>MIJesector done  SKP /Nope. Che `C! eE>!MI!AHAQHH@\/!!!e!6!DKE Mcunt done? JMP @@/Nope. Keep f `! wy.1QE MA HH \l-p@A ,\.\!'!A$V!@, BVLY#1!'!!"DKExM"t)l something happens. FIXED, TAD B @}!  Ex!M"AHA@ YB2" " E`HE?"MJ"K"the sector counter (fop@tsec D -2. DCA SECEV` H` h   8 f"fRE?M"JA HHH!"R]v!"\"C21"n"_"_"_"_"_ B\ B\ Bl Bl&\"K&/*` AEE T`QUSA NS'@: } j ]v!}"j" } z ]v!}"z"'#uqE~M" 2 : ISZ DWCNT /Is word c  ? @# %0E~"M #AHAHAHA@I#`#n#BX62e1```#j#%':g+,)I'g*)<'g*,=)00AEu#M##ght bitter. JMP @ Pu bi z 0 / Writ@P #SEuM2A0 HH@  < h#-V 0Tb5%[# R~0,ZC#\`-h#$# --62A``\`-~#'# --]2Or B2 <-#' (YO=H' )RB@ HE$M$$%$  @@TEMB$A@ H LXa$a$@@@$$ `4EfMBqBr@@ k$ @Ef$Mq$@  1_ A1|]8',$$$@IT+A"Bp@ LCCEA$ML$M$@P F @hTEAMBLA@ H |FT+ ]O'%j$^$ L |Tb <]O' %m$U$ BRB) BTb <1 h$c%  E:MRERF1P<)@`|@ ?% aPE:%ME%@]$t%U!}%U 1%rQ- P]O'% %N%%%aPa%C% UCE2MR%R&P` PC. % APE%M%%AHA@-`P]O'A%`%.%rUt5A@rP@"y]>b`@DVAi5;Vg8`Ai8d-0&AMD aD`>-*&;y%5;vy%;b`@`J&G&IbQbWa`Q&]bZ`\&gbd`f&q5bn`p&{-bx`z&HR@EB Mb`. HN::sU'+'Xg. 0 &+b-`+`E&M&AAUHH-Ub-hPR+Ub-a!+&E'C@WWA BP@Mtqt-r`ppPus&p&ECp\`OMpD 8E/'M,'IQ4&h! nz.!5bi "4Ji (pH'HpHpE/'M,'AAHA@J5rfpA5 'A =bJpyGHEr>Cp &qE3Ap BP5WM(G5&G-"'&'&'P@5RrpE>'C'``!lb{E+K[9MA9IE{|4&KH 4@N[9}A)IE{4AG~5&N?[MAI Fn4fAIk04O+<)NT" EMS9 )EK1;"! ( @@`@P`@@@` @`P@@ `p@@`P p`@0@`h 0@ \ PpE`,`|,N ( :!%g+-P%'c.gp,py(0o!)4$* ;*1p\.r :(yPC.X` K  R    XAE A XHI HS HS LM ON  HR G R GS MR N X  S HD O 8RT N XES& NF (P3 K K3 AA ES4 I H 3 I 8YT4 R  C N D  `A A` hNK@ TP TD  T D (LS E HS A X/(/XEMv2P 6@Z3N' 5@ER#"'pKR7pHRB!->B <0<V*Et)AZHBREuwB.$53*B;\^91p9;Z;@9g[;-P;)YB. 3)B%E5"?!B ;qB%H5"K!B :N!B$5V*B9\BNR5q*B9yX9E`;gW:r :4T9|AB"BR>Qi) `U(4((C(   XX`R( *`yU`"* i-Xy - gRO"O"?2<BO"O"tBBCBO"RO\"`RO"jRe&Atv M$[&j *,r\v@ L]O'v*F(a( @< BRB B4o<!B"BRB1"R]O'"+"a(%B56UCA2 q6M-6$ XX*X/+yB/1yT+yB1yTq+yBh1 :rR/+ :4B/1Uq&A.Ug&1 ;\^/+ER+\`-+a( ;r/1 :NR9X-/1 -B=\2`R=2UO&R]6vyAlvyMS6`9:I)mX*9y%t+9yX,@@2y:yP@9:-,9:2y8Py82C^-%r'\B`R'BX,#BA2yP:yU?+q-ARXAp`<S`<V`\, ,-t@ <2!rWAQC,\`-t,[(`R(]+`W`W`W`W*9};!9}g2tFR]6vvr!p9\]8'@,'7( BFR]6AplvyMOFr BRB9:C,\B-r,('z,\`-z,g(AUry9S|9M|AB"BR#B`BC@1_` (]+`WAl`yXM M`W*UB{l"WUq&"C\R`RCRdBRB#pB1:9aB"BRBF]R8rcR1r}1rPBRNDQB:4DUJ&9AyUJ&%"9QyqpU-P]d%--%BP9|\B-B%DnPBR/B-qp9gBWQ.r@BE]]TGRFEP PU]]TWRrUQB"BR.B&PBR/B-qp9g;-]9;$UQ&9Ag4Ug&`P^]TbraB"BR.Bb,P%W`cP)B!%}GB ;\B3`91qB `91_`PB-B%G'`BR1JQBUJ&;%WB:cPB-B%JL]bs2kbfRR]s2ublRU]s2 `RX]s2 b*R[]s2bR^aQ]s# .)R(dQ]s#*.$)R(gQ]s#4.B)R(jQ]s#>. )R(mQ]s#H.)R(pQ]s#R.W)R(sQ]s#\.%)R(vQ]s#f.9)R(yQ]s#p.)R(|Q]s#z.u)R(Q]s#/H)R(Q]s#/i)R(Q]s#/Z)R(Q]s#"/')R( Q]s#,/7)R(Q]s#6/)R(Q]s#@/)R(Q-]s2MrR]s2Wr{R]s2arER ]s2kr3 R#]s2ur.R&)Q]s#/!)R(,Q]s# /x)R(/Q]s#/4)R(2Q]s# /)R(5Q]s#*/])R(8Q]s#4/<)R(;Q]s#>/6)R(>Q]s#H/K)R(AQ]s#R/+)R(DQ]s#\/1)R(GQ]s#f/N)R(JQ]s#p/)R(MQ]s#z/)R(PQ]s# )R(SQ]s# 0)R(VQ]s#  )O(YQ]s#" r)O(\Q]s#, -)O(_Q]s#6 ~)O(bQ]s#@ Q)O(eQ]s#J ?)O(hQ]s#T ")O(?R]s#^ )U(kQ]s#h o)U(nQ]s#r ()U(qQ]s#| T)U(tQ]s# c)U(wQ0"1%QB!B UJ:m%B"BRB:Q"::$2:Q&*:(":Q*:":!OQz UJ&}Q R BR B-";ti B- !B"BRBZ R\`R R%) RUJm UJ&!RUJm$ UJ&'RUJm*]"Or'"a:!`U(C(A2 `N2A`:):)S LOAD /If RX02, do an extra XDR JMP I BTREAD /All done. TEMP=. LOAD, 0 STR /Wait for TR flag JMP .-1 XDR /Send/get byte JMP I LOAD ENPUNCH / The coding for the handler /follows. The first page contains the entry point at /7607 for SYS:, some initialization code, /several subroutines, and the return. The "main line" /is in the second page, which acquires and decodes the /arguments, then executes the read or write routine, /which does the byte/word translation. Each byte is /sent or fetched by the first page routine CHKSEC /which also reads or writes a new sector when /necessary. Three sectors are used to store each /block, and every three sectors are interleaved. /The total number of blocks (658) is mapped /sequentially up the floppy. Block 0 uses track 1, sectors /1, 4, and 7. Block 1 uses track 1, sectors 10, 13, 16, etc. /Track 0 is not used. *200 /First handler page RELOC 7600 /Loads into field 0 locn. 7600-7777 ZBLOCK 7 /Actually starts at 7607. SYSENT, DISK0, VERSION /Entry po700, DOUBLE=7600 DCA I LDENSW /PLACE FOR LOOP CONTROL TAD I ZOO CLL RTR /PUT QUAD BIT TO LINK SNA CLA /SKIP IF DOUBLE OR QUAD TAD L1734 /SINGLE TAD L4110 /D&Q=4110, S=6044 SNL /SKIP ON QUAD, IT'S OK RIGHT NOW CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 DCA I LSIZE /S=7022, D=6044, Q=4110 TAD I LDENSW /7700 IF SINGLE, 7600 IF DOUBLE CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE AND UNIT /VOILA, 400*DOUBLE + 20*UNIT DCA I LFN /PLACE INTO FUNCTION CONTROL WORD AC7775 /BACK UP ZOO TO FETCH CALLING ADDR TAD ZOO DCA T1 /HOLD TEMPORARY TAD I T1 /HERE IS CALLING ADDR CLLFLD, HLT /PUT CDF TO CALLING FIELD HERE JMS I LENTRY /GO TO SECOND PAGE, LEAVING POINTER TO DIVSUB / / DIVSUB SUBROUTINE !!MUST!! FOLLOW IMMEDIATELY / / / DIVSUB / / CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR # / ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE / / CALL WITH AC <0 IF IT IS REALLY AN ERROR RETRY / CALL WITH AC >=0 IF CALL TO DIVSUB / DIVSUB, 0 CDF 0 /AND DATA FIELD MUST BE TO HERE SPA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RSTART /NO, IT WAS AN ERROR RETRY!! DCA I LQUO /CLEAR DIVIDE QUOTIENT TAD I ZOO /IS IT A TWO HEADER RTR /PUT QUAD BIT TO LINK SNL CLA /SKIP IF YES JMP SHUNT /NO, GO DO DIVIDE TAD I LREC /WHICH RECORD ARE WE WORKING ON TAD LM3670 /NUMBER OF SECTORS ON FIRST SIDE SZL CLA /SKIP IF SECOND SIDED IT JMP SHUNT /NO, JUST REGULAR TAD I LFN /FORCE HEAD BIT ON AND L422 /KEEP DOUBLE, UNIT, READ-WRITE TAD L1000 /ADD IN SECOND SIDE DCA I LFN TAD LM3670 /BUT DECREASE RECORD NUMBER SHUNT, TAD I LREC /THIS FOR TRACK-SECTOR DIVLOO, ISZ I LQUO /MAIN DIIVIDIE LOOP TAD LM32 /DIVIDE BY 26 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L32 /REMAINDER 0-25 DCA T1 /HOLD IT IN TEMPORARY TAD I ZOO /SINGLE DENSITY SZA CLA /SKIP IF YES TAD T1 /MULTIPLY BY THREE FOR DOUBLE TAD T1 /AND BY TWO FOR SINGLE TAD T1 CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM32 /DIVIDE BY 26 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L32 /RESTORE POSITIVE VALUE TO BE SECTOR DCA I LREMD /WHEW, BUT WATCH IT, A FINAL CORRECTION COMING! RAL /IF LINK=0 AND SINGLE: 2,4,6,8,10,12,14,16... SERIES TAD I ZOO /BUT WE HAVE 1,3,5,7,9,11,13,15... SO WE MUST INCREMENT! SNA CLA /SKIP IF SOME OTHER CASE ISZ I LREMD /NOW HAVE IT 2,4,6,8,10,12,14,16... JMP I DIVSUB /OUT / / L416, 416 /SOME LITERALS L1000, 1000 L32, 32 LM32, -32 L1734, 1734 L4110, LM3670, -3670 / / / *.&7600+167 /FORCE TO END OF PAGE / ZOO SUBROUTINE / / TO SET UP ENTRY POINT PROCESSING, AND INIT CODE / ZOO, 0 /ADDR OF 'HIT' ENTRY POINT +2 COMES HERE CLA /FOR SAFETY RDF /SAVE CALLERS FIELD SETTING TAD LCDF0 /ADD IN CDF 0 DCA CLLFLD /RESET WHEN GOING TO I/O SUB LCDF0, CDF 0 /DATA FIELD HERE FOR INDIRECTS CLOSE, TAD DOOR /CLOSE DOOR TO ONCE ONLY CODE (JMP WHICH T1, DCA CLOSE /USE ONCE-ONLY FOR TEMPORARY LOCATION JMS POINT /LEAVE ADDR OF SECOND PAGE / / / VARIABLES, ALSO INIT CODE LIVES HERE / / BUF, 0 /POINTER TO CALLER'S BUFFER RETRY, 0 /RETRY COUNT SIZE, 0 /SIZE OF DEVICE SYS, 0 /POINTER TO CALL QUO, 0 /DIVIDE QUOTIENT, WHICH IS TRACK NUMBER REC, 0 /SECTOR NUMBER OF FLOPPY BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE; 2 FOR READ; HEAD, DENSITY, UNIT DENSW, 0 /7700 IF SINGLE DENSITY, 7600 IF DOUBLE DENSITY ENTRY, 0 /ENTRY POINT, LEAVE ADDR OF DIVSUB HERE / IFNZRO .&177-10&4000 <_ERROR> /ENOUGH ROOM FOR INIT? / *.&7600 / / INIT TIME: FILL VECTOR TABLE / THERE, 0 /FILLED BY JMS, POINTS TO VECTOR ILOOP, TAD THERE /POINTER IS ALSO OFFSET! TAD I THERE /MAKING VECTOR DCA I THERE ISZ THERE /MOVE TO NEXT VECTOR ISZ LDCMD /CONTROL COUNT ON THIS PAGE JMP ILOOP JMP I THERE /BACK TO FIRST PAGE / / IO SUBROUTINE / / ENTRY POINT AT END OF LAST LISTING PAGE / / *ENTRY+1 /RESUME RUNTIME CODE / DCA SYS /POINTER TO ARG'S, EXIT RDF /DATA FIELD OF USER CALL TAD (CDF CIF 0 /MAKE CDF CIF TO CALLER'S FIELD DCA EXFLD /SET UP FOR CALL AC4000 /SET LINK=0, AC=4000 TAD I SYS /CARRY READ-WRITE BIT TO LINK AND (70 /KEEP FIELD FOR BUFFER TAD LLCDF0 /MAKE CDF TO BUFFER FIELD DCA BUFCDF /PLACE INTO I/O LOOP CML RTL /MAKE FUNCTION CODE, 0=WRITE, 2=READ TAD FN /START-UP CODE HAS SET HEAD, DENSITY, UNIT ETC. DCA FN TAD I SYS /MAKE LOOP CONTROL COUNT RAL AND L7600 CIA /0 FOR WHOLE FIELD DCA BC /MINUS TOTAL NUMBER OF WORDS ISZ SYS /NEXT TAD I SYS /IS BUFFER ADDRESS DCA BUF ISZ SYS /NEXT TAD (175 /CARRY WITH DENSW IF SINGLE DENSITY TAD DENSW /BLOCK # TO SECTOR # SMA CLA /SKIP IF DOUBLE, MULTIPLY BY 2 TAD I SYS /SINGLE, MULTIPLY BY FOUR SMA /NEGATIVE BLOCK # ERROR, FORCE LINK TO BE ON TAD I SYS ISZ SYS /MOVE POINTER TO ERROR EXIT CLL RAL DCA REC /SAVE SECTOR NUMBER SZL /SKIP IF LEGAL BLOCK # JMP ERREX /FORCE DISK SIZE TO BE SET UP BEFORE EXIT! JMS I ENTRY /CALL DIVISION SUBROUTINE OTHER PAGE TAD FN /SPLIT READ AND WRITE RTR /READ-WRITE BIT TO LINK SZL CLA /WRITE SKIPS JMP STREAD /READ GOES TO START IN MIDDLE OF LOOP / /WRITE FALLS THRU TO NEXT LISTING PAGE /WRITE FALLS THRU TO THIS LOOP / / TOP OF MAIN LOOP / TOP, TAD FN /SET SILO TO LOAD-UNLOAD JMS LDCMD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILO LOOP COUNT, S=7700, D=7600 DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, TAD I BUF /IN CASE WRITE, FETCH A WORD STR /SKIP IF READY TO PASS DATA JMP .-1 /NO XDR /TO OR FROM AC DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP) REMD, 0 /DIVIDE REMAINDER, WHICH IS SECTOR NUMBER ISZ FLPWC /DONE YET JMP TRLOOP TAD DENSW /ADDING 77 (SINGLE) 177 (DOUBLE) CMA /ONCE WE CMA, THAT IS TAD BC /LOOP CONTROL TO FINISH READ SNA JMP OKEX /OK, DONE DCA BC /REPLACE AND KEEP GOING / / MIDDLE OF MAIN LOOP / STREAD, TAD FN /READ STARTS HERE TAD (4 /TURN SILO COMMAND INTO READ-WRITE COMMAND JMS LDCMD /I/O COMMAND TO CONTROLLER TAD REMD /PRECOMPUTED SECTOR # STR JMP .-1 XDR L7600, 7600 /CLEAR AC, AND IS LITERAL TAD QUO /TRACK # STR JMP .-1 XDR /TRACK # IS ALWAYS NON0 !! ISZ REC /MOVE TO NEXT RECORD NUMBER JMS I ENTRY /DO TRACK SECTOR FOR NEXT OPERATION TAD (16 /WAIT FOR OPERATION TO COMPLETE JMS LDCMD ISZ BC /CHECK FOR WRITE EXIT JMP TOP /STILL MORE OKEX, ISZ SYS /KICK TO OK EXIT EXFLD, HLT /CDF CIF TO CALLER JMP I SYS /OUT / / / LDCMD SUBROUTINE / / CHECK FOR CONTROL C, LOAD A COMMAND / FLPWC=. /ENTRY POINT A TEMPORARY LDCMD, VCOUNT /INIT COUNTER DCA TRANS /SAVE COMMAND LLCDF0, CDF 0 /DATA FIELD HERE IN CASE CONTROL C TO MONITOR TSTTT, KSF /SKIP IF A TTY CHARACTER HAS HAPPENED JMP TSTSD /NOPE, GO CHECK RX CONTROLLER READY TAD L7600 /FORCE TOP BITS TO BE 1 TO ELIMINATE 3,203 KRS /AMBIGUITY ON TEST TAD (175 /IS IT A CONTROL C SNA CLA /SKIP IF NOT JMP I L7600 /EXIT TO MONITOR TSTSD, SDN /IS RX CONTROLLER READY JMP TSTTT /NOPE, GO CHECK TTY TAD TRANS /GET BACK COMMAND LCD /TO CONTROLLER SER /SKIP IF AN ERROR JMP I LDCMD AC4000 /AC CODE FOR EXIT, ALSO TO TELL DIVSUB WE'RE A RETRY! SKP ERREX, TAD SIZE /BLOCK TOO LARGE ENTRY, SET AC CODE ISZ RETRY /TRY THREE TIMES? JMS I ENTRY /NO, AC ZERO SAYS RETRY NOT DIVIDE!! JMP EXFLD /BACK TO CALLER / TRANS, 0 /TEMPORARY FOR LDCMD TO SAVE COMMAND / PAGE / /RX01 (RX02) SYSTEM HANDLER / / THIS HANDLER WAS DESIGNED TO WORK WITH RX01, RX02, RX03 / / HOWEVER, ONE SINGLE BINARY CANNOT SUCCESSFULLY BE USED IN A / VIRGIN BUILD FOR ALL THREE DEVICES. IT IS CURRENTLY SET UP / TO BUILD AN RX02. / TO GENERATE A BINARY TO BUILD AN RX01, CHANGE THE RXTYP / EQUATE TO 1. FOR AN RX03 BUILD, CHANGE RXTYP TO 3. / / / IFNDEF RXTYP /THIS IS THE SINGLE DENSITY TWO PAGE HANDLER / set =2 for RX02; =3 for RX03 / / VERSION="M&77 / / AC1=CLL CLA IAC AC2=CLL CLA CML RTL AC6=CLL CLA CML IAC RTL /RX02'S MUST RUN ON AN OMNI-BUS !! AC4000=CLL CLA CML RAR AC3777=CLL CLA CMA RAR AC7775=CLL CLA CMA RTL / / DEVICE IOT SYMBOLIC EQUATES / LCD=6751 /LOAD COMMAND XDR=6752 /TRANSFER DATA STR=6_* for SYS: an GEE"M (00 @@prs the AC. JMP SETDR ( /ie to zero and continue. IFNZRO .-7612 WASTE, 3 /Flag as 2-page. /Put some constants here to pa@`Pp@P`@@@@P@`@`@@p @`@ @P`@`@` @p`p @p`@P 0P@pP0@`P`0p@Ppp@@`h@0PHPPP@`h 0@ ( Pp \ Pp@|,N (:%!g0--%pc `E&gp,\`/y))4@*"; 1/r :(yPC.N R XETT .  8 ` PPp ipp```@@@@p XP `Ph@P`PH P@P 8Ph(PE`d ` `P@p@P @@@p@`P( Px`PP ```` 0p`@p0 `@@(@08@x8@`b@p `x`` (`08`HP`x@ `P bXP8hPH@@ . 0@ //E(M(_0EkA H1@Z \UJ&E(et a+Ek*A)[H@ EUJ#l -XUJ&#U"QEbe baE2kA CH1@ |'UBJEbae aE2kA ]H1@ CpTbE2CwYb\ "g2(]="s2;%&pyXXm ;%+p !+y!+.B!]2v26y!%"30R&!!y[]2-2-2%[\2BR72 %[&0BRB:*%y%S:1%S1y]v[2B&"BR*B<1y*]r-2g2%*\rBRq2y %*q:%A3-*/&:*q:&%b, -B*\rHbB%*'p:Q&B\" "B&W\H.(,e(0,::QB&-B'$,&B!B ::X%H,O::Q:::*RB&-B*$;,]v!Z, (]T */!( L&B!B ::o.&:q:gp9ygWe,]%,g'yXl5BZAy3-Z,By:*"ZA&t#,y1:ZA7tZ,y::QZ,]-+4,y(%Z,B %BE\BBRCBy %Z]BG2KBgXtZ,y9:&rWg&-g&t:yR~ApB:*1-:'t-y,&M\r "B&rW:::*R1:::3--:%%%-::X%-:*X%-%&&P:%Qo.::QB+%BEa"oa>91o.%FpW%gZMQ%Y-M9;"jQJ1;Zj-]m*h- '%6-]$p-'u-&q&rWgZJ-c&%`% Q%r Q>;% -]$-U! -U11&t/.+:*::Qo.\H..-8(o.]v!o.0)]v!<-3)/;%BK\RrKR>"\rSR/%FW%jZMQ%i-M9;"aJ1;Z.]+x-' .;-%R ]b^ br]m"br]bT r"&rWjZZ-+"::Q:*R%:%o]bv5bN\r=b>"\r"b/% & ,B:*:%:%o `& ,-\.R\ *b.c)Z:'VHZ-o.&AB&"BR+Bi @*/&B0f ```6./`)RQ`R`lq'+A 3 T `QR`TN(`),` MCT O&niY]v!6.( *q:'%A.(: &BvR ```g./`)lq'8 MW# `TTUg8@+ W&5~.-]"vyb *//`( //z`lq'+ MQTUg@ Bk]bv%rGWj.k&:r-g%pA"Oq(|-Jp]O'N/J/"@V/g%]/:4Mg]r-2cr%~]r8Rkr~ px/\H.v/V(&b&4;gW]m*/,! /]v! /?)Y#/g'&]r-2r&{1@%4/\H.(/D(4/%4/]v!4/(]8%:/(&K 9E&b9EV;gBRB K WXBVqXtWdQ%b/]m*`/8!&6 91r$&"6%91_SQ|/VQ%/&91q`&`PcP& ` ]' V(O(Ap91gWdQ&. d;-&R.&gW]!6 'g'B;)B"HHpW]BvKa%WW) 1mZ;%&x \B-d (=(&j Z:cP:c&:-c7 :c1^e%& Em"V$":|91 ]m* |! ]! |!(&B]"m"#B"2B 912 Z91_91_B&-BX$ ]8%@ ( A"LL%R\ *R (\C+^ g(j(m(p(]"rk-!z&zQ`&!3.B@!&M!"pb&$R'U91&t&!&@?6B:]B)5:5 1&:!]$8!U!'v'EE!-B\?BEW]?$R!(Q&Y!P]rs2agZ-B]"s2kmZ-p4Y&!p%rBu?"B&g!p%B"pBR&!!p%rjpW&!!7@:Y&4!\H.,! (4!]v!4!2(]s#!l'-"S#}#J#M$Y$l'l'W%_%\`-x">(~G'V(k* +?  +Y,x,,E E h,8.y/4/  E b!b!{!-"S#E E E "$%G%E E E \`-F"A(W;-U[]"BY"r0&g!&x"`(l"`#'( %U8N X`I5X'($@:]|" #g(j(C)`(#`P ''(@!uX&D1&,#)B,1,&0#hW.B>13>#eWXQ&{#Q&c#&B!B ::X&[#:'B[!B&"BR*BM]2dBi2&ru]2Bs2 &[]"?B{2r[!u&]22 2191#W["Q&.#X&.#ZR] E ^Q&B#] :#a!B#aW["wQN#tQ&Q#[&[6g': Ng9 ET`N`li)]|"q2gj@6K9ygWyXg&$\`-$G(bQ+YQK%\QS&_Qm&Agp(/9?T]dRAB?L&BX@WX$g:y.R~ag&rgW/$]G+^$g'yX]O'h$y )WylBApyXTb(491_&8$g:yR \B`R BDg&rgWX$yXB,]Bm"B&r8Ayj|$]+($'&8$|$y8$\H.6$y(|$]%>$g'yXlB1ynY$ynM]"vSB!y1ylyXydr$%%\`-r$8(WXXyX\+&&B]Rm"RJ%1y]vR-] TRJ|A&91&&B}]R-R&%91_\/8%)!()X-\"rER"&(#9WU\rYR&WQ&XZ&(woU\rqR"o]RwR#y1&9;9g;XyX91&%&91]rm"R,]2vRE#&91q&'91]rT1R,y,Z;-](91p91rFQc&cPyB a]r-2URrZPWA%Au&q]RvoR]2RwRg|W6&l6&9yW]-+ &R(&]%&g'W&&gAgp:y.)&g&-grqPgW&6&]v!4&<)+g(/F`]d%H&F&W9ygr/A($^&]v!^&,(&-% A%9Eb1-x&]v!+n(]v! +q(1 E.B aFt&>Ba?t&Z&. 9&,B)aBt)&C&B-/`B9a0t7&6&B90`AuwEaut&GK`ANtQ&O&BSD`A5t&Z&Q ]v!`&a(+]v!h&>(A&"_q '(R-! '(S- ]"="r" "k!  &- % "m!m(%;\%;\]m*$'U!,'U%91_&YpWBR]m* 'B"P'qB%U&H&pW]T P'B"'&-Xt/'(*]rver9 &" Rm(`(v'`'' (Ng NQE"8l)]|"'g(j(=)%v6P;gl'3)&l&pBRB::&8q:'l'B&-B*$*';g}]rm"Mr&rE;Au&`q916`'\ ,Q&p',91 t&p'g VQ&',91rhpAp;-&E Q(Q&R(]$( !$(]d$ ((WN( W]m*.( !8( 91&t-" 91&tB([ ]m*H( !&E Z E  W\,.B_]v]Kug&g91&(]m*r(^!|(]v!z(G(K ]m*([!& (]v! (J(K g&91_gQ([Q&5(g91r5g[}]"^5"]^=r]dBCqu &?r?Z;\? ]m*\(a!p(^Q&p(]m*j(^!&p(aW]m*v('E gQ&c)]$)p!c)]v! )P($'g(\Q/)p!p&91_]d$")(WW&,) W Q&:):)% \[Q&O)g91rO]TOgug&[g%91]rTKru;& ]Bo2 \Qrw;]T5]5Kug&@]2 @ 91&@)]v!$)F)\Q/*)g!g%91_p;9E;&"Kc&cPK ,Q&#*]+L)&!#*]v!T)I)\/\)&!(&X-\"ri" (#9{Y\r}){)XZ&(wZ\r""]""#&'91ruG&2!m9;Z&:*]v!8*k()G'91_]+F*m!N*G%91_G91&rZ]!^*G!*G91rZ;--Rr*  ]s#z*g(Z*BRNB5!BO$5*BLY5*BOY5*`(*`!*'(Al "l )]|"+"gjQ&6K%Mr4R]$D*y!J*yW]$P*|!V*|W]+\*j!b*jW]+h*X!n*XWz*]$x*V!&l']$+V!+VWE yQ+|Q+jQ&+UAuj&/1j91&B/L0Au[&81XRQ&A+[AuXM1uV&P1^^& E]B[2REuVm1"va0W!&q+3& !RB Xa91}qX&91qun&1X%91qX'9 1s}rB%W|Q&)+&qd|]m*4+';+g7]Bm"A2D&H1j|nQ&P+M d&E\Qr[2y]Tc2|]Tk2P$Eun%Am,91&rApV91&r C@@m &E %91;}-Q,91(B'@91_'91;}-REsV91r2Aa9;Z;,v@sY&E '91]rm"IBVS]BTSBVZ;--RE]B_BUEy.EU&91]rvsB| %*/K ]$~,U!E U%91_]v! ,)]8%,(K ]v!,/(K ]m*",'&4,^Q&2,]m*0,a!&4, ^Q&E ]+@,s!E ]m*H,'E &E s&91_91_s'91_Z]!f,s!*K &B!B ::X&y,:'BQB&"BR*Bk%@BR&-B-W]$-p!-Xp]r2%R 5Q 91&5-X ]r2;R&DQXx&1W]$J-,!Z-,91&rZQXx,1WX6Blq&r]RBiRguQuq&uQ ]rB{Ry&]RBR| XPy1WX6Blqug&;Q,$&E \Q/$-g!g%91_p;9E;&"8Qc&cPA&rBQ,yQN-|Q&Q-WAup&ZQ ,Q&c-Au&mQ$'"gu &vQ,&Q&-Au,&a,91&'&T+:Au &E 91&E ]v!$.*%} rC25bgjmpZ?.&"^]Gb  '91qS%91q 9;9g;'Tb=q XZ\/l.*Z*SX-\"ryb"\rb \rr bS&pW ;1;Z.;1g[&&.\/&.''&-Xt .XbW{# QB.&J.]d$H.(Wl']m*T.'E  A ueau&E &91qp%;A#,]+z.!&/]+/j!E ]+ /j!&J/&Au&E91&-]"%r!91'-]"Or5r"91q11'vT+91_bW{#j%91_Q&\/j&91_j)9#1|E ]$l/!l'\Q/t/!,BEunqug/qup/quy/qu|/qu/qu /qu&/qu,&ELE &T/]?$ >/(QT/]d$H/(Q&l']$R/ !l'a/Qa/Y@YZE ]d$l/(Q&E ]$v/ !E  &91_%;\2BEuUE5,E ]m* a!. ^Q'. ]m*( ^!'. aW]m*4 'E F/BIu%7rI]2G&'|u'W]BU,'vu&V&BRB::"B&"BR*B 8,]+z !  91rG;,]+ &!'G ]$ ,! ,91r[%Wh,>\B "+ GB %:%B %::A,&-&$'G D]BvMa]TUbr{1G,]T f !(Z;--&P91_] E ,!,W{!J]BTr\r&&XZ\/!*(&(#.]T 0 )!.!)X-!&(w-F]T H!*F!] N!#!E ]="Z!;(k(k('R''m(K ]+h!''!]d$p!(W'|!]+z! !'!]?$!(W' !M&@BRB::'#:'/#!Q'#!MAB&"BR*B $"2P,]m*8!'E : E S&@BRB,Qg!]m*P!B"g!S'"]]v]] eB"Z% AB&"BRXBD]m"u,EdBEug'X BEup!u !u&'Z!V, Q'*" 91r*!Y,&Q'3"\Aup&E$&"E]BC"gEY\BQrM"gg%91qc&cPE Q'r"]$f"!E _A:&:QE ,Q'(",91'r!V,91('B !Y,]$"!E \Q/"!&91q%;-9]1qb,E eBEuG$1r=!u &E'rI]"BG" lqh,]?$R"('W"k]BdB]"a[ @hZ&E  (r-x ]O'|"x"('Tb'891_]d$#(W]m*# !#Z;-Au&En,E > ]?$,#('1#q]B?B72E]m"?2G ]vG2|!G'91qZ;--Rc$"Ea91.E wR\'Bk1z-]"Bq2aw1}-]"vm& *Rm(%*&0`<': O`eET`UTBW O6`OUL QCRCg  ,X`U FSSI4 g ,=ni]="F#*k(k('R\!]s#R#g( (WD &u"f1"E,E R)&B?%RA ;9E;"E]m"BA A9;"E;'BA&3'$11'$&11'pW]$$$A!)$&q9;'"2%@W(#9AT\rCBAA]BKBArK, R("E]B_BeA]rBkBvtAXxv1W]$z$/!$X/]rm" B|$"A|qXt6l'l']8% $(&l']8%($ &B#Q'3$ Auv'<A,/Q'E$Au|'\'@;%r\]Bm"WB|\A,|Q&E ;%&E ]m*l$|!E $E ']="~$**k(;%WK Q' %AuG'QG91(%Q&E $E ]v!g(!*$]Bm"1RG;]RT;RGG'91qZ;--REu&E$"E]vg'Y"]v* *]"vK- (@kPbb/bAb\b\R`RRJ%:cP(7 ({-P]="%%(k(x `(.%'7 9``T%/`)`M D V`O``P # 0 TRL O0THUl9 r'8I3niI)7 ({-hP]="l%0*h%k(;%W}%?}%'7 ?1 b@%:cPx X91'r}]RB RR}]RBbgx]m"#b^xrUgRx]B5bp}]RB=bgR}Q;g'}%3g'r}P+g'r}Q\&d7%}%JZ9%1r}QMZ11_%}%X%91_s%91_&B!B %:%B %::B&"BR+B\brb&&XZ\/(&*(&(#:`\/<&)!:&)X-!& (w-R`\/T&*R&] Z&#!,91(th&\Q/h&,!V%91_%;-Q%91;}-]Rvb3!Z-& RI! ]<r '91q]'m!*)(91_]<Mr'91]p;-]&B]"m"[rB"c\rQrcrB!B&"BRXBU]rvqr6& $R+]v!|'9*5&91_]m*(5!(]T (5!(<,%}I]B!UI}&I&}Q?A5;'7( B9A1&t'?(E]BvIaZ,U%91_]$T(U!I!]v!I!y)]v!b(H*&'"m]vmK% LFB!%}g!B ;\3(1qB%>' e-qB%>4WB91/r',B;(D'/(91'/('t@7AB&"BRgZw(  R/A /(,*'2'Q()@),:[(;@;,e(;@ ,$)'s(/A%}'"|;,zZ')T,wZ')N,N,;En'" &,&@','&@BR1jZB;%r@'7B 1lB&-B%j"0*'"6a`z/`O`CTRD1lt'8TX `SDB#lt '8 S5Ng! l=`nDi&B!m!B 9B:B&"B mZ )`(&)`8)/`)O`eT$N FS YAa8o@]*B:N-pY"2Gp!&BR0*B9&Mvev/*`HE%X RHRTNl!UE' l H`OHI3l)&'B&$&&t]*`(**`(*'n*o@.*'S*'i;]*`(:*`]*/`)XHEX(X  H!RTN`l W U3``T K@go `O4S NSagHi2fRR]s2ublRU]s2b`RX]s2 b*R[]s2bR^aQ]s# .)R(dQ]s#*.$)R(gQ]s#4.B)R(jQ]s#>. )R(mQ]s#H.)R(pQ]s#R.W)R(sQ]s#\.%)R(vQ]s#f.9)R(yQ]s#p.)R(|Q]s#z.u)R(Q]s#/ Note: Lines longer than 256 characters were wrapped