Код:
.ORG 07E00h
L_7E00: LXI H, 0FF00h ; проверка наличия КД
SHLD 0DED5h
XRA A
STA 0DED2h
STA 0DED3h
INR A
STA 0DED4h
CALL L_0576
CALL Lx04E8 ; проверка наличия OS.COM
JZ L_7E00 ; возврат.
; переход на загрузку с КД
L_050C: LXI H, 00100h
SHLD 0DED5h
MOV B, H
LXI H, 0FF10h ; ссылка на первую запись в директории на КД +10h
L_051E: MVI C, 010h ; <<<---- цикл
L_0520: MOV A, M
ORA A
JZ 0100h ; --------->>>>>>>>> запуск системы
PUSH PSW
PUSH H
STA 0DED3h
MVI A, 001h
L_0553: STA 0DED4h
PUSH PSW
CALL L_0576
JZ L_0562
MVI A, 0FFh
STA 0DED2h
L_0562: POP PSW
LHLD 0DED5h
LXI D, 00080h
DAD D
SHLD 0DED5h
INR A
CPI 009h
JNZ L_0553
POP H
POP PSW
MOV A, B
ADI 004h
MOV B, A
LDA 0DED2h
ORA A
JNZ L_7E00 ; что-то не так.... сброс.
INX H
DCR C
JNZ L_0520
CALL L_04E9 ; проверка наличия OS.COM
JZ 0100h ; ------>>>>>>> запуск 2
LXI D, 0010h
DAD D
JMP L_051E
;
L_0576: PUSH B
PUSH D
LXI H, 00000h
DAD SP
SHLD 0DED0h
LDA 0DED4h
LXI D, 0FF80h
LXI H, 00400h
L_05B8: DAD D
DCR A
JNZ L_05B8
XCHG
LDA 0DED3h
CMA
CPI 0FCh
JNC L_05C9
SUI 010h
L_05C9: SUI 004h
MOV L, A
RLC
RLC
ANI 0FCh
MOV H, A
MOV A, L
MVI L, 000h
DAD D
RLC
RLC
RLC
RLC
ANI 00Ch
PUSH B
MOV C, A
MVI A, 010h
ORA C
POP B
DI
OUT 010h ; подключаем КД
SPHL
LHLD 0DED5h
XRA A
MVI C, 020h
L_058C: POP D ; грузим в цикле
ADD E
ADD D
MOV M, E
INX H
MOV M, D
INX H
;
POP D
ADD E
ADD D
MOV M, E
INX H
MOV M, D
INX H
;
DCR C
JNZ L_058C
MOV C, A
MVI A, 000h ; отключаем КД
OUT 010h
LHLD 0DED0h
SPHL
EI
MOV A, C
PUSH PSW
PUSH D
LXI H, 00000h
DAD SP
SHLD 0DED0h
LDA 0DED3h
MOV L, A
MVI H, 000h
DAD H
DAD H
DAD H
DAD H
MVI A, 0F0h
ADD H
MOV H, A
LDA 0DED4h
DCR A
ADD A
ADD L
MOV L, A
MVI A, 01Ch ; подключаем КД
DI
OUT 010h
SPHL
POP D
MVI A, 000h ; отключаем КД
OUT 010h
LHLD 0DED0h
SPHL
EI
XCHG
POP D
POP PSW
CMP H
JNZ L_061D
SUB L
JZ L_061E
L_061D: MVI A, 0FFh
L_061E: POP D
POP B
RET
;
Lx04E8: MVI A, 000h
JNZ L_04FE
LXI H, 0FF00h
L_04E9: PUSH H
LXI D, L_0500 ; ссылка на строку "OS COM"
MVI C, 00Ch
L_04EF: LDAX D
CMP M
MVI A, 000h
JNZ L_04FD
INX D
INX H
DCR C
JNZ L_04EF
DCR A
L_04FD: POP H
L_04FE: ORA A
RET
;
L_0500:.db 000h ; <_>
.db 04Fh ; <O>
.db 053h ; <S>
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 043h ; <C>
.db 04Fh ; <O>
.db 04Dh ; <M>
.END
Код:
.ORG 00100h
L_0100: LXI H, 0038h ; адрес для ПП прерываний RST7
MVI A, 0C9h ; записываем туда код RET
LXI H, 013Ch ; сколько
LXI D, L_1000+3 ; откуда
LXI B, 07E00h ; куда
L_018C: LDAX D ; переброска данных
STAX B
INX D
INX B
DCX H
MOV A, L
ORA H
JNZ L_018C
L_1000: JMP 07E00h ; запускаем то, что перебрасывали
;
.END
1. Компилируем оба фрагмента
2. Копируем бинарники в один файл, сначала модуль перемещения, а потом загрузчик, например, так: