; /--- FUNCTIONS ---/


;#########################
;#      BLITZ-GP         #
;#                       #
;# Copyright (C) 1998 by #
;# Christos Dimitrakakis #
;#                       #
;#########################



;  In this file the code of functions is defined


XINCLUDE "defines.bb2"
XINCLUDE "funcdef.bb2"

;    --- Function Set Code ---




;f_set(0)\func=  ?func_BRA, #EXPR, 1, "BRA A(PC)"
;f_set(1)\func=  ?func_BEQ, #EXPR, 1, "BEQ A(PC)"
;f_set(2)\func=  ?func_BGT, #EXPR, 1, "BGT A(PC)"
;f_set(3)\func=  ?func_BLT, #EXPR, 1, "BLT A(PC)"
;f_set(4)\func=  ?func_SWA, #EXPR, 1, "SWAP A,B"
;f_set(5)\func=  ?func_A2B, #EXPR, 1, "MOVE A,B"
;f_set(6)\func=  ?func_B2A, #EXPR, 1, "MOVE B,A"
;f_set(7)\func=  ?func_B2X, #EXPR, 1, "MOVE B,X"
;f_set(8)\func=  ?func_X2B, #EXPR, 1, "MOVE X,B"
;f_set(9)\func=  ?func_XiA, #EXPR, 1, "MOVE [X],A"
;f_set(10)\func= ?func_AiX, #EXPR, 1, "MOVE A,[X]"
;f_set(11)\func= ?func_mXA, #EXPR, 1, "MOVE -[X],A"
;f_set(12)\func= ?func_AXp, #EXPR, 1, "MOVE A,[X]+"
;f_set(13)\func= ?func_ADD, #EXPR, 1, "ADD A,B"
;f_set(14)\func= ?func_SUB, #EXPR, 1, "SUB A,B"
;f_set(15)\func= ?func_MUL, #EXPR, 1, "MUL A,B"
;f_set(16)\func= ?func_DIV, #EXPR, 1, "DIV A,B"
;f_set(17)\func= ?func_AND, #EXPR, 1, "AND A,B"
;f_set(18)\func= ?func_OR,  #EXPR, 1, "OR A,B"
;f_set(19)\func= ?func_XOR, #EXPR, 1, "XOR A,B"
;f_set(20)\func= ?func_CLR, #EXPR, 1, "CLR A"
;f_set(21)\func= ?func_INC, #EXPR, 1, "INC A"
;f_set(22)\func= ?func_DEC, #EXPR, 1, "DEC A"
;f_set(23)\func= ?func_CMP, #EXPR, 1, "CMP A,B"
;f_set(24)\func= ?func_TST, #EXPR, 1, "TST A"
;f_set(25)\func= ?func_ANS, #EXPR, 1, "OUT A,goNS"
;f_set(26)\func= ?func_AEW, #EXPR, 1, "OUT A,goEW"
;f_set(27)\func= ?func_BNS, #EXPR, 1, "OUT B,goNS"
;f_set(28)\func= ?func_BEW, #EXPR, 1, "OUT B,goEW"
;f_set(29)\func= ?func_INS, #EXPR, 1, "IN dirNS,A"
;f_set(30)\func= ?func_IEW, #EXPR, 1, "IN dirEW,A"
;f_set(31)\func= ?func_JS0, #EXPR, 1, "JSR func0"
;f_set(32)\func= ?func_RTS, #EXPR, 1, "RTS"



.func_JS1
  vm\pcstack[sp]=vm\pc
  vm\trstack[sp]=tree
  vm\sp+1
  If vm\sp>stack_size Then vm\exc=1
  vm\pc=0
  tree=1
  x$=*curr_ind\tr[tree]
  x=Len(x$)
  RTS

.func_JS2
  vm\pcstack[sp]=vm\pc
  vm\trstack[sp]=tree
  vm\sp+1
  If vm\sp>stack_size Then vm\exc=1
  vm\pc=0
  tree=2
  x$=*curr_ind\tr[tree]
  x=Len(x$)
  RTS

.func_JS3
  vm\pcstack[sp]=vm\pc
  vm\trstack[sp]=tree
  vm\sp+1
  If vm\sp>stack_size Then vm\exc=1
  vm\pc=0
  tree=3
  x$=*curr_ind\tr[tree]
  x=Len(x$)
  RTS



.func_RTS
  vm\sp-1
  If vm\sp<0
    vm\exc=2
  Else
    vm\pc=vm\pcstack[sp]
    tree=vm\trstack[sp]
    x$=*curr_ind\tr[tree]
    x=Len(x$)
  EndIf

  RTS


.func_BRA
  If vm\a=-1 Then vm\exc=4
  vm\pc+vm\a
  RTS

.func_BEQ
  If vm\a=-1 Then vm\exc=4
  If vm\NZ=0
    vm\pc+vm\a
  EndIf
  RTS

.func_BGT
  If vm\a=-1 Then vm\exc=4
  If vm\NZ=1
    vm\pc+vm\a
  EndIf
  RTS

.func_BLT
  If vm\a=-1 Then vm\exc=4
  If vm\NZ=-1
    vm\pc+vm\a
  EndIf
  RTS

.func_SWA
  tmpl.l=vm\b
  vm\b=vm\a
  vm\a=templ
  RTS

.func_A2B
  vm\b=vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_B2A
  vm\a=vm\b
  vm\NZ=Sgn(vm\a)
  RTS

.func_B2X
  vm\x=vm\b
  vm\NZ=Sgn(vm\x)
  RTS

.func_X2B
  vm\b=vm\x
  vm\NZ=Sgn(vm\b)
  RTS

.func_XiA
  If (vm\x>=0 AND vm\x<mem_size)
    vm\a=mem(vm\x)
  Else
    vm\a=Rnd(65536)*65535
  EndIf

  vm\NZ=Sgn(vm\a)
  RTS

.func_AiX
  If (vm\x>=0 AND vm\x<mem_size)
    mem(vm\x)=vm\a
  EndIf

  vm\NZ=Sgn(vm\a)
  RTS

.func_mXA
  vm\x-1
  If (vm\x>=0 AND vm\x<mem_size)
    vm\a=mem(vm\x)
  Else
    vm\a=Rnd(65536)*65535
  EndIf

  vm\NZ=Sgn(vm\a)
  RTS

.func_AXp
  If (vm\x>=0 AND vm\x<mem_size)
    mem(vm\x)=vm\a
  EndIf
  vm\x+1
  vm\NZ=Sgn(vm\a)
  RTS

.func_ADD
  vm\b+vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_SUB
  vm\b-vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_MUL
  vm\b*vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_DIV
  If vm\a<>0
    vm\b/vm\a
    vm\NZ=Sgn(vm\b)
  EndIf
  RTS

.func_AND
  vm\b AND vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_OR
  vm\b OR vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_XOR
  vm\b EOR vm\a
  vm\NZ=Sgn(vm\b)
  RTS

.func_CLR
  vm\a=0
  vm\NZ=0
  RTS

.func_INC
  vm\a+1
  vm\NZ=Sgn(vm\a)
  RTS

.func_DEC
  vm\a-1
  vm\NZ=Sgn(vm\a)
  RTS

.func_CMP
  vm\NZ=Sgn(vm\a-vm\b)
  RTS

.func_TST
  vm\NZ=Sgn(vm\a)
  RTS

.func_MRK

  RTS

