' +JJJJ ?\>m0M='+l> /+l   d]@ŵLҦ]]LF L}BBL] X  ` 鷎귭෍ᷩ췩緈JJJJx Lȿ L8ᷭ緍췩 緍i 8 `巬 췌`x (`(8`I`B` ``>J>J>VU)?`8'x0|&HhHh VY)'&Y)xꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*xS&x'8*3Ixix&& 8  '  & x)*++`FG8`0($ p,&"ųųೳŪŪųųij  !"#$%&'()*+,-./0123456789:;<=>?   1 '" *"( (9"1 ( ,.(0# 2  /#0/#0 *?'#07#00/0/'#07#0:"4<*55/**5/*%5/)1/)1/)1/)'#0/#0*5/*75/**5/*:5//#0/#0'#07#0:::*::'#07#0"):$(%"%:$(%"%$$2%4%$$2%4%$(2()!)E(!8b $!H(+ "@H !D)"E` @ $ C ` DQ &J80^݌Hh ü ü݌ ռ ռ ռA ļD ļ? ļAEDE?HJ>h Լ ռ ռ ռ`HJ>݌h Hh݌`葠葠ȔЖȔЖȠHIHHHHhHH݌hHhHh݌H6 VDP (ED Z $0x8x D- ܸDD# H8`?E Vk *f???0xE Hh D#-EEE8` D ܸx D - ܸx8`-0ݩ?ʥD EEE`   LDcpq` [` ~  LӜu`".Q`pNФbptťܥm2<(-Py0\|e<6e<g< JJJJj귍hI  aUL@ kU8  L  Q^R(jQ0l^l\  wUuW ԧ H h@ [_ /QSIRb_L`LLLL`ª`LQLYLeLXLeLee ўQH\(h0L& Ꝥ$`( R \ZLl8 ўR HH\`\Z[YS6`LxQɿu3'RͲʎRʎ]]]ɍuL͟ɍ}RLRɍg^H8 ^hZLɍR LͲɊRR% QLܤͲ Z@ -^ ş\[Z QY\[Z8`l6Lş_Ȍb_Ͳ] )Y h( ֭ͲLɍ [LLĦ__ ^ 9 LҦ3 9 a   0LjLY u< (_9 ˭ɠuɠK_9 ?LˆʎõĵL õ ĵµ aµ`` L̦µ_bJLuLz`  ȟ QlXJ̥KlV  ȟ QlV eօ3L e3L &RL &QL d L4 Ne)n `@-eff L f`L . tQLѤ LҦL` OPu d L Ne)noon 8ɍ` ^f\õL ^NR  RΩLҦ)\Z ʽ LHv 3h`0h8` [L NС õ`A@` ŵL^Lõ`  \ 濭0 \  ȟ Q ^\lZl^?cqH şch`fhjõĵ@OAP`u@`@&`QR`E Ls  @DAE@u`8` %@ @A@`@`@A`Mµ ) LЦ`8@AWc@8@-@HAȑ@hHȑ@ȑ@hHȑ@Ȋ@ch8&ȑ@Hȑ@Ah@LHȑ@ȑ@ htphso`hMhL`9V8U897T6S67`INILOASAVRUCHAIDELETLOCUNLOCCLOSREAEXEWRITPOSITIOOPEAPPENRENAMCATALOMONOMOPRINMAXFILEFINBSAVBLOABRUVERIF!pppp p p p p`" t""#x"p0p@p@@@p@!y q q p@  LANGUAGE NOT AVAILABLRANGE ERROWRITE PROTECTEEND OF DATFILE NOT FOUNVOLUME MISMATCI/O ERRODISK FULFILE LOCKESYNTAX ERRONO BUFFERS AVAILABLFILE TYPE MISMATCPROGRAM TOO LARGNOT DIRECT COMMANč$3>L[dmx- (  Ϡ@跻~!Wo*9~~~~ɬƬ~_ j ʪHɪH`Lc (L ܫ㵮赎 ɱ^_ J QL_Ls贩紎 DǴҵԵƴѵӵµȴ 7 ַ :ŵƴѵǴҵȴµ納贍﵎ٵ്ᵭⳍڵL^ѵ-I `  4 ò-յ!  8صٵ紭ﵝ 7L (0+BC  7L HH`LgL{0 HH` õL H hBL BH [ h`Lo õ ڬL B ڬ LʬH hB@ յյ [L (ȴ) ȴ 7L L ( L (ȴL{ƴѵ洩ƴǴҵ 7 ^* B0 HȱBh ӵԵ 8 L8 ݲ` ܫ  / / ED B / / ]ƴS0Jȴ ȴ)  紅D贅E B ƴ  / 0L Ν `HD٤DEEhiHLGh ` ŵBѵ-` ѵB-` ܫ XI볩쳢8 DH E𳈈췍Ȍ X0 · JLǵBȵC`,յp` 䯩 R-յյ`յ0` K R-յյ`ɵʵӵԵ` 4 K ( ѵҵLBȱBL8` DBHBH : ַ޵BȭߵBhhӵԵ RBܵmڵ޵ȱBݵm۵ߵ` 䯩LR˵̵ֵ׵`êĪLR E( 8` R` ELRŪƪ`췌 յյI뷭鷭귭ⵍ㵍跬ª 뷰` Lf ݵܵߵ޵ ^`8ܵ i B8` 4L ֵȱB׵ ܯ䵍൭嵍 ` DȑB׵Bֵ  ַ յյ`굎뵎쵬 뵎쵌``õĵBCõĵ`µµ`L õBĵCصص Qƴ0"Bƴ 󮜳` 0۰ϬBƴ8`i#`ЗLw!0>ﵭ` m ﳐ 7i볍 8 ЉLw`H h ݲL~ `浍국䵍뵩嵠Jm赍嵊mjnnn浈ۭm浍浭m䵍䵩m嵍`"L ŵ8ŵH ~(` i d ֠z# u`#"^"NOW PRINT POINTER COUTUNDERNEATH THE ERROR ; ; ASMSTARTBELLGIVE A BELL $ASM2 #"!"SET UP "!" AS PROMPT PROMPT GETLNZGET LINE WITH "!" ZMODESET MODE TO 0 INGET FIRST CHARACTER #" "A SPACE, CONTINUATION OF >8ASSEMBIDENTICAL, ASSEMBLE BYTES '^7 A1HELSE TRY ANOTHER COMMAND FINDAND LOOP A5LMOVE OUR FORMAT UP YSAV1DECREMENT YSAV1 FINDAND LOOP ; ERROR YSAVELSE GET Y BACK $ERROR2 TRANSFER OFFSET TO X-REG  PRBL2PRINT MANY BLANKS  A4LSAME AS OUR ONE? >7NO, TRY ANOTHER !MNEML,XOK, CHECK 2ND BYTE TOO A4HSAME? >7NO, TRY ANOTHER A5LGET OUR CMD FORMAT FORMATGET REAL FORMAT #$9DIS IT RELATIVE? RELYES, SUBTRACT ADDRESSES FORMATCOMPARE FORMATS IDNMODEYES, GET MODE #$00SET Y TO 0 YSAVDEC Y POSN BL1DO MONITOR COMMAND ASM2AND RETURN TO ASSEMBLER ; ; %FIND A1HGET INSTRUCTION OPCODE "INSDS2+2CALC FORMAT OF COMMAND PUT MNEM OFFSET INTO X-REG MNEMR,XGET A KNOWN COMMAND YSAVGET Y BACK )MONP GETNUMPARSE ADDRES INTO A2L,H YSAVSAVE Y FOR MONITOR #$17CHECK IF COMMAND AFTER ^6 THE ADDRESS IS LEGAL ASMSTARTNO, RETURN TO ASM CHRTBL,YVALID? <6NO, LOOP #$15IS IT A ????? <5NO, LOOP  A2L-1,YAND SAVE INTO MEMORY (PCL),Y  <4 UPMOVE UP TWO LINES UP #INSTDSPDISASSEMBLE THE NEW LINE PCADJMOVE THE PC FORWARD PCHAND STORE IT IN PCL,H PCL ASM2NOW GET NEXT COMMAND ; $^5 TOSUBSET UP JUMP ADDRESS IS 0 DECREMENT BOTH ^1 AND SUBTRACT THE PC LO BYTE PCL A2LSTORE THE NEW VALUE >2IS NEGATIVE SUBTRACT THE PC HI BYTE ^2 PCH #ERROR4 ERRORIF NOT ZERO, ERROR +IDN LENGTHGET LEN OF OPCODE ADDRESS '^4 ETNUM $FFA7 TOSUB $FFBE ZMODE $FFC7 CHRTBL $FFCC ; ;  $817  $817 ; START ASMSTART ; %REL #$81RELATIVE, IS IT >$80? CHECK IF CARRY IS CLEAR ERROR4YES, ERROR A2HGET CMD ADDRESS A2LINTO X,Y >1IF LO BYTEIN $200 INSDS2 $F88C INSTDSP $F8D0 PRBL2 $F94A PCADJ $F953 CHAR1 $F9B4 CHAR2 $F9BA MNEML $F9C0 MNEMR $FA00 UP $FC1A GETLNZ $FD67 COUT $FDED BL1 $FE00 A1PCLP $FE78 BELL $FF3A G1MONITOR MODE PROMPT $33INPUT PROMPT YSAV $34Y STORE YSAV1 $35X STORE PCL $3APC ADDRESS PCH $3B A1H $3DCOUNTER A2L $3E A2H $3F A4L $42 A4H $43 A5L $44 ; ; ;MONITOR ROUTINES ; 5************* * * * XINU * * OPERATING * * SYSTEM * * * * MINI * * ASSEMBLER * * * ************* ; ; ;ZERO PAGE (MONITOR) USE ; FORMAT $2ECMD FORMAT LENGTH $2FBYTES IN CMD MODE $3      YǍ~<>!=?<>=??Ǎ~ 9 `Ǎ~ LǍ~ Lb R ProDOS ; ; ;  #$20 ^2 CMDS,YMOVE COMMANDS $300,Y  <2 AND RETURN ; ; CMDS #$02USE DOS 3.3 PBANK3 SBANK3 SETKBD SETVID DOSWRMAND ENTER DOS 3.3 ; #$03USE ProDOS PBANK3 SBANK3 SETKBD SETVID RESETAND ENTEEMORY SBANK3 #$00 A1L A2L #$21SOURCE ADDRESS A1H #$96 A2HDEST. ADDRESS ^1 (A1L),Y (A2L),YCOPY BYTES  <1 A1HMOVE UP A PAGE A2H A2HFINISHED? #$C0 <1NO, LOOP #$03REMOVE MEM PBANK3 SBANK3 NK3 $C7BASIC MEM PTR $SBANK3 $C07EHARDWARE MEM SWITCH ; DOSWRM $9DBFDOS 3.3 ENTRY RESET $FA62RESET ROUTINE ; SETKBD $FE89SET UP KEYBD SETVID $FE93SET UP VIDEO ; ; ;  $2000  $800 ; ; MOVEDOS #$02 PBANK3SET UP M************** * * * DOS3.3 * * * * ALLOWS DOS * * TO BE USED * * FROM * * PRODOS * * * ************** ; ; A1L $3CMONITOR PTRS A1H A1L+1 A2L A1L+2 A2H A2L+1 ; PBA $04 ; ; ; ;RWTS ERROR CODES ; NOERR $00 INITERR $08 WRITERR $10 VOLERR $20 DVERR $40 READERR $80 ; ; ; ;MISCELLANEOUS ; NUMTRACK $2335 TRACKS MAX ; ; ;  TRACK SEEKS $04F8NUMBER OF SEEKS "RETRYS $0578NUMBER OF RETRIES SLOT2 $05F8SLOT NO. STORE SLOT $0678SLOT NO. STORE !RECAL $06F8NUMBER OF RECALS ; ; ; ;RWTS COMMANDS ; CNULL $00 CREAD $01 CWRITE $03 CFORMAT $C08ADRIVE 1 ON DRV2 $C08BDRIVE 2 ON "Q6L $C08CSTROBE DATA LATCH Q6H $C08DLOAD DATA LATCH (Q7L $C08EPREPARE LATCH FOR INPUT )Q7H $C08FPREPARE LATCH FOR OUTPUT ; ; ; ;ABSOLUTE ADDRESSES ; CURTRK $0478CURRENTSTEPPER 0 ON P1OFF $C082STEPPER 1 OFF P1ON $C083STEPPER 1 ON P2OFF $C084STEPPER 2 OFF P2ON $C085STEPPER 2 ON P3OFF $C086STEPPER3 OFF P3ON $C087STEPPER 3 ON MOTOFF $C088MOTOR OFF MOTON $C089MOTOR ON DRV1 B $BA11ARM DELAY TABLE &WTABLE $BA29WRITE TRANSLATE TABLE %READTABL $BA96READ TRANSLATE TABLE RTABLE READTABL-$96 *ILEAV $BFB8SECTOR INTERLEAVING TABLE ; ; ; ; ;HARDWARE ADDRESSES ; P0OFF $C080STEPPER 0 OFF P0ON $C081SSLIST+1SCT IN VTSLIST #VTSTRK VTSLIST+2DRV IN VTSLIST #VTSVOL VTSLIST+3VOL IN VTSLIST ; ; ;BUFFERS ; ONEBUF $BB00PRIMARY BUFFER !TWOBUF $BC00SECONDARY BUFFER &INITMAP $BFA8INIT MAP USED IN INIT ; ; ; ;TRANSLATE TABLES ; DLYTAPADRESS CHECKSUM COUNT CHKSUMBYTE COUNTER TEMP1 CHKSUMTEMP STORAGE TEMP2 SLOTMPTEMP STORAGE TEMP3 MTC1TEMP STORAGE TEMP4 MTC2TEMP STORAGE %MASK1 UBUFMASK USED BY WRITEADR #ADRSCT UBUF+1SCT # IN WRITEADR #VTSSCT VT $3EUSER BUFFER POINTER %ADRVOL $41VOL # USED BY WRITEADR %ADRTRK $44TRK # USED BY WRITEADR #SYNCNO $45SYNC NO USED IN INIT !MTC1 $46MOTOR TIME COUNT 1 !MTC2 $47MOTOR TIME COUNT 2 IOB $48IOB POINTER ; !ADRSUM SLOTM; CHKSUM $26CHECKSUM STORE "SLOTMP $27TEMP SLOT NO. STORE NEWTRK $2ANEW TRACK NUMBER "SLOTMP2 $2BTEMP SLOT NO. STORE VTSLIST $2CVOL/TRK/SCT LIST DRIVE $35DRIVE NO. IOBLIST $36ZPG IOB DATA LIST DCT $3CDCT POINTER "UBUF  ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * RWTS * * CONFIGURATION * * * ****************** ; ; ; ;ZERO PAGE USAGE      ; ; FOUROWS #$00RESET Y TO 0 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN DONEYES, EXIT YLOW,XNO, SET UP NEW BASEROW BASE YHIGH,X BASE+1 #$00RESET Y TO 0 SCT VERIFYVERIFY OTHER SECTORS ADRTRKTRACK 0? >1NO, SKIP SYNCNODO THINGS TO SYNCNO #$10 RTS2 SYNCNO SYNCNO ^1 SET NO ERROR AND RETURN ; ; ; A "TRKWRITEGOOD, WRITE NEXT TRACK ^3 RETRYSONE LESS RETRY <2TRY AGAIN GIVE UP, SYSERR RTS2 AND RETURN ; ; ; $MAP VTSSCTGET SECTOR TO MARK INITMAP,Y <1ALREADY MARKED, ERROR #$FFMARK WITH FF INITMAP,Y ADRR >1ERROR SKIP !J READNOW READ THE DATA MAPOK, MARK ON MAP ^1 RETRYSONE LESS RETRY VERIFYTRY AGAIN !^2 RDADRTRY HEADER AGAIN >3ERROR, SKIP VTSSCTCHECK IT IS #$0FSECTOR F >3NO, ERROR READOK, READ DATERROR, TRY AGAIN VTSSCTGET SECTOR JSCT 0, READ DATA #$10IF THE SYNC >=16 SYNCNO SYNCNOTHE DEC IT BY 2 #$01ELSE DEC BY 1 SYNCNO #$05IF >=5, TRY AGAIN >2 ELSE SET SYSERR AND RETURN ; ; ; VERIFY RDADRREAD HEADESECTORS? <1NO, LOOP BACK #$0FFILL INIT MAP WITH ADRSCTBYTES INDICATING TRACK #$30NOT VERIFIED RETRYS ^3 INITMAP,Y  <3 SYNCNO ^4 RTS2DELAY RTS2 RTS2     <4 RDADRREAD ADDRESS HEADER >2OR 0 ADRSCTABD FIRST WRITE #$80128 SELF-SYNC BYTES >2KEEP GOING ^1 SYNCNO $^2 WRITEADRWRITE ADR HEADER RTS2IF ERROR, EXIT WRITE16NOW WRITE DATA RTS2IF ERROR, EXIT ADRSCTMOVE UP A SECTOR ADRSCT #$10DONE 16 ADRTRKTO NEXT TRACK #NUMTRACKENOUGH TRACKS? <3NO, DO MORE SET NO ERRORS >6AND EXIT ^5 #$0DSAVE ERROR CODE (IOB),YIN IOB SET SYSERR "^6 MOTOFF,XTURN MOTOR OFF AND RETURN ; ; #TRKWRITE#$00START WITH SECT48 ^4 SET ERROR RETRYSONE LESS RETRY >5CANT READ, GIVE UP RDADRFIND ADDRESS HEADER <4CANT FIND, TRY AGAIN VTSSCTIS IT SECTOR 0? <4NO, TRY AGAIN READOK, READ THE SECTOR <4COULDNT, TRY AGAIN ADRTRKREAD OK, MOVE UP ONEBUF,Y  <2 #$50 SETTRK #$28SET NO. OF SELF-SYNC SYNCNOBYTES TO 40 &^3 ADRTRKRECALIBRATE THE HEAD MYSEEK TRKWRITEWRITE THE TRACK #$08 >5ERROR, SKIP !#$30NOW VERIFY THE 1ST SECTOR RETRYSSET RETRIES TO URTRK,Y ^2 ; ; ; INIT #$03GET THE VOLUME (IOB),YTO INIT WITH ADRVOLSTORE IT #$AASET UP MASK MASK1IN ZPG #$56NOW CLEAR "#$00BOTH PRIM & 2NDARY BUFFERS ADRTRKSTART ON TRACK 0 ^1 TWOBUF-1,Y  <1 ^2 E >2 SEEKS,Y >3 ^2 CURTRK,Y ^3 SEEKABS ; ; ; XTOY DIVIDE X BY 16     AND PUT INTO Y-REG  ; ; ; SETTRK #$02 (IOB),Y  DRIVE XTOY   DRIVE >1 SEEKS,Y >2 ^1 CONENO ERRORS #WRITERRELSE SET WRITE HNDLERRERROR, RETURN ; ; ; MYSEEK #$01 (DCT),Y   MYSEEK2  MYSEEK2 CURTRK  ; MYSEEK2 NEWTRK XTOY CURTRK,Y DRIVE >1 SEEKS,Y ^1 CURTRK NEWTRK DRIV ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * RWTS LISTING 4 * * * ****************** ; ; ; #WRITE WRITE16WRITE THE SECTOR ALLD    ,Y MOTOFF,XTURN MOTOR OFF AND RETURN ; ; ; ; ; ; ? DISPLAYNO FINE+1DEC DELAY ; DISPLAY BYTEGET SEVEN BITS CLEAR THE COLOR BIT #$7FALL BITS ON? >3YES, IGNORE, IS NOISE! (BASE),YADD BITS ALREADY (BASE),YON THE SCREEN ^3 #$28END OF ROW? GETBYTNO, LOOP BACK SAVE IF ERROR OR NOT IERROR, LOOP  #$00NO ERROR, SET CHECKSUM=0 CHKSUM POSTNIBLPOSTNIBBLE THE DATA SLOT2GET THE SLOT ALLDONE SET NO ERRORS  24SKIP THE SEC BYTE HNDLERR SET SYSERR #$0DRETURN ERROR CONDITION (IOB)IP #VOLERRNO, SET VOL ERROR <1BRANCH BACK TO DRVERR ; ; $CRCTVOL #$05NOW CHECK THE SECTOR (IOB),Y CONVERT TO A PHYSICAL ILEAV,YSECTOR VIA A TABLE VTSSCTSAME SECTOR? I GET OPERATION WRITEWRITE, SKIP READREAD SECTORFINISHED, EXIT ; FORMDISKINITFORMAT THE DISK ; ; ; RTTRK #$03 (IOB),YGET THE VOL WE WANTED  !VTSVOLFIRST SAVE VOL WE FOUND #$0E (IOB),Y GET OUR VOL BACK CRCTVOLVOL 0 ALWAYS OK VTSVOLVOLS THE SAME? CRCTVOLYES, SKCURTRKGET TRACK   SETTRKSET UP TACK WE FOUND  SEEKSONE LESS SEEK <4MORE, LOOP <3ELSE DO A RECAL ; DRVERR RESTORE STACK #DVERRSET A DRIVE ERROR ^1 RESTORE THE STACK HNDLERRAND RETURN ; !DONE ALLDONEOR, GIVE UP #$04SET SEEKS BACK TO 4 SEEKS #$00 MYSEEKRECAL HEAD TO TK0 GET CURRENT TRACK $^4 MYSEEKAND MOVE HEAD BACK <1AND TRY AGAIN ; ; ; )RDRIGHT VTSTRKLOAD THE TRACK WE FOUND CURTRKSAME TRACK? RTTRKYES, SKIP SLOT2GET SLOT NO. RDADRFIND THE ADDRESS HEADER RDRIGHTOK, SKIP I RETRYSTRY AGAIN <2UP TO 48 TIMES $^3 CURTRKWE NOW RECALIBRATE THE HEAD #$60 SETTRKSET UP THE TRACK NO. RECALONE LESS RECAL TO DO DRVERRERRTRYTRK #$0C (IOB),YGET COMMAND DONENULL, EXIT #CFORMATFORMAT? FORMDISKYES, DO IT EITHER READ OR WRITE SAVE THIS (CARRY=READ) >1READ, SKIP !PRENIBBLPUT DATA INTO BUFFERS ^1 #$30SET RETRIES TO RETRYS48 ^2 E ARMDLY  E SLOT2SET THE SLOT IN X F #$04 (IOB),YGET THE TRACK WE WANT MYSEEKMOVE ARM TO IT DRIVE ON? TRYTRKYES, SKIP TEMP4ANOTHER DELAY TRYTRK G #$12 H H TEMP3 G TEMP4 G #$00SET IT TO DRIVE-OFF AND SAVE ^7 DRIVE 1 OR 2? >8DRIVE 2, SKIP DRV1,XENGAGE DRIVE 1 >9 ^8 DRV2,XENGAGE DRIVE 2 &^9 DRIVESAVE DRIVE IN TOP BIT GET DRIVE TEST  FDRIVE ON, SKIP #$07OFF, DO A DELAY ATA TO ZPG IOBLIST,YFOR FURTHER USE  #$0ADONE? <6NOT YET #$03SET UP MTC2 (DCT),YWITH DATA FROM MTC2THE IOB #$02 (IOB),YDRIVE THE SAME? #$10 (IOB),Y >7YES, SKIP (IOB),YNO, SAVE NEW DRIVE # GET DRIVE TEST BITS RTS1 RETURN TO CALLER ; ;  ~DLYLOOP BACK SEVERAL TIMES <1 ELSE RETURN ; GETBYT #$07GET SEVEN BITS ^2 TAPEINGET INPUT SHIFT IT INTO CARRY BYTEAND BACK INTO THE BYTE  RTS1GOT 7BITS, RETURN #$0EDELAY SEVERAL BLANKS SWAIT <2AND GET MORE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; DONE FINISHED ; ; SWAIT DLYSAVE DELAY %^1 HBLNKDELAY WHILE BLANKING <1 #^2 HBLNKAND WHILE SCANNING <2 37;? $(,048< $(,048"&*.26:>#'+/37;?#'+/37;? $(,048< $(,048"&*.26:>#'+/37;?#'+/37;?((((((((((((((((((((((((((((((((PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP $(,048< $(,048"&*.26:>#'+/37;?#'+/ AND WAIT FOR NEW ^4 Q6L,XDRIVE TO START     SLOT2SAVE SLOT NO. DOWN Q6L,XDRIVE GOING? >5YES, SKIP  <4NO, LOOP BACK ^5 SAVE DRIVE-ON TEST MOTON,XTURN MOTOR ON ANYWAY #$06 '^6 (IOB),YCOPY IOB D SLOT INTO X-REG PUT NEW SLOT INTO IOB'S OLD SLOT (IOB),Y Q7L,XSET UP DISK INPUT ^1 #$08 Q6L,XWAIT FOR OLD DRIVE ^2 Q6L,XTO STOP <1  <2 GET NEW SLOT  !SAMESLOTQ7L,XSET UP DISK READ Q6L,X #$08 IOBSTORE IOB POINTER IOB+1 #$02SET RECALS TO 1 RECAL #$04AND SEEKS TO 4 SEEKS #$01 (IOB),YGET THE SLOT INTO X-REG #$0F (IOB),YSAME AS OLD SLOT? SAMESLOTYES, SKIP PUSH NEW SLOT ONTO STACK (IOB),YGET OLD4****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * RWTS LISTING 3 * * * ****************** ; ; ;  $21GAP, RWTS ORG'S AT $BD00 ; RWTS  E BACK    #$AAREMOVE OTHER BITS  RITEDBL2   Q6H,XWRITE BYTE OUT Q6L,X AND RETURN ; ; ; RITEDBL2 #$AA RITEDBL2 #$EB RITEDBL2 NOERR2 SET NO ERRORS $ERR2 Q7L,XSET DRIVE FOR INPUT Q6L,X RTS1 AND RETURN ; ; ; RITEDBL SAVE BYTE SHIFT LEFT MASK1REMOVE BITS Q6H,X Q6L,XAND WRITE IT GET BYTDRSCTAND NOW SECTOR RITEDBL ADRVOLNOW CALC CHECKSUM ADRTRK ADRSCT SAVE IT SHIFT IT LEFT MASK1TURN OFF OTHER BITS Q6H,X Q6L,XWRITE IT OUT GET CHECKSUM #$AATURN OFF BITS RITEDBL2-1AND OUTPUT IT #$DENOW EPILOG 1 Q6H,X Q6L,XOUTPUT ANOTHER  DO SEVERAL TIMES <1 #$D5NOW ADDRESS HEADER RITEDBL2WRITE A D5 #$AA RITEDBL2WRITE AN AA #$96 RITEDBL2WRITE A 96 ADRVOLNOW WRITE VOLUME RITEDBL ADRTRKAND TRACK NO. RITEDBL A #$01 ARMDLY  ; ; ; " $245SPACE FOR TABLES & BUFFERS ; WRITEADRSET SYSERR !Q6H,XIS DISK WRITE PROTECTED? Q7L,X ERR2YES,ERROR #$FFOUTPUT A SELF-SYNC BYTE Q7H,X Q6L,XWRITE BYTE   ^1 RTS1WASTE TIME RTSTEMP2  SEEKABS2+3 DLYTAB+$C,Y ARMDLY COUNT <1 ^6 ARMDLY  SEEKABS2CURTRK #$03  SLOTMP2  P0OFF,X SLOTMP2 ^7 ; ; ;  #$A0 ARMDLY #$11 ^2 <2 MTC1 >3 MTC2 ^3 NT COUNTTO ZERO %^1 CURTRKAND PUT CURRENT TRK TEMP2INTO ZPG  NEWTRK >6 >2 #$FF CURTRK >3 ^2 #$FE CURTRK ^3 COUNT >4 COUNT ^4 #$0C >5  ^5 SEEKABS2 DLYTAB,Y ARMDLY RR1NO, SYSERR  D Q6L,X D #$AAAN AA? ERR1NO, SYSERR NOERR1 OK, SET NO ERRORS AND RETURN ; ; ; !SEEKABS SLOTMP2STORE SLOT NO. NEWTRKSTORE NEW TRACK CURTRKSAME AS OLD TRACK? >7YES, RETURN #$00ELSE SET COU Q6L,XGET 2ND HALF OF V/T/S <8 TEMP1AND IT WITH TEMP1 VTSLIST,YSTORE INTO VTS LIST ADRSUMUPDATE CHECKSUM MOVE DOWN LIST <6 TRANSFER CHECKSUM TO Y ERR1<>0, SYSERR !^9 Q6L,XNOW CHECK EPILOG <9 #$DE DE? E ,R`0`` f   L&Ɉ5LUɕ5J(пЯ,0L`|   L``Ů OFFSET TO 3 ^5 Q6L,XGET A BYTE <5 #$96END OF ADDRESS FIELD? <3NO, START AGAIN #$00SET ADDRESS CHECKSUM ^6 ADRSUMTO ZERO (^7 Q6L,XGET HALF OF VOL/TRK/SCT <7 ROLL IT LEFT AND TEMP1STORE IT TEMPORARILY &^8 NT ^1 ADD 1 TO Y >2OK, SKIP COUNTADD 1 TO RETRYS ERR1TOO MANY, SET SYSERR ^2 Q6L,XGET A BYTE <2 ^3 #$D5A D5? <1NO, RETRY  ^4 Q6L,XGET ANOTHER <4 #$AAAN AA? <3NO, TRY A D5 #$03SET Y AS| ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * RWTS LISTING 2 * * * ****************** ; ; ; $RDADR #$FCSET NO. RETRY'S TO 4 COU     Q6L,X C #$AAAN AA? NOERR1OK, SET NO ERROR ERR1 SET SYSERR AND RETURN ; ; ; ABLE,YCONVERT COUNTGET COUNT BACK ONEBUF,YSTORE IN PRIM BUFFER  <8DO 256 BYTES "A Q6L,XGET CHECKSUM BYTE A RTABLE,YIS IT ZERO? ERR1 !B Q6L,XGET EPILOG BYTES B #$DEA DE? ERR1NO, SET SYSERR  C 6 DEC Y COUNTSTORE COUNT ^7 Q6L,XGET A BYTE <7 RTABLE,YCONVERT TO OUR FORM COUNTGET BACK COUNT "TWOBUF,YSTORE IN 2NDARY BUFFER <6DO MORE BYTES ^8 COUNTSTORE COUNT=0 ^9 Q6L,XGET A NEW BYTE <9 RTM DISK <2 ^3 #$D5A D5? <1NO, LOOP  ^4 Q6L,XGET A BYTE <4 #$AAAN AA? <3NO, CHECK A D5 #$56SET NO. BYTES TO READ ^5 Q6L,XGET A BYTE <5 #$ADIS IT AN AD? <3NO, TRY A D5 #$00SET CHECKSUM TO 0 ^G TWOBUF,XSAME WITH BIT0  "(UBUF),YPUT BYTE IN USER BUFFR  COUNTDONE ALL THE BYTES? <2NO, LOOP ELSE RETURN ; ; ; #READ #$20SET RETRY'S TO #$20 ^1 DEC Y ERR1IF 0, CANT FIND, EXIT %^2 Q6L,XGET A BYTE FRO '; TO 256 8-BIT BYTES, INTO THE PRIMARY ; AND 2NDARY BUFFERS ; ; POSTNIBL#$00SET Y TO 0 ^1 #$56AND X TO #$56 ^2 <1IF DONE #$56, LOOP BACK $ONEBUF,YGET 6 BITS FROM PRIM BUF TWOBUF,XGET BIT1 IN CARRY AND INTO THE A-RE A COARSE DELAY WAIT FINE #$07DO A FINE DELAY WAIT <2AND GET MORE BITS ; KEY KYBDA KEY PRESSED? DISPLAYNO, SKIP KBDSTRBTURN IT OFF #$88<-- ? >2NO FINE+1YES, INC DELAY DISPLAYAND CONTINUE ^2 #$95--> ; !SYNC TAPEINSYNC BY GETTING SYNCA LO SIGNAL &^1 TAPEINAND THEN A LO SIGNAL <1 ; ; GETBYT #$07GET SEVEN BITS ^2 TAPEINGET INPUT SHIFT IT INTO CARRY BYTEAND BACK INTO THE BYTE  KEYGOT 7, EXIT #$18DONE ; ; ;  $1A00  $800 ; ; FAXER HGR1CLEAR SCREEN $C052TURN ON FULL GRAFIX #$00SET UP ROW BASE #$00SET Y-REG TO 0 TOO ROWAND ROW NUMBER YLOW,X BASE YHIGH,X BASE+1 ; ; $STARTROW#$04COMPRESS 4 ROWS TO 1 COUNTTE BASE $FEROW ADDRESS YLOW $1B00ROW BASE LSB YHIGH $1BC0ROW BASE MSB ; KYBD $C000KEYBOARD KBDSTRB $C010STROBE SPKR $C030SPEAKER TAPEIN $C060TAPE INPUT HGR1 $F3E2CLEAR HGR1 SCRN WAIT $FCA8WAIT ROUTIP************* * * * FAXER * * * * FACSIMILE * * DECODER * * * * BY * * W.TOOMEY! * * * ************* ; ; COUNT $FBNO OF ROWS TO OR ROW $FCROW NUMBER BYTE $FDINPUT BY     FOR INPUT ^5 Q6L,X AND RETURN ; ; ; (;WRITEBYTE: WRITES A 'BYTE' AT 32 CYCLE ; INTERVALS ; ; RITEBYTECLEAR CARRY WASTE TIME  RITEBYT2Q6H,XWRITE BYTE Q6L,X AND RETURN ; ; ; (;POSTNIBBLE: CONVERTS 342 6-BIT NIBBLES$WTABLE,XGET WRITE-TRANSLATE BYTE SLOTMPGET BACK SLOT NO. RITEBYT2OUTPUT CHECKSUM #$DENOW OUTPUT DATA EPILOG RITEBYTEFIRST #$DE #$AA RITEBYTETHEN #$AA #$EB RITEBYTEAND #$EB #$FFAND #$FF RITEBYTE Q7L,XSET DRIVE UP CHECKSUM  )^4 ONEBUF,YEOR IT WITH PRIM DATA USE AS OFFSET INTO THE WTABLE,XWRITE-TRANSLATE BYTE SLOTGET SLOT NO. BACK Q6H,X Q6L,XWRITE BYTE OUT ONEBUF,YGET NEXT BYTE  <4AND BRANCH BACK A-REG NOW HOLDS CHECKSUM TWOBUF,YGET A DATA BYTE -^3 TWOBUF-1,YCHECKSUM WITH NEXT BYTE USE AS OFFSET INTO !WTABLE,XWRITE-TRANSLATE TABLE SLOTMPGET SLOT NO. BACK Q6H,X Q6L,XWRITE BYTE TO DISK DEC Y <2BRANCH IF NOT FINISHED CHKSUMGET BACKF'S ^1  RITEBYTE+1WRITE THE #$FF DEC Y <1LOOP BACK #$D5OUTPUT DATA HEADER RITEBYTEFIRST A #$D5 #$AA RITEBYTETHEN AN #$AA #$AD RITEBYTEAND A #$96 SET A=#$00 #$56Y=#$56 >3AND SKIP AN INSTRUCTION #^2 LY SLOTAND IN SLOT TOO! !Q6H,XIS DISK WRITE PROTECTED? Q7L,X >5YES, ERROR TWOBUFSTART CHECKSUM WITH CHKSUMNIBL1 IN 2NDARY BUFR #$FFWRITE A SELF-SYNC BYTE Q7H,X Q6L,XWRITE BYTE  TIME DELAY  #$04WRITE 4 MORE #$FRE BITS 6&7 IN THE #$3F2NDARY BUFFER ARE OFF $TWOBUF,X(WE KNOW BITS 6&7 IN THE PRIM BUFFER ARE OFF) <2 AND RETURN ; ; ; %;WRITE16: WRITE PRENIBBLED DATA FROM ; BUFFERS TO DISK ; ; WRITE16 SET SYSERR SLOTMPSAVE SLOT TEMPORARIH BIT1 TWOBUF,X *ONEBUF,YSTORE 6 BITS LEFT IN PRIM BUFR DO NEXT BYTE #$56DONE ENOUGH BYTES? <1NO, DO ANOTHER #$00YES, SET X BACK TO 0 IN CASE WE NEED TO <1BRANCH BACK IF Y<>0 #$55NOW SET X TO #$55 *^2 TWOBUF,XENSUS 256 8-BIT BYTES %; TO 342 6-BIT 'NIBBLES' OF THE FORM ; 00XXXXXX ; ; PRENIBBL#$00SET X TO 0 #$02AND Y TO 2 ^1 DECREMENT Y (UBUF),YGET INPUT BYTE SHIFT BIT0 INTO CARRY 'TWOBUF,XPLACE BIT0 INTO 2NDARY BUFR DO THE SAME WITd****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * RWTS LISTING 1 * * * ****************** ; ; ;  $B800  $800 ; ; %;PRENIBBLE: CONVERT          v ,R``0` &ȑ eL  L0`` |@@@@ԩ@@z'@7@}0L/α Lz@P`p#ˠ͠ōLˠ͠ōL?@ALH0L HL,HȽZ%HG}FH>ȱH?,($8}`LIF}>ة}>}F }@?>>??>Ȋ>? }@0@4@  *ATINRAIS*LIFT*WEIGSTEP*WALKWAIT Royal palace Persian city Persian city Persian city*I am at a Persian bay*I am on a large ship*I'm on a sandy beach dense jungle dense jungle damp cave crow's-nest*I'm on a small island*I'm on a small islanTEAFILLGIVEDROP*LOWE*PUT*THROEXAM*STUD*LOOK*SEE*WATCSAIL*NAVIPUSH*SHOV*MOVE*SHAKOPEN*UNLOLIGH*IGNI*BURNBREA*DEST*SMASATTA*KILLEMPTPOUR*SPILUNTIUNLIREADSLEEWEARREMODRINHELPSAY*SCRE*YELL*HOLLQUITINVEJUMPPRAYTIETOBUY*PURCONET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; DONE FINISHED ; ; SWAIT DLYSAVE DELAY %^1 HBLNKDELAY WHILE BLANKING <1 #^2 HBLNKAND WHILE SCANNING <2 DLYLOOP BACK SEVERAL TIMES <1 ELSE RETURN #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN DONEYES, EXIT YLOW,XNO, SET UP NEW BASEROW BASE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESELSE RETURN ; ;  O CARRY BYTEAND BACK INTO THE BYTE  RTS1GOT 7BITS, RETURN #$0EDELAY SEVERAL BLANKS SWAIT <2AND GET MORE BITS RTS1 RETURN TO CALLER ; ;  ^1 KYBDWAIT FOR ANOTHER <1 KBDSTRBTURN IT OFF ; NEXTSCN ENTRY2JUST LOOP BACK ; ; SWAIT DLYSAVE DELAY %^1 HBLNKDELAY WHILE BLANKING <1 #^2 HBLNKAND WHILE SCANNING <2 DLYLOOP BACK SEVERAL TIMES <1 ,YON THE SCREEN ROWMOVE DOWN A ROW ROW #$C0DONE? ENDSCRNYES YLOW,XELSE SET UP BASE BASE YHIGH,X BASE+1 #$01DO A DELAY SWAIT STARTAND LOOP BACK ; ; ENDSCRN KYBDA KEYPRESS NEXTSCNNO KBDSTRBYES, TURN OFF G PULSE ^2 TAPEIN <2 ; ; START #$00SET OFFSET TO 0 BYTE TAPEINGET INPUT SHIFT INTO CARRY BYTEAND INTO OFFSET #$00NOW CLEAR OLD INFO  (BASE),Y  (BASE),YDONE BYTEUSE OFFSET #$01TO PUT A BIT (BASE)EN ; ; ;  $1A00  $800 ; ; OSCIL1 HGR1CLEAR THE SCREEN $C052TURN ON FULL GRAFIX ENTRY2 #$00SET UP ROW BASE BYTESET UP OFFSET ROWAND ROW NUMBER YLOW,X BASE YHIGH,X BASE+1 !^1 TAPEINSYNC WITH A LOW <1GOINBASE $FEROW ADDRESS YLOW $1B00ROW BASE LSB YHIGH $1BC0ROW BASE MSB ; KYBD $C000KEYBOARD KBDSTRB $C010STROBE SPKR $C030SPEAKER TAPEIN $C060TAPE INPUT #HBLNK $C1C2HORZ. BLANKING SIG HGR1 $F3E2CLEAR SCRE************* * * * FAXER * * * * FACSIMILE * * DECODER * * * * BY * * W.TOOMEY! * * * ************* ; ; DLY $FBDELAY COUNTER ROW $FCROW NUMBER BYTE $FDINPUT BYTE      01DEFAULT 31K DRIVE ; LTABL B1B3"13" DIGITS RTABL B5B1"51" DIGITS ; ; ;  RWPTCH 4C009BEAEA ; "SIZE 01DEFAULT 15K RAMDRIVE BANKNO 02DEFAULT BANK2=AUX ; LTABL B1B1"11" RTABL B3B5"35" ; ; ;  "35" ; ; ;  "K RAM DRIVE"  8D00 ; ; ; RWPTCH RAMDRIVERWTS PATCH   ; SIZE IRECTORY SECTOR )THIRTY 1101START OF DISK ALLOCATION? THFOUR 2310DISK T/S LIMITS !SEVNCEE 1FFETRACK $11 BIT MAP TWELVE FFFFTK 12 MAP )EHTEE FFFFBIT MAPS FOR TK $12,13,14 ; ; ; MESG 8D8D87B3B1  "K RAM DRIVE"  8D00 ; ; ;CHAR >5IF 0, END COUTPRINT IT OUT  <4AND LOOP ^5 FPDONE, DO AN FP ; ; ; "CHKTRK 00000000000000TRKS 0-6  0000000000000007-13  0000006050407014-20  0000000000000021-27  0000000000000028-34 ; ; ; ONE 110FDXITEXIT THRU FM $^7 #$00SET THE ABOVE BRANCH !SELFMOD+1TO POINT TO INITEXIT BUFNOSET MAXFILES TO 2 ; ; ; PRNTMSG SIZEPUT SIZE DIGITS LTABL,XINTO MESG MESG+3 RTABL,X MESG+4 #$00SET OFFSET TO 0 ^4 MESG,XGET A PAGES/SECTOR #$01DONE, TURN OFF RAM SBANK2 #$9AMOVE DOS BUFFERS $9D01 #$A9PATCH DOS TO ALLOCATE $B292SECTORS ON TK $11 #$04NOW PATCH THE RWTS ^6 RWPTCH,X RWTS+4,X  <6 SELFMOD >7NOW ALTER CODE TO INITEXITFME SEVNCEE,X $607C,X TWELVE,XWATCH TK $12 $6080,X EHTEE,X $6084,X $6088,X ^4 #$02NOT DONE, LOOP <3 #$03NOW ODD BYTES $6003DOS VERSION #$FE $6006VOL. NO #$7A $6027MAX NO OF T/S PAIRS #$01 $603701ADD DIRECTORY POINTER #$11TRACK $11 (BUF),Y  SECTOR NUMBER (BUF),Y BUF+1  #$0CUP TO SECTOR C? <2NOT DONE, LOOP #$00NOW VTOC ^3 ONE,XSTORE LOTS OF $6001,XBYTES THIRTY,X $6030,X THFOUR,X $6034,X SBANK2 #$60OK, CLEAR MEMORY BUF+1 #$00 BUF #$10SET 16 PAGES CLEARED #$00SET Y FOR LOOP ^1 (BUF),YCLEAR MEM  <1 BUF+1MOVE UP A PAGE  <1NOT FINISHED, LOOP BUF+1NOW FILL IN DIRECTORY #$0E %^2 #$UF,YNOW COPY TO AUX MEM (RAM),Y  LOOP4 DONEDONE, RETURN VIA RWTS ; ; ; ; RAMSTARTPBANK1CAN USE ALL? >1YES #$00NO, SET ONLY 15K BANKNOSET SWAP 0<-> 1 TWELVE+1AND NO USE $50-$57 SIZE "^1 BANKNOBRING IN AUX.RAMTO (BUF),YMAIN MEMORY  LOOP2 DONEDONE, RETURN VIA RWTS ; WRITE #$01REMOVE PAGED MEM SBANK2 #$00SET UP Y FOR LOOP #LOOP3 (BUF),YCOPY TO PRIM BUF PRIMBUF,Y  LOOP3 BANKNOBRUN AUX BACK IN SBANK2 (LOOP4 PRIMBSET A-REG TO 0 #$60ALSO SET UP X-REG HNDLERR+1AND RETURN VIA RWTS ; !READ #$00SET UP Y FOR LOOP LOOP1 (RAM),YCOPY FROM RAM PRIMBUF,YINTO PRIM BUFFER  LOOP1 #$01NOW REMOVE AUX. MEM SBANK2 LOOP2 PRIMBUF,YAND COPY #$08NOW GET THE BUFFER (IOB),YADDRESS BUF  (IOB),Y BUF+1 CMDGET THE COMMAND #$01A READ? READ #$02A WRITE? WRITE DONE SET NO ERRORS  24SKIP SEC ERROR SET AN ERROR #$01TURN OFF ALL RAM SBANK2 #$00$04GET TRACK FROM IOB (IOB),Y USE AS AN OFFSET NOW GET THE SECTOR CHKTRK,XGET HI-NYBBLE ERRORILLEGAL TRK ERR (IOB),YADD LO-NYBBLE RAM+1 ^1 BANKNOBRING IN AUX SBANK2MEM ^2 #$00SET UP REST OF RAMADDRESS >1YES, CONTINUE $#$02ELSE DO MISSING INSTRUCTIONS $6F8 RWTS1AND RETURN TO RWTS ; ; ^1 #$0CGET CMD FROM IOB (IOB),Y #$04IS IT INITIALISE? >1NO, CONTINUE RAMSTARTELSE RESTART DRIVE ^1 CMDSTORE THE COMMAND #C  $800 ; ; RAMLOAD #$00COPY PROGRAM TO ^1 $4000,XDOS BUFFERS $9B00,X $4100,X $9C00,X  <1 RAMSTART ; ; ! $9B00THIS IS WHERE IT ENDS UP  $814 ; ; RAMDRIVE#$01SET UP Y TO GET (IOB),YSLOT NO. #$30SLOT 3? FILE MANAGER EXIT %PRIMBUF $BB00DOS'S PRIMARY BUFFER RWTS $BD00START OF RWTS RWTS1 $BD092ND ENTRY POINT ALLDONE $BE46SET NO ERRORS HNDLERR $BE48SET ERROR !COUT $FDEDCHAR OUT ROUTINE SBANK2 $C07DRAM SWITCH ; ; ;  $3FEUSER BUFFER $RAM $46ADDRESS OF RAM SECTOR IOB $48ADDRESS OF IOB PBANK1 $C5CAT BANK MEMORY ; ;OTHER EQUATES ; WARMSTRT $9DBFDOS WARMSTART FP $A57ADOS FP COMMAND +BUFNO $AAB1DEFAULT NO. OF DOS BUFFERS "FMEXIT $B37F**************** * * * 16K RAMDRIVE * * USING CAT * * AUX. MEMORY * * * * BY W.TOOMEY * * * **************** ; ; ;ZERO PAGE EQUATES ; "CMD $2CUSE TO HOLD COMMAND %BUF $3EADDRESS OF            'm nLULLLLLLL4LiLLLLLLLLL)LL=LdLOLL L#LL+0 W. jȥ Z.`ȱii`hhhHHH(lhhhhhH(lЯПл8,14IIPLIPLPLIPLPT49229,0:49236,0:N14000ErA$"L"ĺ(4);"BLOAD "F$",A$"N1:10Q|A$:10ED"ED"PLILIIPLIPLLIIPLIPLLTALOG"':F$::34,0:4:958:15059(F$)01500O49232,0:49234,0oN1540,1560,1580,1600,162049228,0:49236,0:N12000:165049228,0:49237,0:N14000:1650,49230,0:49236,0:N14000:1650@49230,0:49237,0:N18000:1650I32:170FD64:170-(4);"PR#1"3E1913,PLIDY1785,Z:1145,Cq(17):(4);"PR#0"y10:15);"LOAD PAGE ";N9:" FOR CATALOG, CTRL-C FOR MENU"8:"FILENAME: ";F$(F$)0152034,3:(4);"CA"A$"C"950'A$"N"7500)A$"V"1525>,"";:170TI0:C75:D0:170i P1:N3:Z2:170~RP2:N4:Z2:170P1:N5:Z1:170C76:170P1:N1:Z0:170P2:N2:Z0:170LP3:170~L4:170L8:170L16:170OICE: ";A$:A$;%A$"Q"ė:6A$"1"1000GA$"2"1050XA$"B"1100iA$"A"1150zA$"O"1200A$"X"1250A$"I"1300A$"E"1350A$"L"1500A$"D"1450A$"3"800A$"4"850A$"5"900ONDENSED"A"4) PAGE 4"?F"5) PAGE 5";25);"N) NORMAL"EKKLux"L) LOAD PAGE";25);"A) AND PAGES"}"V) VIEW PAGE""D) DUMP PAGE";25);"O) OR PAGES""Q) QUIT";25);"X) XOR PAGES"L0:I0:D0:C7520:"CHc EPSON DUMP$ BY W.TOOMEY*0Q P1:L0:I0:D0:N1:Z0:C75[ ::d 10z15:"EPSON DUMP"15:"----- ----"(62"1) PAGE 1";25);"I) INVERSE"7"2) PAGE 2";25);"E) ENLARGED" <"3) PAGE 3";25);"C) C        ,Raa0a &ȑ eL  L0`L(16255)L(16255): WRITE ENABLE SOFT EMULATOR(4);"BLOAD FPBASIC,A$D000"L(16254): WRITE PROTECT RAM76 |````ԩ``z'`7`}0L/α Lz`P@p#ˠ͠ōLˠ͠ōL @ALH0L HL,HȽZ%HG}FH>ȱH?,($8}`LIF}>ة}>}F }`?>>??>Ȋ>? }`0`4`      X4Y4j4u44444444455515D5X5u5555555 66.6X6Y6Z6   PX<_<1 #^2 HBLNKAND WHILE SCANNING <2 DLYLOOP BACK SEVERAL TIMES <1 ELSE RETURN ; ; ;  IT YLOW,XNO, SET UP NEW BASEROW BASE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; DONE FINISHED ; ; SWAIT DLYSAVE DELAY %^1 HBLNKDELAY WHILE BLANKING PAGENOW ON PG2 GETBYTAND GET MORE BYTES ; FOUROWS PAGERESET TO PG1 BASE+1RESET BASE TO #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN DONEYES, EXEDELAY SEVERAL BLANKS SWAIT  #$28END OF ROW? GETBYTNO, LOOP BACK ; NEWPAGE?#$00RESET Y TO 0 PAGEWHICH PAGE? FOUROWSPG2, BACK TO PAGE1 BASE+1ELSE FIX UP BASE #$20TO $60-$7F BASE+1 #$0EDELAY SEVERAL BLANKS SWAIT 26:>"&*.26:>#'+/37;?#'+/37;? $(,048< $(,048"&*.26:>#'+/37;?#'+/37;?((((((((((((((((((((((((((((((((PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP $(,048< $(,048"&*.26:>#'+/37;?#'+/37;? $(,048< $(,0481 o> o> o>>@?I` @ȹ>@?I` @Ȅ` o>L o>H o> o>αϱ}}F F  o>Fΐ Fϐ  o>F @F  o>(С o> o>L=H0h`L` RETURN TO CALLER ; ;  1 RETURN TO CALLER ; ;  SPKRCLICK SPEAKER STARTROWAND START A ROW ; DONE FINISHED ; ;  YT8DELAY WAIT #$07COARSE DELAY WAIT <2AND GET MORE BITS RTS1 RETURN TO CALLER ; ;  $12COARSE DELAY WAIT <2AND GET MORE BITS RTS1 No o @X`L`LM=B'Iddddddddddddd   /@9@I@U@e@s@@@@@@@@@A!A-A=AEAQAuAAAAAAABB'B4BBBIBPBdBBBBBBBC:CPC^CuCCCC     eldLarge medicine ball/BALL/(Freestanding punching bag/BAG/)Scraps of cloth/BAG/* Soft platformRows of soft platformsSmall plastic wafer/WAFE/- Force fieldwhich is weakly flickeringAlien device/DEVI/0   of glowing thread/BAND/ Dark holeRailing Display case which is openButtonPiratewhich is motionlessLarge plastic block/BLOC/"!GLOWING large plastic block/BLOC/#Large radiant glowing neon sign Display casesGiant boxes & cratesPulsating red force figingLong glowing metal thread/BAND/ Force fieldControl consoleMe/ME/ Hydroponics#Blinking red light over force field ViewscreenControl consoleGlowing thread tied to lever!Loose end of glowing thread/BAND/ Treadmillwith thread tied to it"Meter loopia! UGH!OUCH!Me wanders off!"Pull lever please" MachineryControl console Force fieldControl console Plants/PLAN/ Flower/FLOW/ Force fieldBandanna/BAND/Which I'm wearinglite goes here..... Corpse/CORP/ Control console Neanderthalwhich I'm dragn bodiesship's engines, life supportforce field resetred & blue slide switches use color#alien voice says "FREEHJLLGFREEUYE"High pitched electronic whine& another less obvious deviceLcombined lavatory & mess hall! Reminds me of my old school's cafeterIME then the mission can still succeed!LI'm jettisoning self from airlock. Good luck & forgive me for involving you.+"Main landing sequence set for lever pull!"@Robot Pirate looks strangely at me, picks me up & carries me off&shaped for strange narrow alie]% (4);"BLOAD FAXER3.OBJ,A$1A00"F(4);"BLOAD BASTABL,A$1B00"R4:3:\1513T #$18 DONEOK, EXIT #$00RESET HOUR TO 0 HOUR DONEAND EXIT ; ; ; COUNT1 1824 Hz COUNTER COUNT2 3CSECONDS COUNTER ; ; ;  #$18RESET COUNT1 TO 24 COUNT1 COUNT2NOW DEC SECONDS DONETHAT'S ALL, EXIT #$3CRESET COUNT2 TO 60 COUNT2 MINMOVE TIME UP MINCHECK IT #$3C DONEOK, EXIT #$00RESET MIN TO 0 MIN HOURMOVE HOUR UP HOURCHECK IISTWITH PARAMETERS ALLOW INTS AND RETURN ; ; PARMLIST 022 PARAMETERS  00RETURN CODE  CLOCKPTR TO ROUTINE ; ; CLOCK CLEAR DECIMAL MODE COUNT1COUNT 24Hz >1NOW DEC SECONDS DONE CLAIM INTERRUPT AND RETURN ; "^1 HOUR BYTES. ; ; #MLI $BF00ProDOS ENTRY POINT HOUR $BF92HOUR BYTE MIN $BF93MINUTE BYTE ; ;  $BD00  $800 ; CSTART $BF6FGET MAP BYTE #$04SET PAGE $BD USED $BF6F MLISET UP IRQ-HANDLER  40ALLOC_INT CALL  PARML**************** * * * ProDOS Clock * * By * * W.Toomey * * * **************** ; ; $;IRQ'S COME IN AT 24 Hz. CLOCK DECS (; COUNT1 FROM 24 TO 0, THEN DECS COUNT2 "; FROM 60 TO 0, THEN INCS THE MIN ; AND     BITS RTS1 RETURN TO CALLER ; ;  ;DLYLOOP BACK SEVERAL TIMES <1 ELSE RETURN ; GETBYT #$07GET SEVEN BITS ^2 TAPEINGET INPUT SHIFT IT INTO CARRY BYTEAND BACK INTO THE BYTE  RTS1GOT 7BITS, RETURN #$0EDELAY SEVERAL BLANKS SWAIT <2AND GET MORE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; DONE FINISHED ; ; SWAIT DLYSAVE DELAY %^1 HBLNKDELAY WHILE BLANKING <1 #^2 HBLNKAND WHILE SCANNING <2 FOUROWS PAGERESET TO PG1 BASE+1RESET BASE TO #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN DONEYES, EXIT YLOW,XNO, SET UP NEW BASEROW BASE GETNO, LOOP BACK ; NEWPAGE?#$00RESET Y TO 0 PAGEWHICH PAGE? FOUROWSPG2, BACK TO PAGE1 BASE+1ELSE FIX UP BASE #$20TO $60-$7F BASE+1 $FINE #$30DELAY SEVERAL BLANKS SWAIT PAGENOW ON PG2 GETAND GET MORE BYTES ; ; O FINE+1DEC DELAY ; DISPLAY BYTEGET SEVEN BITS CLEAR THE COLOR BIT #$7FALL BITS ON? >3YES, IGNORE, IS NOISE! (BASE),YADD BITS ALREADY (BASE),YON THE SCREEN $^3 #$0DDELAY SEVERAL BLANKS SWAIT  #$28END OF ROW?  = % $$& '$ &  "`ǠӠŠǠҠŠҠĠǠԠǠƠҠŮԠǍč Li ALv LQ ҠŠӠϠԠǠҾΠӺˠĠŠōˠŠŠ  `&ii` X X`QL囹 L5 X. gLɍ ) 0H h h0c ' Ա о  ) & А%ilgU*ر 2Hh 8 L L ҠӠϠԠΠǠҠƠŠǠҾԠӺˠĠŠŠŠōed g+ ɍufjhrs`ԠˬĠҠō4 X g,ɍ )FfL8ͥee ii i١ 0/ g ɍ`ԠˬĠҠčӠΠϠԍ2 X #0_ e ilim L3 X e2_ LΠ 3‡ˠҬӠ٠٠ϠŇ1  8s t穾3 X ɱLiɲL_ ɳL ɴLS ɵL ɶΩ" XQ 囹Q𦩨L1𩠠 X L ƴ ƴ0PȽƴi ! LԠƠ    (768)(769)1210=(4);"BLOAD SPECT.OBJ,A$6100"O768,5:769,7^ BASE24576i24832r:3(I02552Y(BASEI)0.75<I,Y:F20-ON. I CAN'T GO IN THAT DIRECTION. 755HI55Ig0 .&/0  T.$ K.08 T.$ 6.L$ . . . T./ .ȱ .0 .0) T.% 6.L$ T.$ 6.0s00 .L$0 T.i# 6. .` I FELL & BROKE MY NECK! I'M DEAD! ITS DANGEROUS TO MOVE IN THE DARK! I ALSO NEED A DIRECTI@@`1T8M CqETBJ@  H )BASEROW BASE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; DONE TOPDO PAGE 2? STOPNO, STOP $C055SHOW PAGE2 #$02 $C07DBRING IT IN ENTRY2AND DO AGAIN STOP ORE BYTES ; ; FOUROWS PAGERESET TO PG1 BASE+1RESET BASE TO #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN DONEYES, EXIT YLOW,XNO, SET UP NEW  #$28END OF ROW? GETNO, LOOP BACK ; NEWPAGE?#$00RESET Y TO 0 PAGEWHICH PAGE? FOUROWSPG2, BACK TO PAGE1 BASE+1ELSE FIX UP BASE #$20TO $60-$7F BASE+1 #$40DELAY SEVERAL BLANKS SWAIT PAGENOW ON PG2 GETAND GET M ^2 #$15--> ? DISPLAYNO INC Y ; DISPLAY BYTEGET SEVEN BITS CLEAR THE COLOR BIT #$7FALL BITS ON? >3YES, IGNORE, IS NOISE! (BASE),YADD BITS ALREADY (BASE),YON THE SCREEN $^3 #$0DDELAY SEVERAL BLANKS SWAIT TARTROW#$03COMRESS 3 ROWS TO 1 COUNT ; &SYNC TAPEINWAIT FOR A HI SIGNAL SYNC ; GET GETBYTOK, GET A BYTE KYBDA KEY PRESSED? DISPLAYNO, SKIP KBDSTRBTURN IT OFF #$88<-- ? >2NO YES, DEC Y DISPLAYAND CONTINUE,H,Ѕh`"n 9bn\ 9b 9b ɍR$, 9bLHhІHh,0Ɉ ʎ$ɠ $` L0-M bPH7 -M bhL808` LЍLLN\ɠɊɎۭ\N8鰐- ),0 8n0 mmL0R7\ɍRL,p0׭\L/-M b$$ ]8tsiiiiL#i$i%&iڍabbiabbi'bbb4bibbb5biiI8PQ c?BC ,ЍP    3` a`` a`M2aM2a2a`z #? @Ҵà Ҵʠ @Үà% Үʠ Ҡ ҵԮʠ ̠ ͮʠ@Юà  Юʠ@ҳà ҳʠ@Բà Բʠ ӳà ӴàӮǠ ӳà ӳʠ ΠР  ͮà ̠ ̮à ̮ʠ Ҳà  Ҳʠ ӱàӲà  ˮà ˮʠ ͮʠ ͮà ͠Үà Үʠ Ŵŵàŵʠ ŵ"ԮàԮʠԠϠ ˠӮʠ ˠӮà ųàųʠŴàŴʠ 009228826C82289200 ; CHAR12 B5PHI = 5  00182400FF00241800 ; CHAR13 A4DELTA = $  000618628062180600 ; CHAR14 ABSQ ROOT = +  040201061860800080 ; CHAR15 BDAPPROX = =  244800482412001224 ; CHAR16 A6LAMBDA = &  00468810 B7PI = 7  00200E3000300E2000 ; CHAR7 AASIGMA = *  008244AA108200C600 ; CHAR8 A3GAMMA = #  00827C820080008040 ; CHAR9 B8SIGMA = 8  001C2200221C204000 ; CHAR10 C0MU = @  00013E000200023C00 ; CHAR11 A5PHI = % ; CHAR1 B1 ALPHA = 1  001C22002214081422 ; CHAR2 B2BETA = 2  1F20428012806A0400 ; CHAR3 B3GAMMA = 3  000C9240221C400080 ; CHAR4 B4DELTA = 4  000C120052A01C8C40 ; CHAR5 B6EPSILON = 6  00142A002A00220000 ; CHAR6 HAR3  CHAR4  CHAR5  CHAR6  CHAR7  CHAR8  CHAR9 CHAR10 CHAR11 CHAR12 CHAR13 CHAR14 CHAR15 CHAR16 CHAR17 CHAR18 CHAR19 CHAR20 CHAR21 CHAR22 CHAR23 CHAR24 CHAR25 CHAR26 CHAR27 CHAR28 ; ;  CHAR9 CHAR10 CHAR11 CHAR12 CHAR13 CHAR14 CHAR15 CHAR16 CHAR17 CHAR18 CHAR19 CHAR20 CHAR21 CHAR22 CHAR23 CHAR24 CHAR25 CHAR26 CHAR27 CHAR28 ; ; ; ADRH 00DUMMY ADDRESS  CHAR1  CHAR2  CINT SAVE A-REG &^4 $C1C1TEST IF PRINTER READY <4NO, LOOP GET A BACK $C090PRINT IT  ; ; ; NUMCHARS 1C28 CHARACTERS ; ; ADRL 00DUMMY ADDRESS  CHAR1  CHAR2  CHAR3  CHAR4  CHAR5  CHAR6  CHAR7  CHAR8  Y TO 0 #$1B PRINT #$79SET DOWNLOADING PRINT ADRL,XSET UP THE ADDRESS BAS+1 ADRH,X BAS+2 BAS $2000,YGET A BYTE PRINTAND OUTPUT IT  #$0APRINT 10 BYTES BAS DECREMENT X <3NOT FINISHED, LOOP  ; ; PR0  $0800 ; ; HOMECLEAR SCREEN #$00 ^1 MESG1,XPRINT MESSAGE >2 COUT1  <1 ^2 KEYINGET A RETURN #$8D <2 !RESET #$1BRESET THE PRINTER PRINT #$3C PRINT NUMCHARSGET NO. OF CHARS ^3 #$00SET ******************** * * * GREEK CHARACTERS * * * * BY * * W.TOOMEY * * * ******************** ; ; ; HOME $FC58 COUT1 $FDF0 KEYIN $FD1B ; ; ;  $200 ($$bb`$HH$$Fp8DD82HH2 ">DDD8" "@00a@@> ΠΠҠԠξ X! ɍ K < K V  K y K W = t > K `H,0h` '1;EOYcmw !!!!!!!!!!!!!!!!""" Bj @"@ R@**" 00 D|@"" @><(l  A 4"MASTER DISKETTE CREATED ON 48K SYSTEM"a"BY W.TOOMEY 23/11/83"{(4:16);"LISA FILES"-A$"----------------------------------------".A$;/22:A$"26:34,5:35,21<(4);"CATALOG"F34,0:35,24:22 p0x@{_oW} p'@s8Xg @Oi6XO#Hs+&DsWA@1 @;8` r@|;4`j#v}!Vy@@%p0lg`5p}Ace 8x]@zy/@l%0P]@@@X @opl!Y`@60`C 0`_9w_A x|s+`0@?b@, 0@lXBKu@U3l @@  T>p ~i!~T=JApppL! f`&@`q@64`~9QL=Bx/oX `@n"x}z:.l@t |84ݴ R ݺ ɤ4&D ?5=ɥD 5 5 D4ɻɍЀLvɠ`[Lz{|LJ?>ʊ:>Ș;k/=:   S;:L 4 40K14 L= BC D..=D5֤4 J :3 g ɠɍɤ ɓъ x= R   &B&C= R REG HOLDS THE CHAR Y-REG POINTS TO IT ; ; ;  FORMAT YSAVSAVE Y-REG AGAIN IN,YGET AN INPUT CHAR #";"IS IT A SEMI-COLON >9YES, SKIP #$8DOR A RETURN? ERROR3NO, ERROR &^9 FINDNOW FIND THE CMD BYTES ; NOTSP IN,YGET THE NEXT NON-SPACE CHARACTER #" " NOTSPA-VE X IN A1H  <2AND GET ANOTHER CMD CHAR A5LGET CMD FORMAT SHIFT LEFT TWICE  YSAV1ADD BITS FROM YSAV1 #$20LEGAL CMD? >8YES, SKIP YSAV1ELSE GET YSAV1 >8AND SKIP IF =0 #$80ELSE TURN BIT 7 ON ^8 A5LUSE AS CMD Y INTO A5L #$03DONE 2 CHARS YET? >7NO, SKIP GETNUMGET ADDRESS IN A2L,H A2HGET HI BYTE OF CMD ADDR >6IS ZERO PAGE? INCREMENT X-REG !^6 YSAV1SAVE IT IN YSAV1 #$03SET IT BACK TO 3 MOVE BACK ALONG INPUT ^7 A1HSA$ >3NO NOTSPGET NEXT CHAR CHAR2,XIS IT Y,X,$ or NUL >5YES CHAR2,XNO, GET THAT CHAR >4SKIP IF ZERO #"$"IS IT A $ SIGN? >4YES YSAVGET FIRST CHAR POSN ^3 CLEAR CARRY ^4 DECREMENT Y "^5 A5LROLL CARRCHAR'S 5 BITS ^1 INTO A4L,H A4L A4H  <1LOOP BACK A1HDONE 3 CHARS YET? <1 %<9YES, NOW 3CHARS=15BITS IN A4L,H $#$05COMPARE NEXT CHAR WITH TABLE ^2 NOTSPGET NEXT CHAR YSAVSAVE Y POSN CHAR1,XIS IT ( , ) # or WELL ERROR2 A1PCLPCOPY A1L,H TO PCL,H &^8 #$03GET 3 CHARS AS COMMAND A1H "^9 NOTSPGET NEXT CMD CHAR IS IT ALPHABETICAL? #$BECONVERT TO $C4-$F6 #$C2 ERROR2NO UPCASE, ERROR  NOW $10,$18..,$D8 #$04SHIFT THE LY, SKIP #$8DA RETURN? ASM2YES, TRY AGAIN MOVE UP THE PTR #"$"A $ SIGN, A MONITOR CMD MONPPASS IT TO MONITOR NOPE, FIX UP Y-REG GETNUMGET ADDRESS INTO A2L,H #$93A $93? ERROR3 ERROR2NO, ERROR IF X-REG=0, AN ERROR AS 0 ; CHAR27 FDBOT OF SUM = }  0004020002FC000000 ; CHAR28 ADETA = -  00403E002000201F00 ; ; ; ; ,MESG1 "TURN ON PRINTER & HIT "  8D00 ; ; ;  HAR22 AFPSI = /  40300804FB04083000 ; CHAR23 DBTOP OF SIG = [  E018860180008000C0 ; CHAR24 DDBOT OF SIG = ]  071861800100010003 ; CHAR25 FBTOP OF SUM = {  00000000007F804000 ; CHAR26 A1MID OF SUM = !  0000000000FF000008070080402 ; CHAR17 B9THETA = 9  003844920092443800 ; CHAR18 B0OMEGA = 0  324886008000864832 ; CHAR19 BFNU = ?  002010080422001C00 ; CHAR20 A8RHO = (  013E44004400443800 ; CHAR21 A9OMEGA = )  1C2200020C0200221C ; C  FFFFFFFFFFFFFF28-34 ; ; ; ONE 110FDIRECTORY SECTOR )THIRTY 1201START OF DISK ALLOCATION? THFOUR 2310DISK T/S LIMITS !SEVNCEE 1FFETRACK $11 BIT MAP )EHTEE FFFFBIT MAPS FOR TK $12,13,14 ; ; ; ERRMESG 8D8D87  "NO LANGU$00SET OFFSET TO 0 $^4 ERRMESG,XGET A CHARACTER >5IF 0, END COUTPRINT IT OUT  <4AND LOOP ^5 FPDONE, DO AN FP ; ; ; "CHKTRK FFFFFFFFFFFFFFTRKS 0-6  FFFFFFFFFFFFFF7-13  FFFFFF4050607014-20  FFFFFFFFFFFFFF21-27E RWTS ^6 RWPTCH,X RWTS+4,X  <6 SELFMOD >7NOW ALTER CODE TO INITEXITFMEXITEXIT THRU FM $^7 #$00SET THE ABOVE BRANCH !SELFMOD+1TO POINT TO INITEXIT BUFNOSET MAXFILES TO 2 FPFINISHED, DO AN FP ; ; ; STARTERR#  #$02NOT DONE, LOOP <3 #$03NOW ODD BYTES $4003DOS VERSION #$FE $4006VOLUME NO. #$7A $4027MAX # OF T/S PAIRS #$01 $4037PAGES PER SECTOR #$01DONE, TURN OFF RAM #$9AMOVE DOS BUFFERS $9D01 #$04NOW PATCH TH(BUF),Y BUF+1  #$0CUP TO SECTOR C? <2NOT DONE, LOOP #$00NOW VTOC ^3 ONE,XSTORE LOTS OF $4001,XBYTES EVERYWHERE THIRTY,X $4030,X THFOUR,X $4034,X SEVNCEE,X $407C,X EHTEE,X $4080,X $4084,X $4088,XES CLEARED #$00SET Y FOR LOOP ^1 (BUF),YCLEAR MEM  <1 BUF+1MOVE UP A PAGE  <1NOT FINISHED, LOOP BUF+1NOW FILL IN DIRECTORY #$0E %^2 #$01ADD DIRECTORY POINTER #$11TRACK $11 (BUF),Y  SECTOR NUMBER E, RETURN VIA RWTS ; ERROR #$01TURN OFF RAM SBANK2 #$40SET DRIVE ERROR #$60SET X-REG HNDLERRAND GIVE AN ERROR ; ; ; RAMSTART#$02BRING IN RAM SBANK2 !^1 #$40OK, NOW CLEAR MEM BUF+1 #$00 BUF #$10SET 16 PAG ; !READ #$00SET UP Y FOR LOOP LOOP1 (RAM),YCOPY FROM RAM (BUF),YINTO THE BUFFER  LOOP1 DONEDONE, RETURN VIA RWTS ; !WRITE #$00SET UP Y FOR LOOP #LOOP2 (BUF),YCOPY FROM BUFFER (RAM),YTO RAM  LOOP2 DONEDONF  (IOB),Y BUF+1 CMDGET THE COMMAND #$01A READ? READ #$02A WRITE? WRITE DONE #$01TURN OFF RAM SBANK2SET A-REG TO 0 #$00RAM,SET A-REG TO 0 #$60ALSO SET UP X-REG AND CLEAR CARRY ALLDONEAND RETURN VIA RWTSE SECTOR +(IOB),YUSE AS LOW NIBBLE OF RAM ADDRESS *CHKTRK,XADD HIGH NIBBLE OF RAM ADDRESS ERRORNOT $40-$7F, ERROR RAM+1SET UP RAM ADDRESS #$00 RAM #$02TURN ON RAM SBANK2 "^2 #$08NOW GET THE BUFFER (IOB),YADDRESS BUWTS1AND RETURN TO RWTS ; ; ^1 #$0CGET CMD FROM IOB (IOB),Y #$04IS IT INITIALISE? >1NO, CONTINUE RAMSTARTELSE RESTART DRIVE ^1 CMDSTORE THE COMMAND #$04GET TRACK FROM IOB (IOB),Y USE AS AN OFFSET NOW GET THS BUFFERS $9B00,X $4100,X $9C00,X  <1 RAMSTART ; ; ! $9B00THIS IS WHERE IT ENDS UP  $814 ; ; RAMDRIVE#$01SET UP Y TO GET (IOB),YSLOT NO. #$30SLOT 3? >1YES, CONTINUE $#$02ELSE DO MISSING INSTRUCTIONS $6F8 RD00START OF RWTS RWTS1 $BD092ND ENTRY POINT ALLDONE $BE46SET NO ERRORS HNDLERR $BE48SET ERROR !COUT $FDEDCHAR OUT ROUTINE SBANK2 $C07DRAM SWITCH ; ; ;  $3FEC  $800 ; ; RAMLOAD #$00COPY PROGRAM TO ^1 $4000,XDOUSER BUFFER $RAM $46ADDRESS OF RAM SECTOR IOB $48ADDRESS OF IOB ; ;OTHER EQUATES ; WARMSTRT $9DBFDOS WARMSTART FP $A57ADOS FP COMMAND +BUFNO $AAB1DEFAULT NO. OF DOS BUFFERS "FMEXIT $B37FFILE MANAGER EXIT RWTS $B=**************** * * * 16K RAMDRIVE * * USING CAT * * AUX. MEMORY * * * * BY W.TOOMEY * * * **************** ; ; ;ZERO PAGE EQUATES ; "CMD $2CUSE TO HOLD COMMAND %BUF $3EADDRESS OF       P ( @(P@ @ 0@P^T<P 0@R :@1HA2 X@x@@  8A4>`< ,0A X.`P%D0`@h(P D  #$10DONE 8 MSB'S? <6 YES, RETURN ; ; ;  BYT1  BYT2  BYT3  BYT4  BYT5  BYT6  BYT7  PRINTPRINT RESULT  <5AND LOOP RETURN ; ; MOVBASE #$00SET OFFSET TO 0 ^6 BAS0H,XGET MSB #$20ADD $20 BAS0H,X MOVE TO NEXT MSB  YT(BAS0L),YGET BYTE0 BYT0 (BAS1L),Y BYT1 (BAS2L),Y BYT2 (BAS3L),Y BYT3 (BAS4L),Y BYT4 (BAS5L),Y BYT5 (BAS6L),Y BYT6 (BAS7L),Y BYT7 #$07SET COUNT TO 7 "^5 BYT0SHIFT A BIT INTO C AND BACK INTO A ; ; ; PRINT SAVE CHARACTER ^4 BUSYPRINTER BUSY? <4TES LOOP GET CHAR BACK PRINTERAND SEND IT  ; ; ZPGSWAP #$00 ^1 $0000,YSWAP ZPG WITH  $1D00,Y$1D00 $0000,Y  $1D00,Y  <1  ; ; PRINTBE #$28? <2NO, LOOP BACK #$00SET Y BACK TO 0 MOVBASEMOVE BASES UP !^3 PRINTBYTPRINT 8 BYTES  #$28 <3LOOP UNTIL DONE  ; ; ; LINEFEED#ESCOUTPUT LINEFEED PRINTOF X/216 #'J' PRINT  PRINT AND RETURN RETURN ; ; ; PRINTGFX#ESCOUTPUT PRINT #'*'SET A 72dpi PRINTLINE #$05 PRINT #$3048 + PRINT #$022*256 = 560 PRINT  ; ; ; !PRINTLIN#$00START ON THE LEFT !^2 PRINTBYTPRINT 8 BYTES END OF 1ST PAGURN ; ; ; $SETBASE #$00SET DEST OFFSET TO 0 "^2 YLOW,XGET BASE OF LINE BAS0L,YSTORE IT  YHIGH,X #$60MOVE TO $4000-$5FFF BAS0L,Y  #$10DONE 16 BYTES? RTS1YES, RETURN MOVE UP A LINE <2AND LOOP RTS1 ELSEO, FINISHED SETBASESET UP BASES  !LINESET UP LINE FOR NEXT TIME #$08 LINE PRINTLINPRINT THE LINE #$0DPRINT A PRINT #$1BDO A 27/216 LINEFEED <1AND START AGAIN ; #END ZPGSWAPSWAP ZPG BACK IN AND RETB YLOW $1B00 YHIGH $1BC0 PRINTER $C090 BUSY $C1C1 ; ; ;  $1A00  $800 ; ; DBLDUMP ZPGSWAPSWAP ZPG OUT #$00SET LINE TO 0 LINE )^1 PRINTGFXTELL LPR TO DO GRAFIX LINEGET 1ST LINE #$C0IS IT LEGAL? ENDNS0L $F0 BAS0H $F1 BAS1L $F2 BAS1H $F3 BAS2L $F4 BAS2H $F5 BAS3L $F6 BAS3H $F7 BAS4L $F8 BAS4H $F9 BAS5L $FA BAS5H $FB BAS6L $FC BAS6H $FD BAS7L $FE BAS7H $FF ; ; ESC $15 *************** * * * DOUBLE RES * * DOUBLE DUMP * * * *************** ; ; ; BYT0 $E0 BYT1 $E1 BYT2 $E2 BYT3 $E3 BYT4 $E4 BYT5 $E5 BYT6 $E6 BYT7 $E7 LINE $EF ; BA     AGE CARD!"  8D00 ; ; ; RWPTCH 4C009BEAEA ; ; ;  <Zq x3 P>pW@}A 8v.@60(@$ w `8pz1 " p9<@ekAE @`x]ccXS/xU;~0` 0j/8 @a6`U\~ |`r@;d+ 0`;$@@\   @dAA%0< @8 pA= P=4 ```C`@+@.0~}YS@Fa'0p0`c".\E`&@0@` +`aA1$BT!{D @{80~i8h@Ip10`yoA@7(?`!@{ 8" 0@?:N_?|_o<@0#P@O)%@4`?hy#`!HA`90l&w0x9P@|@h t|ph!<L}`|^( 4W@pUpht|0pm pz LLp`8LYxb`epkxG|?`PJmwxqA%B*@!f1bQ@  bA\@_>z=F@7>XP lD(`qa`W &,P0C!P1v''( }@/Bh)ppD p+p\@fmna_ z\?a-`(@ `|@<<>0@j;<@l `n?p  @c"30@(Ze ` J ,t"@@ :`@4 R9$Awp`!  "@(l 88|A%0p0 0TAx@`#(2x78dBsAp @AWh`F  70@8`0@'p0`#~s3F`{w` 4x_x?puyv?@`Y` @xj@Np#ZL@@<`1z?<0@u@kO&l x}XPwo?~~{o;pt>v?~ fP`@ N+(0_%Hxy|?x=~?8PX-f-`I@y> H+48ptas<?|'>@<: P:@7P't;P@a5V00@`<lYx#P)2("xA hea(^0p@iaq:8$ @h0p^vo}}Ss?Zb3~yu{ ::(eP@S"@P!p] `5~T8~40( @o!&xopM-@ |PD?ld@ pYAKvb pyu[oS%p`p@L8p;`[m ? B @|040@@Tn F@[`)@=&N@h` Xks'@ ` Lvoc_ @{}#8((@(p?v<,PA=t] hyTh5$RuCAx]PO-{sw?~y_{Qygf@0F# pR`qF`A+0pc ,D`Q^BwaA?@,``xmx00~w=@<| l$@'hXp}_[Wu 'b,P9P<?`hEhoh~pJ`w8: \C; ^/p 4~bwcU#|jm 2@e &X 80j-|`3x@0b'@wO  xn_' ? zp|e `cWvMX( p[00H@@$~w?~w~/|wo`A?d 8<8(`.zTE@quH`@8 @1 p&z$R)f  H .i b  zL `ȽI`` *  0  ` (  (` J  `H,0h`Hh`F*F*F*F*F*F*F*F* ` ` ]0LαLzG Lz@P`p#ϠŠġL?@ALyH0L HLy,HȱH0CGF}H>ȱH?,}`LFF>>Fݩ}@`LH}@?>>??>Ȋ>? =@?0@A4@C|@E@@@ש@@z'@7@ BOVE BRANCH !SELFMOD+1TO POINT TO INITEXIT BUFNOSET MAXFILES TO 2 ; ; ; STARTERR#$00SET OFFSET TO 0 PRNTMSG SIZEPUT SIZE DIGITS LTABL,XINTO MESG MESG+3 RTABL,X MESG+4 #$00SET OFFSET TO 0 ^4 MESG,XGET A CHAR >5SBANK2 #$9AMOVE DOS BUFFERS $9D01 #$A9PATCH DOS TO ALLOCATE $B292SECTORS ON TK $11 #$04NOW PATCH THE RWTS ^6 RWPTCH,X RWTS+4,X  <6 SELFMOD >7NOW ALTER CODE TO INITEXITFMEXITEXIT THRU FM $^7 #$00SET THE A$4090,XYES THEY ARE $4094,X $4098,X ^4 #$02NOT DONE, LOOP <3 #$03NOW ODD BYTES $4003DOS VERSION #$FE $4006VOLUME NO. #$7A $4027MAX # OF T/S PAIRS #$01 $4037PAGES PER SECTOR #$01DONE, TURN OFF RAM DONE, LOOP #$00NOW VTOC ^3 ONE,XSTORE LOTS OF $4001,XBYTES EVERYWHERE THIRTY,X $4030,X THFOUR,X $4034,X SEVNCEE,X $407C,X EHTEE,X $4080,X $4084,X $4088,X SIZETKS $15-$18 AVAIL? >4NO, SKIP $408C,X EAR MEM  <1 BUF+1MOVE UP A PAGE  <1NOT FINISHED, LOOP BUF+1NOW FILL IN DIRECTORY #$0E %^2 #$01ADD DIRECTORY POINTER #$11TRACK $11 (BUF),Y  SECTOR NUMBER (BUF),Y BUF+1  #$0CUP TO SECTOR C? <2NOT >1YES, HAVE 31K OF RAM #$00NO, SET ONLY 15K SIZE !^1 $C082TURN OFF BSW RAM #$02BRING IN AUX RAM SBANK2 #$40OK, NOW CLEAR MEMORY BUF+1 #$00 BUF #$10SET 16 PAGES CLEARED #$00SET Y FOR LOOP ^1 (BUF),YCLER  LOOP1 DONEDONE, RETURN VIA RWTS ; !WRITE #$00SET UP Y FOR LOOP #LOOP2 (BUF),YCOPY FROM BUFFER (RAM),YTO RAM  LOOP2 DONEDONE, RETURN VIA RWTS ; ; ; ; RAMSTART$C08BTEST BSW RAM $C08B #$31 $D000 $D0004SKIP SEC ERROR SET AN ERROR #$01TURN OFF ALL RAM SBANK2 $C082 #$00SET A-REG TO 0 #$60ALSO SET UP X-REG HNDLERR+1AND RETURN VIA RWTS ; !READ #$00SET UP Y FOR LOOP LOOP1 (RAM),YCOPY FROM RAM (BUF),YINTO THE BUFF02BRING IN AUX SBANK2MEM ^2 #$00SET UP REST OF RAMADDRESS #$08NOW GET THE BUFFER (IOB),YADDRESS BUF  (IOB),Y BUF+1 CMDGET THE COMMAND #$01A READ? READ #$02A WRITE? WRITE DONE SET NO ERRORS  2E SECTOR CHKTRK,XGET HI-NYBBLE ERRORILLEGAL TRK ERR (IOB),YADD LO-NYBBLE RAM+1 >1$40-$7F, USE AUX.MEM $C083TURN ON BSW MEM $C083 #$15TRACK $15 >2NO, SKIP $C08BYES, USE BSW BANK2 $C08B >2OK, SKIP ; ^1 #$WTS1AND RETURN TO RWTS ; ; ^1 #$0CGET CMD FROM IOB (IOB),Y #$04IS IT INITIALISE? >1NO, CONTINUE RAMSTARTELSE RESTART DRIVE ^1 CMDSTORE THE COMMAND #$04GET TRACK FROM IOB (IOB),Y USE AS AN OFFSET NOW GET THS BUFFERS $9B00,X $4100,X $9C00,X  <1 RAMSTART ; ; ! $9B00THIS IS WHERE IT ENDS UP  $814 ; ; RAMDRIVE#$01SET UP Y TO GET (IOB),YSLOT NO. #$30SLOT 3? >1YES, CONTINUE $#$02ELSE DO MISSING INSTRUCTIONS $6F8 RD00START OF RWTS RWTS1 $BD092ND ENTRY POINT ALLDONE $BE46SET NO ERRORS HNDLERR $BE48SET ERROR !COUT $FDEDCHAR OUT ROUTINE SBANK2 $C07DRAM SWITCH ; ; ;  $3FEC  $800 ; ; RAMLOAD #$00COPY PROGRAM TO ^1 $4000,XDOUSER BUFFER $RAM $46ADDRESS OF RAM SECTOR IOB $48ADDRESS OF IOB ; ;OTHER EQUATES ; WARMSTRT $9DBFDOS WARMSTART FP $A57ADOS FP COMMAND +BUFNO $AAB1DEFAULT NO. OF DOS BUFFERS "FMEXIT $B37FFILE MANAGER EXIT RWTS $B\**************** * * * 16K RAMDRIVE * * USING CAT * * AUX. MEMORY * * * * BY W.TOOMEY * * * **************** ; ; ;ZERO PAGE EQUATES ; "CMD $2CUSE TO HOLD COMMAND %BUF $3EADDRESS OF      CtH @gtaC)8n@g,j-|Y P ` @XG# x?(@A,70`pm@`cxp~L/`g7 @3E``s|(4hxp=8Y%L\8>p@OFC;0@Y {_~}sg{{o_#8$ t@`;Bp^}?~@p0`1P< @q<`3`oc4 Se{`=hN@#p LW;HW@%t-|/ paHg@N?D4`?`~@@`@F%Pa vc0<J7@ <@'P\!,@'d.rkN<, RETURN #$0EDELAY SEVERAL BLANKS SWAIT <2AND GET MORE BITS RTS1 RETURN TO CALLER ; ;  Y WHILE BLANKING <1 #^2 HBLNKAND WHILE SCANNING <2 DLYLOOP BACK SEVERAL TIMES <1 ELSE RETURN ; GETBYT #$07GET SEVEN BITS ^2 TAPEINGET INPUT SHIFT IT INTO CARRY BYTEAND BACK INTO THE BYTE  RTS1GOT 7BITS2 SCREENS? DONEYES, EXIT #$02ELSE BRING IN HGR4 PBANK2 SBANK2 $C055TURN ON PAGE2 !STARTSCNAND DO ANOTHER SCREEN ; ; DONE #$01RESET MEMORY PBANK2 SBANK2 AND FINISH ; ; SWAIT DLYSAVE DELAY %^1 HBLNKDELAROWMOVE DOWN A ROW ROW #$C0END OF SCREEN NSCREENYES,EXIT YLOW,XNO, SET UP NEW BASEROW BASE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; ; !NSCREEN SCREENDONE $7F BASE+1 $FINE #$30DELAY SEVERAL BLANKS SWAIT PAGENOW ON PG2 GETAND GET MORE BYTES ; ; FOUROWS PAGERESET TO PG1 BASE+1RESET BASE TO #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW D BITS ALREADY (BASE),YON THE SCREEN $^3 #$0DDELAY SEVERAL BLANKS SWAIT  #$28END OF ROW? GETNO, LOOP BACK ; NEWPAGE?#$00RESET Y TO 0 PAGEWHICH PAGE? FOUROWSPG2, BACK TO PAGE1 BASE+1ELSE FIX UP BASE #$20TO $60-T OFF #$88<-- ? >2NO FINE+1YES, INC DELAY DISPLAYAND CONTINUE ^2 #$95--> ? DISPLAYNO FINE+1DEC DELAY ; DISPLAY BYTEGET SEVEN BITS CLEAR THE COLOR BIT #$7FALL BITS ON? >3YES, IGNORE, IS NOISE! (BASE),YAD ; ; $STARTROW#$02COMPRESS 2 ROWS TO 1 COUNT ; $SYNC #$FFWAIT FOR A HI SIGNAL TAPEIN GETGOT ONE, EXIT  SYNCCAN'T GET A HI, GIVE UP ; GET GETBYTOK, GET A BYTE KYBDA KEY PRESSED? DISPLAYNO, SKIP KBDSTRBTURN I SCREEN SCREEN STARTSCN#$00SET UP ROW BASE #$00SET Y-REG TO 0 TOO PAGESET UP LEFT PAGE ROWAND ROW NUMBER YLOW,X BASE YHIGH,X #$60CONVERT IT TO $40-$5F BASE+1 %^1 TAPEINGET THE FIRST PULSE <1AND IGNORE IT A LOTPEAKER TAPEIN $C060TAPE INPUT #HBLNK $C1C2HORZ. BLANKING SIG ; PBANK2 $C6 SBANK2 $C07D ; ; ; ;  $1A00  $800 ; ; FAXER2 $C050TURN ON GRAFIX $C052TURN ON FULL GRAFIX $C04EDOUBLE HI-RES $C054PAGE 1 #$01SET TOPWE'RE ADSSING COUNT $FBNO OF ROWS TO OR ROW $FCROW NUMBER BYTE $FDINPUT BYTE BASE $FEROW ADDRESS YLOW $1B00ROW BASE LSB YHIGH $1BC0ROW BASE MSB ; KYBD $C000KEYBOARD KBDSTRB $C010STROBE SPKR $C030Sl ************* * * * FAXER * * * * FACSIMILE * * DECODER * * * * BY * * W.TOOMEY! * * * ************* ; ; SCREEN $F8TOP OR BOT SCREEN DLY $F9DELAY LENGTH !PAGE $FAPAGE      IF 0, END COUTPRINT IT OUT  <4AND LOOP ^5 FPDONE, DO AN FP ; ; ; "CHKTRK 00000000000000TRKS 0-6  0000000000000007-13  0000004050607014-20  D0D0E0F000000021-27  0000000000000028-34 ; ; ; ONE 110FDIRECTORY SPpPD X  HP x X @   HLH @ 0HL0`?Py@ 0@8PR@ D= Pp)p~ ``x @+(C@ `8$u pB R~_pJ0 @@@ P@ ` @(@@ @B Tj*41    @@P@`@`N6@@@@b@ #+ @`BH(>4@``0@@@ `.p`z~k{{ "@H 2Q@c  @ $@"a!h(t_tP@ `awpCO3@'D @ 8<pn?7@y^WZ @xXpk j R_C#d@(L|}}/~?z_wo@'"0 l@A#h!x `` D}?1@ `@gPsi H> @Zz3@xgfn 6X3ipp00 `w `gC@ws`@7^w  B bwXw@IQ' `0@)8Xl2>A!`+D2z'v#VY_A@?|?x{ @Ht @}~/ l/0X@@xg@[ `p'`QV@7602 B  `?p_A=p<|sp0h @CCT  08@@pPBGQu#l}0@p> x~ v?BAph <4@L!@ n`8 `q? @pfMwh@oX  `@dA#&(pMZ9-.XXX8,P,R,N,TI```0 ɈuLSɕuJ (Ϡ 0 к)߅ФI`,0L)0 ƍ}ULƍ}`0`` f L` ECTOR )THIRTY 1201START OF DISK ALLOCATION? THFOUR 2310DISK T/S LIMITS !SEVNCEE 1FFETRACK $11 BIT MAP )EHTEE FFFFBIT MAPS FOR TK $12,13,14 ; ; ; MESG 8D8D87B3B1  "K RAM DRIVE"  8D00 ; ; ; RWPTCH 4C009BEAEA ; SIZE p@2 ,4 (@ r.eD j`(D RETURN ; ; $DELAY TAPEINFIRST GET A HI-BIT DELAY ^1 INCREMENT COUNT >2TOO BIG, EXIT TAPEINCOUNT HI LENGTH <1 ^2 RETURN WITH DELAY ; LASTIN 00STORES LAST CHANGE ; ; ;  CLEAR TABLE #$00 ^1 TABL,X  <1 LOOP #$00SET COUNT TO 0 DELAYGET HI DELAY TABL,XMOVE COUNT UP OUTTOO BIG, LEAVE KYBDKEYPRESS? LOOPNO, LOOP BACK ; "OUT TABL,XRESET LAST COUNT KBDSTRBTURN KYBD OFF AN ************ * * * SPECTRUM * * ANALYSER * * * ************ ; ; ; TABL $6000TABLE OF COUNTS KYBD $C000KEYBOARD KBDSTRB $C010STROBE TAPEOUT $C020 TAPEIN $C060 ; ;  $6100  $800 ; SPECT #$00GETNO, LOOP BACK ; NEWPAGE?#$00RESET Y TO 0 PAGEWHICH PAGE? FOUROWSPG2, BACK TO PAGE1 BASE+1ELSE FIX UP BASE #$20TO $60-$7F BASE+1 $FINE #$30DELAY SEVERAL BLANKS SWAIT PAGENOW ON PG2 GETAND GET MORE BYTES ; ; O FINE+1DEC DELAY ; DISPLAY BYTEGET SEVEN BITS CLEAR THE COLOR BIT #$7FALL BITS ON? >3YES, IGNORE, IS NOISE! (BASE),YADD BITS ALREADY (BASE),YON THE SCREEN $^3 #$0DDELAY SEVERAL BLANKS SWAIT  #$28END OF ROW? T ONE, EXIT  SYNCCAN'T GET A HI, GIVE UP ; GET GETBYTOK, GET A BYTE KYBDA KEY PRESSED? DISPLAYNO, SKIP KBDSTRBTURN IT OFF #$88<-- ? >2NO FINE+1YES, INC DELAY DISPLAYAND CONTINUE ^2 #$95--> ? DISPLAYN ROW NUMBER YLOW,X BASE YHIGH,X #$60CONVERT IT TO $40-$5F BASE+1 %^1 TAPEINGET THE FIRST PULSE <1AND IGNORE IT A LOT ; ; $STARTROW#$04COMPRESS 4 ROWS TO 1 COUNT ; $SYNC #$FFWAIT FOR A HI SIGNAL TAPEIN GETGOT #HBLNK $C1C2HORZ. BLANKING SIG ; ; ;  $1A00  $800 ; ; FAXER2 $C050TURN ON GRAFIX $C052TURN ON FULL GRAFIX $C04EDOUBLE HI-RES $C054PAGE 1 #$00SET UP ROW BASE #$00SET Y-REG TO 0 TOO PAGESET UP LEFT PAGE ROWANDF ROWS TO OR ROW $FCROW NUMBER BYTE $FDINPUT BYTE BASE $FEROW ADDRESS YLOW $1B00ROW BASE LSB YHIGH $1BC0ROW BASE MSB ; KYBD $C000KEYBOARD KBDSTRB $C010STROBE SPKR $C030SPEAKER TAPEIN $C060TAPE INPU* ************* * * * FAXER * * * * FACSIMILE * * DECODER * * * * BY * * W.TOOMEY! * * * ************* ; ; DLY $F9DELAY LENGTH !PAGE $FAPAGE WE'RE ADSSING COUNT $FBNO O      @@@ @@@@Ʃ@@z'@7@}0L9α Lz@P`p#ˠ͠ōL@ALH0L HL,HȽf8HG }FH>ȱH?,$8}`LIF>>F؍1}@?>>??>Ȋ>? @0@4@|@ 00@E* P`p ~0+H`@2A  !`I @ %PbB`RA @6 " @@@AQU"P! ` "zL L   !0P@P@  @  @0L  P `"  @XT@CDH:@zJE| ?B @e$( @H@`j@U@ Ra`"B($P DDPiHhAx{` @GH0(` 0p  @PnM`0 H}#@$jZ 5@HE_j7 y i|?i`<#M4 @@| Uj!R4`W @@Y2`s(404p4P@@@08 /` a`````0` FOUROWS PAGERESET TO PG1 BASE+1RESET BASE TO #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN DONEYES, EXIT YLOW,XNO, SET UP NEW BASEROW BASE 01DEFAULT 31K DRIVE ; LTABL B1B3"13" DIGITS RTABL B5B1"51" DIGITS ; ; ;  $C055TURN ON PAGE2 !STARTSCNAND DO ANOTHER SCREEN ; ; DONE #$01RESET MEMORY PBANK2 SBANK2 AND FINISH ; ; ; GETBYT #$07GET SEVEN BITS ^2 TAPEINGET INPUT SHIFT IT INTO CARRY BYTEAND BACK INTO THE BYTE  W,XNO, SET UP NEW BASEROW BASE YHIGH,X #$60CONVERT AGAIN BASE+1 #$00RESET Y TO 0 SPKRCLICK SPEAKER STARTROWAND START A ROW ; ; !NSCREEN SCREENDONE 2 SCREENS? DONEYES, EXIT #$02ELSE BRING IN HGR4 PBANK2 SBANK2 2 GETAND GET MORE BYTES ; ; FOUROWS PAGERESET TO PG1 BASE+1RESET BASE TO #$DF$40-$5F BASE+1 COUNTCOMPRESSED 4 ROWS? SYNCNO, SCAN AGAIN ; ; NEXTROW ROWMOVE DOWN A ROW ROW #$C0END OF SCREEN NSCREENYES,EXIT YLOACK NEWPAGE? ; ^4 DO (ORA, STA)  ROW <3 ; ; NEWPAGE?#$00RESET Y TO 0 PAGEWHICH PAGE? FOUROWSPG2, BACK TO PAGE1 BASE+1ELSE FIX UP BASE #$20TO $60-$7F BASE+1 FINE #$2EDELAY A BIT WAIT PAGENOW ON PG #$95--> ? DISPLAYNO FINE+1DEC DELAY ; DISPLAY BYTEGET SEVEN BITS #$FFALL BITS ON? >4IGNORE, IS NOISE! (BASE),YADD BITS ALREADY (BASE),YON THE SCREEN ^3 #$17DELAY WAIT  #$28END OF ROW? GETNO, LOOP B $STARTROW#$03COMPRESS 3 ROWS TO 1 COUNT ; SYNC SYNCRONSYNCRONISE GET GETBYTOK, GET A BYTE KYBDA KEY PRESSED? DISPLAYNO, SKIP KBDSTRBTURN IT OFF #$88<-- ? >2NO FINE+1YES, INC DELAY DISPLAYAND CONTINUE ^2 N SCREEN STARTSCN#$00SET UP ROW BASE #$00SET Y-REG TO 0 TOO PAGESET UP LEFT PAGE ROWAND ROW NUMBER YLOW,X BASE YHIGH,X #$60CONVERT IT TO $40-$5F BASE+1 %^1 TAPEINGET THE FIRST PULSE <1AND IGNORE IT A LOT ; ;PEAKER TAPEIN $C060TAPE INPUT WAIT $FCA8WAIT ROUTINE ; PBANK2 $C6 SBANK2 $C07D ; ; ; ;  $1A00  $800 ; ; FAXER2 $C050TURN ON GRAFIX $C052TURN ON FULL GRAFIX $C04EDOUBLE HI-RES $C054PAGE 1 #$01SET TOP SCREEWE'RE ADSSING COUNT $FBNO OF ROWS TO OR ROW $FCROW NUMBER BYTE $FDINPUT BYTE BASE $FEROW ADDRESS YLOW $1B00ROW BASE LSB YHIGH $1BC0ROW BASE MSB ; KYBD $C000KEYBOARD KBDSTRB $C010STROBE SPKR $C030S ************* * * * FAXER * * * * FACSIMILE * * DECODER * * * * BY * * W.TOOMEY! * * * ************* ; ; SCREEN $F8TOP OR BOT SCREEN DLY $F9DELAY LENGTH !PAGE $FAPAGE     ,P,R,N,TI```0 ɈqLOɕqJ (Ϡ 0 к)߅ФI`,0L%`0`` f L` @@@ @@@@Ʃ@@z'@7@}0L9α Lz@P`p#ˠ͠ōL?@ALH0L HL,HȽf8HG }FH>ȱH?,$8}`LIF>>F؍1}@?>>??>Ȋ>? @0@4@|@ #$01DONE, TURN OFF RAM SBANK2 #$9AMOVE DOS BUFFERS $9D01 #$A9PATCH DOS TO ALLOCATE $B292SECTORS ON TK $11 #$04NOW PATCH THE RWTS ^6 RWPTCH,X RWTS+4,X  <6 SELFMOD >7NOW ALTER CODE TO INITEXITFMEXITEXIT THRU F>4NO, SKIP $408C,X $4090,XYES THEY ARE $4094,X $4098,X ^4 #$02NOT DONE, LOOP <3 #$03NOW ODD BYTES $4003DOS VERSION #$FE $4006VOLUME NO. #$7A $4027MAX # OF T/S PAIRS #$01 $4037PAGES PER SECTOR CUP TO SECTOR C? <2NOT DONE, LOOP #$00NOW VTOC ^3 ONE,XSTORE LOTS OF $4001,XBYTES EVERYWHERE THIRTY,X $4030,X THFOUR,X $4034,X SEVNCEE,X $407C,X EHTEE,X $4080,X $4084,X $4088,X SIZETKS $15-$18 AVAIL? LOOP ^1 (BUF),YCLEAR MEM  <1 BUF+1MOVE UP A PAGE  <1NOT FINISHED, LOOP BUF+1NOW FILL IN DIRECTORY #$0E %^2 #$01ADD DIRECTORY POINTER #$11TRACK $11 (BUF),Y  SECTOR NUMBER (BUF),Y BUF+1  #$0B #$31 $D000 $D000 >1YES, HAVE 31K OF RAM #$00NO, SET ONLY 15K SIZE !^1 $C082TURN OFF BSW RAM #$02BRING IN AUX RAM SBANK2 #$40OK, NOW CLEAR MEMORY BUF+1 #$00 BUF #$10SET 16 PAGES CLEARED #$00SET Y FOR FOR LOOP #LOOP3 (BUF),YCOPY TO PRIM BUF PRIMBUF,Y  LOOP3 #$02BRING AUX MEM BACK IN SBANK2 (LOOP4 PRIMBUF,YNOW COPY TO AUX MEM (RAM),Y  LOOP4 DONEDONE, RETURN VIA RWTS ; ; ; ; RAMSTART$C08BTEST BSW RAM $C08COPY FROM RAM PRIMBUF,YINTO PRIM BUFFER  LOOP1 #$01NOW REMOVE AUX. MEM SBANK2 LOOP2 PRIMBUF,YAND COPY TO (BUF),YMAIN MEMORY  LOOP2 DONEDONE, RETURN VIA RWTS ; WRITE #$01REMOVE PAGED MEM SBANK2 #$00SET UP YWRITE DONE SET NO ERRORS  24SKIP SEC ERROR SET AN ERROR #$01TURN OFF ALL RAM SBANK2 $C082 #$00SET A-REG TO 0 #$60ALSO SET UP X-REG HNDLERR+1AND RETURN VIA RWTS ; !READ #$00SET UP Y FOR LOOP LOOP1 (RAM),Y$C08B >2OK, SKIP ; ^1 #$02BRING IN AUX SBANK2MEM ^2 #$00SET UP REST OF RAMADDRESS #$08NOW GET THE BUFFER (IOB),YADDRESS BUF  (IOB),Y BUF+1 CMDGET THE COMMAND #$01A READ? READ #$02A WRITE? ,Y USE AS AN OFFSET NOW GET THE SECTOR CHKTRK,XGET HI-NYBBLE ERRORILLEGAL TRK ERR (IOB),YADD LO-NYBBLE RAM+1 >1$40-$7F, USE AUX.MEM $C083TURN ON BSW MEM $C083 #$15TRACK $15 >2NO, SKIP $C08BYES, USE BSW BANK2 E DO MISSING INSTRUCTIONS $6F8 RWTS1AND RETURN TO RWTS ; ; ^1 #$0CGET CMD FROM IOB (IOB),Y #$04IS IT INITIALISE? >1NO, CONTINUE RAMSTARTELSE RESTART DRIVE ^1 CMDSTORE THE COMMAND #$04GET TRACK FROM IOB (IOB)COPY PROGRAM TO ^1 $4000,XDOS BUFFERS $9B00,X $4100,X $9C00,X  <1 RAMSTART ; ; ! $9B00THIS IS WHERE IT ENDS UP  $814 ; ; RAMDRIVE#$01SET UP Y TO GET (IOB),YSLOT NO. #$30SLOT 3? >1YES, CONTINUE $#$02ELSB00DOS'S PRIMARY BUFFER RWTS $BD00START OF RWTS RWTS1 $BD092ND ENTRY POINT ALLDONE $BE46SET NO ERRORS HNDLERR $BE48SET ERROR !COUT $FDEDCHAR OUT ROUTINE SBANK2 $C07DRAM SWITCH ; ; ;  $3FEC  $800 ; ; RAMLOAD #$00USER BUFFER $RAM $46ADDRESS OF RAM SECTOR IOB $48ADDRESS OF IOB ; ;OTHER EQUATES ; WARMSTRT $9DBFDOS WARMSTART FP $A57ADOS FP COMMAND +BUFNO $AAB1DEFAULT NO. OF DOS BUFFERS "FMEXIT $B37FFILE MANAGER EXIT %PRIMBUF $Bw**************** * * * 16K RAMDRIVE * * USING CAT * * AUX. MEMORY * * * * BY W.TOOMEY * * * **************** ; ; ;ZERO PAGE EQUATES ; "CMD $2CUSE TO HOLD COMMAND %BUF $3EADDRESS OF        i )DVt= Gx6 6 #%]}xG~`wq?.O@_4|}{`cra0z7_t@?>/o{}~gT~y<`pC{wd \?to|_q4'A/x.@-`_6=|Tp~]Pn@twh_8M!xt4kZ{ Pt_}=~tgbN~}!pO{9 l;lnP,99H?{CP(JVH'kVfww@tj?^@/@V_}\@`_9== n@R`]{;>~ }j)@ P}?~x}0 x{|PO~??8m5x z-~|@@o^y@_z>g~o_tp  W}=0 0XvU! ||a{ =@9xtp~{_ Ow=xo~~~ow[y}@ObOu?_@0\Rat`tJ x{{ P [`P_@[{tjfpnMKew. z, 0'$`Zx7z -#w@|{}>  0 k:/G @=;J`\pp.a?@}{{<hm_|@_~;sx~p/6}7u | f5=w @o~#? @!W(L;@o= }~@uozx:uXx=}=HPXm}DPy!oq@"`dz?7{^}PwD ~{ zo~ r@_ o 7\W/`?X|kl?$&kwoqlPW{;L|_C:@uu^{}?psp~j~{Zxs}??xg`?p{?o@s?@|/h' @ 0e<dX=?;[ P?wV@k3'~_9@?[[xzw Yb7polux?}WX??t_;`~0XU[@n_xU`7g0@l*v Mh; `T%} (|jx$?P BACK PCOUNTGET FINAL COUNT MOVE BIT 3 INTO CARRY   C= (COUNT>=8) BYTEADD TO OTHER BITS BITSDONE 7 BITS? <1NO, LOOP ELSE RETURN ; ;  ZERO #$0EDELAY 13 HBLNKS ^2 TAPEINGET AN INPUT #$80KILL BOT BITS MOVE BIT7 TO BIT0  !PCOUNTADD RESULT TO INPUT CNT PCOUNTAND SAVE IT! ^3 HBLNKDELAY ONCE <3 ^4 HBLNK <4 DONE 13 TIMES? <2NO, LOORTS1GOT 7BITS, RETURN #$18DELAY A BIT WAIT <2AND GET MORE BITS RTS1 RETURN TO CALLER ; ; SYNCRON TAPEINGET A RISING SYNCRONEDGE ^5 TAPEIN ____ <5I.E __I  ; ;   00RESET INPUT CNT PCOUNTTO 4C009BEAEA ; SIZE 01DEFAULT 31K DRIVE ; LTABL B1B3"13" DIGITS RTABL B5B1"51" DIGITS ; ; ;  ; ;  ONE 110FDIRECTORY SECTOR )THIRTY 1101START OF DISK ALLOCATION? THFOUR 2310DISK T/S LIMITS !SEVNCEE 1FFETRACK $11 BIT MAP )EHTEE FFFFBIT MAPS FOR TK $12,13,14 ; ; ; MESG 8D8D87B3B1  "K RAM DRIVE"  8D00 ; ; ; RWPTCH MESG,XGET A CHAR >5IF 0, END COUTPRINT IT OUT  <4AND LOOP ^5 FPDONE, DO AN FP ; ; ; "CHKTRK 00000000000000TRKS 0-6  0000000000000007-13  0000004050607014-20  D0D0E0F000000021-27  0000000000000028-34 ; ; ; M $^7 #$00SET THE ABOVE BRANCH !SELFMOD+1TO POINT TO INITEXIT BUFNOSET MAXFILES TO 2 ; ; ; STARTERR#$00SET OFFSET TO 0 PRNTMSG SIZEPUT SIZE DIGITS LTABL,XINTO MESG MESG+3 RTABL,X MESG+4 #$00SET OFFSET TO 0 ^4 ?CoR`w?=|z@EsA~_h>?x?{*pPx>wvA}sw={~Fo~px_N|z0l>@'}-`?@/a@` t_w0s_8P_?FZw~h|h@/wwp@xpo@7@_E:i|On?OE]}@?gg`,}P<` #r~|C@8@~oSk|O{0g~}m 0 v0{hXvT([P t`?== PB~@`'pp_LT}< `<U|| x|Qn ~`N^_;piu}o};<-ww~}~`f ;`E;jx?>Cx,W(dwhXOg 8T?@}4.P\~ jj|0?Y @ O{z3{x]?@ _uwcutsp_w5DPkUY"tPg}>0t}}}{y`H=]k y?5Tk ` 0IB;,O(@}}ypp_o~@_G?n^tX1yP1?P-q|@; .Cl=\d@a<5Z}/# ~;@- pg?~8 6/z=@zt?_o~@>@O|?>wz?r n}yxo`o07`i7pzxo0}:kt{>`En$uzMc"p>(k9X[ {l6$$x}0` `=@Vvwk;o_;o;zoy@} -` ;~AgT3A~P|@@~{t g @/@[A=}`<*~| }eOxh|W.mjyts@`{;01@lo}}Zzu~_ pa~@~x` P?{@<xB@}@4~ 7P{ r @~ ~__?M~?P ff5 gy@tc[??=|k`O`zouP m|@?{{ptw?T=g@#^++tPP!h@]|c>=u`{zu>`X|Z4f/@~xgX/`,P,R,N,TI``  ɈvLLɕv (LV . в)߅УI`,0L)0 ƍ}ULƍ}`` f L```0`Ӡ0JJJJf  ? @0@4@|@@@@˜ @@@@Ʃ@@z'@7@}Ɯ0LZα˜̜Μ Lz@P`p#ˠ͠ōL@ALH0L HL,HȽ8HG }FH>ȱH?,+$8}`LIF}>թ}>}F𷍋1˜}@?>>??>Ȋ> flags and constants ; #15 #0 LOOP ZSTORE,Y  LOOP /BUFSTART ZSTORE+1 ZSTORE+3 #80 WIDTH #$80 LFFLG #$80 STATMSK #0 OKSTAT #$89 WAKEUP ; ; Initialise printer interface "; Necessary for serial interHIMEM: ;  COUNT #1 LINNUM COUNT+1 #0 LINNUM+1 RSHM ; #; Move the working part of SPOOLER ; #BEGIN A1L /BEGIN A1L+1 #END+1 A2L /END+1 A2L+1 COUNT A4L COUNT+1 A4L+1 #0 MOVE ; !; Initialise  COUNT #$27 STOR1+1 STOR2+1 STOR3+1 STOR4+1 COUNT+1 #$01 STOR1+2 STOR2+2 STOR3+2 STOR4+2 ; ; Make reset clear buffer ;  COUNT #$00 RSTVEC COUNT+1 #$00 RSTVEC+1 #$A5 RSTVEC+2 ; ; Reset PTCHPNT3+2 #$EA NOP PTCHPNT3+3 ; ; Modify all calls to the ; print subroutine ;  COUNT #$DA PRNT1+1 PRNT2+1 PRNT3+1 COUNT+1 #$01 PRNT1+2 PRNT2+2 PRNT3+2 ; ; Modify all calls to the ; spooling subroutine ;S state 2 output ; handler so we can caputure ; output bound for the printer ; (state 2 handles output which !; is not being written to a file ; and is not a DOS command) ; #$4C JMP PTCHPNT3  COUNT #$92 PTCHPNT3+1 COUNT+1 #$0001 PTCHPNT1+2 ; #; Patch the BASIC character fetch ; routine so that we can print ; while BASIC is running ; ! EAEAEAEAEAEAEAEASPACE FILLERS  EAEAEAEAEAEAEAEA  COUNT #$B1 PTCHPNT2 COUNT+1 #$01 PTCHPNT2+1 ; ; Patch the DOat which the ; relocated program will run. ;  HIMEM+1 #3 COUNT+1 HIMEM COUNT ; #; Patch the DOS keyboard intercept ; routine so we can print while ; waiting for keybouaard input ;  COUNT #$90 PTCHPNT1+1 COUNT+1 #$OOLER run ; at any location, the loader ; must calculate some addresses ; and modify DOS accordingly. ; ; ----------------------------- ; ; Get HIMEM and modify program ; to run $300 below it - use !; COUNT as temporary storage for ; the address 8 ; BCKSPC $88 LFEED $8A RETURN $8D CTRLQ $91 SPACE $A0 ; ;  $6000  $800 ; ; ---------------------------- ; This is a loader program ; which modifies DOS and ; initialises the spooler ; program. ; ; In order to let SPB3 REGRST $9FBA STATE $AA52 AREG $AA5C KBD $C000 RAMOFF $C082 WRTRAM $C081 RDRAM $C084 PRDATA $C091 PRINIT $C100 PRSTATUS $C1C1 BUFSTART $D000 RSHM $F28C MOVE $FE2C SETVID $FE93 IORTS $FF5$00 LAG LEAD+2 CH $24 CSWL $36 A1L $3C A2L $3E A4L $42 LINNUM $50 HIMEM $73 PTCHPNT2 $BB STACK $100 RSTVEC $3F2 DOSWRM $9DBF PTCHPNT1 $9EAB PTCHPNT3 $9F23 ECHO $9FA4 DOSEXIT $9FT#; ************************* ; * * ; * SPOOLER * ; *  * ; * A SOFTWARE PRINT * ; * BUFFER SYSTEM * ; * * ; ************************* ; ; LEAD         !!! ! ! ! ! !!!!!!!!!" " " """""? @0@4@|@@@@˜ @@@@Ʃ@@z'@7@}Ɯ0LZα˜̜Μ Lz@P`p#ˠ͠ōL?@ALH0L HL,HȽ8HG }FH>ȱH?,+$8}`LIF}>թ}>}F𷍋1˜}@?>>??>Ȋ>  TABFLG ENDSTORE ; ; Increment column count for ; printable chars and set C for ; end of line ; #BCKSPC STR1 PCH ENDSTORE  PCH CH STR1 #SPACE ENDSTORE PCH  PCH CH WIDTH ENDSTORE ; #; -------1 LEAD+1 RSZ1 ; ; Wraparound to start of buffer ; /BUFSTART LEAD+1 ; ; Restore zero page ; RSZ1 #3 LOOP2 LEAD,X ZSTORE,X ZSTORE,X LEAD,X  LOOP2  ; ; Increment counter ; COUNT WT2 COUNT+1 WT2 the buffer ; ; Put pointers on page zero ; STORIT #3 LOOP1 LEAD,X ZSTORE,X ZSTORE,X LEAD,X  LOOP1  ; ; Store the character ; WRTRAM WRTRAM #0 (LEAD),Y RAMOFF ; ; Increment lead pointer ; LEAD RSZstate 0 if ; the program has sent a CR ; CHKCR #RETURN DONE #0 STATE ; ; Reset Ch and send LF after CR ; FEED #0 CH PCH LFFLG DONE #LFEED STOR4 STORIT DONE DOSEXIT ; ; Subroutine to store the char ; in TABFLG AREG STOR2 STORIT CHKCR ; ; If we have printed up to the ; width of the page, send CR ; and LF, but do not set DOS ; state 0 ; #RETURN STOR3 STORIT FEEDAlways ; ; Replacement for DOS state 2 ; handler -set to OTAB NOTAB ; ; Set flag for tab-in-progress ; TABFLG ; ; Store spaces for a tab ; #SPACE PCH STOR1 STORIT CHKROOM Always ; ; If we don't need a tab, just ; clear the tab flag, then get ; the character and store it ; NOTAB k the user-requested ; printing position ; TAB CH CHKTAB WIDTH GOODTAB ; ; Correct if necessary ; WIDTH CH CHKTABAlways ; ; If the users CH is different #; from our CH, the user must want ; us to tab ; GOODTAB PCH NKEUP CHKROOM #$80 CMDFLG DOSEXIT ; ; Check for running out of room ; CHKROOM COUNT+1 #$2F TAB WAIT ; #; No more room, output 1 character ; WAIT PRSTATUSParallel STATMSK OKSTAT WAIT PRNT1 PRINTONE ; ; Chec------------------ ; SPOOL CSWL+1 #$C1Slot 1 CHKCMD ; ; Replacement for DOS state 2 ; handler ; AREG #RETURN OUT1 #0 STATE OUT1 ECHO ; ; Check for interface command ; CHKCMD CMDFLG CMD1 RELAY AREG WARELAY CMD0 ; $; If not a command, reset flags and !; treat it like a printable char ; NOTCMD #0 CMDFLG WDTHFLG STATE ; "; ------------------------------- "; Entrance to the spooler routine ; Output from DOS comes here "; ------------- #$0A NOTCMD ; ; Use numerals to calculate ; printer line length ; WDTHFLG ADD WIDTH  WDTHFLG EXIT ADD TEMP WIDTH    WIDTH  WIDTH TEMP WIDTH DOSEXIT ; #; Relay to get from CHKCMD to CMD0 ; MD1 WT1 WAKEUP  EXIT ; %; Command K shuts off LF after ; CMD1 AREG #"K" CMD2 LFFLG ENDCMD ; ; Ignore I and N commands ; CMD2 #"I" ENDCMD #"N" ENDCMD ; ; Check for a numeral ;  #$B0 NOTCMDMDFLG WDTHFLG EXIT ; ; Shift CMDFLG to indicate ; not first character ; CMD0 CMDFLG AREG ; "; Change interface wakeup char if "; command is a control char other ; than LF,FF, ; #SPACE CMD1 #LFEED WT1 #RETURN+1 C---------------------------- ; ; !BEGIN $6112 should ORG here RESET /BUFSTART ZSTORE+1 ZSTORE+3 #0 ZSTORE ZSTORE+2 COUNT+1 COUNT PCH DOSWRM ; !; Routine for interface commands ; EXIT DOSEXIT ENDCMD #0 C $3C6 PCH $3C7 WIDTH $3C8 LFFLG $3C9 WAKEUP $3CA STATMSK $3CB OKSTAT $3CC CMDFLG $3CD WDTHFLG $3CE TABFLG $3CF ; ; !; ------------------------------ !; This is the physical beginning ; of the spooler program !; --faces ; #RETURN PRINITSlot 1 SETVID ; ; ; ------------------------- ; These flags and constants ; are on page 3, at $3BE to ; $3CF ; ------------------------- ; ; ZSTORE $3BE COUNT $3C2 XSV $3C4 YSV $3C5 TEMP D` l|?gtcy`yH}@`wsp~[_[zJ~p:n_w {_?~_q}V=Xsvg;`}p` /p`_o47vml}{x@{@to~}~<:7ZxP;zqt`?oG=@`6}`~`t @`@~~}~[?@t()~=pkq~i?p~}}.;P|z|`<}!~o@ {@}>}:|@vqy llx @ p}@~/ R/?6no~S0}@^M~lhwn:wX==`lOxo;4l^0 HPc>`_>ZWHw6 _duk@)y0Vwxid (|-`[$X&.h#v (y}~jzp<@,~t Hz_4D uWi|x @ @~|'g0@yO@~{ohOqvlX?0(000000000  000000000000  000000000000  000000000000  000000000000 END ZSTORE,X LEAD,X  LOOP4 ; ; Decrement count ; COUNT COUNT #$FF D1 COUNT+1 ; ; Send the character ; D1 PRDATAParallel YSV XSV  ; ; Reserve a little space -some !; printers need more instruction ;  000 the buffer ; RDRAM #0 (LAG),Y  RAMOFF ; ; Increment lag pointer ; LAG RSZ2 LAG+1 RSZ2 ; #; Wraparound to $D000 if necessary ; /BUFSTART LAG+1 ; ; Restore zero page ; RSZ2 #3 LOOP4 LEAD,X ZSTORE,X F117CAT MODIFICATION  EA  #$30  #$D0 FETCH1 ; "; Subroutine to print a character ; ; Put pointers on page zero ; PRINTONEYSV XSV #3 LOOP3 LEAD,X ZSTORE,X ZSTORE,X LEAD,X  LOOP3 ; "; Get a character from1Slot 1 FETCH ; ; Check for empty buffer ; COUNT+1 COUNT FETCH ; ; Check printer status ; PRSTATUSParallel STATMSK OKSTAT FETCH ; ; Send a char to the printer ; PRNT3 PRINTONE ; ; Back to BASIC ; FETCH $INTONE  PRINT ; ; ----------------------------- "; Entrance to other print routine ; ; BASIC checks here during each ; character-fetch rountine ; ----------------------------- ; PRINT2 ; ; Do not print while spooling ; CSWL+1 #$Cling or buffer is #; empty -return to input by way of ; register restore routine ; INPUT REGRST ; "; Check keyboard & printer status ; Go where first needed ; HOLD KBD INPUT PRSTATUSParallel STATMSK OKSTAT HOLD PRNT2 PR------------------------- #; Entrance to one printing routine ; !; DOS checks here before calling ; for a character to be input #; -------------------------------- ; ; Check for empty buffer ; PRINT COUNT+1 COUNT HOLD ; #; Keyboard is cal RDBITGET ONE CHANGE RDBIT RTS1TOO BIG, RETURN TAPEIN LASTINA TRANSITION? RDBITNO, LOOP LASTINFIX UP LASTINAND STORE RTS1 AND RETURN ; LASTIN 00STORES LAST CHANGE ; ; ;  CLEAR TABLE #$00 ^1 TABL,X  <1 LOOP #$00SET COUNT TO 0 RD2BITGET TWO CHANGES TABL,XMOVE COUNT UP OUTTOO BIG, LEAVE KYBDKEYPRESS? LOOPNO, LOOP BACK ; OUT KBDSTRBTURN KYBD OFF AND RETURN ; ; RD2BIT  ************ * * * SPECTRUM * * ANALYSER * * * ************ ; ; ; TABL $6000TABLE OF COUNTS KYBD $C000KEYBOARD KBDSTRB $C010STROBE TAPEOUT $C020 TAPEIN $C060 ; ;  $6100  $800 ; SPECT #$00"" "