|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Real i8085 + Xilinx CPLDs + 2 * SIMM30 = Orionix :)
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
| | | | Shaos wrote: | | | | Shaos wrote: Пока прикидываю неразогнанный двухсимовый вариант для 5 МГц: Как я понимаю за 4 такта процессора (и 8 тактов пиксельклока) нам надо успеть прочитать один раз из видеопамяти и один-два раза прочитать-записать данные по требованию процессора, ну и может один раз сделать CAS-before-RAS рефреш - так? Процессор всегда пишет-читает через такт после ALE. У нас может быть четыре состояния s0,s1,s2,s3, в первых трёх из которых по умолчанию будет читаться видеопамять и сохранять видеоданные в регистре, из которого в состоянии s3 видеоданные будут уходить в сдвиговый регистр и ALE может попасть на любое из этих состояний: ALE попало на s0 - значит общение процессора с памятью будет во время состояния s2 и мы точно знаем, что регистр с видеоданными уже будет записан в текущем такте (s0), значит следующий такт s1 можно посвятить рефрешу CAS-before-RAS, а на s3 снова может выпасть ALE. ALE попало на s1 - значит общение процессора с памятью будет во время состояния s3 и мы точно знаем, что регистр с видеоданными уже будет записан в текущем такте (s1), значит следующий такт s2 можно посвятить рефрешу CAS-before-RAS. ALE попало на s2 - значит общение процессора с памятью будет во время состояния s0, а в следующем состоянии s3 регистр с данными уже должен быть записан, значит в текущем такте (s2) пишем регистр с видеоданными и больше ничего не делаем (CAS-before-RAS не заказывается). ALE попало на s3 - значит общение процессора с памятью будет во время состояния s1 и следующий такт (s0) надо посвятить записи видеорегистра, значит CAS-before-RAS также не заказывается. P.S. RD и WR надо попросту укоротить, откусив их начала и оставив только кусок, попадающий на T3? | | | | |
Наверное надо на полтакта сдвинуть формирование RAS/CAS, причём удлиннив RAS и укоротив CAS: P.S. Пока прикидки такие - имеем 2 обязательных CPLD чипа: Orionix Chip1 - дешифратор адресов и почти все порты (см. VHDL код выше) Orionix Chip2 - видеоконтроллер, перебирающий адреса видеопамяти (PAL и NTSC) и 2 опциональных: Orionix ChipX - гибкий доступ к видеопамяти с шагом в 256 байт вместо 16К (горизонтальный скролл) Orionix ChipY - блиттер (пока в базовом варианте с копированием без прозрачности) плюс некоторое небольшое количество мелкой логики (регистры, мультиплексоры и т.д.) P.P.S. По идее можно шаг сдвига видеопамяти и в 1 байт сделать - в этом случае можно будет вертикальный скролл поддержать, правда с минимальной софтверной поддержкой (программно придётся стирать перехлестнувшиеся пикселы), но этоу же мелочи... P.P.P.S. С другой стороны в качестве мультиплексоров можно тот же Xilinx заюзать - дешевле будет (один XC9572XL-10 стоит $2.26, один XC9536XL-10 стоит $1.18, а шесть 74LS153 - уже $4.50) - тогда обязательными будут 3 CPLD-чипа... | | | | |
Не получится заюзать в качестве мультиплексоров - ног не хватит Это целый чипсет получается для построения любых Орионов - стандартных и не очень P.S. Я смотрю у 8085 при чтении опкода сигнал RD чуть длиннее получается - по видимому, чтобы всё срасталось, надо все операции с памятью по запросу процессора делать во втором такте - писать в память при WR и читать в регистр по RD, который отдавать процессору в следующем третьем такте, а сам третий такт использовать для видеоконтроллера, тогда имея 4 состояния: s0 - H2=0 H1=0 s1 - H2=0 H1=1 s2 - H2=1 H1=0 s3 - H2=1 H1=1 их можно наложить на такты процессора таким образом: s0 - ALE (читаем видеопамять) s1 - RD/WR (читаем/пишем память для проца) s2 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD s3 - отправляем прочитанное из видеопамяти в регистр сдвига (тут снова может быть ALE) s1 - ALE (читаем видеопамять даже если она была прочитана в s0) s2 - RD/WR (читаем/пишем память для проца) s3 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD, и одновременно отправляем прочитанное ранее из видеопамяти в регистр сдвига s0 - тут опять может быть ALE, т.е. считаем что видеопямть будет прочитана s2 - ALE (читаем видеопамять) s3 - RD/WR (читаем/пишем память для проца и одновременно отправляем прочитанное из видеопамяти в регистр сдвига) s0 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD s1 - тут опять может быть ALE, т.е. считаем что видеопямть будет прочитана s3 - ALE (отправляем прочитанное из видеопамяти в регистр сдвига) s0 - RD/WR (читаем/пишем память для проца) s1 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD s2 - тут опять может быть ALE, т.е. считаем что видеопямть будет прочитана перед s3 Получается, что CAS-before-RAS делается каждый раз после WR или RD от проца. Видеопамять читаем в трёх состояниях s0,s1,s2, если на это же время не приходятся такты T2 или T3 процессора. Состояние s3 всегда используется для вскармливания регистра сдвига. P.P.S. Тогда надо обратно сдвинуть RAS и CAS, чтобы они совпадали с тактами процессора:
P.P.P.S. Если CAS-before-RAS будет после каждого обращения процессора к памяти, то регистр по RD ненужен, т.к. HIDDEN-CAS-before-RAS оставляет байт нетронутым на выходе, т.е. пока реализацию блиттера придётся отложить на потом...
|
08 Dec 2013 11:29 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
| | | | Shaos wrote: Итак, мы заводим новый системный порт ¹0 по адресу #F7FF, который будет доступен как по записи, так и по чтению (через ОЗУ): D0 - управляет совместимостью с NTSC (см.ниже) D1 / D2 - включает режим 480 точек по горизонтали (для 80x25) D3 - включает режим альфаканала (просвечивает область с нулевого адреса) ??? D4 - задают режим видимости Devices/FastRAM (см.ниже) D5 / D6 - включает теневую память вместо ОЗУ, ПЗУ и портов (порт #F7FF также запрещается) D7 - запрещает порт #F7FF для совместимости со стандартным Орионом (если 0, то порт разрешён) При запрещении порта #F7FF битами D6 или D7 его можно вернуть обратно путём осуществления записи скажем по адресу #FFFF (на самом деле по любому #FFxx), что обнулит биты D6 и D7 порта #F7FF (но при чтении всё ещё будут читаться старые значения, т.к. память не обновится пока в порт что-то явно не запишут). Возможное решение проблемы совместимости с NTSC, где будут видимы только 200 линий: 00 - режим по умолчанию где видны все 256 линий (в режиме NTSC будут видны только верхние 200 строк); 01 - во всех режимах видны только 200 строк с вертикальным отступом 0; 10 - во всех режимах видны только 200 строк с вертикальным отступом 28; 11 - во всех режимах видны только 200 строк с вертикальным отступом 56. В режиме NTSC результат 00 и 01 будет идентичным, а в режиме PAL значения 01,10,11 будут отображать растянутый по горизонтали кадр с чёрными полосками высотой в 28 пикселов сверху и снизу. Режимы видимости Devices/FastRAM в области #F400...#F7FF (порт ¹0 по адресу #F7FF всегда виден, если не запрещён): 00 - Devices only (плюс порт #F7FF, который запрещается отдельно);. 01 - Devices+FastRAM (периферия только по стандартным адресам, а между ними - ОЗУ); 10 - Keyboard+FastRAM (из устройств по своим адресам находится только клавиатура, а во всех остальных адресах - ОЗУ); 11 - FastRAM (все устройства спрятаны). Плюс ко всему в области #F6xx планируется быть шина NI-15, полностью видимая только в режиме 00 | | | | |
Всё что касается видео решил убрать в порт №4 (#FB00), который в оригинальном Орионе предполагался для опционального текстового режима и просто уходил наружу. Как мы уже выяснили, в NTSC впритык может влезть 240 линий, соответственно этот вариант тоже надо поддержать наряду с обычными 256 и урезанными 200. Потом кроме 384 по горизонтали можно сделать 480 (есть такая модификация для 80 символов в строке), а также для разнообразия 320 и предел по максимуму - 512 (годится как для PAL, так и для NTSC). Вобщем как-то так: Биты 0 и 1: 00 - 320 пикселов в строке; 01 - 384 пиксела в строке (значение по умолчанию); 10 - 480 пикселов в строке; 11 - 512 пикселов в строке. Биты 2 и 3: 00 - 200 линий в кадре (совместимо с NTSC); 01 - 240 линий в кадре (совместимо с NTSC); 10 - 256 линий в кадре (значение по умолчанию - в режиме NTSC будет видно только верхние 240); 11 - аппаратный текстовый режим 80x25 (на будущее). P.S. Бит 4 может включать режим бордюра, когда заливка фона берётся из адреса xx11 1111 ? P.P.S. Соответственно портом опционального горизонтального скроллинга станет #FB01...
|
10 Dec 2013 21:09 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
| | | | Shaos wrote: Поразбирался я тут с SIMM30 и вот что получается: Порт 2 (который #F900), как известно, выбирает подключаемую страницу и мы обозначим его содержимое так: P7 P6 P5 P4 P3 P2 P1 P0 Причём в Орионе-128/256 в этому порту используются только биты P0 и P1. Нам надо иметь 2 одинаковые симки, т.к. инфу из видеопамяти логичнее брать параллельно из двух страниц, соответственно бит P0 порта ¹2 всегда будет обозначать какую из двух симок мы подключаем в область адресного пространства (0 - симку с точками, 1 - симку с цветом). SIMM30 бывают размером 256К, 1М и 4М (причём все поддерживают HIDDEN CAS-before-RAS). Разбиение по RAS/CAS придётся делать по разному для разных размеров: Как видим P0 тут не участвует, т.к. используется для выбора симки. Свободный бит P7 можно задействовать скажем для подключения ром-диска размером до 8 мегов в непосредственное адресное пространство процессора вместо симов. | | | | |
Придумал как настраивать тип SIMM-ов всего двумя джамперами, перепутав адресные сигналы:
Джамперы J1 и J2 будут выбирать что поставлено - 2x256K, 2x1M или 2x4M. Плюс к этому можно добавить джамперы J3 и J4, которые будут выбирать нужную четверть 2x16M, если кто-то захочет их поставить, т.е. например так можно частично-битую 16M симку заюзать, а можно и ноль на эти адресные входы подать...
P.S. На самом деле джамперов надо в 2 раза больше, т.к. надо единообразно переключать как адреса с видеоконтроллера, так и адреса с процессора! Единственное отличие заключается лишь в том, что переключаемые P4 и P5 в случае видеоконтроллера не существуют - там будет земля...
|
11 Dec 2013 18:08 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
При 10 МГц пиксельклоке мы будем иметь 641 пиксель в строке PAL (50 Гц, 312 строк) и 637 пикселя в строке NTSC (59.94 Гц, 262 строки). Цифры для разных разрешений:
512 пикселов по горизонтали: строчный синхроимпульс начинается в 539 и кончается в 586
480 пикселов по горизонтали: строчный синхроимпульс начинается в 523 и кончается в 570
384 пикселов по горизонтали: строчный синхроимпульс начинается в 475 и кончается в 522
320 пикселов по горизонтали: строчный синхроимпульс начинается в 443 и кончается в 490
256 пикселов по вертикали в PAL: кадровый синхроимпульс в строках 279,280,281
240 пикселов по вертикали в PAL: кадровый синхроимпульс в строках 271,272,273
200 пикселов по вертикали в PAL: кадровый синхроимпульс в строках 251,252,253
240 пикселов по вертикали в NTSC: кадровый синхроимпульс в строках 243,244,245
200 пикселов по вертикали в NTSC: кадровый синхроимпульс в строках 223,224,225
|
11 Dec 2013 20:38 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
Второй чип готов - этот уже в xc9572xl (в 9536 не влезает):
| | | | Code: ---------------------------------------------------------------------------------- -- Company: nedoPC.org -- Engineer: Shaos -- -- Create Date: 00:26:44 12/03/2013 -- Design Name: orionix counter -- Module Name: main - Behavioral -- Project Name: Orionix-2013 -- Target Devices: xc9572xl -- Tool versions: ISE 14.7 -- Description: 2nd CPLD chip for Orionix-2013 -- -- Dependencies: -- -- Revision: 0.04 -- Revision 0.01 - File Created -- Additional Comments: -- This design is Public Domain ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values -- use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating -- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all;
entity main is Port ( CLR : in STD_LOGIC; CLK10 : in STD_LOGIC; NTSC : in STD_LOGIC; WRP4 : in STD_LOGIC; ALE : in STD_LOGIC; AD0 : in STD_LOGIC; AD1 : in STD_LOGIC; AD2 : in STD_LOGIC; AD3 : in STD_LOGIC; H0 : out STD_LOGIC; H1 : out STD_LOGIC; H2 : out STD_LOGIC; H3 : out STD_LOGIC; H4 : out STD_LOGIC; H5 : out STD_LOGIC; H6 : out STD_LOGIC; H7 : out STD_LOGIC; H8 : out STD_LOGIC; H9 : out STD_LOGIC; V0 : out STD_LOGIC; V1 : out STD_LOGIC; V2 : out STD_LOGIC; V3 : out STD_LOGIC; V4 : out STD_LOGIC; V5 : out STD_LOGIC; V6 : out STD_LOGIC; V7 : out STD_LOGIC; V8 : out STD_LOGIC; V9 : out STD_LOGIC; RAS : out STD_LOGIC; CAS : out STD_LOGIC; VID : out STD_LOGIC; SYNC : out STD_LOGIC; EX : out STD_LOGIC); end main;
architecture Behavioral of main is signal HTMP : STD_LOGIC_VECTOR(9 downto 0); signal VTMP : STD_LOGIC_VECTOR(9 downto 0); signal HSYNC : STD_LOGIC; signal VSYNC : STD_LOGIC; signal HSIZE : STD_LOGIC_VECTOR(1 downto 0); signal VSIZE : STD_LOGIC_VECTOR(1 downto 0); signal A : STD_LOGIC_VECTOR(3 downto 0); begin
process (CLR,CLK10,HTMP(0)) is begin if CLR='0' then CAS <= '1'; RAS <= '1'; else if CLK10='1' and HTMP(0)='0' then CAS <= '0'; else CAS <= '1'; end if; if CLK10='0' and HTMP(0)='1' then RAS <= '1'; else RAS <= '0'; end if; end if; end process;
process (CLR,ALE,HTMP(0),AD0,AD1,AD2,AD3) is begin if CLR='0' then EX <= '1'; A <= "0000"; elsif ALE'event and ALE='0' then if HTMP(0)='1' then EX <= '0'; end if; A(0) <= AD0; A(1) <= AD1; A(2) <= AD2; A(3) <= AD3; end if; end process;
process (CLR,VSYNC,HSYNC) is begin if CLR='0' then SYNC <= '1'; elsif VSYNC='1' or HSYNC='1' then SYNC <= '0'; else SYNC <= '1'; end if; end process;
process (CLR,WRP4,AD0,AD1,AD2,AD3) begin if CLR='0' then HSIZE <= "01"; VSIZE <= "10"; elsif WRP4'event and WRP4='1' and A="0000" then HSIZE(0) <= AD0; HSIZE(1) <= AD1; VSIZE(0) <= AD2; VSIZE(1) <= AD3; end if; end process;
process (CLR,CLK10) is begin
if CLR='0' then HTMP <= "0000000000"; VTMP <= "0000000000"; VID <= '1';
elsif CLK10'event and CLK10='0' then
if ((HSIZE="00" and HTMP<320) or (HSIZE="01" and HTMP<384) or (HSIZE="10" and HTMP<480) or (HSIZE="11" and HTMP<512) )and ((VSIZE="00" and VTMP<200) or (VSIZE="01" and VTMP<240) or (VSIZE="10" and VTMP<240 and NTSC='1') or (VSIZE="10" and VTMP<256 and NTSC='0') )then VID <= '1'; else VID <= '0'; end if;
if (NTSC='0' and VSIZE="00" and (VTMP=251 or VTMP=252 or VTMP=253)) or (NTSC='0' and VSIZE="01" and (VTMP=271 or VTMP=272 or VTMP=273)) or (NTSC='0' and VSIZE="10" and (VTMP=279 or VTMP=280 or VTMP=281)) or (NTSC='1' and VSIZE="00" and (VTMP=223 or VTMP=224 or VTMP=225)) or (NTSC='1' and (VSIZE="01" or VSIZE="10") and (VTMP=243 or VTMP=244 or VTMP=245)) then VSYNC <= '1'; else VSYNC <= '0'; end if;
if (HSIZE="00" and HTMP>442 and HTMP<490) or (HSIZE="01" and HTMP>474 and HTMP<422) or (HSIZE="10" and HTMP>522 and HTMP<570) or (HSIZE="11" and HTMP>538 and HTMP<586) then HSYNC <= '1'; else HSYNC <= '0'; end if;
HTMP <= HTMP + 1;
if (NTSC='0' and HTMP=641) or (NTSC='1' and HTMP=637) then HTMP <= "0000000000"; VTMP <= VTMP + 1; end if;
if (NTSC='0' and VTMP=312) or (NTSC='1' and VTMP=262) then VTMP <= "0000000000"; end if;
end if; end process;
H0 <= HTMP(0); H1 <= HTMP(1); H2 <= HTMP(2); H3 <= HTMP(3); H4 <= HTMP(4); H5 <= HTMP(5); H6 <= HTMP(6); H7 <= HTMP(7); H8 <= HTMP(8); H9 <= HTMP(9);
V0 <= VTMP(0); V1 <= VTMP(1); V2 <= VTMP(2); V3 <= VTMP(3); V4 <= VTMP(4); V5 <= VTMP(5); V6 <= VTMP(6); V7 <= VTMP(7); V8 <= VTMP(8); V9 <= VTMP(9);
end Behavioral;
| | | | |
что компилируется вот так:
UPD 13-DEC-2013: Кое-что поправил в генерации...
Last edited by Shaos on 13 Dec 2013 00:32, edited 1 time in total.
|
11 Dec 2013 23:03 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
Ну и третий чип (xc9572xl), являющийся по сути 12-битным сумматором:
Статистика:
Этот опциональный чип позволяет делать горизонтальный скроллинг с шагом 8 пикселов либо в пределах 64К (когда старший бит порта #FB00 равено 0), либо в пределах 1М (когда старший бит порта #FB00 равен 1). Смещение задаётся в портах #FB02 (средний байт) и #FB03 (старшие 4 бита) - всего 12 бит, но так как при горизонтальном скроллинге младший бит адреса не меняется, то это нам даёт 12+8=20 бит (адресует 1 мегабайт). 12 бит выбрано потому, что 8 уже не влезало в xc9536xl (изначально я хотел ограничиться 8-битным сумматором), а 14 бит (максимум возможного при 2x4MB) не влезало в xc9572xl - соответственно я откатился на меньшее "круглое" число, охватывающее 1 Мб видеопамяти...
P.S. Если чип не устанавливать, то VA[0..7] надо просто подсоединить перемычками к VAO[0..7], а на VAO[8..11] подать землю - тогда это будет классический Орион с четырьмя экранами (VA[6] и VA[7] подсоединены к выходам IS0 и IS1 первого чипа, а VA[0...5] - к выходам H3...H7 второго).
P.P.S.#FB01 оставил на будущее - под младшую часть сдвига адреса видеопамяти (для реализации полуаппаратного вертикального скролла)...
|
12 Dec 2013 01:52 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
Подвожу итоги: Orionix-2013 1st Chip:ВХОДЫ: CLR : очистка (подключается к /RESET) AD0...AD7 : мультиплексированная шина данных-адреса от процессора A8...A15 : старший байт адреса от процессора ALE : сигнал наличия адреса на мультиплексированной шине от процессора WR : сигнал записи (подключается к /WR процессора) SAND : сигнал чтения инструкции (S1 & S2) - используется для начального пуска (при обращении ко второй инструкции ПЗУ 2K убирается из адресного пространства на своё место с адреса #F800) ВЫХОДЫ: CSRAM : сигнал разрешения динамической памяти CSRAM2 : сигнал разрешения ОЗУ 2К (#F000...#F3FF или #F000...#F7FF) CSROM2 : сигнал разрешения ПЗУ 2К (#F800...#FFFF, но после ресета покрывает всё адресное пространство процессора для начального пуска) CSKB : сигнал разрешения порта клавиатуры (по адресу #F4xx) CSD1 : сигнал разрешения первого пользовательского устройства (по адресу #F5xx) CSD2 : сигнал разрешения второго пользовательского устройства (по адресу #F6xx) CSEX : сигнал разрешения платы расширения (по адресу #F7xx) VM0...VM2 : выходы регистра видережима (порт №1 доступный на запись по адресу #F8xx) WRP2 : сигнал записи во внешний регистр выбора страницы памяти (порт №2 доступный на запись по адресу #F9xx) IS0,IS1 : инвертированные выходы регистра выбора экранной области (порт №3 доступный на запись по адресу #FAxx) WRP4 : сигнал записи во внешние регистры видеоконтроллера (порт №4 доступный на запись по адресу #FBxx) Orionix-2013 2nd Chip:ВХОДЫ: CLR : очистка (подключается к /RESET) CLK10 : тактирование 10 МГц NTSC : сигнал включения режима NTSC WRP4 : вход сигнала записи в регистры видеоконтроллера ALE : сигнал наличия адреса на мультиплексированной шине от процессора AD0...AD3 : младшая половина мультиплексированной шины данных-адреса от процессора ВЫХОДЫ: H0...H9 : горизонтальная координата (сигнал H9 необязателен) V0...V9 : вертикальная координата (сигналы V8 и V9 необязательны) RAS : сигнал ввода адреса рядов для динамической памяти CAS : сигнал ввода адреса столбцов для динамической памяти VID : сигнал прохождения через область видео изображения SYNC : сигнал синхронизации (совмещённая горизонтальная и вертикальная синхра) EX : инверсный сигнал исключительной ситуации (подключается к схеме ресета) Orionix-2013 3rd Chip (optional):ВХОДЫ: CLR : очистка (подключается к /RESET) AD<0>...AD<7> : мультиплексированная шина данных-адреса от процессора ALE : сигнал наличия адреса на мультиплексированной шине от процессора WRP4 : вход сигнала записи в регистры видеоконтроллера VA<0>...VA<7> : вход немодифицированного адреса видеопамяти ВЫХОДЫ: VAO<0>...VAO<11> : выход модифицированного адреса видеопамяти Тут остаются свободными три ноги (12,20,44). VA[6] и VA[7] подсоединены к выходам IS0 и IS1 первого чипа, а VA[0...5] - к выходам H3...H7 второго. Как я уже писал - если третий чип не устанавливается, то VA[0..7] надо просто подсоединить перемычками к VAO[0..7], а на VAO[8..11] подать землю - тогда это будет классический Орион с четырьмя экранами (без возможности горизонтального скроллинга).
|
13 Dec 2013 02:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22576 Location: Silicon Valley
|
А теперь самое интересное - как этот чип может помочь превратить Орион в чёрно-белый Специалист
Если мы поставим себе задачу, заставить работать только те программы, которые пользуются стандартными точками входа монитора (#C8xx), то надо просто написать программку-транслятор этих вызовов в монитор Ориона, располагающуюся c адреса #C800, а далее делаем некоторые действия для перемещения экрана в нестандартный для Ориона адрес #9000:
MVI A,3 ; задаём базовый адрес экрана #0000
STA #FA00
MVI A,#90 ; прибавляем к нему #9000
STA #FB02
или
MVI A,2 ; задаём базовый адрес экрана #4000
STA #FA00
MVI A,#50 ; прибавляем к нему #5000
STA #FB02
или
MVI A,1 ; задаём базовый адрес экрана #8000
STA #FA00
MVI A,#10 ; прибавляем к нему #1000
STA #FB02
ну или совсем хитро:
XRA A ; задаём базовый адрес экрана #C000 (уже должно быть по умолчанию)
STA #FA00
MVI A,#D0 ; прибавляем к нему #D000
STA #FB02
P.S. последнее будет работать только если у нас видеокольцо 64КB - не 1MB, т.к. для 1MB придётся ещё и старший байт задать:
MVI A,#0F
STA #FB03
|
13 Dec 2013 14:26 |
|
|
Who is online |
Users browsing this forum: No registered users and 13 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|