commit 0b0f943c34f4dc2bcdd44ada2b798fa50e98e47b Author: Tolik Trek Date: Mon Jun 12 00:09:22 2023 +1000 Creation diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/LUA/Functions.lua b/LUA/Functions.lua new file mode 100644 index 0000000..84984d0 --- /dev/null +++ b/LUA/Functions.lua @@ -0,0 +1,408 @@ +---@diagnostic disable: undefined-global + + +-- []===========================[] +-- превращает "YYYY-MM-DD" в "DD", "MM", "YYYY" +function Get_date_RU(str_date) + return string.char(string.byte(str_date,10), string.byte(str_date,11)), string.char(string.byte(str_date,7), string.byte(str_date,8)), string.char(string.byte(str_date,2), string.byte(str_date,3), string.byte(str_date,4), string.byte(str_date,5)) +end +-- []===========================[] + + +-- []===========================[] +function Get_file_data(fname) + + -- убираем из дефайна_пути_файла всякие табы и пробелы лишние. Путь должен быть обрамлён одинарными кавычками + fname = string.gsub(string.match(fname, '\'.*\''), "'", "") + local file = assert(io.open(fname, "rb")) + local data = file:read("*all") + file:close() + return data +end +-- []===========================[] + + +-- []===========================[] + -- возвращает число из строки или файла заданной размерности + -- get_number (file, offset, bytes) + +function Get_number (str,offset, bytes) + local factor = 1 + local number = 0 + if bytes > 8 then + sj.error("error in function 'get_number' with variable 'bytes'", bytes) + sj.exit(1) + end + + for i = offset, offset+bytes-1, 1 do + number = number + str:byte(i) * factor + factor = factor * 256 + end + + return number +end +-- []===========================[] + + + +-- []===========================[] + -- считает контрольную сумму для файла + -- get_checksum(FileName, FileLength) + +function Get_checksum(fname, fStart, fLength) + local reg_b = 0 + local reg_c = 0 + local reg_d = 0 + local reg_e = 0 + + local data = Get_file_data(fname) + + fLength = tonumber(fLength) + if (fLength == 0) or (fLength == nil) then fLength = data:len() end + if (fStart == 0) or (fStart == nil) then fStart = 1 end + + -- Расчёт контрольной суммы (регистры BC - младший и DE - старший): + --print(fname, "fStart", fStart, "fLength", fLength) + for i = fStart, fLength, 1 do + reg_c = reg_c + data:byte(i) + if reg_c > 255 then + reg_c = reg_c - 256 + reg_b = reg_b + data:byte(i) + if reg_b > 255 then + reg_b = reg_b - 256 + reg_e = reg_e + data:byte(i) + if reg_e > 255 then + reg_e = reg_e - 256 + reg_d = reg_d + data:byte(i) + if reg_d > 255 then + reg_d = reg_d - 256 + end + end + end + end + + --print (string.format("%x",i-1), string.format("%x", reg_d*16777216+reg_e*65536+reg_b*256+reg_c)) + end + + return reg_d*16777216+reg_e*65536+reg_b*256+reg_c +end +-- []===========================[] + + + +-- []===========================[] +-- достаёт из BMP-8bit разрешение, размер растра, смещение растра, кол-во цветов +function Get_bmp8bit_values(fname) + + local TBitMapFileHeader = { + bfType = 0+1, + bfSize = 2+1, + bfOffBits = 10+1 + } + local TBitmapInfoHeader = { + biSize = 0+14+1, + biWidth = 4+14+1, + biHeight = 8+14+1, + biplanes = 12+14+1, + biBitCount = 14+14+1, + biCompression = 16+14+1, + biSizeImage = 20+14+1, + biXPelsPerMeter = 24+14+1, + biYPelsPerMeter = 28+14+1, + biClrUsed = 32+14+1, + biClrImportant = 36+14+1 + } + + local bmp_height, bmp_width, bmp_image_size, bmp_colors, bmp_image_offset, temp_variable + + local data = Get_file_data(fname) + + temp_variable = Get_number (data,TBitMapFileHeader.bfType, 2) + if temp_variable ~= 19778 then + sj.error("error, not BMP file") + sj.exit(1) + end + + temp_variable = Get_number(data, TBitmapInfoHeader.biSize, 4) + if temp_variable ~= 40 then + sj.error("error, unsupported DIB header", temp_variable) + sj.exit(1) + end + + temp_variable = Get_number (data,TBitmapInfoHeader.biBitCount, 2) + if temp_variable > 8 then + sj.error("error in BMP file, not 8-bit pallete, but", temp_variable) + sj.exit(1) + end + + bmp_height = Get_number (data, TBitmapInfoHeader.biHeight, 4) + --[[ + if bmp_height > 256 then + sj.error("error in BMP file, max height is 256, but", bmp_height) + sj.exit(1) + end + ]]-- + bmp_width = Get_number(data, TBitmapInfoHeader.biWidth, 4) + --[[ + if bmp_width > 320 then + sj.error("error in BMP file, max width is 320, but", bmp_width) + sj.exit(1) + end + ]]-- + + bmp_image_offset = Get_number(data, TBitMapFileHeader.bfOffBits, 4) + bmp_image_size = bmp_height * bmp_width + bmp_colors = (Get_number (data, TBitMapFileHeader.bfOffBits, 4) - Get_number (data, TBitmapInfoHeader.biSize, 4) - (TBitmapInfoHeader.biSize - 1))/4 + + return bmp_width, bmp_height, bmp_image_size, bmp_image_offset, bmp_colors +end +-- []===========================[] + + + +-- []===========================[] +function Detect_os() + local BinaryFormat = package.cpath:match("%p[\\|/][?]%p(%a+)") + + if BinaryFormat == "dll" then return "Windows" elseif + BinaryFormat == "dylib" then return "MacOS" elseif + BinaryFormat == "so" then + if (os.execute("test -e /sbin/dynamic_pager")) then return "MacOS" + else return "Linux" + end + else + print("--[ ERROR! OS is not detected!!! ]--") + os.exit(1) + end +end +-- []===========================[] + + + +-- []===========================[] +function File_save(fname, new_fname, offset, size, fstep, fskip) + if (fstep and fskip) == nil then fstep = 0 fskip = 0 end + local data = Get_file_data(fname) + local file = assert(io.open(new_fname, "w+b")) + if (io.type(file) == "file" ) then + if fstep + fskip ~= 0 then + local i = offset + 1 + repeat + file:write(string.sub(data, i, i+fstep-1)) + i = i+fstep+fskip + until i >= (offset + 1 + size - 1) + file:close() + return true + else + file:write(string.sub(data, offset+1, offset+1+size-1)) + file:close() + return true + end + else + file:close() + return false + end +end +-- []===========================[] + +-- []===========================[] +function Get_Full_Filename(pname, fname, OStype) + -- убираем из дефайна_пути_файла всякие табы и пробелы лишние. Путь должен быть обрамлён одинарными кавычками + local psep = "/" + fname = string.gsub(string.match(fname, '\'.*\''), "'", "") + pname = string.gsub(string.match(pname, '\'.*\''), "'", "") + return (pname .. psep .. fname) + --print (fname, pname) +end +-- []===========================[] + + +-- []===========================[] +function INCLUDING_INFO_START() + -- {ii_parent_num} = ii_count + -- {ii_parent_num, ii_nested_level, ii_file_name, ii_start_addr, ii_end_addr, ii_its_size} + -- {ii_parent_num, ii_nested_level, ii_file_name, ii_start_addr, ii_end_addr, ii_its_size} + -- {ii_parent_num} = ii_count + -- {ii_parent_num, ii_nested_level, ii_file_name, ii_start_addr, ii_end_addr, ii_its_size} + -- {ii_parent_num, ii_nested_level, ii_file_name, ii_start_addr, ii_end_addr, ii_its_size} + + --ii_parent_num = 1 + ii_nested_level = 1 + ii_file_name = 2 + ii_start_addr = 3 + ii_end_addr = 4 + ii_its_size = 5 + + ii_array = {} -- nest level, data + ii_count = 0 + ii_nest = {} + ii_nest_count = 0 + ii_tmp_nested_level = -1 +end + +-- []---------------------------[] +function INCLUDING_INFO_ADDstart() + local temp_cnt = tonumber(sj.get_define("__INCLUDE_LEVEL__")) + + if temp_cnt < ii_tmp_nested_level then + print("Error in script INCLUDING_INFO_ADDstart: new nesting < old nesting\r\n","File: " .. sj.get_define("__FILE__"), "Line: " .. sj.get_define("__LINE__")) + sj.exit(1) + elseif temp_cnt > 20 then + print("Error in script INCLUDING_INFO_ADDstart: current nesting > 20\r\n","File: " .. sj.get_define("__FILE__"), "Line: " .. sj.get_define("__LINE__")) + sj.exit(1) + end + + ii_array[ii_count] = {--ii_count, -- ii_parent_num + temp_cnt, -- ii_nested_level + sj.get_define("__FILE__"), + sj.current_address, + 0,0 + } + + ii_nest[ii_nest_count] = ii_count + ii_nest_count = ii_nest_count+1 + ii_count = ii_count + 1 + ii_tmp_nested_level = temp_cnt +end +-- []---------------------------[] +function INCLUDING_INFO_ADDend() + local temp_cnt = tonumber(sj.get_define("__INCLUDE_LEVEL__")) + + if temp_cnt > ii_tmp_nested_level then + print("Error in script INCLUDING_INFO_ADDend: current nesting > old nesting\r\n","File: " .. sj.get_define("__FILE__"), "Line: " .. sj.get_define("__LINE__")) + sj.exit(1) + end + + ii_nest_count = ii_nest_count-1 + temp_cnt = ii_nest[ii_nest_count] + ii_array[temp_cnt][ii_end_addr] = sj.current_address + ii_array[temp_cnt][ii_its_size] = sj.current_address - ii_array[temp_cnt][ii_start_addr] + + ii_tmp_nested_level = ii_array[temp_cnt][ii_nested_level] +end + +-- []---------------------------[] +function INCLUDING_INFO_END() + local nest_sting_start = "└├│" + local nest_sting_line = "────────────────────" + local previous_nest = 0 + + print(" File\t\t\t\t\t","Start \tEnd \tSize ") + for i = 0, ii_count-1, 1 do + --print(tostring(ii_array[i][ii_nested_level]) .. " " .. ii_array[i][ii_file_name]:sub(ii_array[i][ii_file_name]:find("/")+1,-1),"\r\t\t\t\t\t", tostring(ii_array[i][ii_start_addr]), tostring(ii_array[i][ii_end_addr]), tostring(ii_array[i][ii_its_size])) + print(tostring(ii_array[i][ii_nested_level]) .. " " .. ii_array[i][ii_file_name]:sub(ii_array[i][ii_file_name]:find("/")+1,-1),"\r\t\t\t\t\t", string.format("%X",ii_array[i][ii_start_addr]), string.format("%X",ii_array[i][ii_end_addr]), tostring(ii_array[i][ii_its_size])) + end + +end + + +-- []===========================[] + + +-- []===========================[] +function Hrust_File(cmdLine, firstPath, secondPath, firstName, secondName) + cmdLine = string.gsub(string.match(cmdLine, '\'.*\''), "'", "") + firstPath = string.gsub(string.match(firstPath, '\'.*\''), "'", "") + secondPath = string.gsub(string.match(secondPath, '\'.*\''), "'", "") + firstName = string.gsub(string.match(firstName, '\'.*\''), "'", "") + secondName = string.gsub(string.match(secondName, '\'.*\''), "'", "") + + local fullCmdLine = cmdLine .. firstPath .. firstName .. " " .. secondPath .. secondName + print(fullCmdLine) +end +-- []===========================[] + + +-- []===========================[] +-- Конвертит число в строку его двоичного представления. bits - разрядность, если число больше, +-- чем разрядность для представления этого числа, то будет баг +function Number2Binary(n, bits) + bits = bits-1 + local t = {} + for i = bits, 0, -1 do + t[#t+1] = math.floor(n/2^i) + n = n%2^i + end + return table.concat(t) +end +-- []===========================[] + + +-- []===========================[] +function DCP_Page2Table (DCP_PAGE) + local portsTable = {} + local bitAddress = 0 + local bitTMPor = 0 + local bitMask = 0 + local CNFadr = 0 + local CNFadrEnd = 0 + for Altera_Port = 1, 0xFF, 1 do + for CNF = 0, 3, 1 do + CNFadr = 1 + CNF * 0x1000 + CNFadrEnd = CNFadr + 0x0FFF + bitAddress = 0 + bitTMPor = 0 + for address = CNFadr, CNFadrEnd, 1 do + if (DCP_PAGE:byte(address) == Altera_Port) then + if bitAddress == 0 then + bitAddress = (address-1) + bitTMPor = (address-1) + else + bitAddress = bitAddress & (address-1) + bitTMPor = bitTMPor | (address-1) + end + end + end + if (bitAddress ~= 0) then + bitMask = ~bitAddress ~ bitTMPor + bitMask = bitMask & 0x3FFF + portsTable[#portsTable+1] = bitAddress + portsTable[#portsTable+1] = bitMask + portsTable[#portsTable+1] = Altera_Port + end + end + end + return portsTable +end +-- []===========================[] + + +-- []===========================[] +function Generate_DCPASM_fromPAGE (DCP_Page_file, DCP_new_ASM) + -- получаем порты из файла + print(DCP_Page_file) + print(DCP_new_ASM) + + local data = Get_file_data(DCP_Page_file) + DCP_TABLE = DCP_Page2Table(data) + + -- открываем файл на запись + local DCP_TABLE_CODE + + -- убираем из дефайна_пути_файла всякие табы и пробелы лишние. Путь должен быть обрамлён одинарными кавычками + DCP_new_ASM = string.gsub(string.match(DCP_new_ASM, '\'.*\''), "'", "") + DCP_TABLE_CODE = assert(io.open(DCP_new_ASM, "w+")) + + -- шапка + assert(DCP_TABLE_CODE:write(';', '\r\n')) + assert(DCP_TABLE_CODE:write(';-----------------------------------------------------------------------;', '\r\n', '\r\n')) + + -- таблица + for i = 1, #DCP_TABLE, 3 do + assert(DCP_TABLE_CODE:write(';', '\r\n')) + assert(DCP_TABLE_CODE:write(' DW %', Number2Binary(DCP_TABLE[i], 14), '\r\n')) + assert(DCP_TABLE_CODE:write(' DW %', Number2Binary(DCP_TABLE[i+1], 14), '\r\n')) + assert(DCP_TABLE_CODE:write(' DB #', string.format("%X",DCP_TABLE[i+2]), '\r\n')) + end + + -- подвал + assert(DCP_TABLE_CODE:write('; DCP END MARKER', '\r\n')) + assert(DCP_TABLE_CODE:write(' DW 0,0,0', '\r\n')) + assert(DCP_TABLE_CODE:write(';-----------------------------------------------------------------------;', '\r\n')) + assert(DCP_TABLE_CODE:write(';')) + + -- закрытие файла + assert(DCP_TABLE_CODE:flush()) + assert(DCP_TABLE_CODE:close()) +end +-- []===========================[] \ No newline at end of file diff --git a/constants/BIOS_equ.inc b/constants/BIOS_equ.inc new file mode 100644 index 0000000..00745b4 --- /dev/null +++ b/constants/BIOS_equ.inc @@ -0,0 +1,197 @@ +; Строка ID бутлоадера + MACRO _mSYSID + DZ 'Starting...' + ENDM +; +;[Вызов функций .------------------- +ToBIOS EQU #08 +ToBIOS_18 EQU #18 +ToBIOS_3D13 EQU #3D13 +ToBIOS_FromEXT EQU #3FD0 +;--------------------------------------- +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 +.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 ; Открытие стандартных окон. +.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 ; Получить текущее положение вывода на экран +;--------------------------------------- + +;[Графические функции]------------------ +.PIC_POINT EQU #A1 ; Установить точку +.PIC_SET_PAL EQU #A4 ; Установка палитры +.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 ; Установить параметры носителя +.EXT_VERSION EQU #5A ; Номер версии дисковой спецификации. +.DRV_LIST EQU #5F ; Список дисковых устройств +;--------------------------------------- + +;[Управление железом, опр. версии]------ +.FN_TURBO EQU #8F ; Функция управления турбо режимом и FDD 720/1440 +.FN_TURBO.OFF EQU #02 +.FN_TURBO.ON EQU #03 +.FN_TURBO.VG.OFF EQU #12 +.FN_TURBO.VG.ON EQU #13 +.CheckInit EQU #97 ; Если обнаружен первый старт, то инициализация всей памяти, системных переменных +.FullInit EQU #9F ; Инициализация всей памяти, системных переменных +.FN_CRIPT EQU #ED ; Выдача полного Board Number +.RST_CONF.AY8910 EQU #EE ; для совместимости с софтом Sp97, переключение в конфу AY8910 +.FN_VERSION EQU #EF ; Выдача информации о версии BIOSа и железа. +.RST_CONF.SP97_1 EQU #F0 ; для совместимости с софтом Sp97, переключение в конфу Sprinter-1 +.RST_CONF.SP97_2 EQU #F1 ; для совместимости с софтом Sp97, переключение в конфу Sprinter-2 +.FN_SYNC EQU #F2 ; Установка синхронизации, очистка страницы режима экрана +.SPRINTER_ALL EQU #F3 ; переключение конфигурации пользователя +.DCP_FN0 EQU #F4 ; Функция управления дешифратором портов. Функция в разработке +.CMOS_TEST EQU #F5 ; Проверить наличие CMOS +.CMOS_RD EQU #F6 ; Читать из регистра CMOS +.CMOS_WR EQU #F7 ; Писать в регистр CMOS +.SET_PORTS EQU #F8 ; Установка внутренних портов. Функция в разработке +.READ_PORTS EQU #F9 ; Чтение внутренних портов. Функция в разработке +.WRITE_PORTS EQU #FA ; Запись внутренних портов. Функция в разработке +.GOTO_SPECTRUM EQU #FB +.REINIT EQU #FD ;[x] restart, soft/hard reset, reinit RAM ID for spectrum pages +.REINIT.RESTART EQU #01 +.REINIT.SOFT_RESET EQU #02 +.REINIT.HARD_RESET EQU #03 +.REINIT.SET_ZXPAGES EQU #04 +;--------------------------------------- + +;-----------------------[НЕПРОВЕРЕНО!!!]---------------------- + +;============================================================= +; ..Внутренняя функция.. +; открыть графическое окно, с описателем в 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 +;============================================================= \ No newline at end of file diff --git a/constants/EXE_Header.z80 b/constants/EXE_Header.z80 new file mode 100644 index 0000000..4a1237a --- /dev/null +++ b/constants/EXE_Header.z80 @@ -0,0 +1,33 @@ +; +;*************************************** + ORG org_addr - exe_header.length +exe_header equ $ + BYTE 'EXE' ; 0-3 EXE Сигнатура + BYTE 0 ; 4 Version of EXE file + DWORD exe_header.length ; 5-6 С какого смещения в файле будет грузиться код в +; ; 7-8 память по адресу (Code_addr) Low addr, High addr. + WORD Loader_length ; 9-10 Размер первичного загрузчика или 0 + WORD #0000 ; 11-12 Reserved + WORD #0000 ; 13-14 Reserved + WORD #0000 ; 15-16 Reserved + WORD code_addr ; 17-18 Адрес расположения кода в памяти (#4100-#FFFF) + WORD program_start ; 19-20 Адрес в памяти с которого запустится код (Reg. PC) + WORD stack_point ; 21-22 Адрес стека (Reg. SP) + IFDEF EXEinfoMACRO ; 23-512 Можно использовать под текст для выпендрёжа или не использовать + _mEXEinfo + ENDIF +; ПРИМЕР: +; BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX +; BYTE 'Turbo Assembler ' +; BYTE ' v 0.71 ' +; BYTE 'Coded in 1999 by' +; BYTE ' Enin Anton. ' +; BYTE ' Resurrected & ' +; BYTE ' modified by ' +; BYTE ' Anatoliy ' +; BYTE ' Belyanskiy, ' +; BYTE ' Sprinter Team ' +; BYTE ' 2023 ' +.length equ $-exe_header ; !FIXIT а если код для загрузки не сразу после заголовка? +;*************************************** +; \ No newline at end of file diff --git a/constants/SP2000.inc b/constants/SP2000.inc new file mode 100644 index 0000000..fb9610f --- /dev/null +++ b/constants/SP2000.inc @@ -0,0 +1,1871 @@ +; + DEFDEVICE SPRINTER, #4000, 256 + + IFNDEF _includedSP2000 : DEFINE _includedSP2000 : ENDIF +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Прерывания ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Вектор #FF: +; клавиатура - висит 32 такта. можно проверить по буферу в проце, может наложиться с остальными. +; кадровое - висит 32 такта. Может наложиться с остальными. +; CBL - висит до захвата процем, может наложиться с остальными. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Адреса портов ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; ПОРТ #FE +; Read: +; bit0 - keyboard +; bit1 - keyboard +; bit2 - keyboard +; bit3 - keyboard +; bit4 - keyboard +; bit5 - display sync: 1 - луч>256, 0 - луч<256. Ход луча 0..319 / 0..311, в зависимости от развёртки. Работает только при активированном CBL, иначе всегда 0 +; bit6 - Tape in +; bit7 - если активированы прерывания CBL: 1 - CBL interrupt, иначе расширенный бит спектрумовской клавиатуры +; +; Write: +; bit0 - Border Color +; bit1 - Border Color +; bit2 - Border Color +; bit3 - Tape out +; bit4 - Beeper out +; bit5 - +; bit6 - +; bit7 - + + +ZX_Beeper EQU #FE ; bit 4 +ZX_Tape_Ou EQU #FE ; bit 3 +ZX_Tape_In EQU #FE ; bit 6 + +;------------[Covox Blaster]------------; +CBL: +.OUT EQU #4F ; Порт для вывода звука = #FB +.BUFFER_PAGE EQU #FD ; страница-буфер для кидания музла акселем (прерывания CBL должны быть включены) +.INT_PORT EQU #FE ; bit4=1 --> bit7=1 запрос на заполнение полубуфера данными +.SYS_PORT EQU #004E ; порт управления COVOX-Blaster (CBL_DIR). 16-bit port!!!, писать через OUT (c),reg или очень осторожно)) +.COVOX_OUT EQU #FB ; Порт для вывода звука = #4F + +; #00 - COVOX on, standart Pentagon mode +; #80 - CBL on, 15 kHz mono +; #81 - CBL on, 22 kHz mono +; Bits: +; 7 - covox/CBL +; 6 - моно/стерео +; 5 - 8/16 бит +; 4 - выкл/вкл прерываний (вектор #FF, признак - порт #FE.bit7 и весит до захвата процем) +; 3..0 - частота ; дополнить +; Частоты: +; От 8 до 15 +; Значения 0..7 для совместимости со старым бластером: 0 - 16, 1 - 22 кГц +; +; буфер - 256/512 байт (8/16 bit mode) +; (2 банки по 128/256) +; прерывание прилетает после каждой +; банки + +; Режим 8 бит: +; уровень нуля в семплах - #80 +; Режим 16 бит: +; уровень нуля в семплах - #0000 +; Stereo-сэмплы: +; чередующиеся отсчеты L и R каналов. + +; mono_8bit: +; DB 80h,81h,7Fh.... +; mono_16bit: +; DW 0,1000,-1000... +; stereo_8bit: +; DB 80h,80h,81h,80h,7Fh,80h... ; здесь один канал играет, второй молчит +; stereo_16bit: +; DW 0,0,1000,0,-1000,0... ; аналогично, один канал играет, второй молчит + + +; CASE CBL_XX[3..0] IS +; WHEN 0 => CBL_TAB[] = 13; -- 15.625 KHz -- mono/stereo +; WHEN 1 => CBL_TAB[] = 9; -- 21.875 KHz -- mono/stereo +; WHEN 2 => CBL_TAB[] = 0; -- reserved +; WHEN 3 => CBL_TAB[] = 0; -- reserved +; WHEN 4 => CBL_TAB[] = 0; -- reserved +; WHEN 5 => CBL_TAB[] = 0; -- reserved +; WHEN 6 => CBL_TAB[] = 0; -- reserved +; WHEN 7 => CBL_TAB[] = 0; -- reserved + +; WHEN 8 => CBL_TAB[] = 27; -- 7.8125 KHz -- mono/stereo 8/16 bit +; WHEN 9 => CBL_TAB[] = 19; -- 10.9375 KHz -- mono/stereo 8/16 bit +; WHEN 10=> CBL_TAB[] = 13; -- 15.625 KHz -- mono/stereo 8/16 bit +; WHEN 11=> CBL_TAB[] = 9; -- 21.875 KHz -- mono/stereo 8/16 bit +; WHEN 12=> CBL_TAB[] = 6; -- 31.25 KHz -- mono/stereo 8/16 bit +; WHEN 13=> CBL_TAB[] = 4; -- 43.75 KHz -- mono/stereo 8/16 bit +; WHEN 14=> CBL_TAB[] = 3; -- 54.6875 KHz -- mono/stereo 8/16 bit +; WHEN 15=> CBL_TAB[] = 1; -- 109.375 KHz -- mono/stereo 8/16 bit +; END CASE; +;---------------------------------------; + +;======================================= +; замаплен через карту портов на #7C/#3C и #74/#24 +CNF_PORT: +.ON EQU #74 +.OFF EQU #24 +.TURBO.ON EQU 3 ; данные для включения TURBO +.TURBO.OFF EQU 2 ; данные для выключения TURBO +.CNF_0 EQU #04 ; карта портов 0 +.CNF_1 EQU #0C ; карта портов 1 +.CNF_2 EQU #14 ; карта портов 2 +.CNF_3 EQU #1C ; карта портов 3 +.CNF_512 EQU #80 ; включение Pentagon 128 +; прибит в конфе гвоздями на #7C/#3C +SYS_PORT: +.ON EQU #7C +.OFF EQU #3C +.RAM EQU .OFF +.ROM EQU .ON +.PAGE0 EQU 1 +.PAGE8 EQU 0 +.EXPANSION EQU .PAGE0 +.BIOS EQU .PAGE8 +.TURBO.ON EQU CNF_PORT.TURBO.ON +.TURBO.OFF EQU CNF_PORT.TURBO.OFF +.CNF_0 EQU CNF_PORT.CNF_0 +.CNF_1 EQU CNF_PORT.CNF_1 +.CNF_2 EQU CNF_PORT.CNF_2 +.CNF_3 EQU CNF_PORT.CNF_3 +.CNF_512 EQU CNF_PORT.CNF_512 +/* +--------------------------------------------------- +CNF_PORT висит на 4 внешних портах (#7C/#3C и #74/#24) через карту портов. +SYS_PORT гвоздями в конфе на #7C/#C + +SYS_PORT только переключает RAM/ROM +CNF_PORT меняет всё остальное, при бит1=0 меняются страницы эмулятора ПЗУ через бит0 + +CNF_PORT +bit0 - TURBO: on/off или vROM: +; #24 - страница из вн.порта (#E0..#E3)/(#E4..#E7) +; #74 - страница из вн.порта #EB/#EF +bit1 - 1 - TURBO ena, 0 - переключение vROM page +bit2 - 1 - CNF ena +bit3 - \_ cnf0..cnf3 ;\ +bit4 - / ; \ +bit5 - CNF_PN[5..0]_RESET by 1 - сброс Пент. порта ; |---> действуют только при bit2=1 +bit6 - CNF_SC_RESET by 1 - сброс Скорп. порта ; / +bit7 - CNF_PN[7..6]_RESET by 0 - сброс Пент-512 ;/ + +Переключение страниц vROM: +; Port #24 = 0 + #E0 - EXPANSION ; #1FFD bit2=1 + #E1 - TR-DOS ; PC = #3D00..#3DFF and #1FFD bit2=0 + #E2 - BASIC-128 ; #7FFD bit4=0 and #1FFD bit1=0 + #E3 - BASIC-48 ; #7FFD bit4=1 and #1FFD bit1=0 +; Port #24 = 1 + #E4 - EXPANSION 2 ; #1FFD bit2=1 + #E5 - TR-DOS 2 ; PC = #3D00..#3DFF and #1FFD bit2=0 + #E6 - BASIC-128 2 ; #7FFD bit4=0 and #1FFD bit1=0 + #E7 - BASIC-48 2 ; #7FFD bit4=1 and #1FFD bit1=0 +; Port #74 = 0 + #EB - BIOS-1 ; +; Port #74 = 1 + #EF - BIOS-2 ; +;;;;;;;; + +SYS_PORT: +bit0 - TURBO: on/off или BIOS: Part1/Part0 +bit1 - 1 - TURBO ena, 0 - переключение BIOS-PAGE +bit2 - 1 - CNF ena +bit3 - \_ cnf0..cnf3 ;\ +bit4 - / ; \ +bit5 - CNF_PN[5..0]_RESET by 1 - сброс Пент. порта ; |---> действуют только при bit2=1 +bit6 - CNF_SC_RESET by 1 - сброс Скорп. порта ; / +bit7 - CNF_PN[7..6]_RESET by 0 - сброс Пент-512 ;/ + +Функция bit0 определяется через bit1 +bit7..bit3 срабатывают при bit2 = 1 + +Запись в порт #7C подключает ПЗУ в окно 0, запись в порт #3C отключает + ПЗУ от окна 0, поэтому порт 7С/3C называется System/User. +Переключение страниц ПЗУ работает в этом варианте так: + в ПЗУ 16 страниц от 0 до 15, порт #5C их переключает с bit3 xor /SYS (SYS_PORT bit[1..0] = b"0X" (BIOS: Part1/Part0)) + если сделать ld a,1 : out (sys_port_on),a - то нумерация страниц ПЗУ будет правильная от 0 до 15, + если сделать ld a,0 : out (sys_port_on),a - то нумерация страниц ПЗУ будет с инвертированным bit3: + страницы ПЗУ 0-7 будут нумероваться как 8-15 + страницы ПЗУ 8-15 будут нумероваться как 0-7 +---------------------------------------------------- +*/ +;======================================= + +; порты управления страницами фастрам +FastRAM: +.ON EQU #FB ; Включение кэша IN A,(FastRAM.ON) - прибито гвоздями в конфе +.OFF EQU #7B ; Отключение кэша IN A,(FastRAM.OFF) - прибито гвоздями в конфе +.SLOT0 EQU #5C ; Переключение страниц кэша при FastRAM.ON в нулевом окне (bit0..1) - прибито гвоздями в конфе + +; Порт управления страницами ПЗУ +; Переключение страниц ПЗУ при FastRAM.OFF в нулевом окне. +ROM: +.SLOT0 EQU #5C ; Прибито гвоздями в конфе +.BIOS EQU SYS_PORT.BIOS ; для sys_port.on D_ROM16OFF +.EXPANSION EQU SYS_PORT.EXPANSION ; для sys_port.on D_ROM16ON +; Значения: +; номер страницы bit3..0 +; разрешение записи bit4 (0 - no Write; 1 - Write) +; при bit4 == 1 принудительно выставляется и блокируется sys_pg в 1 (ld a,1 : out (sys_port_on),a) +; пока bit4 не сброшен переключать страницы ПЗУ system/user через порт + + +P_KBD_OUT EQU #F8 ;!FIXIT заменить +P_KBD_IN EQU #FE ;!FIXIT заменить + +KEMPSTON: +.JOYSTICK EQU 7 + +; Чтение: порт джойстика и сигналы DRQ, INTRQ контроллера дисковода. +; Запись: запись в микросхему ТМ9 - системный порт TR-DOS +; кемпстон из DOS_ON для специального шнурка LPT+JOY чтоб по PC Link коннектиться к PC +.PC_Link EQU #FF ;JOY_DOS + +.MOUSE.X EQU #FBDF +.MOUSE.Y EQU #FFDF +; bit0: левая кнопка (0=нажата) +; bit1: правая кнопка (0=нажата) +; bit2: средняя кнопка (0=нажата) +; bit3: зарезервировано под ещё одну кнопку (0=нажата) +; bit4..7: координата колёсика +.MOUSE.Buttons EQU #FADF + + +;---------------[Border]---------------- +BorderColor EQU #FE +; bit 2..0: +; bit 0 - синий +; bit 1 - красный +; bit 2 - зелёный +; 0 - чёрный +; 1 - синий +; 2 - красный +; 3 - пурпурный +; 4 - зелёный +; 5 - голубой +; 6 - жёлтый +; 7 - белый +; +; цвет бордюра в режиме спринтера берётся из 4 палитры. +; цвет в палитре вычисляется дублированием в байте цвета bit2..0 в bit5..3 +; можно вычислять итоговый индекс в палитре умножением цвета на 9, либо +; три сдвига цвета влево плюс исходный цвет цвет +; 0 - BLACK color index #00 +; 1 - BRIGHT BLUE color index #09 +; 2 - GREEN color index #12 +; 3 - BRIGHT CYAN color index #1B +; 4 - RED color index #24 +; 5 - BRIGHT MAGENTA color index #2D +; 6 - BROWN color index #36 +; 7 - WHITE color index #3F +;--------------------------------------- + +;-------------[ZX keyboard]------------- +; № ╔══╦══╦══╦══╦══╦══╦══╦══╦══╦══╗ +; БИТA ║ 0║ 1║ 2║ 3║ 4║ 4║ 3║ 2║ 1║ 0║ +; ╚══╩══╩══╩══╩══╩══╩══╩══╩══╩══╝ +; № ┌──┬──┬──┬──┬──╥──┬──┬──┬──┬──┐ № +; П 3│ 1│ 2│ 3│ 4│ 5║ 6│ 7│ 8│ 9│ 0│ 4 П +; О ├──┼──┼──┼──┼──║──┼──┼──┼──┼──┤ О +; Л 2│ Q│ W│ E│ R│ T║ Y│ U│ I│ O│ P│ 5 Л +; У ├──┼──┼──┼──┼──║──┼──┼──┼──┼──┤ У +; Р 1│ A│ S│ D│ F│ G║ H│ J│ K│ L│EN│ 6 Р +; Я ├──┼──┼──┼──┼──║──┼──┼──┼──┼──┤ Я +; Д 0│CS│ Z│ X│ C│ V║ B│ N│ M│SS│SP│ 7 Д +; А └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ А +; Клавиша нажата: бит = 0 +; 3 - #F7 7 - #7F +; 2 - #FB 6 - #BF +; 1 - #FD 5 - #DF +; 0 - #FE 4 - #EF + +; Возможно одновременное чтение +; нескольких полурядов при сбросе +; нескольких бит в старшем байте +; адреса порта +ZXKeys EQU #FE +.Line_0 EQU #FEFE +.Line_1 EQU #FDFE +.Line_2 EQU #FBFE +.Line_3 EQU #F7FE +.Line_4 EQU #EFFE +.Line_5 EQU #DFFE +.Line_6 EQU #BFFE +.Line_7 EQU #7FFE + + +; ????? Что-то про расширенный бит клавы в #FE + +; CS - caps shift +; SS - symbol shift +; FS - function shift + +; Left Shift => CS +; Right SHIFT => CS +; Ctrl => SS +; Alt => SS+CS +; left WIN => ENTER+CS +; ESC => SPACE+CS +; Right WIN => ENTER+SS +; Right Mouse => SPACE+SS + +; Back => 0+CS +; Tab => 1+CS +; Caps Lock => 2+CS +; PUp => 3+CS +; PDn => 4+CS +; <- => 5+CS +; Dn => 6+CS +; Up => 7+CS +; -> => 8+CS +; DEL => 9+CS + +; ~ => A+SS +; '' => D+SS + +; / => V+SS +; Grey * => B+SS +; , => N+SS +; . => M+SS + +; [ => Y+SS +; ] => U+SS +; Grey 5 => I+SS +; ; => O+SS +; ' => P+SS + +; Home => Q+SS +; Ins => W+SS +; End => E+SS + +; - => J+SS +; Grey - => J+SS +; Grey + => K+SS +; = => L+SS + +; F1 => 1+FS +; F2 => 2+FS +; F3 => 3+FS +; F4 => 4+FS +; F5 => 5+FS +; F6 => 6+FS +; F7 => 7+FS +; F8 => 8+FS +; F9 => 9+FS +; F10 => 0+FS +; Scroll Lock => CS+FS +;--------------------------------------- +; +;--------[синхронизация экрана]--------- +SCR_SyncPort EQU #FE +; bit 5 - синхронизация экрана +; кадровый импульс +; длина - 4 мс +; период - 20 мс + +;--------------------------------------- +; + +SLOT0 EQU #82 ; номер банки 0 +SLOT1 EQU #A2 ; номер банки 1 +SLOT2 EQU #C2 ; номер банки 2 +SLOT3 EQU #E2 ; номер банки 3 + +PORT_Y EQU #89 ; вертикальная координата точки на графическом экран +RGADR EQU #89 ; страница VIDEO-RAM для спектрумовского режима +;RGSCR EQU #E9 = RGMOD +RGMOD EQU #C9 ; порт режима экрана. Переключает страницы режима экрана. +SCREEN_SWITCH EQU #C9 ; порт режима экрана. Переключает страницы режима экрана. +;RGACC EQU #A9 +PGACC EQU #FC ; Порт масштабирования + +Port_All_Mode EQU #204E +; bit0 - 0: выкл акселератора и прерываний от клавиатуры, включение спековской адресации экрана. +; bit1 - +; bit2 - вкл/выкл original zx spectrum waits +; bit3 - вкл/выкл отдельное от акселератора прерывания от клавиатуры +; bit4 - +; bit5 - +; bit6 - +; bit7 - + +Port_VSYNC EQU #BD ; #41 - 320Lines/49Hz, #61 - 312Lines/50Hz +.SET_320L EQU #41 +.SET_312L EQU #61 + +; +;----------------------------------------------------------------------; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; Адреса страниц ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;SCR_PAGE EQU 0FDH +;PAL_PAGE EQU 0FDH +PAL_V_PAGE EQU #9E ;????? +PAL_SCP EQU #1E ;????? + +; страница портов +DCP_PAGE EQU #40 + +; страница используемая DSS +DSS_PAGE EQU #FF +ZERO_PAGE EQU 0 +; страница для перехвата ресета и ещё чего-то +Spec_Page EQU #41 +MODE_PAGE EQU #FC ;????? если рудимент, то убрать из резервирования в таблице страниц +RESET_PAGE EQU #A0 + ; Сброс может быть осуществлен записью в страницу #A0, установленную в расширенную + ; страницу Scorpion-овского распределения портов, т.е. следующей программой: + ; DI + ; LD A,16 + ; LD BC,#1FFD + ; OUT (C),A + ; LD A,RESET_PAGE + ; OUT (PAGE3),A + ; LD (#C000),A ; в этот момент подается RESET + ; +; страница с системными переменными BIOS +SYS_PAGE EQU #FE +.ID_FLAG EQU #C000 ; копия ID_SPRINTER для детекта полной инициализации. 32 bytes max +; vsync: +; bit0 1 - 320L, 0 - 312L +; bit1 1 - no waits, 0 - original waits +.VSyncAndWaits EQU #C020 +;!TODO EQU #C021 - #C027 +; STACK for FN_LIB end EQU #C028 +.SYS_SP EQU #C0FE ; ДОПОЛНИТЕЛЬНЫЙ СТЕК для FN_LIB и ещё чего-то +.DISK_TYPE EQU #C100 ; переадресация дисков +.COPY_SLOT0 EQU #C104 ; копии значений портов страниц +.COPY_SLOT1 EQU #C105 +.COPY_SLOT2 EQU #C106 +.COPY_SLOT3 EQU #C107 +.RAMD_VARS EQU #C108 ; переменные RAM-дисков ;!TODO сохранять тут признак смены рамдиска или его блока памяти для драйвера DSS +.A_RAMD_VARS EQU #C118 ; текущий RAM-Disk +.SP_SAVE EQU #C11A ; место для сохранения адреса стека +.ERR_SAVE EQU #C11C +.COPY_RGADR EQU #C11D +.RAM_MSD EQU #C11E ; страница для работы в MS-DOS +.MSD_SECS EQU #C11F ; Число секторов в MS-DOS +.MSD_NAME EQU #C120 ; Адрес имени найденного файла +;.HDD_WRITE_PROTECT EQU #C122 ; копия содержимого ячейки кмос ;!TODO +.INT_ADRESS EQU #C124 ; адрес обработчика прерывания +.INT_PAGE EQU #C126 ; страница с обработчиком прерывания +.INT_ID EQU #C127 ; если = #AA - значить обработчик установлен +.DS_1440 EQU #C128 ; флаги переключения 720/1440 +.F_P_S EQU #C129 ; число файловых записей в секторе +.S_P_C EQU #C12A ; число секторов каталога +.COUNT_FL EQU #C12B ; счетчик файлов в секторе +.COUNT_SEC EQU #C12C ; счетчик секторов в каталоге +.C_P_B EQU #C12D ; число кластеров на блок ОЗУ +;!TODO EQU #C12E +.FAT_FLAG EQU #C130 ; FAT флаг + FAT sector +.MSD_CONT_SEC EQU #C132 ; текущий сектор для MS-DOS +.MSD_CONT_SEC2 EQU #C134 +.S_X_H EQU #C136 ; количество секторов на цилиндре + +; тут хранится указатель на таблицу инта +; используемую функцией #F2 BIOS +.CONFIG_ALL EQU #C138 ; описатель конфигурации - 2 байта + +;Есть такой код, например: +; LD DE,CNF_0+D_TBOFF +; LD (SYS_PAGE.CONFIG_DE),DE +; первый байт для SYS_PORT_ON/OFF. +; второй байт для выбора режима +; спектрума при запуске функциями ПЗУ. +.CONFIG_DE EQU #C13A ; описатель конфигурации - 2 байта + +; 2 байта конфигурации - наследие Sp97. +; Младший байт текущая конфа (типа PG_SP1) +; Старший байт если 0, то эта конфа активирована. +; В Sp2000 туда пихается значение типа #FEFF +.CONFIG_BYTE EQU #C13E + +.WIN_MAP_SC EQU #C140 +.WIN_TAB_SC EQU #C142 +.WIN_SAV_HL EQU #C144 +.WIN_SAV_DE EQU #C146 +.WIN_SAV_BC EQU #C148 +.WIN_ZG EQU #C14A +.WIN_PLACE_WIN EQU #C14C +.WIN_GR_MAP EQU #C14E + +.SYS_WORK1 EQU #C150 +.SYS_WORK2 EQU #C152 +.SYS_WORK3 EQU #C154 +.SYS_WORK4 EQU #C156 + +.WIN_MAP_LAB1 EQU #C158 +.WIN_MODE_SH EQU #C15C +.WIN_MODE_SC EQU #C15E + +.MSD_FAT_SEC EQU #C160 ; начальный сектор FAT +.MSD_FAT_SEC2 EQU #C162 ; начальный сектор FAT +.MSD_CAT_SEC EQU #C164 ; начальный сектор CAT +.MSD_CAT_SEC2 EQU #C166 ; начальный сектор CAT +.MSD_DAT_SEC EQU #C168 ; начальный сектор DAT +.MSD_DAT_SEC2 EQU #C16A ; начальный сектор DAT +.CLASTER_LEN EQU #C16C ; длина кластера в байтах +.CLASTER_LEN2 EQU #C16E ; длина кластера в байтах + +; vsync: +; bit0 1 - 320L, 0 - 312L +; bit1 1 - no waits, 0 - original waits +;.VSyncAndWaits EQU #C170 + +;!TODO EQU #C170 - #C17F + +.RAMD_KEYS EQU #C180 ; RAM-Disks ID's - адрес в SYS_PAGE для каждой буквы рамдиска +.RAMD_KEYS.E EQU #C180 ; по которому хранится его начальный блок памяти +.RAMD_KEYS.F EQU #C181 +.RAMD_KEYS.G EQU #C182 +.RAMD_KEYS.H EQU #C183 +.RAMD_KEYS.I EQU #C184 +.RAMD_KEYS.J EQU #C185 +.RAMD_KEYS.K EQU #C186 +.RAMD_KEYS.L EQU #C187 +.RAMD_KEYS.M EQU #C188 +.RAMD_KEYS.N EQU #C189 +.RAMD_KEYS.O EQU #C18A +.RAMD_KEYS.P EQU #C18B +.RAMD_KEYS.Q EQU #C18C +.RAMD_KEYS.R EQU #C18D +.RAMD_KEYS.S EQU #C18E +.RAMD_KEYS.T EQU #C18F +.RAMD_KEYS.NUM EQU 16 ; RAMD_KEY_NUM + +;!TODO EQU #C190 - #C19F + +.LIB_TABLE EQU #C1A0; - #C1BF ; таблицы librares 32 байта +; +0 библиотека DOS + +; +.IDE_0 EQU #C1C0 +.IDE_1 EQU #C1C8 +.IDE_2 EQU #C1D0 +.IDE_3 EQU #C1D8 +; +.FDD_0 EQU #C1E0 +.FDD_1 EQU #C1E8 +;.FDD_2 EQU #C1F0 +;.FDD_3 EQU #C1F8 +; + +.RAMD_FAT EQU #C200 ; расположение блоков RAM-Disk-ов +.MS_BPB EQU #C400 ; буфер BPB +.HD_IDF_ADR EQU #C600 ; !FIXIT структурой сделать!!! +.HD_IDF_ADR.heads EQU .HD_IDF_ADR+6 +.HD_IDF_ADR.sectors EQU .HD_IDF_ADR+12 +.HD_IDF_ADR.sec_cyl EQU .HD_IDF_ADR+4 +.MS_DIR EQU #C800 ; буфер DIR sector +.MS_FAT EQU #CC00 ; буфер FAT sector +.MS_BUF EQU #D000 ; буфер DAT sector + +.WIN_MAP_IX EQU #E000 ; данные карт окон + +.TASK_DATA EQU #EC00 ; данные для задач + +.RESTART_ID EQU #F000 ; db "RESTART",0 ;First start identificator + +.PowerOnTime EQU #F008 ; время включения и перезагрузки #F008 - #F017 + + +.USER_VARS EQU #F018 ; переменные пользователей + +;------------[ OLD ]-------------; +;.SYSTEM_ID EQU #C020 ; использовалась для подмены биос "NEW_BIOS" +;.MSD_FAT_SEC EQU #C122 ; начальный сектор FAT +;.INT_ADRESS EQU #C124 ; начальный сектор CAT +;.INT_PAGE EQU #C126 ; начальный сектор DAT +;.CLASTER_LEN EQU #C12E ; длина кластера в байтах +;.CMOS_FLAG_1 EQU #C170 +;----------------------------------------------------------------------; +; +/* + STRUCT FDD_INIT_TABLE +DISK BYTE 0 +F144 EQU FDD_0+0 +SECTORS EQU FDD_0+1 +MS_SECS EQU .SECTORS +HEADS EQU FDD_0+2 +CYLINDL EQU FDD_0+3 +CYLINDH EQU FDD_0+4 +B_P_S EQU FDD_0+5 + ENDS +*/ +; + MODULE FDD_INI_TABLE ; !FIXIT таблицы для FDD устройств 32 байта. привязаться к структуре выше +FDD EQU 3 ; ????? хер его знает, что за параметр, разобраться +FDD_0 EQU SYS_PAGE.FDD_0 +.DISK EQU FDD_0+0 +.F144 EQU .DISK +.SECTORS EQU FDD_0+1 +.MS_SECS EQU .SECTORS +.HEADS EQU FDD_0+2 +.CYLINDL EQU FDD_0+3 +.CYLINDH EQU FDD_0+4 +.B_P_S EQU FDD_0+5 +FDD_1 EQU SYS_PAGE.FDD_1 +.DISK EQU FDD_1+0 +.F144 EQU .DISK +.SECTORS EQU FDD_1+1 +.MS_SECS EQU .SECTORS +.HEADS EQU FDD_1+2 +.CYLINDL EQU FDD_1+3 +.CYLINDH EQU FDD_1+4 +.B_P_S EQU FDD_1+5 + ENDMODULE +; + +; + STRUCT BIOS_DATE_FORMAT ; !FIXIT переделать под структуру все переменные #FE +hour BYTE +minute BYTE +second BYTE +day BYTE +month BYTE +year_high BYTE +year_low BYTE +reserved BYTE + ENDS + +PowerOnDate BIOS_DATE_FORMAT = SYS_PAGE.PowerOnTime +RebootDate BIOS_DATE_FORMAT = PowerOnDate + BIOS_DATE_FORMAT +;#F008-#F00F : db hour,min,sec,day,month,century-1,year-century,reserved ; PowerOn date +;#F010-#F017 : db hour,min,sec,day,mouth,century-1,year-century,reserved ; Reboot date +; + +;----------[CMOS Registers]------------- +CMOS.Port.Data: +.Read EQU #FFBD +.Write EQU #BFBD +CMOS.Port.Address: +.Write EQU #DFBD + + +CMOS.Register: +.seconds EQU #00 +.alarmSeconds EQU #01 +.minutes EQU #02 +.alarmMinutes EQU #03 +.hours EQU #04 +.alarmHours EQU #05 +.dayOfWeek EQU #06 +.date EQU #07 +.month EQU #08 +.year EQU #09 +.century EQU #32 + + +; bit7 - Update-In-Progress. read-only +; bit6..4 - %010: to turn the oscillator on and allow the RTC to keep time. +; %11x: enables the oscillator but holds the countdown chain in reset. +; The next update occurs at 500ms after a pattern of 010 is written. +; bit3..0 - Rate Selector. These four rate-selection bits select one of +; the 13 taps on the 15-stage divider or disable the divider output. +; The tap selected can be used to generate an output square wave (SQW pin) +; and/or a periodic interrupt. The user can do one of the following: +; 1) Enable the interrupt with the PIE bit; +; 2) Enable the SQW output pin with the SQWE bit; +; 3) Enable both at the same time and the same rate; or +; 4) Enable neither. +.CTRLregA EQU #0A + +; bit7 - SET. выставлять в 1 перед установкой времени/даты, после обратно в 0. +; bit6 - Periodic Interrupt Enable (PIE) +; bit5 - Alarm Interrupt Enable (AIE) +; bit4 - Update-Ended Interrupt Enable (UIE) +; bit3 - Square-Wave Enable (SQWE) +; bit2 - Data Mode (DM). формат даты и времени: BCD/HEX +; bit1 - time format: 12/24 +; bit0 - Daylight Saving Enable (DSE) +.CTRLregB EQU #0B + +; bit7 - Interrupt Request Flag (IRQF) +; bit6 - Periodic Interrupt Flag (PF), read-only +; bit5 - Alarm Interrupt Flag (AF) +; bit4 - Update-Ended Interrupt Flag (UF) +; bit3..0 - Unused, read-only == 0 +.CTRLregC EQU #0C ; read-only + +; bit7 - Valid RAM and Time (VRT). Если 1, то батарея в норме, если 0, то батарея сдохла. +; bit6..0 - Unused, read-only == 0 +.CTRLregD EQU #0D ; read-only + + + +;!TODO записать так все параметры в кмос +CMOS.Cell.ScreenSET EQU #1A +; %0000 1111 - COLOR STYLE For Setup +; %0011 0000 - Frame Int (Default/Pentagon/Scorpion/Original) +; %1100 0000 - Screen V-Sinc (Default/312 lines 50 HZ/320 Lines 49 Hz) +.Mask.Sinc EQU #C0 ; SCREEN_HZ +.Mask.Int EQU #30 ; SCREEN_INT +; + + +GR_BIT_END EQU 7 + +S_BIT_END EQU 7 +S_BIT_LIN EQU 6 +S_BIT_MOD EQU 5 + +BIT_1440 EQU 1 +BIT_MASK_1440 EQU %00000010 +;--------------------------------------- + + +; Порты КР1818ВГ93 и т.п. +FDC_93: +.Command EQU #0F ; WG_COM R_COM ;Command/Status +.Track EQU #3F ; WG_TRK R_TRK ;Track +.Sector EQU #5F ; WG_SEC R_SEC ;Sector +.Data EQU #7F ; WG_DATA R_DAT ;Data +.DrvCTRL EQU #FF ; P_DOS_FF R_DSK ;Drive Control +; + +;???????????????????????????????????????? + +;SPRINTER EQU 4 ; ВЕРСИЯ !!! +ISD_WARM EQU 3 +ISD_COLD EQU 0 +IS_KEY EQU #40 ; ДАННЫЕ ДЛЯ ВЫВОДА В ПОРТ ПРИ ВКЛЮЧЕНИИ IS-DOS +IS_RAM_ADR EQU #5BC0 ; АДРЕС ЗАГРУЗКИ ПРОГРАММЫ ПЕРЕХОДА В IS-DOS +TB_WAITES EQU #00 ; WAITы для TURBO-MODE +NTB_WAITES EQU #00 ; WAITы для neTURBO-MODE +IS_WAITES EQU #00 ; WAITы для IS-DOS +;**************************************** +;SYS_PORT_ON EQU #7D +;SYS_PORT_OFF EQU #3D + +RAMD_LET EQU ('R' - 'A') + + +;*************************************** +/* +;HD_HEADS EQU 5 +HD_CS EQU #A0 + +;HD_S_P_T EQU 17 +;HD_S_X_H EQU (HD_S_P_T * HD_HEADS) ; ??? число секторов на цилиндре + +P_DATS EQU #50 ; READ/WRITE INIR/OTIR + +P_ERR EQU #051 ; READ +P_PREC EQU #151 ; WRITE + +P_S_CNT EQU #152 +P_S_NUM EQU #153 +P_C_LOW EQU #154 +P_C_HIG EQU #155 ;<-\ +P_HD_CS EQU #4152 ;<-/ + +P_HDST EQU #4053 ; READ +P_CMD EQU #4153 ; WRITE + +P_HD3F6 EQU #4154 ; WRITE 3F6 +P_HD3F7 EQU #4055 ; READ 3F7 +*/ +;*************************************** +ISA_PORT EQU #9FBD + +;*************************************** +; !FIXIT использовать структуру _sBOOT_SEC +SEC_SIZE EQU 11 +CLAST_SIZE EQU 13 +RESERV_SECS EQU 14 +FATS_NUM EQU 16 +FLS_NUM EQU 17 +S_P_D EQU 19 +FORM_CODE EQU 21 +S_P_F EQU 22 +S_P_T EQU 24 +H_P_S EQU 26 +SPECIAL_SECS EQU 28 +FAT_ID EQU #36 +;*************************************** + + +; ***** - Оконные переменные - ***** + +WIN_SIZE_H EQU 0 ; горизонтальный размер в знакоместах +WIN_SIZE_V EQU 1 ; вертикальный размер в знакоместах +WIN_PLACE_H EQU 2 ; положение по горизонрали, в знакоместах +WIN_PLACE_V EQU 3 ; положение по вертикали в знакоместах +WIN_MODE EQU 4 ; режим знакоместа +WIN_MODE_S EQU 5 ; дополнительный режим +; бит 0 - Sp-SCR, +WIN_GR_X EQU 6 ; положение по X в поле графики (по знакомест) +WIN_GR_Y EQU 7 ; положение по Y в поле графики (по знакомест) + +WIN_HL EQU 8 ; сохранение HL +WIN_BC EQU 10 ; сохранение BC +WIN_DE EQU 12 ; сохранение DE +WIN_V_BEG EQU 14 ; начало окна по вертикали +WIN_V_END EQU 15 ; конец окна по вертикали +WIN_H_BEG EQU 16 ; начало окна по горизонтали +WIN_H_END EQU 17 ; конец окна по горизонтали +WIN_SIZE_REL EQU 18 ; реальный размер в символах +WIN_MODE_E EQU 19 ; дополнительный режим экрана +WIN_WORK_1 EQU 20 ; рабочая переменная 1 +WIN_WORK_2 EQU 21 ; рабочая переменная 2 +WIN_GRAF_X EQU 24 ; начальная координата по X +WIN_GRAF_Y EQU 26 ; начальная координата по Y + +; +; +;SW_ROM EQU #3CF9 ;!HARDCODE from zx roms + +; IF .PROJ4 +;RGADR EQU 0D0H +;RGSCR EQU 0D1H +;RGMOD EQU 0D2H +;RGACC EQU 0D3H +;PGACC EQU 0FCH + +;PAGE0 EQU 0C0H +;PAGE1 EQU 0C5H +;PAGE2 EQU 0C2H +;PAGE3 EQU 0C0H + +; ELSE + +; ENDIF + + +;ALTERA EQU #1400 ;адрес в ПЗУ сжатой страницы DCP + + +;!FIXIT ----------------------------------------------------------------; +;Переменные спектрума +ZX_VARS EQU #5C00 +; +.PR_BUFER EQU #5B00 +.AUTO_5B08 EQU #5B08 +.AUTO_5B5C EQU #5B5C +.COPY_P128 EQU #5B5C +.AUTO_5BFF EQU #5BFF +; +.K_STATE EQU #5C00 +.KEY_TIME EQU #5C09 +.REP_K_TYME EQU #5C10 +.ZG EQU #5C36 +.ERR_BEEP EQU #5C38 +.KEY_BEEP EQU #5C39 +.ERR_NR EQU #5C3A +.FLAGS EQU #5C3B +.TV_FLAG EQU #5C3C +.ERR_SP EQU #5C3D +.LIST_SP EQU #5C3F +.MODE EQU #5C41 +.NEW_PPC EQU #5C42 +.NEW_S_PPC EQU #5C44 +.PPC EQU #5C45 +.SUB_PPC EQU #5C47 +.BORDER EQU #5C48 +.EDIT_PPC EQU #5C49 +.BAS_VARS EQU #5C4B +.WORK_VAR EQU #5C4D +.CHANS EQU #5C4F +.CUR_CHL EQU #5C51 +.BAS_PROG EQU #5C53 +.NEXT_LINE EQU #5C55 +.DATA_ADR EQU #5C57 +.E_LINE EQU #5C59 +.K_CUR EQU #5C5B +.CH_ADR EQU #5C5D +.SINT_ER_AD EQU #5C5F +.WORK_SP EQU #5C61 +.STK_BOT EQU #5C63 +.STK_END EQU #5C65 +.B_REG EQU #5C67 +.MEM_CALC EQU #5C68 +.FLAGS_2 EQU #5C6A +.L_SCR_SIZE EQU #5C6B +.AUTO_LST_L EQU #5C6C +.OLD_PPC EQU #5C6E +.OLD_S_PPC EQU #5C70 +.FLG_INPUT EQU #5C71 +.S_VAR_LEN EQU #5C72 +.SINT_TB_ADR EQU #5C74 +.RAND_SEED EQU #5C76 +.FRAMES EQU #5C78 +.UDG EQU #5C7B +.X_Y_COORD EQU #5C7D +.PRN_POS EQU #5C7F +.ADR_PR_BUF EQU #5C80 +.ECHO_E EQU #5C82 +.SCR_PL_M EQU #5C84 +.SCR_PL_L EQU #5C86 +.SCR_POS_M EQU #5C88 +.SCR_POS_L EQU #5C8A +.SCROLL_ST EQU #5C8C +.ATTR_P EQU #5C8D +.MASK_P EQU #5C8E +.ATTR_T EQU #5C8F +.MASK_E EQU #5C90 +.FLAGS_ATR EQU #5C91 +.MEM_BOT EQU #5C92 +.AUTO_5C9A EQU #5C9A +.NMI_ADR EQU #5CB0 +.TOP_CLEAR EQU #5CB2 +.P_RAMTOP EQU #5CB4 +.BEG_ADRESS EQU #5CB6 +.RET_INS EQU #5CC2 +.AUTO_5CC3 EQU #5CC3 +.DISK_A EQU #5CC8 +.DISK_B EQU #5CC9 +.DISK_C EQU #5CCA +.DISK_D EQU #5CCB +.CAT_SEC EQU #5CCC +.DRV_READY EQU #5CCD +.RD_WR_COM EQU #5CCE +.VAR_1 EQU #5CCF +.AUTO_5CD1 EQU #5CD1 +.AUTO_5CD2 EQU #5CD2 +.AUTO_5CD3 EQU #5CD3 +.AUTO_5CD5 EQU #5CD5 +.DOS_ERROR EQU #5CD6 +.MED_START EQU #5CD7 +.DOS_CH_ADR EQU #5CD9 +.MED_LEN EQU #5CDB +.FL_NAME EQU #5CDD +.FL_N_2 EQU #5CDF +.FL_N_4 EQU #5CE1 +.FL_N_6 EQU #5CE3 +.FL_N_7 EQU #5CE4 +.FL_TYPE EQU #5CE5 +.FL_START EQU #5CE6 +.FL_LEN EQU #5CE8 +.START_CLASTER EQU .FL_LEN +.FL_SIZE EQU #5CEA +.FL_PLACE EQU #5CEB +.VAR_2 EQU #5CED +.INTERF_I EQU #5CEF +.VAR_2_0 EQU #5CF1 +.VAR_2_1 EQU #5CF2 +.CONT_SEC EQU #5CF4 +.CONT_TRK EQU #5CF5 +.OPER_DISK EQU #5CF6 +.DOS_FLAG EQU #5CF7 +.DISK_1_FLG EQU #5CF8 +.DISK_2_FLG EQU #5CF9 +.TIME_A EQU #5CFA +.TIME_B EQU #5CFB +.TIME_C EQU #5CFC +.TIME_D EQU #5CFD +.COMAND_WG EQU #5CFE +.SEC_NUM EQU #5CFF +.CONT_BUF_ADR EQU #5D00 +.WORK_2 EQU #5D02 +.WORK_4 EQU #5D04 +.S_NAME_NUM EQU #5D06 +.N_DEL_FLS EQU #5D07 +.FST_SYM_NAME EQU #5D08 +.VAR_3 EQU #5D09 +.BUF_FLAG EQU #5D0C +.BAS_DOS_FLG EQU #5D0E +.DOS_ERR_2 EQU #5D0F +.ERR_3D00 EQU #5D10 +.ADR_DOS_COM EQU #5D11 +.ERR_SP_COPY EQU #5D13 +.MSG_FLAG EQU #5D15 +.PDOS_COPY EQU #5D16 +.FLAG_BOOT EQU #5D17 +.INT_1_VAR EQU #5D18 +.CONT_DISK EQU #5D19 +.ADR_RET EQU #5D1A +.DOS_SP EQU #5D1C +.FL_NUMBER EQU #5D1E +.COM_LN_COPY EQU #5D20 +.L_5D23 EQU #5D23 +.BUFER EQU #5D25 +.AUTO_5D33 EQU #5D33 +.CLEAR_SEC EQU #5E06 +.CLEAR_TRK EQU #5E07 +.TYPE_DISK EQU #5E08 +.N_FILES EQU #5E09 +.FREE_SEC EQU #5E0A +.CODE_10H EQU #5E0C +.DISK_MRK_1 EQU #5E0F +.DISK_ALT_NM EQU #5E10 +.N_DEL_FL EQU #5E19 +.DISK_NAME EQU #5E1A +; +.BUFER_RD EQU #5D25 ; tr-dos buffer +;-----------------------------------------------------------------------; + + + MACRO RET_SLOT0 + LD A,0 + OUT (SLOT0),A + ENDM + + MACRO RET_SLOT1 + LD A,5 + OUT (SLOT1),A + ENDM + + MACRO RET_SLOT2 + LD A,2 + OUT (SLOT2),A + ENDM +; + MACRO RET_SLOT3 + LD A, 0 + OUT (SLOT3), A + ENDM +; + + MACRO CALL_48 adr + PUSH HL + LD HL, .ADR_R + PUSH HL + LD HL,SW_ROM + PUSH HL + LD HL,adr + JP JP_HL_48 +.ADR_R: + POP HL + ENDM + + MACRO CALL_48X adr + PUSH HL + LD HL,.ADR_R + EX (SP),HL + PUSH HL + LD HL,SW_ROM + EX (SP),HL + PUSH HL + LD HL,adr + EX (SP),HL + JP SW_ROM +.ADR_R: + ENDM + + MACRO RAMD_KEY + SUB 4 + DI + LD B,SYS_PAGE + LD C,SLOT3 + OUT (C),B + LD HL,RAMD_KEYS + ADD A,L + LD L,A + DEC L + LD (A_RAMD_VARS),HL + INC L + LD L, (HL) + RET_SLOT3 + EI + LD A, L + ENDM + +; MACRO DSS adr, dt +; IF (adr >= $) +; DUP ((adr - $) / 16) +; DB dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt +; EDUP +; DUP (adr - $) +; DB dt +; EDUP +; ELSE +; ASSERT 0, "Error memory relocation." +; ENDIF +; ENDM +; + +; + MODULE Conf_port +; внутренние Altera (Sp97) +;00 - Нет порта +;#01 reserved +;#02 reserved +;#03 reserved +;#04 reserved +;#05 reserved +;#06 reserved +;#07 reserved +;#08 reserved +;#09 reserved +;#0A reserved +;#0B reserved +;#0C reserved +;#0D reserved +;#0E reserved +;#0F reserved +VG93_1F EQU #10 ; порт ВГ93 (1F) +VG93_3F EQU #11 ; порт ВГ93 (3F) +VG93_5F EQU #12 ; порт ВГ93 (5F) +VG93_7F EQU #13 ; порт ВГ93 (7F) +VG93_State EQU #14 ; порт на запись - состояние контроллера дисковода (внешний порт #FF) +JOY_VG93 EQU #15 ; порт на чтение - джойстик и IRQ/INTRQ контроллера ВГ93 + +; Порт FDD 720 ; #00BD - переключение в 720 - заслать 1. можно LD A,#01 : OUT (#BD),A. Работает c DOS ON либо в CNF_3 с DOS OFF +FDD720 EQU #16 +; Порт FDD 1.44 ; #20BD - переключение в 1.44 - заслать 1. можно LD A,#21 : OUT (#BD),A. Работает c DOS ON либо в CNF_3 с DOS OFF +FDD144 EQU #17 + +;#18 reserved +;#19 reserved +;#1A reserved + +;#1B - ISA_PORT ; #9FBD +;#1C - CMOS_DRD ; #FFBD +;#1D - CMOS_AWR ; #DFBD +;#1E - CMOS_DWR ; #BFBD +;#1F reserved +;#20 - HDD - регистр данных ; #0050 +;#21 - HDD - регистр состояния/ошибок ; #0051 +;#22 - HDD - рег. кол-ва сек-ов для R/W ; #0052 +;#23 - HDD - регистр сектора ; #0053 +;#24 - HDD - регистр дорожки-low ; #0054 +;#25 - HDD - регистр дорожки-high ; #0055 +;#26 - HDD - рег. heads/выбора mas-slave ; #4052 +;#27 - HDD - регистр команд ; #4053 +IDE_CONTROL_3F6 EQU #28 ; HDD - доп. регистр управления 3F6. внешний #4054 +IDE_STATUS_3F7 EQU #29 ; HDD - доп. регистр состояния 3F7. внешний #4055 +IDE_CHANEL_1 EQU #2A ; HDD - выбирает Secondary IDE, внешний #BC +IDE_CHANEL_2 EQU #2B ; HDD - выбирает Primary IDE, внешний #BC +VSYNC320 EQU #2C ; #40BD +VSYNC312 EQU #2D ; #60BD +RESET EQU #2E ; S_RESET - #40A4 - Reset port +UNKNOWN EQU #2F ; ????? ; #60BC - что-то на запись +;#30 - ????? ISA-SLOT 1 - ports R/W +;#31 - ????? ISA-SLOT 2 - ports R/W +ISA_Control EQU #32 ; ISA-signals such as RESET, AEN, A19...A14. Внешний #9FBD +;#33 - ????? ISA-SLOT 2 - memory R/W +;#34 reserved +;#35 reserved +;#36 reserved +;#37 reserved +;#38 reserved +;#39 reserved +;#3A reserved +;#3B reserved +;#3C reserved +;#3D reserved +;#3E reserved +;#3F reserved +ZX_Keyboard EQU #40 ; ZX-Keyboard (порт FE) +;#41 reserved +;#42 reserved +;#43 reserved +;#44 reserved +;#45 reserved +;#46 reserved +;#47 reserved +;#48 reserved +;#49 reserved +;#4A reserved +;#4B reserved +;#4C reserved +;#4D reserved +;#4E reserved +;#4F reserved +;#50 reserved +;#51 reserved +AY_FFFD_READ EQU #52 ; AY-8910-port (FFFD) чтение данных; ????? +;#53 reserved +;#54 reserved +;#55 reserved +;#56 reserved +;#57 reserved +Kempston_Mouse EQU #58 +;#59 reserved +;#5A reserved +;#5B reserved +;#5C reserved +;#5D reserved +;#5E reserved +;#5F reserved +;#60 reserved +;#61 reserved +;#62 reserved +;#63 reserved +;#64 reserved +;#65 reserved +;#66 reserved +;#67 reserved +;#68 reserved +;#69 reserved +;#6A reserved +;#6B reserved +;#6C reserved +;#6D reserved +;#6E reserved +;#6F reserved +;#70 reserved +;#71 reserved +;#72 reserved +;#73 reserved +;#74 reserved +;#75 reserved +;#76 reserved +;#77 reserved +;#78 reserved +;#79 reserved +;#7A reserved +;#7B reserved +;#7C reserved +;#7D reserved +;#7E reserved +;#7F reserved +;#80 reserved +;#81 reserved +;#82 reserved +;#83 reserved +;#84 reserved +;#85 reserved +;#86 reserved +;#87 reserved +CBL_OUT EQU #88 ; Write to COVOX/COVOX-Blaster +CBL_SYS_PORT EQU #89 ; CBL_DIR +;#8A reserved +;#8B reserved +;#8C reserved +;#8D reserved +;#8E reserved +ROM_RG EQU #8F ; !FIXIT порт переключения страниц ROM и FastRam, дублируется внешним портом #5C +AY_FFFD_WRITE EQU #90 ; AY-8910-port (FFFD) ;!!!!! запись адреса?????? +AY_BFFD EQU #91 ; AY-8910-port (BFFD) +;#92 reserved +;#93 reserved +;#94 reserved +;#95 reserved +;#96 reserved +;#97 reserved +;#98 reserved +;#99 reserved +;#9A reserved +;#9B reserved +;#9C reserved +;#9D reserved +;#9E reserved +;#9F reserved +;#A0 reserved +;#A1 reserved +;#A2 reserved +;#A3 reserved +;#A4 reserved +;#A5 reserved +;#A6 reserved +;#A7 reserved +;#A8 reserved +;#A9 reserved +;#AA reserved +;#AB reserved +;#AC reserved +;#AD reserved +;#AE reserved +;#AF reserved +;#B0 reserved +;#B1 reserved +;#B2 reserved +;#B3 reserved +;#B4 reserved +;#B5 reserved +;#B6 reserved +;#B7 reserved +;#B8 reserved +;#B9 reserved +;#BA reserved +;#BB reserved +;#BC reserved +;#BD reserved +;#BE reserved +;#BF reserved +Scorp_1FFD EQU #C0 +Pent_7FFD EQU #C1 +Border_FE EQU #C2 ; #FE, write only +ALL_MODE EQU #C3 ; Внешний - #204E +PORT_Y EQU #C4 ; #89 +RGMOD EQU #C5 ; #C9 +CNF_PORT EQU #C6 ; #3C / #7C, #24 / #74 +SCALE EQU #C7 ;PGACC - SCALE_PORT (#FC) +;#C8 - копия C0 или C2??? (not used!) +;#C9 - копия C1 (not used!) +;#CA - копия C2 (not used!) +HOLD EQU #CB ; Задаёт значения счётчиков синхронизатора синхроимпульсов. Активируется в тундере, пишется в него #95. xxxx yyyy - позиция экрана +;#CC - копия C4 (not used!) +;#CD - копия C5 (not used!) +;#CE - копия C6 (not used!) +;#CF - копия C7 (not used!) + +;#D0 - vRAM page for 512 kb (окно C000-FFFF) +;#D1 - vRAM page for 512 kb (окно C000-FFFF) +;#D2 - vRAM page for 512 kb (окно C000-FFFF) +;#D3 - vRAM page for 512 kb (окно C000-FFFF) +;#D4 - vRAM page for 512 kb (окно C000-FFFF) +;#D5 - vRAM page for 512 kb (окно C000-FFFF) +;#D6 - vRAM page for 512 kb (окно C000-FFFF) +;#D7 - vRAM page for 512 kb (окно C000-FFFF) +;#D8 - vRAM page for 512 kb (окно C000-FFFF) +;#D9 - vRAM page for 512 kb (окно C000-FFFF) +;#DA - vRAM page for 512 kb (окно C000-FFFF) +;#DB - vRAM page for 512 kb (окно C000-FFFF) +;#DC - vRAM page for 512 kb (окно C000-FFFF) +;#DD - vRAM page for 512 kb (окно C000-FFFF) +;#DE - vRAM page for 512 kb (окно C000-FFFF) +;#DF - vRAM page for 512 kb (окно C000-FFFF) + +;#E0 - vROM page EXPANSION ; Port #1FFD bit2=1 (#24 bit6=0, bit0=0) +;#E1 - vROM page TR-DOS ; PC = #3D00..#3DFF and #1FFD bit2=0 (#24 bit0=0) +;#E2 - vROM page BASIC-128 ; #7FFD bit4=0 and #1FFD bit1=0 (#24 bit0=0) +;#E3 - vROM page BASIC-48 ; #7FFD bit4=1 and #1FFD bit1=0 (#24 bit0=0) + +;#E4 - vROM page EXPANSION 2 ; Port #1FFD bit2=1 (#24 bit6=0, bit0=1) +;#E5 - vROM page TR-DOS 2 ; PC = #3D00..#3DFF and #1FFD bit2=0 (#24 bit0=1) +;#E6 - vROM page BASIC-128 2 ; #7FFD bit4=0 and #1FFD bit1=0 (#24 bit0=1) +;#E7 - vROM page BASIC-48 2 ; #7FFD bit4=1 and #1FFD bit1=0 (#24 bit0=1) + +;#E8 - vRAM page (окно 0000-3FFF) +;#E9 - vRAM page (окно 4000-7FFF) +;#EA - vRAM page (окно 8000-BFFF) + +;#EB - vROM page BIOS-1 ; Port #74 = 0 + +;#EC - vRAM page CASHE ; ????? + +;#ED reserved ; ????? + +RET_PORT EQU #EE ; Page set after Soft RESET. Любое, кроме 0, значение - страница куда передастся управление после Soft reset + +;#EF - vROM page BIOS-2 ; Port #74 = 1 + +; Установка в какой либо порт значения от F0h до FFh приведет к одному и тому же результату, что и просто установка в этот порт значения F0h. В схеме сделана +; переадресация номера порта так, что при значении FXh номер порта берется как F0h+SpectrumPAGE, где +; SpectrumPAGE - номер спектрумовской страницы, адресуемой по портам 7FFD и 1FFD. Таким образом +; достигается совместимость с Пентагоном и Скорпионом по распределению памяти и делается возможным +; установка любого номера страницы спринтеровской памяти для любой страницы Спектрума. +; +;F0h - RAM page for 128/256 kb (окно C000-FFFF) +;F1h - RAM page for 128/256 kb (окно C000-FFFF) +;F2h - RAM page for 128/256 kb (окно C000-FFFF) +;F3h - RAM page for 128/256 kb (окно C000-FFFF) +;F4h - RAM page for 128/256 kb (окно C000-FFFF) +;F5h - RAM page for 128/256 kb (окно C000-FFFF) +;F6h - RAM page for 128/256 kb (окно C000-FFFF) +;F7h - RAM page for 128/256 kb (окно C000-FFFF) +;F8h - RAM page for 256 kb (окно C000-FFFF) +;F9h - RAM page for 256 kb (окно C000-FFFF) +;FAh - RAM page for 256 kb (окно C000-FFFF) +;FBh - RAM page for 256 kb (окно C000-FFFF) +;FCh - RAM page for 256 kb (окно C000-FFFF) +;FDh - RAM page for 256 kb (окно C000-FFFF) +;FEh - RAM page for 256 kb (окно C000-FFFF) +;FFh - RAM page for 256 kb (окно C000-FFFF) + + ENDMODULE +; +; С распределением памяти ситуация такая. Порты страниц - переключают адреса +; "виртуальных" страниц скорпиона независимо от того, что в этот момент +; подключено в нулевую банку. С третьей банкой наоборот - запись в порт +; страницы меняет адрес той страницы, какая установлена портами 7FFD,1FFD, +; т.е. записав что-то в порт PAGE3 нужно помнить, какая страница стояла с +; адреса #C000. Например, если нулевая, то поменяется страница и в адресе +; #0000, если там было установлено ОЗУ. +; +/* +внутренние порты Z84C15: +#10 +#11 +#12 +#13 +#14 +#15 +#16 +#17 +#18 +#19 +#1A +#1B +#1C +#1D +#1E +#1F +#EE +#EF +#F0 +#F1 +#F4 +*/ +;======================================= + +;===============[ CMOS ]================ ; !TODO + +;REGISTER #0E +; %10000000 - MEMORY TEST +; %01000000 - SAVE RAM DISKS +; %00100000 - UPDATE BIOS +; %00011000 - START DELAY +; %00000100 - LANGUAGE +; %00000010 - NOT USED ;!TODO +; %00000001 - QUICK START + +;REGISTER #0F +; %10000000 - TYPEMATIC ON/OFF +; %01100000 - TYPEMATIC DELAY 00-250, 01-500, 10-750, 11-1000 +; %00011111 - TYPEMATIC RATE 0-6, 1-8, 2-10, 3-12, 4-15, 5-20, 6-24, 7-30 + +;REGISTER #10 +; %00000111 - SYSTEM DISK +; 1st FDD +; 2nd FDD +; 1st IDE +; 2nd IDE +; 3rd IDE +; 4th IDE +; Ram Dsk +; Recovery +; %01110000 - ALT SYSTEM DISK + +;REGISTER #11 +; %00000011 - FDD FIRST 720 / 1.44 / NONE +; %00001100 - FDD SECOND +; %00110000 - IDE Primary MASTER AUTO / SETUP / DISABLED +; %11000000 - IDE Primary SLAVE -----//------ + +;------------[HDD PRIMARY]------------- +;REGISTER #12 - CYLINDERS (MASTER) L +;REGISTER #13 - -----//------ H +;REGISTER #14 - HEADS (MASTER) +;REGISTER #15 - SECTORS (MASTER) +; +;REGISTER #16 - CYLINDERS (SLAVE) L +;REGISTER #17 - -----//------ H +;REGISTER #18 - HEADS (SLAVE) +;REGISTER #19 - SECTORS (SLAVE) +;--------------------------------------- +;REGISTER #1A +; %00001111 - COLOR STYLE +; %00110000 - Frame Int (Default/Pentagon/Scorpion/Original) +; %11000000 - Screen V-Sinc (Default/312 lines 50 HZ/320 Lines 49 Hz) + +;!FIXIT НЕ ИСПОЛЬЗУЕТСЯ +;REGISTER #1B - HARDWARE CONFIGURATION +; %00000001 - TURBO MODE (D0..D3 - 6 OR 7) +; %00000010 - TURBO EXCHANGE ON/OFF - 1 +; %00000100 - PORT EXCHANGE ON/OFF - 1 +; %00011000 - COMPUTER: +; 0-SPRINTER +; 1-SPECTRUM 256 +; 2-PENTAGON 128 +; 3-OTHER +; %11100000 - RESERVED ;!TODO +;!FIXIT НЕ ИСПОЛЬЗУЕТСЯ +;REGISTER #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 + +;REGISTER #1D +; %00000010 - Reboot message +; %00000001 - HDD Write protect + +;REGISTER #1E +; %00000011 - TR DOS A: Default / FDD / HDD / RMD +; %00001100 - TR DOS B: Default / FDD / HDD / RMD +; %00110000 - TR DOS C: Default / FDD / HDD / RMD +; %11000000 - TR DOS D: Default / FDD / HDD / RMD + +;REGISTER #1F ;R06 +; %11110000 - X-Screen position +; %00001111 - Y-Screen position + +;REGISTER #20 +; %00110000 - IDE Secondary MASTER AUTO / SETUP / DISABLED +; %11000000 - IDE Secondary SLAVE -----//------ +; . +; . +;REGISTER#35 - BASIC SETTING 1 (SYS_PAGE.CONFIG_DE+1 = #C13B on PAGE #FE) +; 0 - RESET TO BASIC 128 +; 1 - RESET TO BASIC 48 (RAM128) +; 2 - RESET TO TRDOS +; 3 - RESET TO EXPANSION (DON'T USE) +; 4 - RESET TO 48 TRDOS +; 5 - RESET TO 48 BASIC (RAM48) + +;REGISTER#36 - BASIC SETTING 2 ; старые значения неизвестны +; %0000 0111 +; новые значения: +; 0 - ZX-Sprinter +; 1 - Pentagon 48 +; 2 - Pentagon 128 +; 3 - Pentagon 512 +; 4 - Scorpion 256 +; 5 - ZX Spectrum 48 +; 6 - ZX Spectrum 128 + + +;-----------[HDD SECONDARY]------------ +;REGISTER #37 - CYLINDERS (MASTER) +;REGISTER #38 - -----//------ +;REGISTER #39 - HEADS (MASTER) +;REGISTER #3A - SECTORS (MASTER) +; +;REGISTER #3B - CYLINDERS (SLAVE) +;REGISTER #3С - -----//------ +;REGISTER #3D - HEADS (SLAVE) +;REGISTER #3E - SECTORS (SLAVE) +;--------------------------------------- + +;REGISTER #3F - CHECKSUM SETTING +;======================================= + +; +;-------------------------------[ TEST ]-------------------------------- + MODULE IDE +; +; 0 - копия DRV_HEAD +; 1 - секторов на дорожке +; 2 - число головок +; 3 - количество цилиндров мл. +; 4 - количество цилиндров старший. +; 5 - секторов на цилиндр мл. +; 6 - секторов на цилиндр старш. +; 7 - reserv - type + STRUCT HDD_INIT_TABLE +Chanel BYTE ; 0 DRVHD_H +SectorsPerTrack BYTE ; 1 SC_PT_H +HeadsNumber BYTE ; 2 HEADS_H +CylinderNumberLow BYTE ; 3 CYL_L_H +CylinderNumberHigh BYTE ; 4 CYL_H_H +SectorsPerCylinderLow BYTE ; 5 SPCLL_H +SectorsPerCylinderHigh BYTE ; 6 SPCLH_H +DriveType BYTE ; 7 DTYPE_H + ENDS +; + +INIT_TBL_IDE0 HDD_INIT_TABLE = SYS_PAGE.IDE_0 ; !HARDCODE table in SYS_PAGE +INIT_TBL_IDE1 HDD_INIT_TABLE = SYS_PAGE.IDE_1 ; !HARDCODE table in SYS_PAGE +INIT_TBL_IDE2 HDD_INIT_TABLE = SYS_PAGE.IDE_2 ; !HARDCODE table in SYS_PAGE +INIT_TBL_IDE3 HDD_INIT_TABLE = SYS_PAGE.IDE_3 ; !HARDCODE table in SYS_PAGE + +Write: +.DriveCtrl EQU #4152 ; HDW_DRV P_HD_CS ; #1F6 Drive Control +.Command EQU #4153 ; HDW_COM P_CMD ; #1F7 Command +.Data EQU #0150 ; HDW_DAT W170 ; #1F0 Data +.Error EQU #0151 ; HDW_ERR W171 ; #1F1 Error +.Counter EQU #0152 ; HDW_CNT P_S_CNT W172 ; #1F2 Counter +.Sector EQU #0153 ; HDW_SEC P_S_NUM W173 ; #1F3 Sector +.CylinderLow EQU #0154 ; HDW_CLL P_C_LOW W174 ; #1F4 Cylinder Low +.CylinderHigh EQU #0155 ; HDW_CLH P_C_HIG W175 ; #1F5 Cylinder High + +Read: +.Control EQU #4052 ; HDR_DRV R176 ; #1F6 Drive Control +.Status EQU #4053 ; HDR_CTL P_HDST R177 ; #1F7 Status (Control) +.Data EQU #0050 ; HDR_DAT P_DATS R170 ; #1F0 Data +.Error EQU #0051 ; HDR_ERR P_ERR R171 ; #1F1 Error +.Counter EQU #0052 ; HDR_CNT R172 ; #1F2 Counter +.Sector EQU #0053 ; HDR_SEC R173 ; #1F3 Sector +.CylinderLow EQU #0054 ; HDR_CLL R174 ; #1F4 Cylinder Low +.CylinderHigh EQU #0055 ; HDR_CLH R175 ; #1F5 Cylinder High + +ControlBit: ; Bits for HardDrive.Read.Status +.Busy EQU 7 ; BSY +.Ready EQU 6 ; RDY +.Fault EQU 5 +.StreamErrror EQU .Fault +.DeferredWriteError EQU 4 +.DataRequest EQU 3 ; DRQ +.AlignmentError EQU 2 +.SenseDataAvailable EQU 1 +.Error EQU 0 ; ERR +.CheckCondition EQU .Error + +Chanel: +.Set_0: EQU #00BC ; для использования с полной адресацией (рег BC), заслать '1' +.Set_1: EQU #20BC ; для использования с полной адресацией (рег BC), заслать '1' +.Choose: EQU #BC ; для использования с неполной адресацией out (#bc),a. заслать '1' +Device: +.HDD EQU 1 +.CDROM EQU 2 + + ENDMODULE +;----------------------------------------------------------------------- + +; +/* +KBD_COM EQU #1B +KBD_DAT EQU #1A +COM_B EQU #1B +DAT_B EQU #1A + +COM_A EQU #19 +DAT_A EQU #18 + +LPT1_D EQU #1C +LPT1_C EQU #1D +LPT2_D EQU #1E +LPT2_C EQU #1F + +STC0_C EQU #10 +STC1_C EQU #11 +STC2_C EQU #12 +STC3_C EQU #13 +*/ +; !TODO придумать как обозвать, чтоб было понятно когда пишут для мышки, когда для клавы и т.д. + MODULE Z84 +;-------------------[Ports] +CTC: +.Ch_0 EQU #10 ; Control Register +.Ch_1 EQU #11 ; Control Register +.Ch_2 EQU #12 ; Control Register +.Ch_3 EQU #13 ; Control Register + +SIO: +.Ch_A.Data EQU #18 ; Data register COM +.Ch_A.Ctrl EQU #19 ; Control register COM +.Ch_B.Data EQU #1A ; Data register keyboard & mouse +.Ch_B.Ctrl EQU #1B ; Control register keyboard & mouse + + +PIO: +.Port_A.Data EQU #1C ; Data register LPT 1 +.Port_A.Command EQU #1D ; Command register LPT 1 +.Port_B.Data EQU #1E ; Data register LPT 2 +.Port_B.Command EQU #1F ; Command register LPT 2 + +WDT: ; Watch-Dog timer +.Master_Reg EQU #F0 ; Master register WDTMR +.Control_Reg EQU #F1 ; Control register WDTCR + +IntPrior_Reg EQU #F4 ; Interrupt Priority Register + +SYS: +.Control EQU #EE ; System Control Register Pointer SCRP +.Data EQU #EF ; System Control Data Port SCDP +;------------------------[] + +;-------------------[Regs ] +REG: +.WaitState_Ctrl EQU 00 ; Wait state control register WCR +.WaitState_MemBound EQU 01 ; Memory Wait state Boundary Register MWBR +.CS_Boundary EQU 02 ; Chip Select Boundary Register CSBR +.Misc_Ctrl EQU 03 ; Misc.Control Register MCR +;------------------------[] + ENDMODULE +; + +;INIT_TIMER: +; LD A,#D5 ; 7-й бит разрешение прерывания +; OUT (#12),A +; LD A,20 +; OUT (C),A +; LD A,#55 ; 7-й бит разрешение прерывания +; OUT (#13),A +; LD A,0 +; OUT (C),A +; LD A,0 ; вектор прерывания +; OUT (#10),A + +; LD A,TABLE/256 +; LD I,A +; IM 2 + +;Disable: +; DI +; LD BC,#12 ; 2-nd timer +; LD A,#55 ; 7-й бит разрешение прерывания +; OUT (C),A +; IM 1 +; EI +; RET + + +; TRDOS +; REDIR_3D13: +; BIT 7,C +; JP NZ,EXP_FNS ;#3FF8 EXP +; BIT 6,C +; JP Z,AUTO_283C +; RES 6,C +; JP HD_CMD ;#3FF0 ROM. DI + +;_______________________________________________________________________________________________# +; +; DW #FEFF ; Sprinter-2000 +; +; DW 0FFFEH ; Sprinter-1 +; DB 0 ; акселератор +; DB 1 ; экран +; DB 2 ; клавиатура +; DB 1 ; ковокс; +; +; DW 0FFFDH +; DB 2 ; акселератор +; DB 1 ; экран +; DB 0 ; клавиатура +; DB 1 ; ковокс; +; +; DW 0FFFCH ; AY +; DB 0 ; аccselerator +; DB 0 ; Screen +; DB 2 ; клавиатура +; DB 0 ; ковокс; +; +; DW 0FFF9H ; идентификатор конфигурации DooM +; DB 3 ; accelerator type +; DB 1 ; экран +; DB 0 ; клавиатура +; DB 2 ; ковокс (бластер) +; + +;ELCOM256 EQU 1 ; режим ELCOM-256 +;IF ELCOM256 EQ 1 +;ELSE +;D_TBON EQU 03h ; данные для включения TURBO +;D_TBOFF EQU 02h ; данные для включения TURBO +;D_ROM16ON EQU 40h +;D_ROM16OFF EQU 00h +;CNF_0 EQU 04h +;CNF_1 EQU 0Ch +;CNF_2 EQU 14h +;CNF_3 EQU 1Ch +;ENDIF + +;TTTT_EEEE EQU 100 + + +;R170 EQU #0050 ;Data +;R171 EQU #0051 ;Error +;R172 EQU #0052 ;Direct +;R173 EQU #0053 ;Reserve +;R174 EQU #0054 ;Lenght block low +;R175 EQU #0055 ;Lenght block high +;R176 EQU #4052 ;Drive device +;R177 EQU #4053 ;Status +;W170 EQU #0150 ;Data +;W171 EQU #0151 ;???? +;W172 EQU #0152 ;???? +;W173 EQU #0153 ;Reserve +;W174 EQU #0154 ;Lenght block low +;W175 EQU #0155 ;Lenght block high +;W176 EQU #4152 ;Drive device +;W177 EQU #4153 ;Command +;HDW_COM EQU #4153 ; #1F7 Command +;P_CMD EQU #4153 ; WRITE +;HDW_DRV EQU #4152 ; #1F6 Drive Control +;P_HD_CS EQU #4152 +;HDW_CLH EQU #0155 ; #1F5 Cylinder High +;P_C_HIG EQU #0155 +;HDW_CLL EQU #0154 ; #1F4 Cylinder Low +;P_C_LOW EQU #154 +;HDW_SEC EQU #0153 ; #1F3 Sector +;P_S_NUM EQU #0153 +;HDW_CNT EQU #0152 ; #1F2 Counter +;P_S_CNT EQU #152 +;HDW_ERR EQU #0151 ; #1F1 Error +;HDW_DAT EQU #0150 ; #1F0 Data +;HDR_CTL EQU #4053 ; #1F7 Status (Control) +;P_HDST EQU #4053 ; READ +;HDR_DRV EQU #4052 ; #1F6 Drive Control +;HDR_CLH EQU #0055 ; #1F5 Cylinder High +;HDR_CLL EQU #0054 ; #1F4 Cylinder Low +;HDR_SEC EQU #0053 ; #1F3 Sector +;HDR_CNT EQU #0052 ; #1F2 Counter +;HDR_ERR EQU #0051 ; #1F1 Error +;P_ERR EQU #051 ; READ +;HDR_DAT EQU #0050 ; #1F0 Data +;P_DATS EQU #50 ; READ/WRITE INIR/OTIR + +;;Bits for HDR_CTL +;;---[] +;BSY EQU 7 +;RDY EQU 6 +;DRQ EQU 3 +;ERR EQU 0 +;;---[] +;HDD EQU 1 +;CDROM EQU 2 +;;EQU FOR IY+ +;DRVHD_H EQU 0 +;SC_PT_H EQU 1 +;HEADS_H EQU 2 +;CYL_L_H EQU 3 +;CYL_H_H EQU 4 +;SPCLL_H EQU 5 +;SPCLH_H EQU 6 +;DTYPE_H EQU 7 + +;IDE0 EQU #C1C0 +;IDE1 EQU #C1C8 +;IDE2 EQU #C1D0 +;IDE3 EQU #C1D8 + +;HDD_INI_TABLE EQU #C1C0 + + +; D_TBON EQU 3 ; данные для включения TURBO +; D_TBOFF EQU 2 ; данные для выключения TURBO + +; CNF_0 EQU #04 ; карта портов 0 +; CNF_1 EQU #0C ; карта портов 1 +; CNF_2 EQU #14 ; карта портов 2 +; CNF_3 EQU #1C ; карта портов 3 +; CNF_512 EQU #80 ; включение Pentagon 128 + + +; страницы с конфой для Sp97, для совместимости с древними прогами +; PG_SP1 equ #EC +; PG_SP2 equ #EE +; PG_AY equ #EA + +;================================================================================= +; Поpты Sprinter. (байты PORT_X)<< +; 0 - port FF<< +; 1 - port keyboard<< +; 2 - port BORDER<< +; 3 - port 1FFDh<< +; 4 - port 7FFDh<< +; 5 - port 3FFDh<< +; 6 - port Start-ROM<< +; 7 - port Start-ROM-ALT<< +; 8 - port ROM-BASIC48<< +; 9 - port ROM-BASIC128<< +; 10 - port ROM-TR-DOS<< +; 11 - port ROM-EXPANSION<< +; 12 - port ROM-BASIC48-ALT<< +; 13 - port ROM-BASIC128-ALT<< +; 14 - port ROM-TR-DOS-ALT<< +; 15 - port ROM-EXPANSION-ALT<< +; 16 ??<< +; .. ??<< +; 31 ???ports RAM-PAGES - поpты указывающие, какая стpаница ОЗУ<< +; подключена в качестве стpаницы 0..F в конфигуpации Scorpion.<< +; 33 - port RAM-0 стpаница ОЗУ подключаемая в нулевое окно пpоцессоpа<< +; 34 - port RAM-5 стpаница ОЗУ подключаемая в пеpвое окно пpоцессоpа<< +; 35 - port RAM-2 стpаница ОЗУ подключаемая во втоpое окно пpоцессоpа<< +; 36 - port CONFIG<< +; 37 - port COVOX-1<< +; 38 - port COVOX-2<< +; 39 - port AY-3-8910-adr<< +; 40 - port AY-3-8910-dat<< +; 41 - port KEMPSTON<< +; 42 - port ISA-interface<< +; 43 ??reserv<< +; .. ??<< +; 47 ??<< +; 48 - 51 поpты ВГ93<< +; 52 - поpт DOS-1<< +; 53 - поpт DOS-2<< +; 54 ?? служебные поpты<< +; .. ??<< +; 63 ??<< +; 64 ?? поpты IDE interface<< +; .. ??<< +; 79 ??<< +; 80..127 - pезеpв.<< +; 128..143 - поpты идентификатоpа машины ( только для чтения.)<< +; 144..254 - pезеpв<< +; 255 - нуль-поpт - отключенное состояние.<< +;================================================================================= \ No newline at end of file diff --git a/constants/dss_equ.inc b/constants/dss_equ.inc new file mode 100644 index 0000000..01f6210 --- /dev/null +++ b/constants/dss_equ.inc @@ -0,0 +1,397 @@ +;[Вызов функций DSS]-------------------- +ToDSS EQU #10 +;--------------------------------------- + +;---[Буфер под служебную строку DSS]---- +; Command_Line_parameters (CLP) +; Смещения относительно значения в IX +; при старте EXE из DSS. +CLP_Buffer EQU 131 ; Полная длина буфера +CLP_FM EQU -3 ; Файловый манипулятор, если exe-файл с первичным загрузчиком +CLP_MemBlockID EQU -2 ; Идентификатор блока памяти +CLP_ProgLevel EQU -1 ; Уровень текущей программы +CLP_CLLength EQU 0 ; Длинна командной строки +CLP_Parameters EQU 1 ; Параметры командной строки, заканчивается нулем (127 bytes) +; (CLP_CLLength) + 3 ; начало полного пути до запускаемого приложения (вместе с именем EXE) +;--------------------------------------- + +;------------[DSS Functions]------------ +Dss: +.Version EQU #00 +.ChDisk EQU #01 +.CurDisk EQU #02 +.DskInfo EQU #03 +.G_ENTRY EQU #04 +; EQU #05 +; EQU #06 +; EQU #07 +; вход: нет +; выход: A - номер последнего лог. диска в системе +.RescanDrives EQU #08 + +.BootDSK EQU #09 +; +; File i/o +.Create EQU #0A +.Creat_N EQU #0B +; EQU #0C +.ERASE EQU #0D +.Delete EQU #0E +.Move EQU #0F +.Rename EQU #10 +.Open EQU #11 +.Open.RW EQU 0 +.Open.R EQU 1 +.Open.W EQU 2 +.Close EQU #12 +.Read EQU #13 ; по возврату прерывания всегда включены +.Write EQU #14 +.Move_FP EQU #15 +.Move_FP.FrStart EQU 0 +.Move_FP.FrCurrent EQU 1 +.Move_FP.FrEnd EQU 2 + +.Attrib EQU #16 +.Get_D_T EQU #17 +.Put_D_T EQU #18 +.F_First EQU #19 +.F_Next EQU #1A +.MkDir EQU #1B +.RmDir EQU #1C +.ChDir EQU #1D +.CurDir EQU #1E +; EQU #1F +; EQU #20 +.SysTime EQU #21 +.SetTime EQU #22 +; EQU #23 +; EQU #24 +; EQU #25 +; EQU #26 +; EQU #27 +; EQU #28 +; EQU #29 +; EQU #2A +; EQU #2B +; EQU #2C +; EQU #2D +; EQU #2E +; EQU #2F +; +; Keyboard +.WaitKey EQU #30 +.ScanKey EQU #31 +.EchoKey EQU #32 +.CTRLKey EQU #33 +.EDIT EQU #34 +.K_CLEAR EQU #35 +.K_SETUP EQU #36 +.TestKey EQU #37 +; +; Memory +.SetWin EQU #38 +.SetWin1 EQU #39 +.SetWin2 EQU #3A +.SetWin3 EQU #3B +.INFOMEM EQU #3C +.GetMem EQU #3D +.FreeMem EQU #3E +.SetMem EQU #3F +; +; Execution +.Exec EQU #40 +.Exit EQU #41 +.Wait EQU #42 + +.GSwitch EQU #43 +.DosName EQU #44 + +.EX_Path EQU #45 +.EX_Path.GET_ALL EQU 0 ; Разобрать строку +.EX_Path.GET_DRIVE EQU 1 ; Выделить имя диска +.EX_Path.GET_PATH EQU 2 ; Выделить директорию +.EX_Path.GET_NAME EQU 3 ; Выделить имя файла +.EX_Path.GET_TYPE EQU 4 ; Выделить расширение файла +.EX_Path.GET_ALL_EX EQU 5 ; Выделить имя диска, путь к файлу, имя файла и расширение файла +.EX_Path.RESR EQU 6 ; Зарезервировано +.EX_Path.GSWITCH EQU 7 ; Выделить параметр командной строки +.EX_Path.GETNAME EQU 8 ; Преобразовать из 11 символьного формата в формат ДОС +.EX_Path.MASK EQU 9 ; Преобразовать из формата ДОС в 11 символьный формат + +.Environ EQU #46 +.AppInfo EQU #47 +; EQU #48 +; EQU #49 +; EQU #4A +; EQU #4B +; EQU #4C +; EQU #4D +; EQU #4E +; EQU #4F +; +; Video +.SetVMod EQU #50 +.SetVMod.txt40x32 EQU 2 +.SetVMod.txt80x32 EQU 3 +.SetVMod.grf320x256 EQU #81 +.SetVMod.grf6400x256 EQU #82 +.GetVMod EQU #51 +.Locate EQU #52 +.Cursor EQU #53 +.SelPage EQU #54 +.Scroll EQU #55 +.Clear EQU #56 +.RdChar EQU #57 +.WrChar EQU #58 +.WinCopy EQU #59 +.WinRest EQU #5A +.PutChar EQU #5B +.PChars EQU #5C +; +; Printer +.RES_PRN EQU #5D +.CTRLPRN EQU #5E +.Print EQU #5F +;--------------------------------------- +; + +; +;------------[Video modes]-------------- +DssVmod: +.txt40 EQU #02 ; (02) - текстовый 40x32x16 цветов +.txt80 EQU #03 ; (03) - текстовый 80x32x16 цветов +.gfx320 EQU #81 ; (129) - графический 320x256x256 цветов +.gfx640 EQU #82 ; (130) - графический 640x256x16 цветов +;--------------------------------------- +; + + +; +;------------[Error codes]-------------- + MODULE DSS_Error +sys: +.NO_ERROR EQU #00 ; 00 - нет ошибок +.INVALID_FUNCTION EQU #01 ; 01 - неверный номер функции +.INVALID_DRIVE EQU #02 ; 02 - неправильный номер устройства +.FILE_NOT_FOUND EQU #03 ; 03 - файл не обнаружен +.PATH_NOT_FOUND EQU #04 ; 04 - неверный путь +.INVALID_HANDLE EQU #05 ; 05 - несуществующий файловый манипулятор +.NO_HANDLES EQU #06 ; 06 - нет свободного файлового манипулятора +.FILE_EXISTS EQU #07 ; 07 - файл существует +.READONLY EQU #08 ; 08 - файл только для чтения +.ROOT_OVERFLOW EQU #09 ; 09 - переполнение ROOT (корневого каталога) +.DISK_FULL EQU #0A ; 10 - нет свободного места на диске +.DIR_NOT_EMPTY EQU #0B ; 11 - каталог не пуст +.CURRENT_DIR EQU #0C ; 12 - попытка удалить текущий каталог +.UNKNOWN_FORMAT EQU #0D ; 13 - неизвестный формат +.INVALID_ACCESS EQU #0E ; 14 - невозможная операция +.DIR_EXISTS EQU #0F ; 15 - каталог уже есть +.INVALID_NAME EQU #10 ; 16 - неверное имя +.INVALID_EXE EQU #11 ; 17 - неправильный EXE-файл +.UNKNOWN_EXE EQU #12 ; 18 - не поддерживаемая версия EXE-файла +.ACCESS_DENIED EQU #13 ; 19 - ресурс не доступен +.NOT_READY EQU #14 ; 20 - нет готовности +.SEEK_ERROR EQU #15 ; 21 - ошибка позиционирования +.SECTOR_NOT_FOUND EQU #16 ; 22 - сектор не найден +.CRC_ERROR EQU #17 ; 23 - ошибка CRC +.WRITE_PROTECT EQU #18 ; 24 - защита записи +.READ_ERROR EQU #19 ; 25 - ошибка чтения +.WRITE_ERROR EQU #1A ; 26 - ошибка записи +;.GENERAL_FAILURE EQU #1B ; 27 - общая ошибка +.DRIVE_FAILURE EQU #1B ; 27 - сбой диска +;.RESERVED_28 EQU #1C ; 28 - зарезервирован +;.RESERVED_29 EQU #1D ; 29 - зарезервирован +.NOT_ENOUGH_MEMORY EQU #1E ; 30 - недостаточно памяти +.INVALID_MEMORY_HND EQU #1F ; 31 - несуществующий блок памяти +;.RESERVED_32 EQU #20 ; 32 - зарезервировано +.ENV_ITEM_OVERFLOW EQU #21 ; 33 - превышен максимальный размер переменной +;.RESERVED_34 EQU #22 ; 34 - зарезервировано +.TOO_MANY_FILES_IN_DIR EQU #23 ; 35 - слишком много файлов в директории +.TOO_DEEP_DIR_DEPTH EQU #24 ; 36 - слишком большая вложенность каталогов или количество папок > 1023 +.USER_ABORT EQU #25 ; 37 - операция прервана пользователем +.COMMON_ERROR EQU #26 ; 38 - общая ошибка +;.RESERVED_39 EQU #27 ; 39 - зарезервировано +;.RESERVED_40 EQU #28 ; 40 - зарезервировано +;.RESERVED_41 EQU #29 ; 41 - зарезервировано +;.RESERVED_42 EQU #2A ; 42 - зарезервировано +;.RESERVED_43 EQU #2B ; 43 - зарезервировано +;.RESERVED_44 EQU #2C ; 44 - зарезервировано +;.RESERVED_45 EQU #2D ; 45 - зарезервировано +;.RESERVED_46 EQU #2E ; 46 - зарезервировано +;.RESERVED_47 EQU #2F ; 47 - зарезервировано +.INVALID_VIDEO_MODE EQU #30 ; 48 - неправильный видеорежим +; +drv: +.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 +; +mouse: +.NO_ERROR EQU #00 ; 0 - NO ERROR +.INVALID_COMMAND EQU #01 ; 1 - COMMAND NOT PRESENT +.DEVICE_ABSENT EQU #02 ; 2 - DEVICE ABSENT +.CURSOR_ON EQU #03 ; 3 - CURSOR ON (already) +.CURSOR_OFF EQU #04 ; 4 - CURSOR OFF (already) +.CURSOR_TOO_BIG EQU #05 ; 5 - CURSOR IMAGE VERY BIG + ENDMODULE +/* +; DB #00 +; DB "Bad command or file name",0 +01: DB "Invalid function",0 +02: DB "Invalid drive number",0 +03: DB "File not found",0 +04: DB "Path not found",0 ; неверный путь +05: DB "Invalid handle",0 +06: DB "Extended error 6",0 ; нет свободного файлового манипулятора +07: DB "File exist",0 +08: DB "File read only",0 +09: DB "Root overflow",0 +10: DB "No free space",0 +11: DB "Directory not empty",0 +12: DB "Can't delete current directory",0 +13: DB "Invalid media",0 +14: DB "Unknown operation",0 ; невозможная операция +15: DB "Directory exist",0 +16: DB "Invalid filename",0 +17: DB "Invalid EXE-file",0 +18: DB "Not supported EXE-file",0 +19: DB "Access denied",0 +20: DB "Not ready",0 +21: DB "Seek error",0 +22: DB "Sector not found",0 +23: DB "CRC error",0 +24: DB "Write protect",0 +25: DB "Read error",0 +26: DB "Write error",0 +27: DB "Drive failure",0 ; общая ошибка +28: DB "Extended error 28",0 +29: DB "Extended error 29",0 +30: DB "No free memory",0 +31: DB "Invalid memory block",0 +32: DB "Extended error 32",0 +33: DB "Extended error 33",0 +34: DB "Extended error 34",0 +; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +*/ +;--------------------------------------- +; + +; +;---------------[Files]----------------- +FileMode: +.RW EQU 00 +.Read EQU 01 +.Write EQU 02 +; +FileAttrib: +.Normal EQU 00 ; Normal file, no attributes +.RDOnly EQU 01 ; Read only attribute +.Hidden EQU 02 ; Hidden file +.System EQU 04 ; System file +.Label EQU 08 ; Volume label +.Direc EQU #10 ; Directory +.Arch EQU #20 ; Archive +;--------------------------------------- +; + +; +;---------[control characters]---------- +_cc: +.cr EQU #0D ;возврат коретки +.lf EQU #0A ;новая строка +.tab EQU 9 ;символ табуляции +.space EQU #20 ;символ пробела +;--------------------------------------- +; + + +; Приложение Б. Таблица позиционных кодов + +; key ASCII/SCAN key ASCII/SCAN +; ` 000h 000h V 056h 02Dh +; Esc 01Bh 001h B 042h 02Eh +; 1 031h 002h N 04Eh 02Fh +; 2 032h 003h M 04Dh 030h +; 3 033h 004h , 02Ch 031h +; 4 034h 005h . 02Eh 032h +; 5 035h 006h / 02Fh 033h +; 6 036h 007h RShift ---- 034h +; 7 037h 008h \ 05Ch 035h +; 8 038h 009h LCtrl ---- 036h +; 9 039h 00Ah LAlt ---- 037h +; 0 030h 00Bh Space 020h 038h +; - 02Dh 00Ch RAlt ---- 039h +; = 03Dh 00Dh RCtrl ---- 03Ah +; BackSpace 008h 00Eh F1 000h 03Bh +; Tab 009h 00Fh F2 000h 03Ch +; Q 051h 010h F3 000h 03Dh +; W 057h 011h F4 000h 03Eh +; E 045h 012h F5 000h 03Fh +; R 052h 013h F6 000h 040h +; T 054h 014h F7 000h 041h +; Y 059h 015h F8 000h 042h +; U 055h 016h F9 000h 043h +; I 049h 017h F10 000h 044h +; O 04Fh 018h F11 000h 045h +; P 050h 019h F12 000h 046h +; [ 05Bh 01Ah PrScrn ---- 047h +; ] 05Dh 01Bh ScrlLock 000h 048h +; CapsLock 000h 01Ch NumLock 000h 049h +; A 041h 01Dh / 02Fh 04Ah +; S 053h 01Eh * 02Ah 04Bh +; D 044h 01Fh - 02Dh 04Ch +; F 046h 020h + 02Bh 04Dh +; G 047h 021h enter 00Dh 04Eh +; H 048h 022h Del . 000h 04Fh +; J 04Ah 023h Ins 0 000h 050h +; K 04Bh 024h End 1 000h 051h +; L 04Ch 025h Down 2 000h 052h +; ; 03Bh 026h PgDw 3 000h 053h +; ' 027h 027h Left 4 000h 054h +; Enter 00Dh 028h 5 000h 055h +; LShift ---- 029h Right 6 000h 056h +; Z 05Ah 02Ah Home 7 000h 057h +; X 058h 02Bh Up 8 000h 058h +; C 043h 02Ch PgUp 9 000h 059h + + +; Приложение В. Байт атрибутов текстового экрана + +; бит 7 - Признак мерцания символа +; биты 6,5,4 - Цвет фона символа 8 цветов (0...7) RGB +; биты 3,2,1,0 - Цвет символа 16 цветов (0...15) IRGB + + +; Цвета для фона и для символа: + +; 0 0h 0000b - Чёрный +; 1 1h 0001b - Синий +; 2 2h 0010b - Зелёный +; 3 3h 0011b - Голубой (циан) +; 4 4h 0100b - Красный +; 5 5h 0101b - Фиолетовый +; 6 6h 0110b - Коричневый +; 7 7h 0111b - Белый + +; Только для символа: + +; 8 8h 1000b - Серый +; 9 9h 1001b - Ярко-синий +; 10 Ah 1010b - Ярко-зелёный +; 11 Bh 1011b - Ярко-голубой +; 12 Ch 1100b - Ярко-красный +; 13 Dh 1101b - Ярко-фиолетовый +; 14 Eh 1110b - Жёлтый +; 15 Fh 1111b - Ярко-белый +; \ No newline at end of file diff --git a/macroses/accelerator.z80 b/macroses/accelerator.z80 new file mode 100644 index 0000000..3703916 --- /dev/null +++ b/macroses/accelerator.z80 @@ -0,0 +1,85 @@ +; Макросы акселератора для красоты)) + +;--------[выключить акселератор]-------- + MACRO ACC_Off + LD B,B + ENDM +;--------------------------------------- + +;---------[режим приема байта]---------- +; Включает акселератор в режим приема +; байта размера блока далее следует +; команда типа LD A,dat, где dat и будет +; новым размером блока. Если размер +; блока был установлен ранее, его можно +; не устанавливать. + MACRO ACC_SetBlockSize + LD D,D + ENDM +;--------------------------------------- + +;-------[заполнение одним байтом]------- +; Операция Fill. Последующая команда +; типа LD (HL),A приведет к заполнению +; указанного ранее количества байт +; значением A + MACRO ACC_FillOneByte + LD C,C + ENDM +;--------------------------------------- + +;----[заполнение вертикальных линий]---- +; Операция Fill для графического экрана. +; Последующая команда типа LD (HL),A +; приведет к заполнению значением A +; вертикальных линий экрана указанным +; ранее количеством байт + MACRO ACC_FillScreenOneByte + LD E,E + ENDM +;--------------------------------------- + +;----------[копирование блока]---------- +; Последующая команда типа LD A,(HL) +; приведет к заполнению ОЗУ акселератора +; данными из адреса (HL), а команда типа +; LD (DE),A приведет к перезаписи данных +; из ОЗУ акселератора в основное или +; видео-ОЗУ. + MACRO ACC_CopyBlock + LD L,L + ENDM +;--------------------------------------- + +;---[копирование графического блока]---- +; Копирование блока для граф. экрана. +; Последующая команда типа LD A,(HL) +; приведет к заполнению ОЗУ акселератора +; данными из адреса (HL), а команда типа +; LD (DE),A приведет к перезаписи данных +; из ОЗУ акселератора в видео-ОЗУ +; вертикальными линиями. В этом режиме +; аксель при чтении в буфер и записи в +; память увеличивает не адрес, а PORT_Y + MACRO ACC_CopyScreenBlock + LD A,A + ENDM +;--------------------------------------- + +;--------[Двойная запись байта]--------- +; При записи байта Byte по адресу Addr +; происходит запись двух Byte в адресса: +; (Addr & #FE) и (Addr & #FE)+1 + MACRO ACC_DoubleByte + LD H,H + ENDM +;--------------------------------------- + +;---------[пока путь в никуда]---------- +; Работает так же как и ld b,b +; Ну и при отключенных прерываниях будет +; знаменитый DI:HALT))) + MACRO ACC_Halt + HALT + ENDM +;--------------------------------------- \ No newline at end of file diff --git a/macroses/macros.z80 b/macroses/macros.z80 new file mode 100644 index 0000000..9c8895e --- /dev/null +++ b/macroses/macros.z80 @@ -0,0 +1,356 @@ +;======================================= +; склеивает строку пути к файлу со строкой имени файла +; retname - имя дефайна содержащее путь и имя файла +; pname - строка в одинарных кавычках с путём к файлу +; fname - строка в одинарных кавычках с именем файла +; OStype - 'MacOS', 'Linux' или 'Windows'. Указывает какой разделитель между файлами/папками используется в переданной строке,'/' или '\' + MACRO mGETfullNAME retname, pname, fname, OStype + DEFINE tmpLString1 pname + DEFINE tmpLString2 fname + DEFINE tmpLString3 retname + DEFINE tmpLString4 OStype + LUA + local tmp3 = sj.get_define("tmpLString3") + tmp3 = string.gsub(string.match(tmp3, '\'.*\''), "'", "") + sj.insert_define(tmp3, "'" .. Get_Full_Filename(sj.get_define("tmpLString1"), sj.get_define("tmpLString2"), sj.get_define("tmpLString4")) .. "'") + ENDLUA + UNDEFINE tmpLString4 + UNDEFINE tmpLString3 + UNDEFINE tmpLString2 + UNDEFINE tmpLString1 + ENDM +;======================================= + +;======================================= + MACRO _mInfoBLOCK endAddr, filler + DISPLAY " Free ",/D,endAddr, " bytes at ",/H, $, " address." + BLOCK endAddr,filler + ENDM +;======================================= + +;======================================= + MACRO _mInfoALIGN num, filler +.temp equ $ + ALIGN num,filler + IF (($-.temp) > 0) + DISPLAY " Free ",/D,$-.temp, " bytes at ",/H, .temp, " address." + ENDIF + ENDM +;======================================= + +;======================================= + MACRO _mSIZE_INFO name, startAddr, endAddr, pages, mKey + IF mKey == 1 + display " " + display "v----------------------------------------------------------v" + display " Start End Size Free in page" + ENDIF + + display "* ",name," ",/H,startAddr, " ", endAddr, " ", (endAddr) - (startAddr), " ",/A, (#4000*(pages))-((endAddr) - (startAddr)) + + IF mKey == 2 + display "^----------------------------------------------------------^" + display " " + ENDIF + ENDM +;======================================= + +;======================================= + MACRO _mCollectInfo_begin + IF COLLECT_INFO + LUA PASS3 + INCLUDING_INFO_START() + ENDLUA + ENDIF + ENDM +;--------------------------------------- + MACRO _mCollectInfo_addStart + IF COLLECT_INFO + LUA PASS3 + INCLUDING_INFO_ADDstart() + ENDLUA + ENDIF + ENDM +;--------------------------------------- + MACRO _mCollectInfo_addEnd + IF COLLECT_INFO + LUA PASS3 + INCLUDING_INFO_ADDend() + ENDLUA + ENDIF + ENDM +;--------------------------------------- + MACRO _mCollectInfo_end + IF COLLECT_INFO + LUA PASS3 + INCLUDING_INFO_END() + ENDLUA + ENDIF + ENDM +;======================================= + +;======================================= + MACRO _mARRAYstart + ENDM +;--------------------------------------- + MACRO _mARRAYadd + ENDM +;--------------------------------------- + MACRO _mARRAYshow + ENDM +;======================================= + +;======================================= + MACRO mHRUSTfile fname, hstEXT, macPATH, linPATH, winPATH, osName + + IF osName = 'MacOS' : DEFINE tmpLString3 = + ELSEIF osName = 'Linux' : + ELSEIF osName = 'Windows' : + + DEFINE tmpLString1 = fname + DEFINE tmpLString2 = hstEXT + DEFINE tmpLString3 = + DEFINE tmpLString4 = + DEFINE tmpLString5 = + + + ENDM +;======================================= + + +;======================================= +; Возвращает имя операционной системы в дефайне retname +; 'MacOS', 'Linux' или 'Windows' + MACRO mGETosNAME retname + DEFINE tmpLString retname + LUA + local tmp = sj.get_define("tmpLString") + tmp = string.gsub(string.match(tmp, '\'.*\''), "'", "") + sj.insert_define(tmp, "'" .. Detect_os() .. "'") + ENDLUA + ENDM +;======================================= + + +;======================================= + MACRO FRAM_ON + IN A,(FastRAM.ON) + IFN NORM_FastRAM + PUSH BC + ;PUSH AF + LD BC,#1FFD + XOR A + OUT (C),A + OUT (FastRAM.SLOT0),A + ;POP AF + POP BC + ENDIF + ENDM + MACRO FRAM_OFF + IN A,(FastRAM.OFF) + IFN NORM_FastRAM + PUSH BC + ;PUSH AF + LD BC,#1FFD + LD A,1 + OUT (C),A + XOR A + OUT (FastRAM.SLOT0),A + ;POP AF + POP BC + ENDIF + ENDM +;======================================= + + +;======================================= + MACRO STACK_CHECK_MACRO _mSP, _mSPbuffer + assert $ < _mSP-_mSPbuffer, WARNING! Stack buffer may corrupt data/code! + ENDM + +;======================================= + + +;======================================= + MACRO SAFE_PORTY + IFNDEF NeedSafePort_Y + ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" + ELSEIF NeedSafePort_Y + LD A,#C0 + OUT (PORT_Y),A + ENDIF + ENDM + + MACRO ZERO_PORTY + IFNDEF NeedSafePort_Y + ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" + ELSEIF NeedSafePort_Y + LD A,0 + OUT (PORT_Y),A + ENDIF + ENDM + + MACRO SAFE_PORTY_2 + IFNDEF NeedSafePort_Y + ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" + ELSEIF NeedSafePort_Y + EXX + LD C,PORT_Y + IN B,(C) + PUSH BC + LD E,#C0 + OUT (C),E + EXX + ENDIF + ENDM + + MACRO RESTORE_PORTY + IFNDEF NeedSafePort_Y + ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" + ELSEIF NeedSafePort_Y + EXX + POP BC + OUT (C),B + EXX + ENDIF + ENDM + +;======================================= + + +;======================================= + MACRO PrintProc + MODULE PrintF +;--------------------------------------- +printstr: +; в рег. HL адрес на печатаемый буфер + LD C,Dss.PChars + jp ToDSS +;--------------------------------------- + +;--------------------------------------- +; в рег. A число печатаемое как hex +printhex: + LD D,A + RRCA + RRCA + RRCA + RRCA + AND #0F + ADD A,#30 + CP #3A + JR C,.PRNH1 + ADD A,7 +.PRNH1: + CALL .PRINT_CHAR + LD A,D + AND #0F + ADD A,#30 + CP #3A + JP C,.PRINT_CHAR + ADD A,7 + JP .PRINT_CHAR +; в регистре A символ для печати +.PRINT_CHAR: + LD BC,#0182 + JP ToBIOS +;--------------------------------------- + ENDMODULE + ENDM +;======================================= + + + +;======================================= + MACRO M_hex2dec2ascii_8bit size +; ВХОД: +; рег. C - HEX число для преобразования (0-255) +; рег. HL - адрес в памяти для сохранения строки результата (1-3 байта ASCII) +; size - 1-3 ascii символа на выходе (от младшего к старшему разряду) + IF size == 3 + ld a,199 + cp c + ld a,#30 + jr nc,.nxt + inc a +.nxt: ld (hl),a + ENDIF + + xor a + ld b,8 +.loop: + sla c + adc a,a + daa + + IF size == 3 + jp nc,.skip + inc (hl) + ENDIF + +.skip: djnz .loop + + IF size == 3 + inc hl + ENDIF + + IF size == 1 + and #0F + or #30 + ld (hl),a + ELSE + ld (hl),a + ld a,#33 + rrd + inc hl + ld (hl),a + ENDIF +;.exit: + ENDM +;======================================= + + + +;======================================= + MACRO M_Get_Mem mem_buf_addr, pages + ld b,pages + rst ToDSS + ret c + ld hl,mem_buf_addr + ld c,BIOS.GetMemBlkPages + rst ToBIOS + ret + ENDM +;======================================= + + + +;======================================= +; !TODO border color - активировать макрос и влупить везде когда переменные sys_page будут через структуру сделаны в SP2000.INC + +; MACRO BORDER color +; IF color == 0 +; XOR A +; ELSE +; LD A,color +; ENDIF +; out (BorderColor),a +; ENDM +;======================================= + + + +;-----------[DSS Functions]----------[v] + MACRO DSS_GETMEM pages, error_handler + ld b,pages + ld c,Dss.GetMem + rst ToDSS + jp c,error_handler + ;A - идентификатор блока, + ;либо код ошибки если CF-1 + ENDM +;------------------------------------[^] + +;----------[BIOS Functions]----------[v] + +;------------------------------------[^] \ No newline at end of file diff --git a/structures/EasterSprites.inc b/structures/EasterSprites.inc new file mode 100644 index 0000000..b8f43c8 --- /dev/null +++ b/structures/EasterSprites.inc @@ -0,0 +1,9 @@ +; + STRUCT str_EasterSprites +SpAddress WORD ; адрес спрайта в памяти +SpWidth WORD ; Ширина +SpHeight BYTE ; Высота + Y coord +SpXCoord WORD ; X coord +SpYCoord BYTE ; Y coord + ENDS +; \ No newline at end of file diff --git a/structures/FileSystem.inc b/structures/FileSystem.inc new file mode 100644 index 0000000..30c7ad2 --- /dev/null +++ b/structures/FileSystem.inc @@ -0,0 +1,24 @@ +; + STRUCT _sBOOT_SEC ; 62 bytes +.JMP: BLOCK 3,0 ; +#00 "JMP" +.ID_NAME: TEXT 8,{"DSS_1.7","0"} ; +#03 DOS NAME - DB "DSS_1.70" +; Block Parameters BIOS +.B_P_S: WORD #200 ; +#0B BYTE PER SECTOR +.S_P_C: BYTE 2 ; +#0D SECTORS PER CLUSTER +.RESERVE: WORD 1 ; +#0E RESERVE SECTORS +.FAT_NUM: BYTE 2 ; +#10 AMOUNT FATS +.F_P_DIR: WORD 112 ; +#11 FILES IN DIRECTORY +.S_P_D: WORD 1440 ; +#13 ALL SECTORS ON DISK +.ID_FORM: BYTE #F0 ; +#15 ID FORMAT +.S_P_F: WORD 2 ; +#16 SIZE FAT IN SECTORS +.S_P_T: WORD 9 ; +#18 SECTOR PER TRACK +.HEADS: WORD 2 ; +#1A AMOUNT SIDES +.HIDDEN: DWORD 0 ; +#1C HIDDEN SECTORS +.BPB_BIG_TOTAL_SECTORS: DWORD 0 ; +#20 BIG TOTAL SECTOR +.BPB_PHISICAL_DRIVE_NUMBER: WORD #80 ; +#24 PHISICAL DRIVE NUMBER +.BPB_EXT_BOOT_RECORD_SIGNATURE: BYTE #29 ; +#26 EXTENDED BOOT RECORD SIGNATURE +.BPB_SERIAL_NUMBER: DWORD 0 ; +#27 VOLUME SERIAL NUMBER +.BPB_LABEL: TEXT 8,{"NO NAME"," "} ; +#2B DISK LABEL +.ID_FAT: TEXT 8,{"FAT16"," "} ; +#36 FILE SYSTEM ID ( BPB_FS_ID ) + ENDS +; \ No newline at end of file diff --git a/structures/bmp.inc b/structures/bmp.inc new file mode 100644 index 0000000..c7bc2a6 --- /dev/null +++ b/structures/bmp.inc @@ -0,0 +1,31 @@ +; + STRUCT MAIN_BMP +ChipsPic BLOCK mpCH_Width * mpCH_Height +;MainPic BLOCK 160*168 ; !!!!!! hardcode +MainPic BYTE + ENDS + + STRUCT TBitMapFileHeader ; = 14 bytes +bfType WORD ; 'BM' +bfSize DWORD ; размер всего файла +bfReserved DWORD 0 ; +bfOffBits DWORD ; начало битового массива относительно начала файла + +;---[File Info] ; = 40 bytes +biSize DWORD 40 ; Количество байтов в DIB header (с этого момента) +biWidth DWORD ; Ширина изображения в пикселях +biHeight DWORD ; Высота изображения в пикселях +biplanes WORD ; Количество плоскостей или цветовых слоев +biBitCount WORD ; Кол-во битов на пиксель +biCompression DWORD ; Тип сжатия +biSizeImage DWORD 0 ; Размер картинки в байтах, если изображение несжатое, то значение рекомендовано устанавливать в ноль +biXPelsPerMeter DWORD ; Горизонтальное разрешение (в пикселях на метр) +biYPelsPerMeter DWORD ; Вертикальное разрешение (в пикселях на метр) +biClrUsed DWORD 0 ; Определяет количество используемых цветов из таблицы +biClrImportant DWORD 0 ; Количество важных для изображения цветов + +;--[File Data] +bdPallete BLOCK #400 +bdRaster MAIN_BMP + ENDS +; \ No newline at end of file