Код:
ORG 00100h
L_0100: JMP L_0210
;---------------------
L_0103: LHLD L_0201 ; загрузить в HL данные с адреса L_0201 (= 2000h)
MOV B, H
MOV C, L ; в BC -- сколько
LDA 00002h ; в А из памяти с адр.00002h
SUB B ; вычесть B из А
MOV D, A
MVI E, 000h ; в DE -- куда
PUSH D
PUSH B
PUSH D
LXI H, L_0300 ; откуда
L_0115: MOV A, B
ORA C
JZ L_0122
DCX B
MOV A, M ; считать по адресу в HL
STAX D ; записать по адресу в DE
INX D
INX H
JMP L_0115
;
L_0122: POP D
POP B
PUSH H
MOV H, D
DCR H
L_0127: MOV A, B
ORA C
JZ L_0145 ; ---------->>>>>>>>
DCX B
MOV A, E
ANI 007h
JNZ L_0138
XTHL
MOV A, M ; ?????? (02300h...026FFh)
INX H
XTHL
MOV L, A
L_0138: MOV A, L
RAL
MOV L, A
JNC L_0141
LDAX D
ADD H
STAX D
L_0141: INX D
JMP L_0127
;
L_0145: POP H
RET ; ==============>>>>>>>>>>>>>>> запуск (0B500h)
; --- вырезано цензурой --------------------------------------------
L_0200: db 000h ; <_> - | | (offset 0100h)
L_0201: db 000h ; <_> - | | (offset 0101h)
db 020h ; < > - | ■ | (offset 0102h)
; --- вырезано цензурой --------------------------------------------
;
L_0210: DI
LXI SP,0100h ; стек == 0100h
LXI H, 0D00h ; сколько
LXI D, L_2700 ; откуда
LXI B, 0F300h ; куда
CALL L_02A6 ; переброска данных
CALL 0F800h ; вызов START BIOS (в т.ч. включение КД)
PUSH H ; ??? -- он и так сохранится...
MVI A, 0C0h
LXI B, 0A020h
MVI B, 0A0h ; почему не LXI B,0A020h ???
MVI C, 020h
;;; LXI B, 0A020h
L_022A: MVI D, 008h ; от HL=0EF00h до HL=0F100h
L_022C: MOV M, A ; заполняем "C0 A0...", "C1 A1...", ...
INX H
MOV M, B
INX H
DCR D
JNZ L_022C
INR A
INR B
DCR C
JNZ L_022A
POP H ; восстанавливаем HL (0EF00h)
LXI B, 00200h
DAD B ; HL = HL+DE = 0F100h
MVI A, 080h
MVI C, 000h
L_0243: MOV M, A ; от HL=0F100h до HL=0F300h
INX H ; заполняем строки "80 80 40 40 ... 01 01"
MOV M, A
INX H
RRC
DCR C
JNZ L_0243
MVI C, 01Bh ; символ очистки экрана
CALL 0F809h ;-BIOS-(вывод символа)----->>>>>>>>>>
MVI C, 045h ; установка латинской клавиатуры
CALL 0F809h ;-BIOS-(вывод символа)----->>>>>>>>>>
LXI H, 128Eh ; сколько
LXI D, L_3400 ; откуда
LXI B, 0D800h ; куда
CALL L_02A6 ; переброска данных (часть 2)
CALL L_468E ; инициализация НЖМД
LXI H, 0D500h ;
SHLD 00001h ; заносим 00 по адресу 0001 и 0D5h по адресу 0002
MVI A, 0F7h
STA 00000h ; заносим RST 6 по адресу 0000
LXI D, L_029E ; откуда
LXI B, 00030h ; куда
LXI H, 00008h ; сколько
CALL L_02A6 ; переброска данных (для RST 6)
IN 001h
ANI 040h ; нажата клавиша УС?
CZ 0D81Bh ; форматнуть КД
MVI A, 081h
OUT 004h
MVI A, 0FFh
OUT 005h
OUT 006h
MVI A, 00Dh
OUT 007h
MVI A, 0EFh
OUT 005h
MVI A, 0FFh
OUT 005h
OUT 007h
JMP L_0103
;
L_029E: db 03Eh ; <>> - | ■■■■■ | (offset 019Eh) (для RST)
db 023h ; <#> - | ■ ■■| (offset 019Fh)
db 0D3h ; <╙> - |■■ ■ ■■| (offset 01A0h)
db 010h ; <_> - | ■ | (offset 01A1h)
db 02Ah ; <*> - | ■ ■ ■ | (offset 01A2h)
db 001h ; <_> - | ■| (offset 01A3h)
db 000h ; <_> - | | (offset 01A4h)
db 0E9h ; <щ> - |■■■ ■ ■| (offset 01A5h)
;
L_02A6: LDAX D ; ПП переброски данных
STAX B
INX D
INX B
DCX H
MOV A, L
ORA H
JNZ L_02A6
RET
;
; --- вырезано цензурой --------------------------------------------
L_0300: db 021h ; <!> - | ■ ■| (offset 0200h)
; --- вырезано цензурой --------------------------------------------
L_0D00: db 00Dh ; <_> - | ■■ ■| (offset 0C00h)
db 03Ah ; <:> - | ■■■ ■ | (offset 0C01h)
; --- вырезано цензурой --------------------------------------------
db 000h ; <_> - | | (offset 21FFh)
;
db 020h ; < > - | ■ | (offset 2200h)
db 002h ; <_> - | ■ | (offset 2201h)
; --- вырезано цензурой --------------------------------------------
db 000h ; <_> - | | (offset 25FEh)
db 000h ; <_> - | | (offset 25FFh)
;
L_2700: db 000h ;(offset 2600h) BIOS >>> F300h
;==== вырезано цензурой =============================================
;
L_3400: db 0C3h ;(offset 3300h) часть 2 >>> D800h
;==== вырезано цензурой =============================================
;
L_468E: XRA A
STA 0E86Fh ; дорожка, =0
MVI A, 0FFh
STA 0E86Dh ; сектор, =-1 (FFh)
CALL 0D82Dh ; ---------->>>>>>>>>>>> грузит сектор в EB00-ED00
JNZ L_468E
LDA 0EB80h ; читает из буфера EB00-ED00 количество секторов
MOV L, A
MVI H, 000h
PUSH H ; (в стек сектора)
SHLD 0D88Dh ; -- сохр. количество секторов НЖМД
CALL L_46CD ; HL = -(HL * 10h) + 1
SHLD 0D887h ; -- патч драйвера НЖМД
POP D ; (сектора из стека)
LXI H, 00000h
LDA 0EB81h ; читает из буфера EB00-ED00 количество головок
L_46B4: DAD D
DCR A
JNZ L_46B4 ; HL = секторов * головок
SHLD 0D8FAh ; -- патч драйвера НЖМД
CALL L_46CD ; HL = -(HL * 10h) + 1
SHLD 0D8F4h ; -- патч драйвера НЖМД
LHLD 0EB84h ; читает из буфера EB00-ED00 количество дискет на НЖМД
CALL L_46D8 ; инверсия HL
DCX H
SHLD 0D920h ; -- патч на максимальное количество дискет НЖМД
RET
;
L_46CD: MVI B, 010h
XCHG
LXI H, 00000h
L_46D3: DAD D
DCR B
JNZ L_46D3
L_46D8: MOV A, H
CMA
MOV H, A
MOV A, L
CMA
MOV L, A
INX H
RET
;
END