Posts etiquetados ‘código máquina’

Bueno, una vez más me he puesto a trastear y a “perder” (¡nunca!) el tiempo mirando en las tripas de los juegos del MSX y esta noche me he entretenido con el Colt 36 de Topo Soft.

Aviso de antemano que este post es una frikada, así que mejor dejar de leer aquí.

Venga, vamos allá… se trata de obtener el código fuente del juego, que está escrito en Basic.

Para ello:

1) Cargar el juego con LOAD”CAS:” y no con RUN”CAS:”, para evitar que se ejecute y tener acceso al cargador.

2) Quitar el “,R” final de los dos últimos BLOAD, de manera que no se ejecuten.

3) Cargar esta pequeña rutina en memoria. Por ejemplo, en &HFFF0 está bien.

ld hl,$83E8 [[21, E8, 83]] ; Origen
ld de,$8000 [[11, 00, 80]] ; Destino
ld bc,$1200 [[01, 00, 12]] ; Cuántos bytes copiar
ldir [[ED, B0]] ; Copiar
ret [[C9]] ; Volver

Se puede hacer con unos pocos pokes: poke &hFFF0, &H21, etc La rutina simplemente mueve los datos al área del Basic.

4) Ejecutar la rutina desde el basic:   DEF USR=&HFFF0: ? USR(0)

5) List 🙂

Para los más impacientes, este es el código fuente Basic (necesita las rutinas de CM, claro):

4 POKE &HFBB1,1
9 GOTO 500
10 Q=PT%/1000:VPOKE6849,Q+156:Q=10*(Q-Q\1):VPOKE6850,Q+156:Q=10*(Q-Q\1):VPOKE6851,Q+156:Q=10*(Q-Q\1):VPOKE6852,Q+156:RETURN
15 FORG%=1TOLEN(A$):VPOKE(HL+G%+6143),ASC(MID$(A$,G%,1))+60:NEXT:RETURN
20 POKE &HD9E2,INT(BC/256):POKE &HD9E1,BC-(INT(BC/256))*256:POKE &HD9E4,INT(DE/256):POKE &HD9E3,DE-(INT(DE/256))*256:POKE &HD9E6,INT(HL/256):POKE &HD9E5,HL-(INT(HL/256))*256:RETURN
30 FORD=0 TO4:PUTSPRITE D,(0,200),8,0:NEXT:HL=&HD600+65536!:BC=32:FOR DE=6144 TO 6656STEP 32:GOSUB 20:D=USR1(0):NEXT
31 IFN%>5THEN32ELSEHL=237:A$=”NIVEL00^”:GOSUB 15:VPOKE 6387,N%+156:PLAY”S1L8M5000O5CDEFF16F16CC16C16F3O4L4″,”S1L8M5000O3CDEFF16F16CC16C16F3O4L4″:GOTO 33
32 PLAY”S1L8M5000O5CDR64EFR64FFR64FER64CER64F2O4F1″,”S1L8M5000O2CDR64EFR64FFR64FER64CER64F2O1F1″:A$=”JUEGO0TERMINADO”:HL=200:GOSUB15:A$=”CALIFICACION0GENERAL^”:HL=261:GOSUB15:FORG=1TO1500:NEXT
33 RESTORE3000:FORG%=1TON%:READ A$:NEXT:HL=329:GOSUB15:N%=N%+10*(N%>10):FORG=1TO1500:NEXT:HL=&HA000+2048*(N%-1)+65536!:DE=&HDA00+65536!:BC=2048:GOSUB20:D=USR2(0):RETURN
300 IF M%=0THENRETURN ELSESOUND 6,210:SOUND 7,220:SOUND12,40:SOUND8,0:SOUND9,0:SOUND10,16:SOUND13,1:PUTSPRITE 3,(X%,52),11,5:PUTSPRITE 4,(X%,52),8,4:FORG=1 TO30:NEXT:PUTSPRITE 4,(X%,52),8,6
303 M%=M%-1:VPOKE6753+(39-M%)\4,0
305 PI%=PEEK(HL+225+X%\8):IF PI%>70 THEN 320
310 PUTSPRITE 3,(0,200),0,8:PUTSPRITE 4,(0,200),0,8:RETURN
320 IF PI%>78 THEN 340
325 POKE HL+225+X%\8,PI%+8:PT%=PT%+PI%-70:GOSUB10:IF PI%>73 THEN PLAY”S1M5000O3C16R30G16″,”S1M5000O3C16R30G16″:GOTO 310
327 PLAY”S1O7B4O4″,”S1O6C4O4″:GOTO310
340 IF PI%<174 OR PI%=255 OR PS%>239THEN 310
350 PT%=PT%+20:GOSUB10:PS%=240:TI%=TI%+1:VPOKE 6743+(TI%-1)/2,0-167*(TI%\2<>TI%/2):VPOKE 6775+(TI%-1)/2,169+(TI%\2<>TI%/2):PLAY”S1M5000O5C16F16A16O6C10O5A”,”S1O3C16F16A16O4C10O3A”:GOTO 310
500 CLEAR200,39824!:COLOR 15,4,1:SCREEN2,2,0:DEFUSR1=&HE300:DEFUSR2=&HE313:DEFUSR3=&H41:DEFUSR4=&H44:DEFUSR5=&H9B91:DEFUSR6=&H9BBB
510 D%=USR3(0):BC=2048:HL=&HC000+65536!:DE=0
520 GOSUB20:D%=USR1(0)
530 DE=2048:GOSUB20:D%=USR1(0)
535 DE=4096:GOSUB 20:D%=USR1(0)
540 HL=&HC800+65536!:DE=8192
550 GOSUB20:D%=USR1(0)
560 DE=10240:GOSUB20:D%=USR1(0)
565 DE=12288:GOSUB 20:D%=USR1(0)
570 DE=14336:HL=&HD800+65536!:BC=256:GOSUB20:D%=USR1(0)
572 D%=USR3(0):BC=768:DE=6144:HL=&HD000+65536!:GOSUB20:D=USR1(0)
575 HL=132:A$=”TOPO0SOFTWARE”:GOSUB 15:HL=718:A$=”00MUSICA^GOMINOLAS”:GOSUB15:D=USR4(0)
580 E%=40:I%=125:BEEP
581 D%=USR5(0)
582 J%=USR6(0):FORH%=1TO35:NEXT
585 S%=STICK(0)ORSTICK(1):E%=E%-2*((S%=2ORS%=3ORS%=4)ANDE%<53)+2*((S%=6ORS%=7ORS%=8)ANDE%>10):I%=I%-2*((S%=4ORS%=5ORS%=6)ANDI%<164)+2*((S%=8ORS%=1ORS%=2)ANDI%>119)
590 D%=3-4*(D%=3):PUTSPRITE0,(31-(31-E%-8)/10,143-(143-I%)/4),5,2:PUTSPRITE1,(E%,I%),15,D%:IF (STRIG(0)ORSTRIG(1))=-1THEN595
592 GOTO 582
595 BEEP:DE=6656:BC=256:HL=&HD300+65536!:GOSUB20:D=USR1(0)
597 N%=1:V%=3:VPOKE6727,156+V%:PT%=0:GOSUB30
599 M%=40:TI%=0
600 HL=&HDA00+65536!+256*N%:BC=512:DE=6144:GOSUB20
605 X%=132:BA%=&HDA00+224:MD%=1:PS%=256
610 S%=STICK(0)ORSTICK(1):HL=HL+32*((S%=1ORS%=2ORS%=8) AND HL>&HDA00+65536!)-32*((S%=5ORS%=4ORS%=6)AND HL<&HE200-512*(4-N%)+512*(N%=4)+65536!)
620 POKE&HD9E6,INT(HL/256):POKE&HD9E5,HL-(INT(HL/256))*256:D=USR1(0)
625 X%=X%-8*((S%=2 ORS%=3ORS%=4)ANDX%<240)+8*((S%=6ORS%=7ORS%=8)ANDX%>0):PUTSPRITE0,(X%,52),15,1:PUTSPRITE1,(X%,52),1,0:PUTSPRITE2,(127,151-5*(BA%>HL+320-65536!)+5*(BA%<HL+124-65536!)),4,2
630 T%=STRIG(0)OR STRIG(1):IFT%=-1 ANDTR%=0 THEN TR%=T:GOSUB300
635 TR%=T%
637 IF PS%<200 OR PS%\8<>PS%/8THEN 650
640 ON (PS%-200)\8 GOTO 690,700,700,740,700,720,760
650 PS%=PS%+1:GOTO 610
690 PLAY”V15O7C16R16C16R16C16R16C16O4″
700 C%=150+20*MD%+((((PS%-200)/2)\4)*4):POKEBA%,C%:POKEBA%+1,C%+1:POKEBA%+32,C%+2:POKEBA%+33,C%+3:GOTO 650
720 POKEBA%,0:POKEBA%+1,0:POKEBA%+32,0:POKEBA%+33,0:GOTO 650
730 PLAY”ACA”:GOTO 610
740 C%=150+20*MD%+16:POKEBA%,C%:POKEBA%+1,C%+1:POKEBA%+32,C%+2:POKEBA%+33,C%+3:GOSUB20:D%=USR1(0)
745 SOUND 6,210:SOUND 7,220:SOUND12,40:SOUND8,0:SOUND9,0:SOUND10,16:SOUND13,1:FORD%=0TO1000:NEXT:IF(BA%+65312!>HL-192)AND(BA%+65312!<HL+192)THEN747
746 FORHL=HLTOBA%+65344!STEP32+64*(BA%+65312!<HL):FORD%=0TO40:NEXT:POKE&HD9E6,INT(HL/256):POKE&HD9E5,HL-(INT(HL/256))*256:D=USR1(0):NEXT
747 FORG=1TO1000:NEXT:V%=V%-1:IF V%=0THENVPOKE6727,156:N%=N%+10:GOSUB30:GOTO 572
749 VPOKE 6727,V%+156:GOSUB30:GOTO600
760 IF TI%=16THEN 2000 ELSEK%=INT(RND(-TIME)*10)*4+&HD900+40*(N%-1):BA%=&HDA00+PEEK(K%+0)*32+PEEK(K%+1):MD%=PEEK(K%+2):PS%=PEEK(K%+3):GOTO 650
2000 N%=N%+1:IF N%=5THENN%=15:GOSUB30:GOTO 572
2005 PLAY”S1L8M5000O5CDR64EFR64FFR64FER64CER64F2O4F1″,”S1L8M5000O2CDR64EFR64FFR64FER64CER64F2O1F1″:FORG=1TO2600:NEXT
2010 GOSUB30:D%=6835+2*N%:VPOKED%,0:VPOKED%+1,0:VPOKED%+32,0:VPOKED%+33,0:A$=”jjjjjjjjjj”:HL=609:GOSUB15:A$=”kkkkkkkk”:HL=599:GOSUB15:A$=”llllllll”:HL=631:GOSUB15:GOTO 599
3000 DATA “000EL0ALMACEN”,”0000EL0CA[ON”,”0000LA0MINA”,”0000EL0SALOON”,””,””,””,””,””,””,”00CHAPUCERO”,”REGULARCILLO”,”000BUENO”,”00MUY0BUENO”,”00SHERIFF__”