|
Это примеры виртуальной 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+) tokenorg 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 stackH_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 errorH_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 >0H_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 stackH_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)
; sumH_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)
; incrementH_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 wordH_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)
; decrementH_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