Home > Atari Memories > #7800basic > 7800basic Guide

7800basic Guide

By Mike “RevEng” Saarna (adapted by Duane Alan Hahn, a.k.a. Random Terrain)

As an Amazon Associate I earn from qualifying purchases. (I get commissions for purchases made through certain links on this page.)


Table of Contents

About This HTML Page


7800 Hardware Overview



Sprites and Characters


Graphics Modes



Formatting and Layout Features

Indenting and White Space

Numeric Representation

Line Numbers and Labels

Combining Multiple Commands


Regular Variables

Dimensioning Variable Names


Other Variable Types

Variable Arrays

Bitwise Variables

Constant Variables

Indirect Variable Arrays

8.8 Fixed Point Variables

Special Variables

Score Variables and BCD Variables

Random Numbers

Temporary Variables

CARRY Variable

pokeydetected Variable

paldetected Variable

Conditional Logic

Code Organization and Flow Control





gosub and return

on…goto and on…gosub





altgamestart label

User Functions


Regular Data

Sequential Data

Using Character Data

Tiled Character-Map Data Import


Program Configuration

set romsize [value]

set doublewide on

set zoneheight [value]

set tallsprite [on|off|spritesheet]

set screenheight

set extradlmemory on

set dlmemory

set plotvalueonscreen

set plotvaluepage [$##]

set zoneprotection

set pauseroutine

set paddlerange

set paddlescalex2

set paddlepair

set mousexonly

set mousetime

set trakxonly

set traktime

set drivingboost

set pokeysupport

set trackersupport basic

set tiasfx mono

set avoxvoice on

set debug color

set canary

set breakprotect

set crashdump

set mcpdevcart

set basepath

set hssupport

set hsseconds

set hsscoresize

set hscolorbase

set hsdifficultytext off

set hsdifficultytext

set hsgameranks

set deprecated

Graphics Commands



savescreen and restorescreen



Working With the Screen Commands


topscreenroutine, bottomscreenroutine, and userinterrupt subroutines

Setting Palettes









Notes on Use of Characters













Sprite Collisions with boxcollision

Joystick Controls


Driving Controls

Paddle Controls

Mouse Controls

Trakball Controls

Keypad Controls

SNES Controls

Console Switches

Reset, Select, & Difficulty Switches


Direct TIA Sound


TIA Sound Registers

Direct POKEY Sound


POKEY Sound Registers

TIA and POKEY Sound Effect Driver

Music Tracker

Enabling the Tracker

Instrument Data



Track and Song Modifiers

TIA Key Mapping

Note Data

Drum Note Data



AtariVox Voice Support

High Score Support



Saving Game Memory

Feature Modules

Conditional Compilation and Compiling Message Output


Assembly Language

inline assembly

Including External Assembly

Inlining External Assembly

Installing 7800basic

Compiling Your 7800basic Code

On Windows

On OS X or Linux

Files Produced by Compilation

Troubleshooting Issues With Your 7800basic Code

Page last updated on: 2022y_07m_29d_1513t

This document is meant as an introduction to the 7800basic language command structure and syntax. It's not meant as a general programming primer.




About This HTML Page

This page is based on the 7800basic PDF file created by RevEng. You can download the latest version of 7800basic and the 7800basic Developers Guide (PDF) through a link at AtariAge.



Table of Contents and Index

There is a table of contents and an index on this page to help you find what you are looking for as quickly as possible.



Link Colors

Links that jump to other places on this page are blue. Links that lead to other pages online are red.







7800basic is a programming language that can be used to create games for the Atari 7800 game console. It differs from the majority of BASIC languages in that it compiles your source code into fast 6502 machine language code.


7800basic is based on the Atari 2600 programming language batari BASIC, so if you're familiar with bB, you'll be right at home with 7800basic.


7800basic is designed to put as much control as you want in your hands, so if you're familiar with 6502 assembly code you can easily customize the modular framework, or mix your high level BASIC source code with your own low level assembly code.


If you don't want to learn assembly language, don't worry, you don't need to know assembly language to produce games. Everything you need is accessible using pure BASIC.

Back to Top






7800 Hardware Overview

Although 7800basic handles many of the hardware details for you, it will help to have a general understanding of the hardware you'll be developing for.




Formatting and Layout Features



Back to Top






Other Variable Types

Back to Top






Special Variables

Back to Top






Conditional Logic

Perhaps the most important statement is the if…then statement. These can divert the flow of your program based on a condition. The basic syntax is:


if condition then action

action can be a statement, label or line number if you prefer. If the condition is true, then the statement will be executed. Specifying a line number or label will jump there if the condition is true. Put into numerical terms, the result of any comparison that equals a zero is false, with all other numbers being true.


There are three types of if…then statements.


1. Simple True/False Evaluation

The first type is a simple check where the condition is a single statement.


The following example diverts program flow to line 20 if a is anything except zero:

   if a then 20

This type of if…then statement is more often used for checking the state of various read registers. For example, the joysticks, console switches, single bits and hardware collisions are all checked this way.

   if joy0up then x = x + 1

That will add 1 to x if the left joystick is pushed up.

   if switchreset then 200

Jumps to line 200 if the reset switch on the console is set.

   if collision(player1,playfield) then t = 1

Sets t to 1 if player1 collides with the playfield.

   if !a{3} then a{4} = 1

Sets bit 4 of a if bit 3 of a is zero. See Bitwise Variables for more information about using single bits.



2. Simple Comparison

A second type of statement includes a simple comparison. Valid comparisons are = , < , >, <=, >=, and <>.

   if a < 2 then 50
   if f = g then f = f + 1
   if r <> e then r = e


3. Compound Statement

The third type of if…then is a complex or compound statement, that is, one containing a boolean AND (&&) operator or a boolean OR (||) operator. You are allowed only one OR (||) for each if…then statement. You can use more than one AND (&&) in a line, but you cannot mix AND (&&) and OR (||).

   if x < 10 && x > 2 then b = b - 1
   if !joy0up && gameover = 0 then 200
   if x = 5 || x = 6 then x = x - 4

Warning: Using multiple if…thens in a single line might not work correctly if you are using boolean operators.

Back to Top






Code Organization and Flow Control

Back to Top






Program Configuration

7800basic has a series of “set” commands you may use to customize the 7800basic environment configuration. These should be at the top of your program, prior to other commands.



Back to Top






Graphics Commands

Back to Top






Joystick Controls

Two-button joystick controls are the default in 7800basic. If you've switched from joysticks to another controller, you may switch back with the changecontrol statement, specifying controller port 0 or controller port 1.

   changecontrol 0 2buttonjoy

The 2buttonjoy mode will work with one button sticks, but if you prefer to force a single-button mode, you can do so with changecontrol.

   changecontrol 0 1buttonjoy

Joysticks are read by using an if…then statement. There are four directional functions and two fire button functions for each joystick.

   if joy0up then y = y - 1
   if joy0down then y = y + 1
   if joy0left then x = x - 1
   if joy0right then x = x + 1
   if joy0fire0 then goto __Purple_Monkey
   if joy0fire1 then goto __Aqua_Monkey

These can also be inverted using the ! token. For example:

   if !joy0up then goto __Tasty_Pilgrim

If a 2600 style single-button joystick is plugged in, the joystick button is read through joy0fire1.



If you wish to see if a joystick was used at all, you can check joy0any or joy1any:

   if joy0any then goto __Player_Moved

Back to Top






Driving Controls

Atari 2600 style driving controls can be used with 7800basic. To enable them for your game, use the changecontrol command in your program code, specifying controller port 0 or port 1.

   changecontrol 0 driving

7800basic will then read the driving controller every frame and adjust either the drivingposition0 (controller port 0) or drivingposition1 (controller port 1) variables.


If you wish to use the driving control like a quick-turn paddle controller, instead of slower drivingwheel control, you may wish to change the device step-per-resolution and/or use the “drivingboost” acceleration curve for the device.

   set drivingboost on
   port0resolution = 3

The driving wheel is an extremely low-resolution device, with 16 positions per 360 degree rotation. The above settings would make the controller useful for a paddle game.


Take note that driving controls, paddles, trakball x-axis, and the mouse x-axis all use the same variables for position, and the buttons can all be read using the regular joystick joy0fire method. This makes is easy to support multiple devices in your game code.

Back to Top






Paddle Controls

Atari 2600 style paddle controls can be used with 7800basic. To enable them for your game, use the changecontrol command in your program code, specifying controller port 0 or port 1.

   changecontrol 0 paddle

7800basic will then read selected paddle controllers every frame, and adjust the paddleposition0 (paddle 0, controller port 0), paddleposition1 (paddle 1, controller port 0), paddleposition2 (paddle 0, controller port 1) or paddleposition3 (paddle 1, controller port 1) variables.


By default, only the first paddle in the controller port is read. If your game requires two paddles, you can enable both controllers in the port.

   set paddlepair on

For reading the fire button of the first paddle in a pair, you can use joy0fire (or joy1fire). To read the second paddle fire button, you'd need to check joy0right (or joy1right).


You can also set the paddle range, which will adjust the amount of time required to read the paddle.

   set paddlerange 160

To save CPU time, you may wish to reduce the paddle range and scale up returned values x2.

   set paddlerange 80
   set paddlescalex2 on

Take note that driving controls, paddles, trakball x-axis, and the mouse x-axis all use the same variables for position, and the buttons can all be read using the regular joystick joy0fire method. This makes is easy to support multiple devices in your game code.

Back to Top






Mouse Controls

Either Atari ST or Amiga mice can be used with 7800basic. To enable them for your game, use the changecontrol command in your program code, specifying controller port 0 or port 1.

   changecontrol 0 stmouse

   changecontrol 0 amigamouse

7800basic will then read the selected mouse every frame, and adjust the mousex0 and mousey0 variables (controller port 0) or mousex1 and mousey1 variables (controller port 1).


If your game only incorporates mice for side to side movement, you may wish to save CPU time by only reading the mouse x axis.

   set mousexonly on

You can also set the amount of CPU time that 7800basic will spend polling the mouse.

   set mousetime 100

The easiest and least expensive source of compatible mice are PS2 mouse -> Amiga/Atari mouse adapters, used in conjunction with PS2 mice. These adapters tend to have fewer issues, while providing the superior resolution of a modern mouse. Legacy ST and Amiga mice may not work with all consoles, and even when they do, these are lower resolution devices.


If you wish to support legacy mice in your game, you may wish to warn your users that old mice may not be reliable on all consoles. You can also change the resolution of the device.

   port0resolution = 2

Take note that driving controls, paddles, trakball x-axis, and the mouse x-axis all use the same variables for position, and the buttons can all be read using the regular joystick joy0fire method. This makes is easy to support multiple devices in your game code.

Back to Top






Trakball Controls

CX-22 Trakballs can be used with 7800basic. In theory the 7800basic trakball driver should also work with CX-80 Trakballs, but some small portion of these devices actually use the Atari ST mouse protocol.

To enable trakballs for your game, use the changecontrol command in your program code, specifying controller port 0 or port 1.

   changecontrol 0 trakball

7800basic will then read the selected trakball every frame, and adjust the trakballx0 and trakbally0 variables (controller port 0) or trakballx1 and trakbally1 variables (controller port 1). If your game also allows for mice, you may instead reference the mousex# and mousey# variables.


If your game only incorporates trakball for side to side movement, you may wish to save CPU time by only reading the trakball x axis.

   set trakxonly on

You can also set the amount of CPU time that 7800basic will spend polling the trakball.

   set traktime 100

You can also change the resolution of the device to suit your game requirements better.

   port0resolution = 2

Take note that driving controls, paddles, trakball x-axis, and the mouse x-axis all use the same variables for position, and the buttons can all be read using the regular joystick joy0fire method. This makes is easy to support multiple devices in your game code.

Back to Top






Keypad Controls

Atari 2600 keypad controls can be used with 7800basic. To enable them for your game, use the changecontrol command in your program code, specifying controller port 0 or port 1.

   changecontrol 0 keypad

Keypad controllers are read by using an if…then statement to test for key presses. Here's an example of testing if button “3” is being pressed.

   if keypad0key3 then goto __Handle_Key_Press_3

The keypad 0 buttons can be read with keypad0key0 through keypad0key9, keypad0keys (star), and keypad0keyh (hash).


The keypad 1 buttons can be read with keypad1key0 through keypad1key9, keypad1keys (star), and keypad1keyh (hash).


The keypad data is also encoded as bits in the variables keypadmatrix0a-keypadmatrix0d and keypadmatrix1a – keypadmatrix1d.

Back to Top






SNES Controls

SNES controls can be connected to the 7800 console via the SNES2ATARI adapter, and then used with 7800basic. To enable them for your game, use the changecontrol command in your program code, specifying controller port 0 or port 1.

   changecontrol 0 snes

SNES controls are read by using an if…then statement to test for button presses or direction pad pushing. Here's an example of testing if button “Y” is being pressed.

   if snes0Y then goto handlesnesY

The complete list of if…then testable conditions are: snes0up, snes0down, snes0left, snes0right, snes0A, snes0B, snes0X, snes0Y, snes0lsh (left shoulder), snes0rsh (right shoulder), snes0select, and snes0start. There are snes1 testing a controller in port 1, there are corresponding snes1up, snes1down, etc. testable conditions.


SNES controls also support autodetection with the snesdetect command


If an SNES controller was found during autodetection, you can detect which port it was found in by checking if either the port0control or port1control variables is equal to 11. You can also check if the controller is responding at any given moment with the snesdetected0 and snesdetected1 variables. If the player unplugs an SNES controller, the port will remain setup, but the snesdetected0/snesdetected1 variable will be equal to zero.

   if port0control = 11 && snesdetected0 then skipsnesdetect

Alternatively, you don’t need to pay attention to the port the detection happened on, and just test for any autodetected SNES controller state with: snes#up, snes#down, etc.

   if snes#Y then goto handlesnesY

It should be noted that after the snesdetect command, any ports without an SNES controller found will be left in a 2-button joystick configuration.

Back to Top






Console Switches

Back to Top






Direct TIA Sound

TIA is the sound chip in the 7800. If you're creating a game that has no extra soundchip on the circuit board, you'll be making all of your sounds by manipulating TIA. You can do so by playing TIA data with the playsfx command, or by manipulating the TIA registers directly.



Back to Top






Direct POKEY Sound

7800basic is able to access the POKEY sound chip, if the chip is provided either on the cartridge or through add-on hardware. To enable pokey support and auto-detection, use the following line near the top of your basic program.

   set pokeysupport on

You can check to see if a POKEY chip was detected in the following manner.

   if pokeydetected then gosub playmypokeysong else gosub playmytiasong

If you wish to skip pokey autodetection and assume a location at one of the supported locations ($450, $800, or $4000) you can specify the location in your pokeysupport statement.

   set pokeysupport $450




Back to Top






TIA and POKEY Sound Effect Driver

7800basic has an advanced sound driver that greatly simplifies adding both TIA and POKEY sound effects in your game.

   playsfx soundata [offset]

The optional offset parameter allows you to raise or lower the pitch of the played sound. If you have a sound which is often repeated, it's recommended that you vary its pitch a bit randomly.

   temp7=rand&3 : rem set temp7 to a random number from 0-3
   playsfx sfx_lasershot temp7

When you play a sound, the sound driver will automatically choose between the two available sound channels based on which channels are already being used by the driver, and if both channels are being used it will interrupt one of the playing sounds based on a priority system.


Before playing a sound with playsfx, you'll need to define the sound effect data in the expected format. The data format 7800basic works with is composed of three parts, a header, the sound data itself, and an end-of-sound marker.


The header consists of 3 bytes:


The sound data then consists of 3 byte chunks, each of which represents the Sound Frequency, Control/Waveform, and Volume to play. The sound driver will continue to play the sound data until it reaches an end of sound marker, which consists of 3 zero bytes.


Here's an example TIA sound, which simulates the sound effect when jumpman jumps a barrel in Donkey Kong. There are 5 chunks of sound data, and each chunk plays for 5 frames.

   data sfx_jumpman
   16, 5, 4 ; version, priority, frames per chunk
   $1E,$04,$08 ; 1st chunk of freq,channel,volume data
   $1B,$04,$08 ; 2nd chunk
   $18,$04,$08 ; 3rd chunk
   $11,$04,$08 ; 4th chunk
   $16,$04,$08 ; 5th chunk
   $00,$00,$00 ; End Of Sound marker

If you want to change the frames-per-chunk mid-sound, you can do so by adding in a chunk with values $00, $10, followed by a value for the new frames-per-chunk, as seen in the example below.

   data sfx_extendobump
   $10,$10,$01 ; version, priority, frames per chunk
   $00,$10,$08 ; slow down to 8 frames per chunk

If you wish to constrain the sound driver to only using the first sound channel when playing TIA sounds, you can use the “set tiasfx mono” statement.



If you wish to silence all in-progress sounds, you can use the “mutesfx” command.

Back to Top






Music Tracker

7800basic has a music tracker you can use to automatically play song data, with options to select tempo and number of repetitions.


The music tracker requires that you provide instrument data and song data.



Back to Top






AtariVox Voice Support

You can send speech data to the AtariVox via the speak command.

   speak speechdataname

See the speechdata command and set avoxvoice on for more information.

Back to Top






High Score Support

7800basic supports high score tables for up to 4 different difficulty levels in your game. The actual device used to store the tables can be an Atari 7800 High Score Cart, AtariVox, or SaveKey device.


To incorporate high score support in your game, you first need to enable high score support. Pick a unique 4 digit hex value to identify your game...

   set hssupport $1234

When your game is nearing completion, you can reserve your chosen number by announcing it in this AtariAge thread:


You also need to include the high score font graphic in your game. It can go in any graphics block, but must be the first graphic imported in its block. Note that you need to use 320A mode for the high score graphic, even if your game uses a different mode.

   incgraphic hiscorefont.png 320A

Before trying to display a high score table, you need to set the game difficulty level variable from 0 to 3, which represents easy, intermediate, advanced, and expert levels.


If your game has no difficulty levels, you can leave gamedifficulty at the default of 0. You can then display the current high score table, without allowing high score entry with the command...

   drawhiscores attract

When a single player game is over, and you them to have the chance to enter their initials, you can use the command...

   drawhiscores single

Or with a two player game, you can use the following command to allow the first player to enter initials...

   drawhiscores player1

And as you might expect, the second player has a similar command...

   drawhiscores player2

The drawhiscores command will erase the currently drawn screen, savescreen buffer, and the color palettes, so you'll need to draw a new screen after issuing this command.


It's also noteworthy that drawhiscores command allows the high score display to be interrpted by pressing the joystick fire button. The command may exit with the user holding the fire button down, so you may need to account for that in your basic code.


Please be aware that the drawhiscores statement doesn't work with double-buffering turned on. If you're using double-buffering in your game, you'll need to temporarily disable it with “doublebuffer off” prior to calling drawhiscores.


If you want the players' scores to be provided a descriptive ranking, you can use the “set hsgameranks” command. Scores should be ordered from biggest to 0...

   set hsgameranks 30000 commander 10000 lieutenant 0 ensign

If the player's score variable didn't beat any recorded scores, the high score routines will just display the table, and the ranking description if you've enabled that functionality in your game.



If you wish to access the currently saved high scores, you can use the “hiscoreload” command to populate the HSRAMScores array with the stored scores, in high score order. Each score entry is 3 bytes, in 7800basic score variable format.



If you wish to clear out any saved high scores, you can use the “hiscoreclear” command.


If you have AtariVox speechdata named “vox_highscore”, the AtariVox will say the speech once while the player enters a high score.


If you have sound effect data named “sfx_highscore”, the sound effect will play once while the player enters a high score.


If you have a tracker song named “song_highscore”, the song will play once while the player enters a high score.


There are various “set” commands that change the behavior of the high score tables. See the Program Configuration section for more details.


Lastly, if you wish to detect which device is being used, you may check the hsdevice variable:

   0=no device, 1=High Score Cart, and 2=AtariVox/SaveKey

Back to Top






Saving Game Memory

7800basic supports saving and loading up to 25 variables to any detected High Score device. You will need to include high score support in your game, as demonstrated in the previous High Score Support section. If you only wish to save game memory and not display high score tables, you may omit importing the high score font.


The data will be saved in an unused difficulty level's area. To inform 7800basic of this, we set the gamedifficulty variable.


From there we call the savememory command to save your variables.

   savememory playerx playery playerroom playerworld

If the variables are dim'ed consecutively in memory, you may list them as a range.

   savememory playerx-playerworld

Loading previously save variables is done with the loadmemory command, which also accepts both forms of variable listing that the savememory command uses.

   loadmemory playerx playery playerroom playerworld

   loadmemory playerx-playerworld

If your game is also displaying high score tables, be sure to restore the gamedifficulty variable to its original value after loading/saving data.

Back to Top






Feature Modules

7800basic has a lot of options to interface with external hardware, and there isn't enough space in the 7800basic's reserved 4k area to hold all of the feature modules required. If you get a message about this area having negative space during compiling, it means you need to store the modules elsewhere in your game.


You can do so with the “inline” keyword at the location where the module can go. At present time you can do this for the atarivox, pokey support, hiscore support, and sound tracker modules.

   inline 7800vox.asm
   inline pokeysound.asm
   inline hiscore.asm
   inline tracker.asm

Avoid putting these statements directly in the path of your own code flow, since they're not meant to be executed directly.


If your game is bankswitched, any inline feature modules need to go in a non-bankswitched bank. The exception to this rule is the hiscore.asm moduleyou may inline this module into a bankswitched bank, as long as you only use the hiscore functionality from the same bank.

Back to Top





Conditional Compilation and Compiling Message Output

7800basic has a few commands that let you easily enable or disable code blocks. This allows you to build a few different custom ROM images from just a minor change to a constant value in your source code.


These commands are #ifconst, #else, and #endif, and can be used in the following fashion.

   const officialrelease = 1
   [a bunch of common game code would go here]
   #ifconst officialrelease
     plotbanner officialbanner 0 0 0
     plotbanner demobanner 0 0 0

There's also an echo command which you can use to display messages, or the values of constants, when the ROM is compiled.

   echo " "
   const airblockstart = <chars_air
   const airblockend = airblockstart+chars_air_width-1
   echo "TILES: airblockstart:",airblockstart," airblockend:",airblockend
   echo " "

The #ifconst, #else, #endif, and echo commands are all passed directly from your 7800basic source code to the dasm assembler, which is responsible for their function. If you wish to learn more about them, you can reference the documentation for dasm.



If you wish to know how much rom was used by a routine, you can use the sizeof command at the end of the routine. When you compile your game, the output will contain a message with the size of the routine.

   dogbark = dogbark + 1
   if dogbark > 10 then gosub chasecat
   sizeof mysubroutine

You can also use sizeof to output the size of some data, by placing sizeof at the end of the data.

   data mydata
   sizeof mydata

Back to Top






Assembly Language

7800basic allows you to incorporate your own assembly language routines into your BASIC code in a few different ways.



Back to Top






Installing 7800basic

7800basic is distributed as a single zip file. Download the latest zip file and unzip to whichever location you desire to use. Make sure your unzip utility creates the expected subdirectories (/docs, /includes, …) rather than sticking all of the files into one directory.


Windows users should double-click and the provided install_win.bat file. OS X and Linux users should run the script.


In both cases, just follow any instructions presented by the installer.

Back to Top






Compiling Your 7800basic Code

7800basic is a command-line program, so these instructions will cover how to compile your BASIC programs using the command-line. If you're uncomfortable with BASIC command-line usage for your OS, you may wish to read up on it a bit first.





Back to Top



In Case You Didn't Know


Trump's Jab = Bad

Did you know that Trump's rushed experimental rona jab has less than one percent overall benefit? It also has many possible horrible side effects. Some brainwashed rona jab cultists claim that there are no victims of the jab, but person after person will post what the jab did to them or a family member on web sites such as Facebook and Twitter and they'll be lucky if they don't get banned soon after. Posting the truth is “misinformation” don't you know. Awakened sheep might turn into lions, so powerful people will do just about anything to keep the sheep from waking up.


Check out these videos:

Best of Sped Up and Edited Tennessee House of Representatives Health Subcommittee Hearing Room 2 (March 1, 2022)

Full Video of Tennessee House of Representatives Health Subcommittee Hearing Room 2 (The Doctors Start Talking at 33:28)



H Word and I Word = Good

Take a look at my page called The H Word and Beyond. You might also want to look at my page called Zinc and Quercetin. My sister and I have been taking those two supplements since summer of 2020 in the hopes that they would scare away the flu and other viruses (or at least make them less severe).



B Vitamins = Good

Some people appear to have a mental illness because they have a vitamin B deficiency. For example, the wife of a guy I used to chat with online had severe mood swings which seemed to be caused by food allergies or intolerances. She would became irrational, obnoxious, throw tantrums, and generally act like she had a mental illness. The horrid behavior stopped after she started taking a vitamin B complex. I've been taking #ad Jarrow B-Right for many years. It makes me much easier to live with.



Soy = Bad

Unfermented soy is bad! “When she stopped eating soy, the mental problems went away.” Fermented soy doesn't bother me, but the various versions of unfermented soy (soy flour, soybean oil, and so on) that are used in all kinds of products these days causes a negative mental health reaction in me that a vitamin B complex can't tame. The sinister encroachment of soy has made the careful reading of ingredients a necessity.



Wheat = Bad

If you are overweight, have type II diabetes, or are worried about the condition of your heart, check out the videos by Ken D Berry, William Davis, and Ivor Cummins. It seems that most people should avoid wheat, not just those who have a wheat allergy or celiac disease. Check out these books: #ad Undoctored, #ad Wheat Belly, and #ad Eat Rich, Live Long.



Negative Ions = Good

Negative ions are good for us. You might want to avoid positive ion generators and ozone generators. Whenever I need a new air cleaner (with negative ion generator), I buy it from A plain old air cleaner is better than nothing, but one that produces negative ions makes the air in a room fresher and easier for me to breathe. It also helps to brighten my mood.



Litterbugs = Bad

Never litter. Toss it in the trash or take it home. Do not throw it on the ground. Also remember that good people clean up after themselves at home, out in public, at a campsite and so on. Leave it better than you found it.



Climate Change Cash Grab = Bad

Seems like more people than ever finally care about water, land, and air pollution, but the climate change cash grab scam is designed to put more of your money into the bank accounts of greedy politicians. Those power-hungry schemers try to trick us with bad data and lies about overpopulation while pretending to be caring do-gooders. Trying to eliminate pollution is a good thing, but the carbon footprint of the average law-abiding human right now is actually making the planet greener instead of killing it.


Watch these two YouTube videos for more information:

CO2 is Greening The Earth

The Climate Agenda


View this page and any external web sites at your own risk. I am not responsible for any possible spiritual, emotional, physical, financial or any other damage to you, your friends, family, ancestors, or descendants in the past, present, or future, living or dead, in this dimension or any other.


Use any example programs at your own risk. I am not responsible if they blow up your computer or melt your Atari 7800.


Home Inventions Quotations Game Design Atari Memories Personal Pages About Site Map Contact Privacy Policy Tip Jar