Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: Вопросы по МК-90

  1. #1
    Member
    Регистрация
    28.09.2018
    Адрес
    г. Минск, Беларусь
    Сообщений
    98
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Вопросы по МК-90

    Решил я изучить МК-90, и у меня возникли вопросы.
    1. Есть ли где карта памяти сего калькулятора?
    2. Какие есть системные переменные у его Бейсика (и 1.0, и 2.0)? Где они находятся?
    3. Почему программа в кодах нормально загружается с СМП в Бейсике 2.0, но не загружается (вообще никак) в Бейсике 1.0?

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master Аватар для Radon17
    Регистрация
    01.12.2017
    Адрес
    г. Воронеж
    Сообщений
    539
    Спасибо Благодарностей отдано 
    284
    Спасибо Благодарностей получено 
    330
    Поблагодарили
    150 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот эту страничку читали? http://www.pisi.com.pl/piotr433/index.htm#mk90
    Автор есть на этом форуме
    МС 0585, Электроника МК 90, Поиск-1 128k, Вектор-06ц (нераб.), МС 0511.01, Балтик-48 (нераб.), Б3-34

  4. #3
    Member
    Регистрация
    28.09.2018
    Адрес
    г. Минск, Беларусь
    Сообщений
    98
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Читал, но не нашел ответов на эти вопросы (на многие другие -- нашел)

  5. #4
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,330
    Спасибо Благодарностей отдано 
    1,325
    Спасибо Благодарностей получено 
    88
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Yprit Посмотреть сообщение
    3. Почему программа в кодах нормально загружается с СМП в Бейсике 2.0, но не загружается (вообще никак) в Бейсике 1.0?
    Насчёт этого вопроса вроде разобрались. Если на эмуле стоит rom Бейсика 1, то при запуске СМП0 адрес экрана 3000H, а если Бейсика 2, тогда 200H. Есть системная переменная #F800, которая задаёт адрес экрана.

    Такой вопрос: какой размер и с какого адреса можно юзать в МК90 кусок непрерывной (не фрагментированной) памяти, чтобы разместить там машинный код пользовательской программы? (хотим GCC приспособить)

  6. #5
    Junior Аватар для piotr433
    Регистрация
    16.02.2011
    Адрес
    Szczecin, Польша
    Сообщений
    25
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Yprit Посмотреть сообщение
    2. Какие есть системные переменные у его Бейсика (и 1.0, и 2.0)? Где они находятся?
    Некоторые системные переменные приведены в начале листингов ПЗУ:
    http://www.pisi.com.pl/piotr433/mk90ro10.zip
    http://www.pisi.com.pl/piotr433/mk90ro20.zip

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Такой вопрос: какой размер и с какого адреса можно юзать в МК90 кусок непрерывной (не фрагментированной) памяти, чтобы разместить там машинный код пользовательской программы?
    При запущенном Бейсике начало свободной памяти указывает регистр R5 (0x0100 для версии 1.0 и 0x0F59 для версии 2.0).
    Конец определяет SP (~0x2F00 для версии 1.0 и ~0x3F00 для версии 2.0).

    хотим GCC приспособить
    Интересно! А этот проект вам известный? МК90 - пишем программы на Си
    Последний раз редактировалось piotr433; 13.01.2022 в 20:23.

  7. Эти 5 пользователя(ей) поблагодарили piotr433 за это полезное сообщение:

    nzeemin (14.01.2022), Oleg N. Cher (14.01.2022), svofski (13.01.2022), tnt23 (13.01.2022), Yprit (14.01.2022)

  8. #6
    Member
    Регистрация
    28.09.2018
    Адрес
    г. Минск, Беларусь
    Сообщений
    98
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо!
    Нет, к сожалению, раньше не видели. Но интересно.
    Еще остались вопросы:
    1. Как опрашивается клавиатура?
    2. Можно ли с СМП загружать больше 3.5 килобайт сразу?
    3. Влияет ли Бейсик на работу после загрузки кодов?
    4. Есть ли ограничения на вызов подпрограмм из ПЗУ?
    Уточню насчет второго. В описании к игре "Жизнь" написано:
    Because its size exceeds 512 bytes, it has to be stored in the cartridge data area. In order to prevent the system from overwriting it, the value at the location 0x0412 (in the cartridge directory area) is changed from 0x10 to 0x0D. This step allocates three last sectors for machine code programs of size up to 1.5 kBytes, leaving the remaining space of 6.5 kBytes available for the system.
    Можно ли оставить на машинный код больше, чем 4.5 килобайт? И имеются в виду ведь сектора СМП?
    Последний раз редактировалось Yprit; 14.01.2022 в 13:59.

  9. #7
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,330
    Спасибо Благодарностей отдано 
    1,325
    Спасибо Благодарностей получено 
    88
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от piotr433 Посмотреть сообщение
    Интересно! А этот проект вам известный? МК90 - пишем программы на Си
    Весьма интересно и необычно, но тут как-то слишком всё сложно делается. И у GCC кодогенерация будет сильно получше, чем у старинного компилятора.

    Мы уже добились от GCC базовой генерации бинаря, сумели запустить его на эмуляторе в первых 512 байтах на месте загрузчика. Даже адаптировали Ваш код для точки, линии и круга. Теперь хочется понять с какого адреса мы можем юзать непрерывный кусок памяти под сгенеренный сишкой код, где лучше разместить экранную область, как именно Бейсик влияет на машинный код, запущенный из СМП и не дающий управление Бейсику. Также конечно интересно можно ли пользоваться подпрограммами из ПЗУ, как выводить символы, как опрашивать клавиатуру. Да и вообще как лучше загружать код из СМП в ОЗУ, т.к. пока что не очень понятно как устроен загрузчик.

    Наработки по мере освоения будут выкладываться в подсистеме Pdp11Dev, да и вообще, если честно, то нас больше интересует Оберон, чем Си. Цель в том, чтобы можно было получить программу для МК90 одним нажатием кнопки. Ну и чтобы под рукой были полезные рабочие примеры кода.

  10. Эти 2 пользователя(ей) поблагодарили Oleg N. Cher за это полезное сообщение:

    piotr433 (15.01.2022), Yprit (14.01.2022)

  11. #8
    Junior Аватар для piotr433
    Регистрация
    16.02.2011
    Адрес
    Szczecin, Польша
    Сообщений
    25
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Постараюсь постепенно отвечать.

    Цитата Сообщение от Yprit Посмотреть сообщение
    1. Как опрашивается клавиатура?
    1. Пример использования подпрограмм из ПЗУ версии 1.0, ассемблер MACRO11:

    Код:
    	.asect
    	.radix	10
    
    	GETCH = ^O131120
    	PUTCH = ^O116542
    
    	.=	0
    
    	nop			;obligatory
    	jsr	pc,@#^O153700
    	jsr	pc,@#^O120536
    	mov	@#^O034022,@#^O164000
    	mov	#^O104306,@#^O164002
    again:	jsr	pc,GETCH	;R2 = ASCII code of the pressed key
    	jsr	pc,PUTCH	;display the character R2
    	br	again
    
    	.=	^O000310
    
    	.word	^O130514, 0	;keyboard interrupt vector
    2. Программа отображает скан-код нажатой клавиши. ПЗУ не используется. Ассемблер PDPXASM:

    Код:
    ; reading the keyboard using interrupts
    
    	.radix	16
    
    	.loc	0
    
    	nop			;obligatory!
    	mtps	#E0		;disable interrupts
    	mov	#scr,r0		;display RAM
    	mov	r0,@#E800
    	mov	#88C6,@#E802
    ; clear the display RAM
    	mov	#1E0,r1
    cls:	clr	(r0)+
    	sob	r1,cls
    	br	cont
    
    	.loc	100
    
    cont:	mov	#keysr,@#C8	;keyboard controller interrupt vector
    	clr	@#CA
    	mov	#36,@#E812	;slow clock
    	mov	#EA,@#E814
    	mtps	#0
    
    ; continuously read and display the keyboard scan code
    again:	wait			;wait for a pressed key
    	mov	keycod,r3
    	mov	#scr,r0
    	jsr	pc,hex
    	br	again
    
    ; keyboard interrupt handle routine
    keysr:	mov	#^XF2,@#E814
    	clr	@#E816
    keyb1:	tstb	@#E814
    	bpl	keyb1
    	mov	@#E816,keycod
    keyb2:	tstb	@#E814
    	bpl	keyb2
    	mov	#EA,@#E814
    	rti
    
    ; display the byte R3 at the screen address R0
    hex:	jsr	pc,hex1
    hex1:	mov	#4,r4
    	clr	r1
    hex2:	rolb	r3
    	rol	r1
    	sob	r4,hex2
    	jsr	pc,putc
    	rts	pc
    
    ; display the character R1 at the screen address R0,
    ; advance the pointer R0 to the next column
    putc:
    ; R1 <- 6 * R1
    	asl	r1		;* 2
    	mov	r1,-(sp)
    	asl	r1		;* 4
    	add	(sp)+,r1	;* 6
    	add	#chars,r1
    	mov	#6,r2
    putc1:	movb	(r1)+,(r0)
    	add	#1E,r0
    	sob	r2,putc1
    	sub	#B2,r0		;6 * 1E - 2 = B2
    	rts	pc
    
    ; characters, width = 8 pixels, height = 6 pixels
    chars:	.byte	3C, 46, 4A, 52, 62, 3C	;digit '0'
    	.byte	18, 28, 8,  8,  8,  3E	;digit '1'
    	.byte	3C, 42, 2,  3C, 40, 7E	;digit '2'
    	.byte	3C, 42, C,  2,  42, 3C	;digit '3'
    	.byte	8,  18, 28, 48, 7E, 8	;digit '4'
    	.byte	7E, 40, 7C, 2,  42, 3C	;digit '5'
    	.byte	3C, 40, 7C, 42, 42, 3C	;digit '6'
    	.byte	7E, 2,  4,  8,  10, 10	;digit '7'
    	.byte	3C, 42, 3C, 42, 42, 3C	;digit '8'
    	.byte	3C, 42, 42, 3E, 2,  3C	;digit '9'
    	.byte	3C, 42, 42, 7E, 42, 42	;'A'
    	.byte	7C, 42, 7C, 42, 42, 7C	;'B'
    	.byte	3C, 42, 40, 40, 42, 3C	;'C'
    	.byte	78, 44, 42, 42, 44, 78	;'D'
    	.byte	7E, 40, 7C, 40, 40, 7E	;'E'
    	.byte	7E, 40, 7C, 40, 40, 40	;'F'
    
    keycod:	.blkw	1
    
    	.loc	200
    
    scr:
    - - - Добавлено - - -

    Цитата Сообщение от Yprit Посмотреть сообщение
    2. Можно ли с СМП загружать больше 3.5 килобайт сразу?
    Да, можно, ограничений нет.

    Можно ли оставить на машинный код больше, чем 4.5 килобайт?
    В игре "Жизнь" я хотел чтобы модул СМП можно было одновременно использовать для хранения машинного кода и программ на Бейсике. Если такого требования нет, можно все 10 килобайт оставить на машинный код.

    Кстати, встречаются разные загрузчики. В игре "Жизнь" был скопирован с ПЗУ 1.0, примерно с адреса 0xF8EC. А вот "Эмулятор терминала" использует подпрограмму ПЗУ по адресу 0xBBBA.

    3. Влияет ли Бейсик на работу после загрузки кодов?
    Думаю, что только если вызывать связанные с ним подпрограммы из ПЗУ.

    4. Есть ли ограничения на вызов подпрограмм из ПЗУ?
    Возможно есть, в зависимости от подпрограммы. Например GETCH из первого примера выводит на экран статус кнопок Р/Л и В/Н. Наверно можно это предотвратить изменяя какую-то системную переменную.
    Точно тяжело сказать. Пока я разобрал только небольшой фрагмент кода ПЗУ
    Последний раз редактировалось piotr433; 15.01.2022 в 12:36. Причина: ошибка в коде: MTPS #E00 вместо MTPS #E0

  12. Эти 3 пользователя(ей) поблагодарили piotr433 за это полезное сообщение:

    nzeemin (15.01.2022), Oleg N. Cher (14.01.2022), Yprit (14.01.2022)

  13. #9
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,330
    Спасибо Благодарностей отдано 
    1,325
    Спасибо Благодарностей получено 
    88
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Пётр, спасибо за Ваши подробные ответы.

    Попутно возник ещё такой вопрос: что это за команда запрещения прерываний в загрузчике?

    Код:
    MTPS $0xE0
    (синтаксис изменён для асма GCC, но $ это #, а код шестнадцатеричный, это и так понятно)

    Зачем нужно запрещать прерывания? Зачем нужно их потом разрешать? Где хранятся векторы прерываний? В нижних адресах или где-то ещё?

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

    Код:
        nop
        br loader
    
        .= 32
    loader:
        mtps #^O340

  14. Этот пользователь поблагодарил Oleg N. Cher за это полезное сообщение:

    piotr433 (15.01.2022)

  15. #10
    Veteran Аватар для nzeemin
    Регистрация
    20.12.2005
    Адрес
    Москва
    Сообщений
    1,754
    Спасибо Благодарностей отдано 
    730
    Спасибо Благодарностей получено 
    820
    Поблагодарили
    343 сообщений
    Mentioned
    15 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Смотрю на код загрузки из SMP, ПЗУ BASIC 2.0 - дизасм, полученный Петром.

    Процесс загрузки вполне стандартный:
    1. Сначала с СМП загружается бут-сектор, размером 0x200 = 512 байт, начиная с адреса ОЗУ 000000.
    2. Проверяется, что первое слово равно 0xA0 = 000240 - инструкция NOP
    3. Загрузчик запускается с адреса 000000

    При форматировании СМП, туда записывается стандартный загрузчик, показывающий фразу "БЕЗ ЗАГРУЗЧИКА", при этом пропуска слов в начале там нет.

    Предполагаю, что в приведённом выше коде загрузчика, пропущенные в начале слова оставлены для векторов прерываний.

    - - - Updated - - -

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Где хранятся векторы прерываний? В нижних адресах или где-то ещё?
    Мои предположения, что прерывания в начале памяти такие же как на Немиге (процессор тоже на 588 комплекте), плюс из того что написано у Петра в дизасме ПЗУ:

    000004 — нечётный адрес при обращении по слову; ошибка обращения к каналу; HALT в режиме USER; неверная адресация JMP/JSR
    000010 — резерный код команды
    000014 — прерывание по T-разряду или команда BPT
    000020 — команда IOT
    000030 — команда EMT
    000034 — команда TRAP
    000100 — прерывание EVNT
    000310 — прерывание от клавиатуры

    Вектора прерываний в ПЗУ:

    160002 — сигнал/команда HALT в режиме HALT
    160006 — двойное зависание
    160012 — ошибка при приёме вектора прерывания
    Последний раз редактировалось nzeemin; 15.01.2022 в 01:44.

  16. Эти 2 пользователя(ей) поблагодарили nzeemin за это полезное сообщение:

    Oleg N. Cher (15.01.2022), piotr433 (15.01.2022)

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Мои вопросы
    от Viktor2312 в разделе Разное
    Ответов: 2
    Последнее: 05.04.2015, 21:26
  2. Famitracker: вопросы
    от evgs в разделе Творчество
    Ответов: 3
    Последнее: 28.09.2010, 00:08
  3. Статистические вопросы ?
    от AAA в разделе Форум
    Ответов: 25
    Последнее: 22.07.2008, 20:44
  4. Вопросы и ответы
    от Addison в разделе ZX Концепции
    Ответов: 31
    Последнее: 28.11.2007, 11:35

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •