Forth http://fforum.winglion.ru/ |
|
QUARK-ую http://fforum.winglion.ru/viewtopic.php?f=23&t=2907 |
Страница 1 из 5 |
Автор: | WingLion [ Пт дек 21, 2012 19:41 ] |
Заголовок сообщения: | QUARK-ую |
Пытаюсь сделать на кварке эмулятор своего форт-процессора Код: HEX CREATE CPU 40 ALLOT CREATE NEW_CPU 40 ALLOT : 0W! 0 SWAP W! ; : .PC 0 + ; : .CMD 2 + ; : .TOP 4 + ; : .DST 6 + ; : .RST 16 + ; : CPU_INIT CPU .PC 0W! CPU .CMD 0W! CPU .DST 0 SWAP ! CPU .DST 4 + 0 SWAP ! CPU .DST 8 + 0 SWAP ! CPU .DST 0C + 0 SWAP ! CPU .RST 0 SWAP ! CPU .RST 4 + 0 SWAP ! CPU .RST 8 + 0 SWAP ! CPU .RST 0C + 0 SWAP ! ; : CPU_STATE CLS .RED ." EQUINOX CPU MAIN REGISTER STATE" CR .BLUE ." PC: " CPU .PC W@ H. CR ." CMD: " CPU .CMD W@ H. CR .GREEN ." TOP: " CPU .TOP W@ H. CR .WHITE ." DST: " CPU .DST 8 0 DO DUP I 2* + W@ H. LOOP CR ." RST: " CPU .RST 8 0 DO DUP I 2* + W@ H. LOOP CR ; : NEXT.PC CPU .PC DUP W@ 1+ W! ; CPU_STATE CPU_STATE CPU_STATE CPU_STATE : TEST1 1000 0 DO CPU_STATE LOOP ; TEST1 если две последние строчки закоментировать, выводит состояние регистров и стеков процессора, Если же раскоментировать обратно, вывод пропадает напрочь... и quark в процессах подвисает, блокируя доступ к сырцам Сижу и гадаю, то ли лыжи не едут, то ли я торможу, Предварительно подгружаю вот такой код с исправлениями и добавками: Код: ." - antigluk.f загружен" CR HEX : ROT >R SWAP R> SWAP ; : -ROT SWAP >R SWAP R> ; : W@ \ addr --> word16 @ 0FFFF AND ; : W! \ word16,addr --> DUP @ 0FFFF0000 AND >R SWAP 00000FFFF AND R> OR SWAP ! ; -1 0 0 RGB CONSTANT BLUE : .BLUE BLUE SETCOLOR ; 0 -1 0 RGB CONSTANT GREEN : .GREEN GREEN SETCOLOR ; 0 0 -1 RGB CONSTANT RED : .RED RED SETCOLOR ; : .WHITE WHITE SETCOLOR ; .RED ." красный " .GREEN ." зеленый " .BLUE OR ." синий " CR .WHITE : WAITKEY CR ." нажмите клавишу SPACE" BEGIN LASTKEY 20 = IF BYE THEN AGAIN ; \ : WAITKEY ; : DEC. DECIMAL . HEX ; : ERROR-PRINT GETCOLOR RED SETCOLOR >R " *** ERROR *** : " PRINT PRINT R> SETCOLOR ; \ : ERROR-PRINT " *** ERROR *** : " PRINT PRINT CR ; \ " проверка вывода ошибки." ERROR-PRINT \ : ABORT" [COMPILE] " PRINT BEGIN NOOP AGAIN ; \ ABORT" тест слова ABORT" : ALPHA. 0F AND 30 + DUP 39 > IF 7 + THEN EMIT ; // печать 16-битного числа в виде 4ки : H. DUP 1000 / ALPHA. DUP 100 / ALPHA. DUP 10 / ALPHA. ALPHA. 20 EMIT ; п.с. quark апрельский прошлого года... |
Автор: | WingLion [ Пт дек 21, 2012 20:09 ] |
Заголовок сообщения: | Re: QUARK-ую |
ПОНЯЛ, ПОЧЕМУ ТОРМОЗИТ И ВЕШАЕТСЯ - CLS В ЦИКЛЕ 4000 РАЗ ИСПОЛНЯЕТСЯ ДОЛГО, A ПОЧЕМУ ТЕКСТ НЕ ВЫВОДИТСЯ - НЕПОНЯТНО |
Автор: | Hishnik [ Пт дек 21, 2012 20:31 ] |
Заголовок сообщения: | Re: QUARK-ую |
В цикле надо поставить слово $ (просто символ доллара). Это слово "прокачивает" обработку сообщений. Тогда все будет выводиться. |
Автор: | WingLion [ Пт дек 21, 2012 21:27 ] |
Заголовок сообщения: | Re: QUARK-ую |
положение улучшилось заменой CLS НА 0 CONSOLEX ! 0 CONSOLEY ! в начале определения CPU_STATE но желаемого эффекта с нарастающим значением PC не видать А доллар мало помогает - те же тормоза как с CLS... Я этот $ и нюхал, и лизал, и на хвост примерял... без разницы |
Автор: | Hishnik [ Пт дек 21, 2012 22:06 ] |
Заголовок сообщения: | Re: QUARK-ую |
Вот что у меня получилось. Код: : STR1 " EQUINOX CPU MAIN REGISTER STATE" ;
: STRPC " PC: " ; : STRCMD " CMD: " ; : STRTOP " TOP: " ; : STRDST " DST: " ; : STRRST " RST: " ; : CPU_STATE 0 0 GOTOXY .RED STR1 PRINT CR .BLUE STRPC PRINT CPU .PC W@ H. CR STRCMD PRINT CPU .CMD W@ H. CR .GREEN STRTOP PRINT CPU .TOP W@ H. CR .WHITE STRDST PRINT CPU .DST 8 0 DO DUP I 2* + W@ H. LOOP CR STRRST PRINT CPU .RST 8 0 DO DUP I 2* + W@ H. LOOP CR ; : NEXT.PC CPU .PC DUP W@ 1+ W! ; CPU_STATE CPU_STATE CPU_STATE CPU_STATE DECIMAL : TEST1 100 0 DO CPU_STATE REDRAW I . LOOP ; // TEST1 ' TEST1 TO K_F1 |
Автор: | WingLion [ Пт дек 21, 2012 22:35 ] |
Заголовок сообщения: | Re: QUARK-ую |
Пытаюсь получить бегущее число на экране. удлиннение цикла не помогает, отрисованный экран появляется в конце исполнения теста...с последним значением В PC o! получилось, когда поменял доллар на красную колонку... REDROW и запуск теста по кнопке получился интересно |
Автор: | WingLion [ Пт дек 21, 2012 22:57 ] |
Заголовок сообщения: | Re: QUARK-ую |
ПОСЛЕДНИЕ ИЗМЕНЕНИЯ: Код: : ONE_STEP NEXT.PC CPU_STATE ; : TEST1 100 0 DO ONE_STEP LOOP ; : RESET_CPU 0 CPU .PC W! CPU_STATE ; ' RESET_CPU TO K_F6 ' ONE_STEP TO K_F4 ' TEST1 TO K_F5 по F4 один шаг, по F5 256 шагов, по F6 - сброс в нулевой адрес Теперь вместо NEXT.PC надо сделать исполнение команд и вуаля! |
Автор: | WingLion [ Вт янв 08, 2013 20:49 ] |
Заголовок сообщения: | Re: QUARK-ую |
последняя версия "эмулятора" файл "e16emu.f" Код: HEX " COMMANDS.F" L \ \ : MEMINIT ERASEMEM \ 1111 0 MEM! \ 1000 1 MEM! \ 1000 2 MEM! \ 1000 3 MEM! \ 1000 4 MEM! \ 2000 5 MEM! \ 200 6 MEM! \ 7777 10 MEM! \ 3777 200 MEM! ; \ MEMINIT : CPU_STATE 1 1 GOTOXY .MARG ." EQUINOX CPU MAIN REGISTERS STATE" CR .GREEN ." PC: " CPU .PC@ H. CR ." CMD: " CPU .CMD@ H. .WHITE CPU .CMD@ 0F000 AND 1000 / CMD_PRINT CR .GREEN ." TOP: " CPU .TOP@ H. CR .CYAN ." DST: " CPU .DST 8 0 DO DUP I 2* + W@ H. LOOP CR ." RST: " CPU .RST 8 0 DO DUP I 2* + W@ H. LOOP CR .YELLOW ." MEM[PC]: " CPU .PC@ 8 0 DO DUP I + MEM@ H. LOOP DROP CR REDRAW ; : NEXT.PC CPU->NEW_CPU E16_NOP NEW_CPU->CPU ; CLS : ONE_STEP NEXT.PC \ CMD_EXEC CLS CPU_STATE CR CR DUMP ; ; : 100STEPS 100 0 DO ONE_STEP LOOP ; : RESET_CPU CPU_INIT CLS .WHITE CPU_STATE CPU->NEW_CPU ; ' RESET_CPU TO K_F6 ' ONE_STEP TO K_F4 ' 100STEPS TO K_F5 : HELP_SCR CLS .RED ." F6 - RESET" CR ." F4 - ONE STEP" CR ." F5 -256 STEPS" CR ." F2 - STACKS AND MEM STATE" CR ." F1 - THIS HELP" CR ; ' HELP_SCR TO K_F1 : TESTS CLS .MARG 1 1 GOTOXY ." CPU:" CPU . CR ." NEW_CPU:" NEW_CPU . CR ." MEM:" MEM . CR ; ' TESTS TO K_F2 файл "mem16.f" Код: \ ' BYE TO K_ESC // для быстрого выхода \ " antigluk.f" L HEX \ 16-битная (целевая) память CREATE MEM 1000 ALLOT \ 16 килобайт : MEM@ \ addr -- data разыменование из целевой памяти 0FFF AND DUP + MEM + W@ ; : MEM! \ data addr -- сохранение в целевую память 0FFF AND DUP + MEM + W! ; : INIT 800 0 DO I DUP MEM! LOOP ; \ тестовая инициализация \ INIT : ERASEMEM 800 0 DO 0 I MEM! LOOP ; \ стереть все ERASEMEM \ дамп 16 слов целевой памяти : DUMP10 DUP .YELLOW H. ." : " .GREEN 10 0 DO DUP I + MEM@ H. LOOP DROP CR ; \ дамп 256 слов целевой памяти : DUMP 10 0 DO I 10 * DUMP10 LOOP ; \ .GREEN 10 0 DO DUP I + MEM@ H. LOOP DROP CR \ LOOP ; INIT DUMP \ инициализация для проверки : MEMINIT ERASEMEM \ СЮДА НАДО КОМПИЛИРОВАТЬ ПРОГРАММУ ДЛЯ EQUINOX 1111 0 MEM! \ LIT LIT LIT LIT 1000 1 MEM! \ ЧЕТЫРЕ ЛИТЕРАЛА 1000 2 MEM! \ 1000 3 MEM! \ 1000 4 MEM! \ 2000 5 MEM! \ CALL 200 6 MEM! \ НА АДРЕС 200H 7777 10 MEM! \ СТОП 3777 200 MEM! \ подпрограмма: RET STOP STOP - ИСПОЛНИТСЯ ТОЛЬКО RET ; MEMINIT файл commands.f Код: \ собственно эмулятор процессора \ \ ." - commands.f загружен" CR " MEM16.F" L \ подключить память HEX CREATE CPU 80 ALLOT CREATE NEW_CPU 80 ALLOT \ "большой регистр" : CPU->NEW_CPU CPU NEW_CPU 20 MOVE ; : NEW_CPU->CPU NEW_CPU CPU 20 MOVE ; : 0W! 0 SWAP W! ; : 0W! 0 SWAP W! ; : .PC 0 + ; : .PC@ .PC W@ ; : .PC! .PC W! ; : .CMD 2 + ; : .CMD@ .CMD W@ ; : .CMD! .CMD W! ; : .TOP 4 + ; : .TOP@ .TOP W@ ; : .TOP! .TOP W! ; : .DST 6 + ; : .DST@ .DST W@ ; : .DST! .DST W! ; : .RST 16 + ; : .RST@ .RST W@ ; : .RST! .RST W! ; : CPU_INIT 0 CPU .PC! 0 CPU .CMD! ; \ -------------------------------------- \ 10.04.2012 vers 1.03 \ Oпределения для форт-процессора EQUINOX 16 \ (c) 2012 WingLion \ для использования с Quark 1.0.10 build 28 \ -------------------------------------- \ система команд процессора EQUINOX (март 2012 года) : PC++ CPU .PC@ 1+ NEW_CPU .PC! ; : MEM[PC++] CPU .PC@ MEM@ PC++ ; // команда - код - описание // E16_NOP - 0 - нет операции - загрузка следующего слова в регистр команд : E16_NOP MEM[PC++] NEW_CPU .CMD! ; // LIT - 1 L - загрузка литерала : E16_LIT CPU MEM[PC++] NEW_CPU .TOP! ; // CALL - 2 L - вызов подпрограммы : E16_CALL MEM[PC++] NEW_CPU .PC! CPU .PC@ 1+ NEW_CPU .RST! 0 NEW_CPU .CMD! ; // RET - 3 - возврат из подпрограммы : E16_RET CPU .RST@ DUP NEW_CPU .PC! MEM@ NEW_CPU .CMD! ; // BRAN - 4 L - условный переход по нулю в стеке данных : E16_BRAN CPU .TOP@ 0= IF MEM[PC++] NEW_CPU .PC! THEN ; // ! - 5 - стандартное фортовое "присвоить" : E16_! CPU .RST@ CPU .TOP@ MEM! ; // @ - 6 - стандартное фортовое "разыменовать" : E16_@ CPU .TOP@ MEM@ NEW_CPU .TOP! ; // STOP - 7 - остановить процесс исполнения (HALT) : E16_STOP CPU .CMD@ NEW_CPU .CMD! ; // >R - 8 - переместить число со стека данных на стек возвратов : E16_>R ; // R> - 9 - переместить число со стека возвратов на стек данных : E16_R> ; // XDUP - А p - АЛУ операция с уменьшением глубины стека : E16_XDUP ; // XSWAP B p - АЛУ операция с неизменной глубиной стека : E16_XSWAP ; // XDROP C p - АЛУ операьия с увеличением глубины стека : E16_XDROP ; // NOP13 D - оперция не определена : E16_NOP13 ; // NOP14 E - оперция не определена : E16_NOP14 ; // NOP15 F - оперция не определена : E16_NOP15 ; : CMD_PRINT CASE 0 OF ." NOP " ENDOF 3 OF ." RET " ENDOF 2 OF ." CALL " ENDOF 1 OF ." LIT " ENDOF 4 OF ." BRAN " ENDOF 5 OF ." ! " ENDOF 6 OF ." @ " ENDOF 7 OF ." STOP " ENDOF 8 OF ." >R " ENDOF 9 OF ." R> " ENDOF A OF ." *DUP " ENDOF B OF ." *DROP" ENDOF C OF ." *SWAP" ENDOF D OF ." NOP13" ENDOF E OF ." NOP14" ENDOF F OF ." NOP15" ENDOF ENDCASE ; : CMD_EXEC CPU->NEW_CPU CPU .CMD@ 10 * NEW_CPU .CMD! CPU .CMD@ 0F000 AND 1000 / \ DUP CMD_PRINT CASE 0 OF E16_NOP ENDOF 3 OF E16_RET ENDOF 2 OF E16_CALL ENDOF 1 OF E16_LIT ENDOF 4 OF E16_BRAN ENDOF 5 OF E16_! ENDOF 6 OF E16_@ ENDOF 7 OF E16_STOP ENDOF 8 OF E16_>R ENDOF 9 OF E16_R> ENDOF A OF E16_XDUP ENDOF B OF E16_XDROP ENDOF C OF E16_XSWAP ENDOF D OF E16_NOP13 ENDOF E OF E16_NOP14 ENDOF F OF E16_NOP15 ENDOF ENDCASE NEW_CPU->CPU ; : TEST3 CLS F 0 DO I . I CMD_PRINT CR LOOP ; ' TEST3 TO K_F2 файл make.f Код: ' BYE TO K_ESC // для быстрого выхода CLS ." make.f загружен " CR " antigluk.f" L " MEM16.F" L INIT DUMP " E16emu.f" L ." ---------------------- MAKE.F ЗАКОНЧИЛСЯ -----------" файл antigluk.f Код: ." - antigluk.f загружен" CR HEX : ROT >R SWAP R> SWAP ; : -ROT SWAP >R SWAP R> ; : 0= 0 = ; : W@ \ addr --> word16 @ 0FFFF AND ; : W! \ word16,addr --> DUP @ 0FFFF0000 AND >R SWAP 00000FFFF AND R> OR SWAP ! ; -1 0 0 RGB CONSTANT BLUE : .BLUE BLUE SETCOLOR ; 0 -1 0 RGB CONSTANT GREEN : .GREEN GREEN SETCOLOR ; 0 0 -1 RGB CONSTANT RED : .RED RED SETCOLOR ; 0 -1 -1 RGB CONSTANT YELLOW : .YELLOW YELLOW SETCOLOR ; -1 0 -1 RGB CONSTANT MARG : .MARG MARG SETCOLOR ; -1 -1 0 RGB CONSTANT CYAN : .CYAN CYAN SETCOLOR ; 0 0 0 RGB CONSTANT BLACK : .BLACK BLACK SETCOLOR ; : .WHITE WHITE SETCOLOR ; .RED ." красный " .GREEN ." зеленый " .BLUE OR ." синий " CR .WHITE : WAITspace BEGIN LASTKEY 20 = IF BYE THEN AGAIN ; \ : WAITKEY ; : DEC. DECIMAL . HEX ; : ERROR-PRINT GETCOLOR RED SETCOLOR >R " *** ERROR *** : " PRINT PRINT R> SETCOLOR ; \ : ERROR-PRINT " *** ERROR *** : " PRINT PRINT CR ; \ " проверка вывода ошибки." ERROR-PRINT \ : ABORT" [COMPILE] " PRINT BEGIN NOOP AGAIN ; \ ABORT" тест слова ABORT" : ALPHA. 0F AND 30 + DUP 39 > IF 7 + THEN EMIT ; // печать 16-битного числа в виде 4ки : H. DUP 1000 / ALPHA. DUP 100 / ALPHA. DUP 10 / ALPHA. ALPHA. 20 EMIT ; всефайлы сложить в одну папку с quark.exe запускать quark.exe make.f и кнопочками F1-F6 управлять |
Автор: | WingLion [ Вт янв 08, 2013 23:02 ] | ||
Заголовок сообщения: | Re: QUARK-ую | ||
последние версии файлов в архиве (команды закодированы пока не все) распаковать в отдельную папку, запускать __make.bat по F1 - help A тут описание эмулируемого процессора.... http://winglion.ru/equinox/
|
Автор: | WingLion [ Чт янв 10, 2013 03:34 ] |
Заголовок сообщения: | Re: QUARK-ую |
Пробую вот такую табличную исполнялку команд: Код: CREATE CMD_TABLE ' E16_NOP , ' E16_LIT , ' E16_CALL , ' E16_RET , ' E16_BRAN , ' E16_! , ' E16_@ , ' E16_STOP , ' E16_>R , ' E16_R> , ' E16_XDUP , ' E16_XDROP , ' E16_XSWAP , ' E16_NOP13 , ' E16_NOP14 , ' E16_NOP15 , : TABJMP 000F AND CELLS CMD_TABLE + @ EXECUTE ; : CMD_EXEC2 CPU->NEW_CPU CPU .CMD@ DUP 10 * 0FFF0 AND NEW_CPU .CMD! 1000 / 0F AND TABJMP NEW_CPU->CPU УПС... @ ЗАБЫЛ ПЕРЕД EXECUTE Tеперь работает, и скорость - 106 эмулируемых тактов в секунду : test 10000 DO CMD_EXEC2 LOOP ; Исполняется за 4 секунды а : 1000STEPS 100000 0 DO CMD_EXEC2 CMD_EXEC2 CMD_EXEC2 CMD_EXEC2 CMD_EXEC2 LOOP ONE_STEP ; исполняется за 10 сек, т.е. 2 миллиона тактов в секунду... так что оптимизировать есть куда Оно, наверняка еще и от компа зависит |
Автор: | WingLion [ Чт янв 10, 2013 06:18 ] |
Заголовок сообщения: | Re: QUARK-ую |
Пытаюсь увидеть бегущие секунды в позиции 10 10 Код: VARIABLE TICS 1000 TIMER-INTERVAL ! : TIC 1 TICS +! WHEREXY 10 10 GOTOXY TICS @ . GOTOXY ; ' TIC TO <TIMER> TIMER-INTERVAL ? может, чего неправильно делаю? |
Автор: | Hishnik [ Чт янв 10, 2013 15:58 ] |
Заголовок сообщения: | Re: QUARK-ую |
WingLion писал(а): TIMER-INTERVAL ? может, чего неправильно делаю? TIMER_INTERVAL Наверное, надо алиас сделать, часто ошибки из-за этого. |
Автор: | WingLion [ Чт янв 10, 2013 16:11 ] |
Заголовок сообщения: | Re: QUARK-ую |
Я ЕГО ИЗ ПДФ-КИ списал |
Автор: | admin from eepc [ Пт янв 11, 2013 18:27 ] |
Заголовок сообщения: | Re: QUARK-ую |
крокодил не ловится проблемка вылезла - на eePC в эмуляторе ФУНКЦИОНАЛЬНЫЕ клавиши не работают |
Автор: | Hishnik [ Пт янв 11, 2013 19:12 ] |
Заголовок сообщения: | Re: QUARK-ую |
А на eePC функциональные клавиши ни с какими модификаторами не нажимаются? Типа Fn, или какого-то режима, который переключает их между собственно функциональными и управлением системными функциями? |
Страница 1 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |