;LAST UPDATE: 02.02.2014 savelij
;КОПИРОВАНИЕ 256 БАЙТ
COPY_BLOCK REPT 128 ;КОПИРОВАНИЕ БЛОКА 256 БАЙТ
LDI
ENDM
COPYHBLOCK REPT 126
LDI
ENDM
JR COPY_BLOCK1
DW 0XFFFF ;ДЛЯ ВЕКТОРА ПРЕРЫВАНИЙ IM2 I=9
COPY_BLOCK1 LDI
LDI
RET
WOUT1F EQU 0
WOUT3F EQU WOUT1F+1
WOUT5F EQU WOUT3F+1
WOUT7F EQU WOUT5F+1
WOUTFF EQU WOUT7F+1
WOUTI EQU WOUTFF+1
WIN1F EQU WOUTI+1
WIN3F EQU WIN1F+1
WIN5F EQU WIN3F+1
WIN7F EQU WIN5F+1
WINFF EQU WIN7F+1
WINI EQU WINFF+1
WOUTCD EQU WINI+1
WINHC EQU WOUTCD+1
WWR_RD_SECT EQU WINHC+1
WOUTCA EQU WWR_RD_SECT+1
WWRITE_SEC_ EQU WOUTCA+1
WREAD_SEC_ EQU WWRITE_SEC_+1
WINI_RET EQU WREAD_SEC_+1
W_DATA DW W_OUT1F ;00
DW W_OUT3F ;01
DW W_OUT5F ;02
DW W_OUT7F ;03
DW W_OUTFF ;04
DW W_OUTI ;05
DW W_IN1F ;06
DW W_IN3F ;07
DW W_IN5F ;08
DW W_IN7F ;09
DW W_INFF ;0A
DW W_INI ;0B
DW W_OUTCD ;0C
DW W_INHC ;0D
DW W_WR_RD_SECT ;0E
EW_DATA
DW W_OUTCA ;0F
DW WRITE_SEC_ ;10
DW READ_SEC_ ;11
DW W_INI ;12
TEXT4VIRTDRV DB 0X16,ZASTV_Y+2,0
TXT4VIRTDRV DC "Virtual Drive: "
ETXT4VIRTDRV
RST08_WORK EX (SP),HL
PUSH AF
PUSH BC
LD A,I
JP PE,RST08_WORK1
LD A,I
RST08_WORK1 DI
PUSH AF
LD BC,RD_1WINA0
IN A,(C)
PUSH AF
AND 0X3E
LD BC,WIN_A0
OUT (C),A
LD B,HIGH (WIN_P0)
LD A,PAGE_EVODOS
OUT (C),A
IN A,(PEVO_CONF)
LD (WR_BF),A
OR 1
OUT (PEVO_CONF),A
POP AF
LD (TEK_ROMPAGE),A
LD A,(HL)
LD (DOS_STEK),SP
LD SP,DOS_STEK
PUSH HL ;ПОЛОЖИЛИ HL=АДРЕС ВОЗВРАТА
PUSH DE
LD HL,(DOS_STEK)
LD DE,REG_IF
REPT 8
LDI
ENDM
LD HL,EXIT_RST08
PUSH HL ;ПОЛОЖИЛИ АДРЕС ЗАВЕРШЕНИЯ
LD HL,W_DATA
ADD A,A
ADD A,L
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
JP (HL)
EXIT_RST08 LD HL,REG_IF
LD DE,(DOS_STEK)
REPT 8
LDI
ENDM
POP DE
POP HL
LD SP,(DOS_STEK)
LD A,(HL)
INC HL
CP LOW ((EW_DATA-W_DATA)/2)
JR C,EXIT_RST082
LD HL,FOR_RET
EXIT_RST082 PUSH HL
IN A,(RW_PORT0)
LD H,A
AND 3
LD L,A
LD A,(MASK_DRV)
LD B,A
LD A,H
AND B
CP B
JR Z,EXIT_RST085
LD A,(WR_FF)
AND 3
CP L
EXIT_RST085 LD A,(WR_BF)
LD BC,WIN_A0+0X100
LD HL,DOS_NOEMUL
JR NZ,EXIT_RST083
INC HL
EXIT_RST083 CALL WRPORT_RET
POP HL
OUT (PEVO_CONF),A
POP AF
JP PO,EXIT_RST084
EI
EXIT_RST084 LD I,A
POP BC
POP AF
EX (SP),HL
RET
;ЗАПИСЬ "A" В ПОРТ 0X1F
W_OUT1F LD A,(REG_A)
LD (WR_1F),A
CP 0X10 ;00-0F КОМАНДА ВОССТАНОВЛЕНИЯ
JR NC,W_OUT1F10
XOR A
OUT (RW_PORT1),A;OUT (0X3F),A
JR INFF_BIT6
W_OUT1F10 CP 0X20 ;10-1F КОМАНДА ПОИСКА
JR NC,W_OUT1F20
IN A,(RW_PORT3) ;IN A,(0X7F)
OUT (RW_PORT1),A ;OUT (0X3F),A
CALL DISK_NONE
LD A,0X80
JR NZ,INFF_BIT61
INFF_BIT6 XOR A
INFF_BIT61 LD (RD_1F),A
LD A,0XBF
LD (RD_FF),A
RET
DISKNONE1 CALL RET_PAGE_STD
LD A,0X80
JR INFF_BIT61
W_OUT1F20 CP 0X40 ;20-3F КОМАНДА ШАГ В ПРЕДЫДУЩЕМ НАПРАВЛЕНИИ
JR NC,W_OUT1F40
IN A,(RW_PORT1) ;IN A,(0X3F)
NAPRAVL NOP
OUT (RW_PORT1),A ;OUT (0X3F),A
JR INFF_BIT6
W_OUT1F40 CP 0X60 ;40-5F КОМАНДА ШАГ ВПЕРЕД
JR NC,W_OUT1F60
IN A,(RW_PORT1) ;IN A,(0X3F)
INC A
OUT (RW_PORT1),A ;OUT (0X3F),A
LD A,0X3C
LD (NAPRAVL),A
JR INFF_BIT6
W_OUT1F60 CP 0X80 ;60-7F КОМАНДА ШАГ НАЗАД
JR NC,W_OUT1F80
IN A,(RW_PORT1) ;IN A,(0X3F)
DEC A
OUT (RW_PORT1),A ;OUT (0X3F),A
LD A,0X3D
LD (NAPRAVL),A
JR INFF_BIT6
W_OUT1F80 CP 0XA0 ;80-9F КОМАНДА ЧТЕНИЕ СЕКТОРА
JR NC,W_OUT1FA0
JR INFF_BIT6
W_OUT1FA0 CP 0XC0 ;A0-BF КОМАНДА ЗАПИСЬ СЕКТОРА
JR NC,W_OUT1FD0
JR INFF_BIT6
INFF_BIT7 XOR A
LD (RD_1F),A
LD A,0X7F
LD (RD_FF),A
RET
W_OUT1FD0 CP 0XD0 ;C0-CF ЧТЕНИЕ АДРЕСА
JR NC,W_OUT1FE0
JR INFF_BIT6
W_OUT1FE0 CP 0XE0 ;D0-DF ПРИНУДИТЕЛЬНОЕ ПРЕРЫВАНИЕ
JR NC,W_OUT1FF0
LD A,0XBF
LD (RD_FF),A
RET
W_OUT1FF0 CP 0XF0 ;E0-EF ЧТЕНИЕ ДОРОЖКИ
JR C,INFF_BIT6
JR INFF_BIT6
;ЗАПИСЬ "A" В ПОРТ 0X3F
W_OUT3F LD A,(REG_A)
OUT (RW_PORT1),A
OUT (0X3F),A
RET
;ЗАПИСЬ "A" В ПОРТ 0X5F
W_OUT5F LD A,(REG_A)
OUT (RW_PORT2),A
OUT (0X5F),A
RET
;ЗАПИСЬ "A" В ПОРТ 0X7F
W_OUT7F LD A,(REG_A)
OUT (RW_PORT3),A
OUT (0X7F),A
RET
;ЗАПИСЬ "A" В ПОРТ 0XFF
W_OUTFF LD A,(REG_A)
OUT (0XFF),A
LD (WR_FF),A
AND 3
INC A
LD B,A
LD A,%00001000
RLCA
DJNZ $-1
LD (MASK_DRV),A
RET
;ЗАПИСЬ "A" В ПОРТ (C)
W_OUTCA LD A,(REG_A)
W_OUTCA1 LD D,A
LD A,(REG_C)
;ОПРЕДЕЛЕНИЕ В КАКОЙ ПОРТ ЗАПИСЬ
CP 0X1F
JP Z,W_OUT1F
CP 0X3F
JR Z,W_OUT3F
CP 0X5F
JR Z,W_OUT5F
CP 0X7F
JR Z,W_OUT7F
CP 0XFF
JR Z,W_OUTFF
LD BC,(REG_C) ;ЕСЛИ ПОРТ НЕ TR-DOS
OUT (C),D
RET
;ЗАПИСЬ "D" В ПОРТ (C)
W_OUTCD LD A,(IREG_D)
JR W_OUTCA1
;ПЕРЕДАЧА БАЙТА, КОМАНДА OUTI
W_OUTI LD HL,(BUFF_SECT)
EXX
LD A,(HL)
INC HL
EXX
LD (HL),A
INC HL
LD (BUFF_SECT),HL
RET
;ЧТЕНИЕ ПОРТА 0X1F
W_IN1F LD A,(WR_1F)
AND 0XF0
CP 0X10
JR C,W_IN1F1
CP 0X20
JR C,W_IN1F3
CP 0XD0
JR Z,W_IN1F1
XOR A
JR W_IN1F2
W_IN1F3 LD A,(INDEX)
XOR %00000100
JR W_IN1F4
W_IN1F1 LD A,0X24
INDEX EQU $-1
W_IN1F4 XOR %00000010
LD (INDEX),A
W_IN1F2 LD (RD_1F),A
LD (REG_A),A
RET
;ЧТЕНИЕ ПОРТА 0X3F
W_IN3F IN A,(RW_PORT1) ;IN A,(0X3F)
LD (REG_A),A
RET
;ЧТЕНИЕ ПОРТА 0X5F
W_IN5F IN A,(RW_PORT2) ;IN A,(0X5F)
LD (REG_A),A
RET
;ЧТЕНИЕ ПОРТА 0X7F
W_IN7F IN A,(RW_PORT3) ;IN A,(0X7F)
LD (REG_A),A
RET
;ЧТЕНИЕ ПОРТА 0XFF
W_INFF LD A,(RD_FF)
LD (REG_A),A
RET
;ЧТЕННИЕ В "H" ИЗ (С)
W_INHC LD A,(REG_C)
;ОПРЕДЕЛЕНИЕ ИЗ КАКОГО ПОРТА ЧТЕНИЕ
W_INHC1 CP 0X1F
JR NZ,W_INHC2
LD A,(RD_1F)
LD (REG_H),A
RET
W_INHC2 CP 0X3F
JR NZ,W_INHC3
IN A,(RW_PORT1) ;IN A,(0X3F)
LD (REG_H),A
RET
W_INHC3 CP 0X5F
JR NZ,W_INHC4
IN A,(RW_PORT2) ;IN A,(0X5F)
LD (REG_H),A
RET
W_INHC4 CP 0X7F
JR NZ,W_INHC5
IN A,(RW_PORT3) ;IN A,(0X7F)
LD (REG_H),A
RET
W_INHC5 CP 0XFF
JR NZ,W_INHC6
LD A,(WR_FF)
LD (REG_H),A
RET
W_INHC6 LD BC,(REG_C)
IN A,(C)
LD (REG_H),A
RET
;ЧТЕНИЕ INI
W_INI LD A,(RD_1F)
LD HL,(REG_L)
LD (HL),A
INC HL
DEC B
LD (REG_L),HL
RET
;АЛЬТЕРНАТИВНОЕ КОПИРОВАНИЕ СЕКТОРА ДЛЯ РАМДИСКА
SV_LD_RAMDISK PUSH HL
CALL CP_TYPEDRIVE
POP HL
JP NZ,WR_NUM_TRACK ;ПРИ НЕ СОВПАДЕНИИ РАБОТА ПРОДОЛЖАЕТСЯ С РЕАЛЬНОЙ ДИСКЕТОЙ
POP HL ;ИНАЧЕ РАБОТАЕМ С РАМДИСКОМ
POP HL
POP BC
XOR A
OR B
RET Z
DI
PUSH IX ;СОХРАНИЛИ ДЛЯ ВНУТРЕННЕГО ИСПОЛЬЗОВАНИЯ
LD IX,(TRD_5CCE) ;ЧТЕНИЕ ИЛИ ЗАПИСЬ? 00-ЧТЕНИЕ, FF-ЗАПИСЬ, СОХРАНИЛИ ДЛЯ ДАЛЬНЕЙШЕГО ИСПОЛЬЗОВАНИЯ
SVLDRAM1 PUSH BC
PUSH HL
LD DE,(TRD_5CF4)
CALL COM_04
LD A,E
CALL COM_03
INC A
OUT (RW_PORT2),A ;OUT (0X5F),A
LD A,D
PUSH HL
CALL COM_02
POP HL
RST 0X30
DB WWR_RD_SECT
LD A,0X10
LD HL,TRD_5CF4
INC (HL) ;УВЕЛИЧЕНИЕ НОМЕРА СЕКТОРА
CP (HL)
JR NZ,SVLDRAM2
LD (HL),0 ;ЕСЛИ ВЫХОД ЗА ПРЕДЕЛЫ ТРЕКА, ТО СЕКТОР =0
INC HL
INC (HL) ;И УВЕЛИЧИВАЕМ НОМЕР ТРЕКА
SVLDRAM2 POP HL
POP BC
INC H ;УВЕЛИЧИЛИ АДРЕС КОПИРОВАНИЯ НА 256 БАЙТ
DJNZ SVLDRAM1
POP IX ;ПОПОЛЬЗОВАЛИСЬ И ВОССТАНОВИЛИ
EI
RET
READ_SEC_ LD A,(WR_1F)
AND 0X0F0
CP 0X80
JP C,INFF_BIT6
CP 0XC0
JR NZ,READ_SEC_1
IN A,(RW_PORT1) ;IN A,(0X3F)
LD HL,(REG_L)
LD (HL),A
INC HL
DEC B
IN A,(RW_PORT2) ;IN A,(0X5F)
LD (HL),A
INC HL
DEC B
LD (REG_L),HL
RET
READ_SEC_1 PUSH IX
LD IXL,0
JR WRITE_SEC_1
WRITE_SEC_ PUSH IX
LD IXL,0XFF
WRITE_SEC_1 CALL W_WR_RD_SECT
LD IX,0X8090
LD (REG_F),IX ;ЕМУЛЯЦИЯ ФЛАГА УСПЕШНОГО ЧТЕНИЯ/ЗАПИСИ СЕКТОРА
POP IX
RET
;ЧТЕНИЕ ИЛИ ЗАПИСЬ СЕКТОРА РАМДИСКА
W_WR_RD_SECT LD A,(WR_FF)
AND 3
INC A
LD B,A
IN A,(RW_PORT0)
RRCA
RRCA
RRCA
RRCA
RRCA
DJNZ $-1
JP C,WR_RD_SEC_M
LD A,PAGE_RAMDISK
LD BC,WIN_P1
OUT (C),A ;СТРАНИЦА ЗАГОЛОВКОВ РАМДИСКА
IN A,(RW_PORT1) ;IN A,(0X3F) ;ВЗЯЛИ НОМЕР ТРЕКА
ADD A,A ;СТОРОН 2
LD C,A
LD A,(WR_FF)
AND 0X10 ;ПРОВЕРКА КАКАЯ СТОРОНА ДИСКА
JR NZ,WWRRD1
INC C ;ДЛЯ СТОРОНЫ 1
WWRRD1 LD B,0X42 ;АДРЕС НАЧАЛА ИНФЫ О СЕКТОРАХ НА ДОРОЖКЕ
IN A,(RW_PORT2) ;IN A,(0X5F) ;ВЗЯЛИ НОМЕР СЕКТОРА
LD L,A
LD H,0
WWRRD3 LD A,(BC)
LD D,A ;ВЗЯЛИ НОМЕР СЕКТОРА
INC B
LD A,(BC)
LD E,A ;ВЗЯЛИ РАЗМЕР СЕКТОРА
INC B
; LD A,D
; AND A
; JR Z,WWRRD_ERR
LD A,L
CP D
JR Z,WWRRD2
LD A,E
ADD A,H
LD H,A
JR WWRRD3
WWRRD2 LD A,E
RRCA
OUT (RW_PORT3),A ;OUT (0X7F),A ;РАЗМЕР НАЙДЕННОГО СЕКТОРА
LD L,0
LD E,L
SRL H
RR L ;HL=СМЕЩЕНИЕ В БЛОКАХ ДО НАЙДЕННОГО СЕКТОРА
LD B,0X40
LD A,(BC)
LD D,A
ADD HL,DE ;HL=СМЕЩЕНИЕ ОТ НАЧАЛА СТРАНИЦЫ В БЛОКАХ
INC B
LD A,(BC)
LD C,A ;СМЕЩЕНИЕ В СТРАНИЦАХ ОТ НАЧАЛА РАМДИСКА
LD A,H
CP 0X40
JR C,WWRRD5
SUB 0X40
LD H,A
INC C
;HL=СМЕЩЕНИЕ В СТРАНИЦЕ ДО НАЧАЛА СЕКТОРА
WWRRD5 LD A,C ;СМЕЩЕНИЕ ДО НОМЕРА СТРАНИЦЫ, ГДЕ УКАЗАННЫЙ СЕКТОР НАЧИНАЕТСЯ
ADD A,PAGE_DATARAMD ;ПРИБАВИЛИ НОМЕР НАЧАЛА РАМДИСК И +1. В 0 СТРАНИЦЕ РАМДИСКА ОПИСАТЕЛИ СЕКТОРОВ
LD IXH,A ;СОХРАНИЛИ НОМЕР ВЫЧИСЛЕННОЙ СТРАНИЦЫ
LD DE,(REG_L) ;DE=АДРЕС КУДА/ОТКУДА КОПИРОВАТЬ
LD BC,WIN_P1
LD A,0XFA
OUT (C),A ;ВЕРНУЛИ СТАНДАРТНУЮ 5 СТРАНИЦУ
SP_RAMD9 LD A,D ;ПРОВЕРКА ГРАНИЦЫ ОТКУДА/КУДА КОПИРОВАТЬ
CP 0X80
LD A,IXH ;ВЕРНУЛИ НОМЕР СТРАНИЦЫ ОЗУ
LD BC,WIN_P1 ;ЕСЛИ ВЕРХНИЕ 32КБ ОЗУ, ТО НУЖНО ВКЛЮЧИТЬ В 1 ОКНЕ ПРОЕЦИРОВАНИЯ
JR NC,SP_RAMD1
LD B,HIGH (WIN_P2) ;ЕСЛИ НИЖНИЕ 32КБ ОЗУ, ТО НУЖНО ВКЛЮЧИТЬ ВО 2 ОКНЕ ПРОЕЦИРОВАНИЯ
SP_RAMD1 OUT (C),A ;ВКЛЮЧИЛИ ВЫЧИСЛЕННУЮ СТРАНИЦУ
LD B,0X40 ;СТАРШИЙ БАЙТ АДРЕСА НАЧАЛА ВКЛЮЧЕННОЙ СТРАНИЦЫ
JR NC,SP_RAMD2
LD B,0X80 ;СТАРШИЙ БАЙТ АДРЕСА НАЧАЛА ВКЛЮЧЕННОЙ СТРАНИЦЫ
SP_RAMD2 LD A,B
ADD A,H
LD H,A
LD A,IXL
AND A
JR NZ,IN_ROM1
LD A,D
INC A
JR NZ,IN_ROM1
LD A,E
AND A
JR Z,IN_ROM1
IN_ROM4 NEG
LD C,A
LD B,0
LDIR
NEG
LD C,A
IN_ROM2 EX DE,HL
ADD HL,BC
EX DE,HL
ADD HL,BC
IN A,(RW_PORT3) ;IN A,(0X7F)
JP SP_RAMD8_
IN_ROM1 LD A,D
CP 0X40
JR NC,IN_ROM3
IN A,(RW_PORT3) ;IN A,(0X7F)
AND A
LD BC,0X80
JR Z,IN_ROM2
LD BC,0X100
JR IN_ROM2
IN_ROM3 CP 0X80 ;ПРОВЕРКА ПЕРЕХОДА ГРАНИЦЫ СТРАНИЦ
JP NC,SP_RAMD3 ;ЕСЛИ ВЫШЕ ТО СРАЗУ КОПИРУЕМ
CP 0X7F
JP C,SP_RAMD3 ;ЕСЛИ НИЖЕ ТАК ЖЕ СРАЗУ КОПИРУЕМ
LD A,E
AND A ;ЕСЛИ СЕКТОР ПОЛНОСТЬЮ УКЛАДЫВЕТСЯ ДО ГРАНИЦЫ, ТО СРАЗУ КОПИРУЕМ
JR Z,SP_RAMD3 ;ИНАЧЕ ПРИНУДИТЕЛЬНО КОПИРУЕМ В ДВА ПРИЕМА
LD A,IXL ;ЧТЕНИЕ ИЛИ ЗАПИСЬ?
AND A
LD A,E ;МЛАДШИЙ БАЙТ АДРЕС В БЛОКЕ
JR Z,SP_RAMD4
EX DE,HL ;ДЛЯ ЗАПИСИ МЕНЯЕМ НАПРАВЛЕНИЕ
SP_RAMD4 NEG
LD C,A ;КОПИРУЕМ ОСТАТОК ДО КОНЦА БЛОКА
LD B,0
LDIR
NEG
EX AF,AF' ;СПРЯТАЛИ СКОЛЬКО ОСТАЛОСЬ КОПИРОВАТЬ ИЗ НАЧАЛА СЛЕДУЮЩЕГО БЛОКА
LD A,0XFD
LD BC,WIN_P2
OUT (C),A ;ВЕРНУЛИ НОМЕР СТАНДАРТНОЙ СТРАНИЦЫ ВО 2 ОКНЕ ПРОЕЦИРОВАНИЯ
LD B,HIGH (WIN_P1)
LD A,IXH
OUT (C),A ;ВЫЧИСЛЕННУЮ СТРАНИЦУ ВКЛЮЧАЕМ В 1 ОКНЕ ПРОЕЦИРОВАНИЯ
LD A,IXL ;ЧТЕНИЕ ИЛИ ЗАПИСЬ
AND A
JR Z,SP_RAMD5
LD A,D ;ДЛЯ ЗАПИСИ
SUB 0X40 ;ИЗМЕНИЛИ АДРЕС КУДА КОПИРОВАТЬ НА ДРУГОЕ ОКНО ПРОЕЦИРОВАНИЯ
LD D,A
JR SP_RAMD6
SP_RAMD5 LD A,H ;ДЛЯ ЧТЕНИЯ
SUB 0X40 ;ИЗМЕНИЛИ АДРЕС КУДА КОПИРОВАТЬ НА ДРУГОЕ ОКНО ПРОЕЦИРОВАНИЯ
LD H,A
SP_RAMD6 EX AF,AF'
LD C,A ;СКОЛЬКО ОСТАЛОСЬ СКОПИРОВАТЬ БАЙТ
LD B,0
LDIR
IN A,(RW_PORT3) ;IN A,(0X7F)
JR SP_RAMD8_
SP_RAMD3 LD A,IXL ;ЧТЕНИЕ ИЛИ ЗАПИСЬ
AND A
JR Z,SP_RAMD7
EX DE,HL ;ДЛЯ ЗАПИСИ МЕНЯЕМ НАПРАВЛЕНИЕ
SP_RAMD7 IN A,(RW_PORT3) ;IN A,(0X7F)
AND A
JR NZ,SP_RAMD8
CALL COPYHBLOCK ;ДЛЯ СЕКТОРА РАЗМЕРОМ 128 БАЙТ КОПИРУЕМ ПОЛОВИНУ И ВЫХОДИМ
;ПРИНУДИТЕЛЬНЫЙ ВОЗВРАТ СТРАНДАРТНЫХ СТРАНИЦ В ОКНА ПРОЕЦИРОВАНИЯ 1 И 2 (5 И 2 СООТВЕСТВЕННО)
ECOPY_BLOCK LD A,IXL
AND A
JR Z,ECOPY_BLOCK1
EX DE,HL
ECOPY_BLOCK1 LD (REG_L),DE
RET_PAGE_STD LD A,0XFA ;ОБЩАЯ ТОЧКА ЗАВЕРШЕНИЕ КОПИРОВАНИЯ БЛОКА
LD BC,WIN_P1
OUT (C),A ;ВЕРНУЛИ СТРАНИЦУ 5 В 1 ОКНО ПРОЕЦИРОВАНИЯ
LD A,0XFD
LD B,HIGH (WIN_P2)
OUT (C),A ;ВЕРНУЛИ СИРАНИЦУ 2 ВО 2 ОКНО ПРОЕЦИРОВАНИЯ
RET
SP_RAMD8 CALL COPY_BLOCK ;ДЛЯ СЕКТОРА 256 БАЙТ КОПИРУЕМ ВЕСЬ И ВЫХОДИМ
SP_RAMD8_ DEC A
JR Z,ECOPY_BLOCK
OUT (RW_PORT3),A ;OUT (0X7F),A
LD A,IXL
AND A
JR Z,SP_RAMD0
EX DE,HL
SP_RAMD0 LD A,0X3F
AND H
LD H,A
JP SP_RAMD9
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ПРОЧИТАННОЕ ЗНАЧЕНИЕ
READCMOS PUSH BC
PEC_ON SHADOW_BF
LD BC,CMOSD_SET_ADR
OUT (C),H
LD B,HIGH (CMOSD_RD_WR)
IN L,(C)
POP BC
PEC_OFF SHADOW_BF
LD A,L
AND A
RET
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ЧТО ТУДА ЗАПИСАТЬ
WRITECMOS RST 8
DB _CMOS_RW
DB _WRITE_CMOS
RET
CP_TYPEDRIVE PUSH BC
IN A,(RW_PORT0)
AND 3
LD B,A
LD A,(TRD_5CF6)
CP B
POP BC
RET
SET_DRIVENAME LD H,VIRT_REAL_DRIVE
CALL READCMOS
RRCA
RRCA
AND 3
LD (TRD_5D19),A
LD (TRD_5CF6),A
OR 0X3C
RET
FORMAT_RAM LD A,(TRD_5CF6)
LD B,A
INC B
LD A,8
RLCA
DJNZ $-1
LD B,A
IN A,(RW_PORT0)
AND B
JR NZ,FORMAT_RAM3 ;ЕСЛИ БИТ=1 ФОРМАТ ПРИМОНТИРОВАННОГО ОБРАЗА
CALL CP_TYPEDRIVE
RET NZ ;ВЫХОД ДЛЯ ФОРМАТА РЕЛЬНОГО ДИСКА
CALL CREATE_TRDTABL ;ФОРМАТ РАМДИСКА
XOR A
RET
FORMAT_RAM3 LD HL,TRD_5D25
LD DE,TRD_5D26
LD BC,0XFF
LD (HL),B
LDIR
LD D,B
LD E,B
LD B,0X10
FORMAT_RAM1 PUSH BC
PUSH DE
LD B,1
LD HL,TRD_5D25
CALL COM_06
POP DE
POP BC
INC E
DJNZ FORMAT_RAM1
XOR A
RET
;ПРОВЕРКА НАЛИЧИЯ МАРКЕРА РАМДИСКА
CMP_RAMDISK PUSH BC
PEC_ON SHADOW_BF
LD A,PAGE_RAMDISK
LD BC,WIN_P1
OUT (C),A
LD HL,0X7FFF
LD D,(HL)
DEC H
LD E,(HL) ;ВЗЯЛИ БАЙТЫ ДЛЯ ПРОВЕРКИ МАРКЕРА
LD A,0XFA
OUT (C),A
POP BC
PEC_OFF SHADOW_BF
LD HL,"RD"
SBC HL,DE
RET Z ;ЕСЛИ МАРКЕР НА МЕСТЕ, ТО РАМДИСКА НЕ СОЗДАЕМ
;СОЗДАНИЕ ЧИСТОГО РАМДИСКА
CREATE_TRDTABL LD A,PAGE_RAMDISK ;НУЖНА СТРАНИЦА НАЧАЛА РАМДИСКА, ГДЕ БУДЕТ ТАБЛИЦА ОПИСАТЕЛЕЙ
CALL SET4MBPAGE
LD HL,0X4000
PUSH HL
LD DE,0X4001
LD BC,0X3FFF
LD (HL),L
LDIR ;ОЧИСТИЛИ СТРАНИЦУ
POP DE ;АДРЕС НАЧАЛА
LD HL,0 ;СМЕЩЕНИЕ В БЛОКАХ И СТРАНИЦАХ
LD A,0XA0
ELT2 EX AF,AF'
LD BC,0X1000 ;СЧЕТЧИК НОМЕРОВ СЕКТОРОВ И ИХ НОМЕРА
LD A,L
RRCA
RRCA
LD (DE),A ;СМЕЩЕНИЕ В БЛОКАХ ДОРОЖКИ В СТРАНИЦЕ
INC D
LD A,H
LD (DE),A ;СМЕЩЕНИЕ В СТРАНИЦАХ ДО ДОРОЖКИ
INC D
ELT1 INC C
LD A,C
LD (DE),A ;НОМЕР СЕКТОРА
INC D
LD A,2
LD (DE),A ;РАЗМЕР СЕКТОРА
INC D
DJNZ ELT1 ;ВНОСИМ В ТАБЛИЦУ ВСЕ НОМЕРА СЕКТОРОВ С РАЗМЕРАМИ
LD D,0X40 ;ВЕРНУЛИ УКАЗАТЕЛЬ В НАЧАЛО
INC E ;ДЛЯ СЛЕДУЮЩЕЙ ДОРОЖКИ
LD BC,0X40
ADD HL,BC ;ПЕРЕХОД К СЛЕДУЮЩЕЙ ДОРОЖКЕ
EX AF,AF'
DEC A
JR NZ,ELT2 ;ПОВТОРЯЕМ ДЛЯ ВСЕХ ДОРОЖЕК
LD HL,0X7FFF
LD (HL),"R" ;ВНОСИМ МАРКЕР РАМДИСКА
DEC H
LD (HL),"D"
LD A,PAGE_DATARAMD
CALL SET4MBPAGE
LD HL,0X4000
LD DE,0X4001
LD BC,0X0FFF
LD (HL),L
LDIR
LD HL,DSKINFO
LD DE,0X48E1
LD BC,DSK_END-DSKINFO
LDIR
LD A,0XFA
;ВКЛЮЧЕНИЕ В 1 ОКНО ПРОЕЦИРОВАНИЯ ЗАДАННОЙ СТРАНИЦЫ
SET4MBPAGE PUSH BC
LD B,A
PEC_ON SHADOW_BF
LD A,B
LD BC,WIN_P1
OUT (C),A
LD B,A
PEC_OFF SHADOW_BF
LD A,B
POP BC
RET
DOS_NOEMUL DB P_BAS48|0X80 ;СТРАНИЦА DOS С ЭМУЛЯЦИЕЙ ТОЛЬКО ДЛЯ 3D13
DOS_EMUL DB P_ADD_BAS48|0X80 ;СТРАНИЦА DOS С ПОЛНЫМ ПЕРЕХВАТОМ ПОРТОВ
READ_BYTE_HL_ PUSH BC
PUSH HL
LD A,(LOC_2A53_)
CP 0X0C
LD BC,WIN_A0+0X100
LD HL,DOS_NOEMUL
CALL NZ,WRPORT_RET
LD C,A
EX (SP),HL
LD A,(HL)
EX (SP),HL
PUSH AF
LD A,C
CP 0X0C
JR Z,RBHL1
LD BC,WIN_A0+0X100
LD HL,DOS_EMUL
CALL WRPORT_RET
RBHL1 POP AF
POP HL
POP BC
RET