Skip to main content
© Erik 'Es of TEX' Simon

GEM VDI CALLS PART IV (FINAL PART) by Herman de Vrees

CLIPPING:

When  you use GEM-routines,  it is possible that  something  goes 
wrong by not initialized AES-commands or wrong parameters for the 
output on screen.  The next routine deals with wrong  parameters, 
when these parameters are larger then the screen-coordinates. The 
routine limits these parameters and all illegal  screen-coordina-
tes are ignored.  All GEM-routines,  following this routine,  are 
executed  within the defined limits.  The  BASIC-commands  ignore 
this  routine,  so they have no limits.  The size of the  limited 
screen are determined by XPOS1, YPOS1, XPOS2 and YPOS2.

The syntax is:

     XPOS1 = .... : YPOS1 = ....
     XPOS2 = .... : YPOS2 = ....
     gosub CLIPPING
 

The routine is:

65200 CLIPPING:
65202 ' -----> XPOS1, YPOS1, XPOS2, YPOS2
65204 poke contrl   , 129
65210 poke intin    , 1       : 'Clipping on (0 = out)
65212 poke ptsin    , xpos1   : '0
65214 poke ptsin + 2, ypos1   : '0
65216 poke ptsin + 4, xpos2   : '600
65218 poke ptsin + 6, ypos2   : '400
65220 vdisys
65222 return
65224 ' -----------------------------------------------

FILLPATTERN:

It is possible to define your own fill-pattern in a frame of 16 * 
16  bits,  which you can use with  the  BASIC-commands:  PCIRCLE, 
PELLIPSE and FILL and with the GEM-routines:  RECTANGLE,  RECTAN
GLEROUND and POLYGON.
The values of the fill-pattern are 16 words (2 Byte),  which  are 
defined in DATA-lines and called by a name.
The definition of a new fill-pattern starts with:

      restore ( name ) 
      gosub FILLPATTERN
 

The routine of fillpattern is:

63500 FILLPATTERN:
63502 ' -----> restore MONSTER
63504 poke contrl    , 112
63506 poke contrl + 6, 16
63508 for st = 0 to 30 step 2
63510 read MONSTER
63512 poke intin + st, monster
63514 next: vdisys
63516 return
63518 ' -----------------------------------------------

An example of a new fill-pattern:

5   ' merge "FILLPATTERN/RECTANGLE/RECTANGLEROUND.bas"
10  fullw 2 : clearw 2
20  WURM:
30  data      0,  8064, 16320, 26208, 30560, 32736
40  data  29132, 16318,  8054,  7782,  7372,  7384
50  data   4080,  2022,    60,    24
60  restore wurm : gosub FILLPATTERN
70  color 1, 1, 1, 1, 4
80  pellipse 130, 100, 100, 60
90  '
100 xpos1 = 270 : ypos1 =  30 : xpos2 = 350 : ypos2 = 300
110 gosub RECTANGLE
120 '
130 xpos1 = 400 : ypos1 = 200 : xpos2 = 500 : ypos2 = 300
140 FILLING = 1 : gosub RECTANGLEROUND
150 '
160 waiting = inp(2)
170 end

LETTERSIZE:

In Part I, we had a routine, called 'TEXTSIZE', to make the text-
size  larger  or smaller then usual.  This routine works  with  5 
different sizes.  The next routine,  for monochrome  only,  works 
with 24 different sizes (3 till 26). All kinds of text-forms work 
with this routine (underlined,  italics and so on).  This routine 
can not work with the normal BASIC-command PRINT,  but only  with 
the routine TEXTOUTPUT.  The default with monochrome is:  12  and 
the default with color (low resolution) is: 6. The smallest sizes 
are not available with medium or low resolution. The syntax is:

     LETTERSIZE = ( 3...26 ) : 
     gosub LETTERSIZING
 

                       The routine is:
65300 LETTERSIZING:
65302 ' -----> LETTERSIZE
65304 poke contrl    , 12
65306 poke ptsin + 2 , lettersize
65308 vdisys
65310 return
An example of LETTERSIZING is:

5   ' merge "LETTERSIZING/TEXTOUTPUT/CLIPPING.bas"
10  fullw 2 : clearw 2
20  xpos1 = 0 : ypos1 = 0 : xpos2 = 600 : ypos2 = 360
30  gosub CLIPPING
40  for LETTERSIZE = 1 to 12
50  gosub LETTERSIZING
60  xpos = 30 : ypos = 25 * LETTERSIZE
70  text$ = "Atari, the best !"
80  gosub TEXTOUTPUT : next
90  xpos = 300 : ypos = 0
100 for LETTERSIZE = 13 to 26
110 gosub LETTERSIZING
120 ypos = ypos + LETTERSIZE + 4 : gosub TEXTOUTPUT : next
130 LETTERSIZE = 13 : gosub LETTERSIZING
140 waiting = inp(2)
150 end

FRAMING:

When  you  use a graphic command that uses a  fill-pattern  (like 
pcircle),  the  circle will be drawn with a thin line  round  the 
fill-pattern.  This line can be switched off.  The routine  works 
with the next BASIC-commands and GEM-routines:
  - pcircle         - pellipse      - rectangle
  - rectangleround  - polygon
The syntax is:

     FRAME = ( 0 , 1 ) :
     gosub FRAMING
  

The routine is:

65250 FRAMING:
65252 ' -----> FRAME (0,1): '1 = on   0 = no line
65254 poke contrl    , 104
65256 poke intin     , frame
65258 vdisys
65260 return
65262 ' -----------------------------------------------
An example of FRAMING is:

5   ' merge "FRAMING.bas"
10  fullw 2 : clearw 2
20  color 1, 1, 1, 3, 3
30  FRAME = 1 : gosub FRAMING
40  pcircle 150, 150, 100, 0, 2800
50  FRAME = 0 : gosub FRAMING
60  pcircle 400, 150, 100, 0, 2800
70  waiting = inp(2)
80  end

MOUSE2:

The  AES  has a similar routine as the VDI-routine  'MOUSE'  (see 
Part II) to get the mouse-position, but before we can use an AES-
routine  we have to use the 'INIT'-routine (see  part  III).  The 
next mouse-routine gives us information about the position of the 
mouse,  the  mousekeys and the keys CONTROL,  ALTERNATE and  both 
SHIFT-keys.
The syntax is:

     gosub MOUSE2 

The  information is given in the variables MOUSEX and MOUSEY  for 
the  position and in the variable KEYA for the mouse-keys and  in 
the variable KEYB for the other keys. The values can be:

  KEYA (mouse-keys): 
        Key                    Value
       -------------------------------
        Left                    1
        Right                   2
        Left and Right          3
  KEYB (others) : 
        Key                    Value
       -------------------------------
        Shift right             1
        Shift left              2
        Control                 4
        Alternate               8

The routine is:

62550 MOUSE2:
62552 ' <----- MOUSEX ; MOUSEY
62554 ' <----- KEYA  ; KEYB
62556 mousex = peek(gintout + 2)-1
62558 mousey = peek(gintout + 4)-38
62560 keya  = peek(gintout + 6)
62562 keyb  = peek(gintout + 8)
62564 gemsys 79
62566 return
62568 ' ------------------------------------------------

An example of MOUSE2 is:

5   ' merge "INIT/MOUSE2.bas"
10  gosub INIT
20  start:
30  gosub MOUSE2
40  print MOUSEX, MOUSEY, KEYA, KEYB
50  goto start

EVENTMOUSE:

The  next  routine  verifies if the mouse is present  in  a  pre-
defined  rectangle.  The  coordinates of the  left-top-corner  of 
rectangle are put in XPOS and YPOS and the size of the  rectangle 
in  WIDTHE  and HEIGHT.  The routine responds when the  mouse  is 
coming  in the rectangle or when the mouse leaves the  rectangle. 
This  is done by putting 0 in GINTIN (the routine waits till  the 
mouse  enters the rectangle) or by putting 1 in  GINTIN  (waiting 
till the mouse leaves the rectangle).
The syntax is:

     XPOS1 = .... : YPOS1 = ....
     WIDTHE = ... : HEIGHT = ...
     gosub EVENTMOUSE
 

The routine of EVENTMOUSE is:

62500 EVENTMOUSE:
62502 ' -----> XPOS1 ; YPOS1
62504 ' -----> WIDTHE ; HEIGHT
62506 poke gintin    , 0
62508 poke gintin + 2, xpos1 + 1
62510 poke gintin + 4, ypos1 + 38
62512 poke gintin + 6, widthe
62514 poke gintin + 8, height
62516 gemsys 22
62518 return
62520 ' ------------------------------------------------

For completing the routine 'SHOWMOUSE' the next routine:

63042 HIDEMOUSE:
63044 poke contrl    , 123
63046 vdisys
63048 return
63049 ' ------------------------------------------------

An example of EVENTMOUSE is:

5   ' merge "INIT/EVENTMOUSE/SHOWMOUSE/RECTANGLE.bas"
10  gosub INIT
20  fullw 2 : clearw 2 : color 1, 1, 1, 3, 3
30  xpos1 = 100 : ypos1 = 100 : xpos2 = 150 : ypos2 = 120
40  widthe = 50 : height = 20
50  start:
60  gosub RECTANGLE
70  gosub SHOWMOUSE
80  gosub EVENTMOUSE
90  gosub MOUSE2
100 if keya = 1 then 120
110 out 2,7 : goto start
120 end

RUBBERBOX:

This routine gives a rectangle,  defined by the mouse.  The left-
top-corner  of the rectangle is determined by pressing  the  left 
mousekey.  When  you  move  the mouse  (keep  the  left-mouse-key 
pressed),  you  see  a rectangle following  your  mouse-movements 
until you stop pressing the mousekey.  Then the routine gives you 
the size of the rectangle.  Before we can use this  routine,  the 
routine  MOUSE2 checks if you have pressed the left-mouse-key  to 
determine the left-top-corner.  The routine RUBBERBOX takes  over 
the  values  of  this  starting-point  from  MOUSE2  (MOUSEX  and 
MOUSEY).
The syntax is:

     gosub RUBBERBOX 

The routine of RUBBERBOX is:

62200 RUBBERBOX:
62202 ' -----> MOUSEX ; MOUSEY
62204 ' <----- WIDTHE ; HEIGHT
62206 poke gintin    , mousex + 1
62208 poke gintin + 2, mousey + 38
62210 poke gintin + 4, 1
62212 poke gintin + 6, 1
62214 AES.3: gemsys 70
62216 widthe = peek(gintout + 2)
62218 height = peek(gintout + 4)
62220 if height<3 or widthe<3 then goto AES.3
62222 return
62224 ' -------------------------------------------------

10  gosub INIT
20  openw 2 : clearw 2
30  start : gosub MOUSE2
40  if keya = 1 then gosub RUBBERBOX else goto start
50  print "The box is : " widthe " wide and " height " high."
60  end
DRAGBOX:

This  routine  is  used to move a  rectangle.  The  size  of  the 
rectangle  is  determinated by the variables WIDTHE  and  HEIGHT. 
With  the routine MOUSE2 we have to determine the starting  point 
(left-top-corner) of the rectangle.  It is possible to limit  the 
area in which the rectangle can move through the variables X.MIN, 
Y.MIN,  X.MAX  and  Y.MAX.  The routine gives back to  the  main-
program the new position of the rectangle in the variables  XPOS1 
and  YPOS1.  To  prevent wiping the rectangle we  use  first  the 
routine HIDEMOUSE and then the routine SHOWMOUSE.
The syntax is:

     X.MIN   = .... : Y.MIN   = ....
     X.MAX   = .... : Y.MAX   = ....
     WIDTHE  = .... : HEIGHT  = ....
     gosub DRAGBOX
 

The routine of DRAGBOX is:

62250 DRAGBOX:
62252 ' -----> WIDTHE ; HEIGHT
62254 '        X.MIN   ; Y.MIN
62256 '        X.MAX   ; Y.MAX
62258 ' <----- XPOS1   ; YPOS1
62260 poke contrl + 2, 8
62262 poke contrl + 4, 3
62264 poke gintin    , widthe
62266 poke gintin + 2, height
62268 poke gintin + 4, mousex + 1
62270 poke gintin + 6, mousey + 38
62272 poke gintin + 8, x.min + 1
62274 poke gintin +10, y.min + 38
62276 poke gintin +12, x.max + 1
62278 poke gintin +14, y.max + 38
62280 gemsys 71
62282 xpos1 = peek(gintout + 2)-1
62284 ypos1 = peek(gintout + 4)-38
62286 return
62288 '-------------------------------------------------
An example of DRAGBOX is:

5   ' merge "INIT/MOUSE2/DRAGBOX/SHOWMOUSE/HIDEMOUSE/RECTANGLE"
10  gosub INIT
20  fullw 2 : clearw 2 : color 1, 1, 1, 2, 3
30  widthe = 300 : height = 150 : x.min = 100 : y.min = 100
40  x.max = 500 : y.max = 250
50  gosub MOUSE2
60  start : gosub MOUSE2
70  if keya = 1 then gosub DRAGBOX else goto start
80  xpos2 = xpos1 + widthe : ypos2 = ypos1 + height
90  gosub HIDEMOUSE : gosub RECTANGLE
100 gosub SHOWMOUSE
110 gotoxy 0,0
120 print "The coordinates are : " xpos1, ypos1
130 end

On the disk,  a program is contained called "SUBE1_4.BAS",  which 
contains not only the subroutines from this issue,  but also from 
the previous issues of ST NEWS, since this is the concluding part 
of the 'course'.

Disclaimer
The text of the articles is identical to the originals like they appeared in old ST NEWS issues. Please take into consideration that the author(s) was (were) a lot younger and less responsible back then. So bad jokes, bad English, youthful arrogance, insults, bravura, over-crediting and tastelessness should be taken with at least a grain of salt. Any contact and/or payment information, as well as deadlines/release dates of any kind should be regarded as outdated. Due to the fact that these pages are not actually contained in an Atari executable here, references to scroll texts, featured demo screens and hidden articles may also be irrelevant.