Jump to content
Lee Stewart

fbForth 2.0: Bitmap Graphics Olio

Recommended Posts

I am starting this thread to collect various examples of bitmap graphics programming in fbForth 2.0.

 

This first example is a quick-and-dirty joystick drawing program, JDRAW , ported from the program of the same name I wrote four years ago for TI Forth in post #48 of thread, TI FORTH Version 3.0 dated October 20 1982.  As I stated then, it is a pretty useless program except as a demo and proof of concept.

 

It uses the CRU mode of JOYST for joystick-only use.  There is a three-choice menu accessed with the fire button.  The choices are

  • P—Toggle pen up/down [blue pen = pen down; white pen = pen up]
  • D—Toggle draw/erase [ solid pen = draw mode; hollow pen = erase mode]
  • Q—Quit program

The joystick moves the pen around the display screen.

 

There is much that could be done to make it more useful.  One such thing would be to provide finer control over the pen—reaction to joystick movement is too fast for any useful drawing.  Another would probably be to dispense with the menu and use the fire button for pen-up/pen-down.  But, that leaves managing draw/erase mode, which would probably require using the JOYST word in keyboard (KSCAN) mode.   Anyway, here is the fbForth 2.0 source code for JDRAW :

 

[spoiler]

HEX 
0 VARIABLE JPEN                
5F VARIABLE JDR
7F VARIABLE JDC 
: J_INIT
   GRAPHICS2            
   1E SCREEN
   1E DCOLOR !
   DELALL
   1 DMODE !        
   F890 A0C0 8000 0000 10 SPCHAR 
   0000 0000 0000 0000 11 SPCHAR    
   0000 0000 0000 0000 12 SPCHAR 
   0000 0000 0000 0000 13 SPCHAR    
   0078 4444 7940 4040 14 SPCHAR 
   0078 2424 2524 2478 15 SPCHAR    
   0000 000E D11F 100E 16 SPCHAR 
   0000 0016 D910 1010 17 SPCHAR    
   0000 0016 1911 1111 18 SPCHAR 
   0000 000E 010F 110F 19 SPCHAR    
   0000 0000 0000 0000 1A SPCHAR 
   0000 0011 1115 150A 1B SPCHAR    
   0038 4444 4554 4834 1C SPCHAR 
   00FF 0034 2A2A 2A2A 1D SPCHAR    
   0000 0011 D111 130D 1E SPCHAR 
   00FF 001C 223E 201C 1F SPCHAR    
   0004 000C 0404 040F 20 SPCHAR 
   00FF 002C 3222 2222 21 SPCHAR    
   0004 041F 0404 0502 22 SPCHAR 
   00FF 0022 2222 261A 23 SPCHAR    
   JDC @ JDR @ 0F 010 0 SPRITE 
   0F 0D0 08 014 01 SPRITE
   01F 0D0 08 018 02 SPRITE
   0F 0D0 08 01C 03 SPRITE
   01F 0D0 08 020 04 SPRITE 
   2 MAGNIFY
;
: JUP_CUR 
   JPEN @ 
   IF
      5 0 SPRCOL
   ELSE
      0F 0 SPRCOL
   THEN 
;        
: JER_CUR
   F890 A0C0 8000 0000 10 SPCHAR 
;                      
: JDR_CUR
   F8F0 E0C0 8000 0000 10 SPCHAR 
;                      
( Loop until 'P', 'D' or 'Q', then leave it on stack)
: JMENU  ( --- n )  
   0F 0F 01 SPRPUT
   01F 0F 02 SPRPUT
   0F 01F 03 SPRPUT
   01F 01F 04 SPRPUT
   BEGIN
      KEY DUP
      CASE ( Toggle DMODE|JPEN|Quit & leave key)  
         44 OF DMODE @ 1 XOR DUP DMODE !                      
               IF
                  JER_CUR
               ELSE
                  JDR_CUR
               THEN
            ENDOF              
         50 OF JPEN @ 1 XOR JPEN ! JUP_CUR ENDOF              
         51 OF ( Just leave 'Q')  ENDOF                        
         ELSEOF DROP 0 ENDOF    ( Leave 0 if illegal key)  
      ENDCASE         
      -DUP
   UNTIL ( Leave value if legal key)                    
   5 1 DO      ( Hide menu) 
      10 0D0 I SPRPUT
   LOOP
;
1 JMODE !
: JLIM ( n1 n2 --- n1|0|n2 ) ( test if n1 is 0..n2)
   OVER 0<
   IF
      DROP DROP 0
   ELSE
      OVER OVER <
      IF
         DROP
      ELSE
         SWAP DROP
      THEN
   THEN 
;
: JDRAW
   VDPMDE @       ( current VDP mode to stack)
   J_INIT 
   BEGIN          ( Main program loop)      
      1 JOYST DUP      
      IF                    
         DUP 1 AND     
         IF     ( fire) 
            DROP           ( don't need joystick value)
            JMENU          ( get 'P', 'D' or 'Q')
            051 =          ( match will leave 1 to quit loop)
         ELSE
            DUP 06 AND
            CASE  ( W or E)
               02 OF -1 ENDOF    ( W)
               04 OF  1 ENDOF    ( E)
               ELSEOF 00 ENDOF   ( neither)
            ENDCASE
            JDC @ + 0FF JLIM JDC !   ( new dotcol)
            018 AND
            CASE  ( S or N)
               08 OF  1 ENDOF    ( S)
               010 OF -1 ENDOF   ( N)
               ELSEOF 00  ENDOF  ( neither)
            ENDCASE
            JDR @ + 0BF JLIM JDR !   ( new dotrow)
            JDC @ JDR @ 0 SPRPUT    ( move pen)
            JPEN @            ( draw or erase?)
            IF    ( draw)
               JDC @ JDR @ DOT 
            THEN
            0                 ( 0 to continue loop)
         THEN
      THEN
   UNTIL
   VMODE             ( restore VDP mode) 
;

DECIMAL

[/spoiler]

 

I will add a blocks file, later.  For now, you can paste this in Classic99 at the command line of fbForth 2.0.  Start the program by typing:

 

JDRAW

 

...lee

Share this post


Link to post
Share on other sites
Absolutely. Here's an experiment I did in TI Forth with bitmapped 2D graphics using the resident functions (no assembly support). Pretty slow isn't it...

https://youtu.be/ivgLqaJwWzM

Share this post


Link to post
Share on other sites

Here's the work disk I coded the demo on. The code starts on screen 91 (DSK2). I wrote it directly into TIF, so I don't have a text listing unfortunately and there is no utility available that can read the screens outside for Forth... Of note is that I used look up tables for the sine-cosine values to speed things up. Let's see how this works under FbForth :)

 

EDIT: Actually that's not the same demo. It was my attempt at creating 3D wireframe animations! I can't seem to find the code for the original demo... In any case, this demo takes for ever to load and requires the GRAPH2 library and is deathly slow. I never really got it to work properly and I gave up on it because of how slow it was running. There is a bug in the transformation matrices somewhere. Believe it or not this was supposed to be a cube rotating  :grin:

 

To run:

91 LOAD

START

Share this post


Link to post
Share on other sites

Here's the work disk I coded the demo on. The code starts on screen 91 (DSK2). I wrote it directly into TIF, so I don't have a text listing unfortunately and there is no utility available that can read the screens outside for Forth... Of note is that I used look up tables for the sine-cosine values to speed things up. Let's see how this works under FbForth :)

 

EDIT: Actually that's not the same demo. It was my attempt at creating 3D wireframe animations! I can't seem to find the code for the original demo... In any case, this demo takes for ever to load and requires the GRAPH2 library and is deathly slow. I never really got it to work properly and I gave up on it because of how slow it was running. There is a bug in the transformation matrices somewhere. Believe it or not this was supposed to be a cube rotating  :grin:

 

To run:

91 LOAD

START

 

There is a 6-block “2D TRIANGLE ROUTINE” that begins in the second block.  Is that it?

 

BTW, the “TI Forth Block Utilities” in the latest FBLOCKS (12/08/2015) will allow visualizing in fbForth and copying to an fbForth blocks file, which can be converted to a TXT file by TI99Dir and, probably, TIImageTool.

 

I will see what I can do with them.

 

...lee

Share this post


Link to post
Share on other sites

Walid...

 

Attached is a blocks file for fbForth (VORTICON), which is a copy of your TIF-WORK.DSK.  I have, so far, made no substantive changes.  I did have to change block 1 to load blocks 7 and 8 instead of 97 and 98 to make it compatible with fbForth for obvious reasons to anyone who knows TI Forth.  The attached actually loads blocks 7 and 2 because block 2 starts loading the routine in your video, which takes 75 seconds in TI Forth but only 10 seconds in fbForth 2.0 with the identical code.  To run the 2D example, assuming the blocks file, VORTICON, is in DSK1, type the following:

 

USEBFL DSK1.VORTICON

1 LOAD

START

 

BTW, the 3D code looks like it's doing something reasonably like 3D.  To run it, change block 1 code 

 

( 8 ) 2 LOAD

to

( 2 ) 8 LOAD

 

Then, perform a cold start with COLD to reset fbForth and repeat the 3 lines after the first paragraph above.

You should probably have a cup of coffee before you type START because it does take a long time to load 17 blocks!

 

Here's a ZIP file that includes the blocks file and a TXT file copy of it:  [attachment=434948:VORTICON.zip]

 

...lee

Edited by Lee Stewart

Share this post


Link to post
Share on other sites

I forgot about one other change I made to the TI Forth code in my last post.  I removed the second line from block 1

 

-64SUPPORT -FLOAT 180 DISK_HI !

 

because it loads the graphics mode code, the graphics primitives, the 64-column editor and the floating point library, which are all (except the 64-column editor) resident in fbForth 2.0.  The 64-column editor is not necessary to run the program.  If it is desired by the user, it can easily be loaded separately.

 

It also sets the highest disk block #, which is irrelevant in fbForth.  Furthermore, the word DISK_HI does not exist in fbForth.

 

The principal reason this program runs so much faster in fbForth is that I coded the graphics primitives, which are in the fbForth 2.0 ROM, in ALC.  This is particularly important for the definition of LINE .

 

...lee

Share this post


Link to post
Share on other sites

Lee, I did not see much of a difference in the bitmap drawing speed between TIF and FbForth. What am I missing?

 

You’re using fbForth 2.0:+, right?  TI Forth and fbForth 1.0 cannot hold a candle to fbForth 2.0 because all of the graphics primitives of the former are in high-level Forth and the latter, in ALC.  Once the blocks (1, 7, 2 – 6) are loaded and the program is started with START , it’s over in 10 seconds.

 

...lee

Share this post


Link to post
Share on other sites

Ah OK. I was using version 1.0 . The pinned development resources thread should be updated with the latest version because it is still listing version 1.

Share this post


Link to post
Share on other sites

Ah OK. I was using version 1.0 . The pinned development resources thread should be updated with the latest version because it is still listing version 1.

 

I hadn’t checked it lately.  It used to reference my “fbForth—TI Forth with File-based Block I/O [Post #1 UPDATED: 12/08/2015]” thread, which has both versions, their manuals and FBLOCKS files in the first post.  I guess I should touch base with Filip.

 

...lee

Share this post


Link to post
Share on other sites

I have to say I am really impressed by the speed gains. This may yet revive my plans to write a flight simulator in Forth :)

Below is a video of the 2D transformation demo running in FbForth. Compare to the original one a few posts before.

 

[media]https://youtu.be/tXEizum-ICs[/media]

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...