1 \ @(#) savedicd.fth 98/01/26 1.2
2 \ Save dictionary as data table.
5 \ Copyright 1987 Phil Burk
8 \ 970311 PLB Fixed problem with calling SDAD when in HEX mode.
11 ANEW TASK-SAVE_DIC_AS_DATA
13 \ !!! set to 4 for minimally sized dictionary to prevent DIAB
14 \ compiler from crashing! Allocate more space in pForth.
15 4 constant SDAD_NAMES_EXTRA \ space for additional names
16 4 constant SDAD_CODE_EXTRA \ space for additional names
18 \ buffer the file I/O for better performance
19 256 constant SDAD_BUFFER_SIZE
20 create SDAD-BUFFER SDAD_BUFFER_SIZE allot
21 variable SDAD-BUFFER-INDEX
22 variable SDAD-BUFFER-FID
25 : SDAD.FLUSH ( -- ior )
26 sdad-buffer sdad-buffer-index @ \ data
28 sdad-buffer-fid @ write-file
32 : SDAD.EMIT ( char -- )
33 sdad-buffer-index @ sdad_buffer_size >=
35 sdad.flush abort" SDAD.FLUSH failed!"
38 sdad-buffer sdad-buffer-index @ + c!
39 1 sdad-buffer-index +!
42 : SDAD.TYPE ( c-addr cnt -- )
44 dup c@ sdad.emit \ char to buffer
45 1+ \ advance char pointer
50 : $SDAD.LINE ( $addr -- )
55 : (U8.) ( u -- a l , unsigned conversion, at least 8 digits )
56 0 <# # # # # # # # #S #>
58 : (U2.) ( u -- a l , unsigned conversion, at least 2 digits )
63 SDAD-BUFFER-FID @ ?dup
65 sdad.flush abort" SDAD.FLUSH failed!"
71 : SDAD.OPEN ( -- ior, open file )
73 s" pfdicdat.h" r/w create-file dup >r
75 drop ." Could not create file pfdicdat.h" cr
82 : SDAD.DUMP.HEX { val -- }
94 : SDAD.DUMP.HEX.BYTE { val -- }
100 : SDAD.DUMP.HEX.BYTE,
105 : SDAD.DUMP.DATA { start-address end-address num-zeros | num-bytes -- }
106 end-address start-address - -> num-bytes
109 i $ 7FF and 0= IF ." 0x" i .hex cr THEN \ progress report
117 THEN \ 16 bytes per line, print offset
124 i $ 7FF and 0= IF i . cr THEN \ progress report
125 i 15 and 0= IF EOL sdad.emit THEN \ 15 numbers per line
126 0 sdad.dump.hex.byte,
130 : SDAD.DEFINE { $name val -- }
131 s" #define " sdad.type
132 $name count sdad.type
138 : IS.LITTLE.ENDIAN? ( -- flag , is Forth in Little Endian mode? )
144 sdad.open abort" sdad.open failed!"
146 c" /* This file generated by the Forth command SAVE-DIC-AS-DATA */" $sdad.line
148 c" HEADERPTR" headers-ptr @ namebase - sdad.define
149 c" RELCONTEXT" context @ namebase - sdad.define
150 c" CODEPTR" here codebase - sdad.define
151 c" IF_LITTLE_ENDIAN" IS.LITTLE.ENDIAN? IF 1 ELSE 0 THEN sdad.define
154 s" static const uint8 MinDicNames[] = {" sdad.type
155 namebase headers-ptr @ SDAD_NAMES_EXTRA sdad.dump.data
160 s" static const uint8 MinDicCode[] = {" sdad.type
161 codebase here SDAD_CODE_EXTRA sdad.dump.data
168 if.forgotten sdad.close