10 REM >Patch121
   20 REM Patch Z80 Tube Client v1.20
   30 REM J.G.Harston
   40 REM Fixes:
   50 REM  Bad check for ROM type byte on execute
   60 REM  Unbalanced stack entering raw code
   70 REM  Truncated OSWORD 5,14,15
   80 REM  Corrected error numbers
   90 REM  SEEK0 overwrites stack
  100 REM  Execute patch will co-exist with BBC BASIC patch
  110 
  120 DIM mem% &FFF,ctrl% 19,name% 19
  130 OSCLI"Load Client120 "+STR$~mem%
  140 IF mem%!&2A6<>&30322E31:PRINT"Not v1.20 Client ROM":END
  150 PROCasm
  160 OSCLI"Save ClientZ80 "+STR$~mem%+"+1000 0 FFFBBC00"
  170 OSCLI"Stamp ClientZ80"
  180 END
  190 :
  200 DEFPROCasm
  210 REBOOT=&FCAF:PROG=&FCA8
  220 FOR P=0 TO 1
  230   P%=mem%-&F000+&F7FC
  240   [OPT P*3
  250   \ &F7FC: LD A,(HL):LD DE,copystr-mem%+&F000:LD B,4
  260   \ &F802: .loop
  270   \ &F802: LD A,(DE):CP (HL):JR NZ,LF826
  280   \ &F806: INC HL:INC DE:DJNZ loop
  290   \ &F80A: POP HL:DEC HL
  300   \ &F80C: LD A,(REBOOT)
  310   \ &F80F: OR A:JR NZ,LF829
  320   \ &F812: LD A,(HL):AND &4F
  330   \ &F815: CP &40:JR C,boot
  340   \ &F819: CP &48:JR NZ,boot
  350   \ &F81D: .code_enter
  360   \ &F81D: CP A:LD HL,(PROG):JP (HL)
  370   \ &F822:
  380   \ &F822: .boot
  390   \ &F822: CP A:JP &F4A9
  400   \ &F823: \JP RunExec2 :\ BBC BASIC patch
  410   \ &F826: \JP RunExec1 :\ BBC BASIC patch
  420   \ &F826: .LF826
  430   \ &F826: POP HL:JR code_enter
  440   \ &F829:
  450   \ &F829: .LF829
  460   \ &F829: XOR A:LD (REBOOT),A
  470   \ &F82D: LD A,(HL):AND &4F
  480   \ &F830: CP &40:JR C,LF83D
  490   \ &F834: CP &48:JR NZ,LF83D+25
  500   \ &F838: LD A,&01:JR code_enter
  510   \ &F83C: NOP
  520   \ &F83D: .LF83D
  530   ]
  540   P%=mem%-&F000+&FF22
  550   [OPT P*3
  560   \ &FF22: .copystr
  570   \ &FF22: DEFB 0:DEF"(C)"
  580   \ &FF26:
  590   ]
  600   P%=mem%-&F000+&F300:[OPT P*3:DEFB 17:]
  610   P%=mem%-&F000+&F50A:[OPT P*3:DEFB 200:]
  620   P%=mem%-&F000+&F629:[OPT P*3:NOP:NOP:NOP:]
  630   P%=mem%-&F000+&F83E:[OPT P*3:DEFB 249:]
  640   P%=mem%-&F000+&F857:[OPT P*3:DEFB 249:]
  650   P%=mem%-&F000+&FA35:[OPT P*3:AND &FF:]
  660   P%=mem%-&F000+&FC74+5 :[OPT P*3:DEFB 4:]
  670   P%=mem%-&F000+&FC74+14:[OPT P*3:DEFB 32:]
  680   P%=mem%-&F000+&FC74+15:[OPT P*3:DEFB 32:]
  690   P%=mem%-&F000+&FC88+14:[OPT P*3:DEFB 32:]
  700   P%=mem%-&F000+&F2A6:[OPT P*3:DEF"1.21":]
  710   P%=mem%-&F000+&F730:[OPT P*3:DEF"1.21":]
  720 NEXT
  730 X%=ctrl%:Y%=X%DIV256:$name%="OswFFv3"
  740 !X%=name%:A%=5:IF ((USR&FFDD)AND&FF)<>1:ENDPROC
  750 oswlen%=X%!6-X%!2:osw%=&FDDA-oswlen%
  760 in%=OPENIN("OswFFv3"):IF in%=0:ENDPROC
  770 FOR A%=0 TO oswlen%-1:mem%?(osw%-&F000+A%)=BGET#in%:NEXT A%
  780 CLOSE#in%
  790 P%=mem%-&F000+&F5B2
  800 [OPT 3:LD DE,osw%:LD B,oswlen%:]
  810 ENDPROC