Monitor Assembler
O monitor é uma adaptação do programa “Disassembler” publicado no “Aprofundando-se no MSX”.
Teste o programa no WebMSX – The Online MSX Emulator
Agora, além de disassemblar a memória pode-se manipula-la de uma forma mais eficiente e poderosa.
Os novos comandos do monitor são:
D XXXX: lista o conteúdo da memória em hexadecimal a partir do endereço XXXX. O valor XXXX é um número em decimal (para entrá-lo em HEX, use &H). A listagem prossegue pressionando-se qualquer tecla. ESC aborta.
M XXXX: edita os bytes da memória a partir de XXXX. A tecla RETURN avança um byte. BS retorna e ESC aborta. Para alterar o byte corrente, entre um número em HEX (00 a FF).
L XXXX: lista o conteúdo da memória a partir de XXXX em mnemônicos Z80 (disassembler). ESC aborta.
Fonte: Livro Programação Avançada em MSX
Editora: Aleph
Ano: 1986
Autor: Milton Maldonado Jr.
Digitação: Renato Faria Lopes
Código fonte
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 |
1000 CLS:PRINT "Monitor MSX 1986":PRINT"Milton Maldonado Jr." 1010 PRINT:LINE INPUT ">";A$:IF LEN(A$)=0 THEN 1010 1020 C$=MID$(A$,1,1):IF C$="L" THEN 1130 ELSE IF C$="D" THEN 1030 ELSE IF C$="M" THEN 1060 ELSE BEEP:PRINT "?";:GOTO 1010 1030 E=VAL(MID$(A$,2)) 1040 FOR J=1 TO 8:PRINT RIGHT$("0000"+HEX$(E),4);" ";:FOR I=0 TO 7:PRINT RIGHT$("00"+HEX$(PEEK(I+E)),2);" ";:NEXT I:PRINT:E=E+8:NEXT J 1050 I$=INPUT$(1):IF I$=CHR$(27) THEN 1010 ELSE PRINT:GOTO 1040 1060 E=VAL(MID$(A$,2)) 1070 PRINT:PRINT RIGHT$("0000"+HEX$(E),4);" ";RIGHT$("00"+HEX$(PEEK(E)),2);" "; 1080 H$="":FOR I=1 TO 2 1090 I$=INPUT$(1):IF I=1 THEN IF I$=CHR$(13) THEN E=E+1:GOTO 1070 ELSE IF I$=CHR$(8) THEN E=E-1:GOTO 1070 1100 IF I$=CHR$(27) THEN PRINT:GOTO 1010 1110 IF I$>="0" AND I$<="9" OR I$>="A" AND I$<="F" THEN 1120 ELSE 1090 1120 H$=H$+I$:PRINT I$;:NEXT I:POKE E,VAL("&H"+H$):E=E+1:GOTO 1070 1130 E=VAL(MID$(A$,2)) 1140 RESTORE:FOR I=0 TO 7:READ A$(I),B$(I):NEXT I:FOR I=0 TO 3:READ C$(I),E$(I):NEXT I:FOR I=0 TO 7:READ D$(I),F$(I):NEXT I:READ G$(0),G$(1),G$(2),H$(0),H$(1),H$(2),I$(0),I$(1),J$(0),J$(1) 1150 FOR K=1 TO 20:C=PEEK(E) 1160 PRINT HEX$(E);:PRINT " ";:GOSUB 1190:IF F>0 THEN I=I+1 1170 PRINT TAB(22);:FOR X=0 TO I-1:I$=HEX$(PEEK(X+E)):IF LEN(I$)<2 THEN I$="0"+I$ 1180 PRINT I$;" ";:NEXT X:PRINT:E=E+I:NEXT K:PRINT:I$=INPUT$(1):IF I$=CHR$(27) THEN 1010 ELSE 1150 1190 '-------------------------------- SEPARA GRUPOS -------------------------------------- 1200 F=0:IF C=221 THEN F=1 ELSE IF C=253 THEN F=2 1210 C$(2)="HL":IF F=1 THEN C$(2)="IX" ELSE IF F=2 THEN C$(2)="IY" 1220 IF C=203 THEN 1740 ELSE IF C=237 THEN 1800 1230 IF F>0 AND PEEK(E+1)=203 THEN 1740 1240 IF F>0 THEN C=PEEK(E+1) 1250 '-------------------------------- COMANDOS DIRETOS -------------------------------------- 1260 E$(2)=C$(2) 1270 I=1:IF C=39 THEN PRINT "DAA";ELSE IF C=47 THEN PRINT "CPL";ELSE IF C=249 THEN PRINT "LD SP,";C$(2);ELSE IF C=227 THEN PRINT "EX (SP),";C$(2);ELSE IF C=118 THEN PRINT "HALT";ELSE IF C=201 THEN PRINT "RET";ELSE IF C=31 THEN PRINT "RRA";ELSE 1290 1280 RETURN 1290 IF C=235 THEN PRINT "EX DE,HL";ELSE IF C=8 THEN PRINT "EX AF,AF'";ELSE IF C=217 THEN PRINT "EEX";ELSE IF C=233 THEN PRINT "JP (";C$(2);")";ELSE IF C=0 THEN PRINT "NOP";ELSE IF C=243 THEN PRINT "DI";ELSE IF C=251 THEN PRINT "EI";ELSE 1310 1300 RETURN 1310 IF C=7 THEN PRINT "RLCA";ELSE IF C=15 THEN PRINT "RRCA";ELSE IF C=23 THEN PRINT "RLA";ELSE IF C=55 THEN PRINT "SCF";ELSE IF C=63 THEN PRINT "CCF";ELSE 1330 1320 RETURN 1330 I=2:IF C=211 THEN PRINT "OUT (";:GOSUB 1610:PRINT "),A";ELSE IF C=219 THEN PRINT "IN A,(";:GOSUB 1610:PRINT")";ELSE 1350 1340 RETURN 1350 IF C=195 THEN PRINT "JP ";ELSE IF C=205 THEN PRINT "CALL ";ELSE 1380 1360 PRINT MID$(HEX$(PEEK (E+1)+256*PEEK(E+2)),1,6)+"H";:I=3:RETURN 1370 RETURN 1380 IF C=16 THEN PRINT "DJNZ ";ELSE IF C=24 THEN PRINT "JR ";ELSE 1410 1390 X=PEEK(E+1):IF X<128 THEN Y=E+X+2 ELSE Y=E+X-254 1400 PRINT MID$(HEX$(Y),1,5);:I=2:RETURN 1410 IF C>127 AND C<192 THEN X=C\8-16:Y=C MOD 8:PRINT A$(X);:IF X=0 OR X=1 OR X=3 THEN PRINT " A,";ELSE PRINT " ";ELSE 1430 1420 PRINT B$(Y);:I=1:RETURN 1430 IF C\64>0 THEN 1570 1440 IF C=34 THEN E=E+SGN(F):PRINT "LD (";:GOSUB 1360:PRINT "),";C$(2);:ELSE IF C=43 THEN E=E+SGN(F):PRINT "LD ";C$(2);",(";:GOSUB 1360:PRINT ")";:ELSE 1460 1450 E=E-SGN(F):RETURN 1460 IF C=50 THEN PRINT "LD (";:GOSUB 1360:PRINT "),A";ELSE IF C=58 THEN PRINT "LD A,(";:GOSUB 1360:PRINT ")";:RETURN ELSE 1480 1470 I=3:RETURN 1480 X=C MOD 8:IF X=4 THEN PRINT"INC";ELSE IF X=5 THEN PRINT"DEC";ELSE 1500 1490 Y=C\8:PRINT" ";B$(Y);:I=1:RETURN 1500 X=C MOD 16:IF X=3 THEN PRINT"INC ";ELSE IF X=11 THEN PRINT"DEC ";ELSE IF X=9 THEN PRINT "ADD ";C$(2);",";ELSE 1520 1510 X=C\16:PRINTC$(X);:I=1:RETURN 1520 IF C MOD 8=6 AND F=0 THEN PRINT "LD ";B$(C\8);",";:GOTO 1610 1530 IF C MOD 16=1 THEN E=E+SGN(F):PRINT"LD ";C$(C\16);",";:GOSUB 1360 ELSE 1550 1540 E=E-SGN(F):RETURN 1550 IF C MOD 16=2 THEN PRINT "LD (";C$(C\16);"),A";ELSE IF C MOD 16=10 THEN PRINT "LD A,(";C$(C\16);")";ELSE 1570 1560 I=1:RETURN 1570 IF C\32=1 AND C MOD 8=0 THEN PRINT "JR ";D$(C\8-4);",";:GOTO 1390 1580 IF C\64<>3 THEN 1680 1590 IF C MOD 8<>6 THEN 1620 1600 I=2:X=C\8-24:PRINTA$(X);" ";:IF X<2 OR X=3 THEN PRINT"A,"; 1610 PRINT MID$(HEX$(PEEK(E+1)),1,4);:RETURN 1620 X=C MOD 8:IF X=1 THEN PRINT "POP ";E$(C\16-12);ELSE IF X=5 THEN PRINT "PUSH ";E$(C\16-12); 1630 IF X=1 OR X=5 THEN I=1:RETURN 1640 IF X=7 THEN PRINT"RST ";HEX$(C-199);"H";:I=1:RETURN 1650 IF X=0 THEN PRINT "RET ";D$(C\8-24);:I=1:RETURN 1660 IF X=2 THEN PRINT "JP ";ELSE PRINT "CALL "; 1670 PRINT D$(C\8-24);",";:GOTO 1360 1680 IF F=0 AND C\64=1 THEN X=(C-64)\8:PRINT "LD ";B$(X);:X=(C-64) MOD 8:PRINT",";B$(X);:I=1:RETURN 1690 I=2:C=PEEK(E+1):IF F>0 AND C MOD 8=6 AND C>63 THEN PRINT "LD ";B$(C\8-8);",(";C$(2);"+";:E=E+1:GOSUB 1610:PRINT ")"; ELSE 1710 1700 E=E-1:RETUN 1710 IF C\8=14 THEN E=E+1:PRINT "LD (";C$(2);"+";:GOSUB 1610:PRINT "),";B$(C-112; ELSE 1730 1720 GOTO 1700 1730 I=3:IF C=54 THEN PRINT "LD (";C$(2);"+";:E=E+1:GOSUB 1610:PRINT "),";:E=E+1:GOSUB 1610:E=E-1:GOTO 1720 ELSE 1960 1740 '-------------------------------- COMANDOS APOS CBH -------------------------------------- 1750 Z=1:IF F>0 THEN Z=3 1760 I=2:C=PEEK(E+Z):IF C<64 AND F=0 THEN PRINT F$(C\8);" ";B$(C MOD 8);:RETURN 1770 I=3:IF C<64 AND F>0 AND (C-6) MOD 8=0 THEN PRINT F$(C\8);" (";C$(2);"+";:E=E+1:GOSUB 1610:PRINT")";:E=E-1:RETURN 1780 C=PEEK(E+Z):IF F=0 THEN PRINTG$(C\64-1);" ";CHR$(48+(C\8) MOD 8);",";B$(C MOD 8);:I=2:RETURN 1790 IF (C-6) MOD 8=0 THEN PRINTG$(C\64-1);" ";CHR$(48+(C\8) MOD 8);",(";C$(2);"+";:E=E+1:GOSUB 1610:PRINT")";:E=E-1:RETURN ELSE 1960 1800 '-------------------------------- COMANDOS APOS EDH -------------------------------------- 1810 I=2:C=PEEK(E+1):IF C<64 OR C=221 OR C=253 THEN 1960 ELSE IF C>187 THEN 1920 1820 IF C=70 THEN PRINT "IM 0";ELSE IF C=86 THEN PRINT "IM 1";ELSE IF C=94 THEN PRINT "IM 2";ELSE IF C=77 THEN PRINT "RETI";ELSE IF C=69 THEN PRINT "RETN";ELSE IF C=103 THEN PRINT "RRD";ELSE IF C=111 THEN PRINT "RLD";ELSE 1840 1830 RETURN 1840 IF C=71 THEN PRINT "LD I,A";ELSE IF C=79 THEN PRINT "LD R,A";ELSE IF C=87 THEN PRINT "LD A,I";ELSE IF C=95 THEN PRINT "LD A,R";ELSE 1860 1850 RETURN 1860 H$(3)="OUT":IF C>175 THEN H$(3)="OUT" 1870 IF C>159 AND C MOD 8<4 THEN PRINTH$(C MOD 4);I$((C MOD 16)\8);J$((C-160)\16);:RETURN 1880 IF C\64>1 THEN 1960 ELSE IF C MOD 8>1 THEN 1920 1890 IF C=112 OR C=113 THEN 1960 1900 IF C MOD 8=0 THEN PRINT "IN ";B$(C\8-8);",(C)";ELSE PRINT "OUT (C),";B$(C\8-8); 1910 RETURN 1920 X=C MOD 16:Y=C\16-4:IF X=10 THEN PRINT"ADC HL,";C$(Y);ELSE IF X=2 THEN PRINT "SBC HL,";C$(Y);ELSE 1940 1930 RETURN 1940 IF X=3 THEN PRINT "LD (";:E=E+1:GOSUB 1360:E=E-1:PRINT "),";C$(C\16-4);ELSE IF X=11 THEN PRINT "LD ";C$(C\16-4);",(";:E=E+1:GOSUB 1360:E=E-1:PRINT")";ELSE 1960 1950 I=4:RETURN 1960 PRINT "Z80 ?";:RETURN 1970 '-------------------------------- DADOS DA MATRIZ ALFA -------------------------------------- 1980 DATA ADD,B,ADC,C,SUB,D,SBC,E,AND,H,XOR,L,OR,(HL),CP,A 1990 DATA BC,BC,DE,DE,HL,HL,SP,AF 2000 DATA NZ,RLC,Z,RRC,NC,RL,C,RR,PO,SLA,PE,SRA,P,SLI,M,SRL 2010 DATA BIT,RES,SET 2020 DATA LD,CP,IN,I,D, ,R |