1 \ @(#) savedicd.fth 98/01/26 1.2
\r
2 \ Save dictionary as data table.
\r
5 \ Copyright 1987 Phil Burk
\r
6 \ All Rights Reserved.
\r
8 \ 970311 PLB Fixed problem with calling SDAD when in HEX mode.
\r
9 \ 20010606 PLB Fixed AUTO.INIT , started with ';' !!
\r
12 ANEW TASK-SAVE_DIC_AS_DATA
\r
14 \ !!! set to 4 for minimally sized dictionary to prevent DIAB
\r
15 \ compiler from crashing! Allocate more space in pForth.
\r
16 4 constant SDAD_NAMES_EXTRA \ space for additional names
\r
17 4 constant SDAD_CODE_EXTRA \ space for additional names
\r
19 \ buffer the file I/O for better performance
\r
20 256 constant SDAD_BUFFER_SIZE
\r
21 create SDAD-BUFFER SDAD_BUFFER_SIZE allot
\r
22 variable SDAD-BUFFER-INDEX
\r
23 variable SDAD-BUFFER-FID
\r
26 : SDAD.FLUSH ( -- ior )
\r
27 sdad-buffer sdad-buffer-index @ \ data
\r
29 sdad-buffer-fid @ write-file
\r
30 0 sdad-buffer-index !
\r
33 : SDAD.EMIT ( char -- )
\r
34 sdad-buffer-index @ sdad_buffer_size >=
\r
36 sdad.flush abort" SDAD.FLUSH failed!"
\r
39 sdad-buffer sdad-buffer-index @ + c!
\r
40 1 sdad-buffer-index +!
\r
43 : SDAD.TYPE ( c-addr cnt -- )
\r
45 dup c@ sdad.emit \ char to buffer
\r
46 1+ \ advance char pointer
\r
51 : $SDAD.LINE ( $addr -- )
\r
56 : (U8.) ( u -- a l , unsigned conversion, at least 8 digits )
\r
57 0 <# # # # # # # # #S #>
\r
59 : (U2.) ( u -- a l , unsigned conversion, at least 2 digits )
\r
64 SDAD-BUFFER-FID @ ?dup
\r
66 sdad.flush abort" SDAD.FLUSH failed!"
\r
72 : SDAD.OPEN ( -- ior, open file )
\r
74 s" pfdicdat.h" r/w create-file dup >r
\r
76 drop ." Could not create file pfdicdat.h" cr
\r
83 : SDAD.DUMP.HEX { val -- }
\r
95 : SDAD.DUMP.HEX.BYTE { val -- }
\r
101 : SDAD.DUMP.HEX.BYTE,
\r
106 : SDAD.DUMP.DATA { start-address end-address num-zeros | num-bytes -- }
\r
107 end-address start-address - -> num-bytes
\r
110 i $ 7FF and 0= IF ." 0x" i .hex cr THEN \ progress report
\r
117 s" : */ " sdad.type
\r
118 THEN \ 16 bytes per line, print offset
\r
119 start-address i + c@
\r
120 sdad.dump.hex.byte,
\r
125 i $ 7FF and 0= IF i . cr THEN \ progress report
\r
126 i 15 and 0= IF EOL sdad.emit THEN \ 15 numbers per line
\r
127 0 sdad.dump.hex.byte,
\r
131 : SDAD.DEFINE { $name val -- }
\r
132 s" #define " sdad.type
\r
133 $name count sdad.type
\r
139 : IS.LITTLE.ENDIAN? ( -- flag , is Forth in Little Endian mode? )
\r
144 : SDAD { | fid -- }
\r
145 sdad.open abort" sdad.open failed!"
\r
147 c" /* This file generated by the Forth command SDAD */" $sdad.line
\r
149 c" HEADERPTR" headers-ptr @ namebase - sdad.define
\r
150 c" RELCONTEXT" context @ namebase - sdad.define
\r
151 c" CODEPTR" here codebase - sdad.define
\r
152 c" IF_LITTLE_ENDIAN" IS.LITTLE.ENDIAN? IF 1 ELSE 0 THEN sdad.define
\r
154 ." Saving Names" cr
\r
155 s" static const uint8_t MinDicNames[] = {" sdad.type
\r
156 namebase headers-ptr @ SDAD_NAMES_EXTRA sdad.dump.data
\r
161 s" static const uint8_t MinDicCode[] = {" sdad.type
\r
162 codebase here SDAD_CODE_EXTRA sdad.dump.data
\r
169 if.forgotten sdad.close
\r
171 : AUTO.INIT ( -- , init at launch )
\r
172 auto.init \ daisy chain initialization
\r
173 0 SDAD-BUFFER-FID !
\r
174 0 SDAD-BUFFER-INDEX !
\r