10 REM > Tape/src 1.00
   20 REM Tape calls from Basic without error
   30 :
   40 ERRSP=23613
   50 DIM mcode% &100
   60 TapeBuffer=&5BEF
   70 FOR P=0 TO 1
   80   P%=23300
   90   O%=mcode%
  100   [OPT P*3+4
  110   .L23300:JP TapeInfo   ; TapeInfo entry
  120   .L23303:JP TapeLoad   ; TapeLoad entry
  130   .L23306:JP TapeHeader ; TapeHeader entry
  140   .L23309               ; TapeSave entry
  150   :
  160   .TapeSave
  170   CALL TapeData:JR TapeSaveGo
  180   .TapeHeader
  190   CALL TapeHdr
  200   .TapeSaveGo
  210   LD HL,(ERRSP):PUSH HL
  220   CALL TapeSaveCall
  230   JR TapeReturn
  240   .TapeSaveCall
  250   LD (ERRSP),SP:JP &04C2 ; Call SV_BYTES
  260   :
  270   .TapeLoad
  280   CALL TapeData:JR TapeLoadGo
  290   .TapeInfo
  300   CALL TapeHdr
  310   .TapeLoadGo
  320   LD HL,(ERRSP):PUSH HL
  330   SCF:CALL TapeLoadCall
  340   .TapeReturn
  350   POP HL:LD (ERRSP),HL
  360   LD BC,0:RET C           ; BC=0 - Ok
  370   INC C:CALL &1F54:RET NC ; BC=1 - BREAK
  380   INC C:RET               ; BC=2 - Block not loaded
  390   ;
  400   .TapeLoadCall
  410   LD (ERRSP),SP:JP &0556 ; Call LD_BYTES
  420   :
  430   .TapeHdr
  440   LD IX,TapeBuffer:LD DE,17
  450   XOR A:RET
  460   .TapeData
  470   LD IX,(TapeBuffer+13)
  480   LD DE,(TapeBuffer+11)
  490   LD A,&FF:RET
  500 ]NEXT
  510 END
  520 
  530 
  540 REM Create the machine code:
  550 FOR a=23300 TO 23390:READ b:POKE a,b:NEXT a
  560 DATA 195,42,91,195,37,91,195,18,91,205,84,91,24,3,205,75,91
  570 DATA 42,61,92,229,205,30,91,24,23,237,115,61,92,195,194,4
  580 DATA 205,84,91,24,3,205,75,91,42,61,92,229,55,205,66,91,225
  590 DATA 34,61,92,1,0,0,216,12,205,84,31,208,12,201,237,115,61
  600 DATA 92,195,86,5,221,33,239,91,17,17,0,175,201,221,42,252,91
  610 DATA 237,91,250,91,62,255,201
  620 
  630 REM Load the next file header to 23535-23551:
  640 LET bc=USR 23300
  650 
  660 REM Load next data block its own address:
  670 LET bc=USR 23303
  680 
  690 REM Load next data block to address 'start':
  700 POKE 23549,INT(start/256):POKE 23548,start-256*PEEK23549
  710 LET bc=USR 23303
  720 
  730 REM Save a file header from 23535-23551:
  740 LET bc=USR 23306
  750 
  760 REM Save a data block from its own address:
  770 LET bc=USR 23309
  780 
  790 REM Save a data block from address 'start', size 'length':
  800 POKE 23549,INT(start/256):POKE 23548,start-256*PEEK23549
  810 POKE 23547,INT(length/256):POKE 23546,length-256*PEEK23547
  820 LET bc=USR 23309
  830 
  840 REM On return from calls:
  850 REM bc=0 - Ok
  860 REM bc=1 - BREAK
  870 REM bc=2 - Block not loaded
  880