Classic Computer Magazine Archive ANTIC VOL. 2, NO. 1 / APRIL 1983

FORTH FACTORY

New Words

by John Peters

The following Forth words were compiled by John Peters, an active Forth user in San Francisco. When screen 50 is loaded, a 25th line will appear at the top of your television screen showing the stack contents. As with all Forth words, they can be adapted, enhanced, or altered in any way suitable to end-users. If these words suggest other ideas, let us know. We encourage the entire Forth community to share their discoveries and ideas in Forth Factory.

\ 50 25th line a.k.a. DISPLAY STACK
    DECIMAL

: DO-THRU ( from thru --- )
        compile 1+ compile swap
        compile (do) here 3 ; immediate 

: PRE ( pre get-screen to buffers )
      8 * DUP 9 + SWAP
      DO I BLOCK DROP LOOP ;
: PRES DO-THRU I PRE LOOP ;
   71 75 PRES
51 LOAD
52 LOAD
53 LOAD
54 LOAD
55 LOAD

: DON info-line install ;
: DOFF info-line remove ;
: 25th_LINE_/ ; ( Dictionary marker )

  DON ;S

\ 51 25th LINE NORMAL WINDOW COLORS   A

VOCABULARY INFO-LINE IMMEDIATE

INFO-LINE DEFINITIONS HEX

VIDEO-BASE CONSTANT NORMAL
  ( beginning of screen RAM for )
  ( OS graphics mode 0 )

: WINDOW ( addr -- )
  ( makes OS think screen RAH is at )
  ( addr. )
  58 ! 0 0 POSITION ;

55 CONSTANT COLCRS
  ( OS aodress of cursor column # )

FORTH DEFINITIONS DECIMAL


\ 52 25th line CLEAR25 DLIST B

INFO-LINE DEFINITIONS HEX

HERE DUP 3F + FFC0 AND SWAP - ALLOT 

LABEL BUFF25 DECIMAL 40 ALLOT
  ( Screen RAH for info line )

: CLEAR25
BUFF25 40 ERASE ;

LABEL DLIST HEX
  ( Part of a display list which gets )
  ( patched into the OS one to create )
  ( the info line. )
  70 C, 70 C,    ( some blank lines )
  42 C, BUFF25 , ( mode 0 w/LMS )
  01 C, O,       ( ANTIC JMP back )
                 ( to the OS )
                 ( display list )

FORTH DEFINITIONS DECIMAL


\ 53 25th DEC# HEX# BIN# BASE# C

INFO-LINE DEFINITIONS DECIMAL

: DEC# ( n1 --- addr n )
  DUP ABS 0 <# #S SIGN #> ;

: HEX# ( u --- addr n )
  0 <# # # # # #> ;

: BLW ( u --- addr n )
  0 <# 16 0 DO # LOOP #> ;

: U# ( u --- addr n )
  0 <# #S #> ;

: BASE# ( n1 --- addr n )
       BASE @ CASE
  10 OF DEC# ENDOF
  16 OF HEX# ENDOF
   2 OF BIN# ENDOF
  >R U# R> ENDCASE ;


\ 54 25th Line BAC< .STACK DISPLAY D

INFO-LINE DEFINITIONS DECIMAL

: BAC< ( n --- )
  MINUS COLCRS +! ;

: .STACK ( --- )
                        DEPTH 2 > IF
                      DEPTH l+ 3 DO
                    I (PICK) BASE#
                 DUP COLCRS @ < IF
  >R R BAC< R TYPE R> l+ BAC< ELSE
              DROP DROP LEAVE THEN
                               LOOP
                                THEN ;

: DISPLAY ( --- )
      LOCATION CURSOR-OFF
    CLEAR25 BUFF25 WINDOW
  34 0 POSITION ." <-TOS"
     33 0 POSITION .STACK
            NORMAL WINDOW
       POSITION CURSOR-ON ;


\ 55 25th Line PATCH- ROUTINE INSTALL E

INFO-LINE DEFINITIONS HEX

: PATCH- ( --- )
       0230 @ DUP C@ 01 = NOT IF
  DUP 3 + DLIST 6 + ! 01 OVER C!
            DLIST SWAP l+ ! ELSE
                       DROP THEN ; 

: ROUTINE ( --- )
  PATCH- DISPLAY CR ;

: INSTALL
  ' ROUTINE CFA ' ABORT 6 + !
  ' ROUTINE CFA ' QUIT 0A + !
              [COMPILE] FORTH ; 

: REMOVE
       ' CR CFA ' ABORT 6 + !
       ' CR CFA ' QUIT 0A + !
   0 022F C! 0230 @ 3 70 FILL
  22 022F C!  [COMPILE] FORTH ;

FORTH DEFFINITIONS DECIMAL