Не знаю, почему, но CLR, в отличие от MOV, делается посредством цикла шины "Ввод-пауза-вывод", который, естественно, длиннее обычного цикла "Вывод", на длительность фазы ввода. Непонятно зачем оно так сделано, но это идет еще от Э-60.
Вид для печати
Не знаю, почему, но CLR, в отличие от MOV, делается посредством цикла шины "Ввод-пауза-вывод", который, естественно, длиннее обычного цикла "Вывод", на длительность фазы ввода. Непонятно зачем оно так сделано, но это идет еще от Э-60.
Alex_K недавно же все обьяснил: CLR на ВМ2
Почти разобрался с резидентами (диспетчером процессов).
В принципе в ПК УКНЦ 1-94 правильно написано, но с ошибками и неполно..
; Подпрограмма для выполнения в памяти ПП;
STARTPP:
MOV PC,R1 ; Найти адрес
ADD #PGM1-.,R1 ; программы-процесса
MOV R1,AdrPgm ; Запомнить его
MOV R1,@#7124 ; Записать в таблицу процессов
MOV #1,@#7100 ; Записать в таблицу запуска
RETURN ; Завершить эту программу
AdrPgm: 0
PGM1: ; Сама программа-процесс
MOV R0,-(SP) ; Сохранение R0
.......
Наш процесс
MOV #COMMW/2,@#177010 ; Управлять можно через ячейку в памяти ЦП
MOV @#177014,R0 ;
.........
MOV AdrPgm,@#7124 ; Поставить в очередь процессов
MOV #1,@#7100 ; Потребовать обслуживания
MOV (SP)+,R0 ; Восстановить
JMP @#174170 ; Перейти к диспетчеру процессов
ENDPP:
Доступных пар ячеек всего 2:
007076 SCPP:: .WORD 0 ;- счетчик процесса пользователя
007100 SCPTST:: .WORD 0 ;- счетчик процесса тестирования
и то с "процесса пользователя" не получилось, так что фраза "вы можете использовать другую пару" только вводит в заблуждение.
список ячеек диспетчера процессов:
007060 SCPKL:: .WORD 0 ;- счетчик процесса клавиатуры
007062 SCPKFO:: .WORD 0 ;- счетчик процесса канала файлового обмена
007064 SCPD:: .WORD 0 ;- счетчик процесса дисплея
007066 SCPK:: .WORD 0 ;- счетчик процесса курсора
007070 SCPKR:: .WORD 0 ;- счетчик процесса режима установок
007072 SCPMZ:: .WORD 0 ;- счетчик процесса меню загрузки ЦП
007074 SCPPC:: .WORD 0 ;- счетчик процесса печати
007076 SCPP:: .WORD 0 ;- счетчик процесса пользователя
007100 SCPTST:: .WORD 0 ;- счетчик процесса тестирования
007102 SCDPRC:: .WORD 0 ;- счетчик диспетчера процессов
....
пока еще не разобрался как правильно освобождать память.. в случае с резидентом..
S_V_B, предлагаю для усовершенствования вашего "движка" такие переменные для кнопок заиметь
SHIFT$ - НАЖАТ ЛИ ШИФТ ПРОВЕРКА ПО TST
И ДАЛЕЕ ПО ТОМУ ЖЕ ПРИНЦ.
UP$
DOWN$
LEFT$
и так по всем управляющим кнопкам )
пример со скан-кодами для УК-НЦ есть на образе Alex_K
Сделал переключение экранов при выводе спрайтов:
https://yadi.sk/d/ZHVD8eUWDyIlmA
Не нравится влияние прерываний на скорость вывода, придется отключать. В связи с этим вопрос, подскажите правильный опрос клавиатуры без прерываний и ЕМТов, и прочих TTYIn.
правильным считается как раз опрос через системный вызов )
я всегда опрашивал раньше с регистры адреса и данных
полистайте тему ПАСКАЛЬ\МАКРО-11 и программирование на УК-НЦ как?
комок шпор
Код:Вопрос:
Подскажите, как правильно по системному запретить
передачу кодов клавиш от клавиатуры на терминал,
но при этом самому эти коды получать?
Приведу пример: я вывожу какую-то информацию на экран,
после чего спрашиваю "Continue?".
Тут человек должен нажать любую клавишу, и программа
продолжится. Если делать опрос клавиш через EMT 340,
то коды клавиш отображаются на экране, а мне этого не надо.
Если же делать через чтение данных напрямую из канала 0
(канал клавиатуры), то символы все равно отправляются в
монитор и потом печатаются. Т.е. какая-то должна быть
системная функция, запрещающая выводить на терминал коды
приходящих клавиш, но я ее не знаю.
Ответ:
Для этого надо установить бит TTSPC$ (12й) в $JSW (44).
к примеру:
Код:
.MCALL .TTYIN,.PRINT,.EXIT
$JSW = 44
TTSPC$ = 10000
TEST: BIS #TTSPC$,@#$JSW
.PRINT #PROMPT
.TTYIN
.EXIT
PROMPT: .ASCII /--->/<200>
печатает подсказку, ждет нажатия клавиши, выходит
Другой вариант - запретить прерывания от клавиатуры
и работать напрямую с регистрами, но этот вариант
несовместим с виртуальными программами и не будет
работать в системах с поддержкой многотерминальности.
---------- Post added at 17:57 ---------- Previous post was at 17:46 ----------
Еще дополнение - иногда полезен бит TCBIT$ (6й) - при его установке
TTINR (EMT 340) не останавливается в ожидании символа, а проходит
дальше с установленным битом C если ничего не нажато.
-------------------------------------------------------------------------------
.Print #NextPage ;Печатаем сообщение "Next page?"
.Print #KeyON ;Включить клавиатуру
BIS #TTSPC$,@#$JSW ;Запрет отображения символов на экране
.TTYIN ;Ожидание нажатия клавиши
CMP R0,#13 ;Если код = 13 (Возврат каретки),
BNE 6$ ;то ожидаем еще один код = 10 (перевод строки)
.TTYIN ;
6$:
.Print #KeyOFF ;Отключить клавиатуру
.Print #NextLine ;Переходим на следующую строку
...
NextPage: .ASCII "Next page?"<128>
NextLine: .ASCII <13><10><128>
KeyOFF: .ASCII <27><91><50><104><128>
KeyON: .ASCII <27><91><50><108><128>
++++++++++++++++++++++++++++++++
К слову коды клавиш/символов вообще
удобнее выносить в начало - к примеру так:
Код:
ESC = ^O33
CR = ^O15
LF = ^O12
================================
^B - Binary
^C - Complement
^D - Decimal
^F - Floating
^O - Octal
^R - Radix50
^X - 16-ричные???
================================
.TITLE TXT -- ПЕЧАТЬ ТЕКСТОВЫХ СТРОК
.MCALL .PRINT
TXT:: MOV (R5)+,R1 ;ЧИСЛО АРГУМЕНТОВ
BEQ 30$ ;EQ - НЕТ АРГУМЕНТОВ
10$: MOV (R5)+,R0 ;АДРЕС ОЧЕРЕДНОГО АРГУМЕНТА
CMP #-1,R0 ;ЕСЛИ -1 - АРГУМЕНТ ПРОПУЩЕН
BEQ 20$ ;...ПРОПУСКАЕМ
.PRINT ;ПЕЧАТАЕМ СТРОКУ
20$: SOB R1,10$ ;ЦИКЛИМСЯ ПОКА ЕСТЬ АРГУМЕНТЫ
30$: RETURN ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ
.END
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Раз уж есть тема по программированию, предлагаю сюда же
свалить всякие хитрости какие кто пользует
Например такие:
Код:
JSR Rx,@PC ;СОХРАНИТЬ Rx В СТЕКЕ, НЕ ТРОГАЯ PSW
MOV #160000,SP ;ПОЛНАЯ ОЧИСТКА ПАМЯТИ (56Kb)
MOV #4747,@#0 ;И ЧИСТЫЙ ОСТАНОВ БЕЗ ОШИБОК
CLR PC ;В КОНЦЕ
CALL @(SP)+ ;ВЫЗОВ СОПРОГРАММЫ
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
И я тоже добавлю - простой способ разворачивания цикла
2x:
1. Пусть есть цикл, выполняющийся N раз, типа:
mov N,r0
1$: cmd ! некая команда, например, clr(r1)+
sob r0,1$
2. Простой способ разворачивания того ж цикла в линейку:
mov N,r0
inc r0
asr r0
bcc 2$
1$: cmd
2$: cmd
sob r0,1$
Идея состоит в том, чтоб позаботиться о нечётном числе
итераций до начала цикла, и войти внутрь цикла в обход
стандартного начала.
========================================================
Устанавливает цвет курсора
8 цветов от 60 до 67 (третий параметр)
.TTYOUT #33
.TTYOUT #247
.TTYOUT #67
Цвет экрана
.TTYOUT #33
.TTYOUT #242
.TTYOUT #60
Цвет символов
.TTYOUT #33
.TTYOUT #241
.TTYOUT #67
Цвет знакоместа
.TTYOUT #33
.TTYOUT #240
.TTYOUT #60
Установка формата экрана
(61 - 80х24, 62 - 40х24, 63 - 20х24, 64 - 10х24)
.TTYOUT #33
.TTYOUT #246
.TTYOUT #61
Запускаем нужное приложение (на примере 'МЗ1:ДИГГЕР.САЖ')
.MCALL .CHAIN
MOV #^RMZ1,@#500
MOV #^RDIG,@#502
MOV #^RGER,@#504
MOV #^RSAV,@#506
.CHAIN
PROCEDURE WAITKEY;
VAR KEY ORIGIN 177560B: INTEGER;
BEGIN
REPEAT KEY:=0 UNTIL KEY>0
END;
Если завести глобальную переменную
INKEY ORIGIN 177562B: INTEGER;
там будет код последней нажатой клавиши
PROCEDURE gotoXY(X,Y: INTEGER);
BEGIN
WRITE(CHR(27),'Y',CHR(32+Y),CHR(32+X));
END;
---------------------------------------------
Ну да, если буфер переполнен, то устанавливается
бит C в PSW. Поэтому код должен быть таким:
Код:
EMT ^O341
BCS .-2
---------------------------------------------
Код:
.PRINT #TEXT1 ;БЕЗ <CR><LF>
.PRINT #TEXT2 ;<CR><LF> В КОНЦЕ
TEXT1: .ASCII /TEXT/<200>
TEXT2: .ASCIZ /TEXT/
_______________________________________________
[свернуть]
- - - Добавлено - - -
S_V_B, вам надо там свой драйвер загружать и подминать под свой контроль все упр. клавиши - только так )
- - - Добавлено - - -
S_V_B, вот эта авторская игра ведёт себя так как будто написана на движке УК-НЦ который я разыскиваю
https://www.old-games.ru/forum/threa...2#post-1238737
то есть подминает под себя всё и потом начинает игровые экраны выводить )
кстати автор иногда отвечает )
Можно посмотреть как это реализовал nzeemin в своем порте Highway Encounter
Метка GETKEY:
/* надо там свой драйвер загружать */
Зачем такие сложности, в любом случае драйвер от прерываний не спасет (поскольку они не только от клавы).
Игрушка не обязана интегрироваться в операционку главное чтобы корректно завершалась. Многозадачности нет и на время работы программы ты сам волен решать что делать. А драйверы и прочие навороты писались для программ на ЯВУ типа ВАСИК чтобы взаимодействовать с ПП.
- - - Добавлено - - -
Нашел:
; Подпрограмма: Опрос клавиатуры; клавиша есть: Z=0, клавиши нет: R0=0 и Z=1
Z34226:
TSTB @#177660 ; Нажали клавишу?
BPL 4$ ; нет символа => выходим
MOV @#177662, R0 ; код нажатой клавиши
2$: MOV R0, Z34224
RETURN
4$: CLR R0
MOV R0, Z34224 ; Стираем признак нажатой клавиши
SEZ ; Возвращаем признак Z=1 -- нажатия нет
RETURN
Есть у кого-нибудь пример правильной работы с FIS (FDIV,FADD)?
Эмулятор их не понимает (в режиме трассировки), а в слепую я не пойму что не так.
На примере FADD
07500R FADD
Регистр R - как указатель стека (если R6 - то стек и получаем)
После сложенияКод:R-> операнд B биты 16-31 ; (R+00)
операнд B биты 0-15 ; (R+02)
операнд A биты 16-31 ; (R+04)
операнд A биты 0-15 ; (R+06)
результат=A+BКод:R-> операнд B биты 16-31 ; (R+00)
операнд B биты 0-15 ; (R+02)
результат биты 16-31 ; (R+04)
результат биты 0-15 ; (R+06)