quinta-feira, junho 23, 2022

MSX Programas: Revista MSX Micro 07

Revista MSX Micro 07

1986

Programas: Arquivo Eletrônico, Ataque Atômico, Recuperação de Programas BASIC

Jogos:  Shark Hunter, Track & Field II.


Arquivo Eletrônico

Artigo Orignal: MSX Micro, Digitação: Wilson Pilon

Este programa, apesar de chamar-se Arquivo Eletrônico, é um conjunto de programas que visa auxiliar os hobbystas de Eletrônica em seus projetos.

Se você estuda Eletrônica ou gosta de fazer aquelas montagens divulgadas em revistas especializadas, este programa lhe será de muita utilidade.

O leitor resumiu em um único programa, vários tópicos necessários a quem se interessa pelo assunto.

Vejamos

  • (A) Portas Lógicas Digitais: Permite saber as saídas e montar a tabela verdade, para as portas AND, OR, NOf, NOR, NANO e EXCLUSIVE-OR.
  • (B) Decodificador de Cores: Este é um problema comum ao hobbysta: identificar pelas cores, um resistor ou capacitor. Como você sabe, os valores de resistores ou capacitores são dados por faixas coloridas.
  • (C) Cálculos de Freqüências: Calcula as frequências, de ressonância e de corte, de um filtro RC.
  • (D) Cálculo de Resistores Equivalentes: Permite calcular o valor equivalente, um ohms de uma associação série ou paralela de resistores.
  • (E) Conversor Decimal, Binário e Hexadecimal: Permite, dado um número decimal, descobrir seus equivalentes nas bases 2 e 16.
  • (F) Polarização de Transistores: Define os valores dos resistores a serem usados para polarizar um transistor na configuraçâo emissor-comum.
  • (G) Projetando com amplificador operacional 741: O circuito integrado 741 é o mais versátil amplificador operacional, pois permite, com resistores externos e mudando sua configuração, construir: amplificadores, casadores de impedância, somadores, etc.. Este módulo explica tudo sobre o 741. 
  • (H) Cálculos de Capacitores: Calcula-se a capacitância equivalente de uma associação.
  • (I) Cálculos de Reatância Capacitiva: Dada a frequência e o valor do capacitor, calcula-se a reatância.
  • (J) Cálculos de Reatância Indutiva: Dada a freqüência e o valor do indutor, calcula-se a reatância.
  • (K) Projetando com o CI555: O circuito integrado 555 e um temporizador que pode ser utilizado em 1001 aplicações: minuteria, multivibradores, etc.. Aula completa e pinagem do mesmo.
(NT) O programa original tem algumas linhas faltantes que impedem a operação (linhas 2060 a 2180). O programa é muito longo então não foi concluído até o momento.

Referência de Listagem

ListagemArquivo
Listagem Únicaeletro.bas

Listagem

  
5 CLS:LOCATE7,10:PRINT"Digite seu nome ";
6 INPUTZ$
20 COLOR 1,11,11:SCREEN2,2:FORF=1TO16:READK$:S$=S$+CHR$(VAL("&b"+LEFT$(K$,8))):NEXT:RESTORE:FORF=1TO16:READK$:S$=S$+CHR$(VAL("&b"+RIGHT$(K$,8))):NEXT
30 SPRITE$(1)=S$:FORF=191TO40STEP-1.1:PUTSPRITE0,(F+30,F+F+10),6,1:PUTSPRITE1,(50,F),2,1:PUTSPRITE2,(F+10,F),13,1:PUTSPRITE3,(F+10,138),1,1:PUTSPRITE4,(F+10,F+98),4,1:NEXT:P=P+1:IFP>1THEN30
40 OPEN"grp:"FOROUTPUTAS#1:PSET(68,47),11:PRINT#1,"Baptista Producoes"
50 FORF=2TO18STEP2:LINE(27+F,41-F)-(235-F,75-F),13,B:NEXT:PSET(97,97),11:PRINT#1,"Apresenta":FORF=2TO18STEP2:LINE(27+F,139-F)-(235-F,173-F),12,B:NEXT:PSET(68,144),11:PRINT#1,"Arquivo Eletronico":P=0:FORF=1TO2000:NEXT
70 DATA 1100001100000000
80 DATA 1110011100000000
90 DATA 1101101100000000
100 DATA1100001100000000
105 DATA1100001100000000
110 DATA0000011111110000
120 DATA0000100000000000
130 DATA0000011111110000
140 DATA0000000000011000
150 DATA0000011111110000
160 DATA0000000001100011
170 DATA0000000000110110
180 DATA0000000000001000
190 DATA0000000000010100
200 DATA0000000000110110
210 DATA0000000001100011
220 DATA 66,65,80,84,74,82,84,65
230 POKE64683!,1:SCREEN3,3:COLOR15,1,1:FORD=0TO7:COLOR D+3:PRESET(90,75):CLS:PRINT#1,7-D:PLAY"v9f7":FOR S=0TO 550:NEXT:NEXT:CLOSE
240 SCREEN0:KEYOFF:FORJ=1TO3
250 PRINTCHR$(23):FORI=1TO4:PRINT:NEXT
260 PRINT"           Arquivo Eletronico":PRINT:PRINT:PRINT
270 PRINT"         Jose Baptista da Silva"
280 PRINT:PRINT:PRINT"              >>>>1986<<<<"
290 FORK=1TO600:NEXT:NEXT
300 CLS:LOCATE11,1:PRINT "Arquivo Eletronico"
310 LOCATE 0,5:PRINT"Instrucoes":PRINT
320 B$="Os artigos contidos neste arquivo sao deinteira responsabilidade   do  autor  domesmo Sr. Jose Baptista."
330 A$=" O usuario destedevera seguir com o maximo rigor,as ins-trucoes dadas durante a execucao do programa.
340 B=LEN(B$):FORI=1TOB:X$=MID$(B$,I,1):PRINTX$;:FORJ=1TO15:NEXT:NEXT
350 A=LEN(A$):FORI=1TOA:X$=MID$(A$,I,1):PRINTX$;:FORJ=1TO15:NEXT:NEXT:LOCATE7,20:PRINT"Press algo para continuar":A$=INKEY$:IFA$=""THEN350
360 REM *** ONERRORGOTO 5480:CLS:PLAY"cdefgabr2","l8cdefgabr2"
361 CLS:PLAY"cdefgabr2","l8cdefgabr2"
370 PLAY"t240l6v12","t240l2v9"
380 PLAY"r8o6gabo7dcceb","o4go5ge"
390 PLAY"dg#gdo6bgab","o4bo5eo4e"
400 CLS:LOCATE11,1:PRINT"ARQUIVO ELETRONICO":PRINT:PRINT
410 A$="(A) Portas Logicas Digitais             (B) Decodificador de Cores              (C) Calculo de Resistencia              (D) Resistencia Equivalente             (E) Conversor DEC,BIN,HEX."
420 B$="              (F) Polarizacao de Transistores         (G) Projeto com Amp. OP CI 741          (H) Calculos de Capacitores             (I) Reatancia Capacitiva                (J) Reatancia Indutiva                  (K) Projeto com o Temp. CI 555"
430 A=LEN(A$):FORI=1TOA:X$=MID$(A$,I,1):PRINTX$;:FORJ=1TO5:NEXT:NEXT
440 B=LEN(B$):FORI=1TOB:X$=MID$(B$,I,1):PRINTX$;:FORJ=1TO5:NEXT:NEXT
450 LOCATE 6,20:PRINT"Qual o Item Desejado ?"
460 Y$=INKEY$:IF Y$=""THEN460
470 IFY$="A"GOTO590
480 IFY$="B"GOTO2900
500 IFY$="C"GOTO1940
510 IFY$="D"GOTO2020
520 IFY$="E"GOTO4770
530 IFY$="F"GOTO2170
540 IFY$="G"GOTO2290
550 IFY$="H"GOTO2540
560 IFY$="I"GOTO2710
570 IFY$="J"GOTO2820
580 IFY$="K"GOTO5150ELSE460
590 CLS:LOCATE14,4:PRINT"(1) Porta AND":LOCATE14,6:PRINT"(2) Porta OR":LOCATE14,8:PRINT"(3) Porta NOR":LOCATE14,10:PRINT"(4) Porta NAND":LOCATE14,12:PRINT"(5) Porta OR-EX"
600 LOCATE 10,18:PRINT"Press o Item Desejado?"
610 X$=INKEY$:IFX$=""THEN610
620 IF X$="1"THEN670
630 IF X$="2"THEN840
640 IF X$="3"THEN1010
650 IF X$="4"THEN1350
660 IF X$="5"THEN1690ELSE610
670 CLS:LOCATE5,1:PRINT"Tabela Verdade da Porta AND"
680 LOCATE 0,4:PRINT"Voce devera  indicar as  duas  variaveislogicas, A e B"
690 LOCATE 10,7:PRINT"A   AND   B     S"
700 LOCATE13,12:PRINT""
710 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A1:LOCATE9,11:PRINT;A1
720 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B1:LOCATE19,11:PRINT;B1:S1=A1ANDB1:LOCATE25,11:PRINT;S1
730 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"In de Dados ";A2:LOCATE 9,12:PRINT;A2
740 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B2:LOCATE19,12:PRINT;B2:S2=A2ANDB2:LOCATE25,12:PRINT;S2
750 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"In de Dados ";A3:LOCATE 9,13:PRINT;A3
760 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B3:LOCATE19,13:PRINT;B3:S3=A3ANDB3:LOCATE25,13:PRINT;S3
770 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"In de Dados ";A4:LOCATE 9,14:PRINT;A4
780 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B4:LOCATE19,14:PRINT;B4:S4=A4ANDB4:LOCATE25,14:PRINT;S4
790 LOCATE 8,17:PRINT"Gostou do resultado                      [S]im [N]ao [F]im"
800 W$=INKEY$:IFW$=""THEN800
810 IFW$="S"THEN590
820 IFW$="N"THEN670
830 IFW$="F"THEN360ELSE800
840 CLS:LOCATE5,1:PRINT"Tabela da Verdade da Porta OR"
850 LOCATE 0,4:PRINT"Voce devera indicar as duas             variaveis loficas. A e B"
860 LOCATE 10,7:PRINT"A    OR   B     S"
870 LOCATE13,12:PRINT""
880 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A1:LOCATE9,11:PRINT;A1
890 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B1:LOCATE19,11:PRINT;B1:S1=A1ORB1:LOCATE25,11:PRINT;S1
900 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"In de Dados ";A2:LOCATE 9,12:PRINT;A2
910 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B2:LOCATE19,12:PRINT;B2:S2=A2ORB2:LOCATE25,12:PRINT;S2
920 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"In de Dados ";A3:LOCATE 9,13:PRINT;A3
930 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B3:LOCATE19,13:PRINT;B3:S3=A3ORB3:LOCATE25,13:PRINT;S3
940 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"In de Dados ";A4:LOCATE 9,14:PRINT;A4
950 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B4:LOCATE19,14:PRINT;B4:S4=A4ORB4:LOCATE25,14:PRINT;S4
960 LOCATE 8,17:PRINT"Gostou do resultado                      [S]im [N]ao [F]im"
970 W$=INKEY$:IFW$=""THEN970
980 IFW$="S"THEN590
990 IFW$="N"THEN840
1000 IFW$="F"THEN360ELSE970
1010 CLS:LOCATE5,1:PRINT"Tabela da Verdade da Porta NOR"
1020 LOCATE 0,4:PRINT"Voce devera indicar as duas             variaveis loficas. A e B"
1030 LOCATE 10,7:PRINT"A   NOR   B     S"
1040 LOCATE13,12:PRINT""
1050 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A1:LOCATE9,11:PRINT;A1
1060 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B1:LOCATE19,11:PRINT;B1:GOSUB1130:LOCATE25,11:PRINT;S1
1070 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A2:LOCATE9,12:PRINT;A2
1080 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B2:LOCATE19,12:PRINT;B2:GOSUB1130:LOCATE25,12:PRINT;S2
1090 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A3:LOCATE9,13:PRINT;A3
1100 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B3:LOCATE19,13:PRINT;B3:GOSUB1130:LOCATE25,13:PRINT;S3
1110 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A4:LOCATE9,14:PRINT;A4
1120 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B4:LOCATE19,14:PRINT;B4:GOSUB1130:LOCATE25,14:PRINT;S4:GOSUB 1300
1130 IFA1=0ANDB1=0THENS1=1
1140 IFA1=0ANDB1=1THENS1=0
1150 IFA1=1ANDB1=0THENS1=0
1160 IFA1=1ANDB1=1THENS1=0
1170 IFA2=0ANDB2=0THENS2=1
1180 IFA2=0ANDB2=1THENS2=0
1190 IFA2=1ANDB2=0THENS2=0
1200 IFA2=1ANDB2=1THENS2=0
1210 IFA3=0ANDB3=0THENS3=1
1220 IFA3=0ANDB3=1THENS3=0
1230 IFA3=1ANDB3=0THENS3=0
1240 IFA3=1ANDB3=1THENS3=0
1250 IFA4=0ANDB4=0THENS4=1
1260 IFA4=0ANDB4=1THENS4=0
1270 IFA4=1ANDB4=0THENS4=0
1280 IFA4=1ANDB4=1THENS4=0
1290 RETURN
1300 LOCATE 8,17:PRINT"Gostou do resultado                      [S]im [N]ao [F]im"
1310 W$=INKEY$:IFW$=""THEN1310
1320 IFW$="S"THEN590
1330 IFW$="N"THEN1010
1340 IFW$="F"THEN360ELSE1310
1350 CLS:LOCATE5,1:PRINT"Tabela da Verdade da Porta NAND"
1360 LOCATE 0,4:PRINT"Voce devera indicar as duas             variaveis loficas. A e B"
1370 LOCATE 10,7:PRINT"A   NOR   B     S"
1380 LOCATE13,12:PRINT""
1390 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A1:LOCATE9,11:PRINT;A1
1400 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B1:LOCATE19,11:PRINT;B1:GOSUB1470:LOCATE25,11:PRINT;S1
1410 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A2:LOCATE9,12:PRINT;A2
1420 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B2:LOCATE19,12:PRINT;B2:GOSUB1470:LOCATE25,12:PRINT;S2
1430 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A3:LOCATE9,13:PRINT;A3
1440 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B3:LOCATE19,13:PRINT;B3:GOSUB1470:LOCATE25,13:PRINT;S2
1450 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A4:LOCATE9,14:PRINT;A4
1460 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B4:LOCATE19,14:PRINT;B4:GOSUB1470:LOCATE25,14:PRINT;S2
1470 IFA1=0ANDB1=0THENS1=1
1480 IFA1=0ANDB1=1THENS1=1
1490 IFA1=1ANDB1=0THENS1=1
1500 IFA1=1ANDB1=1THENS1=0
1510 IFA2=0ANDB2=0THENS2=1
1520 IFA2=0ANDB2=1THENS2=1
1530 IFA2=1ANDB2=0THENS2=1
1540 IFA2=1ANDB2=1THENS2=0
1550 IFA3=0ANDB3=0THENS3=1
1560 IFA3=0ANDB3=1THENS3=1
1570 IFA3=1ANDB3=0THENS3=1
1580 IFA3=1ANDB3=1THENS3=0
1590 IFA4=0ANDB4=0THENS4=1
1600 IFA4=0ANDB4=1THENS4=1
1610 IFA4=1ANDB4=0THENS4=1
1620 IFA4=1ANDB4=1THENS4=0
1630 RETURN
1640 LOCATE 8,17:PRINT"Gostou do resultado                      [S]im [N]ao [F]im"
1650 W$=INKEY$:IFW$=""THEN1650
1660 IFW$="S"THEN590
1670 IFW$="N"THEN1350
1680 IFW$="F"THEN360ELSE1650
1690 CLS:LOCATE5,1:PRINT"Tabela da Verdade da Porta OR-EX"
1700 LOCATE 0,4:PRINT"Voce devera indicar as duas             variaveis loficas. A e B"
1710 LOCATE 10,7:PRINT"A  OR-EX  B     S"
1720 LOCATE13,12:PRINT""
1730 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A1:LOCATE9,11:PRINT;A1
1740 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B1:LOCATE19,11:PRINT;B1:S1=A1XORB1:LOCATE25,11:PRINT;S1
1750 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A2:LOCATE9,12:PRINT;A2
1760 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B2:LOCATE19,12:PRINT;B2:S2=A2XORB2:LOCATE25,12:PRINT;S2
1770 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A3:LOCATE9,13:PRINT;A3
1780 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B3:LOCATE19,13:PRINT;B3:S3=A3XORB3:LOCATE25,13:PRINT;S3
1790 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";A4:LOCATE9,14:PRINT;A4
1800 LOCATE8,17:PRINTSTRING$(20," "):LOCATE8,17:INPUT"IN de Dados ";B4:LOCATE19,14:PRINT;B4:S4=A4XORB4:LOCATE25,14:PRINT;S4
1810 LOCATE 8,17:PRINT"Gostou do resultado                      [S]im [N]ao [F]im"
1820 W$=INKEY$:IFW$=""THEN1820
1830 IFW$="S"THEN590
1840 IFW$="N"THEN1690
1850 IFW$="F"THEN360ELSE1820
1940 CLS:LOCATE5,11:PRINT"Este programa calcula a frequencia de um filtro ressonante LC":FORT=1TO2500:NEXT:ONERRORGOTO 5480
1950 CLS:COLOR 1,3:LOCATE 5,2:PRINT "Calculo de Frequencias"
1960 PRINT:PRINT"Qual o valor de L";:INPUTL:PRINT:PRINT;"L =";L;"mH";
1970 PRINT:PRINT:PRINT;"Qual o valor de C ";:INPUTC:PRINT:PRINT;"C =";C;"F"
1980 LETF=1/(6.283*SQR(L*C)):PRINTTAB(44);"A frequencia central ";CHR$(234);":":PRINTTAB(44);"F=";F;;"Hz":PRINTTAB(122);"Novos Calculos << Sim ou Nao >>";
1990 G$=INKEY$:IFG$=""THEN1990
2000 IFG$="S"THEN1950
2010 IFG$="N"THEN360ELSE1990
2020 CLS:LOCATE4,11:PRINT"Este programa calcula  a resistenciaequivalente de uma associacao  em  serieou paralelo":FORS=1TO3000:NEXT:ONERRORGOTO5480
2030 COLOR1,11:CLS:LOCATE5,1:PRINT"Resistencia Equivalente"
2040 RX=0:RS=0:PRINTTAB(43);"Qual o numero de resistores";:INPUTX:PRINTTAB(5);"Total=";X;"resistores":FORM=1TOX:PRINTTAB(4);"Qual o valor de R";M;:INPUTA(M)
2050 PRINTTAB(5);"r=";A(M);"":NEXTM:PRINTTAB(44);"Calcular em [S]erie ou [P]aralelo":PRINT
5480 END
Única

Ataque Atômico

Artigo Original: MSX Micro, Digitação: Wilson Pilon

Sua cidade está sob pesado ataque de mísseis atômicos do espaço exterior. Sua única chance (e da cidade também) de sobreviver é conseguir derrubar os mísseis, antes que atinjam a cidade. Para isso, você deverá usar as teclas do cursor ou do joystick 1, para direcionar suas baterias de laser e a barra de espaço ou botão de tiro, para atirar. Se você conseguir derrubar todos os mísseis em um único nível, ganhará um bônus e passará para o nível seguinte. Boa sorte!


Referência de Listagem

ListagemArquivo
Listagem Únicaataque.bas

Listagem

  
10 REM *** Missel Ataque ***
30 KEYOFF:DEFINTA-Z:COLOR14,1,1
40 OPEN"grp:"FOROUTPUTAS#1
50 HI=1000
60 DIMQ(50),W(50),DR(50),K(50)
70 GOSUB1810:REM Instrucoes
80 SC=0:N=6:HT=0:AH=0:YM=2:PM=3
90 GOSUB120:REM Draw Screen
100 GOSUB300
110 GOSUB460:REM Game
120 SCREEN2,0
130 FORI=0TO255
140 H=INT(RND(1)*10)+10
150 LINE(I,159)-(I,159-H),4
160 NEXTI
170 RESTORE220
180 B$=""
190 FORI=1TO8:READA$:A=VAL("&b"+A$):B$=B$+CHR$(A):NEXTI
200 SPRITE$(0)=B$
210 RETURN
220 DATA 00001000
230 DATA 00001000
240 DATA 00001000
250 DATA 01110111
260 DATA 00001000
270 DATA 00001000
280 DATA 00001000
290 DATA 00000000
300 P=RND(-TIME)
310 LINE(120,139)-(137,149),1,BF
320 DRAW"c3bm123,149e5f5l10"
330 REM paint(128,146),3
340 BL=N+5
350 FORI=1TOBL:R=(I*4)+16:PRESET(R,162):PRINT#1,CHR$(217):NEXT
360 FORI=1TON:K(I)=1:Q(I)=INT(RND(1)*235)+12:W(I)=0:PSET(Q(I),W(I)),11:G=INT(RND(1)*2):IFG=0THENDR(I)=1:NEXTELSEDR(1)=-1:NEXT
370 X=128:Y=80
380 PUTSPRITE0,(X,Y),14,0
390 COLOR12
400 DRAW"bm12,182":PRINT#1,"Score=";SC
410 COLOR11
420 DRAW"bm120,182":PRINT#1,"High=";HI
430 RN=0
440 RETURN
450 REM Start Game
460 ONSTRIGGOSUB1070,1070
470 STRIG(C)ON
480 ONINTERVAL=5GOSUB570
490 INTERVALON
500 REM Main Loop
510 RG=INT(RND(1)*50)
520 IFRG<2ANDRE=0THENGOSUB780
530 IFRE=1THENGOSUB810
540 IFRE=0THENGOSUB930
550 GOTO510
560 REM Move Cross
570 S=STICK(C)
580 IFS=0THENRETURN
590 IFS=1THENY=Y-PM:GOSUB690:GOTO670
600 IFS=2THENX=X+PM:Y=Y-PM:GOSUB690:GOSUB710:GOTO670
610 IFS=3THENX=X+PM:GOSUB710:GOTO670
620 IFS=4THENX=X+PM:Y=Y+PM:GOSUB710:GOSUB730:GOTO670
630 IFS=5THENY=Y+PM:GOSUB730:GOTO670
640 IFS=6THENX=X-PM:Y=Y+PM:GOSUB750:GOSUB730:GOTO670
650 IFS=7THENX=X-PM:GOSUB750:GOTO670
660 IFS=8THENX=X-PM:Y=Y-PM:GOSUB750:GOSUB690
670 PUTSPRITE0,(X,Y),14,0
680 RETURN
690 IFY<0THENY=0
700 RETURN
710 IFX>246THENX=246
720 RETURN
730 IFY>120THENY=120
740 RETURN
750 IFX<10THENX=10
760 RETURN
770 REM Rogue Set Up
780 RN=RN+1:IFRN>4THENRETURN
790 RE=1:RM=PM+2:RX=INT(RND(1)*200)+27:RY=0:PSET(RX,RY),12:RETURN
800 REM Move Rogue
810 BEEP:RY=RY+RM:IFRY>138THENGOSUB860
820 RD=INT(RND(1)*2):IFRD=0ANDRX>12THENRX=RX-1ELSEIFRX<250THENRX=RX+1
830 IFRE=1THENPSET(RX,RY),12
840 RETURN
850 REM Rogue Hit City
860 GOSUB1410:FORI=1TO10:CIRCLE(RX,RY),I,INT(RND(1)*14)+2:NEXTI
870 RE=0:HT=HT+1
880 FORI=1TO10:CIRCLE(RX,RY),I,1:NEXT
890 BEEP
900 IFAG=1ANDAH=NTHENGOTO1460
910 RETURN
920 REM Move Missel
930 A=INT(RND(1)*N)+1
940 IFK(A)=0THENGOTO930
950 IFX<13ORX>253THENGOTO980
960 Z=INT(RND(1)*10)
970 IFZ<1THENDR(A)=DR(A)*-1
980 V=Q(A):Z=W(A)
990 W(A)=W(A)+YM
1000 IFW(A)>138THENGOTO1300:REM Hit City
1010 IFK(A)=0THENRETURN
1020 Q(A)=Q(A)+DR(A)
1030 IFQ(A)<12ORQ(A)>254THENDR(A)=DR(A)*-1
1040 LINE(V,Z)-(Q(A),W(A)),11
1050 RETURN
1060 REM Fire
1070 IFBL=0THENPLAY"m50v15t255o7s8f":RETURN
1080 G=X:H=Y
1090 PLAY"s14m1000f"
1100 LINE(128,143)-(G+4,H+3),13
1110 FORI=1TO7:CIRCLE(G+4,H+3),I,9:NEXTI
1120 IFRE=1ANDPOINT(RX,RY)=9THENRE=0
1130 FORI=1TON:IFK(I)=0THENGOTO1150
1140 IFPOINT(Q(I),W(I))=9THENGOSUB1230
1150 NEXTI
1160 FORI=1TO7:CIRCLE(G+4,H+3),I,1:NEXT
1170 LINE(128,143)-(G+4,H+3),1
1180 BL=BL-1
1190 J=((BL+1)*4)+16:LINE(J,162)-(J+6,170),1,BF
1200 IFAH=NANDRE=0THENFORI=1TO50:NEXT:GOTO1460
1210 RETURN
1220 REM Hit Missel
1230 K(I)=0:SC=SC+N:AH=AH+1:IFAH=NTHENAG=1
1240 LINE(60,182)-(119,190),1,BF
1250 INTERVALOFF
1260 DRAW"bm60,182":PRINT#1,SC
1270 INTERVALON
1280 RETURN
1290 REM Hit City
1300 K(A)=0
1310 GOSUB1410
1320 FORI=1TO10:CIRCLE(Q(A),W(A)),I,6:NEXTI
1330 HT=HT+1
1340 AH=AH+1
1350 FORI=1TO10:CIRCLE(Q(A),W(A)),I,1:NEXTI
1360 FORI=1TO500:NEXT
1370 BEEP
1380 IFAH=NTHENGOTO1460
1390 RETURN
1400 REM Explosion Sound
1410 SOUND0,0:SOUND1,5:SOUND2,0:SOUND3,13:SOUND4,255:SOUND5,15:SOUND6,30:SOUND7,0:SOUND8,16:SOUND9,16:SOUND10,16:SOUND1,0:SOUND12,5:SOUND13,0
1420 FORI=0TO30:NEXT
1430 SOUND12,56:SOUND13,0
1440 RETURN
1450 REM Finished Level
1460 STRIG(C)OFF:INTERVALOFF
1470 PUTSPRITE0,(X,Y),0,0
1480 LINE(0,0)-(255,139),1,BF
1490 LINE(60,182)-(119,190),1,BF
1500 COLOR3
1510 DRAW"bm60,30":PRINT#1,"Hit on City=";HT
1520 IFHT>4THENGOTO1650
1530 COLOR9
1540 DRAW"bm80,50":PRINT#1,"Bonus=";(N+10)+(BL*20)
1550 SC=SC+(N*10)+(BL*20)
1560 COLOR13
1570 DRAW"bm80,65":PRINT#1,"Score=";SC
1580 PLAY"l6t255s0m10000eecccecccffedr6r6ffeedr6r6ggffeeddcr6r6r6","l6t255v12o5cegecegeceo4bo5do4ao5cecceo4bo5do4ao5ceco4ao5co4bo5dcegec"
1590 FORI=1TO8000:NEXT
1600 N=N+1:AH=0:AG=0
1610 IFN/3=INT(N/3)THENYM=YM+1:PM=PM+1
1620 LINE(0,0)-(255,139),1,BF
1630 GOTO100
1640 REM Dead
1650 GOSUB1410:FORI=1TO30:CIRCLE(128,145),I,INT(RND(1)*14)+2:NEXTI
1660 FORI=1TO30:CIRCLE(128,145),I,1:NEXT
1670 BEEP
1680 COLOR6
1690 DRAW"bm75,50":PRINT#1,"Game Over"
1700 DRAW"bm80,65":PRINT#1,"Score=";SC
1710 IFSC>HITHENCOLOR7:DRAW"bm60,75":PRINT#1,"A new high score!":HI=SC
1720 LINE(160,183)-(250,190),1,BF
1730 DRAW"bm160,182":PRINT#1,HI
1740 PLAY"t220v15o5c2c4o4a#8a8o5c4f4e4c8c4c4c4o4a8a#8o5c4f4e4c4c4f4a8g8fac4d4d8cd4o4g4g4a4a#4o5c4o4a4f.."
1750 COLOR10
1760 DRAW"bm20,100":PRINT#1,"Press SPACE or FIRE to start"
1770 IFSTRIG(0)THENC=0:GOTO80
1780 IFSTRIG(1)THENC=1:GOTO80
1790 GOTO1770
1800 REM Instrucoes
1810 SCREEN0,,0:WIDTH40
1820 FORI=22TO0STEP-1
1830 LOCATE10,I:PRINTCHR$(175);"Missile Attack";CHR$(174)
1840 LOCATE10,I+1:PRINT"                  "
1850 NEXT I
1860 LOCATE1,3
1870 PRINT"Your city is being attacked  by";
1880 PRINT" aliens,who are dropping missles on";
1890 PRINT" it. You mustuse your laser to dest";
1900 PRINT"roy the missiles."
1910 PRINT:PRINT" Use the cursor keys or  joystick to";
1920 PRINT" po-sition the  sights  and then  press ";
1930 PRINT" thespace bar or fire button to";
1940 PRINT" shoot."
1950 PRINT:PRINT" You have a limited amount of lasers";
1960 PRINT" andit only takes five hits to ";
1970 PRINT" destroy  thecity."
1980 PRINT:PRINT" Beware of rogue missels. These are";
1990 PRINT" veryfast. A siren warns of falling";
2000 PRINT"rogues."
2010 LOCATE3,21:PRINT"Press SPACE or FIRE to play"
2020 IFSTRIG(0)THENC=0:GOTO2050
2030 IFSTRIG(1)THENC=1:GOTO2050
2040 GOTO2020
2050 PLAY"t250s9m10000o4c3f8g8a4a4g4a#4a4c4o3a#4o4a8f8g3o3a#4a4o3e4f."
2060 RETURN
Única

Renew

Artigo Orignal: MSX Micro, Digitação: Wilson Pilon

Todo programador BASIC já deve estar "careca" de saber que o comando NEW "apaga" qualquer programa que estiver na memória do micro. E, também, que deve tomar muito cuidado com o uso dele, pois o trabalho que dá redigitar um programa muito grande é "dose para leão". Tudo bem, mas e daí? Bom, daí, que já¡ que os inventores do BASIC MSX não se preocuparam com esse problema o jeito é se virar. Portanto, mãos à obra.

Vamos começar vendo alguns conceitos sobre o BASIC MSX:

1 - Como é armazenado internamente na memória RAM um programa BASIC?

Resposta: Cada linha do programa é armazenada da seguinte forma:

EB| EA| NB| NA| Conteúdo da Linha| MFL

onde:

  • EB → byte menos significativo do endereço da próxima linha.
  • EA → byte mais significativo do endereço da próxima linha.
  • NB → byte menos significativo do número da linha.
  • NA → byte mais significativos do número da linha.
  • MFL → Marca de fim de linha (= 0)

Para que o interpretador BASIC saiba onde termina o programa, os bytes EB e EA a seguir da última linha do programa estão zerados, ou seja, não apontam para linha alguma. E, ainda, o primeiro byte EB de um programa aparece sempre na posição &H8001. Tomemos como exemplo o seguinte programa:

10 INPUT "NOME";A$
20 PRINT LEN(A$) : STOP

  • Verifique que temos apenas um branco entre o INPUT e a " e um único branco entre o PRINT e o LEN e outros dois entre o : STOP

Vejamos como ele fica distribuído na memória:

11 80 0A 00 85 20 22 4E 4F 4D 45 22 3B 41 24 00
I, II
III
IV b " N O M E " ; A $ V
  1. endereço &H8001
  2. endereço da próxima linha &H8011
  3. número da linha (&H0A = 10)
  4. token do INPUT
  5. mfl
22 80 14 00 91 20 FF 92 28 41 24 29 20 3A 20 90 00
I,II
III
IV b V ( A $ ) b : b VI
  1. endereço &H8011
  2. endereço da próxima linha &H8022
  3. número da linha (&H14 = 20)
  4. token do PRINT
  5. token do LEN
  6. token do STOP
00 00
I II
  1. endereço &H8022
  2. Fim do programa

2 - Aonde o interpretador BASIC mantém guardado as informações sobre a distribuição da memória RAM?

Resposta: Do endereço &HF380 até &HFFFF estão guardados diversos valores de variáveis do sistema MSX. Citaremos apenas as que nos interessam no momento:

Variável Endereço Bytes Conteúdo
BOTTON &HFC48 2 Endereço inicial da memória RAM a
partir da qual o BASIC irá armazenar o
programa (default = &H8001)
VARTAB &HF6C2 2 Endereço inicial da área de variáveis do
BASIC
ARYTAB &HF6C4 2 Endereço inicial da área de matrizes
STREND &HF6C6 2 Endereço final da área de variáveis do
BASIC
FILTAB &HF860 2 Endereço inicial da área reservada para
operações de entrada/saída que usam
arquivos. Os comandos PRINT# e
INPUT# usam esta área
HIMEM &HFC4A 2 Endereço final da memória RAM
disponível para o BASIC

3 - O que contém essas variáveis do sistema quando não há programas BASIC na memória?

Resposta: A área de memória onde estaria o programa BASIC fica assim:

0000
III
  1. endereço &H8022
  2. Fim do programa
ou seja, contém a marca de final de programa. Além disso, as variáveis do sistema contém o seguinte:
Variável Conteúdo
VARTAB &H8003
ARYTAB &H8003
STREND &H8003
FILTAB &HF16A
HIMEM &HF380

4 - O que contém essas variáveis do sistema quando o program descrito anteriormente está presente na memória?

Resposta: As variáveis VARTAB, ARYTAB e STREN passam a conter o endereço &H8024 que é exatamente a localização do byte seguinte ao do último byte EA do programa, que é zero. As variáveis FILTAB e HIMEM não se alteram.

5 - O que faz o comando NEW?

Resposta: O comando NEW não apaga propriamente o programa da memória. Ele apenas engana o interpretador BASIC, rinicializando as variáveis VARTAB, ARYTAB e STREND com o valor &H8003 e zerando o conteúdo dos endereços &H8001 e &H8002, de forma que todo o resto do programa continua na memória. Para constatar este fato, basta que façamos o seguinte:

PRINT HEX$(PEEK(&H8003))

O que produzirá no vídeo a resposta "A" que era o que continha a posição &H8003 antes do NEW.


A Solução

O que fazer então para recuperar o programa que foi "apagado"? Muito simples. Basta restaurar o conteúdo das variáveis VARTAB, ARYTAB e STREND e recolocar os bytes que apontam para a 2ª linha nos endereços &H8001 e &H8002.

No caso do programa anterior bastaria fazer:

POKE &HF6C2,&H24 : POKE &HF6C3,&H80 : POKE &HF6C4,&H24 : POKE &HF6C5,&H80 : POKE &HF6C6,&H24 : POKE &HF6C7,&H80 : POKE &H8001,&H11 : POKE &H8002,&H80

Digite LIST e ... Pronto! O programa voltou são e salvo.

Existe porém, um pequeno problema. A solução dada acima é boa quando o programa é pequeno e podemos destrinchá-lo byte a byte no papel. Isso, porém, não ocorre em 99,999% dos casos, isto é, essa ainda não é a solução definitiva.

Já que não podemos escrever um programa BASIC para recuperar outro, pois dois programas não podem caber simultaneamente na mesma área de memória, o jeito é fazer tudo em linguagem de máquina, ou seja, usando os códigos do Z-80.

A lógica desse programa deverá ser a seguinte:

1º - Procurar o endereço da 2ª linha que fica após a primeira MFL e carregá-lo nos endereços &H8001 e &H8002.

2º - Procurar o endereço do 1º byte após o fim do programa (lembre-se que o que identifica o finao do programa é uma sequência de 3 bytes 00) e carregá-lo nas variáveis VARTAB, ARYTAB e STREND.

E, finalmente, temos o programa que chamaremos de RENEW.



10        Reservar área de memória para o programa RENEW.
20-50    Carregar os códigos de RENEW na área reservada.
60        Definir o ponto de entrada para a execução do RENEW.
80        Códigos do RENEW no formato hexadecimal.

Primeiramente, salve o programa (listagem 1) na fita K7 para evitar possíveis problemas, ok? Já rodou o programa? Muito bem. Agora vamos vê-lo funcionar. Ok, agora vamos "apagá-lo" com o NEW. Comande LIST de novo e veja que dessa vez nada aparece. Agora vamos recuperar o programa de carregamento. Comande PRINT USR(0). Comande LIST de novo e... TCHAN, TCHAN, TCHAN, TCHAN... eis o programa de volta como num passe de mágica! Ótimo, não?

Por último, alguns alertas importantes:

  1. Se, por acaso, você usar algum programa BASIC que chame outro em linguagem de máquina, tenha cuidado de carregar seus códigos em outra área de memória que não aquela que foi usada pelo RENEW, ou então, você não poderá usá-lo sob pena de, possivelmente, causar um "crash" no sistema.
  2. Para facilitar a ativação do RENEW, você poderá programar uma das teclas de função com o "PRINT USR(0)" e poderá recuperar seu programa com uma simples apertar de tecla.
  3. Como o programa RENEW se localiza numa área de memória RAM volátil, toda vez que desligarmos o equipamento, causando um "reset" no micro, teremos que recarregar o programa do carregamento de fita K7 e rodá-lo novamente.

Referências Bibliográficos

  1. Piazzi/Maldonado/Oliveira: Aprofundando-se no MSX
  2. Sato, Tosniyuki/Mapstone, Paul/Muriel, Isabella: The complete MSX programmers guide, Ed.Melbourne House Publishers
  3. Baker, Toni: Mastering machine code on your ZX81, Ed.Prentice-Hal
(NT) O programa apresentado tem uma certa instabilidade além de não ser compatível com muitas configurações, muito por conta do endereçamento. Ao invés de tentar corrigir, achei mais interessante colocar o link do programa RENEW criado pelo Eduardo Barbosa e melhorado pelo Adriano Cunha

Referência de Listagem

ListagemArquivo
Listagem BASICrenew.bas
Listagem Assemblyrenew.asm

Listagem

10 CLEAR 255,&HF350
20 FOR I=0 TO 32
30 READ B$
40 POKE &HF350+I,VAL("&h"+B$)
50 NEXT I
60 DEFUSR=&HF350
70 END
80 DATA af
90 DATA 01,ff,ff
100 DATA 21,05,80
110 DATA ed,b1
120 DATA 22,01,80
130 DATA ed,b1
140 DATA be
150 DATA 20,fb
160 DATA 23
170 DATA 0b
180 DATA be
190 DATA 20,f6
200 DATA 23
210 DATA 22,c2,f6
220 DATA 22,c4,f6
230 DATA 22,c6,f6
240 DATA c9
Basic

Listagem

	.org 0EE80h - 7		;cabeçalho BLOAD
	db 0FEh
	dw inicio
	dw fim
	dw inicio
	
inicio:	xor a			;Zera acumulador (a <- MLF)
	ld bc,0FFFFh		;BC <- contador de bytes sem funcao especifica
	ld hl,08005h		;HL aponta para o primeiro TOKEN do programa
	cpir			;Compara byte a byte ate achar a MFL
	ld (08001h),hl		;Carrega em BOTTOM o endereco do 1. byte apos a MFL
va:	cpir			;Compara byte a byte ate achar a MFL seguinte
	cp (hl)			;Compara o byte seguinte a MFL (EB) para ver se e zero
	jr nz,va		;Se nao for, repete a busca pois ha mais linhas
	inc hl			;Incrementa o apontador do programa
	dec bc			;Decrementa o contador BC
	cp (hl)			;Compare o byte seguinte ao EB(EA) para ver se e zero
	jr nz,va		;Se nao for, repete a busca pois ha mais linhas
	inc hl			;HL aponta para o 1. byte apos o fim do programa
	ld (0F6C2h),hl		;Carrega o apontador em VARTAB
	ld (0F6C4h),hl		;Carrega o apontador em ARYTAB
	ld (0F6C6h),hl		;Carrega o apontador em STREND
	ret			;Volta ao BASIC
fim:	.end
Assembly

Games

Shark Hunter

Nota 4

Lute com mestres especialistas em campos específicos da arte do Kung Fu que atacam o nosso herói Lee usando bastões, fogo, correntes, estrelas mortais, etc.. Além dos duelos em que só haverá um único sobrevivente (que espera-se seja você), nosso herói deverá passar por diversos estágios nos quais enfrentará obstáculos como vasos, tijolos, tamancos atirados contra Lee.

Você também conhecerá o nome de seus oponentes que são Wang, Tao, Chen, Lang e Wu e, se não for ferido nenhuma vez receberá um bônus de 5000 pontos. Os gráficos, como é tradição da linha MSX, são excelentes eo som também é muito bom, apesar de que na segunda versão estes dois itens encontram seu auge. Este é mais um daqueles games que se recomenda aos aficcionados para terem em casa, sendo interessante, no entanto, a realização de uma pequena pesquisa, pois, já existem no país versões de alguns outros jogos como Yie-Ar Kung Fu II, Faixa Preta (J. Chan) e Kung Fu Master.

Dica: Para eliminar seus oponentes mantenha uma distância curta, mas, quanto ao Sr.Wu (o último mestre) mantenha-se distante e somente dê golpes aéreos (joystick para cima, com o botão sendo pressionado duas vezes).


Track & Filed II

Nota 4

O comedor insaciável de fichas dos fliperamas, agora na tela de sua televisão em uma versão especial de quatro andares, tendo como atração o caça-bônus, já que não oferece níqueis, mas, bonificações.

O objetivo deste jogo é fazer o máximo de pontos com uma única bola, escolhendo-se o nível de dificuldade, e ocasionando um aumento de velocidade. É um game inteligente e ativo, principalmente para os que querem jogar no nível "PRO" com a possibilidade de escolha do número de jogadores.

Em termos de gráficos, Rollerball é um dos melhores do gênero com ótimo acompanhamento sonoro, além de ser mais daqueles que não podem faltar na sua coleção.


Referência de Listagem

ListagemArquivo
Shark Hunteryear1.bas
Track & Field IIroller.bas

Nenhum comentário:

Postar um comentário