> PatchRFS 1.04  Patch RamFS to: 5 v1.01 repair OSWORD &77/&7F operation over Tube (0 v1.02 claim and release Tube for transfers 2< v1.03 osgbpb claim/release Tube, correct error numbers mcode%?&3FFF:spare%=spare%+1 `mcode%?spare%=13: A%=11 12: $(mcode%+spare%-A%)=0+"END_OF_ROM"+0,A%):spare%=spare%-A%  A%:spare%=spare%+&8000 *"Spare ROM space starts at &";~spare% ( spare%>&BF00:"Not enough space": : off%=&8000-mcode% % A%=mcode% mcode%+spare%-&8000 ) !A%=&D008C960:service08 =A%+off%+1 ) !A%=&30FD8F2C:osword7F =A%+off%-3 ) !A%=&F04BC968:osw77_RW3 =A%+off%+8 ) !A%=&2007A260:restoreBEC5=A%+off%+1 ' !A%=&18040620:tubeXfer =A%+off% "' !A%=&60ABC920:OO_L10 =A%+off% ,) !A%=&60D8B0FD:FFu_L13 =A%+off%+1 6' !A%=&FBB009C9:gbpb =A%+off% @) !A%=&FDA061A2:gbpbTube =A%+off%+4 J A% TOO_L5 =OO_L10-135 ^FFu_L11 =FFu_L13-38 h1uSync =mcode%!(OO_L10-&8000+1) &FFFF r4readRAMblock =mcode%!(osw77_RW3-&8000-2) &FFFF |4writeRAMblock=mcode%!(osw77_RW3-&8000+1) &FFFF " "service08 =&";~service08 ! "osword7F =&";~osword7F " "osw77_RW3 =&";~osw77_RW3 % "readRAMblock =&";~readRAMblock & "writeRAMblock=&";~writeRAMblock $ "restoreBEC5 =&";~restoreBEC5 ! "tubeXfer =&";~tubeXfer  "uSync =&";~uSync  "OO_L5 =&";~OO_L5  "OO_L10 =&";~OO_L10  "FFu_L11 =&";~FFu_L11  "FFu_L13 =&";~FFu_L13  "gbpb =&";~gbpb ! "gbpbTube =&";~gbpbTube : ) org(A%):P%=A%:O%=P%-&8000+mcode%: & P=4 7 2 0: :org(&800F) D'[OPT P:EQUS ver$+" (30 May 2016)":] N: Xorg(osword7F+3) b6 [OPT P:LDA #&FF:NOP:]:REM TEST Remove DTRAP test l: vorg(osw77_RW3-3)  [OPT P JMP osw77_Read JMP osw77_Write ] : org(spare%)  [OPT P .osw77_Read .osw77_Write (\ A =command, bit7=0, b3=action \ &C2/3 =byte count \ &C4/5 =RAM page \ &CF =drive \ &BE/F =address low  \ &FD74/5=address high \ Scratch RAM paged in  : ** LDX &027A \ Tube present? 4/ BMI osw7F_TubeOk \ Yes, check address > LDX #&FF H@ STX &FD74 \ No Tube, force address to &FFFFxxxx R STX &FD75 \.osw7F_TubeOk f) PHA \ Save command p* LDA &FD74 \ Check address z &FD75  CMP #&FF ' BEQ osw7F_NoTube \ I/O memory : ' JSR TubeClaim \ Claim Tube / PLA \ Get direction byte ' A #&80 \ Flag 'Tube'  PHA .osw7F_NoTube : ( PLA \ Get command  PHA + #8 \ Check &4B or &53  BNE osw7F_CallWrite  JSR readRAMblock  JMP osw7F_called .osw7F_CallWrite $ JSR writeRAMblock .: 8.osw7F_called B3 PLA \ Get transfer flag back L) JMP TubeRelease1 \ Release Tube V: `.StoreToTube \ 6+6 j JSR TubeDelay \ 6+6 t JSR TubeDelay \ 6+6 ~ JSR TubeDelay \ 6+6 ! STA &FEE5 \ 48 clocks  RTS .FetchFromTube \ 6+6  JSR TubeDelay \ 6+6  JSR TubeDelay \ 6+6  JSR TubeDelay \ 6+6 ! LDA &FEE5 \ 48 clocks .TubeDelay  RTS : .TubeClaim 9 LDA #&C0+&0F:JSR &406 \ Claim ID=&0F for RAMFS 5 BCC TubeClaim \ Loop until claimed  .TubeNoRelease  RTS .TubeRelease (A LDA &BB \ Check zpm7, &00 if not claimed 2.TubeRelease1 <= BPL TubeNoRelease \ Not claimed, don't release F.TubeRelease2 P; LDA #&80+&0F:JMP &406 \ Release ID=&0F for RAMFS Z: d.TubeAction n- PHA:JSR TubeClaim:PLA \ Claim Tube x6 JMP &406 \ Start data transfer :  .TubeDone  JSR TubeRelease  JSR restoreBEC5  RTS : .USBReleaseWR  JSR uSync  JSR TubeRelease  RTS .USBReleaseRD  BCC USBRelease3  JMP FFu_L11 .USBRelease3  JSR TubeRelease  RTS ": , .gpbClaim 6 PHA:JSR TubeClaim @ PLA:JMP &406 J .gpbCall T CMP #9:BCS gpbDone ^ JSR gbpb+4 h BIT &FD81:BPL gpbDone r PHP:PHA:JSR TubeRelease2 | PLA:PLP  .gpbDone  RTS :  .chkOpt LDY #0:LDA (&F2),Y CMP #"-":BEQ chkOptDone  .chkOptLp LDA (&F2),Y:INY CMP #32:BEQ chkOptSpc CMP #13:BNE chkOptLp LDY #0:RTS .chkOptSpc LDY #255:LDA #"-" .chkOptDone RTS : &BRK:EQUS "END_OF_ROM":BRK 0] : P D: N"Adding patches"; Xoff%=&8000-mcode% baA%=tubeXfer-off%:A%?1=TubeAction:A%?2=TubeAction 256 :';~A%+off%;" TubeAction"; lcA%=OO_L10-off% :?A%=&4C:A%?1=USBReleaseWR:A%?2=USBReleaseWR 256:';~A%+off%;" USBReleaseWR"; vcA%=FFu_L13-off% :?A%=&4C:A%?1=USBReleaseRD:A%?2=USBReleaseRD 256:';~A%+off%;" USBReleaseRD"; aA%=gbpbTube-off%:?A%=&20:A%?1=gpbClaim:A%?2=gpbClaim 256 :';~A%+off%;" GBPB Claim"; dA%=gbpb-off% :?A%=&4C:A%?1=gpbCall:A%?2=gpbCall 256 :';~A%+off%;" GBPB Dispatch"; eA%=OO_L5-off%+17:?A%=&BE:A%?1=0:A%=OO_L5-off%+31:?A%=&BF:A%?1=0 :';~A%+off%;" TubeSave USB"; : 6 A%=mcode% mcode%+spare%-&8000:W%=!A% &FFFFFF p ?A%=&20: (A%!1 &FFFF)=restoreBEC5:?A%=&4C:A%?1=TubeDone:A%?2=TubeDone 256:';~A%+off%;" restoreBEC5"; ` W%=&FEE58D:?A%=&20:A%?1=StoreToTube :A%?2=StoreToTube 256 :';~A%+off%;" StoreToTube"; b W%=&FEE5AD:?A%=&20:A%?1=FetchFromTube:A%?2=FetchFromTube 256:';~A%+off%;" FetchFromTube"; K W%=&0DF0BC:?A%=&A0:A%?1=0:A%?2=&EA :';~A%+off%;" LDY &DF0,X"; K W%=&0DF0BD:?A%=&A9:A%?1=0:A%?2=&EA :';~A%+off%;" LDA &DF0,X"; B !A%=&30302E31:A%?3=ver$,4,1) :';~A%+off%;" version"; F !A%=&69643C28:!A%=&7269643C:A%!4=&001B1B3E:';~A%+off%;" "; F !A%=&72643C28:!A%=&7672643C:A%!4=&001B1B3E:';~A%+off%;" "; 7 !A%=&45455246:A%?-1=&02:';~A%+off%;" EX ";  8 !A%=&504D5544:A%?6=&02:';~A%+off%;" DUMP "; ? !A%=&4F505845:A%?8=&1A:';~A%+off%;" EXPORT ";  ? !A%=&4F504D49:A%?8=&1A:';~A%+off%;" IMPORT "; *8 !A%=&5453494C:A%?6=&02:';~A%+off%;" LIST "; 48 !A%=&45505954:A%?6=&02:';~A%+off%;" TYPE "; >W !A%=&2DC9F2B1:A%!-2=&20EA:?A%=chkOpt:A%?1=chkOpt 256:';~A%+off%;" chkOptions"; HK (A%?1 -2)=&F8: (?A% &9C)=&84:A%?1=A%?1-2:';~A%+off%;" &F8/&F9"; RK (A%?1 -2)=&F8: (?A% &BE)=&24:A%?1=A%?1-2:';~A%+off%;" &F8/&F9"; \M A%?1=&F8: (?A% &DF)=&91:A%?1=A%?1-2 :';~A%+off%;" (&F8),Y"; f= !A%=&67616D49:A%?-1=&E1 :';~A%+off%;" Image too long"; p6 !A%=&44206F4E:A%?-1=&D3 :';~A%+off%;" No disk"; z? !A%=&6C655320:A%?-16=&F8:';~A%+off%;" DFS not selected";  A%: : 0 rom$,1)="0":rom$=rom$, rom$-1)+ver$,4) 7"*Save ";rom$;"fx ";~mcode%;" ";~O%;" 0 FFFBBC00"