Forth http://fforum.winglion.ru/ |
|
форт-машина http://fforum.winglion.ru/viewtopic.php?f=39&t=111 |
Страница 1 из 1 |
Автор: | forth@km.ru [ Пт июл 14, 2006 09:47 ] |
Заголовок сообщения: | форт-машина |
начал сегодня писать 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 |
Автор: | Balancer [ Пт июл 14, 2006 10:13 ] |
Заголовок сообщения: | |
Пообщайся с народом в http://forums.airbase.ru/index.php?topic=32548 в http://forums.airbase.ru/index.php?topic=34041 и т.п. |
Автор: | forth@km.ru [ Пт июл 14, 2006 10:24 ] |
Заголовок сообщения: | |
Balancer писал(а): Пообщайся с народом в http://forums.airbase.ru
мне проще в RU.EMBEDDED спросить |
Автор: | WingLion [ Пт июл 14, 2006 11:49 ] |
Заголовок сообщения: | |
я бы делал проверками битов сначала, т.е. что-то подобное вот такому "кусту": : 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. это я для понятности на форте написал, а так на асме все, конечно |
Автор: | Гость [ Пт июл 14, 2006 12:03 ] |
Заголовок сообщения: | |
Посмотри как сделано например для AVR с сайта tinyboot.com ( FF302 IDE в разделе фирмваре ) Но там тоже вроде замудрено:) |
Автор: | Гость [ Пт июл 14, 2006 12:08 ] |
Заголовок сообщения: | |
Примерно так: Сначала вычитается значение из региcтра Z, а потом команда IJMP |
Автор: | Balancer [ Пт июл 14, 2006 12:59 ] |
Заголовок сообщения: | |
forth@km.ru писал(а): мне проще в RU.EMBEDDED спросить
Если поленился заглядывать - там народ очень плотно занимается AVR. При чём с практическими целями. При чём некоторые возились (не знаю, как сейчас) с Фортом. |
Автор: | Гость [ Вс дек 11, 2011 15:02 ] |
Заголовок сообщения: | Re: форт-машина |
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 код прошивки |
Автор: | Геннадий [ Вс дек 11, 2011 20:53 ] |
Заголовок сообщения: | Re: форт-машина |
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 |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |