10
20
30
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 DEFM "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