Я ж не знаю, кому это "видимо доку надо подкрутить чуток" - тебе или самому Voja..
Ну я свою доку написать не в состоянии, не говоря уже о том, чтобы исправить чужую
Ну ты там контактируешь в Суперконференции Хакадея 2022 года - может Voja подсказали, что "видимо доку надо подкрутить чуток" - я так подумал.
Shaos wrote:
Lavr wrote:
Интересно, кстати, если регистр JSR - 4-битный...
Он также как PCL работает - старшие 8 бит берутся из PCH и PCM и вперёд (но с занесением адреса возврата в стек):
Так вот это совершенно очевидно, если "внимательно читать всё выше", из-за этого и вопрос возник!
Если в вызове подпрограммы меняются лишь младшие 4-бита в 12-битном адресе, а "старшие 8 бит берутся из PCH и PCM", то переход возможен лишь в пределах 2^4 = 16 позиций адреса. Если мы это делаем у верхней границы параграфа, то "вперед" мы перейти не сможем! Необходим инкремент PCH и PCM - в этом суть вопроса была.
Так-то сама проблема известна из 6502 - вот и интересно, как Voja её решил.
_________________ iLavr
22 Oct 2022 04:10
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
Меняется весь 12-битный адрес в PC - нет у никаких проблем со сменой параграфа
Смотри на картинку - значения PCH и PCM (вместе с JSR) копируются в PC (а перед этим старый PC копируется в стек):
т.е. для дальнего перехода копируем новые значения в PCH и PCM (при этом сам PC инкрементируется как и раньше), а потом пишем младший ниббл адреса в JSR, что и инициирует перескок
Если в вызове подпрограммы меняются лишь младшие 4-бита в 12-битном адресе, а "старшие 8 бит берутся из PCH и PCM", то переход возможен лишь в пределах 2^4 = 16 позиций адреса. Если мы это делаем у верхней границы параграфа, то "вперед" мы перейти не сможем! Необходим инкремент PCH и PCM - в этом суть вопроса была.
Я понял в чём проблема - на картинке PCH и PCM равны старшим 8 битам PC, но в общем случае это может быть и не так - в PCH и PCM просто будут оставаться записанные туда заранее значения и это никак не влияет на PC, который всегда по ходу пьесы будет инкрементироваться в пределах всех 12 бит - т.е. проблема со страницами, о которой ты говоришь, касается только коротких переходов и коротких вызовов подпрограмм - по хорошему каждый переход и каждый вызов подпрограммы должен иметь в себе MOV PC,NN первой командой для замены PCH и PCM на правильные значения и уже потом MOV PCL,n или MOV JSR,n (разве что только эта программа не написана вручную чтобы влезть в пределы 16-словной страницы).
Горожу поддержку этого процыка в своём ассемблере RASM - относительные переходы JR на метку заработали с полпинка (т.к. я таковые уже делал в RASM для поддержки 8086 в своё время), а вот с длинными переходами видимо придётся забубенить "синтетические" операции JMP label и CALL label которые внутри будут представляться двумя инструкциями MOV PC,label>>4 и MOV PCL,label&15 (или MOV JSR,label&15 в случае CALL). Также команды вида MOV [NN],R0 и MOV R0,[NN] у меня в ассемблере непредставимы, поэтому я для них поменяю мнемоники на соответственно SR0 NN (Save R0) и LR0 NN (Load R0).
Voja предлагает в моём ассемблере сразу же поддержать формат бинарника для засылки в бейдж:
Code:
1. Header, 6 bytes: 00 FF 00 FF A5 C3 2. Program length, 2 bytes (in 16-bit words, Low byte first): NN NN 3. Program, NN 0N×Program Length (Low first): NN 0N, NN 0N, NN 0N... 4. 16-bit Checksum for items 2 and 3 only, 2 bytes (Low first): NN NN
Я скорее всего оставлю бинарь как есть (в big-endian формате), а превращаться в правильный формат с заголовком и контрольной суммой он будет при засылке в бейдж - я могу даже спец.программу для этого написать, которая будет с последовательным портом работать.
P.S. Также он говорит, что официальный ассемблер будет на питоне (и будет написан не им).
Горожу поддержку этого процыка в своём ассемблере RASM - относительные переходы JR на метку заработали с полпинка (т.к. я таковые уже делал в RASM для поддержки 8086 в своё время), а вот с длинными переходами видимо придётся забубенить "синтетические" операции JMP label и CALL label которые внутри будут представляться двумя инструкциями MOV PC,label>>4 и MOV PCL,label&15 (или MOV JSR,label&15 в случае CALL). Также команды вида MOV [NN],R0 и MOV R0,[NN] у меня в ассемблере непредставимы, поэтому я для них поменяю мнемоники на соответственно SR0 NN (Save R0) и LR0 NN (Load R0).
Выложил подрихтованный RASM, который поддерживает этот CPU ( я его назвал Voja4 по аналогии с уже поддержанным Lavr4 ; )
Частично сгенерённая, частично составленная вручную таблица на 2730 правил:
Исходник должен собираться любым 16-битным, 32-битным или 64-битным ANSI-C компилятором (даже big-endian должен работать). Могу собрать версию для доса и выложить, если кому надо
P.S. А между тем официальный ассемблер для бейджа так ещё и не вышел
Tom Nardi wrote:
Badge tools just need Python 3.6+, so you should be set assuming you're installing latest Ubuntu.
Теперь мне надо по быстрому эмуль нагородить Наверное проще всего будет написать его на Robby и вывесить в веб (будет работать на движке Circuits.CC) А в перспективе с помощью nedoPC SDK можно будет портировать это на любой поддерживаемый недокомп...
Теперь мне надо по быстрому эмуль нагородить Наверное проще всего будет написать его на Robby и вывесить в веб (будет работать на движке Circuits.CC) А в перспективе с помощью nedoPC SDK можно будет портировать это на любой поддерживаемый недокомп...
Вот как-то так оно может выглядеть:
Attachments:
Screenshot from 2022-10-31 22-23-04.png [ 8.22 KiB | Viewed 5326 times ]
Интересная особенность инструкции SKIP - она может пропустить 1,2,3 или 4 инструкции по условию C,NC,Z,NZ (ещё есть флаг V. однако его надо проверять отдельно как произвольный бит в памяти).
(я специально не стал поддерживать аргумент как произвольное число т.к. тут 0 в аргументе означает пропуск 4 инструкций)
Как можно видеть напрямую можно скипать только по двум флагам - C и Z. Флаг переполнения после операций со знаком хранится в спец-регистре и может быть использован вот так (взято из коммента от автора):
Code:
1101 1111 0100 MOV R0, [0xF4] ; R0 <---- [RdFlags] 0000 1001 0001 BIT R0, 1 ; Z <---- Vflag 0000 1111 1110 SKIP NZ, 2 ; Skip next 2 instructions if NZ ... next 2 instructions could be an absolute jump, like MOV PC, NN and MOV PCL, N
На моём ассемблере это будет так:
Code:
@RDFLAGS EQU #F4
LABEL: LR0 @RDFLAGS // R0 <---- [RdFlags] BIT_R0, 1 // Z <---- Vflag SKIP_NZ,2 // Skip next 2 instructions if NZ JMP LABEL // an absolute jump, like MOV PC, NN and MOV PCL, N
что будет сассемблировано вот так:
Code:
This listing was generated by RoboAssembler v2.6 by Shaos <me@shaos.net>
000 0D LABEL: LR0 @RDFLAGS // R0 <---- [RdFlags] F4 001 00 BIT_R0, 1 // Z <---- Vflag 91 002 00 SKIP_NZ,2 // Skip next 2 instructions if NZ FE 003 0E JMP LABEL // an absolute jump, like MOV PC, NN and MOV PCL, N 00 004 09 D0
P.S. в видео показано пошаговое выполнение программы "бегущая строка" при котором индикаторы подсвечивают выполняемые инструкции - таким образом можно попробовать "прочитать" программу
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