; Строка 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 ;[Управление назначением на дисководы]------------------; SET_DISK_REDIR EQU #99 ; Назначение на текущий логический дисковод TR-DOS заданного драйва (старая функция для TR-DOS!) GET_DISK_REDIR EQU #9A ; получить тип назначения на текущий логический дисковод TR-DOS (старая функция для TR-DOS!) RAMD_TO_DRV EQU #CB ; Назначение RAM-Disk на дисковод TR-DOS FDD_TO_DRV EQU #CC ; Назначение физического дисковода на логический TR-DOS HDD_TO_DRV EQU #CD ; Назначение винчестера на дисковод TR-DOS GET_DRV_ST EQU #CF ; Получить тип назначения на логический дисковод TR-DOS ;[Управление окнами и режимами экрана]------------------; 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 ; Положить символ на экран с атрибутом и знакогенератором .OnlySymbol EQU #00B5 ; Положить символ на экран .NoChangeZG EQU #01B5 ; Положить символ на экран с атрибутом 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 ; Установка внутренней палитры .CGA EQU 3*256 + SET_PAL_INIT .ZX EQU 2*256 + SET_PAL_INIT .GRAPHIC EQU 1*256 + SET_PAL_INIT ;[Работа с 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_GET_NAME EQU #50 ; узнать имя устройства 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 .ATAPI_Eject EQU #005E ; Открыть лоток CD .ATAPI_Close EQU #015E ; Закрыть лоток CD .ATAPI_Request_Sense EQU #025E ; [ ] .ATAPI_Custom_PCMD EQU #035E ; [ ] 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 ; [ ] доковырять ZX_MEMORY_MANAGER EQU #FC ; [ ] free zx pages! .FreeZXvPages.All EQU #40FC .FreeZXvPages.vRAM EQU #41FC .FreeZXvPages.vROM EQU #42FC .GetMem.Pent48 EQU #01FC .GetMem.Pent128 EQU #02FC .GetMem.Pent512 EQU #03FC .GetMem.Scorp EQU #04FC .SetCustomVroms EQU #80FC ; ; .MODE_48k EQU 3 ; .MODE_128k EQU 3+5 ; .MODE_256k EQU 3+13 ; .MODE_512k EQU 3+29 .MODE_48k EQU 3 .MODE_128k EQU 5 .MODE_256k EQU 13 .MODE_512k EQU 29 REINIT EQU #FD ; [x] restart, soft/hard reset, reinit RAM ID for spectrum pages .RESTART EQU #01FD ; .SOFT_RESET EQU #02FD ; .HARD_RESET EQU #03FD ; .FREE_NO_ZX_MEM EQU #04FD ; очистить память кроме страниц ZX-MODE ;-----------------------------------------------; ; ;----------------[ 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 ;reserved EQU 13 ; ;reserved EQU 14 ; ;reserved EQU 15 ; ;reserved EQU 16 ; ;reserved EQU 17 ; ;reserved EQU 18 ; ;reserved EQU 19 ; ;reserved EQU 20 ; ;reserved EQU 21 ; ;reserved EQU 22 ; ;reserved EQU 23 ; ;reserved EQU 24 ; ;reserved EQU 25 ; ;reserved EQU 26 ; ;reserved EQU 27 ; ;reserved EQU 28 ; ;reserved EQU 29 ; ;reserved EQU 30 ; .NotSupported EQU 31 ; ; Error.EMM: ; .InvalidBlockID EQU 0 ; .NoMemory EQU 1 ; ; Error.ATAPI EQU #20 ; MASK ;.bit EQU 5 ; Bit of MASK .NoSence EQU #00 + Error.ATAPI .RecoveredError EQU #01 + Error.ATAPI .NotReady EQU #02 + Error.ATAPI .MediumError EQU #03 + Error.ATAPI .HardwareError EQU #04 + Error.ATAPI .IllegalRequest EQU #05 + Error.ATAPI .UnitAttention EQU #06 + Error.ATAPI ; MediaChanged .DataProtect EQU #07 + Error.ATAPI ; EQU #08 + Error.ATAPI ; EQU #09 + Error.ATAPI ; EQU #0A + Error.ATAPI .AbortedCommand EQU #0B + Error.ATAPI ; EQU #0C + Error.ATAPI ; EQU #0D + Error.ATAPI .Miscompare EQU #0E + Error.ATAPI ; EQU #0F + Error.ATAPI .TimeOut EQU #10 + Error.ATAPI ; ; Error.ATAPI EQU #70 ; .NoSence EQU #70 ; .RecoveredError EQU #71 ; .NotReady EQU #72 ; .MediumError EQU #73 ; .HardwareError EQU #74 ; .IllegalRequest EQU #75 ; .UnitAttention EQU #76 ; MediaChanged ; .DataProtect EQU #77 ; ; EQU #78 ; ; EQU #79 ; ; EQU #7A ; .AbortedCommand EQU #7B ; ; EQU #7C ; ; EQU #7D ; .Miscompare EQU #7E ; ; EQU #7F ; .TimeOut EQU #80 ;-----------------------------------------------; ; .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 ; HL = X + Y*64 + #4000 + #1000*RGMOD. место на экране по знакоместам ; IX - описатель окна ; E - bit0: номер экрана .PIC_FN0_OpenWin EQU #A0 ;============================================================= ;============================================================= ; ВЫВОД ЛИНИИ 'FILL' вход: dE - вертикаль, HL - горизонталь. ; IX - длина линии в точках, A - цвет .PIC_FN2 EQU #A2 ;============================================================= ;============================================================= ; ВЫВОД ЛИНИИ 'COPY' вход: dE - вертикаль, IX - горизонт. ; A',HL' - адрес данных, откуда брать данные ; A' - страница RAM-Disk/MEM, HL' - адрес в стр.2 ; BC' - длина данных ; Выход: HL',A' - следующий байт в RAM-Disk !!! .PIC_FN3 EQU #A3 ;============================================================= ;============================================================= ; УСТАНОВКА СТРАНИЦЫ ВЫВОДА НА ЭКРАН Вход: E = 0/1 .PIC_FN5 EQU #A5 ;============================================================= ;============================================================= ;!FIXIT недоделанные !!! ; Рисование линий. Е - вертикаль, HL - горизонталь ; H' - высота, C'/DE',B' - add_parameters A - color ; C' = 80h, DE' = 0, B'=0 - для вертикальных линий ; Алгоритм: ; 1: Поставить точку цветом D ; HL,C + DE,B -> HL,C ; dec H' ; jr nz,1 .PIC_FN7 EQU #A7 .PIC_FN8 EQU #A8 ;============================================================= ;============================================================= ;/////// projected !!! //////////////////////////////// ; Рисование спрайтов ; E - вертикаль, IX - горизонталь ; D - код увеличения/уменьшения ; B - управляющий код ; 0 - Вывод постоянного спрайта ; 1 - Вывод временного спрайта ; 2 - Восстановление картинки под временным спрайтом ; HL - Special coding data ( данные спрайта форма, цвета.. ) ; flick-подобный формат .PIC_FN9 EQU #A9 ;============================================================= ENDMODULE ; BIOS ;-----------------------------------------------------------------------;