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.