home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tutor / l6p060 < prev    next >
Text File  |  1990-07-15  |  4KB  |  113 lines

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 6 Part 060  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.            ┌──────────────────────────────────────────┐
  6.            │  Converting a digit string with an       │
  7.            │  optional -ve sign into a double number. │
  8.            └──────────────────────────────────────────┘
  9.  
  10. The definition below does not handle embedded decimal points.
  11. \ Convert a ASCII digit string to a double number.
  12. :  VAL  ( addr count -- dn  flag )
  13.         PAD SWAP CPACK     \ Copy and pack string at PAD buffer.
  14.         BL PAD COUNT + C!  \ Add a blank at the end of string.
  15.         0 0                \ Double number accumulator.
  16.         PAD                \ Start address-1
  17.         CONVERT            \ Convert the number.
  18.         DUP C@ ASCII - =   \ Stopped by -ve sign?
  19.         IF  CONVERT        \ If so continue conversion.
  20.             >R DNEGATE R>  \ Apply the -ve sign to result.
  21.         THEN C@  BL =  ;   \ Successful conversion if we end
  22.                            \ with a blank.
  23. : D#IN   ( -- dn )
  24.          BEGIN  READLINE  BUFFER1 LEN @ VAL NOT
  25.          WHILE  CR ." REDO FROM START"  2DROP
  26.          REPEAT  ;
  27.  
  28. ╓─────────────╖
  29. ║ Problem 6.7 ║
  30. ╙─────────────╜
  31. a) Modify VAL so it will skip over any embedded decimal points.
  32. b) Modify VAL so that the Forth VARIABLE  DPL is set to -1 or true if no
  33.    decimal point is entered.  Set DPL to the number of digits following
  34.    the decimal point if a decimal point is entered.
  35.  
  36. Although most Forth Programmers like to build their own string to number
  37. conversion routines you might like to use F-PC's word NUMBER instead.
  38.  
  39. NUMBER ( addr -- dn )
  40. Convert the packed string delimited by a blank at addr into a double number
  41. dn.  Viewing NUMBER and its relatives might help you with the modifications
  42. to definition of VAL requested in problem 6.7
  43.  
  44.           ┌─────────────────────────────────────────┐
  45.           │  The Hex ASCII Dump Programming Project │
  46.           └─────────────────────────────────────────┘
  47.  
  48. \ Leave true flag if  a <= x <= b .
  49. : [IN]  ( x a b -- f )
  50.         1+ -ROT 1- OVER < -ROT > AND ;
  51.  
  52. \ Display n as printable ascii or a space. BL is a Forth CONSTANT
  53. \ whose value is the 32 the decimal value for an ASCII space.
  54. : .ASCII ( n  -- )
  55.         127 AND DUP BL 126 [IN] NOT
  56.         IF DROP BL THEN EMIT ;
  57.  
  58. \ Double space if i is equal to 8 . Used to format output.
  59. : ?SPACE ( i  -- )
  60.          8 = IF SPACE SPACE THEN ;
  61.  
  62. \ Print byte right justified in field w wide.  The number formatting
  63. \ operators will be explained shortly.
  64. : .RBYTE ( n w  -- )
  65.          >R 0 <# # # #>
  66.          R> OVER -
  67.          SPACES TYPE ;
  68.  
  69. \ Based on address addr ,  display heading for VERIFY
  70. : HEAD  ( addr -- )
  71.       CR 5 SPACES
  72.       16 0 DO I OVER + 255 AND
  73.               I ?SPACE 3 .RBYTE
  74.            LOOP 2 SPACES
  75.       16 0 DO I OVER + 15 AND 1 .R
  76.            LOOP DROP ;
  77.  
  78. \ Verify 16 bytes from address.
  79. : 1LINE     ( addr -- )
  80.    DUP CR 0 4 D.R SPACE  DUP           \ Display address.
  81.    16 0 DO   I ?SPACE COUNT  3 .RBYTE  \ Display bytes in hex.
  82.         LOOP DROP 2 SPACES
  83.    16 0 DO   COUNT  .ASCII             \ Display bytes as ASCII.
  84.         LOOP DROP SPACE   ;
  85.  
  86. : VERIFY ( addr -- ) \ Only 32 bytes from addr with header.
  87.      BASE @ SWAP HEX DUP HEAD
  88.      DUP 1LINE
  89.      DUP 16 + 1LINE
  90.      HEAD  CR BASE ! ;
  91.  
  92. ╓─────────────╖
  93. ║ Problem 6.8 ║
  94. ╙─────────────╜
  95. Use  HEAD  and 1LINE to write a word called HADUMP ( for HexAsciiDUMP )
  96. whose stack inputs are ( addr n -- ) that will save the current system
  97. BASE , and then do a Hex ASCII DUMP of n bytes of memory starting at
  98. addr .  Your HADUMP routine should pause after every 8 lines ( if n is
  99. large enough ) and wait for a key press before continuing with a new
  100. header.
  101.  
  102. ╓──────────────╖
  103. ║ Problem 6.9  ║
  104. ╙──────────────╜
  105. Modify HADUMP to save the last memory location displayed in a VARIABLE .
  106. Now write the word  DMORE ( -- ) which dumps an additional 8 lines from
  107. the location saved by HADUMP .  Make sure that DMORE updates the last
  108. memory location displayed so you can do successive DMOREs .
  109.  
  110. ┌────────────────────────────────────┐
  111. │  Please Move to Lesson 6 Part 070  │
  112. └────────────────────────────────────┘
  113.