diff --git a/accel_sp.a80 b/accel_sp.a80 new file mode 100644 index 0000000..dc02ce4 --- /dev/null +++ b/accel_sp.a80 @@ -0,0 +1,40 @@ + +; LAST UPDATE: 28.02.2025 savelij + +; mame/src/mame/sinclair/sprinter.cpp +; OFF = 0, // ld b,b +; FILL, // ld c,c +; SET_BUFFER, // ld d,d +; FILL_VERT, // ld e,e +; DOUBLE, // ld h,h +; COPY, // ld l,l +; OFF_HALT, // halt +; COPY_VERT, // ld a,a +; MODE_AND = 0xa6, // and (hl) +; MODE_XOR = 0xae, // xor (hl) +; MODE_OR = 0xb6, // or (hl) +; MODE_NOP = 0xbe // cp (hl) + +; []----------------------------------------------------------[] +ACCELCMD +.OFF EQU 0x40 ; LD B,B выключить акселератор +.FILL EQU 0x49 ; LD C,C Операция Fill - заполнение одним байтом. + ; Последующая команда типа LD (HL),A приведет к заполнению + ; указанного ранее количества байт значением A. +.SET_BUFFER EQU 0x52 ; LD D,D включить акселератор в режим приема байта размера + ; блока далее следует команда типа LD A,dat, где dat и + ; будет новым размером блока. Если размер блока был + ; установлен ранее, его можно не устанавливать +.FILL_VERT EQU 0x5B ; LD E,E Операция Fill для графического экрана - + ; заполнение вертикальных линий +.DOUBLE EQU 0x64 ; LD H,H +.COPY EQU 0x6D ; LD L,L копирование блока. Последующая команда типа + ; LD A,(HL) приведет к заполнению ОЗУ акселератора данными + ; из адреса (HL), а команда типа LD (DE),A приведет + ; к перезаписи данных из ОЗУ акселератора в основное или видео-ОЗУ. +.OFF_HALT EQU 0x76 +.COPY_VERT EQU 0x7F ; LD A,A - копирование блока для графического экрана подобна команде +.MODE_AND EQU 0xA6 ; AND (HL) +.MODE_XOR EQU 0xAE ; XOR (HL) +.MODE_OR EQU 0xB6 ; OR (HL) +.MODE_NOP EQU 0xBE ; CP (HL) diff --git a/bios_sp.a80 b/bios_sp.a80 new file mode 100644 index 0000000..ed65990 --- /dev/null +++ b/bios_sp.a80 @@ -0,0 +1,163 @@ + +; LAST UPDATE: 07.05.2025 savelij + +; Вызов функций +TOBIOS EQU 0x08 ; для вызова из ОЗУ в SLOT0 (например из DSS) +TOBIOS_18 EQU 0x18 ; для вызова из 8-й страницы ПЗУ в SLOT0 +TOBIOS_3D13 EQU 0x3D13 ; для вызова из 8-й страницы ПЗУ в SLOT0 +TOBIOS_FROMEXT EQU 0x3FD0 ; для вызова из 0-й страницы ПЗУ в SLOT0 + +BIOSF +; Функции работы с памятью +.GETMEMSIZE EQU 0xC0 ; Определение объемов ОЗУ +.INITMEM EQU 0xC1 ; Инициализация распределения памяти +.GETMEM EQU 0xC2 ; Выделение блока ОЗУ +.FREEMEM EQU 0xC3 ; Освободить блок ОЗУ +.GETMEMPAGE EQU 0xC4 ; Получить физический номер страницы из блока памяти +.GETMEMBLKPAGES EQU 0xC5 ; Получить список физических страниц блока +.GETBANKSPORTS EQU 0xC6 ; Получение адресов портов окон +.GETMEMPAGENEXT EQU 0xC7 ; Получить номер следующей страницы блока +.MERGEMEMBLOCKS EQU 0x9E ; Слияние блоков +.DIVMEMBLOCKS EQU 0x9D ; Разделение блока +.GET_RAMD_NUM EQU 0x9B ; Получить номер RAM-Disk-а (0..15) по его block id +.SWAP_RAM_DRIVES EQU 0x9C ; Cменить набор рамдисков ZX <-> Sp2000 + +; Работа с блоками ОЗУ, как с RAM-Disks +.BLK_RD_WR EQU 0xC8 ; Чтение/запись из/в блок памяти секторами по 256 байт +.GETMEMRMD EQU 0x92 ; Получить блок памяти N bytes для RAM-Disk'а +.FREEMEMRMD EQU 0x93 ; Освободить блок памяти для RAM-Disk'а +.GETMEMPAGERMD EQU 0x94 ; Получить физический номер страницы RAM-Disk'а +.RAMD_CALC_PAGE EQU 0x98 ; Вычисление страницы и адреса в RAM-Disk по абсолютному номеру сектора +.BLK_TO_RAMD EQU 0xC9 ; Назначить блок памяти RAM-Disk-у +.RAMD_CLEAR EQU 0xCA ; Освободить RAM-Disk +.GET_RAMD_ST EQU 0xCE ; Получение идентификатора блока, назначенного на RAM-Disk + +; Управление назначением на дисководы +.SET_DISK_REDIR EQU 0x99 ; Назначение на текущий логический дисковод TR-DOS заданного драйва (старая функция для TR-DOS!) +.GET_DISK_REDIR EQU 0x9A ; Получить тип назначения на текущий логический дисковод TR-DOS (старая функция для TR-DOS!) +.RAMD_TO_DRV EQU 0xCB ; Назначение RAM-Disk на дисковод TR-DOS +.FDD_TO_DRV EQU 0xCC ; Назначение физического дисковода на логический TR-DOS +.HDD_TO_DRV EQU 0xCD ; Назначение винчестера на дисковод TR-DOS +.GET_DRV_ST EQU 0xCF ; Получить тип назначения на логический дисковод TR-DOS + +; Функции управления окнами и режимами экрана +.WIN_OPEN EQU 0xB0 ; Функция открытия окна +.WIN_CLOSE EQU 0xB1 ; Закрытие окна +.WIN_COPY EQU 0xB2 ; Копирование данных текстового окна в память (запоминание окна) +.WIN_RESTORE EQU 0xB3 ; Копирование из памяти в текстовое окно (восстановление окна) +.WIN_GET_SYM EQU 0xB4 ; Взять символ с экрана +.WIN_PUT_SYM EQU 0xB5 ; Положить символ на экран +.WIN_SET_ZG EQU 0xB6 ; Установка знакогенератора +.WIN_MOVE EQU 0xB7 ; Перемещение окна +.WIN_GET_ZG EQU 0xB8 ; Получение знакогенератора + +; Функции вывода текста на экран +.LP_OPEN_S EQU 0x80 ; Открытие стандартных окон +.LP_PRINT_ALL EQU 0x81 ; Печать символов с атрибутом +.LP_PRINT_SYM EQU 0x82 ; Вывод символов на экран без атрибута +.LP_PRINT_ATR EQU 0x83 ; печать атрибутов +.LP_SET_PLACE EQU 0x84 ; Установка текущего знакоместа в окне +.LP_PRINT_LN EQU 0x85 ; Вывод строки символов на экран с текущего знакоместа +.LP_PRINT_LN2 EQU 0x86 ; Вывод строки символов на экран без атрибутов +.LP_PRINT_LN3 EQU 0x87 ; Вывод строки символов до разделителя +.LP_PRINT_LN4 EQU 0x88 ; Вывод строки символов до разделителя, без атрибутов +.LP_CLS_WIN EQU 0x89 ; Очистка экрана +.LP_SCROLL_UD EQU 0x8A ; Скроллинг части глобального окна вверх/вниз +.LP_PRINT_LN5 EQU 0x8B ; Вывод строки символов на экран до разделителя +.LP_PRINT_LN6 EQU 0x8C ; Вывод строки символов на экран до разделителя без атрибутов +.LP_CLS_WIN2 EQU 0x8D ; Очистка экрана с указанием символа заполнения +.LP_GET_PLACE EQU 0x8E ; Получить текущее положение вывода на экран +.LP_PR_LINE_DIR EQU 0xE0 ; !TODO недоделана. Печать "в консоль" до разделителя + +; Графические функции +.PIC_POINT EQU 0xA1 ; Установить точку +.PIC_SET_PAL EQU 0xA4 ; Установка палитры +.PIC_GET_PAL EQU 0xA4 ; Чтение палитры (номер такой же как у .PIC_SET_PAL) +.SET_PAL_INIT EQU 0xA6 ; Установка внутренней палитры + +; Работа с HDD (fast) +.HDD_INIT EQU 0x40 ; Инициализация винчестера +.HDD_RECAL EQU 0x41 ; Рекалибровка винчестера +.HDD_TEST_IDE EQU 0x42 ; Тест наличия интерфейса IDE +.HDD_PREPARE EQU 0x43 ; Подготовка винчестера к операции чтения/записи +.HDD_READ_BPB EQU 0x44 ; Читать BPB первого раздела +.HDD_READ EQU 0x45 ; Читать сектора с винчестера +.HDD_WRITE EQU 0x46 ; Писать сектора на винчестер +.HDD_PART EQU 0x47 ; Настройка партиций и master/slave +.HDD_READ_NEXT EQU 0x48 ; Читать следующий сектор (ONLY FOR LBA!) + +; Функции работы с жесткими дисками и дисководами +.DRV_RESET EQU 0x51 ; Сброс контроллера и настройка на диск +.DRV_READ_LONG EQU 0x52 ; Чтение с устройств в указанную страницу +.DRV_WRITE_LONG EQU 0x53 ; Запись на устройства в указанную страницу +.DRV_VERIFY EQU 0x54 ; Проверка секторов +.DRV_READ EQU 0x55 ; Чтение с устройства +.DRV_WRITE EQU 0x56 ; Запись на устройства +.DRV_DETECT EQU 0x57 ; Определение параметров устройства +.DRV_GET_PAR EQU 0x58 ; Получить параметры носителя +.DRV_SET_PAR EQU 0x59 ; Установить параметры носителя +.DRV_VERSION EQU 0x5A ; Номер версии дисковой спецификации +.DRV_EXTENDED EQU 0x5E ; Расширенные функции для драйвов ; [x] 21/12/2023 +.DRV_LIST EQU 0x5F ; Список дисковых устройств + +; Функции управления 'железом' +.FN_TURBO EQU 0x8F ; Функция управления турбо режимом и FDD 720/1440 +.CheckInit EQU 0x97 ; Если обнаружен первый старт, то инициализация всей памяти, системных переменных +.FullInit EQU 0x9F ; Инициализация всей памяти, системных переменных +.FN_CRIPT EQU 0xED ; Функция идентификации материнской платы и конфигурации +.RST_CONF_AY8910 EQU 0xEE ; Для совместимости с софтом Sp97, переключение в конфу AY8910 +.FN_VERSION EQU 0xEF ; Выдача информации о версии BIOSа и железа +.RST_CONF_SP97_1 EQU 0xF0 ; Для совместимости с софтом Sp97, переключение в конфу Sprinter-1 +.RST_CONF_SP97_2 EQU 0xF1 ; Для совместимости с софтом Sp97, переключение в конфу Sprinter-2 +.FN_SYNC EQU 0xF2 ; Установка синхронизации, очистка страницы режима экрана +.RST_CONF_CUSTOM EQU 0xF3 ; Переключение конфигурации пользователя. SPRINTER_ALL +.DCP_CONFIG EQU 0xF4 ; Функция управления дешифратором портов. ;[x] BIOS 3.05 + новая подфункция +.CMOS_TEST EQU 0xF5 ; Проверить наличие CMOS +.CMOS_RD EQU 0xF6 ; Читать из регистра CMOS +.CMOS_WR EQU 0xF7 ; Писать в регистр CMOS +.SET_PORTS EQU 0xF8 ; Установка внутренних портов. Функция в разработке +.READ_PORTS EQU 0xF9 ; Чтение внутренних портов. ;[x] 26/01/2024 +.GOTO_SPECTRUM EQU 0xFB ; [ ] доковырять +.REINIT EQU 0xFD ; [x] restart, soft/hard reset, reinit RAM ID for spectrum pages + +SWAP_RAM_DRIVES +.SP2000 EQU 0x00 ; Режим рамдисков Sp2000 +.ZX EQU 0xFF ; Режим рамдисков ZX Spectrum mode +.INFO EQU 0xFE ; Узнать какой режим РАМ дисков установлен + +FN_TURBO +.OFF EQU 0x02 ; +.ON EQU 0x03 ; +.VG.OFF EQU 0x12 ; +.VG.ON EQU 0x13 ; + +FN_VERSION ; Выдача информации о версии BIOSа и железа. В буфере будет: +.STR_FIRMWARENAME EQU 1 ; № поля с названием прошивки +.STR_PC_NAME EQU 2 ; № поля с названием компьютера +.STR_BITSTREAMVER EQU 3 ; № поля с версией битстрима в ПЗУ + +REINITMODE +.RESTART EQU 1 +.SOFT_RESET EQU 2 +.HARD_RESET EQU 3 +.SET_ZXPAGES EQU 4 + +DRV_EXTENDED +.CD_Eject EQU 0x00 ; Открыть лоток CD +.CD_Close EQU 0x01 ; Закрыть лоток CD + +FN_CRIPT +.BOARDNUMBER EQU 0x01 ; Выдача полного Board Number +.ACEXANDBITSTREAM EQU 0x02 ; Выдача модели ACEX и версии битстрима в ROM + +LP_VIDEOMODE +.ZX_32X24_DEFAULT EQU 0x00 ; спектрумовское окно 32x24 +.TXT_64X24_DEFAULT EQU 0x01 ; текстовое окно 64x24 +.TXT_40X32_DEFAULT EQU 0x02 ; текстовое окно 40x24 +.TXT_80X32_DEFAULT EQU 0x03 ; текстовое окно 80x32 +.ZX_32X24 EQU 0x04 ; спектрумовское окно, HL - положение окна +.TXT_64X24 EQU 0x05 ; текстовое окно 64x24, HL - положение окна +.TXT_40X32 EQU 0x06 ; текстовое окно 40x32, HL - положение окна +.TXT_80X32 EQU 0x07 ; текстовое окно 80x32, HL - положение окна +.GRAF_0 EQU 0x08 ; графическое окно 0, HL - положение окна +.GRAF_1 EQU 0x09 ; графическое окно 1, HL - положение окна diff --git a/define_sp.a80 b/define_sp.a80 new file mode 100644 index 0000000..908a8a8 --- /dev/null +++ b/define_sp.a80 @@ -0,0 +1,299 @@ + +; LAST UPDATE: 15.04.2024 savelij + +WITH_BUILD EQU 1 ; BIOS NUMBER INCLUDED BUILD NUMBER +WITH_2IDE EQU 1 ; SECONDARY IDE + +DSS_MAX_DRIVES_AMOUNT EQU 26 +CLASSIC_CURSOR EQU 0 +TABisSPACES EQU 0 +EnoughtOnly_LF EQU 0 + +RAM_ATAPI_PK EQU 0xFEE0 +RAM_ATAPI_READ EQU 0xFEF0 + +SIZESEC EQU 0x0800 +PKTSIZE EQU 12 + +RAMD_KEY_NUM EQU 16 + +HDR_EXE_SIZE EQU 512 +HDR_EXE_SHORT EQU 512 - 490 + +CL0 EQU 200 +CL1 EQU 240 + +CPU0 EQU 0x0000 +CPU1 EQU 0x4000 +CPU2 EQU 0x8000 +CPU3 EQU 0xC000 + +;Version EQU 0x020D ; Version BIOS +RESTARTS EQU 0FFE0H + +D_TBON EQU 3 ; данные для включения TURBO +D_TBOFF EQU 2 ; данные для включения TURBO +D_ROM16ON EQU 1 +D_ROM16OFF EQU 0 + +BIOS_SCR_X EQU 128 +BIOS_SCR_Y EQU 72 + +AUTO +.HDD EQU 1 +.CDROM EQU 2 + +CONF +.CNF_0 EQU 0x04 +.CNF_1 EQU 0x0C +.CNF_2 EQU 0x14 +.CNF_3 EQU 0x1C +.CNF_512 EQU 0x80 ; включение Pentagon 128 + +; RAM PAGES +PAGE +.CONFIG EQU 0x40 +.PG50 EQU 0x50 +.PGA0 EQU 0xA0 +.MODE EQU 0xFC +.SYSTEM EQU 0xFE +.LAST EQU 0xFF + +SPECTRUM +.PAGE0 EQU 0 +.PAGE1 EQU 1 +.PAGE2 EQU 2 +.PAGE3 EQU 3 +.PAGE4 EQU 4 +.PAGE5 EQU 5 +.PAGE6 EQU 6 +.PAGE7 EQU 7 + +; функции драйверов IDE, FDD ... +DRIVER +.INIT EQU 0x00 +.OPEN EQU 0x01 +.CLOSE EQU 0x02 +.MEDIA_CHECK EQU 0x03 +.GET_BPB EQU 0x04 +.INPUT EQU 0x05 +.OUTPUT EQU 0x06 +.REMOVABLE EQU 0x07 +.IOCTL EQU 0x08 +.READ_LONG EQU 0x09 +.WRITE_LONG EQU 0x0A + +; ошибки драйверов +DRV_ERR +.OK EQU 0x00 +.BAD_COMMAND EQU 0x01 +.BAD_DRIVE EQU 0x02 +.UNKNOW_FORMAT EQU 0x03 +.NOT_READY EQU 0x04 +.SEEK_ERROR EQU 0x05 +.SEC_NOT_FOUND EQU 0x06 +.CRC_ERROR EQU 0x07 +.WRITE_PROTECT EQU 0x08 +.READ_ERROR EQU 0x09 +.WRITE_ERROR EQU 0x0A +.FAILURE EQU 0x0B +.BUSY EQU 0x0C +.RESERVED EQU 0x0D + +; цвета поллитры BIOS + INIT_VAR + SETVAR BLACK + SETVAR BLUE + SETVAR GREEN + SETVAR CYAN + SETVAR RED + SETVAR MAGENTA + SETVAR BROWN + SETVAR LGRAY + SETVAR DGRAY + SETVAR LBLUE + SETVAR LGREEN + SETVAR LCYAN + SETVAR LRED + SETVAR LMAGENT + SETVAR YELLOW + SETVAR WHITE + +; ячейки CMOS + INIT_VAR + SETVAR CMOS.SECUND ; 00 + SETVAR CMOS.SECUND_ALARM ; 01 + SETVAR CMOS.MINUTE ; 02 + SETVAR CMOS.MINUTE_ALARM ; 03 + SETVAR CMOS.HOUR ; 04 + SETVAR CMOS.HOUR_ALARM ; 05 + SETVAR CMOS.DAY_WEEK ; 06 + SETVAR CMOS.DAY_MONTH ; 07 + SETVAR CMOS.MONTH ; 08 + SETVAR CMOS.YEAR ; 09 + SETVAR CMOS.REG_A ; 0A + SETVAR CMOS.REG_B ; 0B + SETVAR CMOS.REG_C ; 0C + SETVAR CMOS.REG_D ; 0D +; Sprinter DATA + SETVAR CMOS.OPTIONS ; 0E OPTIONS + BITMASK MEMORY_TEST, 7 ; MEMORY TEST + BITMASK SAFE_RAMDISK, 6 ; SAFE RAM DISKS + BITMASK UPDATE_BIOS, 5 ; UPDATE BIOS +M_START_DELAY EQU %00011000 ; START DELAY + BITMASK LANGUAGE, 2 ; LANGUAGE + BITMASK QUICK_START, 0 ; QUICK START + + SETVAR CMOS.YA0F ; 0F KEYBOARD + BITMASK TYPEMATIC, 7 ; TYPEMATIC ON/OFF +M_TYPEMATIC_DELAY EQU %01100000 ; TYPEMATIC DELAY 00-250, 01-500, 10-750, 11-1000 +M_TYPEMATIC_RATE EQU %00011111 ; TYPEMATIC RATE 0-6, 1-8, 2-10, 3-12, 4-15, 5-20, 6-24, 7-30 + + SETVAR CMOS.YA10 ; 10 SYSTEM DISKS +M_SYSTEM_DISK EQU %00000111 ; SYSTEM DISK +M_ALT_DISK EQU %01110000 ; ALT SYSTEM DISK + + SETVAR CMOS.YA11 ; 11 FDD & HDD +M_FDD_FIRST EQU %00000011 ; FDD FIRST 720 / 1.44 / NONE +M_FDD_SECOND EQU %00001100 ; FDD SECOND 720 / 1.44 / NONE +M_IDE_MASTER_MODE EQU %00110000 ; IDE MASTER AUTO / SETUP / DISABLED +M_IDE_SLAVE_MODE EQU %11000000 ; IDE SLAVE AUTO / SETUP / DISABLED + + SETVAR CMOS.MS_CYL_LOW ; 12 CYLINDERS LOW MASTER + SETVAR CMOS.MS_CYL_HIGH ; 13 CYLINDERS HIGH MASTER + SETVAR CMOS.MS_HEADS ; 14 HEADS MASTER + SETVAR CMOS.MS_SECTORS ; 15 SECTORS MASTER + SETVAR CMOS.SL_CYL_LOW ; 16 CYLINDERS LOW SLAVE + SETVAR CMOS.SL_CYL_HIGH ; 17 CYLINDERS HIGH SLAVE + SETVAR CMOS.SL_HEADS ; 18 HEADS SLAVE + SETVAR CMOS.SL_SECTORS ; 19 SECTORS SLAVE + SETVAR CMOS.COLOR_STYLE ; 1A COLOR STYLE +M_COLOR_STYLE EQU %00001111 ; COLOR STYLE + + SETVAR CMOS.YA1B ; 1B HARDWARE CONFIGURATION +M_COMPUTER EQU %00011000 ; COMPUTER + ; 0-SPRINTER + ; 1-SPECTRUM 256 + ; 2-PENTAGON 128 + ; 3-OTHER + BITMASK PORT_EXCHG, 2 ; PORT EXCHANGE ON/OFF - 1 + BITMASK TURBO_EXCHG, 1 ; TURBO EXCHANGE ON/OFF - 1 + BITMASK TURBO_MODE, 0 ; TURBO MODE (D0..D3 - 6 OR 7) + + SETVAR CMOS.YA1C ; 1C RESET MODE + ; 0-RESET 128 Basic + ; 1-RESET 48 Basic & 128 mem + ; 2-RESET TR-DOS & 128 mem + ; 3-RESET EXPANSION (Disabled) + ; 4-RESET TR-DOS & 48 mem + ; 5-RESET 48 Basic + SETVAR CMOS.YA1D ; 1D REBOOT MSG, HDD W/P + BITMASK REBOOT_MSG, 1 ; Reboot message + BITMASK HDD_WR_DISABLE, 0 ; HDD Write protect + + SETVAR CMOS.YA1E ; 1E TRDOS +M_TRDOS_A EQU %00000011 ; TR DOS A: Default / FDD / HDD / RMD +M_TRDOS_B EQU %00001100 ; TR DOS B: Default / FDD / HDD / RMD +M_TRDOS_C EQU %00110000 ; TR DOS C: Default / FDD / HDD / RMD +M_TRDOS_D EQU %11000000 ; TR DOS A: Default / FDD / HDD / RMD + + SETVAR CMOS.SCR_POS ; 1F SCREEN POSITION +M_X_SCREEN_POS EQU %11110000 ; X-Screen position +M_Y_SCREEN_POS EQU %00001111 ; Y-Screen position + + SETVAR CMOS.YA20 + SETVAR CMOS.YA21 + SETVAR CMOS.YA22 + SETVAR CMOS.YA23 + SETVAR CMOS.YA24 + SETVAR CMOS.YA25 + SETVAR CMOS.YA26 + SETVAR CMOS.YA27 + SETVAR CMOS.YA28 + SETVAR CMOS.YA29 + SETVAR CMOS.YA2A + SETVAR CMOS.YA2B + SETVAR CMOS.YA2C + SETVAR CMOS.YA2D + SETVAR CMOS.YA2E + SETVAR CMOS.YA2F + SETVAR CMOS.YA30 + SETVAR CMOS.YA31 + SETVAR CMOS.CENTURY ; CENTURY + SETVAR CMOS.YA33 + SETVAR CMOS.YA34 + SETVAR CMOS.YA35 + SETVAR CMOS.YA36 + SETVAR CMOS.YA37 + SETVAR CMOS.YA38 + SETVAR CMOS.YA39 + SETVAR CMOS.YA3A + SETVAR CMOS.YA3B + SETVAR CMOS.YA3C + SETVAR CMOS.YA3D + SETVAR CMOS.YA3E + SETVAR CMOS.CHECKSUM ; CHECKSUM + +; пока не понятно +SM_CYLL EQU 0x2F +SM_CYLH EQU 0x30 +SM_HEAD EQU 0x31 +SM_SECT EQU 0x32 +SS_CYLL EQU 0x33 +SS_CYLH EQU 0x34 +SS_HEAD EQU 0x35 +SS_SECT EQU 0x36 +M_CYLL EQU 0x37 +M_CYLH EQU 0x38 +M_HEAD EQU 0x39 +M_SECT EQU 0x3A +S_CYLL EQU 0x3B +S_CYLH EQU 0x3C +S_HEAD EQU 0x3D +S_SECT EQU 0x3E + +; GLOBAL VARS ??? +ROM_BLOCK EQU 0x1000 +RAM_BLOCK EQU 0x8000 +SETUP_TXT_ADR EQU 0x8005 +ADR4SPECTRUM EQU 0x8200 +BASIC_START EQU 0x5B00 +DCP_FLEX EQU 0x1400 +FONT_ROM_ADR EQU 0x2800 +FN_TABL_ADR EQU 0x3000 + +SPVARS +;.L_B00B EQU 0xB00B +;.L_B03F EQU 0xB03F +.L_B4B2 EQU 0xB4B2 +.L_B6B2 EQU 0xB6B2 +.L_C124 EQU 0xC124 +.L_C180 EQU 0xC180 +.L_C200 EQU 0xC200 +.L_C400 EQU 0xC400 +.RESTART EQU 0xF000 +.POWERON_DATE EQU 0xF008 +.REBOOT_DATE EQU 0xF010 +.COPY_CPU0 EQU 0xFFF0 +.COPY_CPU1 EQU 0xFFF1 +.COPY_CPU2 EQU 0xFFF2 +.COPY_CPU3 EQU 0xFFF3 +.ADDR EQU 0xFFF4 +.SYM_Z EQU 0xFFFE +.SYM_X EQU 0xFFFF + +; переменные по страницам + +; коды клавиатуры +PSKEY +; считанные с клавиатуры +._A EQU 0x1C +._B EQU 0x32 +._C EQU 0x21 +._D EQU 0x23 +._E EQU 0x24 +._F EQU 0x2B +._G EQU 0x34 +._H EQU 0x33 +._I EQU 0x43 +; возвращаемые в программу diff --git a/dss_sp.a80 b/dss_sp.a80 new file mode 100644 index 0000000..6fad993 --- /dev/null +++ b/dss_sp.a80 @@ -0,0 +1,283 @@ + +; LAST UPDATE: 28.04.2025 savelij + +DSSF +; Функции идентификации системы +.VERSION EQU 0x00 ; (Версия DSS) + +; Функции для работы с диском +.CHDISK EQU 0x01 ; (Смена текущего диска) +.CURDISK EQU 0x02 ; (Номер текущего диска) +.DSKINFO EQU 0x03 ; (Информация о диске) +.G_ENTRY EQU 0x04 +.RESCANDRIVES EQU 0x08 +.BOOTDSK EQU 0x09 ; (Номер системного диска) + +; Функции для работы с файлами +.CREATE EQU 0x0A ; (Создание файла) +.CREAT_N EQU 0x0B ; (Создание нового файла) +.DELETE EQU 0x0E ; (Удаление файла) +.RENAME EQU 0x10 ; (Переименование файла) +.OPEN EQU 0x11 ; (Открытие файла) +.CLOSE EQU 0x12 ; (Закрытие файла) +.READ EQU 0x13 ; (Чтение из файла) +.WRITE EQU 0x14 ; (Запись в файл) +.MOVE_FP EQU 0x15 ; (Перемещение указателя в файле) +.ATTRIB EQU 0x16 ; (Получение/изменение атрибута файла) +.GET_D_T EQU 0x17 ; (Информация о дате и времени файла) +.PUT_D_T EQU 0x18 ; (Изменение даты и времени файла) +.F_FIRST EQU 0x19 ; (Поиск первого совпадающего файла) +.F_NEXT EQU 0x1A ; (Поиск следующего совпадающего файла) +.MKDIR EQU 0x1B ; (Создание каталога) +.RMDIR EQU 0x1C ; (Устранение каталога) +.CHDIR EQU 0x1D ; (Смена текущего каталога) +.CURDIR EQU 0x1E ; (Информация о текущем каталоге) + +; Функции для работы с датой и временем +.GETTIME EQU 0x21 ; (Текущая дата и время) +.SETTIME EQU 0x22 ; (Установить текущую дату и время) + +; Функции управления памятью +.SETWIN EQU 0x38 ; (Подключение страницы памяти) +.SETWIN1 EQU 0x39 ; (Подключение страницы памяти в первое окно) +.SETWIN2 EQU 0x3A ; (Подключение страницы памяти во второе окно) +.SETWIN3 EQU 0x3B ; (Подключение страницы памяти в третье окно) +.INFOMEM EQU 0x3C ; (Информация о памяти) +.GETMEM EQU 0x3D ; (Выделение блока памяти) +.FREEMEM EQU 0x3E ; (Освобождение блока памяти) +.SETMEM EQU 0x3F ; (Изменение блока памяти) + +; Функции ввода с клавиатуры +.WAITKEY EQU 0x30 ; (Ожидание символа с клавиатуры) +.SCANKEY EQU 0x31 ; (Опрос клавиатуры без ожидания) +.ECHOKEY EQU 0x32 ; (Ожидание символа с клавиатуры с печатью) +.CTRLKEY EQU 0x33 ; (Получить состояние клавиатуры) +.EDIT EQU 0x34 +.K_CLEAR EQU 0x35 ; (Очистить буфер клавиатуры и выполнить функцию) +.K_SETUP EQU 0x36 ; (Управление настройками клавиатуры) +.TESTKEY EQU 0x37 ; (Опрос буфера клавиатуры) + +; Функции для исполнения программ +.EXEC EQU 0x40 ; (Выполнить файл) +.EXIT EQU 0x41 ; (Завершение программы) +.GET_ERR EQU 0x42 ; (Получить код завершения программы) + +; Функции для работы со строками и командной строкой +.GSWITCH EQU 0x43 ; (Выделить параметр командной строки) +.DOSNAME EQU 0x44 ; (Преобразовать имя файла) +.EX_PATH EQU 0x45 ; (Разбор командной строки) + +; Функции для работы с переменными +.ENVIRON EQU 0x46 ; (Системное окружение) +.APPINFO EQU 0x47 ; (Получение информации приложения) + +; Функции работы с экраном +.SETVMOD EQU 0x50 ; (Выбор режима экрана) +.GETVMOD EQU 0x51 ; (Получить текущий режим экрана) +.LOCATE EQU 0x52 ; (Установить позицию курсора) +.CURSOR EQU 0x53 ; (Получить текущую позицию курсора) +.SELPAGE EQU 0x54 ; (Выбрать активную страницу экрана) +.SCROLL EQU 0x55 ; (Прокрутка окна) +.CLEAR EQU 0x56 ; (Очистка окна) +.RDCHAR EQU 0x57 ; (Считать символ с экрана) +.WRCHAR EQU 0x58 ; (Напечатать символ на экране) +.WINCOPY EQU 0x59 ; (Запомнить окно экрана) +.WINREST EQU 0x5A ; (Восстановить окно экрана) +.PUTCHAR EQU 0x5B ; (Напечатать символ в текущей позиции курсора) +.PCHARS EQU 0x5C ; (Напечатать строку символов в текущей позиции курсора) +.LIB_SUB EQU 0x5D ; [ ] 11/02/2024 - Функция с пополняемыми подфункциями))) + +; Функции для печати на принтере +.PRINT EQU 0x5F ; (Вывод символа на принтер без ожидания) + +EX_PATH +.GET_ALL EQU 0x00 ; Подфункция 0 - Разобрать строку +.GET_DRIVE EQU 0x01 ; Подфункция 1 - Выделить имя диска +.GET_PATH EQU 0x02 ; Подфункция 2 - Выделить директорию +.GET_NAME EQU 0x03 ; Подфункция 3 - Выделить имя файла +.GET_TYPE EQU 0x04 ; Подфункция 4 - Выделить расширение файла +.GET_ALL_EX EQU 0x05 ; Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла +.GSWITCH EQU 0x07 ; Подфункция 7 - Выделить параметр командной строки +.GETNAME EQU 0x08 ; Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС +.MASK EQU 0x09 ; Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат + +SETVMOD +.SCREEN_0 EQU 0 +.SCREEN_1 EQU 1 +.TXT40X32 EQU 2 ; текстовый 40x32x16 цветов +.TXT80X32 EQU 3 ; текстовый 80x32x16 цветов +.GRF320X256 EQU 0x81 ; графический 320x256x256 цветов +.GRF640X256 EQU 0x82 ; графический 640x256x16 цветов + +FILEMODE +.RW EQU 0 +.R EQU 1 +.W EQU 2 + +ENVIRON +.INIT EQU 0xFF +.READ EQU 0 +.GET EQU 1 +.SET EQU 2 + +EXPATH +.GET_ALL EQU 0x00 ; Разобрать строку +.GET_DRIVE EQU 0x01 ; Выделить имя диска +.GET_PATH EQU 0x02 ; Выделить директорию +.GET_NAME EQU 0x03 ; Выделить имя файла +.GET_TYPE EQU 0x04 ; Выделить расширение файла +.GET_ALL_EX EQU 0x05 ; Выделить имя диска, путь к файлу, имя файла и расширение файла +.RESERVED EQU 0x06 ; Зарезервировано +.GSWITCH EQU 0x07 ; Выделить параметр командной строки +.GETNAME EQU 0x08 ; Преобразовать из 11 символьного формата в формат ДОС +.MASK EQU 0x09 ; Преобразовать из формата ДОС в 11 символьный формат + +; файловая спецификация поиска первого совпадающего файла F_FIRST +FFIRST + _INIT_VAR + _SETVAR .MaskName, 8 ; маска имени для поиска + _SETVAR .MaskExt, 3 ; маска расширения для поиска + _SETVAR .MaskAttr, BYTE ; маска аттрибутов для поиска + _SETVAR .NTRes, BYTE ; 1 зарезервированно + _SETVAR .CrtTimeTenth, BYTE ; 1 миллисекунды времени создания файла + _SETVAR .CrtTime, WORD ; 2 время создания файла + _SETVAR .CrtDate, WORD ; 2 дата создания файла + _SETVAR .LstAccDate, WORD ; 2 дата последнего обращения к файлу + _SETVAR .FstClusHI, WORD ; 2 старшее слово номера кластера + _SETVAR .WrtTime, WORD ; 2 время последней записи + _SETVAR .WrtDate, WORD ; 2 дата последней записи + _SETVAR .FstClusLO, WORD ; 2 младшее слово номера кластера + _SETVAR .FileSize, DWORD ; 4 размер файла + _SETVAR .Attr, BYTE ; аттрибуты найденного файла + _SETVAR .Name, 8 ; имя найденного файла + _SETVAR .Ext, 3 ; расширение найденого файла + _SETVAR .SIZE, 0 ; размер структуры + +; статусы клавиатуры +KEYBSTAT +; C - режим клавиатуры + _BITMASK RUSLAT, 7 ; RUS/LAT + _BITMASK NUMLOCK, 3 ; Num Lock + _BITMASK SCROLLLOCK, 2 ; Scroll Lock + _BITMASK INSERT, 1 ; Insert + _BITMASK CAPSLOCK, 0 ; Caps Lock +; B - состояние шифтов + _BITMASK LEFTSHIFT, 7 ; Left Shift + _BITMASK RIGHTSHIFT, 6 ; Right Shift + _BITMASK CTRL, 5 ; Ctrl + _BITMASK ALT, 4 ; Alt + _BITMASK LEFTCTTRL, 3 ; Left Ctrl + _BITMASK LEFTALT, 2 ; Left Alt + _BITMASK RIGHTCTRL, 1 ; Right Ctrl + _BITMASK RIGHTALT, 0 ; Right Alt + +; раскладка клавиатуры +KEYBMAP + _INIT_VAR + _SETVAR .NORMAL ; Normal + _SETVAR .SHIFT ; Shift + _SETVAR .CAPSLOCK ; Caps Lock + _SETVAR .CAPSSHIFT ; Caps Lock + Shift + _SETVAR .NORMALALTK ; Normal (альтернативная клавиатура) + _SETVAR .SHIFTALTK ; Shift (альтернативная клавиатура) + _SETVAR .CAPSLOCKALTK ; Caps Lock (альтернативная клавиатура) + _SETVAR .CAPSHIFTALTK ; Caps Lock + Shift (альтернативная клавиатура) + +; Приложение Б. Таблица позиционных кодов +SC ; возвращаемые скан коды + _INIT_VAR + ; key ASCII/SCAN + _SETVAR .APOSTROF ; ` #00 #00 + _SETVAR .ESC ; Esc #1B #01 + _SETVAR .1 ; 1 #31 #02 + _SETVAR .2 ; 2 #32 #03 + _SETVAR .3 ; 3 #33 #04 + _SETVAR .4 ; 4 #34 #05 + _SETVAR .5 ; 5 #35 #06 + _SETVAR .6 ; 6 #36 #07 + _SETVAR .7 ; 7 #37 #08 + _SETVAR .8 ; 8 #38 #09 + _SETVAR .9 ; 9 #39 #0A + _SETVAR .0 ; 0 #30 #0B + _SETVAR .MINUS ; - #2D #0C + _SETVAR .EQUAL ; = #3D #0D + _SETVAR .BKSP ; BackSpace #08 #0E + _SETVAR .TAB ; Tab #09 #0F + _SETVAR .Q ; Q #51 #10 + _SETVAR .W ; W #57 #11 + _SETVAR .E ; E #45 #12 + _SETVAR .R ; R #52 #13 + _SETVAR .T ; T #54 #14 + _SETVAR .Y ; Y #59 #15 + _SETVAR .U ; U #55 #16 + _SETVAR .I ; I #49 #17 + _SETVAR .O ; O #4F #18 + _SETVAR .P ; P #50 #19 + _SETVAR .QSKOBKAL ; [ #5B #1A + _SETVAR .QSKOBKAR ; ] #5D #1B + _SETVAR .CAPSLOCK ; CapsLock #00 #1C + _SETVAR .A ; A #41 #1D + _SETVAR .S ; S #53 #1E + _SETVAR .D ; D #44 #1F + _SETVAR .F ; F #46 #20 + _SETVAR .G ; G #47 #21 + _SETVAR .H ; H #48 #22 + _SETVAR .J ; J #4A #23 + _SETVAR .K ; K #4B #24 + _SETVAR .L ; L #4C #25 + _SETVAR .DOTZAP ; ; #3B #26 + _SETVAR .KAVYCH ; ' #27 #27 + _SETVAR .ENTER ; Enter #0D #28 + _SETVAR .LSHIFT ; LShift --- #29 + _SETVAR .Z ; Z #5A #2A + _SETVAR .X ; X #58 #2B + _SETVAR .C ; C #43 #2C + ; key ASCII/SCAN + _SETVAR .V ; V #56 #2D + _SETVAR .B ; B #42 #2E + _SETVAR .N ; N #4E #2F + _SETVAR .M ; M #4D #30 + _SETVAR .ZAP ; , #2C #31 + _SETVAR .DOT ; . #2E #32 + _SETVAR .DIV ; / #2F #33 + _SETVAR .RSHIFT ; RShift --- #34 + _SETVAR .BSLASH ; #5C #35 + _SETVAR .LCTRL ; LCtrl --- #36 + _SETVAR .LALT ; LAlt --- #37 + _SETVAR .SPACE ; Space #20 #38 + _SETVAR .RALT ; RAlt --- #39 + _SETVAR .RCTRL ; RCtrl --- #3A + _SETVAR .F1 ; F1 #00 #3B + _SETVAR .F2 ; F2 #00 #3C + _SETVAR .F3 ; F3 #00 #3D + _SETVAR .F4 ; F4 #00 #3E + _SETVAR .F5 ; F5 #00 #3F + _SETVAR .F6 ; F6 #00 #40 + _SETVAR .F7 ; F7 #00 #41 + _SETVAR .F8 ; F8 #00 #42 + _SETVAR .F9 ; F9 #00 #43 + _SETVAR .F10 ; F10 #00 #44 + _SETVAR .F11 ; F11 #00 #45 + _SETVAR .F12 ; F12 #00 #46 + _SETVAR .PRTSCRN ; PrScrn --- #47 + _SETVAR .SCRLLOCK ; ScrlLock #00 #48 + _SETVAR .NUMLOCK ; NumLock #00 #49 + _SETVAR .XDIV ; / #2F #4A + _SETVAR .XMUL ; * #2A #4B + _SETVAR .XMINUS ; - #2D #4C + _SETVAR .XDOTZAP ; + #2B #4D + _SETVAR .XENTER ; enter #0D #4E + _SETVAR .XDEL ; Del . #00 #4F + _SETVAR .X0 ; Ins 0 #00 #50 + _SETVAR .X1 ; End 1 #00 #51 + _SETVAR .X2 ; Down 2 #00 #52 + _SETVAR .X3 ; PgDw 3 #00 #53 + _SETVAR .X4 ; Left 4 #00 #54 + _SETVAR .X5 ; 5 #00 #55 + _SETVAR .X6 ; Right 6 #00 #56 + _SETVAR .X7 ; Home 7 #00 #57 + _SETVAR .X8 ; Up 8 #00 #58 + _SETVAR .X9 ; PgUp 9 #00 #59 + _INIT_VAR 0x80 + _SETVAR .RUS + diff --git a/errors_sp.a80 b/errors_sp.a80 new file mode 100644 index 0000000..323932d --- /dev/null +++ b/errors_sp.a80 @@ -0,0 +1,71 @@ + +; LAST UPDATE: 13.05.2025 savelij + +ERR_DSS + _INIT_VAR + _SETVAR .NO_ERROR ; EQU 0x00 ; 00 - нет ошибок + _SETVAR .INVALID_COMMAND ; EQU 0x01 ; 01 - неверный номер функции + _SETVAR .INVALID_DRIVE ; EQU 0x02 ; 02 - неправильный номер устройства + _SETVAR .FILE_NOT_FOUND ; EQU 0x03 ; 03 - файл не обнаружен + _SETVAR .PATH_NOT_FOUND ; EQU 0x04 ; 04 - неверный путь + _SETVAR .INVALID_HANDLE ; EQU 0x05 ; 05 - несуществующий файловый манипулятор + _SETVAR .NO_HANDLES ; EQU 0x06 ; 06 - нет свободного файлового манипулятора + _SETVAR .FILE_EXISTS ; EQU 0x07 ; 07 - файл существует + _SETVAR .READONLY ; EQU 0x08 ; 08 - файл только для чтения + _SETVAR .ROOT_OVERFLOW ; EQU 0x09 ; 09 - переполнение ROOT (корневого каталога) + _SETVAR .DISK_FULL ; EQU 0x0A ; 10 - нет свободного места на диске + _SETVAR .DIR_NOT_EMPTY ; EQU 0x0B ; 11 - каталог не пуст + _SETVAR .CURRENT_DIR ; EQU 0x0C ; 12 - неудачная попытка удалить текущий каталог + _SETVAR .UNKNOWN_FORMAT ; EQU 0x0D ; 13 - неизвестный формат + _SETVAR .INVALID_ACCESS ; EQU 0x0E ; 14 - невозможная операция + _SETVAR .DIR_EXISTS ; EQU 0x0F ; 15 - каталог уже есть + _SETVAR .INVALID_NAME ; EQU 0x10 ; 16 - неверное имя + _SETVAR .INVALID_EXE ; EQU 0x11 ; 17 - неправильный EXE-файл + _SETVAR .UNKNOWN_EXE ; EQU 0x12 ; 18 - не поддерживаемая версия EXE-файла + _SETVAR .ACCESS_DENIED ; EQU 0x13 ; 19 - ресурс не доступен + _SETVAR .NOT_READY ; EQU 0x14 ; 20 - нет готовности + _SETVAR .SEEK_ERROR ; EQU 0x15 ; 21 - ошибка позиционирования + _SETVAR .SECTOR_NOT_FOUND ; EQU 0x16 ; 22 - сектор не найден + _SETVAR .CRC_ERROR ; EQU 0x17 ; 23 - ошибка CRC + _SETVAR .WRITE_PROTECT ; EQU 0x18 ; 24 - защита записи + _SETVAR .READ_ERROR ; EQU 0x19 ; 25 - ошибка чтения + _SETVAR .WRITE_ERROR ; EQU 0x1A ; 26 - ошибка записи + _SETVAR .DRIVE_FAILURE ; EQU 0x1B ; 27 - сбой диска + _SETVAR .MEDIA_CHANGED ; EQU 0x1C ; 28 - смена носителя + _ADDVAR 1 + _SETVAR .NOT_ENOUGH_MEMORY ; EQU 0x1E ; 30 - недостаточно памяти + _SETVAR .INVALID_MEMORY_HND ; EQU 0x1F ; 31 - несуществующий блок памяти + _ADDVAR 1 + _SETVAR .ENV_ITEM_OVERFLOW ; EQU 0x21 ; 33 - превышен максимальный размер переменной + _ADDVAR 1 + _SETVAR .TOO_MANY_FILES_IN_DIR ; EQU 0x23 ; 35 - слишком много файлов в директории + _SETVAR .TOO_DEEP_DIR_DEPTH ; EQU 0x24 ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + _SETVAR .USER_ABORT ; EQU 0x25 ; 37 - операция прервана пользователем + _SETVAR .COMMON_ERROR ; EQU 0x26 ; 38 - общая ошибка + _SETVAR .UNEXPECTED_APP_TRMN ; EQU 0x27 ; 39 - unexpected application termination / неожиданное завершение приложения + _INIT_VAR 0x30 + _SETVAR .INVALID_VIDEO_MODE ; EQU 0x30 ; 48 - неправильный видеорежим + +ERR_DRV +.NO_ERROR EQU 0x00 ; 00 - NO ERRORS +.INVALID_COMMAND EQU 0x01 ; 01 - BAD COMMAND +.INVALID_DRIVE EQU 0x02 ; 02 - BAD DRIVE NUMBER +.UNKNOWN_FORMAT EQU 0x03 ; 03 - UNKNOW FORMAT +.NOT_READY EQU 0x04 ; 04 - NOT READY +.SEEK_ERROR EQU 0x05 ; 05 - SEEK ERROR +.SECTOR_NOT_FOUND EQU 0x06 ; 06 - SECTOR NOT FOUND +.CRC_ERROR EQU 0x07 ; 07 - CRC ERROR +.WRITE_PROTECT EQU 0x08 ; 08 - WRITE PROTECT +.READ_ERROR EQU 0x09 ; 09 - READ ERROR +.WRITE_ERROR EQU 0x0A ; 10 - WRITE ERROR +.GENERAL_FAILURE EQU 0x0B ; 11 - FAILURE +.DEVICE_BUSY EQU 0x0C ; 12 - BUSY (DEVICE OPENED) +;.RESERVED EQU 0x0D ; 13 - RESERVED + +ERR_MOUSE +.NO_ERROR EQU 0x00 ; 0 - NO ERROR +.INVALID_COMMAND EQU 0x01 ; 1 - COMMAND NOT PRESENT +.DEVICE_ABSENT EQU 0x02 ; 2 - DEVICE ABSENT +.CURSOR_ON EQU 0x03 ; 3 - CURSOR ON (already) +.CURSOR_OFF EQU 0x04 ; 4 - CURSOR OFF (already) +.CURSOR_TOO_BIG EQU 0x05 ; 5 - CURSOR IMAGE VERY BIG diff --git a/fat_dir.a80 b/fat_dir.a80 new file mode 100644 index 0000000..08f7d13 --- /dev/null +++ b/fat_dir.a80 @@ -0,0 +1,34 @@ + +;LAST UPDATE: 07.03.2025 savelij + +; структура записи директории +DIR + _INIT_VAR + _SETVAR .Name, 8 ; 8 имя файла + _SETVAR .Ext, 3 ; 3 расширение файла + _SETVAR .Attr, BYTE ; 1 аттрибуты файла + _SETVAR .NTRes, BYTE ; 1 зарезервированно + _SETVAR .CrtTimeTenth, BYTE ; 1 миллисекунды времени создания файла + _SETVAR .CrtTime, WORD ; 2 время создания файла + _SETVAR .CrtDate, WORD ; 2 дата создания файла + _SETVAR .LstAccDate, WORD ; 2 дата последнего обращения к файлу + _SETVAR .FstClusHI, WORD ; 2 старшее слово номера кластера + _SETVAR .WrtTime, WORD ; 2 время последней записи + _SETVAR .WrtDate, WORD ; 2 дата последней записи + _SETVAR .FstClusLO, WORD ; 2 младшее слово номера кластера + _SETVAR .FileSize, DWORD ; 4 размер файла + _SETVAR .StructSize, 0 ; размер структуры +;флаги=биты============= + _BITMASK Device, 7 + _BITMASK Archive, 5 + _BITMASK Dir, 4 + _BITMASK VolumeID, 3 + _BITMASK System, 2 + _BITMASK Hidden, 1 + _BITMASK ReadOnly, 0 +;флаги=маски============ +.M_AttrLongName EQU .M_ReadOnly | \ + .M_Hidden | \ + .M_System | \ + .M_VolumeID +;======================= diff --git a/macros_sp.a80 b/macros_sp.a80 new file mode 100644 index 0000000..d057504 --- /dev/null +++ b/macros_sp.a80 @@ -0,0 +1,201 @@ + +; LAST UPDATE: 30.03.2024 savelij + +; для вызывов BIOS +; RGC - номер функции BIOS +; RGB - регистр B +; RGA - регистр A +; RGIX - регистр IX +SPBIOS MACRO RGC,RGB,RGA,RGIX + IFNB RGIX + LD IX,RGIX + ENDIF + + IFNB RGA + IF RGA = 0 + XOR A + ELSE + LD A,RGA + ENDIF + ENDIF + + IFNB RGC + IFNB RGB + LD BC,RGB << 8 + RGC + ELSE + LD C,RGC + ENDIF + ENDIF + RST 8 + ENDM + +; для вызывов DSS +; RGC - номер функции BIOS +; RGB - регистр B +; RGA - регистр A +; RGIX - регистр IX +SPDSS MACRO RGC,RGB,RGA,RGIX + IFNB RGIX + LD IX,RGIX + ENDIF + + IFNB RGA + IF RGA = 0 + XOR A + ELSE + LD A,RGA + ENDIF + ENDIF + + IFNB RGC + IFNB RGB + LD BC,RGB << 8 + RGC + ELSE + LD C,RGC + ENDIF + ENDIF + RST 0x10 + ENDM + +; для работы с MOUSE +; RGC - номер функции BIOS +; RGB - регистр B +; RGA - регистр A +; RGIX - регистр IX +SPMOUSE MACRO RGC,RGB,RGA,RGIX + IFNB RGIX + LD IX,RGIX + ENDIF + + IFNB RGA + IF RGA = 0 + XOR A + ELSE + LD A,RGA + ENDIF + ENDIF + + IFNB RGC + IFNB RGB + LD BC,RGB << 8 + RGC + ELSE + LD C,RGC + ENDIF + ENDIF + RST 0x30 + ENDM + +; для BIOS +; RGC - номер функции BIOS +; RGB - регистр B +; RGA - регистр A +BIOS18 MACRO RGC,RGB,RGA,RGIX + IFNB RGIX + LD IX,RGIX + ENDIF + + IFNB RGA + IF RGA = 0 + XOR A + ELSE + LD A,RGA + ENDIF + ENDIF + + IFNB RGC + IFNB RGB + LD BC,RGB << 8 + RGC + ELSE + LD C,RGC + ENDIF + ENDIF + RST 0x18 + ENDM + +; для SYSTEM.DOS и SYSTEM.EXE +; RSTNUM - номер RST +; RGC - номер функции BIOS +; RGB - регистр B +; RGA - регистр A +SPSYSDOS MACRO RSTNUM,RGC,RGB,RGA,RGIX + IFNB RGIX + LD IX,RGIX + ENDIF + + IFNB RGA + IF RGA = 0 + XOR A + ELSE + LD A,RGA + ENDIF + ENDIF + + IFNB RGC + IFNB RGB + LD BC,RGB << 8 + RGC + ELSE + LD C,RGC + ENDIF + ENDIF + RST RSTNUM + ENDM + +; PORT - адрес порта +; NUM - значение для записи +; FLAG - при наличии в порт пишется содержимое регистра A +SETPORT MACRO PORT,NUM,FLAG + IFB FLAG ; если FLAG есть, не меняем регистр A + IF NUM = 0 + XOR A + ELSE + LD A,NUM + ENDIF + ENDIF + OUT (PORT),A + ENDM + +GETPORT MACRO PORT + IN A,(PORT) + ENDM + +; инит счетчика для генерации имени метки +GEN_NAME_INIT MACRO +NAMENUM := 0 + ENDM + +; генерация имени метки и инкримент счетчика имени метки +GEN_NAME MACRO NAME,LABEL +NAMENUMTXT := "\{NAMENUM}" +NAME_{NAMENUMTXT} := $ + IFNB LABEL +LABEL EQU NAMENUM ; генерация указанного имени с текущим номером сообщения + ENDIF +NAMENUM := NAMENUM + 1 + ENDM + +; генерация таблицы меток (только со второго прохода) +GEN_TABL MACRO NAME + IF MOMPASS > 1 +CURRENT := 0 + REPT MAXITEM +CURRENTTXT := "\{CURRENT}" + DW NAME_{CURRENTTXT} +CURRENT := CURRENT + 1 + ENDM + ENDIF + ENDM + +ACCEL MACRO BYTE + DB BYTE + ENDM + +HDR_EXE MACRO VERSION,OFFSET,PRIMARYLOADER,ADRLOAD,ADRSTART,ADRSTACK,RESERVED + DB "EXE",VERSION + DD OFFSET + DW PRIMARYLOADER + DW 0,0,0 + DW ADRLOAD,ADRSTART,ADRSTACK + IF RESERVED > 0 + DB RESERVED DUP (0) + ENDIF + ENDM diff --git a/mouse_sp.a80 b/mouse_sp.a80 new file mode 100644 index 0000000..043e749 --- /dev/null +++ b/mouse_sp.a80 @@ -0,0 +1,19 @@ + +; LAST UPDATE: 12.09.2023 savelij + +; Функции для работы с мышью +MOUSEF +.INIT EQU 0x00 ; Инициализация драйвера мыши +.SHOW EQU 0x01 ; Вывести курсор мыши на экранная +.HIDE EQU 0x02 ; Убрать курсор мыши с экрана +.READ_STATE EQU 0x03 ; Чтение состояния мыши +.SET_POS EQU 0x04 ; Установка координат курсора мыши +.VERT_BOUNDS EQU 0x07 ; Задание вертикальных границ перемещения курсора +.HORZ_BOUNDS EQU 0x08 ; Задание горизонтальных границ перемещения курсора +.LOAD_IMAGE EQU 0x09 ; Загрузка изображения курсора мыши +.SET_TXTMODE EQU 0x0A ; Установка курсора мыши в текстовом режиме +.GET_IMAGE EQU 0x0B ; Получение изображения курсора мыши +.GET_SENSETIVE EQU 0x0E ; Чтение чувствительности мыши +.HARD_INT EQU 0x80 ; Обработчик аппаратного прерывания от мыши +.CHG_VIDEOMODE EQU 0x81 ; Информирование о смене режима экрана +.REFRESH EQU 0x83 ; Принудительная перерисовка курсора diff --git a/ports_sp.a80 b/ports_sp.a80 new file mode 100644 index 0000000..28bbe85 --- /dev/null +++ b/ports_sp.a80 @@ -0,0 +1,143 @@ + +; LAST UPDATE: 30.04.2025 savelij + +; порты Z84 +Z84 +.CTC_0 EQU 0x10 ; STC0_C +.CTC_1 EQU 0x11 ; STC1_C +.CTC_2 EQU 0x12 ; STC2_C +.CTC_3 EQU 0x13 ; STC3_C + +.SIO_ADATA EQU 0x18 ; DAT_A +.SIO_ACTRL EQU 0x19 ; COM_A +.SIO_BDATA EQU 0x1A ; DAT_B +.SIO_BCTRL EQU 0x1B ; COM_B + +.PIO_ADATA EQU 0x1C ; LPT1_D +.PIO_ACMD EQU 0x1D ; LPT1_C +.PIO_BDATA EQU 0x1E ; LPT2_D +.PIO_BCMD EQU 0x1F ; LPT2_C + +.PAL_SCP EQU .PIO_BDATA + +.SCRP EQU 0xEE ; Systen Contorl Register Pointer +.SCDP EQU 0xEF ; Systen Control Data Port + +.WDTMR EQU 0xF0 ; Watch-Dog Timer (Master Register) +.WDTCR EQU 0xF1 ; Watch-Dog Timer (Control Register) +.INTPRIREG EQU 0xF4 ; Interrupt Priority Register + +.STC0_C EQU .CTC_0 +.STC1_C EQU .CTC_1 +.STC2_C EQU .CTC_2 +.STC3_C EQU .CTC_3 + +.KBD_DAT EQU .SIO_BDATA +.KBD_COM EQU .SIO_BCTRL + +.COM_A EQU .SIO_ACTRL +.DAT_A EQU .SIO_ADATA +.COM_B EQU .SIO_BCTRL +.DAT_B EQU .SIO_BDATA + +.LPT1_D EQU .PIO_ADATA +.LPT1_C EQU .PIO_ACMD +.LPT2_D EQU .PIO_BDATA +.LPT2_C EQU .PIO_BCMD + +; порты +WINSP +.CPU0 EQU 0x82 ; окно проецирования 0 +.CPU1 EQU 0xA2 ; окно проецирования 1 +.CPU2 EQU 0xC2 ; окно проецирования 2 +.CPU3 EQU 0xE2 ; окно проецирования 3 + +.SYS_OFF EQU 0x3C +.SYS_ON EQU 0x7C +.SYS_ROMS EQU 0x5C +.COVOX EQU 0x4F +.CBL_DIR EQU 0x4E ; порт управления COVOX-Blaster + ; bit 7 - 1 включить CBL +.MODES EQU 0x204E + +.Y_PORT EQU 0x89 +.RGADR EQU 0x89 +.RGMOD EQU 0xC9 +.RGSCR EQU 0xE9 + +P_KBD_OUT EQU 0xF8 +P_KBD_IN EQU 0xFE + +BORDER EQU 0xFE +PORT_JOI EQU 0xFF + +CONF_128 EQU 0x7FFD ; порт конфига 128 памяти +SCORP_CONF EQU 0x1FFD ; порт конфига Scorpion + +; порты CMOS +PCMOS +.DATA_RD EQU 0xFFBD +.DATA_WR EQU 0xBFBD +.ADR_WR EQU 0xDFBD + +ISA_PORT EQU 0x9FBD + +PG_SP1 equ 0xEC +PG_SP2 equ 0xEE +PG_AY equ 0xEA + +VSYNC +.PORT EQU 0xBD +.SELECT_320L EQU 0x41 +.SELECT_312L EQU 0x61 + +; порты управления страницами фастрам +FastRAM: +.ON EQU 0xFB ; Включение кэша IN A,(FastRAM.ON) - прибито гвоздями в конфе +.OFF EQU 0x7B ; Отключение кэша IN A,(FastRAM.OFF) - прибито гвоздями в конфе +.SLOT0 EQU 0x5C ; Переключение страниц кэша при FastRAM.ON в нулевом окне (bit0..1) - прибито гвоздями в конфе + + +; порты FDD +FDD +.COM EQU 0x0F +.TRK EQU 0x3F +.SEC EQU 0x5F +.DATA EQU 0x7F +.FF EQU 0xFF +.SELECT EQU 0xBD +.SEL_720 EQU 0x01 +.SEL_1440 EQU 0x21 + +; порты HDD +HDD +.P_1F7W EQU 0x4153 ; W регистр команд +.P_1F7R EQU 0x4053 ; R регистр состояния +.P_1F6W EQU 0x4152 ; W CHS-номер головы и устройства/LBA адрес 24-27 +.P_1F6R EQU 0x4052 ; R CHS-номер головы и устройства/LBA адрес 24-27 +.P_1F5W EQU 0x0155 ; W CHS-цилиндр 8-15/LBA адрес 16-23 +.P_1F5R EQU 0x0055 ; R CHS-цилиндр 8-15/LBA адрес 16-23 +.P_1F4W EQU 0x0154 ; W CHS-цилиндр 0-7/LBA адрес 8-15 +.P_1F4R EQU 0x0054 ; R CHS-цилиндр 0-7/LBA адрес 8-15 +.P_1F3W EQU 0x0153 ; W CHS-номер сектора/LBA адрес 0-7 +.P_1F3R EQU 0x0053 ; R CHS-номер сектора/LBA адрес 0-7 +.P_1F2W EQU 0x0152 ; W счетчик секторов +.P_1F2R EQU 0x0052 ; R счетчик секторов +.P_1F1W EQU 0x0151 ; W порт свойств +.P_1F1R EQU 0x0051 ; R порт ошибок +.P_1F0W EQU 0x0150 ; W порт данных младшие 8 бит +.P_1F0R EQU 0x0050 ; R порт данных младшие 8 бит +.P_3F7W EQU 0x4155 ; W регистр комманд +.P_3F6W EQU 0x4154 ; W +.SELECT EQU 0xBC ; выбор IDE канала +.SECONDARY EQU 0x01 +.PRIMARY EQU 0x21 + +; биты порта статуса HDD + BITMASK BSY, 7 + BITMASK RDY, 6 + BITMASK DRQ, 3 + BITMASK ERR, 0 + + BITMASK LBA_CHS, 6 ; бит выбора 1-LBA, 0-CHS + BITMASK MS_SL, 4 ; бит выбора 0-MASTER, 1-SLAVE