nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 15 Jun 2019 14:56



Reply to topic  [ 3 posts ] 
4-trit Processor 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
В заглавии этого форума есть следующие слова: (прошлое, настоящее, будущее)...

Будущее, как мы тут многие (хотя и не все) считаем, должно принять во внимание троичную логику. :wink:
Поэтому небольшой проект 4-тритного компьютера, основанного на троичной логике, я и решил представить
именно здесь, поскольку основные схемотехнические решения позаимствованы мной из моего же собственного
проекта 4-bit Processor.

Для воплощения третьего неопределённого состояния логики я решил использовать тот факт, что наложение
логической единицы на логический ноль Proteus воспринимает как логический конфликт, но амплитуду
в точке логического конфликта трактует как среднее состояние между логическим нулём и логической
единицей, что, собственно и соответствует состоянию "неопределено", "неизвестно" троичной логики.
Attachment:
Tri_logic.gif
Tri_logic.gif [ 76.49 KiB | Viewed 737 times ]

С точки зрения "математики" библиотек *.dll Proteus-a это состояние ничуть не хуже и не лучше всех
остальных состояний, которые Proteus способен учесть, анализируя логические схемы:

Image

Единственное, что несколько омрачает эту идею, схемотехника устройства при использовании состояния
логического конфликта в качестве логического "неопределено" или "неизвестно" должна быть в значительной
мере корректной, чтобы избегать реальных логических конфликтов, которые будут теперь трактоваться
как конкретный логический уровень.

Итак, я решил делать процессор 4-тритным, поскольку схемотехника 4-разрядного процессора была мной
хорошо проработана
, а во-вторых, это позволяет более или менее корректно сравнить 4-битный процессор
с его 4-тритным эквивалентом.

И вот что у меня на этой стезе получилось:
Image

 Схема в большом разрешении
Image

Поскольку двоичная логика является подмножеством троичной логики, но элементы троичной логики обходятся
в данный момент весьма дорого, я решил, что троичные логические элементы должны быть лишь там где это
сугубо необходимо, чтобы проект осуществлял троичные операции.
В этой связи управление в значительной мере выполнено на двоичной логике, ПЗУ микрокоманд - двоичное,
ОЗУ и системное ПЗУ - двоичные. Троичные значения сохраняются и извлекаются в формате BCT.
Адрес декодируется через дешифратор 3 - в - 2.

Программный счётчик РС 8-тритный, что даёт нам 6561 независиый адрес для хранения троичных кодов.
В двоичном 4-битном компьютере РС был 12-разрядный, что давало всего 4096 ячеек памяти.
Троичность позволила зело упростить схемотехнику узла без потери количественной характеристики.

Карта памяти и программная модель 4-тритного компьютера с 8-тритной шиной адреса выглядят следующим
образом:
Image
Регистр А - аккумулятор.
Регистр В - обычно второй аргумент, но и temp-регистр для многих операций.
Регистр F - флаги, троичных флагов два: C - carry (перенос) S - sign (знак).
Два троичных флага сохраняются как 6 двоичных, при этом появляется Z и NZ... etc.

4-разрядная шина данных в троичном процессоре позволяет передать 81 независимый код.

АЛУ при работе со знаковыми аргументами работает в диапазоне -40 ... 0 ... +40.

Возможна 81 оригинальная команда данного процессора.
С командами я поступил в этот раз несколько иначе: я добавлял их понемногу в набор и пробовал
программировать. Если выразительных средств не хватало, добавлял еще команд.

В итоге на данный момент минимальный набор команд следующий:
 Система команд 4-тритного ЦПУ
Image
Image
Image

Я в этом наборе программировал довольно успешно, и без особых неудобств.

Бросается в глаза, что опять в наборе нет CALL и RET - это сделано сейчас специально. 8)
Аппаратные средства заложены на CALL, RET и INT (а он с ними связан).
Но уж больно мне захотелось попробовать одну древнюю идею Сеймура Крея. В системе команд
его компьютера не было CALL и RET, но было указание, что если они вам очень нужны -
реализуйте их программно! :wink: Я попробовал - и получилось! :o

Я пока не выкладываю никаких библиотек и проектов, поскольку версия проекта - Alfa, а альфа-
тестирование обычно проводится силами штатных разработчиков
. ©

Так что в заключение - видео, как всё это реально работает:
 Ternary computer video

Я уже посмотрел это видео с разных компьютеров и отметил, что Ютуб зачастую снижает качество
картинки, что для схемотехники весьма неприятно. Оригинальный материал можно взять здесь.

Я не накладывал на изображение музыки, чтобы не нарушать ничьих авторских прав...
Но сейчас посмотрел в папку, откуда я выкладываю картинки:
C:\Tri_CPU_SyScmd1.gif
C:\Tri_CPU_SyScmd2.gif
C:\Tri_CPU_SyScmd3.gif
C:\Tri_MemoryMap3.gif
C:\Triplo_Max_-_Shadow
:roll:
Вот Tri_plo_Max_-_Shadow - вполне можно послушать фоном для этого ролика... :D

_________________
iLavr


14 Mar 2019 15:07
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Проект разрабатывался в Proteus 6.7 Pro под Windows 98, dll-библиотеки элементов троичной логики
были скомпилированы Microsoft Visual C++ 5.0 под Windows 98.
Проект тестировался в Proteus 7.7 Pro под Windows 7 и в Proteus 8.5 под Windows 10, (за него -
огромное спасибо коллеге PVV !
)
.
Захват видео сделан как раз в Proteus 8.5 под Windows 10, поскольку там более мощный компьютер.

Модель троичного процессора выполняет демонстрационную программу вывода на дисплей LCD Nokia 3310
четырёх демонстрационных изображений и опроса четырёх кнопок, согласно нажатию которых и выводится
соответствующее изображение:
Attachment:
TernCPU_7.gif
TernCPU_7.gif [ 41.83 KiB | Viewed 675 times ]

Скриншоты дисплеев отличаются, поскольку Proteus 8.5 не поддерживает почему-то старую модель LCD-дисплея
Nokia 3310
, но у него есть в наборе 3 модели этого дисплея, менее красочные, но зато и без фоновой надписи
Demo Version...

Заполнение экрана кодом и вывод шахматной клетки я не стал захватывать на видео как менее информативные
изображения, лишь увеличивающие размер видео-файла.

Демонстрационная программа была написана в кодах, и в бинарник собиралась вручную через WinHEX.
 Демонстрационная программа .ASM
Code:
;-------------------------------------------------------
;   Демонстрационная программа троичного процессора
;   Очистка экрана, растровое изображение, клетка.
;-------------------------------------------------------
; Примечание:
; novenary - девятиричный; 9, девять, Novem - латынь;
; Л.Г.Суменко. Англо-русский словарь по информационным
; технологиям. М.: ГП ЦНИИС, 2003.
;
; ADDRESS
;HEX = NOVEM;
;---------- В странице 0 - различные переменные и адреса вызовов
000H = 0000  A8  MVA; 00Hex;
001H = 0001  AA  00N;
002H = 0002  69  OUT; 00N;
003H = 0003  AA  00N; сброс порта 0, программный RESET LCD;
004H = 0004  86  JMP; FAR 0416N;
005H = 0005  A0  04N;
006H = 0006  A1  05N;
007H = 0007
008H = 0008
009H = 0010
00AH = 0011
00BH = 0012
00CH = 0013
00DH = 0014
00EH = 0015
00FH = 0016
010H = 0017
011H = 0018
012H = 0020
013H = 0021
014H = 0022
015H = 0023
016H = 0024
017H = 0025
018H = 0026
019H = 0027
01AH = 0028
01BH = 0030
01CH = 0031
01DH = 0032
01EH = 0033
01FH = 0034
020H = 0035
021H = 0036
022H = 0037
023H = 0038
024H = 0040
025H = 0041
026H = 0042
027H = 0043
028H = 0044
029H = 0045
02AH = 0046
02BH = 0047
02CH = 0048
02DH = 0050
02EH = 0051
02FH = 0052
030H = 0053
031H = 0054
032H = 0055
033H = 0056
034H = 0057
035H = 0058
036H = 0060
037H = 0061
038H = 0062
039H = 0063
03AH = 0064
03BH = 0065
03CH = 0066
03DH = 0067
03EH = 0068
03FH = 0070
040H = 0071
041H = 0072
042H = 0073
043H = 0074
044H = 0075
045H = 0076
046H = 0077  A8  01N; возврат из вывода растра;
047H = 0078  AA  00N;
048H = 0080  A8  01N; возврат из заполнения клеткой;
049H = 0081  AA  00N;
04AH = 0082  AA  00N; возврат из X=0, Y=0;
04BH = 0083  AA  00N;
04CH = 0084  A8  01N; возврат из заполнения экрана;
04DH = 0085  AA  00N;
04EH = 0086  55  88N; 0FH  - слово заполнения экрана
04FH = 0087  54  87N; храним счетчик
050H = 0088  AA  00N; храним режим индикатора
;---------- В странице 1 основные циклы и клавиатура
; 4 - 86  Коды
; 3 - 82  нажатия
; 2 - 68  клавиш.
; 1 - 28
051H = 0100  6A  IN;  читаем порт 3;
052H = 0101  A2  03N; если не нажато - 88N = 40D = 1111;
053H = 0102  14  ROR; сдвинем вправо --> C;
054H = 0103  50  SKIP CP; есть перенос +;
055H = 0104  85  JMP S; ---> Pressed '4';
056H = 0105  96  26N;
057H = 0106  AA  NOP; для SKIP;
058H = 0107  14  ROR; сдвинем вправо --> C;
059H = 0108  50  SKIP CP; есть перенос +;
05AH = 0110  85  JMP S; ---> Pressed '3';
05BH = 0111  25  38N;
05CH = 0112  AA  NOP; для SKIP;
05DH = 0113  14  ROR; сдвинем вправо --> C;
05EH = 0114  50  SKIP CP; есть перенос +;
05FH = 0115  85  JMP S; ---> Pressed '2';
060H = 0116  09  42N;
061H = 0117  AA  NOP; для SKIP;
062H = 0118  14  ROR; сдвинем вправо --> C;
063H = 0120  50  SKIP CP; есть перенос +;
064H = 0121  85  JMP S; ---> Pressed '1';
065H = 0122  62  63N;
066H = 0123  AA  NOP; для SKIP;
067H = 0124  85  JMP S; ---> 0100N;
068H = 0125  AA  00N; -> в цикл: читаем порт 3;

;----------- Pressed '4' - заполнение клеткой
069H = 0126  A8  MVA;
06AH = 0127  A8  01N;
06BH = 0128  A5  STA Z;
06CH = 0130  5A  80N;
06DH = 0131  A8  MVA;
06EH = 0132  AA  00N;
06FH = 0133  A5  STA Z; [0080] - возврат из заполнения клеткой;
070H = 0134  58  81N;
071H = 0135  86  JMP; FAR 0300N;
072H = 0136  A2  03N;
073H = 0137  AA  00N;

;----------- Pressed '3'
074H = 0138  86  JMP; FAR 2675N;
075H = 0140  96  26N; в цикл
076H = 0141  41  75N; второй заставки (переход исправлен)

;----------- Pressed '2' - очистка экрана байтом;
077H = 0142  A8  MVA;
078H = 0143  A8  01N;
079H = 0144  A5  STA Z;
07AH = 0145  50  84N;
07BH = 0146  A8  MVA;
07CH = 0147  AA  00N;
07DH = 0148  A5  STA Z; [0084N] адрес возврата из процедуры
07EH = 0150  51  85N;   очистка экрана байтом = 0100N;

07FH = 0151  A8  MVA;
080H = 0152  A9  02N;
081H = 0153  A5  STA Z;
082H = 0154  59  82N;
083H = 0155  A8  MVA;
084H = 0156  21  35N;
085H = 0157  A5  STA Z; [0082N] адрес возврата из процедуры
086H = 0158  52  83N;    X = 0; Y = 0; => 0235N;
087H = 0160  86  JMP; FAR 0200N;
088H = 0161  A9  02N;
089H = 0162  AA  00N;

;----------- Pressed '1' - заполнение экрана точечным рисунком;
08AH = 0163  A8  MVA;
08BH = 0164  A8  01N;
08CH = 0165  A5  STA Z;
08DH = 0166  44  77N;
08EH = 0167  A8  MVA;
08FH = 0168  AA  00N;
090H = 0170  A5  STA Z; [0077N] адрес возврата из процедуры
091H = 0171  45  78N;   вывода растра; => 0100N;

092H = 0172  A8  MVA;
093H = 0173  A8  01N;
094H = 0174  A5  STA Z;
095H = 0175  59  82N;
096H = 0176  A8  MVA;
097H = 0177  50  84N;
098H = 0178  A5  STA Z; [0082N] адрес возврата из процедуры
099H = 0180  52  83N;    X = 0; Y = 0; вызов => 0200N ---> 0184N;

09AH = 0181  86  JMP; FAR 0200N - вызов процедуры X = 0; Y = 0;
09BH = 0182  A9  02N;
09CH = 0183  AA  00N;
;----------- возврат будет сюда:
09DH = 0184  A8  MVA; адрес, с которого начинается
09EH = 0185  94  27N; массив точечного изображения
09FH = 0186  86  JMP; FAR 0500N - вызов процедуры вывода растра;
0A0H = 0187  A1  05N;
0A1H = 0188  AA  00N;
;---------- В странице 2 - очистка экрана байтом;
;---------- Процедура X = 0; Y = 0; с возвратом;
0A2H = 0200  A8  MVA; ii11;
0A3H = 0201  A5  03H; ii11 - бит 2 D/C в состоянии "0"-команды
0A4H = 0202  69  OUT; 00N; включаем "CS" индикатора
0A5H = 0203  AA  00N; бит 2 D/C в состоянии "0"-команды

0A6H = 0204  A8  MVA; 00H - Low;
0A7H = 0205  AA  00N; iiii;
0A8H = 0206  69  OUT; P1N;
0A9H = 0207  A8  01N;
0AAH = 0208  A8  MVA; 04H - High;
0ABH = 0210  9A  04H; i1ii;
0ACH = 0211  69  OUT; P2N;
0ADH = 0212  A9  02N; 40h - в индикатор ; set Y = 0 - выбор строки;
0AEH = 0213  69  OUT; P1N;
0AFH = 0214  A8  01N; остановим сдвиг

0B0H = 0215  A8  MVA; 00H - Low;
0B1H = 0216  AA  00N; iiii;
0B2H = 0217  69  OUT; P1N;
0B3H = 0218  A8  01N;
0B4H = 0220  A8  MVA; 08H - High;
0B5H = 0221  6A  08H; 1iii;
0B6H = 0222  69  OUT; P2N;
0B7H = 0223  A9  02N; 80h - в индикатор ; set X = 0 - выбор позиции в строке;
0B8H = 0224  69  OUT; P1N;
0B9H = 0225  A8  01N; остановим сдвиг

0BAH = 0226  A8  MVA;
0BBH = 0227  95  07H; i111 - бит "D/C" в состоянии "1"-данные;
0BCH = 0228  A5  STA Z; сохраним режим индикатора
0BDH = 0230  55  88N; ниже 100N в "0"-странице;
0BEH = 0231  69  OUT; 00N; включаем "CS" индикатора и
0BFH = 0232  AA  00N; бит 2 D/C в состояние "1"-данные;
;---------------------Приём данных с X = 0; Y = 0; -------------
0C0H = 0233  91  JMP ZI; [0082N];
0C1H = 0234  59  82N;  косвенный выход по адресу [0082N];

;---------------------------------------------------
; счетчик 1F8 = (48/8)строк*84байта=6*84=504байта;
; 81*6=486(в циклах)+18(байт остаток)=504;
;------------- цикл очистки экрана словом 1111 -----
0C2H = 0235  A8  MVA; 06H - раз по 81;
0C3H = 0236  18  06D;
0C4H = 0237  A5  STA Z; сохраним счетчик по 81;
0C5H = 0238  54  87N; ниже 100N-2 в "0"-странице;

0C6H = 0240  A9  LDA Z; читаем [86N]; <--- 0240N;
0C7H = 0241  56  86N;  слово заполнения экрана

0C8H = 0242  A2  MVB; обнулим B (счетчик 0 ... 80)
0C9H = 0243  00  00D; 44N;
0CAH = 0244  69  OUT; P1N <--- 0244N;
0CBH = 0245  A8  01N;
0CCH = 0246  69  OUT; P2N;
0CDH = 0247  A9  02N; в индикатор - слово заполнения -
0CEH = 0248  69  OUT; P1N;
0CFH = 0250  A8  01N; остановим сдвиг

0D0H = 0251  92  XCAB; A<->B
0D1H = 0252  29  INC;  A(= B+1)
0D2H = 0253  92  XCAB; A<->B
0D3H = 0254  41  SKIP Z
0D4H = 0255  85  JMP S; ---> 0244N;
0D5H = 0256  00  44N;
0D6H = 0257  AA  NOP; для SKIP;

0D7H = 0258  A9  LDA Z; читаем счетчик по 81;
0D8H = 0260  54  87N; ниже 100N-2 в "0"-странице;
0D9H = 0261  22  DEC; A
0DAH = 0262  A5  STA Z; сохраним счетчик по 81;
0DBH = 0263  54  87N; ниже 100N-2 в "0"-странице;
0DCH = 0264  41  SKIP Z
0DDH = 0265  85  JMP S; ---> 0240N;
0DEH = 0266  0A  40N;
0DFH = 0267  AA  NOP; для SKIP;------------------

0E0H = 0268  A9  LDA Z; читаем [86N]; <--- 0268N;
0E1H = 0270  56  86N;  слово заполнения экрана
0E2H = 0271  A2  MVB; B - (счетчик 18 ... 0)
0E3H = 0272  60  64N; 18D ------- последних байт;
0E4H = 0273  69  OUT; P1N <--- 0273N;
0E5H = 0274  A8  01N;
0E6H = 0275  69  OUT; P2N;
0E7H = 0276  A9  02N; в индикатор - слово заполнения -
0E8H = 0277  69  OUT; P1N;
0E9H = 0278  A8  01N; остановим сдвиг

0EAH = 0280  92  XCAB; A<->B
0EBH = 0281  22  DEC;  A(= B-1)
0ECH = 0282  92  XCAB; A<->B
0EDH = 0283  41  SKIP Z
0EEH = 0284  85  JMP S; ---> 0273N;
0EFH = 0285  42  73N;
0F0H = 0286  AA  NOP; для SKIP;
0F1H = 0287  91  JMP ZI; [0084N];
0F2H = 0288  50  84N;  косвенный выход по адресу [0084N];

;---------- В странице 3 - заполнение экрана шахматной клеткой;
0F3H = 0300  A8  MVA; ii11;
0F4H = 0301  A5  03H; ii11 - бит 2 D/C в состоянии "0"-команды

0F5H = 0302  69  OUT; 00N; включаем "CS" индикатора
0F6H = 0303  AA  00N; бит 2 D/C в состоянии "0"-команды
0F7H = 0304  A8  MVA; 00H - Low;
0F8H = 0305  AA  00N; iiii;
0F9H = 0306  69  OUT; P1N;
0FAH = 0307  A8  01N;
0FBH = 0308  A8  MVA; 04H - High;
0FCH = 0310  9A  04H; i1ii;
0FDH = 0311  69  OUT; P2N;
0FEH = 0312  A9  02N; 40h - в индикатор ; set Y = 0 - выбор строки;
0FFH = 0313  69  OUT; P1N;
100H = 0314  A8  01N; остановим сдвиг

101H = 0315  A8  MVA; 00H - Low;
102H = 0316  AA  00N; iiii;
103H = 0317  69  OUT; P1N;
104H = 0318  A8  01N;
105H = 0320  A8  MVA; 08H - High;
106H = 0321  6A  08H; 1iii;
107H = 0322  69  OUT; P2N;
108H = 0323  A9  02N; 80h - в индикатор ; set X = 0 - позиция в строке;
109H = 0324  69  OUT; P1N;
10AH = 0325  A8  01N; остановим сдвиг

10BH = 0326  A8  MVA;
10CH = 0327  95  07H; i111 - бит "D/C" в состоянии "1"-данные;
10DH = 0328  A5  STA Z; сохраним режим индикатора
10EH = 0330  55  88N; ниже 100N в "0"-странице;
10FH = 0331  69  OUT; 00N; включаем "CS" индикатора и
110H = 0332  AA  00N; бит 2 D/C в состояние "1"-данные;
;---------------------Приём данных с X = 0; Y = 0; -------------
;------------------- цикл заполнения экрана клеткой ------------
111H = 0333  A8  MVA; 42D - раза по 12 = 504 байта; 0260N;
112H = 0334  54  87N; 2D + 40D = 42D счетчик вверх до 0 = Z;
113H = 0335  A5  STA Z; сохраним счетчик до 42;
114H = 0336  54  87N; ниже 100N-2 в "0"-странице;
115H = 0337  A8  MVA; 88N; <--- 0337N;
116H = 0338  55  88N; 0FH  - слово заполнения экрана AA=0
117H = 0340  A2  MVB; 12D; <--- 0340N;
118H = 0341  14  57N; 12D;(счетчик байт в клетке 12 ... 0)
119H = 0342  69  OUT; P1N <--- 0342N;
11AH = 0343  A8  01N;
11BH = 0344  69  OUT; P2N;
11CH = 0345  A9  02N; в индикатор слово заполнения --->
11DH = 0346  69  OUT; P1N;
11EH = 0347  A8  01N; остановим сдвиг
11FH = 0348  92  XCAB; A<->B
120H = 0350  22  DEC;  A(= B-1)
121H = 0351  92  XCAB; A<->B
122H = 0352  41  SKIP Z
123H = 0353  85  JMP S; ---> 0342N;
124H = 0354  09  42N;
125H = 0355  AA  NOP; для SKIP;
126H = 0356  26  CMA; инвертируем байт заполнения в B (влияет на флаги)
127H = 0357  92  XCAB; A<->B сохраним байт заполнения в B;
128H = 0358  A9  LDA Z; читаем счетчик до 42; (не портит B)
129H = 0360  54  87N; ниже 100N-2 в "0"-странице;
12AH = 0361  29  INC; A - увеличим счетчик
12BH = 0362  A5  STA Z; сохраним счетчик до 42; (не портит B)
12CH = 0363  54  87N; ниже 100N-2 в "0"-странице;
12DH = 0364  92  XCAB; A<->B вернём байт заполнения в A;
12EH = 0365  41  SKIP Z
12FH = 0366  85  JMP S; ---> 0340N;
130H = 0367  0A  40N;
131H = 0368  AA  NOP; для SKIP;
132H = 0370  91  JMP ZI; [0080N];
133H = 0371  5A  80N; косвенный выход по адресу [0080N];
134H = 0372
135H = 0373
136H = 0374
137H = 0375
138H = 0376
139H = 0377
13AH = 0378
13BH = 0380
13CH = 0381
13DH = 0382
13EH = 0383
13FH = 0384
140H = 0385
141H = 0386
142H = 0387
143H = 0388
;---------- В странице 4 - процедуры для вывода на экран заставки;
144H = 0400  A8  MVA; 27N;
145H = 0401  94  27N;
146H = 0402  86  JMP; FAR - Втрое вхождение в заставку (их 18);
147H = 0403  A6  06N;
148H = 0404  AA  00N; --> 0600N; 16x5=80 - остальные вхождения;
;~~~~~~~~~~~~~~~~ВКЛЮЧЕНИЕ LCD~~~~~~~~~~~~~~~~~
149H = 0405  A8  MVA; 01Hex;
14AH = 0406  A9  01H; iii1;
14BH = 0407  69  OUT; 00N;
14CH = 0408  AA  00N; снимаем "Сброс" индикатора
14DH = 0410  A8  MVA; 03H;
14EH = 0411  A5  03H; ii11
14FH = 0412  69  OUT; 00N; включаем бит 1 - "CS" индикатора
150H = 0413  AA  00N; бит 2 D/C в состоянии "0"-команды
;~~~~~~~~~~~~~~~~ВЫДАЁМ КОМАНДЫ~~~~~~~~~~~~~~~~
; 21 C8 06 13 20 0C - строка инициализации LCD;
;~~~~~~~~~~~~~~~~INIT LCD~~~~~~~~~~~~~~~~~~~~~~
;----------  0010 0PVH Bin
;----------          H - набор инструкций; H = 0 - обычный; H = 1 - расширенный.
;----------         V -- адресация; V = 1 - после записи байта увеличивается указатель адреса строк; V = 0 - столбцов;
;----------        P --- P = 1 - кристалл включен; P = 0 - кристалл в режиме низкого энерго-потребления;
;----------  0x2......
151H = 0414  A8  MVA; 01H - Low;
152H = 0415  A9  01H; iii1;
153H = 0416  69  OUT; P1N;
154H = 0417  A8  01N;
155H = 0418  A8  MVA; 02H - High;
156H = 0420  A6  02H;
157H = 0421  69  OUT; P2N;
158H = 0422  A9  02N; в индикатор - 21H ->
159H = 0423  69  OUT; P1N;
15AH = 0424  A8  01N; остановим сдвиг
;----------  включить напряжение питания дисплея
;----------  1VVV VVVV Bin
;----------  1100 1000 = 0C8H
15BH = 0425  A8  MVA; 08H - Low;
15CH = 0426  6A  08H;
15DH = 0427  69  OUT; P1N;
15EH = 0428  A8  01N;
15FH = 0430  A8  MVA; 0CH - High;
160H = 0431  5A  0CH;
161H = 0432  69  OUT; P2N;
162H = 0433  A9  02N; в индикатор - 0C8H ->
163H = 0434  69  OUT; P1N;
164H = 0435  A8  01N; остановим сдвиг
;----------  установить температурный коэффициент
;----------  0000 01TT Bin
;----------  0000 0110 = 06H
165H = 0436  A8  MVA; 06H - Low;
166H = 0437  96  06H;
167H = 0438  69  OUT; P1N;
168H = 0440  A8  01N;
169H = 0441  A8  MVA; 00H - High;
16AH = 0442  AA  00H;
16BH = 0443  69  OUT; P2N;
16CH = 0444  A9  02N; в индикатор - 06H ->
16DH = 0445  69  OUT; P1N;
16EH = 0446  A8  01N; остановим сдвиг
;----------  выбрать систему питания
;----------  0001 0BBB Bin
;----------  0001 0011 = 13H;
16FH = 0447  A8  MVA; 03H - Low;
170H = 0448  A5  03H;
171H = 0450  69  OUT; P1N;
172H = 0451  A8  01N;
173H = 0452  A8  MVA; 01H - High;
174H = 0453  A9  01H;
175H = 0454  69  OUT; P2N;
176H = 0455  A9  02N; в индикатор - 13H ->
177H = 0456  69  OUT; P1N;
178H = 0457  A8  01N; остановим сдвиг
;----------  Набор инструкций H=0 (обычный):
;----------  0x2.....0
179H = 0458  A8  MVA; 00H - Low;
17AH = 0460  AA  00H;
17BH = 0461  69  OUT; P1N;
17CH = 0462  A8  01N;
17DH = 0463  A8  MVA; 02H - High;
17EH = 0464  A6  02H;
17FH = 0465  69  OUT; P2N;
180H = 0466  A9  02N; в индикатор - 20H ->
181H = 0467  69  OUT; P1N;
182H = 0468  A8  01N; остановим сдвиг
;----------  режимы отображения
;----------  0000 1D0E Bin
;----------        D=0, E=0 - дисплей пустой;
;----------        D=1, E=0 - обычный режим ("0" - светлая точка, "1"-тёмная);
;----------        D=0, E=1 - все элементы включены;
;----------        D=1, E=1 - режим инверсии ("1" - светлая точка, "0"-тёмная).
;----------  0000 1100 = 0CH - обычный режим ("0" - светлая точка, "1"-тёмная)
183H = 0470  A8  MVA; 0CH - Low;
184H = 0471  5A  0CH;
185H = 0472  69  OUT; P1N;
186H = 0473  A8  01N;
187H = 0474  A8  MVA; 00H - High;
188H = 0475  AA  00H;
189H = 0476  69  OUT; P2N;
18AH = 0477  A9  02N; в индикатор - 0CH ->
18BH = 0478  69  OUT; P1N;
18CH = 0480  A8  01N; остановим сдвиг

18DH = 0481  A8  MVA; 07H;
18EH = 0482  95  07H; i111;
18FH = 0483  A5  STA Z; сохраним режим индикатора
190H = 0484  55  88N; ниже 100N в "0"-странице;
191H = 0485  69  OUT; 00N; включаем "D/C" индикатора = "1"
192H = 0486  AA  00N; включаем "приём данных"

193H = 0487  A8  MVA; 27N;
194H = 0488  94  27N;----------- Первое вхождение в заставку (их 18);
;---------- В странице 5 - вывод на экран самой заставки;
;---------- сюда приходим с адресом в A = 27N = -15d -> 94;
195H = 0500  89  STA S;
196H = 0501  A6  06N; - <- ADDR_Low = 0506N; S - 06N = A6;
197H = 0502  29  INC
198H = 0503  89  STA S;
199H = 0504  88  11N; - <- ADDR_High = 0511N; S - 11N = 88;
19AH = 0505  A6  LDA S;
19BH = 0506  94  27N;   <-- ADDR_Low 57h = 0506N;
19CH = 0507  69  OUT; P1N;
19DH = 0508  A8  01N; младшая часть слова - в регистр сдвига SPI;
19EH = 0510  A6  LDA S;
19FH = 0511  95  28N; <-- ADDR_High 5Bh = 0511N;
1A0H = 0512  69  OUT; P2N;
1A1H = 0513  A9  02N; выводим в индикатор слово из памяти --->
1A2H = 0514  69  OUT; P1N;
1A3H = 0515  A8  01N; остановим сдвиг
1A4H = 0516  A6  LDA S; модифицируем в памяти
1A5H = 0517  88  11N; - <- ADDR_High;
1A6H = 0518  29  INC;   текущий адрес для следующего слова;
1A7H = 0520  50  SKIP C; есть перенос - ЭТО ПРАВИЛЬНО!!!
1A8H = 0521  85  JMP S; ---> 0500N;
1A9H = 0522  AA  00N;
1AAH = 0523  AA  NOP; для SKIP;
1ABH = 0524  86  JMP; FAR -> 0411N MVA 27N -> и в следующий блок;
1ACH = 0525  A0  04N; - 04
1ADH = 0526  AA  00N; - 11 ----- ERROR -> 0400N исправлено;
;---------- отсюда расположен блок 56 слов картинки экрана
;---------- в памяти дисплея 504 байта или 1008 по 2 слова
;---------- 56 x 18 = 1008, таких блоков требуется 18.
1AEH = 0527
1AFH = 0528
;   ...     56 байт картинки;
1E4H = 0587
1E5H = 0588
;---------- Блок 2.
1E6H = 0600
1E7H = 0601
;   ...
235H = 0687
236H = 0688
;---------- Блок 3.
237H = 0700
238H = 0701
;   ...
286H = 0787
287H = 0788
;---------- Блок 4.
288H = 0800
289H = 0801
;   ...
2D7H = 0887
2D8H = 0888
;=================================
;---------- Блок 5.
400H = 1000
401H = 1001
;   ...
43DH = 1067
43EH = 1068

44FH = 1087
450H = 1088
;---------- Блок 6.
451H = 1100
452H = 1101

4A0H = 1187
4A1H = 1188
;---------- Блок 7.
4A2H = 1200
4A3H = 1201

4F1H = 1287
4F2H = 1288
;---------- Блок 8.
4F3H = 1300
4F4H = 1301
;   ...
542H = 1387
543H = 1388
;---------- Блок 9.
544H = 1400
545H = 1401

593H = 1487
594H = 1488
;---------- Блок 10.
595H = 1500
596H = 1501
;   ...
5E4H = 1587
5E5H = 1588
;---------- Блок 11.
5E6H = 1600
5E7H = 1601
;   ...
635H = 1687
636H = 1688
;---------- Блок 12.
637H = 1700
638H = 1701
;   ...
686H = 1787
687H = 1788
;---------- Блок 13.
688H = 1800
689H = 1801
;   ...
6D7H = 1887
6D8H = 1888
;---------- Блок 14.
;========================================
800H = 2000
801H = 2001
;   ...
84FH = 2087
850H = 2088
;---------- Блок 15.
851H = 2100
852H = 2101

8A0H = 2187
8A1H = 2188
;---------- Блок 16.
8A2H = 2200
8A3H = 2201
;   ...
8F1H = 2287
8F2H = 2288
;---------- Блок 17.
8F3H = 2300
8F4H = 2301
;   ...
942H = 2387
943H = 2388
;---------- Блок 18.
944H = 2400
945H = 2401
;   ...
993H = 2487  AA  00N;
994H = 2488  AA  00N; здесь заканчивается блок картинки;
;----------- Блок переходов для картинки, 02 -> 0411 = A088; ;   ...
995H = 2500  A8  MVA; 27N; 91AA
996H = 2501  94  27N;
997H = 2502  86  JMP; FAR - Вхождение в заставку 03;
998H = 2503  A4  07N;
999H = 2504  AA  00N; --> 0700N;

99AH = 2505  A8  MVA; 27N; 91A1
99BH = 2506  94  27N;
99CH = 2507  86  JMP; FAR - Вхождение в заставку 04;
99DH = 2508  A5  08N;
99EH = 2510  AA  00N; --> 0800N;

99FH = 2511  A8  MVA; 27N; 9188
9A0H = 2512  94  27N;
9A1H = 2513  86  JMP; FAR - Вхождение в заставку 05;
9A2H = 2514  8A  10N;
9A3H = 2515  AA  00N; --> 1000N;

9A4H = 2516  A8  MVA; 27N; 9186
9A5H = 2517  94  27N;
9A6H = 2518  86  JMP; FAR - Вхождение в заставку 06;
9A7H = 2520  88  11N;
9A8H = 2521  AA  00N; --> 1100N;

9A9H = 2522  A8  MVA; 27N; 9199
9AAH = 2523  94  27N;
9ABH = 2524  86  JMP; FAR - Вхождение в заставку 07;
9ACH = 2525  89  12N;
9ADH = 2526  AA  00N; --> 1200N;

9AEH = 2527  A8  MVA; 27N; 9194
9AFH = 2528  94  27N;
9B0H = 2530  86  JMP; FAR - Вхождение в заставку 08;
9B1H = 2531  82  13N;
9B2H = 2532  AA  00N; --> 1300N;

9B3H = 2533  A8  MVA; 27N; 9122
9B4H = 2534  94  27N;
9B5H = 2535  86  JMP; FAR - Вхождение в заставку 09;
9B6H = 2536  80  14N;
9B7H = 2537  AA  00N; --> 1400N;

9B8H = 2538  A8  MVA; 27N; 9125
9B9H = 2540  94  27N;
9BAH = 2541  86  JMP; FAR - Вхождение в заставку 10;
9BBH = 2542  81  15N;
9BCH = 2543  AA  00N; --> 1500N;

9BDH = 2544  A8  MVA; 27N; 9100
9BEH = 2545  94  27N;
9BFH = 2546  86  JMP; FAR - Вхождение в заставку 11;
9C0H = 2547  86  16N;
9C1H = 2548  AA  00N; --> 1600N;

9C2H = 2550  A8  MVA; 27N; 911A
9C3H = 2551  94  27N;
9C4H = 2552  86  JMP; FAR - Вхождение в заставку 12;
9C5H = 2553  84  17N;
9C6H = 2554  AA  00N; --> 1700N;

9C7H = 2555  A8  MVA; 27N; 9111
9C8H = 2556  94  27N;
9C9H = 2557  86  JMP; FAR - Вхождение в заставку 13;
9CAH = 2558  85  18N;
9CBH = 2560  AA  00N; --> 1800N;

9CCH = 2561  A8  MVA; 27N; 9168
9CDH = 2562  94  27N;
9CEH = 2563  86  JMP; FAR - Вхождение в заставку 14;
9CFH = 2564  9A  20N;
9D0H = 2565  AA  00N; --> 2000N;

9D1H = 2566  A8  MVA; 27N; 9166
9D2H = 2567  94  27N;
9D3H = 2568  86  JMP; FAR - Вхождение в заставку 15;
9D4H = 2570  98  21N;
9D5H = 2571  AA  00N; --> 2100N;

9D6H = 2572  A8  MVA; 27N; 9149
9D7H = 2573  94  27N;
9D8H = 2574  86  JMP; FAR - Вхождение в заставку 16;
9D9H = 2575  99  22N;
9DAH = 2576  AA  00N; --> 2200N;

9DBH = 2577  A8  MVA; 27N; 9144
9DCH = 2578  94  27N;
9DDH = 2580  86  JMP; FAR - Вхождение в заставку 17;
9DEH = 2581  92  23N;
9DFH = 2582  AA  00N; --> 2300N;

9E0H = 2583  A8  MVA; 27N; 9152
9E1H = 2584  94  27N;
9E2H = 2585  86  JMP; FAR - Вхождение в заставку 18;
9E3H = 2586  90  24N;
9E4H = 2587  AA  00N; --> 2400N;
9E5H = 2588  00;--------- END ---------

9E6H = 2600
9E7H = 2601
9E8H = 2602
9E9H = 2603
9EAH = 2604
9EBH = 2605
9ECH = 2606
9EDH = 2607
9EEH = 2608
9EFH = 2610
9F0H = 2611
9F1H = 2612
9F2H = 2613
9F3H = 2614
9F4H = 2615
9F5H = 2616
9F6H = 2617
9F7H = 2618
9F8H = 2620
9F9H = 2621
9FAH = 2622
9FBH = 2623
9FCH = 2624
9FDH = 2625
9FEH = 2626
9FFH = 2627
A00H = 2628
A01H = 2630
A02H = 2631
A03H = 2632
A04H = 2633
A05H = 2634
A06H = 2635
A07H = 2636
A08H = 2637
A09H = 2638
A0AH = 2640
A0BH = 2641
A0CH = 2642
A0DH = 2643
A0EH = 2644
A0FH = 2645
A10H = 2646
A11H = 2647
A12H = 2648
A13H = 2650
A14H = 2651
A15H = 2652
A16H = 2653
A17H = 2654
A18H = 2655
A19H = 2656
A1AH = 2657
A1BH = 2658
A1CH = 2660
A1DH = 2661
A1EH = 2662
A1FH = 2663
A20H = 2664
A21H = 2665
A22H = 2666
A23H = 2667
A24H = 2668
;----------- Второй вход в заставку
A25H = 2670  A8  MVA; 27N; = 964A;
A26H = 2671  94  27N;
A27H = 2672  86  JMP; FAR - Вхождение в заставку 02;
A28H = 2673  95  28N;
A29H = 2674  AA  00N; --> 2800N;

;----------- Вызов второй заставки;
A2AH = 2675  A8  MVA;
A2BH = 2676  96  26N; 26..N;
A2CH = 2677  A5  STA Z;
A2DH = 2678  59  82N;
A2EH = 2680  A8  MVA;
A2FH = 2681  54  87N; 2687N;
A30H = 2682  A5  STA Z; [0082N] адрес возврата из процедуры
A31H = 2683  52  83N;    X = 0; Y = 0; вызов => 0200N ---> 0184N;
A32H = 2684  86  JMP; FAR 0200N - вызов процедуры X = 0; Y = 0;
A33H = 2685  A9  02N;
A34H = 2686  AA  00N;
;----------- возврат будет сюда: 2687N;
A35H = 2687  A8  MVA; 27N;
A36H = 2688  94  27N; первый вход в блок картинки;

;---------- отсюда расположен 2-й блок 56 слов картинки экрана
;---------- в памяти дисплея 504 байта или 1008 по 2 слова
;---------- 56 x 18 = 1008, таких блоков требуется 18.
;---------- Блок 1.
A37H = 2700
A38H = 2701
;   ...
A86H = 2787
A87H = 2788
;---------- Блок 2.
A88H = 2800
A89H = 2801
;   ...
AD7H = 2887
AD8H = 2888
;====================================
;---------- Блок 3.
C00H = 3000
C01H = 3001
;   ...
C4FH = 3087
C50H = 3088
;---------- Блок 4.
C51H = 3100
C52H = 3101
;   ...
CA0H = 3187
CA1H = 3188
;---------- Блок 5.
CA2H = 3200
CA3H = 3201
;   ...
CF1H = 3287
CF2H = 3288
;---------- Блок 6.
CF3H = 3300
CF4H = 3301
;   ...
D42H = 3387
D43H = 3388
;---------- Блок 7.
D44H = 3400
D45H = 3401

D93H = 3487
D94H = 3488
;---------- Блок 8.
D95H = 3500
D96H = 3501
;   ...
DE4H = 3587
DE5H = 3588
;---------- Блок 9.
DE6H = 3600
DE7H = 3601

E35H = 3687
E36H = 3688
;---------- Блок 10.
E37H = 3700
E38H = 3701
;   ...
E86H = 3787
E87H = 3788
;---------- Блок 11.
E88H = 3800
E89H = 3801

ED7H = 3887
ED8H = 3888
;=========================================
;---------- Блок 12.
1000H =4000
000H = 4000
;   ...
04FH = 4087
050H = 4088
;---------- Блок 13.
051H = 4100
052H = 4101
;   ...
0A0H = 4187
0A1H = 4188
;---------- Блок 14.
0A2H = 4200
0A3H = 4201
;   ...
0F1H = 4287
0F2H = 4288
;---------- Блок 15.
0F3H = 4300
0F4H = 4301
;   ...
142H = 4387
143H = 4388
;---------- Блок 16.
144H = 4400
145H = 4401
;   ...
193H = 4487
194H = 4488
;---------- Блок 17.
195H = 4500
196H = 4501
;   ...
1E4H = 4587
1E5H = 4588
;---------- Блок 18.
1E6H = 4600
1E7H = 4601
;   ...
235H = 4687
236H = 4688  AA  00N; здесь заканчивается блок картинки;

;----------- Блок переходов для картинки, 02 -> 0411 = A088;
237H = 4700  A8  MVA; 27N; = 04AA;
238H = 4701  94  27N;
239H = 4702  86  JMP; FAR - Вхождение в заставку 03;
23AH = 4703  2A  30N;
23BH = 4704  AA  00N; --> 3000N;

23CH = 4705  A8  MVA; 27N; = 04A1;
23DH = 4706  94  27N;
23EH = 4707  86  JMP; FAR - Вхождение в заставку 04;
23FH = 4708  28  31N;
240H = 4710  AA  00N; --> 3100N;

241H = 4711  A8  MVA; 27N; = 0488;
242H = 4712  94  27N;
243H = 4713  86  JMP; FAR - Вхождение в заставку 05;
244H = 4714  29  32N;
245H = 4715  AA  00N; --> 3200N;

246H = 4716  A8  MVA; 27N; = 0486;
247H = 4717  94  27N;
248H = 4718  86  JMP; FAR - Вхождение в заставку 06;
249H = 4720  22  33N;
24AH = 4721  AA  00N; --> 3300N;

24BH = 4722  A8  MVA; 27N; = 0499;
24CH = 4723  94  27N;
24DH = 4724  86  JMP; FAR - Вхождение в заставку 07;
24EH = 4725  20  34N;
24FH = 4726  AA  00N; --> 3400N;

250H = 4727  A8  MVA; 27N; = 0494;
251H = 4728  94  27N;
252H = 4730  86  JMP; FAR - Вхождение в заставку 08;
253H = 4731  21  35N;
254H = 4732  AA  00N; --> 3500N;

255H = 4733  A8  MVA; 27N; = 0422;
256H = 4734  94  27N;
257H = 4735  86  JMP; FAR - Вхождение в заставку 09;
258H = 4736  26  36N;
259H = 4737  AA  00N; --> 3600N;

25AH = 4738  A8  MVA; 27N; = 0425;
25BH = 4740  94  27N;
25CH = 4741  86  JMP; FAR - Вхождение в заставку 10;
25DH = 4742  24  37N;
25EH = 4743  AA  00N; --> 3700N;

25FH = 4744  A8  MVA; 27N; = 0400;
260H = 4745  94  27N;
261H = 4746  86  JMP; FAR - Вхождение в заставку 11;
262H = 4747  25  38N;
263H = 4748  AA  00N; --> 3800N;

264H = 4750  A8  MVA; 27N; = 041A;
265H = 4751  94  27N;
266H = 4752  86  JMP; FAR - Вхождение в заставку 12;
267H = 4753  0A  40N;
268H = 4754  AA  00N; --> 4000N;

269H = 4755  A8  MVA; 27N; = 0411;
26AH = 4756  94  27N;
26BH = 4757  86  JMP; FAR - Вхождение в заставку 13;
26CH = 4758  08  41N;
26DH = 4760  AA  00N; --> 4100N;

26EH = 4761  A8  MVA; 27N; = 0468;
26FH = 4762  94  27N;
270H = 4763  86  JMP; FAR - Вхождение в заставку 14;
271H = 4764  09  42N;
272H = 4765  AA  00N; --> 4200N;

273H = 4766  A8  MVA; 27N; = 0466;
274H = 4767  94  27N;
275H = 4768  86  JMP; FAR - Вхождение в заставку 15;
276H = 4770  02  43N;
277H = 4771  AA  00N; --> 4300N;

278H = 4772  A8  MVA; 27N; = 0449;
279H = 4773  94  27N;
27AH = 4774  86  JMP; FAR - Вхождение в заставку 16;
27BH = 4775  00  44N;
27CH = 4776  AA  00N; --> 4400N;

27DH = 4777  A8  MVA; 27N; = 0444;
27EH = 4778  94  27N;
27FH = 4780  86  JMP; FAR - Вхождение в заставку 17;
280H = 4781  01  45N;
281H = 4782  AA  00N; --> 4500N;

282H = 4783  A8  MVA; 27N; = 0452;
283H = 4784  94  27N;
284H = 4785  86  JMP; FAR - Вхождение в заставку 18;
285H = 4786  06  46N;
286H = 4787  AA  00N; --> 4600N;

287H = 4788  00;--------- END ---------

В коде нет массивов картинок, они формировались отдельной программой и просто вставлялись по месту
через WinHEX методом "копи-паст".

Ну и поскольку процесс этот зело утомительный и пригоден лишь для ситуации, когда срочно требуется
увидеть, как всё же ЭТО работает, я решил, что для продолжения разработки мне совершенно необходим
соответствующий компилятор с языка ассемблера.

Хороший исходник у меня был заготовлен для 4-bit Processor-a.

Ассемблер для модели троичного процессора я собираюсь реализовать на его основе с учетом следующих
соглашений:
Image

_________________
iLavr


17 Mar 2019 05:53
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
...я решил, что для продолжения разработки мне совершенно необходим
соответствующий компилятор с языка ассемблера.

И, собственно, сам компилятор троичного ассемблера я уже с недельку как написал...
Attachment:
TernAsm1.gif
TernAsm1.gif [ 21.33 KiB | Viewed 446 times ]

И вроде как даже он работает верно. Основой тест у меня для такого случая - компилятор
должен совершенно идентично собрать бинарник, который ранее был написан вручную в кодах.
Все мои бинарники этот компилятор троичного ассемблера собирает верно, поскольку проверяю
я идентичность утилитой FC (File Compare) в бинарном режиме.

Естественно, по пути я всякие "вкусности" ассемблера тестировал, работает всё вроде правильно,
хотя, безусловно, в связке с троичным компьютером это всё надо потестировать, погонять...

Ну и, естественно, ассемблеру нужны новые и подробные русскоязычные хелпы, ибо и я сам на
троичном ассемблере программист сугубо начинающий... :wink:
Вот сотворением подробных русскоязычных хелпов я сейчас и занят, да и на работе дел полно... :-?

_________________
iLavr


11 Apr 2019 19:25
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 3 posts ] 

Who is online

Users browsing this forum: No registered users and 1 guest


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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.