;LAST UPDATE: 04.08.2019 savelij
TITLE "extend.a80"
;[ИНФА ДЛЯ СОЗДАНИЯ 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
;[ОБРАБОТЧИК ВЫЗОВА RST 8]
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
;ABCDEFGHIJKLMNOPQRSTUVWXYZ
EXTEND_COM
BBW "CD",CD
BBW "CLRCMOS",CLRCMOS
BBW "DIR",DIR
BBW "DRIVE",DRIVE
BBW "HELP",HELP
BBW "MOUNT",MOUNT
BBW "UMOUNT",UMOUNT
BBW "VER",PRT_VERS
BBW "VIRT",SET_VIRT
BBW "ROM",VIEW_ROM
DB 0
VIEW_ROM LD HL,ROM_VER
JP PRT_ROMVER
;[ОБРАБОТЧИК РАСШИРЕННЫХ КОМАНД]
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)
LD HL,ERR_OK
PUSH HL
SET_CURRVIRT LD H,VIRT_REAL_DRIVE
CALL READCMOS
AND %00000011
LD L,A
LD A,B
RLCA
RLCA
OR L
LD L,A
RST8D _CMOS_RW,_WRITE_CMOS
; RST8D _MOUNTER,_GET_VIRT_BITS
; RST30 _SET_VIRT_BITS
RRCA
RRCA
AND 3
OR 0X3C
RST30 _OUT_FF
RET
SELFATDRV SUB 4
PUSH AF
RST8D _COM_DEV,_DEVFIND
RST8D _COM_DEV,_KOL_VOL
POP AF
CP E
JP NC,SINTAX_ERROR
RST8D _COM_DEV,_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 ;СОХРАНИЛИ ВРЕМЕННО СДВИНУТЫЙ НОВЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
LD H,VIRT_REAL_DRIVE
CALL READCMOS
AND %11111100 ;СБРОС СТАРОГО НОМЕРА ВИРТУАЛЬНОГО ДИСКОВОДА
OR D ;ДОБАВИЛИ НОВЫЙ НОМЕР ВИРТУАЛЬНОГО ДИСКОВОДА
LD L,A
RST8D _CMOS_RW,_WRITE_CMOS
; AND 3
; RST8D _MOUNTER,_MOUNT_RAMDISK
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
PRT_ROMVER 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 RST8D _COM_DEV,_DEVFIND
JP C,FAT_NOT_FOUND
RST8D _COM_DEV,_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]
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 RST8D _COM_DEV,_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
RST8D _COM_FAT,_POS_FILES
DIR05 LD E,0X17
DIR01 PUSH DE
PUSH BC
LD HL,TRD_5D25
RST8D _COM_FAT,_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
RST8D _COM_FAT,_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
RST8D _COM_FAT,_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]
CD PUSH DE
RST8D _COM_DEV,_DEVFIND
POP HL
RST8D _COM_FAT,_FIND_NAME
JP C,SINTAX_ERROR
RST8D _COM_FAT,_ENTER_DIR
RET
NOMER_DRV RST8D _COM_DEV,_DEVFIND
CCF
RET NC ;НИ ОДНОГО РАЗДЕЛА НЕ НАЙДЕНО
RST8D _COM_DEV,_KOL_VOL
CALL CREATE_BUF
LD HL,TRD_5D25
RST8D _COM_FAT,_GET_PATH
CALL PRINT2ZERO
CALL DEL_BUF
SCF
RET
;[КОМАНДА MOUNT]
MOUNT PUSH DE
RST8D _COM_DEV,_DEVFIND
EX DE,HL
POP HL
JP C,FAT_NOT_FOUND
PUSH HL
RST8D _COM_FAT,_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
RST8D _MOUNTER,_OPEN_MOUNT
RET
;[КОМАНДА UMOUNT]
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"
RST8D _MOUNTER,_CLOSEMOUNT
RET
;[КОМАНДА ОЧИСТКИ CMOS]
CLRCMOS RST8D _CMOS_RW,_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
IF EMU
READ_BYTE_HL PUSH BC
PUSH HL
LD A,(NUM_ALT_PAGE)
PUSH AF
LD A,ROM_BAS48|0X80
LD BC,WIN_A0
CALL WR_BYTE_RET
LD L,(HL)
POP AF
CALL WR_BYTE_RET
LD A,L
CP 0X0D
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
RST30 _OUT_5F
LD A,D
PUSH HL
CALL COM_02
POP HL
RST30 _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
;[ЧТЕНИЕ/ЗАПИСЬ СЕКТОРА ПРИМОНТИРОВАННОГО ОБРАЗА]
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
LD A,(PORT_3F) ;ВЗЯЛИ НОМЕР ТРЕКА
ADD A,A ;СТОРОН 2
LD D,A
LD A,(WR_FF)
AND 0X10 ;ПРОВЕРКА КАКАЯ СТОРОНА ДИСКА
JR NZ,WRRDSECM1
INC D ;ДЛЯ СТОРОНЫ 1
WRRDSECM1 LD A,(PORT_5F) ;ВЗЯЛИ НОМЕР СЕКТОРА
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
RST8D _MOUNTER,_RDWR_MOUNT
LD BC,WIN_A0
LD A,IXH
OUT (C),A
LD B,HIGH (WIN_P0)
LD A,RAM_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
ENDIF
;[ЧТЕНИЕ CMOS]
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ПРОЧИТАННОЕ ЗНАЧЕНИЕ
READCMOS PUSH BC
LD BC,CMOSD_SET_ADR
OUT (C),H
LD B,HIGH (CMOSD_RD_WR)
IN L,(C)
POP BC
LD A,L
AND A
RET
;[ЗАПИСЬ CMOS]
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ЧТО ТУДА ЗАПИСАТЬ
WRITECMOS RST8D _CMOS_RW,_WRITE_CMOS
RET