В таком случае, вешаем R/C на А0, и читаем в память короткую программу начальной загрузки, у которой все байты будут повторяться по два раза. Только надо извратиться и написать такую программу)
Вид для печати
Я об этом уже думал :) Только я хотел соединить OE и R/C, что бы каждый второй байт был нулевым. Написать такую программу проще. Но ПЗУ ведет себя неадекватно, если дергать OE во время ввода адреса. Если же подключить OE через инвертор, то все работает нормально. Каждый второй байт читается нулевым.
То есть один дополнительный корпус, как у меня.
Только это не решает проблему "диагональной" записи загрузчика.
Можно было бы поставить ATMega8 на плату. Она бы и с монитором была бы совместима и адрес сама бы увеличивала. И возможно разархивацией бы занималась. К этой же ATMega вместо ПЗУ можно было бы прикрутить SD-карту.
А начиналось все просто с припаивания ПЗУ к разъему Апогея. Я не нашел маленьких переключателей для линий A16-A19 и впаял регистр. Потом меню нарисовал. Потом архивацию добавил. Сейчас уже мысли об SD-карте. :)
Нет, надо просто ПЗУ прикрутить.
Ниже первые наброски загрузчика. Надо будет не забыть посмотреть, где у Апогея стек расположен. Есть подозрение.
Ничего страшного, можно записать и диагонально. А при распаковке и копировании будут пропускаться адреса, у которых номер столбца и строки равны.
Дополнительный корпус - это не айс, если программно можно обойтись без него, хоть и с извратами.
---------- Post added at 01:37 ---------- Previous post was at 01:35 ----------
Точно ли проверено, что если подсоединить A0 на R/C, а все остальные адреса A1 -> A0, A2 -> A1 и т.д., со смещением, то при чтении массива данных с адреса 0000 по, скажем 00FF, прочтутся парные байты?
Тогда предлагаю такой вот загрузчик.
Загружается в память с адреса 0000 по 00FF, например. Стартует с адреса 0001, т.к. по адресу 0000 мусор.
Таким образом, все байты продублированы. Записан по диагонали во флешке. После запуска, он распаковывает с адреса 0x0011 на адрес 0x0000 уже нормальный вторичный загрузчик, в котором все байты индивидуальные, длина которого может достигать (0x00C2 - 0x0012) / 2 = 88 байт, чего вполне хватит, чтобы загрузить меню с распаковщиком.Код:0000 xx
0001 06 B2 LD B,0xB2 ; B = 0xB2 (Lenght)
0003 B2 OR D
0004 11 11 00 LD DE,0x0011 ; DE = 0x0011 (Source)
0007 00 NOP
0008 62 LD H,D
0009 62 LD H,D
000A 6A LD L,D
000B 6A LD L,D ; HL = 0x0000 (Destination)
000C Е5 PUSH HL
000D Е5 PUSH HL ; 0x0000 -> (SP)
000E C3 C3 00 JP 0x00C3 ; --> 0x00C3
0011 00 NOP
0012 DATA
.. ..
00C1 DATA
00C2 1A LD A,(DE)
00C3 1A LD A,(DE) ; A = (DE)
00C4 13 INC DE
00C5 13 INC DE ; DE = DE + 2
00C6 77 LD (HL),A
00C7 77 LD (HL),A ; (HL) = A
00C8 3A 3A 23 LD A,(0x233A)
00CB 23 INC HL ; HL = HL + 1
00CC 06 DEC B
00CD 06 DEC B ; B = B - 2
00CE C2 C2 00 JP NZ,0x00C2 ; if (B <> 0) goto 0x00C2 -->
00D1 00 NOP
00D2 C9 RET ; goto 0x0000 -->
00D3 C9 RET
Не пинайте сильно, может не до конца разобрался - если R\C просто соединить с А0 - разве не будет читаться?
---------- Post added at 11:53 ---------- Previous post was at 11:46 ----------
Только R\C надо легка задержать, чтобы стабильный адрес записался в ПЗУ.
---------- Post added at 11:55 ---------- Previous post was at 11:53 ----------
И R\С подтянуть резитором к питанию, чтобы после включения сразу на нём была "1"
В последней схеме, которую предложил Titus и под которую я уже переписал все программы, A0 соединен с R/C. Новые данные на выходе ПЗУ появляются только при изменении 0=>1 на входе R/C. То есть только при чтении нечетных адресов. В таком включении программа читается так, что каждый второй байт дублируется. Изначально я почему то подумал, что такую программу написать будет не просто и даже думать не стал, а Titus не поленился и написал загрузчик. Получилось 108 продублированных байт:
06 06 06 06 B2 B2 11 11 00 00 62 62 6A 6A C3 C3
00 00 01 01 FF FF 00 00 21 21 03 03 EE EE 36 36
90 90 2B 2B 2B 2B 70 70 11 11 00 00 F0 F0 3A 3A
1F 1F 00 00 3D 3D BB BB CA CA 25 25 00 00 23 23
...
---------- Post added at 11:14 ---------- Previous post was at 11:06 ----------
А это ведь косяк. При теплой перезагрузке компьютера, на A0 может и не быть 1. Следовательно, не только нулевой байт, но и первый байт может содержать мусор. Надо запускаться с 3-ого адреса. Исправил.
Спешил предложить - недочитал тему...