Esta entrada en el blog es para reflejar los libros de referencia que estoy usando y para que sean más fáciles de encontrar.
En el caso de la CPU Z80, estos libros me han sido de gran ayuda:
Ordenadores de 8 bits. Software y desarrollo para ordenadores de 8 Bits ZX Spectrum y Commodore 64.
10 FOR N= 0 TO 7
20 FOR M = 1 TO 3
30 PAPER N : PRINT “ “
40 NEXT M
50 NEXT N
60 GOTO 10
10 CLS
20 PRINT AT 0,0;"Pulsa q para terminar"
30 LET M$="MARQUESINA"
40 LET C=1
50 FOR I=31 TO 0 STEP -1
60 PRINT AT 20,I;M$(1 TO C)
70 IF C<LEN (M$) THEN LET C=c+1
80 IF (31-i)>=LEN (m$) THEN PRINT AT 20,i+LEN (m$);" "
90 GO SUB 170
100 NEXT I
110 FOR i=1 TO LEN (m$) STEP 1
120 PRINT AT 20,0;m$(i TO LEN (m$))
130 PRINT AT 20,LEN (m$)-i;" "
140 GO SUB 170
150 NEXT i
160 GO TO 40
170 LET i$=INKEY$
180 IF i$="q" THEN STOP
190 RETURN
IF r$(x)="0" AND X<8 THEN PLOT OVER 1;(px-8)+(x-1),py+4: GO TO 390
IF r$(x)="1" AND X<8 THEN PLOT INVERSE 0; FLASH f; BRIGHT bold; FLASH f; INK co;(px-8)+(x-1),py+4: GO TO 390
IF R$(X)="0" AND X=8 THEN PLOT INVERSE 1; INK co; BRIGHT bold; FLASH f;(px-8)+(x-1),py+4: GO TO 390
IF R$(X)="1" AND X=8 THEN PLOT INVERSE 0; INK co; BRIGHT bold; FLASH f;(px-8)+(x-1),py+4
DEF FN x(x)=x*8
DEF FN y(y)=ABS ((y*8)-168)
10 CLS : LET lx=0: LET ly=0: LET hy=0: LET hx=0
20 DEF FN x(x)=x*8
30 DEF FN y(y)=ABS ((y*8)-168)
40 INPUT "Entra coor. Y :";ly
50 INPUT "Entra coor. X :";lx
60 IF lx<0 OR lx>31 OR ly<0 OR ly>21 THEN PRINT AT 2,2;"Val. no val. 0>X<32. 0>Y<22": GO TO 40
70 PRINT AT 2,2;" ": PRINT AT 2,2;"Lo X: ";lx
80 PRINT AT 3,2;" ": PRINT AT 3,2;"Lo Y: ";ly
90 LET hx=FN x(lx): LET hy=FN y(ly)
100 PRINT AT 4,2;" ": PRINT AT 4,2;"Hi X: ";hx
110 PRINT AT 5,2;" ": PRINT AT 5,2;"Hi Y: ";hy
120 INPUT "Pintar X ?";z$
130 IF z$="s" THEN GO SUB 200
140 INPUT "salir ? s/n ";z$
150 IF z$="s" THEN GO TO 180
160 PRINT AT 2,2;" "
170 GO TO 10
180 STOP
190 RETURN
200 FOR a=0 TO 7
210 PLOT hx+a,hy+a
220 PLOT hx+a,(hy+7)-a
230 NEXT a
240 RETURN
LET f=0
IF z>128 THEN LET f=1: LET z=z-128
LET b=0
IF z>64 THEN LET b=1: LET z=z-64
LET p=INT (z/8)
LET co=z-(p*8)
PRINT FLASH f; INK co; BRIGHT b; PAPER p;z$
10 REM Localizacion de UDG por coordenadas x,yHay varias cosas que tener en cuenta:
20 REM igual que el SCREEN$(y,x) pero funciona con UDG
30 REM vamos a cargar el UDG 149 (f)
40 FOR i=0 TO 7
50 POKE USR "f"+i,255
60 NEXT i
70 PRINT AT 7,13;CHR$ 149
80 REM le damos las coordenadas y res nos devuelve el UDG
90 LET x=13: LET y=7
100 GO SUB 260
110 PRINT AT 0,0;"El UDG es el ";res
120 GO TO 310
130 LET res=udg
140 LET vY=y*8
150 LET vX=x
160 FOR S=0 TO 7
170 LET iY=vY+S
180 LET BLOCK=INT (iY/64)
190 LET CROW=INT (iY/8)
200 LET YR=iY-(CROW*8)
210 LET CROW=CROW-(BLOCK*8)
220 LET ADD=16384+BLOCK*2048+CROW*32+YR*256
230 IF (PEEK ((USR (CHR$ udg))+s))<>(PEEK (add+vX)) THEN LET res=0: RETURN
240 NEXT S
250 RETURN
260 FOR i=144 TO 164
270 LET udg=i
280 GO SUB 130
290 IF res>=144 THEN RETURN
300 NEXT i
310 STOP
270 REM *El Ovni en Binario
280 DATA BIN 00000111,BIN 11100000
290 DATA BIN 00001000,BIN 00010000
300 DATA BIN 00010000,BIN 00001000
310 DATA BIN 00100011,BIN 11000100
320 DATA BIN 01000011,BIN 11000010
330 DATA BIN 10000000,BIN 00000001
340 DATA BIN 10000000,BIN 00000001
350 DATA BIN 11111111,BIN 11111111
360 DATA BIN 11111111,BIN 11111111
370 DATA BIN 11111111,BIN 11111111
380 DATA BIN 10000000,BIN 00000001
339 DATA BIN 01000011,BIN 11000010
400 DATA BIN 00100011,BIN 11000100
410 DATA BIN 00010000,BIN 00001000
420 DATA BIN 00001000,BIN 00010000
430 DATA BIN 00000111,BIN 11100000
160 REM *Cargamos nuestro srpite 16x16¡Ya los tenemos listos para usar !.
170 RESTORE 280
180 FOR I=0 TO 7
190 READ A: READ B
200 POKE USR "A"+I,A: POKE USR "B"+I,B
210 NEXT I
220 FOR I=0 TO 7
230 READ A: READ B
240 POKE USR "C"+I,A: POKE USR "D"+I,B
250 NEXT I
120 REM *Esta es nuestra rutina de dibujo
130 PRINT AT (PY),(PX+1);CHR$ 32:
PRINT AT (PY+1),(Px+1);CHR$ 32:
PRINT AT POSY,POSX+1;CHR$ 145:
PRINT AT (POSY+1),(POSX+1);CHR$ 147:
PRINT AT PY,PX;CHR$ 32:
PRINT AT (PY+1),(PX);CHR$ 32:
PRINT AT POSY,POSX;CHR$ 144:
PRINT AT (POSY+1),POSX;CHR$ 146
140 LET PX=POSX: LET pY=POSY
150 RETURN
10 REM *Jugando a los Sprites 2*
15 CLS
20 LET POSX=1
30 LET POSY=1
40 LET PX=1
50 LET PY=1
60 GO SUB 160
70 GO SUB 130
80 INPUT "Vamos a moverlo o salir (q/Q)";z$
90 IF z$="q" OR z$="Q" THEN GO TO 440
100 FOR I=0 TO 10:
LET POSX=POSX+1:
GO SUB 120:
NEXT I
110 GO TO 440
120 REM *Esta es nuestra rutina de dibujo
130 PRINT AT (PY),(PX+1);CHR$ 32:
PRINT AT (PY+1),(Px+1);CHR$ 32:
PRINT AT POSY,POSX+1;CHR$ 145:
PRINT AT (POSY+1),(POSX+1);CHR$ 147:
PRINT AT PY,PX;CHR$ 32:
PRINT AT (PY+1),(PX);CHR$ 32:
PRINT AT POSY,POSX;CHR$ 144:
PRINT AT (POSY+1),POSX;CHR$ 146
140 LET PX=POSX: LET pY=POSY
150 RETURN
160 REM *Cargamos nuestro srpite 16x16
170 RESTORE 280
180 FOR I=0 TO 7
190 READ A: READ B
200 POKE USR "A"+I,A: POKE USR "B"+I,B
210 NEXT I
220 FOR I=0 TO 7
230 READ A: READ B
240 POKE USR "C"+I,A: POKE USR "D"+I,B
250 NEXT I
260 RETURN
270 REM *El Ovni en Binario
280 DATA BIN 00000111,BIN 11100000
290 DATA BIN 00001000,BIN 00010000
300 DATA BIN 00010000,BIN 00001000
310 DATA BIN 00100011,BIN 11000100
320 DATA BIN 01000011,BIN 11000010
330 DATA BIN 10000000,BIN 00000001
340 DATA BIN 10000000,BIN 00000001
350 DATA BIN 11111111,BIN 11111111
360 DATA BIN 11111111,BIN 11111111
370 DATA BIN 11111111,BIN 11111111
380 DATA BIN 10000000,BIN 00000001
390 DATA BIN 01000011,BIN 11000010
400 DATA BIN 00100011,BIN 11000100
410 DATA BIN 00010000,BIN 00001000
420 DATA BIN 00001000,BIN 00010000
430 DATA BIN 00000111,BIN 11100000
440 REM *Final del programa
1020 REM *Datos del sprite 16x16 en decimal(4 cuadriculas de 8)
1030 DATA 7,224,7,224,8,16,19,200
1040 DATA 35,196,64,2,159,249,255,255
1050 DATA 255,255,159,249,64,2,35,196
1060 DATA 19,200,8,16,7,224,7,224
490 REM * Para calcular los valores del POKE
500 FOR Y=0 TO 175
510 LET BLOCK=INT (Y/64)
520 LET CROW=INT (Y/8)
530 LET YR=Y-(CROW*8)
540 LET CROW=CROW-(BLOCK*8)
550 LET ADD=(16384+(BLOCK*2048))+(CROW*32)+(YR*256)
560 LET A(Y+1)=ADD
570 NEXT Y
1080 REM *Datos de los POKE calcualdos, 176 valores posibles*
1090 DATA 16384,16640,16896,17152,17408,17664,17920,18176,16416,16672,16928,17184,17440,17696
1100 DATA .................
370 PRINT AT 19,1;"Con bucle"
380 FOR I=0 TO 15
390 POKE A(I+(POSY))+(POSX),0: POKE A(I+(POSY))+(POSX)+1,0
400 NEXT I
410 LET PV=POSY+DVER
420 LET PH=POSX+DHOZ
430 FOR I=0 TO 15
440 READ L: READ R
450 POKE A(I+(PV))+(PH),L
460 POKE A(I+(PV))+((PH)+1),R
470 NEXT I
READ LAsí, del 0 al 15.
READ R
POKE A(0+(PV))+(PH),L: POKE A(0+(PV))+((PH)+1),R
READ L
READ R
POKE A(1+(PV))+(PH),L: POKE A(1+(PV))+((PH)+1),R
1000 DATA BIN 00011000
1010 DATA BIN 00011000
1020 DATA BIN 00100100
1030 DATA BIN 01011010
1040 DATA BIN 00100100
1070 DATA BIN 00011000
1080 DATA BIN 00011000
1090 DATA BIN 00000000
10 REM *Usando UDG de 1 caracter (8x8)
20 CLS : PRINT "Dos relojes": PRINT : RESTORE 1000
30 FOR I=0 TO 7
40 READ B
50 POKE USR "A"+I,B
60 NEXT I
70 PRINT CHR$ 144;" "; INK 3; FLASH 1;CHR$ 144; INK 8
80 INPUT "Pulsa para terminar";z$: GO TO 9000
1000 DATA BIN 00011000
1010 DATA BIN 00011000
1020 DATA BIN 00100100
1030 DATA BIN 01011010
1040 DATA BIN 00100100
1070 DATA BIN 00011000
1080 DATA BIN 00011000
1090 DATA BIN 00000000
9000 FLASH 0: PRINT AT 19,1;"Termine"
LET a = IN 61438
1 REM * Programa de dibujo *
5 CLS
10 REM *Posicion inicial en pantalla *
15 LET x=0: LET y=80
17 PRINT AT 19,1;"Pulsa Q para salir"
20 GO SUB 1000: REM * nos vamos a leer el puerto del mando 1*
30 IF disp=1 THEN PLOT x,y
40 GO TO 20
1000 IF INKEY$="Q" OR INKEY$="q" THEN GO TO 2000
1005 LET a=IN 61438
1010 IF a>127 THEN LET a=a-128
1020 IF a>63 THEN LET a=a-64
1030 IF a>31 THEN LET a=a-32
1040 IF a>15 THEN LET a=a-16: IF x<255 THEN LET x=x+1
1050 IF a>7 THEN LET a=a-8: IF x>0 THEN LET x=x-1
1060 IF a>3 THEN LET a=a-4: IF y<175 THEN LET y=y+1
1070 IF a>1 THEN LET a=a-2: IF y<>0 THEN LET y=y-1
1080 LET disp=a
1090 RETURN
2000 CLS : PRINT AT 1,1;"Bye"