home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / MISC / FPC355_5.ZIP / TCOM96.ZIP / TCOM96 / COMPILER / HEXSAVE.SEQ < prev    next >
Encoding:
Text File  |  1990-10-23  |  4.7 KB  |  132 lines

  1. \\ HEXSAVE.SEQ   save target image as a HEX file
  2.  
  3. {
  4.  
  5. ONLY FORTH ALSO COMPILER ALSO FORTH DEFINITIONS
  6.  
  7.  
  8. 0 value grabcnt
  9. : grab ( n -- ) \ grab n and add to string at pad
  10.         grabcnt pad + c!  incr> grabcnt  ;
  11. : grab" ( a n -- ) \ grab string length n from a and add to string at pad
  12.         pad grabcnt +  swap dup +!> grabcnt  cmove  ;
  13. : g# ( n -- a c ) \ number conversion to 2 digit ASCII
  14.         0   <# # # #>   ;
  15.  
  16. : write-hexline ( -- ) \ write one line from pad to the HEX file
  17.         pad grabcnt
  18.         ( line-addr line-len )  dup>r
  19.         targethndl hwrite r> -       \ write a line of CODE in HEX
  20.         if      0 " Error while saving CODE to HEX file."
  21.                 "errmsg2 abort
  22.         then  ;
  23.  
  24. 0 value target-addr
  25. 0 value seg-length
  26. 0 value cksum
  27.  
  28. : build-hexline ( -- )
  29.         base @ >r  hex
  30.         off> grabcnt            \ build HEX line at pad
  31.         off> cksum
  32.         " :" grab"              \ start with a :
  33.         seg-length 16 min g# grab"              \ byte count for this line
  34.         target-addr split g# grab" g# grab"     \ target address
  35.         " 00"  grab"                            \ two 0's
  36.         16 0 DO
  37.                 seg-code target-addr c@L  \ get a code byte
  38.                 dup +!> cksum           \ add to checksum
  39.                 g# grab"                \ put in hex line
  40.                 incr> target-addr         \ next image address
  41.                 decr> seg-length
  42.                 seg-length 0= ?leave
  43.              LOOP
  44.         cksum negate $0ff and  g# grab" \ put in the checksum
  45.         13 grab 10 grab                 \ put in an end-of-line
  46.         r> base !
  47.         write-hexline  ;
  48.  
  49.  
  50. : SAVE-HEX  \ write the contents of the hex file
  51.         base @ >r  hex
  52.         segments
  53.         begin   @ dup while \ for each segment
  54.                 dup 2+ @        \ get segment start
  55.                 dup !> target-addr  dup 6 u.r
  56.                 over 4 + @      \ get segment end
  57.                 swap -          \ make segment length  (S start length )
  58.                 dup !> seg-length   dup 8 u.r
  59.                 0 ?do  build-hexline  16 +loop  \ write the segment
  60.                 cr
  61.                 repeat
  62.         drop
  63.         off> grabcnt
  64.         " :00000001FF" grab" 13 grab 10 grab    \ add ending line
  65.         write-hexline
  66.         r> base !  ;
  67.  
  68. : %save-image.hex ( | -- )
  69.                 [compiler]
  70.              seqhandle image.name   $>handle " HEX" ">$ image.name   $>ext
  71.                 ?cerrors ?exit
  72.                 #unres
  73.         if      cr ." \3 Image not saved \0, some symbols \2 UNRESOLVED! "
  74.                 cr here-t code-start -
  75.                    here-d data-start - + 5 .r ."  Bytes compiled"
  76.         else    image.name targethndl $>handle
  77.                 targethndl hcreate                      \ make image.hex
  78.                 if      0 " Error while creating HEX file." "errmsg2
  79.                         abort
  80.                 then
  81.                 cr cr ." Created HEX file."
  82.                 data-seg-fix                    \ adjust HERE-T and fix
  83.                                                 \ DATA segment alignment
  84.                 dp-set                          \ set targets DP
  85.                 cr ." Segments"
  86.                 cr ." Address   Length" cr
  87.                 SAVE-HEX
  88.  
  89.         then    cr ;
  90.  
  91. ' %SAVE-IMAGE.HEX IS SAVE-IMAGE.COM
  92.  
  93. }
  94.  
  95. : write-to-index ( n a -- ) \ write one byte to the index file
  96.         2drop  ;
  97.  
  98. : write-segment ( -- ) \ write up to 100 bytes of a segment to the index file
  99.         target-addr 10 *d symhndl movepointer
  100.         pad 1000 symhndl hread
  101.         0<> if  pad 7 +         \ point to code place in index file image
  102.                 100 0 DO
  103.                         seg-code target-addr c@L  \ get a code byte
  104.                         over c!                 \ put it in the index file
  105.                         incr> target-addr       \ next image address
  106.                         decr> seg-length
  107.                         10 +
  108.                         seg-length 0= ?leave
  109.                      LOOP
  110.                 drop
  111.             then
  112.         pad 1000 symhndl hwrite drop
  113.         ;
  114.  
  115.  
  116. : SAVE-INC  \ write the image into the index file
  117.         cr ." Writing into index file" cr
  118.         segments
  119.         begin   @ dup while \ for each segment
  120.                 dup 2+ @        \ get segment start
  121.                 dup !> target-addr  dup 6 u.r
  122.                 over 4 + @      \ get segment end
  123.                 swap -          \ make segment length  (S start length )
  124.                 dup 8 u.r
  125.                 dup !> seg-length
  126.                 0 ?do  write-segment  100 +loop  \ write the segment
  127.                 cr
  128.                 repeat
  129.         drop
  130.         ;
  131.  
  132.