Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт сен 25, 2018 19:26

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: форт-машина
СообщениеДобавлено: Пт июл 14, 2006 09:47 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
начал сегодня писать FVM для AVR+32K XRAM, обнаружил что интерпретатор байт-кода
идеально ложится на систему команд и архитектуру (три 16-битных индексных регистра XYZ) AVR

подскажите, как сделать запуск "микрокода" команд ВМ через jump table ? сейчас опкоды ВМ тупо перебираются парами команд cpi/breq, для запуска последней команды понадобится 256 машинных циклов:

Код:
; Virtual FORTH Machine for AVR ATmega8515 + 32K EXT SRAM
; (c) Dmitry Ponyatov <forth@km.ru>, public domain

; ATTENTION: entry point must be @ 0x8000 (high 32K)

.include "m8515def.inc"

.org 0x00
rjmp RESET
.org 0x20

.def tmp = r20
.def cellh = r21
.def celll = r22
.def op = r21   ; opcode

RESET:
      ; enable watchdog
      ldi tmp,0b00001111
      out WDTCR,tmp
      ; enable external RAM control
      ; reset VM pointers
      ldi XH,0x80            ; instruction pointer
      ldi XL,0x00
      ldi YH,0xE0            ; return stack
      ldi YL,0x00
      ldi ZH,0xF0            ; data stack
      ldi ZL,0x00
      ; load opcode
NEXT: ; FORTH interpreter NEXT point
      ; load command opcode
      ld op,X+            
      ; FVM standard commands
      cpi op,0x00
      breq vm_NOP
      cpi op,0x01
      breq vm_JMP
      cpi op,0x03
      breq vm_CALL
      cpi op,0x04
      breq vm_RET
      ; user commands
      cpi op,0xF0
      breq vm_F0
      cpi op,0xF1
      breq vm_F1
      cpi op,0xF2
      breq vm_F2
      cpi op,0xF3
      breq vm_F3
      cpi op,0xF4
      breq vm_F4
      cpi op,0xF5
      breq vm_F5
      cpi op,0xF6
      breq vm_F6
      cpi op,0xF7
      breq vm_F7
      cpi op,0xF8
      breq vm_F8
      cpi op,0xF9
      breq vm_F9
      cpi op,0xFA
      breq vm_FA
      cpi op,0xFB
      breq vm_FB
      cpi op,0xFC
      breq vm_FC
      cpi op,0xFD
      breq vm_FD
      cpi op,0xFE
      breq vm_FE
      cpi op,0xFF
      breq vm_FF


ABORT: ; abort on incorrect command or assertion
      sleep
      rjmp ABORT

; VM commands

vm_NOP:   rjmp NEXT

vm_JMP:
      ld celll,X+      ; \ move to next command
      ld cellh,X+      ; /
      mov XH,cellh   ; \ move Ip to colabble addr
      mov XL,celll   ; /
      rjmp NEXT

vm_CALL:
      ld celll,X+      ; \ move to next command
      ld cellh,X+      ; /
      st -Y,XL       ; \ store next command addr 
      st -Y,XH       ; / to return stack
      mov XH,cellh   ; \ move Ip to colabble addr
      mov XL,celll   ; /
      rjmp NEXT   

vm_RET:
      ld XH,Y+
      ld XL,Y+
      rjmp NEXT

; put your own user defined commands here

vm_F0:   rjmp NEXT
vm_F1:   rjmp NEXT
vm_F2:   rjmp NEXT
vm_F3:   rjmp NEXT
vm_F4:   rjmp NEXT
vm_F5:   rjmp NEXT
vm_F6:   rjmp NEXT
vm_F7:   rjmp NEXT
vm_F8:   rjmp NEXT
vm_F9:   rjmp NEXT
vm_FA:   rjmp NEXT
vm_FB:   rjmp NEXT
vm_FC:   rjmp NEXT
vm_FD:   rjmp NEXT
vm_FE:   rjmp NEXT

vm_FF:   ; this command will be executed
      ; if VM memory will be empty
      sleep
      rjmp vm_FF

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 14, 2006 10:13 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 12, 2006 00:52
Сообщения: 88
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пообщайся с народом в http://forums.airbase.ru/index.php?topic=32548
в http://forums.airbase.ru/index.php?topic=34041

и т.п.

_________________
... чтобы понять рекурсию, нужно сперва понять рекурсию ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 14, 2006 10:24 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Balancer писал(а):
Пообщайся с народом в http://forums.airbase.ru


мне проще в RU.EMBEDDED спросить

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 14, 2006 11:49 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
я бы делал проверками битов сначала, т.е.
что-то подобное вот такому "кусту":

: blk_00 ... ; : blk_01 ... ; : blk_10 ... ; : blk_11 ... ;

: blk_1 dup 40 and if blk_11 then blk_10 else ;

: blk_0 dup 40 and if blk_01 then blk_00 else ;

: cmd dup 80 and if blk_1 then blk_0 else ;


Тогда, на каждую команду только 8 проверок.

p.s. это я для понятности на форте написал, а так на асме все, конечно :)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 14, 2006 12:03 
Посмотри как сделано например для AVR
с сайта tinyboot.com ( FF302 IDE в разделе фирмваре )
Но там тоже вроде замудрено:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 14, 2006 12:08 
Примерно так:
Сначала вычитается значение из региcтра Z,
а потом команда IJMP :)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 14, 2006 12:59 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 12, 2006 00:52
Сообщения: 88
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
forth@km.ru писал(а):
мне проще в RU.EMBEDDED спросить


Если поленился заглядывать - там народ очень плотно занимается AVR. При чём с практическими целями. При чём некоторые возились (не знаю, как сейчас) с Фортом.

_________________
... чтобы понять рекурсию, нужно сперва понять рекурсию ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: форт-машина
СообщениеДобавлено: Вс дек 11, 2011 15:02 
26 сентября, 21:49
Открыт исходный код прошивки DIY-компьютера Fignition
Код:
Джулиан Скидмор (Julian Skidmore) опубликовал исходный код прошивки для своего 8-битного самодельного компьютера Fignition.

Fignition — это маленький (но полноценный) DIY-компьютер, основанный на микроконтроллере AVR ATMega168 и имеющий 8 КБ ОЗУ (расширяется до 32 КБ) и 384 КБ flash-памяти, 8-кнопочную клавиатуру, композитный видеовыход (PAL) и USB-выход (тип B), через который осуществляется питание устройства. Имеется и доступ к шине I2C. В качестве операционной системы и языка программирования выступает диалект Forth.

Компьютер распространяется в виде 46 отдельных деталей, которые предлагается собрать самостоятельно с помощью паяльника. Стоимость составляет 20 фунтов стерлингов. По заявлению автора проекта, производительность компьютера в несколько раз превосходит такие компьютеры 80-х, как ZX Spectrum и Jupiter Ace.

Код прошивки доступен под лицензией GNU GPLv3 на популярном хостинге кода GitHub. Чуть позже Джулиан обещал выложить в открытый доступ материалы по аппаратной части своего устройства.

https://sites.google.com/site/libby8dev/fignition сайт разработчика
https://github.com/Snial/FIGnition код прошивки


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: форт-машина
СообщениеДобавлено: Вс дек 11, 2011 20:53 
Не в сети

Зарегистрирован: Вт май 30, 2006 14:52
Сообщения: 18
Откуда: Таганрог, Ростовской обл.
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
forth@km.ru писал(а):

подскажите, как сделать запуск "микрокода" команд ВМ через jump table ? сейчас опкоды ВМ тупо перебираются парами команд cpi/breq, для запуска последней команды понадобится 256 машинных циклов:



один из вариантов

Код:
         mov  zl,op                                       ; байт код.
         subi  zl,low(-TabJMP*2)                     ; таким образом прибавляем адрес таблицы.
         sbci  zh,high(-TabJMP*2)
         ijmp                                               ; Переход на требуемый .
.
.
.
.
TabJMP:
         rjmp    opc_00                                 ; 256 rjmp-ов
         rjmp    opc_01
         rjmp    opc_02
.
.
.
         rjmp    opc_FE
         rjmp    opc_FF



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB