;LAST UPDATE: 17.07.2014 savelij
;ИНФА ДЛЯ СОЗДАНИЯ 9 СЕКТОРА НОВОГО ДИСКА
DSKINFO DB 0 ;+0XE1-НОМЕР ПЕРВОГО СВОБОДНОГО СЕКТОРА
DB 1 ;+0XE2-НОМЕР ПЕРВОГО СВОБОДНОГО ТРЕКА
DB 0X16 ;+0XE3-ТИП ДИСКЕТЫ
DB 0 ;+0XE4-КОЛИЧЕСТВО ФАЙЛОВ НА ДИСКЕТЕ
SECFREE DW 2544 ;+0XE5-КОЛИЧЕСТВО СВОБОДНЫХ СЕКТОРОВ
DB 0X10 ;+0XE7-ИДЕНТИФИКАЦИОННЫЙ КОД TRDOS
DW 0 ;+0XE8-2 БАЙТА 0
DUPL 9," " ;+0XEA-9 БАЙТ 0X20
DB 0 ;+0XF3-1 БАЙТ 0
DB 0 ;+0XF4-КОЛИЧЕСТВО УДАЛЕННЫХ ФАЙЛОВ
DB "RAMDISKO" ;+0XF5-ИМЯ ДИСКЕТЫ
DSK_END
SET_RWPORT0 PUSH BC
PUSH AF
LD BC,CMOSD_SET_ADR
LD A,VIRT_REAL_DRIVE
OUT (C),A
LD B,HIGH (CMOSD_RD_WR)
IN A,(C)
AND 0X0F
LD C,A
IN A,(RW_PORT0)
AND 0XF0
OR C
OUT (RW_PORT0),A
POP AF
POP BC
RET
DOS2RST8 EX (SP),HL ;HL
PUSH AF ;AF
PUSH BC ;BC
LD A,R
JP PE,DOS2RST8_01
LD A,R
DOS2RST8_01 DI
PUSH AF ;RF
PUSH HL ;ADR_RET
PUSH DE ;DE
IN A,(PEVO_CONF)
LD L,A
OR 1
OUT (PEVO_CONF),A
LD BC,RD_1WINA0
IN A,(C)
AND 0X3E
LD BC,RD_1WINA0
IN H,(C)
RES 0,H
LD B,HIGH (RD_DOS7FFD)
IN E,(C)
RES 4,E
DEC B
IN D,(C)
LD BC,WIN_A0
OUT (C),A
LD B,HIGH (WIN_P0)
XOR A
JP ADR_SEL_ROM
EDOS2RST8 LD BC,DOS_NOEMUL
LD A,(BC)
AND 0X3E
CP E
JR Z,EDOS2RST02
INC BC
EDOS2RST02 LD A,(BC)
LD BC,WIN_A0
CALL WR_BYTE_RET
LD A,L
OUT (PEVO_CONF),A
POP DE
POP HL
POP AF
JP PO,EDOS2RST01
EI
EDOS2RST01 POP BC
POP AF
EX (SP),HL
RET
CMP_SPECSYM LD HL,(TRD_5CD9)
LD A,(HL)
CP "."
JP NZ,FIND_KEYWORD
POP HL
RET
;ABCDEFGHIJKLMNOPQRSTUVWXYZ
EXTEND_COM
DB 2,"CD"
DW CD
DB 7,"CLRCMOS"
DW CLRCMOS
DB 3,"DIR"
DW DIR
DB 5,"DRIVE"
DW DRIVE
DB 4,"HELP"
DW HELP
DB 5,"MOUNT"
DW MOUNT
DB 6,"UMOUNT"
DW UMOUNT
DB 3,"VER"
DW PRT_VERS
DB 4,"VIRT"
DW SET_VIRT
DB 0
END_EXT_COM INC DE
LD A,(DE)
CP ":"
DEC DE
JP NZ,SINTAX_ERROR
LD A,(DE)
AND 0DFH
SUB "A"
JP C,SINTAX_ERROR
CP 4
JR NC,SELFATDRV
LD (TRD_5CF6),A ; ДИСКОВОД ДЛЯ ВРЕМЕННОЙ ОПЕРАЦИИ
LD (TRD_5D19),A ; ДИСКОВОД ПО УМОЛЧАНИЮ
LD B,A
LD A,(TRD_5D16) ; КОПИЯ СИСТЕМНОГО РЕГИСТРА (ПОРТ #FF)
AND 7CH
OR B
LD (TRD_5D16),A ; КОПИЯ СИСТЕМНОГО РЕГИСТРА (ПОРТ #FF)
RST 0X30
DB _OUT_FF
JP ERR_OK
SELFATDRV SUB 4
PUSH AF
RST 8
DB _COM_DEV
DB _DEVFIND
RST 8
DB _COM_DEV
DB _KOL_VOL
POP AF
CP E
JP NC,SINTAX_ERROR
RST 8
DB _COM_DEV
DB _SET_VOL
JP ERR_OK
COM_DOT CALL EXIT_IF_SINTAX
LD HL,EXTEND_COM
NEXT_CMP_COM LD A,1
LD (TRD_5CEF),A
LD DE,(TRD_5D11)
INC DE
LD A,(HL)
INC HL
AND A
JP Z,END_EXT_COM
LD B,A
LOC_C34 LD A,(DE)
AND 0DFH
CP (HL)
JR NZ,PROPUSK
INC DE
INC HL
DJNZ LOC_C34
LD A,(DE)
CP 0DH
JR Z,NO_PARAM
CP " "
JR Z,GET_PARAM
JR LOC_C58
PROPUSK INC HL
DJNZ PROPUSK
LOC_C58 INC HL
INC HL
JR NEXT_CMP_COM
GET_PARAM INC DE
NO_PARAM LD A,(HL)
INC HL
LD H,(HL)
LD L,A
PUSH HL
LD HL,END_COMAND
EX (SP),HL
JP (HL)
;ВЫВОД ИМЕНИ ВИРТУАЛЬНОГО ДИСКА ЕСЛИ НЕ УКАЗАНО ИМЯ ДЛЯ ИЗМЕНЕНИЯ
PRT_NUM_VIRT LD HL,TXT4VIRTDRV
LD B,ETXT4VIRTDRV-TXT4VIRTDRV-1
CALL PRT_B_HL_
LD A," "
RST 0X10
LD H,VIRT_REAL_DRIVE
CALL READCMOS
AND 3
ADD A,"A"
RST 0X10
LD A,0X0D
RST 0X10
RET
;УСТАНОВКА ВИРТУАЛЬНОГО ДИСКА
SET_VIRT LD A,(DE)
CP 0X0D
JR Z,PRT_NUM_VIRT
LD C,A
INC DE
LD A,(DE)
CP ":"
JP NZ,SINTAX_ERROR
LD A,C
CALL NUMDSK2BYTE ;ПОЛУЧИЛИ НОВЫЙ НОМЕР ДИСКОВОДА УКАЗАННЫЙ В КОМАНДНОЙ СТРОКЕ
LD D,A ;СОХРАНИЛИ ВРЕМЕННО СДВИНУТЫЙ НОВЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
IN A,(RW_PORT0)
AND %11111100
OR D
OUT (RW_PORT0),A
LD H,VIRT_REAL_DRIVE
CALL READCMOS
AND %11111100 ;СБРОС СТАРОГО НОМЕРА ВИРТУАЛЬНОГО ДИСКОВОДА
OR D ;ДОБАВИЛИ НОВЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
LD L,A
RST 8
DB _CMOS_RW
DB _WRITE_CMOS
RET
;ПЕЧАТЬ ВЕРСИИ ДОСА И ДАТЫ КОМПИЛЯЦИИ
PRT_VERS LD HL,0X3FF8
LD B,6
CALL PRT_B_HL_
LD A," "
RST 0X10
LD C,(HL)
INC HL
LD B,(HL)
PUSH BC
LD HL,ZASTAVKA_VER
LD B,9
CALL PRT_B_HL_
LD A," "
RST 0X10
POP BC
LD A,C
AND 0X1F ;НУЖНЫ 5 БИТ-ЧИСЛО МЕСЯЦА
CALL A2TXT ;КОНВЕРСИЯ И УКЛАДКА ДАТЫ
SRL B
RR C ;СДВИНУЛИ ДЛЯ ЦЕЛОСТНОСТИ НОМЕРА МЕСЯЦА
LD A,"."
RST 0X10
LD A,C ;ВЗЯЛИ БИТЫ МЕСЯЦА
RRCA
RRCA
RRCA
RRCA ;СДВИНУЛИ В МЛАДШИЕ БИТЫ
AND 0X0F ;НАМ НУЖНЫ ТОЛЬКО 4 БИТА МЕСЯЦА
CALL A2TXT ;КОНВЕРСИЯ И УКЛАДКА МЕСЯЦА
LD A,"."
RST 0X10
LD A,B ;ВЗЯЛИ НОМЕР ГОДА
AND 0X3F ;НУЖНЫ ТОЛЬКО 6 БИТ
CALL A2TXT ;КОНВЕРСИЯ И УКЛАДКА ГОДА
BIT 6,B ;ЕСЛИ БИТ 6 (СДВИНУТЫЙ БИТ 7) УСТАНОВЛЕН
RET Z
LD HL,TXT_BETA
RST 0X18
LD A,0X0D
RST 0X10
RET
;ПЕЧАТЬ B=КОЛИЧЕСТВО СИМВОЛОВ ИЗ HL=АДРЕС ТЕКСТА ДЛЯ ВЫВОДА
PRT_B_HL_ LD A,(HL)
INC HL
RST 0X10
DJNZ PRT_B_HL_
RET
TXT_BETA DC " beta"
;ПЕРЕВОД "A" В ДЕСЯТИЧКУ И В ТЕКСТ
A2TXT LD L,A
LD H,0
LD DE,10
XOR A
DEC A
INC A
SBC HL,DE
JR NC,$-3
ADD HL,DE
ADD A,"0"
RST 0X10
LD A,L
ADD A,"0"
RST 0X10
RET
DRIVES DC "Drives: "
EDRIVES
DRIVE RST 8
DB _COM_DEV
DB _DEVFIND
JP C,FAT_NOT_FOUND
RST 8
DB _COM_DEV
DB _KOL_VOL
LD A,"D"
ADD A,E
PUSH AF
LD HL,DRIVES
RST 0X18
LD A,"E"
RST 0X10
LD A,"-"
RST 0X10
POP AF
RST 0X10
RET
TXT_DIR DC "<DIR> "
TXT_FATERR DC "FAT not found"
DIR LD B,0
LD A,(DE)
INC DE
CP "/"
JR NZ,DIR06
LD A,(DE)
AND 0XDF
CP "L"
JR NZ,DIR06
LD B,A
DIR06 RST 8
DB _COM_DEV
DB _DEVFIND
JR NC,DIR061
FAT_NOT_FOUND CALL OPEN_CHAN_0
LD HL,TXT_FATERR ;НИ ОДНОГО РАЗДЕЛА НЕ НАЙДЕНО
RST 0X18
RET
DIR061 PUSH IX
LD IXL,B
CALL CLEAR_SCREEN
CALL OPEN_CHAN_2
LD A,2
RST 8
DB _COM_FAT
DB _POS_FILES
DIR05 LD E,0X17
DIR01 PUSH DE
PUSH BC
LD HL,TRD_5D25
RST 8
DB _COM_FAT
DB _READ_DIR
LD DE,0X0B
ADD HL,DE
LD A,(HL)
SBC HL,DE
AND 0X10
JR Z,DIR04
PUSH HL
LD HL,TXT_DIR
RST 0X18
POP HL
DIR04 LD A,IXL
AND A
JR Z,DIR08
PUSH HL
RST 8
DB _COM_FAT
DB _GET_LONGNAME
POP HL
DIR03 LD A,(HL)
AND A
JR Z,DIR02
INC HL
RST 0X10
JR DIR03
DIR08 LD B,8
DIR081 LD A,(HL)
CP " "
JR Z,DIR082
RST 0X10
INC HL
DJNZ DIR081
DIR082 LD A,B
AND A
JR Z,DIR085
DIR086 LD A,(HL)
CP " "
JR NZ,DIR085
INC HL
DJNZ DIR086
DIR085 LD A,(HL)
CP " "
JR Z,DIR084
LD A,"."
RST 0X10
DIR084 LD B,3
DIR083 LD A,(HL)
CP " "
JR Z,DIR02
RST 0X10
INC HL
DJNZ DIR083
DIR02 LD A,0X0D
RST 0X10
LD A,4
LD B,1
RST 8
DB _COM_FAT
DB _POS_FILES
POP HL
AND A
SBC HL,BC
POP DE
JR Z,DIR07
DEC E
JR NZ,DIR01
JR DIR05
DIR07 POP IX
RET
CD PUSH DE
RST 8
DB _COM_DEV
DB _DEVFIND
POP HL
RST 8
DB _COM_FAT
DB _FIND_NAME
JP C,SINTAX_ERROR
RST 8
DB _COM_FAT
DB _ENTER_DIR
RET
NOMER_DRV RST 8
DB _COM_DEV
DB _DEVFIND
CCF
RET NC ;НИ ОДНОГО РАЗДЕЛА НЕ НАЙДЕНО
RST 8
DB _COM_DEV
DB _KOL_VOL
CALL CREATE_BUF
LD HL,TRD_5D25
RST 8
DB _COM_FAT
DB _GET_PATH
CALL PRINT2ZERO
CALL DEL_BUF
SCF
RET
MOUNT PUSH DE
RST 8
DB _COM_DEV
DB _DEVFIND
EX DE,HL
POP HL
JP C,FAT_NOT_FOUND
PUSH HL
RST 8
DB _COM_FAT
DB _FIND_NAME
JP C,SINTAX_ERROR
POP DE
LD B,0X0C
MOUNT02 LD A,(DE)
CP "!"
JR C,MOUNT01
INC DE
DJNZ MOUNT02
MOUNT01 LD A,(DE)
CP 0X0D
JP Z,SINTAX_ERROR
CP " "
JP NZ,SINTAX_ERROR
INC DE
LD A,(DE)
CP "A"
JP C,SINTAX_ERROR
AND 0XDF
CP "E"
JP NC,SINTAX_ERROR
SUB "A"
LD C,A
INC DE
LD A,(DE)
CP ":"
JP NZ,SINTAX_ERROR
LD A,C
RST 8
DB _MOUNTER
DB _OPEN_MOUNT
RET
WR_RD_SEC_M PUSH IX
LD (TEMP_SP),SP
LD HL,(DOS_STEK)
LD DE,SAVED_RAM
LD BC,0X10
LDIR
LD SP,HL
IN A,(RW_PORT1) ;ВЗЯЛИ НОМЕР ТРЕКА
ADD A,A ;СТОРОН 2
LD D,A
LD A,(WR_FF)
AND 0X10 ;ПРОВЕРКА КАКАЯ СТОРОНА ДИСКА
JR NZ,WRRDSECM1
INC D ;ДЛЯ СТОРОНЫ 1
WRRDSECM1 IN A,(RW_PORT2) ;ВЗЯЛИ НОМЕР СЕКТОРА
LD E,A ;D-ТРЕК, E-СЕКТОР
LD HL,(REG_L) ;HL=АДРЕС ЧТЕНИЯ/ЗАПИСИ
LD A,(WR_FF)
AND 3
LD C,A ;НОМЕР ДИСКОВОДА
LD A,IXL
AND A ;BIT 7=0-ЧТЕНИЕ
JR Z,WRRDSECM2
LD A,0X80 ;BIT 7=1-ЗАПИСЬ
WRRDSECM2 OR C
LD IXL,A ;A=НОМЕР ДИСКОВОДА+БИТ ЧТЕНИЯ/ЗАПИСИ
LD A,(TEK_ROMPAGE)
AND 0X3E
LD IXH,A
LD BC,WIN_A0
OUT (C),A
LD A,IXL
RST 8
DB _MOUNTER
DB _RDWR_MOUNT
LD BC,WIN_A0
LD A,IXH
OUT (C),A
LD B,HIGH (WIN_P0)
LD A,PAGE_EVODOS
OUT (C),A
LD (REG_L),HL ;ОБНОВИЛИ АДРЕС ЧТЕНИЯ/ЗАПИСИ
LD HL,SAVED_RAM
LD DE,(DOS_STEK)
LD BC,0X10
LDIR
LD SP,(TEMP_SP)
POP IX
RET
UMOUNT LD A,(DE)
INC DE
AND 0XDF
LD B,A
LD A,(DE)
INC DE
CP ":"
JP NZ,SINTAX_ERROR
LD A,B
CP "A"
JP C,SINTAX_ERROR
CP "E"
JP NC,SINTAX_ERROR
SUB "A"
RST 8
DB _MOUNTER
DB _CLOSEMOUNT
RET
CLRCMOS RST 8
DB _CMOS_RW
DB _CLEAR_CMOS
RET
HELP CALL CLEAR_SCREEN
CALL OPEN_CHAN_2
LD HL,EXTEND_COM
HELP4 LD C,3
HELP2 LD A,(HL)
AND A
RET Z
INC HL
LD B,A
PUSH BC
LD A,"."
RST 0X10
HELP1 LD A,(HL)
INC HL
RST 0X10
DJNZ HELP1
INC HL
INC HL
POP BC
LD A,9
SUB B
LD B,A
HELP3 LD A," "
RST 0X10
DJNZ HELP3
DEC C
JR NZ,HELP2
LD A,0X0D
RST 0X10
JR HELP4
BUGFIX_3EBF PUSH AF
PUSH HL
CALL GET_TIME_HEAD
LD B,A
POP HL
POP AF
JP HEAD_POSITION
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
;АЛЬТЕРНАТИВНОЕ КОПИРОВАНИЕ СЕКТОРА ДЛЯ РАМДИСКА
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 _WR_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
DISK_NONE PUSH HL
PUSH BC
LD BC,WIN_A1
LD A,0X40
OUT (C),A
LD B,HIGH (WIN_P1)
LD A,PAGE_RAMDISK
OUT (C),A
LD HL,CPU1+0XFFF
LD A,(HL)
DEC H
CP "R"
SCF
JR NZ,DISK_NONE1
LD A,(HL)
CP "D"
SCF
JR NZ,DISK_NONE1
XOR A
DISK_NONE1 POP BC
POP HL
RET
;ВОЗВРАТ В ОКНА CPU1 И CPU2 УСТАНОВЛЕННЫХ СТРАНИЦ
WRITE_CONF LD BC,(BB_CPU1)
LD A,C
LD C,LOW (WIN_A0)
OUT (C),A
LD BC,(BB_CPU2)
LD A,C
LD C,LOW (WIN_A0)
OUT (C),A
RET