ALTAIR, BASIC, TRS-80

Data Processing and TRS-80

During the 1978 year-end holiday season, the term DATA PROCESSING, COMPUTER SCIENCE and TRS-80 computers were highlights of this time frame as the personal computer era was at a growing and demanding stage with 8-bit processors (8080 and Z-80 processors) with CPU speeds of 2 MHz!

As a computer science major college student, I worked at Radio Shack (remember those electronic retail outlets?) as a sales person with access to equipment sold at Radio Shack including TRS-80 computers and accessories.

One night, after closing for the business day, my manager and I ordered pizza and went ‘heads-down’ designing and programming a Christmas Tree calendar that would be printed and given to customers inquiring about a Radio Shack product or TRS-80 computers.

This was right down my alley! After all, I had acquired programming languages knowledge such as FORTRAN, RPG II, COBOL and BASIC as a computer science major.

Level 2 BASIC, on the TRS-80 Model I, was a simple and limited language with memory capacity peaking at about 15K on a 16K machine! These were the days of 16k and 32k systems! Later, 64k systems!!!

The biggest programming challenge was manually defining, inspecting and formatting the yearly calendar text on the printed page, three months at a time, without missing a week or incorrect starting day of month. This resulted in many string definitions and corrections! The remainder of the calendar text was comprised of string definitions (again!) and a page centering algorithm given a monthly calendar width.

The below is a recreation of the printed yearly calendar:

                       M E R R Y   C H R I S T M A S
                                 A N D   A
                        H A P P Y   N E W   Y E A R

                                      R
                                     RAD
                                    RADIO
                                   RADIO S
                                  RADIO SHA
                                 RADIO SHACK
                                RADIO SHACK R
                               RADIO SHACK RAD
                              RADIO SHACK RADIO
                             RADIO SHACK RADIO S
                                 RADIO SHACK
                                RADIO SHACK R
                               RADIO SHACK RAD
                              RADIO SHACK RADIO
                             RADIO SHACK RADIO S
                            RADIO SHACK RADIO SHA
                           RADIO SHACK RADIO SHACK
                          RADIO SHACK RADIO SHACK R
                         RADIO SHACK RADIO SHACK RAD
                        RADIO SHACK RADIO SHACK RADIO
                            RADIO SHACK RADIO SHA
                           RADIO SHACK RADIO SHACK
                          RADIO SHACK RADIO SHACK R
                         RADIO SHACK RADIO SHACK RAD
                        RADIO SHACK RADIO SHACK RADIO
                       RADIO SHACK RADIO SHACK RADIO S
                      RADIO SHACK RADIO SHACK RADIO SHA
                     RADIO SHACK RADIO SHACK RADIO SHACK
                    RADIO SHACK RADIO SHACK RADIO SHACK R
                   RADIO SHACK RADIO SHACK RADIO SHACK RAD
                                   RADIO
                                   SHACK
                                   RADIO
                                   SHACK

                       A   1 9 7 9   C A L E N D A R
                   E S P E C I A L L Y    P R E P A R E D
                                   F O R

                              Larry Belmontes

                                B Y   T H E
                   T R S - 8 0  M I C R O C O M P U T E R


****************************************************************************
        JANUARY                   FEBRUARY                 MARCH
****************************************************************************
*  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *
*     1  2  3  4  5  6   *              1  2  3   *              1  2  3   *
*  7  8  9  10 11 12 13  *  4  5  6  7  8  9  10  *  4  5  6  7  8  9  10  *
*  14 15 16 17 18 19 20  *  11 12 13 14 14 16 17  *  11 12 13 14 15 16 17  *
*  21 22 23 24 25 26 27  *  18 19 20 21 22 23 24  *  18 19 20 21 22 23 24  *
*  28 29 20 31           *  25 26 27 28           *  25 26 27 28 29 30 31  *
*                        *                        *                        *
****************************************************************************
        APRIL                       MAY                     JUNE
****************************************************************************
*  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *
*  1  2  3  4  5  6  7   *        1  2  3  4  5   *                 1  2   *
*  8  9  10 11 12 13 14  *  6  7  8  9  10 11 12  *  3  4  5  6  7  8  9   *
*  15 16 17 18 19 20 21  *  13 14 15 16 17 18 19  *  10 11 12 13 14 15 16  *
*  22 23 24 25 26 27 28  *  20 21 22 23 24 25 26  *  17 18 19 20 21 22 23  *
*  29 30                 *  27 28 29 30 31        *  24 25 26 27 28 29 30  *
*                        *                        *                        *
****************************************************************************
           JULY                    AUGUST                  SEPTEMBER
****************************************************************************
*  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *
*  1  2  3  4  5  6  7   *           1  2  3  4   *                    1   *
*  8  9  10 11 12 13 14  *  5  6  7  8  9  10 11  *  2  3  4  5  6  7  8   *
*  15 16 17 18 19 20 21  *  12 13 14 15 16 17 18  *  9  10 11 12 13 14 15  *
*  22 23 24 25 26 27 28  *  19 20 21 22 23 24 25  *  16 17 18 18 20 21 22  *
*  29 30 31              *  26 27 28 29 30 31     *  23 24 25 26 27 28 29  *
*                        *                        *  30 31                 *
****************************************************************************
         OCTOBER                  NOVEMBER                 DECEMBER
****************************************************************************
*  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *  S  M  T  W  T  F  S   *
*     1  2  3  4  5  6   *              1  2  3   *                    1   *
*  7  8  9  10 11 12 13  *  4  5  6  7  8  9  10  *  2  3  4  5  6  7  8   *
*  14 15 16 17 18 19 20  *  11 12 13 14 14 16 17  *  9  10 11 12 13 14 15  *
*  21 22 23 24 25 26 27  *  18 19 20 21 22 23 24  *  16 17 18 19 20 21 22  *
*  28 29 20 31           *  25 26 27 28 29 30     *  23 24 25 26 27 28 29  *
*                        *                        *  30 31                 *
****************************************************************************

                           R A D I O    S H A C K
                                  8 2 0 9
                          5 1 2 - 8 5 4 - 2 6 6 1
                   E V E R H A R T   A T   A L A M E D A
                        C O R P U S   C H R I S T I
                                 T E X A S

The BASIC language code (reconstructed from my recollection and programming knowledge at that time) is below:

0010 rem ********************************************************
0020 rem **  Author: Larry Belmontes                      
0030 rem ** Program: XMASTREE (Holiday Personal Calendar)                
0040 rem **          Written in BASIC Language for TRS-80 Model 1
0050 rem **
0060 rem ** Print a personalized calendar for customer
0070 rem ** centered on paper with store information
0080 rem **
0090 rem ** This software was recreated from my recollection
0100 rem ** as the original author from Dec 1979 using   
0110 rem ** TRS-80 Level 2 BASIC.  
0120 rem **
0130 rem **
0140 rem ** Software Disclaimer
0150 rem ** -------------------
0160 rem ** No guarantee; No warranty; Install /Use at your own risk.
0170 rem **
0180 rem ** This software is provided "AS IS" and without any expressed
0190 rem ** or implied warranties, including, without limitation, the   
0200 rem ** implied warranties of merchantability and fitness for a
0210 rem ** particular purpose.                                    
0220 rem **
0230 rem ** The authur requrest keeping authors name intact to any
0240 rem ** modified versions.                                      
0250 rem ********************************************************
0260 rem
0270 rem ********************************************************
0280 rem ** Allocate string heap                    
0290 rem ********************************************************
0300 clear (5000)
0310 rem
0320 rem ********************************************************
0330 rem ** 1979 Calendar by month                  
0340 rem ********************************************************
0350 AM$ = "        JANUARY          "
0360 WK$ = "*  S  M  T  W  T  F  S   "
0370 A1$ = "*     1  2  3  4  5  6   "
0380 A2$ = "*  7  8  9  10 11 12 13  "
0390 A3$ = "*  14 15 16 17 18 19 20  "
0400 A4$ = "*  21 22 23 24 25 26 27  "
0410 A5$ = "*  28 29 20 31           "
0420 A6$ = "*                        "
0430 rem
0440 BM$ = "         FEBRUARY        "
0450 WK$ = "*  S  M  T  W  T  F  S   "
0460 B1$ = "*              1  2  3   "
0470 B2$ = "*  4  5  6  7  8  9  10  "
0480 B3$ = "*  11 12 13 14 14 16 17  "
0490 B4$ = "*  18 19 20 21 22 23 24  "
0500 B5$ = "*  25 26 27 28           "
0510 B6$ = "*                        "
0520 rem
0530 CM$ = "         MARCH           "
0540 WK$ = "*  S  M  T  W  T  F  S   "
0550 C1$ = "*              1  2  3   "
0560 C2$ = "*  4  5  6  7  8  9  10  "
0570 C3$ = "*  11 12 13 14 15 16 17  "
0580 C4$ = "*  18 19 20 21 22 23 24  "
0590 C5$ = "*  25 26 27 28 29 30 31  "
0600 C6$ = "*                        "
0610 rem
0620 DM$ = "        APRIL            "
0630 WK$ = "*  S  M  T  W  T  F  S   "
0640 D1$ = "*  1  2  3  4  5  6  7   "
0650 D2$ = "*  8  9  10 11 12 13 14  "
0660 D3$ = "*  15 16 17 18 19 20 21  "
0670 D4$ = "*  22 23 24 25 26 27 28  "
0680 D5$ = "*  29 30                 "
0690 D6$ = "*                        "
0700 rem
0710 EM$ = "           MAY           "
0720 WK$ = "*  S  M  T  W  T  F  S   "
0730 E1$ = "*        1  2  3  4  5   "
0740 E2$ = "*  6  7  8  9  10 11 12  "
0750 E3$ = "*  13 14 15 16 17 18 19  "
0760 E4$ = "*  20 21 22 23 24 25 26  "
0770 E5$ = "*  27 28 29 30 31        "
0780 E6$ = "*                        "
0790 rem
0800 FM$ = "          JUNE           "    
0810 WK$ = "*  S  M  T  W  T  F  S   "
0820 F1$ = "*                 1  2   "
0830 F2$ = "*  3  4  5  6  7  8  9   "
0840 F3$ = "*  10 11 12 13 14 15 16  "
0850 F4$ = "*  17 18 19 20 21 22 23  "
0860 F5$ = "*  24 25 26 27 28 29 30  "
0870 F6$ = "*                        "
0880 rem
0890 GM$ = "           JULY          "
0900 WK$ = "*  S  M  T  W  T  F  S   "
0910 G1$ = "*  1  2  3  4  5  6  7   "
0920 G2$ = "*  8  9  10 11 12 13 14  "
0930 G3$ = "*  15 16 17 18 19 20 21  "
0940 G4$ = "*  22 23 24 25 26 27 28  "
0950 G5$ = "*  29 30 31              "
0960 G6$ = "*                        "
0970 rem
0980 HM$ = "          AUGUST         "
0990 WK$ = "*  S  M  T  W  T  F  S   "
1000 H1$ = "*           1  2  3  4   "
1010 H2$ = "*  5  6  7  8  9  10 11  "
1020 H3$ = "*  12 13 14 15 16 17 18  "
1030 H4$ = "*  19 20 21 22 23 24 25  "
1040 H5$ = "*  26 27 28 29 30 31     "
1050 H6$ = "*                        "
1060 rem
1070 IM$ = "         SEPTEMBER       "    
1080 WK$ = "*  S  M  T  W  T  F  S   "
1090 I1$ = "*                    1   "
1100 I2$ = "*  2  3  4  5  6  7  8   "
1110 I3$ = "*  9  10 11 12 13 14 15  "
1120 I4$ = "*  16 17 18 18 20 21 22  "
1130 I5$ = "*  23 24 25 26 27 28 29  "
1140 I6$ = "*  30 31                 "
1150 rem
1160 JM$ = "         OCTOBER         "
1170 WK$ = "*  S  M  T  W  T  F  S   "
1180 J1$ = "*     1  2  3  4  5  6   "
1190 J2$ = "*  7  8  9  10 11 12 13  "
1200 J3$ = "*  14 15 16 17 18 19 20  "
1210 J4$ = "*  21 22 23 24 25 26 27  "
1220 J5$ = "*  28 29 20 31           "
1230 J6$ = "*                        "
1240 rem
1250 KM$ = "         NOVEMBER        "
1260 WK$ = "*  S  M  T  W  T  F  S   "
1270 K1$ = "*              1  2  3   "
1280 K2$ = "*  4  5  6  7  8  9  10  "
1290 K3$ = "*  11 12 13 14 14 16 17  "
1300 K4$ = "*  18 19 20 21 22 23 24  "
1310 K5$ = "*  25 26 27 28 29 30     "
1320 K6$ = "*                        "
1330 rem
1340 LM$ = "         DECEMBER        "
1350 WK$ = "*  S  M  T  W  T  F  S   "
1360 L1$ = "*                    1   "
1370 L2$ = "*  2  3  4  5  6  7  8   "
1380 L3$ = "*  9  10 11 12 13 14 15  "
1390 L4$ = "*  16 17 18 19 20 21 22  "
1400 L5$ = "*  23 24 25 26 27 28 29  "
1410 L6$ = "*  30 31                 "
1420 rem
1430 rem
1440 rem ********************************************************
1450 rem ** Width of page in characters is computee as the total
1460 rem ** length of 3 months across the page.                
1470 rem **    print    WK$; WK$; WK$; "*"
1480 rem ********************************************************
1490 iw = (len(WK$) * 3) + 1
1500 rem
1510 rem ********************************************************
1520 rem ** Declare line of astericks for calendar
1530 rem ********************************************************
1540 for i=1 to iw
1550  ST$ = ST$ + "*"
1560 next
1570 rem
1580 rem ********************************************************
1590 rem ** Ask for Customer Name
1600 rem ********************************************************
1610 input "Customer Name: "; cn$
1620 print " "
1630 rem
1640 rem ********************************************************
1650 rem ** Determine page center column
1660 rem ********************************************************
1670 ic = int(iw / 2) 
1680 rem
1690 rem ********************************************************
1700 rem ** Christmas Tree string           
1710 rem ********************************************************
1720 rs$="RADIO SHACK RADIO SHACK RADIO SHACK RADIO SHACK"
1730 rem
1740 rem ********************************************************
1750 rem ** Print Holiday Information  (3 items)
1760 rem ********************************************************
1770 data 3
1780 data "M E R R Y   C H R I S T M A S"
1790 data "A N D   A"                             
1800 data "H A P P Y   N E W   Y E A R"      
1810 read in
1820 for i = 1 to in
1830  read ln$
1840  is = int( (iw - len(ln$) ) / 2)
1850  print tab(is); ln$
1860 next
1870 rem
1880 print " "
1890 rem
1900 rem ********************************************************
1910 rem ** Print Tree Branches - top section
1920 rem ********************************************************
1930 ix = ic 
1940 iy = 1
1950 iz = 0
1960 for i=1 to 10
1970  print tab(ix); left$(rs$,iy+iz)
1980  ix = ix - 1
1990  iy = iy + 2
2000 next
2010 rem
2020 rem ********************************************************
2030 rem ** Print 10 Tree Branches - middle section      
2040 rem ********************************************************
2050 ix = ic 
2060 ix = ix - 5
2070 iy = 1
2080 iz = 10
2090 for i=1 to 10
2100  print tab(ix); left$(rs$,iy+iz)
2110  ix = ix - 1
2120  iy = iy + 2
2130 next
2140 rem
2150 rem ********************************************************
2160 rem ** Print 10 Tree Branches - bottom section      
2170 rem ********************************************************
2180 ix = ic 
2190 ix = ix - 10
2200 iy = 1
2210 iz = 20
2220 for i=1 to 10
2230  print tab(ix); left$(rs$,iy+iz)
2240  ix = ix - 1
2250  iy = iy + 2
2260 next
2270 rem
2280 rem ********************************************************
2290 rem ** Print Tree trunk  (4 items)    
2300 rem ********************************************************
2310 data 4
2320 data "RADIO"
2330 data "SHACK"
2340 data "RADIO"
2350 data "SHACK"
2360 read in
2370 for i = 1 to in
2380  read ln$
2390  is = int( (iw - len(ln$) ) / 2)
2400  print tab(is); ln$
2410 next
2420 rem
2430 print
2440 rem
2450 rem ********************************************************
2460 rem ** Print Pre-Customer Information  (3 items)   
2470 rem ********************************************************
2480 data 3
2490 data "A   1 9 7 9   C A L E N D A R"
2500 data "E S P E C I A L L Y    P R E P A R E D"
2510 data "F O R"
2520 read in
2530 for i = 1 to in
2540  read ln$
2550  is = int( (iw - len(ln$) ) / 2)
2560  print tab(is); ln$
2570 next
2580 rem
2590 rem ********************************************************
2600 rem ** Print Customer Name   
2610 rem ********************************************************
2620 print " "
2630 is = int( (iw - len(cn$) ) / 2)
2640 print tab(is); cn$
2650 print " "
2660 rem
2670 rem ********************************************************
2680 rem ** Print Post-Customer Information  (2 items)   
2690 rem ********************************************************
2700 data 2
2710 data "B Y   T H E"
2720 data "T R S - 8 0  M I C R O C O M P U T E R"
2730 read in
2740 for i = 1 to in
2750  read ln$
2760  is = int( (iw - len(ln$) ) / 2)
2770  print tab(is); ln$
2780 next
2790 rem
2800 print " "
2810 print " "
2820 rem
2830 rem ********************************************************
2840 rem ** Print JAN, FEB, MAR Calendar
2850 rem ********************************************************
2860 print ST$
2870 print AM$; BM$; CM$
2880 print ST$
2890 print WK$; WK$; WK$; "*"
2900 print A1$; B1$; C1$; "*"
2910 print A2$; B2$; C2$; "*"
2920 print A3$; B3$; C3$; "*"
2930 print A4$; B4$; C4$; "*"
2940 print A5$; B5$; C5$; "*"
2950 print A6$; B6$; C6$; "*"
2960 rem
2970 rem
2980 rem ********************************************************
2990 rem ** Print APR, MAY, JUN Calendar
3000 rem ********************************************************
3010 print ST$
3020 print DM$; EM$; FM$
3030 print ST$
3040 print WK$; WK$; WK$; "*"
3050 print D1$; E1$; F1$; "*"
3060 print D2$; E2$; F2$; "*"
3070 print D3$; E3$; F3$; "*"
3080 print D4$; E4$; F4$; "*"
3090 print D5$; E5$; F5$; "*"
3100 print D6$; E6$; F6$; "*"
3110 rem
3120 rem
3130 rem ********************************************************
3140 rem ** Print JUL, AUG, SEP Calendar
3150 rem ********************************************************
3160 print ST$
3170 print GM$; HM$; IPM$
3180 print ST$
3190 print WK$; WK$; WK$; "*"
3200 print G1$; H1$; I1$; "*"
3210 print G2$; H2$; I2$; "*"
3220 print G3$; H3$; I3$; "*"
3230 print G4$; H4$; I4$; "*"
3240 print G5$; H5$; I5$; "*"
3250 print G6$; H6$; I6$; "*"
3260 rem
3270 rem ********************************************************
3280 rem ** Print OCT, NOV, DEC Calendar
3290 rem ********************************************************
3300 print ST$
3310 print JM$; KM$; LM$
3320 print ST$
3330 print WK$; WK$; WK$; "*"
3340 print J1$; K1$; L1$; "*"
3350 print J2$; K2$; L2$; "*"
3360 print J3$; K3$; L3$; "*"
3370 print J4$; K4$; L4$; "*"
3380 print J5$; K5$; L5$; "*"
3390 print J6$; K6$; L6$; "*"
3400 rem
3410 rem ********************************************************
3420 rem ** End of calendar           
3430 rem ********************************************************
3440 print ST$
3450 rem
3460 rem
3470 print " "
3480 rem
3490 rem ********************************************************
3500 rem ** Print Store Information
3510 rem ********************************************************
3520 data 6
3530 data "R A D I O    S H A C K"
3540 data "8 2 0 9"
3550 data "5 1 2 - 8 5 4 - 2 6 6 1"
3560 data "E V E R H A R T   A T   A L A M E D A"
3570 data "C O R P U S   C H R I S T I"
3580 data "T E X A S"
3590 read in
3600 for i = 1 to in
3610  read ln$
3620  is = int( (iw - len(ln$) ) / 2)
3630  print tab(is); ln$
3640 next
3650 rem
3660 end

This code has been executed on a TRS-80 emulator, ALTAIR 8080 emulator and BWBASIC interpreter.

This was a great in-store accomplishment at that time that it spiked the interest of a local news reporter resulting in a news interview with my manager (I missed the interview as I was attending a college class).

Below is an image of my personal copy of the Radio Shack employees newsletter article dated February 1979:

Those were the days!

Software Disclaimer

No guarantee; No warranty; Install / Use at your own risk.

This software is provided “AS IS” and without any expressed or implied warranties, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose.

The author requests keeping authors name intact to any modified versions.

In addition, the author requests readers to submit any code modifications / enhancements and associated comments for consideration into a subsequent release (giving credit to contributors) thus, improving overall functionality benefiting the MVS 3.8J hobbyist public domain community.

Closing

I am grateful to this experience which acted as a stepping stone to my software engineering career.

Leave a Reply

Your email address will not be published. Required fields are marked *


CAPTCHA Image
Reload Image

This site uses Akismet to reduce spam. Learn how your comment data is processed.