; Строка ID бутлоадера MACRO _mSYSID DZ 'Starting...' ; первый символ в загрузчике ОС заменяется на номер стартового драйва, второй на номер активного загрузочного раздела ENDM ; ;[Вызов функций]----------------------------------------; ToBIOS EQU #08 ; для вызова из ОЗУ в SLOT0 (например из DSS) ToBIOS_18 EQU #18 ; для вызова из 8-й страницы ПЗУ в SLOT0 ToBIOS_3D13 EQU #3D13 ; для вызова из 8-й страницы ПЗУ в SLOT0 ToBIOS_FromEXT EQU #3FD0 ; для вызова из 0-й страницы ПЗУ в SLOT0 ;-------------------------------------------------------; MODULE BIOS ;BIOS: ;[Функции работы с памятью]-----------------------------; GetMemSize EQU #C0 ;#90 ; Определение объемов ОЗУ InitMem EQU #C1 ;#91 ; Инициализация распределения памяти. GetMem EQU #C2 ; Выделение блока ОЗУ FreeMem EQU #C3 ; Освободить блок ОЗУ GetMemPage EQU #C4 ; Получить физический номер страницы из блока памяти GetMemBlkPages EQU #C5 ; Получить список физических страниц блока GetBanksPorts EQU #C6 ; Получение адресов портов окон GetMemPageNext EQU #C7 ; Получить номер следующей страницы блока по предыдущему № GET_RAMD_NUM EQU #9B ; Получить номер RAM-Disk-а (0..15) по его block id SWAP_RAM_DRIVES EQU #9C ; Cменить набор рамдисков ZX <-> Sp2000 .Sp2000 EQU #009C ; Режим рамдисков Sp2000 .ZX EQU #FF9C ; Режим рамдисков ZX Spectrum mode .Info EQU #FE9C ; Узнать какой режим РАМ дисков установлен DivMemBlocks EQU #9D ; Разделение блока MergeMemBlocks EQU #9E ; Слияние блоков ;[Работа с блоками ОЗУ, как с RAM-Disks]----------------; BLK_RD_WR EQU #C8 ; Чтение/запись из/в блок памяти секторами по 256 байт GetMemRMD EQU #92 ; Получить блок памяти N bytes для RAM-Disk'а FreeMemRMD EQU #93 ; Освободить блок памяти для RAM-Disk'а GetMemPageRMD EQU #94 ; Получить физический номер страницы RAM-Disk'а RAMD_CALC_PAGE EQU #98 ; Вычисление страницы и адреса в RAM-Disk по абсолютному номеру сектора BLK_TO_RAMD EQU #C9 ; Назначить блок памяти RAM-Disk-у RAMD_CLEAR EQU #CA ; Освободить RAM-Disk GET_RAMD_ST EQU #CE ; Получение идентификатора блока, назначенного на RAM-Disk ;[Управление назначением на дисководы]------------------; RAMD_TO_DRV EQU #CB ; Назначение RAM-Disk на дисковод TR-DOS FDD_TO_DRV EQU #CC ; Назначение физического дисковода на логический HDD_TO_DRV EQU #CD ; Назначение винчестера на дисковод GET_DRV_ST EQU #CF ; Получить тип назначения на логический дисковод ;[Управление окнами и режимами экрана]------------------; WIN_OPEN EQU #B0 ; Функция открытия окна. WIN_CLOSE EQU #B1 ; закрытие окна WIN_COPY EQU #B2 ; Копирование данных текстового окна в память (запоминание окна) WIN_RESTORE EQU #B3 ; Копирование из памяти в текстовое окно (восстановление окна) WIN_GET_SYM EQU #B4 ; Взять символ с экрана WIN_PUT_SYM EQU #B5 ; Положить символ на экран WIN_SET_ZG EQU #B6 ; установка знакогенератора WIN_MOVE EQU #B7 ; Перемещение окна WIN_GET_ZG EQU #B8 ; Получение знакогенератора ;[Функции печати и упр. режимом экрана]-----------------; LP_OPEN_S EQU #80 ; Открытие стандартных окон. .ZX_32x24_Default EQU #0080 ; спектрумовское окно 32x24 .TXT_64x24_Default EQU #0180 ; текстовое окно 64x24 .TXT_40x32_Default EQU #0280 ; текстовое окно 40x24 .TXT_80x32_Default EQU #0380 ; текстовое окно 80x32 .ZX_32x24 EQU #0480 ; спектрумовское окно, HL - положение окна .TXT_64x24 EQU #0580 ; текстовое окно 64x24, HL - положение окна .TXT_40x32 EQU #0680 ; текстовое окно 40x32, HL - положение окна .TXT_80x32 EQU #0780 ; текстовое окно 80x32, HL - положение окна .Graf_0 EQU #0880 ; графическое окно 0, HL - положение окна .Graf_1 EQU #0980 ; графическое окно 1, HL - положение окна LP_PRINT_ALL EQU #81 ; Печать символов с атрибутом LP_PRINT_SYM EQU #82 ; Вывод символов на экран без атрибута LP_PRINT_ATR EQU #83 ; печать атрибутов LP_SET_PLACE EQU #84 ; Установка текущего знакоместа в окне LP_PRINT_LINE EQU #85 ; Вывод строки символов на экран с текущего знакоместа LP_PRINT_LINE2 EQU #86 ; Вывод строки символов на экран без атрибутов LP_PRINT_LINE3 EQU #87 ; Вывод строки символов до разделителя LP_PRINT_LINE4 EQU #88 ; Вывод строки символов до разделителя, без атрибутов LP_CLS_WIN EQU #89 ; Очистка экрана LP_SCROLL_UD EQU #8A ; Скроллинг части глобального окна вверх/вниз LP_PRINT_LINE5 EQU #8B ; Вывод строки символов на экран до разделителя LP_PRINT_LINE6 EQU #8C ; Вывод строки символов на экран до разделителя без атрибутов LP_CLS_WIN2 EQU #8D ; Очистка экрана с указанием символа заполнения LP_GET_PLACE EQU #8E ; Получить текущее положение вывода на экран LP_PR_LINE_DIR EQU #E0 ;!TODO недоделана. Печать "в консоль" до разделителя ;[Графические функции]----------------------------------; PIC_POINT EQU #A1 ; Установить точку PIC_SET_PAL EQU #A4 ; Установка палитры PIC_GET_PAL EQU #A4 ; Чтение палитры (номер такой же как у .PIC_SET_PAL) SET_PAL_INIT EQU #A6 ; Установка внутренней палитры ;[Работа с HDD. #4X (fast)]-----------------------------; HDD_INIT EQU #40 ; Инициализация винчестера HDD_RECAL EQU #41 ; Рекалибровка винчестера HDD_TEST_IDE EQU #42 ; Тест наличия интерфейса IDE HDD_PREPARE EQU #43 ; Подготовка винчестера к операции чтения/записи HDD_READ_BPB EQU #44 ; Читать BPB первого раздела HDD_READ EQU #45 ; Читать сектора с винчестера HDD_WRITE EQU #46 ; Писать сектора на винчестер HDD_PART EQU #47 ; Настройка партиций и master/slave HDD_READ_NEXT EQU #48 ; Читать следующий сектор (ONLY FOR LBA!) ;[Работа с HDD и дисководами. #5X]----------------------; DRV_RESET EQU #51 ; Сброс контроллера и настройка на диск DRV_READ_LONG EQU #52 ; Чтение с устройств в указанную страницу DRV_WRITE_LONG EQU #53 ; Запись на устройства в указанную страницу DRV_VERIFY EQU #54 ; Проверка секторов DRV_READ EQU #55 ; Чтение с устройства DRV_WRITE EQU #56 ; Запись на устройства DRV_DETECT EQU #57 ; Определение параметров устройства DRV_GET_PAR EQU #58 ; Получить параметры носителя DRV_SET_PAR EQU #59 ; Установить параметры носителя DRV_VERSION EQU #5A ; Номер версии дисковой спецификации. DRV_EXTENDED EQU #5E ; Расширенные функции для драйвов ; [x] 21/12/2023 .CD_Eject EQU #005E ; Открыть лоток CD .CD_Close EQU #015E ; Закрыть лоток CD DRV_LIST EQU #5F ; Список дисковых устройств ;-------------------------------------------------------; ;[Управление железом, опр. версии]----------------------; FN_TURBO EQU #8F ; Функция управления турбо режимом и FDD 720/1440 .OFF EQU #02 ; .ON EQU #03 ; .VG.OFF EQU #12 ; .VG.ON EQU #13 ; CheckInit EQU #97 ; Если обнаружен первый старт, то инициализация всей памяти, системных переменных FullInit EQU #9F ; Инициализация всей памяти, системных переменных FN_CRIPT EQU #ED ; Функция идентификации материнской платы и конфигурации .BoardNumber EQU #01ED ; Выдача полного Board Number .AcexAndBitstream EQU #02ED ; Выдача модели ACEX и версии битстрима в ROM RST_CONF: ; ; ; .AY8910 EQU #EE ; для совместимости с софтом Sp97, переключение в конфу AY8910 .SP97_1 EQU #F0 ; для совместимости с софтом Sp97, переключение в конфу Sprinter-1 .SP97_2 EQU #F1 ; для совместимости с софтом Sp97, переключение в конфу Sprinter-2 .CUSTOM EQU #F3 ; переключение конфигурации пользователя. SPRINTER_ALL ; ; ; ; FN_VERSION EQU #EF ; Выдача информации о версии BIOSа и железа. В буфере будет: .STR.FirmwareName EQU 1 ; № поля с названием прошивки .STR.PC_Name EQU 2 ; № поля с названием компьютера .STR.BitstreamVer EQU 3 ; № поля с версией битстрима в ПЗУ FN_SYNC EQU #F2 ; Установка синхронизации, очистка страницы режима экрана DCP_CONFIG EQU #F4 ; Функция управления дешифратором портов. ;[x] BIOS 3.05 + новая подфункция CMOS_TEST EQU #F5 ; Проверить наличие CMOS CMOS_RD EQU #F6 ; Читать из регистра CMOS CMOS_WR EQU #F7 ; Писать в регистр CMOS SET_PORTS EQU #F8 ; Установка внутренних портов. Функция в разработке READ_PORTS EQU #F9 ; Чтение внутренних портов. ;[x] 26/01/2024 GOTO_SPECTRUM EQU #FB ;[ ] доковырять REINIT EQU #FD ;[x] restart, soft/hard reset, reinit RAM ID for spectrum pages .RESTART EQU #01 ; .SOFT_RESET EQU #02 ; .HARD_RESET EQU #03 ; .SET_ZXPAGES EQU #04 ; ;-----------------------------------------------; ; ;----------------[ EROOR CODES ]----------------; Error: .NoErrors EQU 0 ; .InvalidSubFunction EQU 1 ; .BadNumber EQU 2 ; of drive or ramblock .UnknownDevice EQU 3 ; .NotReady EQU 4 ; .Seek EQU 5 ; .SectorNotFound EQU 6 ; or No Disk .CRC EQU 7 ; .WriteProtect EQU 8 ; .Read EQU 9 ; .Write EQU 10 ; .Failure EQU 11 ; .Busy EQU 12 ; DEVICE OPENED ;-----------------------------------------------; ; .NO_ERROR EQU #00 ; 00 - NO ERRORS ; .INVALID_COMMAND EQU #01 ; 01 - BAD COMMAND ; .INVALID_DRIVE EQU #02 ; 02 - BAD DRIVE NUMBER ; .UNKNOWN_FORMAT EQU #03 ; 03 - UNKNOW FORMAT ; .NOT_READY EQU #04 ; 04 - NOT READY ; .SEEK_ERROR EQU #05 ; 05 - SEEK ERROR ; .SECTOR_NOT_FOUND EQU #06 ; 06 - SECTOR NOT FOUND ; .CRC_ERROR EQU #07 ; 07 - CRC ERROR ; .WRITE_PROTECT EQU #08 ; 08 - WRITE PROTECT ; .READ_ERROR EQU #09 ; 09 - READ ERROR ; .WRITE_ERROR EQU #0A ; 10 - WRITE ERROR ; .GENERAL_FAILURE EQU #0B ; 11 - FAILURE ; .DEVICE_BUSY EQU #0C ; 12 - BUSY (DEVICE OPENED) ; ;.RESERVED EQU #0D ; 13 - RESERVED ;-----------------------------------------------; ; ; ;-----------------------[НЕПРОВЕРЕНО!!!]---------------------- ;============================================================= ; ..Внутренняя функция.. ; открыть графическое окно, с описателем в IX ; на месте HL, E - страница режима, седьмой бит E - режим BOND .PIC_FN0 EQU #A0 ;============================================================= ;============================================================= ; point 3D13h C=0A2h ; ВЫВОД ЛИНИИ 'FILL' вход: dE - вертикаль, HL - горизонталь. ; IX - длина линии в точках, A - цвет .PIC_FN2 EQU #A2 ;============================================================= ;============================================================= ; point 3D13h C=0A3h ; ВЫВОД ЛИНИИ 'COPY' вход: dE - вертикаль, IX - горизонт. ; A',HL' - адрес данных, откуда брать данные ; A' - страница RAM-Disk/MEM, HL' - адрес в стр.2 ; BC' - длина данных ; Выход: HL',A' - следующий байт в RAM-Disk !!! .PIC_FN3 EQU #A3 ;============================================================= ;============================================================= ; point 3D13h C=0A5h ; УСТАНОВКА СТРАНИЦЫ ВЫВОДА НА ЭКРАН Вход: E = 0/1 .PIC_FN5 EQU #A5 ;============================================================= ;============================================================= ; point 3D13h C=0A7h ;////// недоделанная !!! //////////////////////////// ; Рисование линий. Е - вертикаль, HL - горизонталь ; H' - высота, C'/DE',B' - add_parameters D - color ; C' = 80h, DE' = 0, B'=0 - для вертикальных линий ; Алгоритм: ; 1: Поставить точку цветом D ; HL,C + DE,B -> HL,C ; dec H' ; jr nz,1 .PIC_FN7 EQU #A7 ; point 3D13h C=0A8h .PIC_FN8 EQU #A8 ;============================================================= ;============================================================= ;/////// projected !!! //////////////////////////////// ; Рисование спрайтов ; E - вертикаль, IX - горизонталь ; D - код увеличения/уменьшения ; B - управляющий код ; 0 - Вывод постоянного спрайта ; 1 - Вывод временного спрайта ; 2 - Восстановление картинки под временным спрайтом ; HL - Special coding data ( данные спрайта форма, цвета.. ) ; flick-подобный формат .PIC_FN9 EQU #A9 ;============================================================= ENDMODULE ; BIOS ;-----------------------------------------------------------------------;