;LAST UPDATE: 05.08.2019 savelij
TITLE "call_trdos.a80"
SEL_FILES_WIN LD HL,ERS_FLAGS
BIT B_VIEW_IMG,(HL)
JP Z,RESTART
JP FILES_BROWSE
VIEW_IMAGE DI
LD BC,ADR_CAT_FAT
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
ADD HL,HL
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL) ;ПОЛУЧИЛИ ТЕКУЩИЙ ВЫБРАННЫЙ НОМЕР
LD A,6
RST8 _COM_FAT,_POS_FILES ;УСТАНОВКА ВНУТРЕННЕГО УКАЗАТЕЛЯ FAT ДРАЙВЕРА
LD HL,BUF_FILEITEM
RST8 _COM_FAT,_READ_DIR ;ПОЛУЧИЛИ ОПИСАТЕЛЬ ПО УСТАНОВЛЕННОМУ НОМЕРУ
LD DE,0X0B
ADD HL,DE
LD A,(HL)
SBC HL,DE
AND 0X10
JP NZ,_RULILKA ;ПОПЫТКА ПРОСМОТРА ДИРЕКТОРИИ
PUSH HL
CALL REST_COLCURS ;СТИРАНИЕ ЦВЕТНОГО КУРСОРА
CALL REST2X2 ;ВОССТАНОВЛЕНИЕ ЭКРАНА ПОД КУРСОРОМ МЫШИ
POP HL
CALL CPETR3 ;ПРОВЕРКА РАСШИРЕНИЯ
JP Z,_RULILKA ;ПОПЫТКА ПРОСМОТРА НЕ ПОДДЕРЖИВАЕМОГО РАСШИРЕНИЯ (SCL, TRD ONLY)
LD (TYPE_FILE),A
PUSH AF
RST8 _COM_FAT,_OPEN_FILE
POP AF
DEC A
LD HL,ADR_CAT ;TYPE_FILE=1-TRD
JR Z,VIEWIMG1
LD HL,ADR_CAT+0X200 ;TYPE_FILE=2-SCL
VIEWIMG1 PUSH AF
LD A,5
RST8 _COM_FAT,_READ_FILE
POP AF
JR Z,VIEWIMG3
LD DE,ADR_CAT
LD HL,ADR_CAT+0X200+8
LD A,(HL)
PUSH AF
INC HL
VIEWIMG2 LD BC,0X0E
LDIR
INC DE
INC DE
DEC A
JR NZ,VIEWIMG2
LD HL,ADR_CAT+0X0A00
SCF
SBC HL,DE
LD B,H
LD C,L
LD H,D
LD L,E
INC DE
LD (HL),0
LDIR
LD HL,DSKINFO
LD DE,ADR_CAT+0X8E1
LD BC,DSK_END-DSKINFO
LDIR
POP AF
LD (ADR_CAT+0X8E4),A
VIEWIMG3 LD HL,ERS_FLAGS
RES B_RUN_FAT,(HL) ;ВЫВОД ОКНА ДЛЯ TR-DOS
SET B_VIEW_IMG,(HL) ;ПРОСМОТР ОБРАЗА TR-DOS
JP VIEW_ALL
GLUBOOT LD HL,ERS_FLAGS
RES B_RUN_FAT,(HL) ;ЗАПУСК С ДИСКЕТЫ
RES B_VIEW_IMG,(HL) ;РАБОТА С РЕАЛЬНЫМ КАТАЛОГОМ TR-DOS
LD HL,ADR_CAT
LD DE,8
LD BC,0X0105
CALL TO_DOS4BAS ;ЗАГРУЗИЛИ 9 СЕКТОР
LD A,(ADR_CAT+0XE7)
CP 0X10 ;ПРОВЕРКА НА ПРИЗНАК TR_DOS
JP NZ,CMP_VIRTUAL ;ОШИБКА, ДИСК НЕ TR-DOS
LD HL,ADR_CAT
LD DE,0
LD BC,0X0905
CALL TO_DOS4BAS ;ЗАГРУЗКА TR-DOS ДИРЫ
LD A,(ADR_CAT+0X8E7)
CP 0X10 ;ПРОВЕРКА НА ПРИЗНАК TR_DOS
JP NZ,_STUPID
VIEW_ALL LD IX,ADR_CAT
LD DE,0X10
LD A,(ADR_CAT+0X8E4)
AND A
JP Z,NO_BAS
LD B,A ;СКОЛЬКО ФАЙЛОВ НАДО ПРОСМОТРЕТЬ
LD C,0 ;ОБНУЛЕНИЕ СЧЕТЧИКА НАЙДЕННОГО
EXX
PUSH IX
POP DE
EXX
FIND_BASIC LD A,(IX+8)
CP "B" ;ИЩЕМ ТОЛЬКО БАСИК ФАЙЛЫ
JR NZ,FINDBAS1
LD A,(IX+0)
DEC A ;ПРОВЕРКА НА УДАЛЕННЫЙ ФАЙЛ
JR Z,FINDBAS1
EXX
PUSH IX
POP HL ;ОТКУДА ПЕРЕНОСИТЬ ОПИСАТЕЛЬ
LD BC,0X10
LDIR
EXX
INC C
FINDBAS1 ADD IX,DE
DJNZ FIND_BASIC
LD IX,WIN_FILES ;ОКНО ДЛЯ ВЫВОДА БАСИК ФАЙЛОВ
OUT_HOB LD (IX+_NUM_PKT),0
LD (IX+_NUM_KOL_L),C
LD (IX+_NUM_KOL_H),B ;ПОЛНОЕ КОЛИЧЕСТВО НАЙДЕННОГО
LD (IX+_TEK_PKT_L),0
LD (IX+_TEK_PKT_H),0 ;ОБНУЛЯЕМ ПОЗИЦИЮ ФАЙЛОВ И КУРСОРА
REOUT_HOB LD A,B
OR C ;ПРОВЕРКА КОЛИЧЕСТВА НАЙДЕННОГО
JP Z,NO_BAS ;ЕСЛИ 0, ТО НЕТ БАСИКОВ
LD HL,ERS_FLAGS
RES 2,(IY+55) ;ПРЕДПОЛОЖИТЕЛЬНО ФАЙЛОВ МЕНЕЕ ВЫСОТЫ ОКНА
LD A,B
AND A
LD A,V_FILE-2
JR NZ,FINDBAS2 ;ЕСЛИ БОЛЕЕ 256 ФАЙЛОВ, ТО ПОЛНАЯ ВЫСОТА ОКНА
LD A,C
CP V_FILE-1
JR C,FINDBAS2
SET 2,(IY+55) ;ФАЙЛОВ БОЛЬШЕ ВЫСОТЫ ОКНА
LD A,V_FILE-2
FINDBAS2 LD C,A
ADD A,2
LD (IX+_V_SIZE),A ;УСТАНОВКА ВЫЧИСЛЕННОЙ ВЫСОТЫ ОКНА
LD (IX+_H_SIZE),H_FILE ;УСТАНОВКА ШИРИНЫ ОКНА
FINDBAS6 BIT B_RUN_FAT,(HL)
JR Z,FINDBAS5 ;ЕСЛИ РАБОТА С TR-DOS, ТО ПЕРЕХОДИМ НА ВЫВОД ОКНА
LD A,C
CP FH_FILE-1
JR C,FINDBAS9
LD C,FH_FILE-2
FINDBAS9 LD A,C
LD (KOL4OUT),A
LD (IX+_V_SIZE),FH_FILE
LD (IX+_H_SIZE),FV_FILE
RST8 _WINW
JR FINDBAS7
FINDBAS5 LD A,(ERS_FLAGS)
AND M_RUN_FAT
JR NZ,FINDBAS8
LD (IX+_H_SIZE),H_FILE-4
FINDBAS8 RST8 _WINW
FINDBAS7 CALL OUT_TEK_DIR ;ВЫВОДИМ КУСОЧЕК ДИРЕКТОРИИ
JP _RULILKA
;ВЫВОД ЧАСТИ ДИРЕКТОРИИ С УКАЗАННОЙ ПОЗИЦИИ
OUT_TEK_DIR LD L,(IX+_TEK_PKT_L) ;ВЫВОД ДИРЫ TR-DOS ДИСКА
LD H,(IX+_TEK_PKT_H) ;ПОЛУЧИЛИ НОМЕР ТЕКУЩЕЙ ПОЗИЦИИ
LD E,(IX+_NUM_PKT) ;ПОЛУЧИЛИ ПОЗИЦИЮ КУРСОРА В ОКНЕ
XOR A
LD D,A
SBC HL,DE ;ВЫЧИСЛИЛИ ПОЗИЦИЮ ФАЙЛА С КОТОРОГО БУДЕМ ВЫВОДИТЬ
ADD HL,HL
LD A,(ERS_FLAGS)
AND M_RUN_FAT
JR NZ,OUT_TEK_FAT ;ПЕРЕХОД ЕСЛИ ДЛЯ FAT
;ВЫВОД ДЛЯ TR-DOS ФАЙЛОВ
LD DE,ADR_CAT
ADD HL,HL
ADD HL,HL
ADD HL,HL ;УМНОЖИЛИ НА РАЗМЕР ОПИСАТЕЛЯ
ADD HL,DE ;ВЫЧИСЛИЛИ АДРЕС ОПИСАТЕЛЯ С КОТОРОГО БУДЕМ ВЫВОДИТЬ
LD C,(IX+_V_SIZE)
DEC C
DEC C ;ВЫЧИСЛИЛИ СКОЛЬКО ВЫВОДИТЬ
LD D,(IX+_X_COORD)
LD E,(IX+_Y_COORD)
INC D
INC D
INC E ;ВЫЧИСЛИЛИ ПОЗИЦИЮ ВЫВОДА НА ЭКРАН
FINDBAS3 LD B,8 ;ПЕЧАТАЕМ ТОЛЬКО ИМЯ
PUSH DE
FINDBAS4 LD A,(HL)
INC HL
CALL PRT_SYM
DJNZ FINDBAS4
LD DE,8 ;8 СИМВОЛОВ НАПЕЧАТАЛИ, ОСТАЛЬНЫЕ 8 ПРОПУСКАЕМ
ADD HL,DE
POP DE
INC E
DEC C
JR NZ,FINDBAS3 ;ЕСЛИ НЕ КОНЧИЛИСЬ ПЕРЕХОДИМ НА ПЕЧАТЬ СЛЕДУЮЩЕГО ИМЕНИ
RET
;ВЫВОД ДИРЫ НА FAT
OUT_TEK_FAT LD DE,ADR_CAT_FAT
ADD HL,DE
LD D,(IX+_X_COORD)
LD E,(IX+_Y_COORD)
INC D
INC E ;ВЫЧИСЛИЛИ ПОЗИЦИЮ ВЫВОДА НА ЭКРАН
LD C,0
KOL4OUT EQU $-1
OTF2 PUSH BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
PUSH HL
PUSH DE
LD A,6
RST8 _COM_FAT,_POS_FILES
LD HL,BUF_FILEITEM
RST8 _COM_FAT,_READ_DIR
POP DE
PUSH DE
LD BC,0X0B
ADD HL,BC
LD A,(HL)
SBC HL,BC
AND 0X10
LD A,0 ;СИМВОЛ ПАПКИ
JR NZ,OTF4
LD A,1 ;СИМВОЛ ФАЙЛА
OTF4 CALL PRTSPECSYM
LD HL,OUT_NAME_FILET
RST8 _COM_FAT,_GET_LONGNAME
LD (LONG_NAME),A
CALL FILENAME8_3
POP DE
POP HL
POP BC
INC E
DEC C
JR NZ,OTF2
RET
FILENAME8_3 LD A,(ERS_FLAGS)
AND M_RUN_FAT
JR NZ,OTF5
LD B,8
OTF1 LD A,(HL)
INC HL
CALL PRT_SYM
DJNZ OTF1
RET
OTF5 EX DE,HL
LD A,H
ADD A,A
ADD A,A
ADD A,A
LD H,A
INC H
LD (OUT_NAME_FILE+1),HL
LD HL,OUT_NAME_FILET
LD BC,0
LONG_NAME EQU $-2
LD A,FV_FILE6
CP C
JR Z,OTF7
JR NC,OTF6
EX DE,HL
LD HL,FV_FILE6
ADD HL,DE
LD (HL),">"
INC HL
LD (HL),0
JR OTF7
OTF6 SUB C
ADD HL,BC
LD C,A
LD D,H
LD E,L
INC DE
LD (HL)," "
LDIR
XOR A
LD (DE),A
OTF7 LD HL,OUT_NAME_FILE
RST8 _PRINT_MESSAGE
RET
NO_BAS LD HL,ERS_FLAGS
BIT B_VIEW_IMG,(HL)
JP NZ,FILES_BROWSE
LD IX,NOBASIC
RST8 _WINW
JP _RULILKA
RUNFILE DI
CALL SHUT2AY ;БУМКАЛКА В AY
LD HL,ERS_FLAGS
BIT B_VIEW_IMG,(HL)
JR Z,RUNFILE2
LD IX,FAT_FILES
LD HL,ERS_FLAGS
SET B_VIEW_IMG,(HL)
JP RUN_HOB ;ПЕРЕХОД НА ЗАГРУЗКУ И ЗАПУСК ИЗ SCL ОБРАЗА
RUNFILE2 LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H) ;НОМЕР ВЫБРАННОГО ФАЙЛА
LD DE,ADR_CAT
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE ;ОТКУДА ИМЯ ФАЙЛА ВЗЯТЬ
RUNFILE1 LD DE,RUNNAM
LD BC,8
LDIR
LD HL,0X3E08+0XA7
LD DE,0XFFFF
LD C,0XA8 ;21 символ UDG
LDDR
LD HL,RUN_BASIC
LD DE,0X5D3B
LD BC,ERUN_BASIC-RUN_BASIC
LDIR ;ПЕРЕНОС БЕЙСИК ПРОГИ ДЛЯ ЗАПУСКА
CALL MEMSET ;ВЫСТАВИЛИ РЕЖИМ КОМПА
CALL FOR_RUN
EI
LD BC,0XFF56
CALL 0X1EB7
LD HL,0X1B7D ;ЗАПУСК ПЕРЕНЕСЕННОЙ БЕЙСИК ПРОГИ
PUSH HL
LD HL,0X6000
LD DE,0X6001
LD BC,0XFF00-0X6000
LD (HL),0
JP 0X33C3
FOR_RUN SET 3,(IY+1)
LD IY,ERR_NR
LD (IY),0XFF
SET 7,(IY+1)
RES 4,(IY+1)
LD HL,0X2758
EXX
LD A,0XC9
LD (TRD_5CC2),A
LD HL,0
LD (NEWPPC),HL
XOR A
LD (NSPPS),A
RET
;КРУГОВОЙ ПЕРЕБОР ИМЕНИ ДИСКОВОДА 1-4 (A-D)
NEXTDRIVE LD A,(TXT_DRIVE) ;ВЗЯЛИ БУКВУ ТЕКУЩЕГО ДИСКОВОДА
INC A ;+1, ТО ЕСТЬ ВЫБРАЛИ СЛЕДУЮЩИЙ ПО ПОРЯДКУ
SUB 0X10 ;ПРЕВРАТИЛИ В НОМЕР
CP "5" ;ЕСЛИ ПРЕВЫСИЛИ 4
JR C,SELDRV1
SUB 4 ;ТО ИЗМЕНИЛИ НА НОМЕР ПЕРВЫЙ
JR SELDRV1
NEXTVIRT LD HL,MAINLOP
PUSH HL
LD A,(ERS_FLAGS)
AND M_CLOCK_ON
RET Z
LD H,VIRT_REAL_DRIVE
CALL READCMOS
AND 3 ;A=СДВИНУТЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
INC A
CP 4
JR C,NEXTVIRT1
XOR A
NEXTVIRT1 LD D,A ;СОХРАНИЛИ ВИРТУАЛЬНЫЙ ДИСКОВОД
LD A,L
AND %11111100 ;A=СБРОСИЛИ СТАРЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
OR D ;ДОБАВИЛИ НОВЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
LD L,A
CALL WRITECMOS ;СОХРАНИЛИ НОМЕР РЕАЛЬНОГО И ВИРТУАЛЬНОГО ДИСКОВОДА
; RST8 _MOUNTER,_MOUNT_RAMDISK ;МОНТИРОВАНИЕ РАМДИСКА
CALL REST2X2
CALL PRT_VIRTDRV
LD A,(ERS_FLAGS)
AND M_MOUSE_ON
RET Z
JP DRAW_MOUSE
;ИЗМЕНЕНИЕ НОМЕРА ДИСКОВОДА И СОХРАНЕНИЕ В КМОСЕ ЕСЛИ ТАКОВОЙ ОБНАРУЖЕН
SELDRV LD A,(LAST_K) ;ВЗЯЛИ НОМЕР ДИСКОВОДА
SELDRV1 SUB "1" ;ОБРАТИЛИ В БИНАРНЫЙ ВИД ДЛЯ ЗАПИСИ В ПЕРЕМЕННУЮ
LD HL,MAINLOP ;АДРЕС КУДА ВЕРНУТЬСЯ ПОСЛЕ ЗАПИСИ
PUSH HL
SELDRVPP LD (DRV_SYM),A ;СОХРАНИЛИ НОВЫЙ НОМЕР РЕАЛЬНОГО ДИСКОВОДА
RLCA
RLCA
LD D,A ;СДВИНУТЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
LD A,(ERS_FLAGS)
AND M_CLOCK_ON
RET Z ;ЕСЛИ КМОС НЕ НАЙДЕН, ВЫХОДИМ
LD H,VIRT_REAL_DRIVE
CALL READCMOS
AND %11110011 ;СБРОСИЛИ СТАРЫЙ НОМЕР РЕАЛЬНОГО ДИСКОВОДА
OR D ;ДОБАВИЛИ НОВЫЙ НОМЕР РЕАЛЬНОГО ДИСКОВОДА
LD L,A
CALL WRITECMOS ;СОХРАНЯЕМ В КМОСЕ
CALL SET_DRIVE ;УСТАНОВКА ИЗМЕНЕНИЯ
CALL REST2X2 ;ВОССТАНОВИЛИ ПОД КУРСОРОМ МЫШИ
CALL PRT_DRV_SYM ;ПЕРЕПЕЧАТАЛИ СТРОКУ О ДИСКОВОДАХ
LD A,(ERS_FLAGS)
AND M_MOUSE_ON
RET Z
JP DRAW_MOUSE ;НАРИСОВАЛИ МЫШЬ НА СТАРОМ МЕСТЕ
;FIX mouse key if no mouse
ONERNCLS LD A,(ERS_FLAGS)
AND M_MOUSE_ON
JR Z,ONERNC1
LD A,0XFA
IN A,(0XDF)
RRA
JP NC,_STUPID
ONERNC1 POP AF
EX (SP),HL
RET
;ПЕРЕХВАТ ДИСКОВОЙ ОШИБКИ ДЛЯ ОБРАБОТКИ
ONERR EX (SP),HL
PUSH AF
PUSH DE
PUSH HL
LD DE,0X1303
AND A
SBC HL,DE
POP HL
POP DE
JR Z,ONERR1
PUSH DE
PUSH HL
LD DE,0X0D6B
AND A
SBC HL,DE
POP HL
POP DE
JR NZ,ONERNCLS
; LD A,H
; CP HIGH (0X0D6B)
; JR NZ,ONERNCLS
; LD A,L
; CP LOW (0X0D6B)
; JR NZ,ONERNCLS
ONERR1 POP HL
POP HL
POP HL
POP HL
POP HL
EI
CALL GLUDIN
LD HL,TRD_5CF4
LD A,(HL) ;ВЗЯЛИ НОМЕР СЕКТОРА
INC A
CALL DIV10
LD (NUM_SEC_TXT+1),A
LD A,D
LD (NUM_SEC_TXT),A
INC HL
LD A,(HL) ;ВЗЯЛИ НОМЕР ТРЕКА
SRL A
LD E,A
ADC A,"0"
SUB E
LD (SIDE_DISK),A ;СТОРОНА ДИСКА
LD A,E
CALL DIV10
LD (NUM_TRK_TXT+1),A
LD A,D
LD (NUM_TRK_TXT),A
LD IX,DSK_ERR ;ОКНО ВЫВОДИМ ПОЛНОСТЬЮ
RST8 _WINW
JP _RULILKA
RESET_VG LD C,0XFF
XOR A
LD IX,0X3FF0 ;OUT (C),A
CALL DOSIX
LD A,(DRV_SYM)
OR 0X3C
LD HL,0X2A53
CALL SET_DOS_PAGE ;установка DOS страницы
LD A,0X68 ;шаг назад
LD C,0X1F
CALL DOSIX
LD HL,DSTUPID
LD (ERR_SP),HL
LD A,0XC3
LD (TRD_5CC2),A
LD HL,ONERR
LD (TRD_5CC3),HL
RET
SET_DOS_PAGE PUSH HL
DOSIX PUSH IX
JP TO_DOS
;ПРОВЕРКА НАЛИЧИЯ МАРКЕРА РАМДИСКА, ПРИ ОТСУСТВИИ СОЗДАНИЕ ДИСКА НА 640КБ
DISK_NONE PEC_ON M_SHADOW_BF
LD A,RAM_RAMDISK
LD BC,WIN_P1
OUT (C),A
LD HL,0X7FFF
LD A,(HL)
DEC H
CP "R"
JR NZ,DISK_NONE1
LD A,(HL)
CP "D"
DISK_NONE1 EX AF,AF'
LD A,ZXSTD_CPU1;0XFA
OUT (C),A
PEC_OFF M_SHADOW_BF
EX AF,AF'
LD HL,ERS_FLAGS
RES B_LOAD_IMG,(HL)
JP NZ,CREATE_TRDRAM ;МАРКЕР НЕ ОБНАРУЖЕН, СОЗДАТЬ
RET
DIV10 LD D,0X30-1
INC D
SUB 0X0A
JR NC,$-3
ADD A,0X0A+0X30
RET
_RETRY LD A,"R"
JR $+4
_IGNORE LD A,"I"
LD HL,0X3F7E
EX (SP),HL
DI
JP TO_DOS