Rivista: PC Personal Computer Club – Anno: 1984, Gennaio – Numero 1 – Trascrizione: Francesco Fiorentini
Continuano i listati ripresi dalla rivista PC Personal Computer Club, questa volta si tratta del numero 1 del secondo anno: https://www.retromagazine.net/pc-personal-computer-club-anno-ii-numero-1/
Fa ritorno nella nostra rubrica RetroLiPS il Radio Shack TRS-80 (modello Color Computer) prodotto dall’azienda texana Tandy Corporation e venduto attraverso la catena di negozi Radio Shack dal 1977 fino ai primi anni ’80.
Monitba e’ un simpatico e utile monitor realizzato interamente in Basic. Il menu’ di utilizzo e’ piuttosto ricco e sicuramente troverete il modo di trarne il massimo beneficio.
Attenzione – rispetto alla versione originale il programma è stato leggermente modificato per migliorare il menu’ e la visualizzazione delle istruzioni.

Titolo: Horse Race
Piattaforma: TRS 80 Color Computer
Linguaggio: Basic
Versione originale: N/A
Pubblicazione: PC Personal Computer Club
Anno: 1984, Gennaio
Trascrizione: Francesco Fiorentini
Anno: 2026
Download: N/A
Note: Il programma è stato modificato per per migliorare il menu’ e la visualizzazione delle istruzioni.

Istruzioni
Il programma vi indichera’ di volta in volta i comandi che dovrete utilizzare per compiere l’operazione richiesta.


Qui di seguito trovate il codice da copiare sul vostro TRS 80 oppure su un emulatore, noi suggeriamo trs80gp.
Istruzioni per copiare il file nell’emulatore:
1 – avviate l’emulatore trs80gp
2 – assicuratevi di aver selezionato Color Computer in File – Change Model
3 – incollate il codice di cui sotto
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori nel listato prima di copiarlo sull’emulatore.
Listato: Monitba – TRS 80 – Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192 10 CLS:DIMA(16):DIMD(15):DIMB$(23)
20 'PRINT MENU
30 CLS:PRINT" SELECT A NUMBER"
40 PRINT"1 - HEX/ASCII DUMP"
50 PRINT"2 - VIEW MEMORY: DEC HEX ASC"
60 PRINT"3 - SAVE:MEM ON DISK(DATA FORM)"
70 PRINT"4 - LOAD: DATA FROM DISK"
80 PRINT"5 - EXAMINE/CHANGE MEMORY"
90 PRINT"6 - COPY: BLOCK COPY OF MEMORY"
100 PRINT"7 - PRINT:ASCII 24 BYTES BY ADD"
110 PRINT"8 - DEBUGGER"
120 PRINT"9 - INSTRUCTIONS"
125 PRINT"0 - EXIT PROGRAM"
130 C$=INKEY$:IFC$="" GOTO 130
140 C=VAL(C$)
150 IF C<0 OR C>9 GOTO30
160 ON C GOTO 180,750,510,620,1050,1430,880,1710,1640,165
165 END
170 'HEX/ASCII DUMP
180 CLS:GOSUB1340:B=-1
190 Z=0
200 PRINT"DO YOU WANT A HARDCOPY (Y/N)?"
210 X$=INKEY$:IF X$<>"Y" AND X$<>"N" THEN GOTO 210
220 FOR A=SA TO EA STEP8
230 B=B+1:'FLAG FOR WHEN PRINTER WILL PRINT OUT FOR LONGER LINE
240 Z=Z+1
250 GOSUB 1380
260 PRINT"$";F$;:PRINT".";
270 IF X$="Y" AND B=0 THEN PRINT#-2,"$";F$;:PRINT#-2,""
280 FORD=0TO7
290 S=PEEK(A+D)
300 GOSUB1400
310 PRINT S$; " ";: IF X$="Y" THEN B$(B*8+D)=S$
320 A$="&H"+S$:A$=CHR$(VAL(A$))
330 IF X$="Y" AND B=1 AND D=7 THEN FOR E=0 TO 15:PRINT#-2,B$(E);" ";:NEXT E
340 'FOR ASCII CONVERT 8 BIT TO 7 BIT
350 IF A$>CHR$(127) THEN A$=CHR$(ASC(A$)-128)
360 IF A$<CHR$(32) OR A$=CHR$(127) THEN S(D)=46
370 IF A$>CHR$(31) AND A$<CHR$(127) THEN S(D)=ASC(A$)
380 NEXT D
390 PRINT;:IFX$="Y" AND B=1 THENPRINT#-2
400 FORC=0 TO 7
410 PRINTAB(7)CHR$(S(C));" ";:IF X$="Y" THEN D(B*8+C)=S(C)
420 IF X$="Y" AND B=1 AND C=7 THEN FOR E=0 TO 15:PRINT#-2,TAB(7)CHR$(D(E));" ";:NEXT E
430 NEXT C
440 PRINT
450 IF X$="Y" AND B=1 THEN PRINT#-2:B=-1
460 IF INT(Z/7)=Z/7 GOSUB 1300
470 NEXT A
480 IF X$="Y" THEN PRINT#-2
490 GOSUB1320:CLS:GOTO30
500 'SAVE BLOCK OF MEMORY
510 CLS:PRINT"TO SAVE ON DISK WHAT IS THE":PRINT:GOSUB1340
520 INPUT"FILENAME/EXT";Q$
530 PRINT:PRINTTAB(10)"NOW SAVING"
540 OPEN"O",#1,Q$
550 FORA=SA TO EA
560 B=PEEK(A)
570 WRITE#1,B
580 NEXT A
590 CLOSE#1:PRINT:PRINT"THE DATA IS SAVED ON DISK UNDER FILENAME ";"'";Q$;"'":PRINT:GOSUB1320
600 'LOAD INTO MEMORY
610 GOTO30
620 CLS:PRINT"TO LOAD FROM DISK WHAT IS THE BEGINNING ADDRESS FOR THE DATA":INPUTSA:PRINT
630 PRINT"WHAT IS THE FILENAME/EXT":INPUTQ$:PRINT
640 PRINT:PRINTTAB(10)"NOW LOADING"
650 OPEN"I",#1,Q$
660 FORA=SA TO &H7FFF
670 IF EOF(1)=-1 THEN 710
680 INPUT#1,B
690 POKE A,B
700 NEXT A
710 CLOSE#1:PRINT:PRINT"THE DATA IS NOW LOADED IN"
720 PRINT "ADDRESSES $";HEX$(SA);" TO $";HEX$(A-1):PRINT
730 GOSUB 1320:GOTO 30
740 'LOOK AT INDIV. MEM. ALL FORMS
750 CLS:GOSUB1340
760 Z=0
770 FORA=SA TO EA
780 Z=Z+1
790 S=PEEK(A):PRINT USING"**###";A;
800 GOSUB1380
810 PRINT " ";F$,:PRINTUSING "**#";S;:PRINT;" ";
820 GOSUB1400
830 PRINTS$;" ";:IF S<>13 THEN PRINTCHR$(S) ELSE PRINT
840 IF INT(Z/14)=Z/14 GOSUB1300
850 NEXTA
860 GOSUB1320:GOTO30
870 'LOOK AT ASCII IN BLOCKS
880 CLS:GOSUB1340
890 Z=0
900 FORA=SA TO EA STEP24
910 GOSUB1380
920 PRINTF$;" ";
930 Z=Z+1
940 FORD=0TO23
950 S=PEEK(A+D)
960 IF S>127 THEN S=S-128
970 IF S<32 THEN S=46
980 PRINTCHR$(S);
990 NEXTD
1000 PRINT
1010 IF INT(Z/14)=Z/14 GOSUB1300
1020 NEXTA
1030 GOSUB1320:GOTO30
1040 'EXAMINE/CHANGE MEMORY
1050 CLS:GOSUB1340
1060 IF EA=0 OR EA>32767 THEN EA=32767
1070 FORA=SA TO EA
1080 S=PEEK(A)
1090 PRINT@480,USING"**###";A;
1100 GOSUB1380
1110 PRINT " ";F$;" ";:PRINTUSING"**#";S;:PRINT" ";
1120 GOSUB1400
1130 PRINTS$;" ";
1140 B=S:IFB>127 THEN B=B-128
1150 IFB<32 THEN B=46
1160 PRINTCHR$(B)
1170 PRINT@0,"PRESS <DOWN> OR <UP> ARROWS <ENTER> TO CHANGE OR <M>ENU":PRINTSTRING$(32,"=");:PRINT" ADDRESS DEC HX A CHANGE(HX)";
1180 CC$="":D=0:PRINT@473
1190 C$=INKEY$:IFC$=CHR$(10) GOTO1260 ELSE IFC$=CHR$(94) GOTO1250 ELSE IFC$=CHR$(13) GOTO1240 ELSE IF C$="M"GOTO30
1200 IFC$<="F" AND C$>="0" GOTO1210 ELSE GOTO1190
1210 D=D+1
1220 CC$=CC$+C$:PRINT@473+D,C$:IF D=2 GOTO 1230 ELSE GOTO1190
1230 CC$="&H"+CC$:C=VAL(CC$):GOTO1190
1240 POKEA,C:GOTO1260
1250 A=A-1:PRINT@474,CHR$(94):GOTO1080
1260 NEXTA
1270 GOTO30
1280 END
1290 'SUBROUTINES USED MULTIPLE TIMES
1300 PRINT" PRESS <C> TO CONTINUE";
1310 IF INKEY$<>"C" THEN 1310 ELSE:PRINT: RETURN
1320 PRINT" PRESS <M> TO RETURN TO MENU";
1330 IF INKEY$<>"M" THEN 1330 ELSE:PRINT: RETURN
1340 INPUT"START ADDRESS";SA
1350 INPUT"END ADDRESS";EA
1360 RETURN
1370 ' SUBS TO PUT HEX VALUES IN STANDARD FORMAT
1380 IF LEN(HEX$(A))=1 THEN F$="000"+HEX$(A) ELSE IF LEN(HEX$(A))=2 THEN F$="00"+HEX$(A) ELSE IF LEN(HEX$(A))=3 THEN F$="0"+HEX$(A) ELSE F$=HEX$(A):RETURN
1390 RETURN
1400 IF LEN(HEX$(S))=1 THEN S$="0"+HEX$(S) ELSE S$=HEX$(S)
1410 RETURN
1420 'COPY BLOCK OF MEMORY TO ANOTHER LOCATION
1430 CLS:PRINT"BEGINNING ADDRESS FROM WHERE YOU WANT TO COPY MEMORY":INPUTSA
1440 PRINT"ENDING ADDRESS": INPUTEA:PRINT:IF EA<SA THEN PRINT"START ADDRESS MUST BE SMALLER THAN OR EQUAL TO END ADDRESS":GOSUB1300:GOTO1430
1450 PRINT"BEGINNING ADDRESS WHERE TO COPY":INPUTCA
1460 PRINT"PRESS <C>ONTINUE OR <M>ENU"
1470 C$=INKEY$:IFC$="M"GOTO30 ELSE IFC$="C"GOTO1480 ELSE GOTO 1470
1480 PRINT:PRINT" NOW COPYING":Z=0
1490 FORA=SA TO EA
1500 PE=PEEK(A):PO=CA+Z
1510 IF PO>&H7FFF THEN PRINT:PRINT"CANNOT COPY INTO ROM AREA":PRINT:GOSUB1320:GOTO30
1520 POKE PO,PE
1530 Z=Z+1
1540 NEXTA
1550 CLS:PRINT"THE MEMORY IN THE FOLLOWING LOCATION:"
1560 PRINT"DECIMAL:";:PRINTUSING "**###"; SA:PRINT" TO ";PRINTUSING"**###";EA
1570 PRINT"HEXADECIMAL:";S=SA:GOSUB1400:PRINTS$
1580 PRINT:PRINT"HAS BEEN COPIED TO THE FOLLOWING LOCATION:"
1590 PRINT"DECIMAL:";:PRINTUSING "**###"; CA:PRINT" TO ";PRINTUSING"**###";CA+EA-SA
1600 PRINT"HEXADECIMAL:";:S=SA:GOSUB1400:PRINTS$;" TO ";:S=CA+EA-SA:GOSUB1400:PRINTS$
1610 PRINT
1640 CLS:PRINT"1 USE THE NORMAL DECIMAL OR HEX FORMAT THAT 'EXTENDED BASIC' USES, E.G. 142 OR &H8E. THE EXCEPTION IS WHEN CHANGING A VALUE IN THE 'EXAMINE' MODE; USEONLY HEX THEN."
1650 PRINT"WHEN CHANGING MEMORY ENTER TWO HEX DIGITS ONLY AND PRESS <ENTER>. IF YOU ENTER WRONG VALUE, PRESS <DOWN> ARROW INSTEAD OF <ENTER>."
1660 PRINT"2 THERE ARE NO COMMANDS TO REMEMBER. EACH OPERATION WILL PROMPT YOU WHAT YOU NEED TO DO AT THAT TIME."
1670 GOSUB1300
1680 PRINT"3 THE BREAKPOINT IN THE DEBUGGERIS REALLY A RETURN FROM SUBROUTINE. YOU MUST REMOVE IT FROM THE ML PROGRAM WITH <Y>ANK."
1690 GOSUB1320:GOTO30
1700 'DEBUGGER
1710 CLS
1720 PRINT@0,"<B>REAKPOINT<Y>ANK BREAKPOINT"
1730 PRINT@35,"<G>O ML PROGRAM<M>ENU"
1740 PRINT@64,STRING$(32,"=");
1750 PRINT@480,"COMMAND";:INPUTQ$
1760 IF Q$="B" GOTO 1780 ELSE IF Q$="Y" GOTO 1840 ELSE IF Q$="G" GOTO 1880 ELSE IF Q$="M" GOTO 30 ELSE GOTO 1750
1770 'SET BREAKPOINT
1780 INPUT"ADDRESS";BA
1790 IF A$="Y" THEN PRINT "BREAKPOINT ALREADY AT $";HEX$(YA):GOTO 1720
1800 A=PEEK(BA):YA=BA:A$="Y"
1810 POKE BA,&H39
1820 GOTO 1720
1830 'YANK BREAKPOINT
1840 IF A$="N" THEN PRINT"NO BREAKPOINTS":GOTO1720
1850 POKE YA,A:A$="N"
1860 GOTO1720
1870 'GO TO ML PROGRAM
1880 INPUT"ADDRESS";GA
1890 DEFUSR0=GA
1900 B=USR(0)
1910 PRINT"RETURNED AT $";HEX$(BA):PRINT
1920 GOTO1720
