JNAsm implementation in progress.
[jnode:svn-mirror.git] / builder / src / builder / org / jnode / jnasm / assembler / PseudoInstructions.java
1 /**
2  * $Id$  
3  */
4 package org.jnode.jnasm.assembler;
5
6 import org.jnode.assembler.NativeStream;
7
8 import java.util.List;
9 import java.util.Map;
10
11 /**
12  * @author Levente S\u00e1ntha
13  */
14 public class PseudoInstructions extends AssemblerModule {
15     protected static final Map INSTRUCTION_MAP;
16     private static final String[] MNEMONICS;
17     public static final int DB_ISN = 0;
18     public static final int DW_ISN = DB_ISN + 1;
19     public static final int DD_ISN = DW_ISN + 1;
20
21     static {
22         Map map = InstructionUtils.getInstructionMap(PseudoInstructions.class);
23         String[] mnemonics = InstructionUtils.getMnemonicArray(map);
24         INSTRUCTION_MAP = map;
25         MNEMONICS = mnemonics;
26     }
27
28     private List operands;
29     private NativeStream stream;
30
31     public PseudoInstructions(final Map labels) {
32         super(labels);
33     }
34
35     public void setNativeStream(NativeStream stream) {
36         this.stream = stream;
37     }
38
39     public boolean emmit(String mnemonic, List operands) {
40         this.operands = operands;
41
42         Integer key = (Integer) INSTRUCTION_MAP.get(mnemonic);
43
44         if (key == null) return false;
45
46         switch (key.intValue()) {
47             case DB_ISN:
48                 emmitDB();
49                 break;
50             case DW_ISN:
51                 emmitDW();
52                 break;
53             case DD_ISN:
54                 emmitDD();
55                 break;
56             default:
57                 throw new Error("Invalid instruction binding " + key.intValue() + " for " + mnemonic);
58         }
59
60         return true;
61     }
62
63
64     private void emmitDB() {
65         int ln = operands.size();
66         for (int i = 0; i < ln; i++) {
67             Object o = (Object) operands.get(i);
68             if (o instanceof Integer) {
69                 stream.write8(((Integer) o).intValue());
70             } else if (o instanceof String) {
71                 byte[] bytes = ((String) o).getBytes();
72                 int bln = bytes.length;
73                 for (int j = 0; j < bln; j++) {
74                     stream.write8(bytes[j]);
75                 }
76             } else {
77                 System.out.println("unkown data: " + o);
78             }
79         }
80     }
81
82     private void emmitDW() {
83         int ln = operands.size();
84         for (int i = 0; i < ln; i++) {
85             Object o = (Object) operands.get(i);
86             if (o instanceof Integer) {
87                 stream.write16(((Integer) o).intValue());
88             } else if (o instanceof String) {
89                 byte[] bytes = ((String) o).getBytes();
90                 int bln = bytes.length;
91                 for (int j = 0; j < bln; j++) {
92                     stream.write8(bytes[j]);
93                 }
94                 if (bln % 2 == 1)
95                     stream.write8(0);
96             } else {
97                 System.out.println("unkown data: " + o);
98             }
99         }
100     }
101
102     private void emmitDD() {
103         int ln = operands.size();
104         for (int i = 0; i < ln; i++) {
105             Object o = (Object) operands.get(i);
106             if (o instanceof Integer) {
107                 stream.write32(((Integer) o).intValue());
108             } else if (o instanceof String) {
109                 byte[] bytes = ((String) o).getBytes();
110                 int bln = bytes.length;
111                 for (int j = 0; j < bln; j++) {
112                     stream.write8(bytes[j]);
113                 }
114                 bln = (4 - bln % 4) % 4;
115                 for (int j = 0; j < bln; j++) {
116                     stream.write8(0);
117                 }
118             } else {
119                 System.out.println("unkown data: " + o);
120             }
121         }
122     }
123 }