/Z80-Assm-BAK/src/ll.Mod

https://github.com/fitzer8/Z80Asm · Unknown · 278 lines · 238 code · 40 blank · 0 comment · 0 complexity · 300ba68d25715382ae8c847c802b38b9 MD5 · raw file

  1. MODULE ll;
  2. (*###############################################################
  3. # Title: ll
  4. # Func: This is a test of the ArrayList lib in oo2c.
  5. # Author: Fitz.
  6. # Ver: 0.0
  7. # Todo:
  8. # Add something here.
  9. #================================================================
  10. # HISTORY
  11. #================================================================
  12. # DATE # NAME # COMMENT
  13. #================================================================
  14. # 20110428 # Fitz # Original.
  15. # 20110428 # Fitz # Original 0.1 release.
  16. # 20110428 # Fitz # 0.2 Object code now output.
  17. ###############################################################*)
  18. IMPORT
  19. libc,
  20. Out,
  21. Ascii,
  22. Strings,
  23. CharClass,
  24. Object,
  25. LL := ADT:LinkedList,
  26. Utils,
  27. This, Debug
  28. ;
  29. CONST
  30. maxStringLen = 256;
  31. maxSymLen = 256;
  32. maxOpcdLen = 6;
  33. maxLineNoLen = 8;
  34. TYPE
  35. Integer = INTEGER;
  36. Boolean = BOOLEAN;
  37. String* = ARRAY maxStringLen OF CHAR;
  38. SymStr* = ARRAY maxSymLen OF CHAR;
  39. SymEntry* = POINTER TO SymEntryDesc;
  40. SymEntryDesc = RECORD (Object.ObjectDesc)
  41. name* : SymStr; (* Symbol name *)
  42. value* : LONGINT; (* Symbol value *)
  43. next : SymEntry; (* Pointer to next symtab entry *)
  44. defined* : Boolean; (* TRUE if defined *)
  45. multiDef* : Boolean; (* TRUE if multiply defined *)
  46. isSet* : Boolean; (* TRUE if defined with SET pseudo *)
  47. equ* : Boolean; (* TRUE if defined with EQU pseudo *)
  48. END;
  49. symList* = LL.LinkedList( SymEntry );
  50. symIter* = LL.Iterator( SymEntry );
  51. VAR
  52. DBG : BOOLEAN;
  53. symTab: SymEntry; (* Pointer to first entry in symtab *)
  54. SymNtry : SymEntry;
  55. SymList : symList;
  56. SymIter : symIter;
  57. Ntry : SymEntry;
  58. name : SymStr;
  59. (*###############################################################
  60. # Title: FindSym
  61. # Func: Assign object and list files to their file handles.
  62. # Author: Fitz
  63. # Ver: 0.0
  64. #================================================================
  65. # HISTORY
  66. #================================================================
  67. # DATE # NAME # COMMENT
  68. #================================================================
  69. # 201012203 # Fitz # Original.
  70. ###############################################################*)
  71. PROCEDURE FindSym( );
  72. VAR
  73. DBG : BOOLEAN;
  74. Ntry : SymEntry;
  75. found : Boolean;
  76. BEGIN
  77. DBG := FALSE;
  78. DBG := TRUE;
  79. IF DBG THEN
  80. Debug.Entry( This.File(), This.Func() );
  81. END;
  82. Ntry := SymList.Get( 0 );
  83. SymIter := SymList.GetIterator(NIL);
  84. WHILE SymIter.HasNext() DO
  85. Ntry := SymIter.Next();
  86. IF DBG THEN
  87. Out.String( "Addr: 0x" );
  88. Out.Hex( Ntry.value, 4 );
  89. Out.String( " name: " ); Out.String( Ntry.name );
  90. Out.Ln; Out.Ln;
  91. END;
  92. END;
  93. IF DBG THEN
  94. Debug.Exit( This.File(), This.Func() );
  95. END;
  96. END FindSym;
  97. (*###############################################################
  98. # Title: NextSym
  99. # Func: Find the symbol that has a lexical value greater
  100. # than SymStr.
  101. # Author: Fitz
  102. # Ver: 0.0
  103. #================================================================
  104. # HISTORY
  105. #================================================================
  106. # DATE # NAME # COMMENT
  107. #================================================================
  108. # 20110502 # Fitz # Original.
  109. ###############################################################*)
  110. PROCEDURE NextSym( SymName: SymStr ) : LONGINT;
  111. VAR
  112. DBG : BOOLEAN;
  113. Ntry : SymEntry;
  114. found : Boolean;
  115. idx : LONGINT;
  116. BEGIN
  117. DBG := FALSE;
  118. DBG := TRUE;
  119. IF DBG THEN
  120. Debug.Entry( This.File(), This.Func() );
  121. END;
  122. IF DBG THEN
  123. Debug.Debug;
  124. Debug.Label( "SymName" );
  125. Debug.QString( SymName );
  126. Debug.Nl;
  127. END;
  128. found := FALSE;
  129. NEW( Ntry );
  130. Ntry := SymList.Get( 0 );
  131. SymIter := SymList.GetIterator(NIL);
  132. LOOP
  133. IF SymIter.HasNext() THEN
  134. Ntry := SymIter.Next();
  135. ELSE
  136. EXIT;
  137. END;
  138. IF DBG THEN
  139. Out.String( "idx: " );
  140. Out.LongInt( SymList.IndexOf( Ntry ), 3 );
  141. Out.String( " Addr: 0x" );
  142. Out.Hex( Ntry.value, 4 );
  143. Out.String( " Ntry.name: " ); Out.String( Ntry.name );
  144. Out.String( " SymName: " ); Out.String( SymName );
  145. Out.Ln; Out.Ln;
  146. END;
  147. IF Strings.Compare( Ntry.name, SymName ) = Strings.greater THEN
  148. Out.String( "greater" ); Out.Ln;
  149. found := TRUE;
  150. EXIT;
  151. END;
  152. END;
  153. idx := SymList.IndexOf( Ntry );
  154. IF DBG THEN
  155. Debug.Exit( This.File(), This.Func() );
  156. END;
  157. RETURN idx;
  158. END NextSym;
  159. (*###############################################################
  160. # Title: AddSym
  161. # Func: Assign object and list files to their file handles.
  162. # Author: Fitz
  163. # Ver: 0.0
  164. #================================================================
  165. # HISTORY
  166. #================================================================
  167. # DATE # NAME # COMMENT
  168. #================================================================
  169. # 201012203 # Fitz # Original.
  170. ###############################################################*)
  171. PROCEDURE AddSym( SymName: SymStr );
  172. VAR
  173. DBG : BOOLEAN;
  174. Ntry : SymEntry;
  175. p : SymEntry;
  176. found : Boolean;
  177. idx : LONGINT;
  178. BEGIN
  179. DBG := FALSE;
  180. DBG := TRUE;
  181. IF DBG THEN
  182. Debug.Entry( This.File(), This.Func() );
  183. END;
  184. IF DBG THEN
  185. Debug.Debug;
  186. Debug.Label( "SymName" );
  187. Debug.QString( SymName );
  188. Debug.Nl;
  189. END;
  190. found := FALSE;
  191. NEW( p );
  192. p.value := 0;
  193. p.name := SymName;
  194. p.defined := FALSE;
  195. p.multiDef := FALSE;
  196. p.isSet := FALSE;
  197. p.equ := FALSE;
  198. Out.String( " p.name: " ); Out.String( p.name );
  199. Out.Ln; Out.Ln;
  200. idx := NextSym( SymName );
  201. Ntry := SymList.Get( idx );
  202. SymList.Insert( idx, p );
  203. IF DBG THEN
  204. Debug.Exit( This.File(), This.Func() );
  205. END;
  206. END AddSym;
  207. BEGIN
  208. (*################################################
  209. # This symbol put in there to prevent conditional
  210. # processing later to determine if we need an
  211. # Insert or an Append.
  212. ################################################*)
  213. SymList := NEW( symList );
  214. NEW( SymNtry );
  215. SymNtry.value := 0;
  216. SymNtry.name := "ooo";
  217. SymList.Append( SymNtry );
  218. (*
  219. SymList.Insert( 0, SymNtry );
  220. *)
  221. NEW( SymNtry );
  222. SymNtry.value := 0100H;
  223. SymNtry.name := "stack";
  224. SymList.Append( SymNtry );
  225. Out.LongInt( SymNtry.value, 5 );
  226. Out.String( " : Total Error(s)" );
  227. Out.Ln;
  228. name := "aaa";
  229. AddSym( name );
  230. name := "rrr";
  231. AddSym( name );
  232. name := "zzz";
  233. AddSym( name );
  234. FindSym;
  235. END ll.
  236. (*###############################################################
  237. FFFFFFFFFFFFFFFFFFFFFFFFFF
  238. ###############################################################*)