TweetFollow Us on Twitter

basic Cons BASIC

Volume Number: 20 (2004)
Issue Number: 6
Column Tag: Programming

Programming Techniques

by F.C. Kuechmann

basic Cons BASIC

Using a Macintosh to program little control computers in BASIC

History Lesson

Back in the prehistoric days of desktop computerdom, the late 1970s and early 1980s, the BASIC interpreter seemed ubiquitous. The original Apple ][ came with a fast integer BASIC, which was displaced by the Microsoft variant, Applesoft. Commodore and Atari also shipped their 6502-based computers with Microsoft interpreter variants. On the IBM-Intel-Microsoft side of the tracks, MS-DOS shipped with GW-BASIC (eventually replaced by the QB interpreter, which copied its core technology from BASIC09 by Microware of Des Moines). Although differing in detail, these early interpreters had many things in common - including line numbers and all-global variables.

Although this type of language has long since been superceded for desktop programming, there is a significant market in small embedded controllers running BASIC11 (Motorola M68HC11 processors) and BASIC-52 (Intel 8052 family). Initial purchase costs are low and development rapid. . Controllers are available in a variety of configurations from companies like Micromint and New Micros. Using a USB-to-serial adapter or serial port PCI card, these boards are easy to program and run with modern Macintoshes under OS-X and offer an easy route to hardware fiddling.

While some folks may think interpreted BASIC is a toy language with no serious applications, that's far from the case. Micromint, for example, has been selling interpreted BASIC controllers in industrial markets for nearly two decades. Several years ago I implemented the control section of a gate and barrier system used in fish hatcheries -- based on Micromint 8052 boards programmed with ~25k of interpreted BASIC-52 code.

Figure 1 shows a typical small controller that runs BASIC, the Motorola M68HC11-based Micromint RTC-HC11. Figure 2 shows a member of the New Micros NMIT/X-020 family. It too runs the BASIC11 interpreter. Both boards are shown "bare", without the stacked I/O cards included in a typical installation. Details of these boards as well as the companies' other BASIC offerings can be obtained by contacting the companies at the addresses at the end of this article.

Now, before you check the cover to be sure you're reading a Macintosh magazine,, we'll get to where the Mac comes in shortly.

Short programs are easy to create in unstructured BASIC, but problems appear when line numbers and all-global variables are combined with large programs. In order to create maintainable programs I adopted some assembly language techniques in writing a desktop computer program to convert unnumbered source text to numbered BASIC. In the source text, variable names are managed via an equate table, making it easy to avoid global variable problems, and branch destinations are labels. The source text can use meaningful, i.e. long, variable names, while the final code uses one and two characters.


Figure 1. Micromint RTC-HC11

My first conversion program was written in structured Power BASIC under DOS in the 1980s. It was later translated to Borland Pascal before being ported to Mac Pascal. The most recent versions are in CodeWarrior Pascal and REALbasic 5.5, both carbonized and running under OS-X. In this article I'll focus on the REALbasic variant, hence the name basic Cons BASIC.


Figure 2. New Micros NMIT/X-020


Figure 3. Screenshot following conversion

Figure 3 is a screenshot taken following conversion of a short program called blinky, which will be discussed further below. Three black rectangles upper right are REALbasic EditField Controls that display the time conversion started in 24-hour format, the time it finished, and the elapsed time between, in this case three seconds. Below that are EditField Controls showing lines in and out for the most recent pass through the files. Since the final pass checks the bas file for unconverted labels, the out figure is zero.

The big black rectangle with the scrollbar is a REALbasic ListBox Control holding the output of basicConsBASIC's three read-write passes starting with the source file. From a source file named blinky.src, basicConsBASIC creates the files blinky.par, blinky.num, blinky.bas and blinky.dmp. The par and num files are scratch files, bas is the file you load into your controller, and the dmp file is the saved contents of the list box.

At the bottom is sixth EditField Control that functions as a message window.

A short example that follows illustrates the programming approach. Complete sourcefile instructions can be found in the file basicConsBASIC sourcefiles.doc.

The following program toggles the onboard L.E.D. on a Micromint RTC-HC11 once each second for an hour. Listing 1 shows the contents of the source file, created with an ordinary ASCII editor such as BBEdit or the CodeWarrior IDE's editor. The underlying syntax is that of BASIC11, and the hardware addresses specific to the RTC-HC11.

blinky.src
|rem
|rem blinky program
|rem
%bit5 .equ $20
%index .equ x
%limit .equ lm
%blinkaddr .equ $b009
poke(%blinkaddr,%bit5)
%limit=3600   : 'set to blink 3600 secs [1 hr]
%index=0
gosub &blinkit
end
|rem
|rem
      ' skip numbering to line 500
500:
|rem
         ' toggle the state of the l.e.d.
         ' each second using the time function
blinkit:
while %index<%limit
 portd=portd.eor.%bit5 : ' exclusive-or to toggle
 time=0
 while time<1
 endwh
 %index=%index+1
endwh
            ' skip to 900 to rts
900:
return
|rem
|rem

Listing 1. blinky.src

Listing 2 shows the contents of the file blinky.bas that is created from blinky.src by the program basicConsBASIC

blinky.bas
100 rem
110 rem blinky program
120 rem
130 poke($b009,$20)
140 lm=3600     
150 x=0
160 gosub 510
170 end
180 rem
190 rem
500 rem
510 while x<lm
520  portd=portd.eor.$20
530  time=0
540  while time<1
550  endwh
560  x=x+1
570 endwh
900 return
910 rem
920 rem

Listing 2. blinky.bas

The converted program is loaded into the controller using a terminal program like ZTerm. After testing and debugging , the BASIC program can, in many instances, be easily stored in EPROM or EEPROM or non-volatile (battery-backed) RAM. Micromint's BCC-52 series controllers can burn programs into EPROM, while some New Micros M68HC11 boards are easily fitted with EEPROM storage.

The Macintosh program

The program basicConsBASIC is a relatively simple text parser that uses the BASIC language's excellent string manipulation capabilities. On the initial pass through the source file the contents of the equate table are saved in two global string arrays. Array gEQlabel() holds the labels and gEQsub() holds the replacement strings. For branches (GOTO and GOSUB), the array gBranchLabl() holds the labels and gLineNumStr() stores the line numbers that replace the labels. On the first pass, through the src file, the appropriate strings are assigned to the arrays; on the next pass (par file) the BASIC program lines are searched for strings in the gEQlabel() and gBranchLabl () arrays. Any that are found are replaced by the corresponding (same array index) strings in gEQsub() and gLineNumStr().

Listing 3 shows the method that processes the equate table.

Listing 3.

ProcessEqu
Sub ProcessEqu(byref textline as string)
  dim tempProgLine, equLabel, equsub As string
  dim squotePos, equPos, howlong As integer
  
  squotePos = instr(textline, gkSquote)
  if squotePos > 0 then
      // chop off comment
    tempProgLine = Left(textline, squotePos - 1) 
  else
    tempProgLine = textline
  end if
  equPos = instr(tempProgLine, ".EQU") 
  Dec (equPos)
   // get left part of .equ line
  equLabel = Left(tempProgLine, equPos)  
  StripCon (equLabel)
  gEQlabel (gEqIx) = Trim (equLabel)
   // then get assignment text
  howlong = Len(tempProgLine)     
  howlong =  howlong - (equPos + 4)
  equsub = Right(tempProgLine, howlong)
  // strip control chars
  StripCon(equsub)            
   // assign to swap array
  gEQsub(gEqIx) = Trim (equsub) 
  Inc (gEqIx)
   // make line unnumbered
  textline = "~" + " " + textline 
End Sub

basicConsBASIC is derived from an earlier Pascal program called, oddly enough, PascalConsBASIC. The languages are syntactically and structurally so similar that converting Pascal to REALbasic consisted mainly of pasting the code from each Pascal procedure or function into a REALbasic method, then making relatively minor changes, most of which can be accomplished with global search and destroy sequences. All instances of ":=" change to "=". "end;" becomes "end", and "begin" is simply removed. "Case x of" mutates to "Select case x".

One of the biggest differences between the initial Pascal program and the REALbasic version lies in the main program loop. In Pascal the loop is visible and explicitly created by the programmer; in REALbasic the loop is implicit and hidden. To illustrate let's assume we're making a program whose actions are controlled by buttons labeled This, That and Quit. A Pascal main loop might book something like Listing 4.

Listing 4.

Pascal main loop
Repeat
   If ThisButtonWasClicked() then
      DoThis()
   Else if ThatButtonWasClicked() then
      DoThat()
   Else if QuitButtonWasClicked() then
      Exitflag:=true;
Until exitflag = true;

In REALbasic, the Action methods of the three buttons call the DoThis, DoThat and Quit methods, respectively. Like the Wizard of Oz, the little man behind the curtain keeps an eye on the buttons so the programmer doesn't have to. See Listings 5 through 7.

Listing 5

ThisButton.Action
Sub ThisButton.Action()
   DoThis()
End Sub

Listing 6

ThatButton.Action
Sub ThatButton.Action()
   DoThat()
End Sub

Listing 7

QuitButton.Action
Sub QuitButton.Action()
   Quit ()
End Sub

The program basicConsBASIC Convert button's Action method calls the method Main in Listing 8.

Listing 8

Main
Sub Main ()
   dim sourcefile As folderItem
  
   DoInit ()
  sourcefile = GetOpenFolderItem("TEXT")
  if sourcefile <> nil then
    ProcessSource (sourcefile)
  end if
end sub

If the folderItem returned by REALbasic's GetOpenFolderItem method is valid, the ProcessSource method is called.

Listing 9

wBASIC.ProcessSource
Sub ProcessSource(sourcefile As folderItem)
  dim fname, conbaspath, outpath, ext As string
  dim timeOut, dateStr, timeStr, lapstr As string
  dim btimeOut,bdateStr, btimeStr, mess As string
  dim infile, outfile, conbasFolder as FolderItem
  dim flag1, flag2 As boolean
  dim instrm As TextInputStream
  dim outstrm As TextOutputStream
  dim index, begsecs, finsecs, lapsecs As integer
  
  // where are  we? get current dir 
  conbasFolder = GetFolderItem("") 
  conbaspath = conbasFolder.AbsolutePath
  fname = sourcefile.Name
  //  get date/time
  btimeStr = CurrentTimeString( )
  bdateStr = CurrentDateString( )
  mess = "Converting sourcefile :  " + fname
  fname = StriptExtention(fname)
  // open the dmp file
   outpath = conbaspath + fname + ".dmp"
  flag1 = DumpFileOpen (outpath)
  flag1 = false
  index = 1 
  do
    select case index
    case 1
      infile = sourcefile
      outfile = nil
      instrm = infile.OpenAsTextFile
      if instrm <> nil then
        outpath = conbaspath + fname 
        ext = ".par"
        flag2 = MakeOutFile (outpath,ext,outstrm)
        if flag2 then
          // handle err
          exit
        end if
        flag1 = MakeParFile(instrm, outstrm)
        flag2 = CloseFiles (instrm, outstrm)
      else
        // handle err
        flag2 = true
      end if
    case 2
      infile = GetFolderItem (outpath + ext)
      if infile = nil then
        exit
      end if
      instrm = infile.OpenAsTextFile
      if instrm <> nil then
        outpath = conbaspath + fname 
        ext = ".num"
        flag2 = MakeOutFile (outpath,ext,outstrm)
        if flag2 then
          // handle err
          exit
        end if
        flag1 = MakeNumFile(instrm, outstrm)
        flag2 = CloseFiles (instrm, outstrm)
      else
        // handle err
        flag2 = true
      end if
    case 3
      infile = GetFolderItem (outpath + ext)
      if infile = nil then
        exit
      end if
      instrm = infile.OpenAsTextFile
      if instrm <> nil then
        outpath = conbaspath + fname 
        ext = ".bas"
        flag1 = MakeOutFile(outpath,ext,outstrm)
        if flag1 then
          exit
        end if
        flag1 = MakeBasFile(instrm, outstrm)
        flag2 = CloseFiles (instrm, outstrm)
      else
        flag2 = true
      end if
    case 4
      infile = GetFolderItem (outpath + ext)
      if infile = nil then
        exit
      end if
      instrm = infile.OpenAsTextFile
      if instrm <> nil then
        flag1 = CheckBasFile (instrm)
        instrm.Close
      end if
    end // select
    Inc (index)
  loop until (index  > 4) or flag1 or flag2
  
  
  timeStr = CurrentTimeString( )
  UpdateBegTime (btimestr)
  UpdateFinTime  (timeStr)
  begsecs = TimeStringToSecs (btimestr)
  finsecs = TimeStringToSecs (timeStr)
  lapsecs = finsecs - begsecs
  lapstr = SecsToTimeString (lapsecs)
  UpdateLapsedTime (lapstr)
  
  if gDumpFileOpenFlag then
    dateStr = CurrentDateString( )
    WriteLineToDumpFile (mess)
    mess = "Beg : " + bdateStr + " " + btimestr
    WriteLineToDumpFile (mess)
    mess = "Fin : " + datestr + " " + timestr
    WriteLineToDumpFile (mess)
    WriteLineToDumpFile ("")
    WriteLineToDumpFile ("")
    mess = "Elapsed Time :  " + lapstr
    WriteLineToDumpFile (mess)
    WriteLineToDumpFile ("")
    WriteLineToDumpFile ("")
    WriteLineToDumpFile ("")
    WriteLineToDumpFile ("")
    gDumpStream.close
    gDumpFileOpenFlag = false
  end if

End Sub

Listing 9 shows the case statement inside a four-pass do loop that creates a new file in each pass but the fourth, in each case but the first taking input from the output file of the previous pass.

Hooking up

Once your program is written, you need to get it into the controller. With modern Macs that means a serial port must be added either with a USB-to-serial converter or a PCI bus card with serial ports. Keyspan is one source for both types. The internet auction sites such as ebay commonly offer adapters from various sources. Additional suitable cables and/or adapters and software drivers may also be required, exact needs determined by the controller being used. The recent article by Tom Djajadiningrat in MacTech 20:2 has a very good discussion of Mac serial issues.

If you're using a Keyspan USA-28X USB-to-serial adapter or a Keyspan SX Pro PCI serial card and your controller is a Micromint BCC-52, you'll need an old style Mac modem cable with a DB-25 male connector at one end and a mini-DIN8 male at the other. TrippLite is one source for this type of cable. If your controller is a New Micros 68HC11-based model supplied with an RS-232 cable designed for the WinTel set, a bit of custom adapting may be needed. RS-232 interfacing is something of a black art whose practitioners require familiarity with breakout boxes, logic probes, soldering irons and strong coffee.

The shareware program ZTerm is probably the simplest software to use to download a converted program to the controller. Set the parms to 8N1 and 9600 Baud, then select local from the Dial menu. Hit "Enter" and you should get a prompt. BASIC11 uses a "splat" (#) prompt; BASIC-52 uses ">". Use the Settings : Text Pacing menu to set character and line delays and the BASIC prompt for smooth transfers. To initiate the transfer, select Send text from ZTerm's File menu, then choose the file, e.g. blinky.bas in the navigation dialog.

Sources

ZTerm - http://homepage.mac.com/dalverson/zterm/

New Micros Incorporated - http://www.newmicros.com/

Micromint - http://www.micromint.com/


F.C. Kuechmann is a programmer, hardware designer and coffee drinker who once lived in Chicago and has lived in Vancouver-NOT-CANADA Washington for many years. He can be contacted at bosedenage@earthlink.net

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Dropbox 193.4.5594 - Cloud backup and sy...
Dropbox is a file hosting service that provides cloud storage, file synchronization, personal cloud, and client software. It is a modern workspace that allows you to get to all of your files, manage... Read more
Google Chrome 122.0.6261.57 - Modern and...
Google Chrome is a Web browser by Google, created to be a modern platform for Web pages and applications. It utilizes very fast loading of Web pages and has a V8 engine, which is a custom built... Read more
Skype 8.113.0.210 - Voice-over-internet...
Skype is a telecommunications app that provides HD video calls, instant messaging, calling to any phone number or landline, and Skype for Business for productive cooperation on the projects. This... Read more
Tor Browser 13.0.10 - Anonymize Web brow...
Using Tor Browser you can protect yourself against tracking, surveillance, and censorship. Tor was originally designed, implemented, and deployed as a third-generation onion-routing project of the U.... Read more
Deeper 3.0.4 - Enable hidden features in...
Deeper is a personalization utility for macOS which allows you to enable and disable the hidden functions of the Finder, Dock, QuickTime, Safari, iTunes, login window, Spotlight, and many of Apple's... Read more
OnyX 4.5.5 - Maintenance and optimizatio...
OnyX is a multifunction utility that you can use to verify the startup disk and the structure of its system files, to run miscellaneous maintenance and cleaning tasks, to configure parameters in the... Read more
Hopper Disassembler 5.14.1 - Binary disa...
Hopper Disassembler is a binary disassembler, decompiler, and debugger for 32- and 64-bit executables. It will let you disassemble any binary you want, and provide you all the information about its... Read more
WhatsApp 24.3.78 - Desktop client for Wh...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
War Thunder 2.33.0.135 - Multiplayer war...
In War Thunder, aircraft, attack helicopters, ground forces and naval ships collaborate in realistic competitive battles. You can choose from over 1,500 vehicles and an extensive variety of combat... Read more
Iridient Developer 4.2 - Powerful image-...
Iridient Developer (was RAW Developer) is a powerful image-conversion application designed specifically for OS X. Iridient Developer gives advanced photographers total control over every aspect of... Read more

Latest Forum Discussions

See All

A Legitimate Massage Parlor, I Swear – T...
In this week’s Episode of The TouchArcade Show we talk about some of the major new releases on mobile this week including Warframe, we go over all the major news that came out from the Nintendo Direct Partner Showcase on Wednesday, we read our one... | Read more »
TouchArcade Game of the Week: ‘Rainbow S...
I feel like I am in a fever dream right now. What is this game that I’m playing? It’s a Rainbow Six game? But it’s all cutesy, and cartoony, and also kind of psychedelic? How is this a real thing? Well, it’s no fever dream, it is indeed a real thing... | Read more »
SwitchArcade Round-Up: ‘Promenade’, ‘Cho...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for February 23rd, 2024. It’s Friday, so we have to check out the remaining releases of the week. Not so many big ones today, but a healthy crop nonetheless. After summarizing all the... | Read more »
Steam Deck Weekly: Gundam Breaker 4 and...
Welcome to this week’s slightly shorter edition of the Steam Deck Weekly. I was a bit unwell this week so no reviews in this edition, but there is a lot of news and new Steam Deck Verified and Playable games to catch up on. I have something special... | Read more »
The 10 Best Run-And-Gun Games for Ninten...
The year 2024 is a rare one, because it is a year with a brand-new Contra game. Contra: Operation Galuga might be the freshest face on the block when it comes to Nintendo Switch run-and-gun action games, but it’s hardly fighting that war alone.... | Read more »
Version 1.4 of Reverse: 1999 will be lan...
Free up your diary for February 29th, as Bluepoch has announced the impending release of the award-winning Reverse: 1999s Version 1.4 update. The Prisoner in the Cave is an Ancient Greece-themed update with new recruits, gameplay modes, and plenty... | Read more »
Premium Mobile RPG ‘Ex Astris’ From ‘Ark...
Arknights developer Hypergryph’s premium RPG Ex Astris () recently had its release date confirmed, and we finally have an extended gameplay showcase. | Read more »
Apple Arcade Weekly Round-Up: Updates fo...
Following yesterday’s big Hello Kitty Island Adventure update, a few more notable game updates and events have gone live on Apple Arcade. Cypher 007 () has gotten its first content update in a few months taking you to Egypt for five new levels... | Read more »
‘Thunder Ray’ and ‘Hime’s Quest’ Are Now...
Crunchyroll has pushed two new games into the Crunchyroll Game Vault including Purple Tree Studio’s Thunder Ray which was already on iOS before as a premium release. Shaun even reviewed it last year. Read his review here. The second game is Poppy... | Read more »
Adorable Kitty-Collector Sequel ‘Neko At...
Ya’ll. This October will mark the ten-year anniversary of Hit Point launching Neko Atsume, the adorable kitty collecting sim that has become a runaway success and essentially created a sub-genre of cozy pet-collecting life sim games. Sure, the... | Read more »

Price Scanner via MacPrices.net

16-inch M3 Max MacBook Pro on sale for $300 o...
Amazon is offering a $300 instant discount on one of Apple’s 16″ M3 Max MacBook Pros today. Shipping is free: – 16″ M3 Max MacBook Pros (36GB/1TB/Space Black): $3199, $300 off MSRP Their price is the... Read more
Apple M2 Mac minis on sale for $100 off MSRP...
B&H Photo has Apple’s M2-powered Mac minis in stock and on sale for $100 off MSRP this weekend with prices available starting at $499. Free 1-2 day shipping is available to most US addresses: –... Read more
Apple Watch SE on sale for $50 off MSRP this...
Best Buy has all Apple Watch SE models on sale this weekend for $50 off MSRP on their online store. Sale prices available for online orders only, in-store prices may vary. Order online, and choose... Read more
Deal Alert! Apple 15-inch M2 MacBook Airs on...
Looking for the lowest sale price on a new 15″ M2 MacBook Air? Best Buy has Apple 15″ MacBook Airs with M2 CPUs in stock and on sale today for $300 off MSRP on their online store. Prices valid for... Read more
Amazon discounts iPad mini 6 models up to $12...
Amazon is offering Apple’s 8.3″ WiFi iPad minis for $100-$120 off MSRP, including free shipping, for a limited time. Prices start at $399. Amazon’s prices are among the lowest currently available for... Read more
Apple AirPods Pro with USB-C discounted to $1...
Walmart has Apple’s 2023 AirPods Pro with USB-C in stock and on sale for $199.99 on their online store. Their price is $50 off MSRP, and it’s currently one the lowest prices available for new AirPods... Read more
Apple has 14-inch M3 MacBook Pro with 16GB of...
Apple has 14″ M3 MacBook Pros with 16GB of RAM, Certified Refurbished, available for $270-$300 off MSRP. Each model features a new outer case, shipping is free, and an Apple 1-year warranty is... Read more
Save $318-$432 on 16-inch M3 Max MacBook Pros...
Apple retailer Expercom has 16″ M3 Max MacBook Pros on sale for $318-$432 off MSRP when bundled with a 3-year AppleCare+ Protection Plan. Discounts are available for Silver models as well a Space... Read more
New today at Apple: 16-inch M3 Pro/M3 Max Mac...
Apple is now offering 16″ M3 Pro and M3 Max MacBook Pros, Certified Refurbished, starting at $2119 and ranging up to $530 off MSRP. Each model features a new outer case, shipping is free, and an... Read more
Apple is now offering $300-$480 discounts on...
Apple is now offering 14″ M3 Pro and M3 Max MacBook Pros, Certified Refurbished, starting at $1699 and ranging up to $480 off MSRP. Each model features a new outer case, shipping is free, and an... Read more

Jobs Board

Part-time *Apple* and Peach Research Assist...
…and minimum qualifications: + Assist with planting, pruning, and harvesting of apple and peach trees + Conduct regular maintenance tasks to ensure optimal Read more
Housekeeper, *Apple* Valley Villa - Cassia...
Apple Valley Villa, part of a senior living community, is hiring entry-level Full-Time Housekeepers to join our team! We will train you for this position and offer a Read more
Sublease Associate Optometrist- *Apple* Val...
Sublease Associate Optometrist- Apple Valley, CA- Target Optical Date: Feb 22, 2024 Brand: Target Optical Location: Apple Valley, CA, US, 92307 **Requisition Read more
Sublease Associate Optometrist- *Apple* Val...
Sublease Associate Optometrist- Apple Valley, CA- Target Optical Date: Jan 24, 2024 Brand: Target Optical Location: Apple Valley, CA, US, 92307 **Requisition Read more
Housekeeper, *Apple* Valley Village - Cassi...
Apple Valley Village Health Care Center, a senior care campus, is hiring a Part-Time Housekeeper to join our team! We will train you for this position! In this role, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.