; 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 ; .SYS_PORT:bit4=1 --> .INT_PORT: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 .PENT_RESET EQU #20 .SCORP_RESET EQU #40 .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 .EXTENSION 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 .PENT_RESET EQU CNF_PORT.PENT_RESET .SCORP_RESET EQU CNF_PORT.SCORP_RESET .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: ____________________________________________________ | Значение | Запись во внешний порт: | | из внутр. |____________________________________| | порта | #24 ---- | | | | | Альтеры | #3C (-rom) | | | | | ||| | #7C (+rom) | #74 | 1FFD | 7FFD | | \|/ | bit1..0 | bit1..0 | bit1 | bit4 | |_____________|____________|_________|______|______| |E0 | 00 | | 1 | ... | |E1 (+dos_on) | 00 | | 0 | ... | |E2 | 00 | | 0 | 0 | |E3 | 00 | | 0 | 1 | |E4 | 01 | | 1 | ... | |E5 (+dos_on) | 01 | | 0 | ... | |E6 | 01 | | 0 | 0 | |E7 | 01 | | 0 | 1 | |EB | | 00 | ... | ... | |EF | | 01 | ... | ... | |_____________|____________|_________|______|______| ... - значение роли не играет Стандартные страницы ОЗУ для образов ПЗУ спектрума: Page Name Int.Port Page Name Int.Port #42 BASIC 128 #E2 | ??? ??? ??? ??? #E6 #43 BASIC 48 #E3 | ??? ??? ??? ??? #E7 #44 TR-DOS #E1 | ??? ??? ??? ??? #E5 #45 BIOS (ZX_EXP) #E0 | ??? ??? ??? ??? #E4 #46 BIOS (ZX_EXP) #EB #47 BIOS (ZX_EXP2) #EF 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 переключение страниц ПЗУ портом #5C происходит только при воткнутой ПЗУ через sys_port. Можно переключать страницы через внутренний порт #8F, тогда bit4 этого порта включает сигнал записи для ПЗУ. Так же этот порт даёт прямую нумерацию страниц при установленном bit4. ---------------------------------------------------- */ ;======================================= ; порты управления страницами фастрам FastRAM: .ON EQU #FB ; Включение кэша IN A,(FastRAM.ON) - прибито гвоздями в конфе .OFF EQU #7B ; Отключение кэша IN A,(FastRAM.OFF) - прибито гвоздями в конфе .SLOT0 EQU #5C ; Переключение страниц кэша при FastRAM.ON в нулевом окне (bit0..1) - прибито гвоздями в конфе ;!TODO поставить в карте портов на чтение порта #FB внутренний порт SLOT0 ; чтоб при включении кэш в регистр сохранялась страница в банке 0 (полезно при включении кэш из банки ноль) ; Порт управления страницами ПЗУ ; Переключение страниц ПЗУ при FastRAM.OFF в нулевом окне. ROM: .SLOT0 EQU #5C ; Прибито гвоздями в конфе .BIOS EQU SYS_PORT.BIOS ; для sys_port.on D_ROM16OFF .EXTENSION EQU SYS_PORT.EXTENSION ; для 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 ]------------------------------; KEMPSTON: .JOYSTICK EQU 7 ; Чтение: порт джойстика и сигналы DRQ, INTRQ контроллера дисковода. ; Запись: запись в микросхему ТМ9 - системный порт TR-DOS ; Кемпстон из DOS_ON для специального шнурка LPT+JOY чтоб по ; PC Link коннектиться к PC .PC_Link EQU #FF ;JOY_DOS ; На каждый внешний порт мышки прописан один внешний, значит ; конфа мониторит старший адрес, DCP+Conf обработка. .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 ; цвет бордюра в режиме спринтера берётся из 4 палитры. ; цвет в палитре вычисляется дублированием в номере цвета бордюра bit2..0 в bit5..3 ; можно вычислять итоговый индекс в палитре умножением цвета на 9, либо ; три сдвига цвета влево плюс исходный цвет. Каждый цвет в дефолтной палитре ; повторяется 16 раз: ; 0 - BLACK color index #00 #00/#10 = 0 ; 1 - BLACK color index #00 #00/#10 = 0 ; 2 - BLUE color index #12 #12/#10 = 1 ; 3 - BLUE color index #1B #1B/#10 = 1 ; 4 - GREEN color index #24 #24/#10 = 2 ; 5 - GREEN color index #2D #2D/#10 = 2 ; 6 - CYAN color index #36 #36/#10 = 3 ; 7 - CYAN color index #3F #3F/#10 = 3 ;--------------------------------------- ;-------------[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 мс ;--------------------------------------- ; DEFINE SLOT? +( SLOT0 | ((#C0 & high $)>>>1) ) SLOT0 EQU #82 ; номер банки 0 .MEM_ADDR EQU #00 SLOT1 EQU #A2 ; номер банки 1 .MEM_ADDR EQU #4000 SLOT2 EQU #C2 ; номер банки 2 .MEM_ADDR EQU #8000 SLOT3 EQU #E2 ; номер банки 3 .MEM_ADDR EQU #C000 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 Port_HardReset EQU #AC .Step1 EQU #41 .Step2 EQU #40 ; ;----------------------------------------------------------------------; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Адреса страниц ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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 SHARED_PAGE EQU #FF ZERO_PAGE EQU 0 ; страница для перехвата ресета и ещё чего-то Spec_Page EQU #41 .page_0 EQU #FFF0 .page_1 EQU #FFF1 .page_2 EQU #FFF2 .page_3 EQU #FFF3 .RET_addr EQU #FFF4 .flag_Z EQU #FFFE ; .flag_X EQU #FFFF ; обозначают, что загружены ROM спектрума ;LD (#FFF3),A ; сохраняем в спецстраницу номер Spec_Page 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 ; ;---------------------------------------------------------------------[] ; Cтраница с системными переменными 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 ;!FIXIT найти где используются .WIN_SAV_HL EQU #C144 ;!FIXIT найти где используются .WIN_SAV_DE EQU #C146 ;!FIXIT найти где используются .WIN_SAV_BC EQU #C148 ;!FIXIT найти где используются .WIN_ZG EQU #C14A .WIN_PLACE_WIN EQU #C14C ;!FIXIT найти где используются .WIN_GR_MAP EQU #C14E ;!FIXIT найти где используются ;;;; .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 .TMP_BUFFER 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 .ZX_PAGES EQU #C190 ; или только один байт - BlockID? ; vROM(10) + vRAM(32-1) + End_Byte(0); одна страница РАМ не считается - это страница 0. ;!TODO EQU #C1BA..#C1BF - 6 bytes ; .IDE_0 EQU #C1C0 .IDE_1 EQU #C1C8 .IDE_2 EQU #C1D0 .IDE_3 EQU #C1D8 ; .FDD_0 EQU #C1E0 .FDD_1 EQU #C1E8 ;!TODO EQU #C1F0..#C1FF ;.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 ; данные карт окон (96 описателей по 32 байта) .TASK_DATA EQU #EC00 ; данные для задач .RESTART_ID EQU #F000 ; db "RESTART",0 ;First start identificator .PowerOnTime EQU #F008 ; время включения и перезагрузки #F008 - #F017 .USER_VARS EQU #F018 ; переменные пользователя .SHARED_BUFFER_32b EQU #FEE0; - #FEFF .CMOS_EMULATOR EQU #FF00 .USER_VARS_2 EQU .CMOS_EMULATOR + CMOS.MAX_ADDRESS + 1 ;------------[ 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 ;.LIB_TABLE EQU #C1A0..#C1BF ; таблицы librares 32 байта ;---------------------------------------------------------------------[] ; /* 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 ;WORD 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 .Mask.ColorStyle EQU %0000'1111 ; COLOR STYLE For Setup .Mask.Int EQU %0011'0000 ; Frame Int (Default/Pentagon/Scorpion/Original) .Mask.Sinc EQU %1100'0000 ; Screen V-Sinc (Default/312 lines 50 HZ/320 Lines 49 Hz) ; CMOS.USED_MIN_ADDRESS EQU #0E CMOS.USED_MAX_ADDRESS EQU #3F CMOS.MAX_ADDRESS EQU #7F CMOS.TEST_CELL EQU CMOS.MAX_ADDRESS CMOS.Cell.CheckSum EQU CMOS.USED_MAX_ADDRESS /* MODULE CMOS_CELL BootUpParams EQU #0E .Mask.MemTest EQU %1000'0000 ; MEMORY TEST .Mask.SaveRAMdisks EQU %0100'0000 ; SAVE RAM DISKS ;.Mask.Reserved EQU %0010'0000 ; UPDATE BIOS .Mask.StartDelay EQU %0001'1000 ; START DELAY .Mask.Language EQU %0000'0100 ; LANGUAGE ;.Mask.Reserved EQU %0000'0010 ; NOT USED .Mask.QuickStart EQU %0000'0001 ; QUICK START Typematic EQU #0F .Mask.Enabled EQU %1000'0000 ; ON/OFF .Mask.Delay EQU %0110'0000 ; DELAY 00-250, 01-500, 10-750, 11-1000 .Mask.Rate EQU %0001'1111 ; RATE 0-6, 1-8, 2-10, 3-12, 4-15, 5-20, 6-24, 7-30 ;FDD-1, FDD-2, IDE-1, IDE-2, IDE-3, IDE-4, Ram Dsk, Recovery BootDrives EQU #10 .Mask.SysDisk EQU %0000'0111 .Mask.AltSysDisk EQU %0111'0000 DrivesSetup_1 EQU #11 .Mask.FirstFDD EQU %0000'0011 ; FDD First 720/1.44/NONE .Mask.SecondFDD EQU %0000'1100 ; FDD Second 720/1.44/NONE .Mask.PriIDEmaster EQU %0011'0000 ; IDE Pri Master Auto/Setup/Disabled .Mask.PriIDEslave EQU %1100'0000 ; IDE Pri Slave Auto/Setup/Disabled DrivesSetup_2 EQU #20 .Mask.SecIDEmaster EQU %0011'0000 ; IDE Sec Master Auto/Setup/Disabled .Mask.SecIDEslave EQU %1100'0000 ; IDE Sec Slave Auto/Setup/Disabled IDE_Setup.PriMaster: .CylindersLow EQU #12 .CylindersHigh EQU #13 .Heads EQU #14 .Sectros EQU #15 IDE_Setup.PriSlave: .CylindersLow EQU #16 .CylindersHigh EQU #17 .Heads EQU #18 .Sectros EQU #19 IDE_Setup.SecMaster: .CylindersLow EQU #37 .CylindersHigh EQU #38 .Heads EQU #39 .Sectros EQU #3A IDE_Setup.SecSlave: .CylindersLow EQU #3B .CylindersHigh EQU #3C .Heads EQU #3D .Sectros EQU #3E ScreenSET EQU #1A .Mask.ColorStyle EQU %0000'1111 ; COLOR STYLE For Setup .Mask.Int EQU %0011'0000 ; Frame Int (Default/Pentagon/Scorpion/Original) .Mask.Sinc EQU %1100'0000 ; Screen V-Sinc (Default/312 lines 50 HZ/320 Lines 49 Hz) ;!FIXIT НЕ ИСПОЛЬЗУЕТСЯ HardwareConfiguration EQU #1B ; !!!!! or #36 ,Mask.TurboMode EQU %0000'0001 ; TURBO MODE (D0..D3 - 6 OR 7) ,Mask.TurboExchange EQU %0000'0010 ; TURBO EXCHANGE ON/OFF - 1 ,Mask.PortExchange EQU %0000'0100 ; PORT EXCHANGE ON/OFF - 1 ,Mask.Computer EQU %0001'1000 ; COMPUTER: 0-SPRINTER, 1-SPECTRUM 256, 2-PENTAGON 128, 3-OTHER ;!FIXIT НЕ ИСПОЛЬЗУЕТСЯ ResetMode EQU #1C ; !!!!! or #35 ; 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#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 Options EQU #1D .Mask.RebootMSG EQU %00000010 .Mask.HDDwriteProtect EQU %00000001 ;!!!!! Disabled TRDOSmount EQU #1E .Mask.A EQU %0000'0011 ;Default / FDD / HDD / RMD .Mask.B EQU %0000'1100 .Mask.C EQU %0011'0000 .Mask.D EQU %1100'0000 ScreenPosition EQU #1F .Mask.X EQU %1111'0000 .Mask.Y EQU %0000'1111 CheckSum EQU #3F ;----------------------------------------- ENDMODULE */ 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 ;*************************************** ; ***** - Оконные переменные - ***** STRUCT Window_UserVars SIZE_H BYTE 0 ; +00 горизонтальный размер в знакоместах SIZE_V BYTE 0 ; +01 вертикальный размер в знакоместах PLACE_H BYTE 0 ; +02 положение по горизонтали, в знакоместах PLACE_V BYTE 0 ; +03 положение по вертикали в знакоместах MODE BYTE 0 ; +04 режим знакоместа MODE_S BYTE 0 ; +05 дополнительный режим: бит 0 - Sp-SCR GR_X BYTE 0 ; +06 положение по X в поле графики (по знакомест) GR_Y BYTE 0 ; +07 положение по Y в поле графики (по знакомест) ENDS ; STRUCT Window_Variables USER Window_UserVars 0,0,0,0,0,0,0,0 ; ; Work vars reg_HL WORD 0 ; +08 сохранение HL reg_BC WORD 0 ; +10 сохранение BC reg_DE WORD 0 ; +12 сохранение DE V_BEG BYTE 0 ; +14 начало окна по вертикали V_END BYTE 0 ; +15 конец окна по вертикали H_BEG BYTE 0 ; +16 начало окна по горизонтали H_END BYTE 0 ; +17 конец окна по горизонтали SIZE_REL BYTE 0 ; +18 реальный размер в символах MODE_E BYTE 0 ; +19 дополнительный режим экрана WORK_1 BYTE 0 ; +20 рабочая переменная 1 WORK_2 BYTE 0 ; +21 рабочая переменная 2 WORK_3 WORD 0 ; +22 рабочая переменная 3 GRAF_X WORD 0 ; +24 начальная координата по X GRAF_Y WORD 0 ; +26 начальная координата по Y RESERVED BLOCK 4,0 ; +28 зарезервировано до 32-х байтов ENDS ;-------------[] ; default window WIN_ID_0 Window_Variables = SYS_PAGE.WIN_MAP_IX + Window_Variables * 0 ;WIN_ID_1 Window_Variables = SYS_PAGE.WIN_MAP_IX + Window_Variables * 1 ;WIN_ID_2 Window_Variables = SYS_PAGE.WIN_MAP_IX + Window_Variables * 2 ; ... ;WIN_ID_95 Window_Variables = SYS_PAGE.WIN_MAP_IX + Window_Variables * 95 ;-------------[] ; ; ***** - Оконные переменные - ***** ; 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 ----------------------------------------------------------------; ;Переменные спектрума MODULE ZX_VARS ;ZX_VARS EQU #5C00 ; SWAP_ROM EQU #5B00 PRINTER_BUFFER 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_SPACE 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 ZX_VARS.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 ZX_VARS.BUFER ; tr-dos buffer ; MENU_TBL: .JUMP EQU #F6EA .TEXT EQU #F6EC ENDMODULE ;-----------------------------------------------------------------------; 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 ACEX ; внутренние порты 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 ISA_CTRL EQU #1B ; #9FBD CMOS_DATA.READ EQU #1C ; #FFBD CMOS_ADDR.WRITE EQU #1D ; #DFBD CMOS_DATA.WRITE EQU #1E ; #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 ; #FADF внешний ;#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 3000 -- AY_D READ ;#8D reserved 2000 -- AY_A WRITE ;#8E reserved 2000 -- AY_D WRITE ROM_RG EQU #8F ; порт переключения страниц 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 (not used!) ;#C9 - копия C1 (not used!) ;#CA - копия C2 (not used!) HOLD EQU #CB ; Задаёт значения счётчиков синхронизатора синхроимпульсов. %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 bit1=1 (#24 bit6=0, bit0=0) ;#E1 - vROM page TR-DOS ; PC = #3D00..#3DFF and #1FFD bit1=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 bit1=1 (#24 bit6=0, bit0=1) ;#E5 - vROM page TR-DOS 2 ; PC = #3D00..#3DFF and #1FFD bit1=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) SLOT0 EQU #E8 ; RAM page (окно 0000-3FFF) SLOT1 EQU #E9 ; RAM page (окно 4000-7FFF) SLOT2 EQU #EA ; RAM page (окно 8000-BFFF) ;#EB - vROM page BIOS-1 ; Port #74 = 0 ;#EC - user's memory cell ; сюда можно сохранить нужное значение ;#ED - user's memory cell ; сюда можно сохранить нужное значение RET_PORT EQU #EE ; Page set after Soft RESET. Любое, кроме 0, значение - страница куда передастся управление после Soft reset ;#EF - vROM page BIOS-2 ; Port #74 = 1 ; Установка значения в какой либо порт от #F0 до #FF приведет к одному и тому же результату, что и просто установка значения в порт #F0. В схеме сделана ; переадресация номера порта так, что при значении #Fx номер порта берется как #F0+Spectrum_PAGE, где Spectrum_PAGE - номер спектрумовской страницы, адресуемой ; по портам #7FFD и #1FFD. Таким образом достигается совместимость с Пентагоном и Скорпионом по распределению памяти и делается возможным установка любого ; номера страницы спринтеровской памяти для любой страницы Спектрума. ; ; С распределением памяти ситуация такая. Порты страниц - переключают адреса "виртуальных" страниц скорпиона независимо от того, что в этот момент ; подключено в нулевую банку. С третьей банкой наоборот - запись в порт страницы меняет адрес той страницы, какая установлена портами 7FFD,1FFD, ; т.е. записав что-то в порт PAGE3 нужно помнить, какая страница стояла с адреса #C000. Например, если нулевая, то поменяется страница и в адресе ; #0000, если там было установлено ОЗУ. ; SLOT3 EQU #F0 ; 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 ; ; /* внутренние порты 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) ;---------------------------------------- ;------------[HDD Secondary]------------- ;REGISTER #37 - CYLINDERS (MASTER) L ;REGISTER #38 - -----//------ H ;REGISTER #39 - HEADS (MASTER) ;REGISTER #3A - SECTORS (MASTER) ; ;REGISTER #3B - CYLINDERS (SLAVE) L ;REGISTER #3C - -----//------ H ;REGISTER #3D - HEADS (SLAVE) ;REGISTER #3E - 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 ;REGISTER #3F - CHECKSUM SETTING ;======================================= ; ;-------------------------------[ TEST ]-------------------------------- MODULE IDE ; ; 0 - копия DRV_HEAD. bit6 - LBA/CHS, bit4 - MASTER/SLAVE, bit0 - Primary/Secondary Chanel ; 1 - секторов на дорожке ; 2 - число головок ; 3 - количество цилиндров мл. ; 4 - количество цилиндров старший. ; 5 - секторов на цилиндр мл. ; 6 - секторов на цилиндр старш. ; 7 - тип драйва HDD - 1, CD-ROM - 2, NONE - #FF STRUCT HDD_INIT_TABLE DRV_Flags 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 ; Регистр адреса накопителя (#3F7 чтение) содержит номер головки и HDD, выбранные в предыдущей операции. ; Биты 0, 1 - /DSO, /DS1 - биты выбора соответствующего накопителя 0 или 1. ; Биты 2...5 - /HSO../HS3 - содержат двоичный код выбранной головки. ; Бит 6 - Write Gate - бит выполнения записи, активен во время операции записи Write: .Data EQU #0150 ; cnf 20 ; HDW_DAT W170 ; #1F0 Data register .Features EQU #0151 ; cnf 21 ; HDW_ERR W171 ; #1F1 Features register .Counter EQU #0152 ; cnf 22 ; HDW_CNT P_S_CNT W172 ; #1F2 Counter register .Sector EQU #0153 ; cnf 23 ; HDW_SEC P_S_NUM W173 ; #1F3 Sector register .CylinderLow EQU #0154 ; cnf 24 ; HDW_CLL P_C_LOW W174 ; #1F4 Cylinder Low register .CylinderHigh EQU #0155 ; cnf 25 ; HDW_CLH P_C_HIG W175 ; #1F5 Cylinder High register .DeviceHead EQU #4152 ; cnf 26 ; HDW_DRV P_HD_CS ; #1F6 Device/Head register .Command EQU #4153 ; cnf 27 ; HDW_COM P_CMD ; #1F7 Command register .DeviceControl EQU #4154 ; cnf 28 ; ; #3F6 Device Control register Read: .Data EQU #0050 ; cnf 20 ; HDR_DAT P_DATS R170 ; #1F0 Data register .Error EQU #0051 ; cnf 21 ; HDR_ERR P_ERR R171 ; #1F1 Error register .Counter EQU #0052 ; cnf 22 ; HDR_CNT R172 ; #1F2 Counter register .Sector EQU #0053 ; cnf 23 ; HDR_SEC R173 ; #1F3 Sector register .CylinderLow EQU #0054 ; cnf 24 ; HDR_CLL R174 ; #1F4 Cylinder Low register .CylinderHigh EQU #0055 ; cnf 25 ; HDR_CLH R175 ; #1F5 Cylinder High register .Control EQU #4052 ; cnf 26 ; HDR_DRV R176 ; #1F6 Device/Head register .Status EQU #4053 ; cnf 27 ; HDR_CTL P_HDST R177 ; #1F7 Status (Control) register .AltStatus EQU #4054 ; cnf 28 ; ; #3F6 Alternate Status register .DrvAddress EQU #4055 ; cnf 29 ; ; #3F7 ErrorBit: .Abort EQU 2 ErrorByte: .Abort EQU #04 ControlBit: ; 0000 0000 ; Bits for IDE.Read.Status .Busy EQU 7;────────┘│││ ││││ ; BSY .Ready EQU 6;─────────┘││ ││││ ; RDY .Fault EQU 5;──────────┘│ ││││ ; DMA ready for ATAPI .SeekComplete EQU 4;───────────┘ ││││ ; Service for ATAPI .DataRequest EQU 3;─────────────┘│││ ; DRQ .CorrectedData EQU 2;──────────────┘││ obsolete .Index EQU 1;───────────────┘│ obsolete .SenseDataAvailable .Error EQU 0;────────────────┘ ; Indicates an error occurred. Send a new command to clear it (or nuke it with a Software Reset). .CheckCondition EQU .Error .StreamError EQU .Fault .ATAPI_DMAReady EQU .Fault .ATAPI_Service EQU .SeekComplete ControlByte: ; Bytes for IDE.Read.Status .Busy EQU #80 ; BSY .Ready EQU #40 ; RDY .Fault EQU #20 .SeekComplete EQU #10 .DataRequest EQU #08 ; DRQ .CorrectedData EQU #04 ; obsolete .Index EQU #02 ; obsolete .Error EQU #01 ; Indicates an error occurred. Send a new command to clear it (or nuke it with a Software Reset). .CheckCondition EQU .Error .StreamErrror EQU .Fault .ATAPI_DMAReady EQU .Fault .ATAPI_Service EQU .SeekComplete /* Bit Abbreviation Function 0 ERR Indicates an error occurred. Send a new command to clear it (or nuke it with a Software Reset). 1 IDX Index. Always set to zero. 2 CORR Corrected data. Always set to zero. 3 DRQ Set when the drive has PIO data to transfer, or is ready to accept PIO data. 4 SRV Overlapped Mode Service Request. 5 DF Drive Fault Error (does not set ERR). 6 RDY Bit is clear when drive is spun down, or after an error. Set otherwise. 7 BSY Indicates the drive is preparing to send/receive data (wait for it to clear). In case of 'hang' (it never clears), do a software reset. */ Chanel: .Set_0: EQU #20BC ; для использования с полной адресацией (рег BC), заслать '1' .Set_1: EQU #00BC ; для использования с полной адресацией (рег BC), заслать '1' .Set: EQU #BC ; для использования с неполной адресацией out (#bc),a. заслать '1' .Primary EQU #21 ; для использования с неполной адресацией out (#bc),a. Выбор канала 0 .Secondary EQU #01 ; для использования с неполной адресацией out (#bc),a. Выбор канала 1 Device: .HDD EQU 1 .CDROM EQU 2 .NONE EQU #FF Drive: .Master EQU %1010'0000 .Slave EQU %1011'0000 ATAPI: .Packet EQU #A0 .IdentifyPackedDevice EQU #A1 .Reset EQU #08 ; ATA: ; ATA-2 commands ************************ .ExecuteDeviceDiagnostic EQU #90 .IdentifyDevice EQU #EC .InitializeDeviceParameters EQU #91 .ReadSectorsWithRetry EQU #20 .ReadSectors EQU #21 .ReadVerifySectorsWithRetry EQU #40 .ReadVerifySectors EQU #41 .Seek EQU #70 .WriteSectorsWithRetry EQU #30 .WriteSectors EQU #31 ; ****** additional commands ************ .AcknowledgeMediaChange EQU #db .PostBoot EQU #dc .PreBoot EQU #dd .DoorLock EQU #de .DoorUnlock EQU #df .DownloadMicrocode EQU #92 ; Power Mode .CheckPowerMode EQU #98 .CheckPowerMode2 EQU #e5 .Idle EQU #97 .Idle2 EQU #e3 .IdleImmediate EQU #95 .IdleImmediate2 EQU #e1 .Sleep EQU #99 .Sleep2 EQU #e6 .Standby EQU #96 .Standby2 EQU #e2 .StandbyImmediate EQU #94 .StandbyImmediate2 EQU #e0 ; .MediaEject EQU #ed .Nop EQU #00 .ReadBuffer EQU #e4 .ReadDMA EQU #c8 .ReadLong EQU #22 .ReadMultiple EQU #c4 .Recalibrate EQU #10 .SetFeatures EQU #ef .SetFeatures.Disable8bit EQU #81 ; Disable 8-bit data transfers (писать в .Features) .SetFeatures.DisableWriteCache EQU #82 ; Disable write cache (писать в .Features) .SetMultipleMode EQU #c6 .WriteBuffer EQU #e8 .WriteDMA EQU #ca .WriteLong EQU #32 .WriteMultiple EQU #c5 .WriteSame EQU #e9 .WriteVerify EQU #3c ; **** device specific commands ************* .FormatTrack EQU #50 ; command modificators: ; for ReadSectors, WriteSectors, ReadVerifySectors, ; ReadDMA, WriteDMA, ReadLong, WriteLong .WithoutRetry EQU #01 ; ATA ; .Master EQU #A0 ; .Slave EQU #B0 ; 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] ; Counter Timer Control 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 ; Serial I/O 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 ; Parallel I/O 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 ; Watch Dog timer WDT: .Master_Reg EQU #F0 ; Master register WDTMR .Control_Reg EQU #F1 ; Control register WDTCR ; Interrupt Priority Register IntPrior_Reg EQU #F4 ;System Control 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 ;=======================================================================; ; ПРО КВАДРАТЫ ИНТА ; ;=======================================================================; ;INT_X = !DFF(GND,(SVIDEO.INTT & KEYS.int),,((/IO or /M1) & DFF(DFF(!INT_X,CTH2,,),CTH2,,))) or !CBL_INT; ;BORD = DFF( (MODE0[7..4] == 15), LWR_COL,,); ;INTTX = DFF( (BORD & MODE03 & MODE02 & MODE00), LWR_COL,,); ; ;INTT = DFF( !(INTTX & (CTV[2..0] == 7)), CT5,,); ;CTV - счётчик строк, CT - счётчик пикселей в квадратике (0-7), CTH - счётчик знакомест ; ; | --- | --- | ---- | --- | --- | ---- | ; | S | R | C | D | Q+1 | !Q+1 | ; | --- | --- | ---- | --- | --- | ---- | ; | 1 | 0 | - | - | 1 | 0 | ; | 0 | 1 | - | - | 0 | 1 | ; | 1 | 1 | - | - | 1* | 1* | ; | 0 | 0 | 0->1 | 1 | 1 | 0 | ; | 0 | 0 | 0->1 | 0 | 0 | 1 | ; | 0 | 0 | 0 | - | Q | !Q | ; | --- | --- | ---- | --- | --- | ---- | ;384 448*320*6=860160 20966400 тактов 41932800 448*312=139776 *6 = ;Разрешение экрана 56 квадратов по горизонтали и 39(40) по вертикали (скорп или пень) ; ; - На какую ногу триггера сигнал идет? ; - на клок, по фронту на выход копируется значение с даты ; - А когда это фронт возникает? ; - по инту от видео/клавы ; ;Все же просто. На квадратиках с интом INTT = 0, на остальных INTT = 1 ;получается, что фронт возникает при переходе с квадратика с интом на квадратик без инта ;От количества квадратов длина инта не зависит ; Короче, погнали от M1 и IO. Они вместе в нуле когда прерывание подтвердилось. Ноль на их OR будет только ; при подтверждении прерывания. Ноль уходит телезрителям дальше на AND и оттуда на S, после чего на !Q у ; нас тоже ноль - инт снялся. Если инт снялся и равен 0, то 1 идёт на самый левый триггер в D, но ; переходит на средний триггер только по CTH2 - счётчик длины инта который тикает независимо от того, есть ; он или нет. Когда тикнет, единица переходит дальше на D и ждет опять тика, после чего попадает на AND, а ; там на втором выводе тоже 1, потому что сигналы M1 и IO инверсные и через OR, а вместе в нуле они только ; при подтверждении инта. Единица оттуда втыкается в S, что даёт возможность передать кусок !земли с D на !Q ; при переходе клока с 0 в 1. А такой переход будет только в строке следующего после интового неинтового ; квадратика с 3 на 4 пиксел. А следующий квадратик с интом после квадратика инта оттягивает генерацию инта ; на себя. Короче, инт генерируется после перехода с квадрата инта на квадрат без инта. Если точнее, то во ; время прорисовки последней линии знакоместа на следующем знакоместе. Два квадрата инта через обычный ; квадрат не смогут повлиять потому что инт либо будет всё ещё висеть и это будет замена 1 на 1))) либо инт ; снимется через IO и M1 установив S в положение ?похер на D и C?, которое сменится только после того как ; протикают левые счётчики. ;=======================================================================; ; ПРО КВАДРАТЫ ИНТА ; ;=======================================================================; ;__________________________________________________________________________________________________________# ; ; DW #FEFF ; Sprinter-2000 ; ; DW #FFFE ; Sprinter-1 ; DB 0 ; акселератор ; DB 1 ; экран ; DB 2 ; клавиатура ; DB 1 ; ковокс; ; ; DW #FFFD ; Sprinter-2 ; DB 2 ; акселератор ; DB 1 ; экран ; DB 0 ; клавиатура ; DB 1 ; ковокс; ; ; DW #FFFC ; AY ; DB 0 ; аccselerator ; DB 0 ; Screen ; DB 2 ; клавиатура ; DB 0 ; ковокс; ; ; DW #FFF9 ; идентификатор конфигурации 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т - отключенное состояние.<< ;=================================================================================