10 REM > SOURCE2
   20 REM Load Acorn CPM tracks from disk
   30 REM 25-Feb-1992 : Initial version - MOS 0.55 doesn't have MULTI7F
   40 :
   50 A%=0:X%=1:os%=(USR&FFF4 AND &FF00)DIV256:IFos%=6 AND PAGE>&8000:PRINT"Running Z80...":SYS "OS_GetEnv" TO A$:OSCLI"Z80 "+MID$(A$,INSTR(A$," ",1+INSTR(A$," "))):END
   60 IF?&FFF7=&6C:A$=$&600 ELSE A$=""
   70 unix%=os%=8:quit%=?&80<>0:?&80=0
   80 ON ERROR REPORT:PRINT" at line ";ERL:END
   90 asm$="^.AsmZ80_402"
  100 DIM mcode% &800:start%=&100:ver$="0.01":name$="CPM"
  110 :
  120 IF?&FFF7<>&C3:OSCLI"Key0 "+A$+"|M"+name$+"|M":OSCLI"FX138,0,192":CHAINasm$
  130 :
  140 OSWORD=&FFF1:CLICOM=&FFB9:PR_TEXT=&FFB3:OSNEWL=&FFE7
  150 :
  160 FOR P=0 TO 1
  170   P%=start%:O%=mcode%
  180   [OPT P*3+4
  190   JR NZ,P%+3:POP AF        :\ Realign stack
  200   CALL PR_TEXT
  210   DEF"Looking for CPM on drive 0...":NOP
  220   LD HL,Load_00:CALL LoadSectors
  230   LD HL,&EB00:LD DE,&EAF0
  240   LD BC,&F0:LDIR           :\ Move code to remove DFS data
  250   LD HL,&EBF0:LD DE,&EBE0
  260   LD BC,&600:LDIR          :\ Move
  270   CALL Load_CCP_BDOS
  280   LD A,(&D400)             :\ Get first byte of CCP
  290   CP &C3:JP Z,&EA00        :\ A jump, so enter BIOS at COLD_E
  300   CALL OSNEWL
  310   JP CLICOM                :\ Not a jump, so exit to CLI
  320   :
  330   .Load_CCP_BDOS
  340   LD HL,Load_08:Call LoadSectors :\ Load 00/8-00/9 -> &D400-&D5FF
  350   LD HL,Load_10:CALL LoadSectors :\ Load 01/0-01/9 -> &D600-&DFFF
  360   LD HL,Load_20                  :\ Load 02/0-02/9 -> &E000-&E9FF
  370   .LoadSectors
  380   LD A,&7F:JP OSWORD
  390   :
  400   .Load_00
  410   DEFB 0                   :\ Drive 0
  420   DEFW &E9F0:DEFW 0        :\ Addr=&E9F0
  430   DEFB 3:DEFB &53          :\ READ
  440   DEFB 0:DEFB 0            :\ Sector 00/0
  450   DEFB &28                 :\ Eight sectors
  460   DEFB &FF
  470   :
  480   .Load_08
  490   DEFB 0                   :\ Drive 0
  500   DEFW &D400:DEFW 0        :\ Addr=&D400
  510   DEFB 3:DEFB &53          :\ READ
  520   DEFB 0:DEFB 8            :\ Sector 00/8
  530   DEFB &22                 :\ Two sectors
  540   DEFB &FF
  550   :
  560   .Load_10
  570   DEFB 0                   :\ Drive 0
  580   DEFW &D600:DEFW 0        :\ Addr=&D600
  590   DEFB 3:DEFB &53          :\ READ
  600   DEFB 1:DEFB 0            :\ Sector 01/0
  610   DEFB &2A                 :\ Ten sectors
  620   DEFB &FF
  630   :
  640   .Load_20
  650   DEFB 0                   :\ Drive 0
  660   DEFW &E000:DEFW 0        :\ Addr=&E000
  670   DEFB 3:DEFB &53          :\ READ
  680   DEFB 2:DEFB 0            :\ Sector 02/0
  690   DEFB &2A                 :\ Ten sectors
  700   DEFB &FF
  710   :
  720 ]NEXT
  730 :
  740 IFunix%:name$=name$+",240"
  750 A$="*Save "+name$+" "+STR$~mcode%+" "+STR$~O%+" FFFF0000 "+STR$~(&FFF20000 OR start%)
  760 PRINT A$:IFquit%:OSCLI A$:*Quit