~ubuntu-branches/ubuntu/utopic/vice/utopic-proposed

« back to all changes in this revision

Viewing changes to src/monitor/mon_parse.y

  • Committer: Package Import Robot
  • Author(s): Logan Rosen
  • Date: 2014-05-10 21:08:23 UTC
  • mfrom: (17.1.1 sid)
  • Revision ID: package-import@ubuntu.com-20140510210823-v5aojvy1pv1sg132
Tags: 2.4.dfsg+2.4.6-1ubuntu1
Use autotools-dev to update config.{sub,guess} for new arches.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
#include "vice.h"
32
32
 
33
 
#ifndef MINIXVMD
 
33
#if !defined(__minix_vmd) && !defined(MACOS_COMPILE)
34
34
#ifdef __GNUC__
35
35
#undef alloca
 
36
#ifndef ANDROID_COMPILE
36
37
#define        alloca(n)       __builtin_alloca (n)
 
38
#endif
37
39
#else
38
40
#ifdef HAVE_ALLOCA_H
39
41
#include <alloca.h>
181
183
%token<i> MASK
182
184
%type<str> hunt_list hunt_element
183
185
%type<mode> asm_operand_mode
184
 
%type<i> index_reg index_usreg
 
186
%type<i> index_reg index_ureg
185
187
 
186
188
%left '+' '-'
187
189
%left '*' '/'
767
769
                          $$.addr_mode = ASM_ADDR_MODE_IMMEDIATE;
768
770
                          $$.param = $2;
769
771
                        } }
770
 
  | number { if ($1 < 0x100) {
 
772
  | number { if ($1 >= 0x10000) {
 
773
               $$.addr_mode = ASM_ADDR_MODE_ABSOLUTE_LONG;
 
774
               $$.param = $1;
 
775
             } else if ($1 < 0x100) {
771
776
               $$.addr_mode = ASM_ADDR_MODE_ZERO_PAGE;
772
777
               $$.param = $1;
773
778
             } else {
775
780
               $$.param = $1;
776
781
             }
777
782
           }
778
 
  | number COMMA REG_X  { if ($1 < 0x100) {
 
783
  | number COMMA REG_X  { if ($1 >= 0x10000) {
 
784
                            $$.addr_mode = ASM_ADDR_MODE_ABSOLUTE_LONG_X;
 
785
                            $$.param = $1;
 
786
                          } else if ($1 < 0x100) { 
779
787
                            $$.addr_mode = ASM_ADDR_MODE_ZERO_PAGE_X;
780
788
                            $$.param = $1;
781
789
                          } else {
791
799
                            $$.param = $1;
792
800
                          }
793
801
                        }
 
802
  | number COMMA REG_S  { if ($1 < 0x100) {
 
803
                            $$.addr_mode = ASM_ADDR_MODE_STACK_RELATIVE;
 
804
                            $$.param = $1;
 
805
                          } else { /* 6809 */
 
806
                            $$.addr_mode = ASM_ADDR_MODE_INDEXED;
 
807
                            if ($1 >= -16 && $1 < 16) {
 
808
                                $$.addr_submode = $3 | ($1 & 0x1F);
 
809
                            } else if ($1 >= -128 && $1 < 128) {
 
810
                                $$.addr_submode = 0x80 | $3 | ASM_ADDR_MODE_INDEXED_OFF8;
 
811
                                $$.param = $1;
 
812
                            } else if ($1 >= -32768 && $1 < 32768) {
 
813
                                $$.addr_submode = 0x80 | $3 | ASM_ADDR_MODE_INDEXED_OFF16;
 
814
                                $$.param = $1;
 
815
                            } else {
 
816
                                $$.addr_mode = ASM_ADDR_MODE_ILLEGAL;
 
817
                                mon_out("offset too large even for 16 bits (signed)\n");
 
818
                            }
 
819
                          }
 
820
                        }
794
821
  | number COMMA number { if ($1 < 0x100) {
795
822
                            $$.addr_mode = ASM_ADDR_MODE_DOUBLE;
796
823
                            $$.param = $3;
813
840
                                           $$.param = $2;
814
841
                                         }
815
842
                                       }
 
843
  | L_PAREN number COMMA REG_S R_PAREN COMMA REG_Y
 
844
    { $$.addr_mode = ASM_ADDR_MODE_STACK_RELATIVE_Y; $$.param = $2; }
816
845
  | L_PAREN number R_PAREN COMMA REG_Y
817
846
    { $$.addr_mode = ASM_ADDR_MODE_INDIRECT_Y; $$.param = $2; }
818
847
  | L_PAREN REG_BC R_PAREN { $$.addr_mode = ASM_ADDR_MODE_REG_IND_BC; }
850
879
  | REG_SP { $$.addr_mode = ASM_ADDR_MODE_REG_SP; }
851
880
    /* 6809 modes */
852
881
  | LESS_THAN number { $$.addr_mode = ASM_ADDR_MODE_DIRECT; $$.param = $2; }
853
 
  | number COMMA index_usreg {    /* Clash with addr,x addr,y modes! */
 
882
  | number COMMA index_ureg {    /* Clash with addr,x addr,y addr,s modes! */
854
883
        $$.addr_mode = ASM_ADDR_MODE_INDEXED;
855
884
        if ($1 >= -16 && $1 < 16) {
856
 
            $$.addr_submode = $3 | ($1 & 0x1F);
 
885
            $$.addr_submode = (3 << 5) | ($1 & 0x1F);
857
886
        } else if ($1 >= -128 && $1 < 128) {
858
 
            $$.addr_submode = 0x80 | $3 | ASM_ADDR_MODE_INDEXED_OFF8;
 
887
            $$.addr_submode = 0x80 | (3 << 5) | ASM_ADDR_MODE_INDEXED_OFF8;
859
888
            $$.param = $1;
860
889
        } else if ($1 >= -32768 && $1 < 32768) {
861
 
            $$.addr_submode = 0x80 | $3 | ASM_ADDR_MODE_INDEXED_OFF16;
 
890
            $$.addr_submode = 0x80 | (3 << 5) | ASM_ADDR_MODE_INDEXED_OFF16;
862
891
            $$.param = $1;
863
892
        } else {
864
893
            $$.addr_mode = ASM_ADDR_MODE_ILLEGAL;
973
1002
        $$.addr_submode = 0x80 | ASM_ADDR_MODE_EXTENDED_INDIRECT;
974
1003
        $$.param = $2;
975
1004
        }
 
1005
  | L_BRACKET number R_BRACKET COMMA REG_Y {
 
1006
        $$.addr_mode = ASM_ADDR_MODE_INDIRECT_LONG_Y;
 
1007
        $$.param = $2;
 
1008
        }
976
1009
  /* TODO: register lists for PSHx PULx, and register pairs for TFR and EXG */
977
1010
  ;
978
1011
 
979
1012
index_reg:
980
1013
    REG_X { $$ = (0 << 5); printf("reg_x\n"); }
981
1014
  | REG_Y { $$ = (1 << 5); printf("reg_y\n"); }
982
 
  | index_usreg { $$ = $1; }
 
1015
  | index_ureg { $$ = $1; }
 
1016
  | REG_S { $$ = (3 << 5); printf("reg_s\n"); }
983
1017
  ;
984
1018
 
985
 
index_usreg:
 
1019
index_ureg:
986
1020
    REG_U { $$ = (2 << 5); printf("reg_u\n"); }
987
 
  | REG_S { $$ = (3 << 5); printf("reg_s\n"); }
988
1021
  ;
989
1022
 
990
1023