Не знаю, почему, но CLR, в отличие от MOV, делается посредством цикла шины "Ввод-пауза-вывод", который, естественно, длиннее обычного цикла "Вывод", на длительность фазы ввода. Непонятно зачем оно так сделано, но это идет еще от Э-60.
Не знаю, почему, но CLR, в отличие от MOV, делается посредством цикла шины "Ввод-пауза-вывод", который, естественно, длиннее обычного цикла "Вывод", на длительность фазы ввода. Непонятно зачем оно так сделано, но это идет еще от Э-60.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
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; 03.12.2018 в 14:56.
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:
Последний раз редактировалось randomizer; 06.12.2018 в 21:54.
/* надо там свой драйвер загружать */
Зачем такие сложности, в любом случае драйвер от прерываний не спасет (поскольку они не только от клавы).
Игрушка не обязана интегрироваться в операционку главное чтобы корректно завершалась. Многозадачности нет и на время работы программы ты сам волен решать что делать. А драйверы и прочие навороты писались для программ на ЯВУ типа ВАСИК чтобы взаимодействовать с ПП.
- - - Добавлено - - -
Нашел:
; Подпрограмма: Опрос клавиатуры; клавиша есть: 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)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)