Ну... эта... тово... короче, можно... Только длинно это очень...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AK= 24 августа 2003 г. 15:09
В ответ на: А я вот че хотел спросить... эта... в общем... короче... отправлено undefined 24 августа 2003 г. 13:29

Это примеры виртуальной 8-битной Форт-машины на PIC16C74. Гнался не за скоростью, а за надежностью, посему в коде столько проверок. При обнаружении ошибки текущий тред просто прибивается (в данной реализации я гонял 6 ниток одновременно)

Усеченный 1131 IL на PICе я тоже делал, давно еще, лет 6 назад. Теперь, зная Форт, никогда такой дури как IL больше делать не буду. Полный ацтой :(


Так вызываются Форт-токены:
H_EXE_TOKEN_JUMP
movlw (high H_TOKEN_JUMP) ; set PCLAH to jump table
movwf PCLATH ; it is page 2
movf TOKEN,W ; get token
movwf PCL ; PC=90h (+concat+) token

org 900h ; table must start at the beginning of a page
H_TOKEN_JUMP ; label required
goto H_TOKEN_0 ;
goto H_TOKEN_1 ;
goto H_TOKEN_2 ;
goto H_TOKEN_3 ;
... и т.д.


А это примеры самих токенов:

; ***************************************************************
; *** NOP ***
; ***********
; --
H_TOKEN_0
return ;


; ***************************************************************
; ****** ******
; ****** STACK MANIPULATION TOKENS ******
; ****** ******
; ***************************************************************
; *** DROP ***
; ************
; x --
; drop element from top of stack

H_TOKEN_1
; *** check underflow
call H_CHKSTACK_0 ;
btfsc STATUS,Z ; dataSP=0?
goto H_ERROR ; no elements at data stack

; *** proceed
decf SP ; decrement
return ;

; ***************************************************************
; *** DUP ***
; ***********
; x -- x,x
; duplicate element at top of stack, if data stack collides with return stack then error

H_TOKEN_2
; *** check data stack
call H_CHKSTACK_0 ;
btfsc STATUS,Z ; dataSP=0?
goto H_ERROR ; no elements at data stack, nothing to duplicate

; *** check for collision
swapf SP,W ; read return stack pointer into low nibble
xorwf SP,W ; are hi and lo nibbles equal?
btfsc STATUS,Z ; Z=1 if dataSP=returnSP
goto H_ERROR ; stack pointers collide

; *** proceed
call H_GET_DATA_FROM_TOS
incf FSR ; TOS:=TOS+1
movwf INDF ; store (x) at TOS

; *** increment SP
incf SP ;
return ;

; ***************************************************************
; *** SWAP ***
; ************
; x,y -- y,x
; swap two top elements, dataSP must be >0

H_TOKEN_3
; *** check underflow
call H_CHKSTACK_1 ;
btfsc STATUS,Z ; dataSP=0 or 1?
goto H_ERROR ; not enough elements at data stack

; *** proceed
call H_GET_DATA_FROM_TOS
movwf WRK ; temp store (y)
decf FSR ; TOS-1
movf INDF,W ; read (x)
incf FSR ; TOS
movwf INDF ; store (x)
decf FSR ; TOS-1
movf WRK,W ; get (y)
movwf INDF ; store (y)
return ;

; ***************************************************************
; *** OVER ***
; ************
; x,y -- x,y,x
; copy previous element to top of stack

H_TOKEN_4
; *** check underflow
call H_CHKSTACK_1 ;
btfsc STATUS,Z ; dataSP=0 or 1?
goto H_ERROR ; not enough elements at data stack

; *** check for collision
swapf SP,W ; read return stack pointer into low nibble
xorwf SP,W ; are hi and lo nibbles equal?
btfsc STATUS,Z ; Z=1 if dataSP=returnSP
goto H_ERROR ; stack pointers collide

; *** proceed
call H_GET_DATA_FROM_TOS ; but ignore it
decf FSR ; TOS-1
movf INDF,W ; read (x)
incf FSR ;
incf FSR ; TOS+1
movwf INDF ; store (x)
incf SP ; new SP value
return ;

...

; ***************************************************************
; *** ADD ***
; ***********
; x,y -- (x+y)
; sum

H_TOKEN_20
; *** check underflow
call H_CHKSTACK_1 ;
btfsc STATUS,Z ; dataSP=0 or 1?
goto H_ERROR ; not enough elements at data stack

; *** proceed
call H_GET_DATA_FROM_TOS ; read (y)
decf FSR ; TOS-1
addwf INDF ; (x+y)
decf SP ;
return

; ***************************************************************
; *** INC ***
; ***********
; x -- (x+1)
; increment

H_TOKEN_21
; *** check underflow
call H_CHKSTACK_0 ;
btfsc STATUS,Z ; dataSP=0?
goto H_ERROR ; no elements at data stack

; *** proceed
decf SP,W ;
andlw 0Fh ;
iorwf FSR ; set FSR to TOS
incf INDF ; x:=x+1
return ;

; ***************************************************************
; *** 2INC ***
; ***********
; x_y -- (x_y+1)
; increment word

H_TOKEN_22
; *** check underflow
call H_CHKSTACK_1 ;
btfsc STATUS,Z ; dataSP=0 or 1?
goto H_ERROR ; not enough elements at data stack

; *** proceed
call H_GET_DATA_FROM_TOS ; read (y) but ignore it
incf INDF ; increment low byte
btfss STATUS,Z ; carry?
return ; no
decf FSR ; TOS-1
incf INDF ; increment hi byte
return ;

; ***************************************************************
; *** SUB ***
; ***********
; x,y -- (x-y)

H_TOKEN_23
; *** check underflow
call H_CHKSTACK_1 ;
btfsc STATUS,Z ; dataSP=0 or 1?
goto H_ERROR ; not enough elements at data stack

; *** proceed
call H_GET_DATA_FROM_TOS ; read (y)
decf FSR ; TOS-1
subwf INDF ; (x-y)
decf SP ;
return

; ***************************************************************
; *** DEC ***
; ***********
; x -- (x-1)
; decrement

H_TOKEN_24
; *** check underflow
call H_CHKSTACK_0 ;
btfsc STATUS,Z ; dataSP=0?
goto H_ERROR ; no elements at data stack

; *** proceed
call H_GET_DATA_FROM_TOS ; read (x) but ignore it
decf INDF ; x:=x-1
return ;

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru