10 REM > Atom/src
   20 REM Load System Kernel and System Basic
   30 REM *EmulateTube Atom (<filename>)
   40 REM or *Atom (<filename>) within Tube
   50 :
   60 IF PAGE>&8000:SYS "OS_GetEnv"TOA$:IFLEFT$(A$,5)<>"B6502":OSCLI"B6502"+MID$(A$,INSTR(A$," "))
   70 ON ERROR REPORT:PRINT" at line ";ERL:END
   80 :
   90 kernel$="Kernel65"
  100 sbasic$=":Software.BBCBasic.System.SBASIC2":brk%=&3403
  110 save$  ="Atom65"
  120 title$ ="65Tube"
  130 PROCassem
  140 :
  150 kernel$="KernelCP"
  160 sbasic$=":Software.BBCBasic.System.SBASIC2":brk%=&3403
  170 save$  ="AtomCP"
  180 title$ ="6502 CoPro"
  190 PROCassem
  200 END
  210 :
  220 DEFPROCassem
  230 IOADDR=&FEE0
  240 DIM mcode% &5000
  250 FOR P=0 TO 1
  260   P%=&400:O%=mcode%
  270   [OPT P*3+4
  280   .exec%
  290   JMP Start:BRK:BRK:BRK
  300   EQUB &42:EQUB copy-exec%
  310   EQUB &10:EQUS "Atom/System Environment for "+title$
  320   EQUB &00:EQUS "0.10 (12-Feb-2012)"
  330   .copy
  340   EQUB &00:EQUS "(C)J.G.Harston":BRK
  350   EQUS STRING$(12-LENtitle$,CHR$0)
  360   .ctrl
  370   EQUW &100:EQUD 0:EQUB &FF   :\ Load to file's address
  380   .Start
  390   LDA #1:LDX #&00
  400   LDY #0:JSR &FFDA            :\ Find command line
  410   .cmdlp
  420   TYA:PHA
  430   LDX #0:LDY #0
  440   LDA #5:JSR &FFF1            :\ Fetch byte from I/O
  450   INC &00:BNE next:INC &01:BNE next
  460   INC &02:BNE next:INC &03
  470   .next
  480   PLA:TAY
  490   LDA &04:STA &100,Y          :\ Store locally
  500   INY:CMP #13:BNE cmdlp       :\ Loop until <cr>
  510   LDA &100:CMP #13
  520   PHP:BEQ nofile              :\ No filename
  530   LDX #ctrl AND 255
  540   LDY #ctrl DIV 256
  550   LDA #&FF:JSR &FFDD          :\ Load file
  560   LDA ctrl+6:STA entry+0      :\ Set entry address
  570   LDA ctrl+7:STA entry+1
  580   .nofile
  590   LDA #12:JSR &FFEE
  600   SEI
  610   LDA #buffer AND 255:STA &00 :\ src=buffer
  620   LDA #buffer DIV 256:STA &01
  630   LDY #&00:STY &02            :\ dest=&F800, Y=0
  640   LDA #&F8:STA &03
  650   .loop1
  660   LDA &03
  670   CMP #IOADDR DIV 256:BNE copymos  :\ Skip IO addresses
  680   CPY #IOADDR AND 255:BCS skipmos  :\  at &FEF0-&FEFF
  690   .copymos
  700   LDA (&00),Y:STA (&02),Y     :\ copy MOS
  710   .skipmos
  720   INY:BNE loop1
  730   INC &01:INC &03:BNE loop1
  740   PLP:BNE enter               :\ file loaded, enter it
  750   LDA entry+0:STA &02         :\ application start address
  760   LDA entry+1:STA &03
  770   .loop2
  780   LDA (&00),Y:STA (&02),Y     :\ copy application
  790   INY:BNE loop2
  800   INC &01:INC &03
  810   LDA &03:CMP #&F8:BNE loop2
  820   .enter
  830   LDA entry+0:STA &EC         :\ set entry point
  840   LDA entry+1:STA &ED
  850   JMP (&FFFC)                 :\ start Atom/System MOS
  860   .entry
  870   EQUW &A000
  880   .buffer
  890 ]NEXT
  900 OSCLI "Load "+kernel$+" "+STR$~O%
  910 OSCLI "Load "+sbasic$+" "+STR$~(O%+&800)
  920 ?(O%+&800+brk%)=0:?(O%+&800+brk%+4)=0:REM Remove BRK range check
  930 A$=save$+" "+STR$~mcode%+" "+STR$~(O%+&4800)+" 400 400"
  940 PRINT"Saving ";A$;
  950 OSCLI"Save "+A$:PRINT
  960 ENDPROC