SCR #49
               0 ( Introduction and load for DEMO data file.           MVP-FORTH)
               1 PAGE CR CR CR CR
               2 ."       ELEMENTS OF DATA BASE DESIGN " CR
               3 ."                   by"  CR
               4 ."             Glen B. Haydon" CR CR
               5 ." This demonstration data system provides a pattern for the "
               6 CR ." further development of any type of data base. "  CR
               7
               8 : PROCEED
               9    CR CR 9 SPACES  ." Enter Y to load screens "
              10    KEY  89 =  IF 50 58  DDUP INDEX CR  THRU THEN ;
              11
              12 PROCEED
              13
              14 EXIT
              15



             SCR #50
               0 ( File development   l of 2                           MVP-FORTH)
               1 VARIABLE REC#  0 REC# !  ( holds the current record number )
               2 VARIABLE OPEN  0 OPEN !  ( points to the current file descript)
               3
               4 : LAYOUT  ( --- bytes/rec-2, bytes/block-1 )
               5    OPEN @ 4 + D@ ;
               6
               7 : READ  ( n --- )  ( n-th record is made current )
               8    0 MAX DUP OPEN @ 2+ @ < 0=
               9    IF ." FILE ERROR " QUIT THEN  REC# ! ;
              10
              11 : RECORD  ( n --- address of n-th record )
              12    LAYOUT  */MOD  OPEN  @  @  + BLOCK  + UPDATE ;
              13
              14 : ADDRESS  ( --- address of the current record )
              15    REC# @ RECORD  ;

                       MOUNTAIN VIEW PRESS FORTH  VERSION 1.01.03


             SCR #51
               0 ( File development    2 of 2                           MVP-FORTH)
               1 : DFIELD
               2    CREATE OVER , +    ( Create data field and leave count )
               3    DOES>  @ ADDRESS + ;    ( Leave address )
               4
               5 : TFIELD
               6    CREATE OVER , DUP , +    ( Create text field and leave count  )
               7    DOES>  D@ ADDRESS + SWAP ;   ( Leave addr and count )
               8
               9 : FILE                 ( Create a named storage allocation)
              10    CREATE  ,           ( Origin block                     )
              11    1+ ,                ( Number of records in file        )
              12    DUP 1024 OVER / * , ( # nunber of bytes per block      )
              13    ,                   ( # bytes per record               )
              14    DOES> OPEN ! ;      ( When file name used,  point  to  )
              15                        ( its descriptor parameters.       )



             SCR #52
               0 ( Serial Day   1 of 3                                MVP-FORTH)
               l : D/   ( d, u --- d )
               2    SWAP OVER /MOD >R SWAP U/MOD SWAP DROP R> ;
               3 : D*   ( d, u --- d )
               4    DUP ROT * ROT ROT U* ROT + ; 
               5 : $-N   ( c --- d )
               6    WORD 0 0 ROT CONVERT DDROP ;
               7
               8 : TO.SERIAL.DAY   ( d, d, d, --- u )
               9     ROT DUP 3 < IF 13 + SWAP 1 -
              10                 ELSE 1 + SWAP THEN  
              11     52 - 365.25 ROT D* 100 D/ DROP
              12     SWAP 30.6001 ROT D* 10000 D/ DROP + + ;
              13
              14 : ?DATE  ." ( MM/DD/YY ) "       
              15    QUERY 47 $-N  47 $-N  BL $-N  TO.SERIAL.DAY ;



             SCR #53
               0 ( Serial Day   2 of 3                                 MVP-FORTH)
               1
               2 : YEARS   ( serial-day --- test-year )
               3    0 100 D* 36525 D/ DROP ;
               4  
               5 : DAYS/YEARS   ( year --- days )
               6    0 36525 D* 100 D/ DROP ;
               7
               8 : TEST.YEARS  ( serial-day, test-year --- year, days )
               9    DDUP DAYS/YEARS - DUP 123 <
              10      IF DROP 1- SWAP OVER DAYS/YEARS -
              11      ELSE ROT DROP
              12      THEN SWAP 52 + SWAP ;       
              13
              14 : MONTHS   ( days --- days, test-month )
              15    DUP 3267963. ROT D* 10000 D/ 10000 D/ DROP ;

                       MOUNTAIN VIEW PRESS FORTH  VERSION 1.01.03


             SCR #54
               0 ( Serial Day   3 of 3                                      MVP-FORTH)
               l : DAYS.TO.M/D/Y    ( years, days ---  years, days, months )
               2    MONTHS SWAP OVER 30.6001 ROT D* 10000
               3    D/ DROP - SWAP DUP 13 >
               4    IF 13 - ROT 1+ ROT ROT ELSE 1- THEN ;
               5    ?DUP
               6 : OUT.DATE   ( years, days, months --- )
               7    100 * + 0 100 D* ROT 0 D+
               8    <# # # 47 HOLD # # 47 HOLD # # #> TYPE ;
               9
              10 : CONV.SERIAL    ( serial-day --- years, days, months )
              11    DUP  YEARS  TEST.YEARS  DAYS.TO.M/D/Y ;
              12
              13 : .DATE    ( serial-day --- )
              14    ?DUP
              15    IF CONV.SERIAL OUT.DATE  ELSE ." 00/00/00" THEN ; EXIT



             SCR #55
               0 ( Factors for ?$AMOUNT & .$AMOUNT                     MVP-FORTH)
               1
               2 : 0SCALE   ( u --- )  100 D* ;
               3
               4 : 1SCALE   ( u --- )  10  D* ;
               5
               6 : 2SCALE   ( u --- )         ;
               7
               8 : 3SCALE   ( u --- ) ." Input error " ;
               9
              10 CREATE NSCALE
              11 ' 0SCALE CFA ,   ' 1SCALE CFA ,  ' 2SCALE CFA ,  ' 3SCALE ,
              12
              13
              14
              15



             SCR #56
               0 ( ?$AMOUNT  &  .$AMOUNT                               MVP-FORTH)
               1
               2 : SCALE    ( d --- )
               3    DPL @ 3 MIN 2 * NSCALE + @ EXECUTE ;
               4
               5 : ?$AMOUNT   ( --- double-cents )
               6    QUERY BL WORD NUMBER DPL @ 0<
               7    ABORT" INPUT ERROR"  SCALE ;
               8
               9 8 CONSTANT $SIZE
              10
              11 : .$AMOUNT   ( double-cents --- )
              12   ( Print $ amount right justified in #SIZE spaces )
              13   SWAP OVER DUP D+-  <# # # 46 HOLD #S ROT SIGN #>
              14   36 EMIT DUP $SIZE SWAP - SPACES TYPE ;
              15 EXIT

                       MOUNTAIN VIEW PRESS FORTH VERSION 1.01.03

             SCR #57
               0 ( DEMO File   -  Record Generation                   MVP-FORTH)
               1 0  2 DFIELD   TAG   ( a tag         )
               2   30 TFIELD   NAME    ( item name     )   
               3    2 DFIELD   DAY     ( the date      )
               4    4 DFIELD   DOLLAR  ( a dollar  amount)
               5 200 ( number of records)   0 ( starting block <1024>)
               6 FILE DEMO 
               7 : !NAME  ( wait for name then store it in record )
               8    NAME 32 FILL QUERY 1 TEXT PAD COUNT
               9    NAME ROT MIN CMOVE UPDATE ;
              10 : .NAME   ( print name field )  NAME TYPE ;
              11     ( The rest follow in the same way. )
              12 : !DAY  ?DATE  DAY ! UPDATE ;  : .DAY   DAY @ .DATE ;
              13 : !DOLLAR   ?$AMOUNT DOLLAR D! UPDATE ;
              14 : .DOLLAR   DOLLAR D@  .$AMOUNT ;
              15 : .REC CR REC# @ 3 .R 2 SPACES .NAME .DAY 2 SPACES .DOLLAR ;



             SCR #58
               0 ( DEMO  File  -   CLEAR.DATA, INPUT, OUTPUT           MVP -FORTH)
               1
               2 ( Clear especiall tag in the 0 record in file )
               3 : CLEAR.DATA   0 READ TAG 1024 0 FILL UPDATE ;
               4
               5 ( Example of formatting for input   )         
               6 : INPUT   0 READ TAG @ 1+ UPDATE DUP TAG ! READ
               7    CR CR ." ENTER NAME                      --> " !NAME
               8       CR ." ENTER DATE         -->"  !DAY ( has a format prompt)
               9       CR ." ENTER AMOUNT                    --> " !DOLLAR
              10    .REC UPDATE FLUSH ;  ( Save this record on disk )
              11
              12 ( List files 1 through the number in TAG of 0 record )
              13 : OUTPUT   0 READ TAG @ DUP 0= IF CR CR ." Empty file "
              14    DROP ELSE  1+ 1 DO FORTH I READ .REC LOOP THEN  CR CR ;
              15 EXIT
                       MOUNTAIN VIEW PRESS FORTH  VERSION 1.01.03
                 COLD MVP-FORTH   VERSION 1.01.03
                  DR1   OK
                 49 LOAD



                         ELEMENTS OF DATA BASE DESIGN
                                      by
                               Glen B. Haydon

                 This demonstration data system provides a pattern for the
                 further development of any type of data base.


                            Enter Y to load screens

                  50  ( File development   1 of 2                            MVP-FORTH)
                  51  ( File development   2 of 2                            MVP-FORTH)
                  52  ( Serial Day   l of 3                                  MVP-FORTH)
                  53  ( Serial Day   2 of 3                                  MVP-FORTH)
                  54  ( Serial Day   3 of 3                                  MVP-FORTH)
                  55  ( Factors for ?$AMOUNT & .$AMOUNT                      MVP-FORTH)
                  56  ( ?$AMOUNT  &  .$AMOUNT                                MVP-FORTH)
                  57  ( DEMO File   -  Record Generation                     MVP-FORTH)
                  58  ( DEMO File   -   CLEAR.DATA, INPUT, OUTPUT            MVP-FORTH)
                50 51 52 53 54 55 56 57 58 OK
                DEMO OK
                CLEAR.DATA OK
                OUTPUT

                Empty file

                OK
                INPUT 


                ENTER NAME                      --> EZNITH
                ENTER DATE         --> ( MM/DD/YY ) 4/21/81
                ENTER AMOUNT                   --> 18.50
                  1  EZNITH                       04/21/81  $  18.50OK
                !NAME ZENITH OK
                .REC
                  1  ZENITH                       04/21/81  $  18.50OK
                UPDATE FLUSH OK
                INPUT


                ENTER NAME                      --> IB   
                ENTER DATE         --> ( MM/DD/YY ) 04/21/81
                ENTER AMOUNT                    --> 60.
                  2  IBM                           04/21/81  $  60.00OK
                INPUT

                ENTER NAME                      --> DEC
                ENTER DATE         --> ( MM/DD/YY ) 4/21/81
                ENTER AMOUNT                    --> 103.5
                  3  DEC                           04/21/81  $   103.50OK



             DECIMAL OK
             0 READ ADDRESS 144 DUMP DECIMAL
               C7FA    3  0  0  0  0  0  0  0   0  0  0  0  0  0  0   0  .................  
               C80A    0  0  0  0  0  0  0  0   0  0  0  0  0  0  0   0  ................. 
               C81A    0  0  0  0  0  0  0  0  5A 45 4E 49 54 48 20  20  .........ZENITH
               C82A   20 20 20 20 20 20 20 20  20 20 20 20 20 20 20  20
               C83A   20 20 20 20 20 20  E 2A   0  0 3A  7  0  0 49  42         .*..:..IB
               C84A   4D 20 20 20 20 20 20 20  20 20 20 20 20 20 20  20  M
               C85A   20 20 20 20 20 20 20 20  20 20 20 20  E 2A  0   0              .*..
               C86A   70 17  0  0 44 45 43 20  20 20 20 20 20 20 20  20  p...DEC
               C87A   20 20 20 20 20 20 20 20  20 20 20 20 20 20 20  20
             OK
              OK
             OUTPUT
               1  ZENITH                       04/21/81   $   18.50
               2  IBM                          04/21/81   $   60.00
               3  DEC                          04/21/81   $  103.50

             OK
              OK
              OK
             : STATEMENT   CR CR 20 SPACES ." STATEMENT" CR CR OUTPUT  
                CR CR ." TOTAL VALUE " 33 SPACES  0 0 0 READ TAG @ 1+ 1
                DO _ READ DOLLAR D@ D+ LOOP .$AMOUNT CR CR CR ;  OK
              OK
              OK
             STATEMENT    


                                  STATEMENT     


               1  ZENITH                       04/21/81   $   18.50
               2  IBM                          04/21/81   $   60.00
               3  DEC                          04/21/81   $  103.50



             TOTAL VALUE                                  $  182.00


             OK