Página 2

Página 1 - Página 2 - Página 3 - Página 4 - Página 5 - Página 6

 6a - 6b - 7a - 7b - 7c - 7d - 8 - 9a - 9b - 9c - 9d - 9e - 10translate this page  

 

Página Cero

Basic ROM Kernal ROM
VIC II SID CIA
A = AcumuladorX = Registro XY = Registro Y

Nº 6a.- Cambiar colores en una línea de la pantalla
Por Wanja Gayk en GO64! Magazine

* = $1000 ; SYS 4096.
 LDX #$00; Carga X con #$00, que será utilizado como código de color y como valor inicial de un bucle.
 STX $D020; Guarda el valor #$00 en la dirección $D020, que corresponde al borde de la pantalla.
 STX $D021; Guarda el valor #$00 en la dirección $D021, que corresponde al fondo de la pantalla.
DATSLDA CLRS,X; Carga A con el valor de la posición CLRS y siguientes #40.
 STA $D800,X; Guarda los valores de A en la dirección $D800 y siguientes #40 posiciones, que corresponde a los primeros #40 caracteres del mapa de colores de la pantalla.
 INX; Incrementa el valor de X.
 CPX #$28; Compara el valor de X con #$28, que es el final de la línea.
 BNE DATS; Salta a DATS hasta que el valor de X=#$28.
 RTS; Retorna al BASIC.
CLRS.BYTE $06,$04,$0E,$0A,$03,$0F,$0D,$07; Colores.
 .BYTE $01,$01,$07,$0D,$0F,$03,$0A,$0E 
 .BYTE $04,$06,$0B,$0C,$0F,$01,$0F,$0C 
 .BYTE $0B,$09,$02,$08,$0A,$0F,$07,$01 
 .BYTE $01,$0D,$03.$05,$0C,$0B,$0C,$0F 

Para entender más: Código de colores, escribir un texto cualquiera en la primera línea de la pantalla y pulsar SHIFT + RETURN, luego, más abajo, hacer el SYS 4096.
Para aprender más: Cambia los colores. Realiza este mismo programa en otras líneas de la pantalla (recuerda que cada línea tiene #40 caracteres).

Una segunda aplicación del anterior programa consiste en:

Nº 6b.- Cambiar colores en una línea de Pantalla con efecto
Por Wanja Gayk en GO64! Magazine

* = $1000 ; SYS 4096.
PRGJSR COM; Salta a la subrutina COM, que cambia los colores de las letras de la primera fila de la pantalla.
 JSR EFECT; Salta a la subrutina EFECT, que cambia el color rodándose de derecha a izquierda.
 JMP PRG; Salta a PRG, lo que realiza un bucle cerrado.
COMLDX #$00; Carga X con #$00, que será utilizado como código de color y como valor inicial de un bucle.
 STX $D020; Guarda el valor #$00 en la dirección $D020, que corresponde al borde de la pantalla.
 STX $D021; Guarda el valor #$00 en la dirección $D021, que corresponde al fondo de la pantalla.
DATSLDA CLRS,X; Carga A con el valor de la posición CLRS y siguientes #40.
 STA $D800,X; Guarda los valores de A en la dirección $D800 y siguientes #40 posiciones, que corresponde a los primeros #40 caracteres del mapa de colores de la pantalla.
 INX; Incrementa el valor de X.
 CPX #$28; Compara el valor de X con #$28, que es el final de la línea.
 BNE DATS; Salta a DATS hasta que el valor de X=#$28.
 RTS; Retorno de subrutina.
CLRS.BYTE $06,$04,$0E,$0A,$03,$0F,$0D,$07; Colores
 .BYTE $01,$01,$07,$0D,$0F,$03,$0A,$0E 
 .BYTE $04,$06,$0B,$0C,$0F,$01,$0F,$0C 
 .BYTE $0B,$09,$02,$08,$0A,$0F,$07,$01 
 .BYTE $01,$0D,$03,$05,$0C,$0B,$0C,$0F 
EFECTLDA CLRS; Carga A con el valor de la posición CLRS.
 PHA; Guarda en la pila el contenido de A.
 LDX #$00; Carga X con #$00, que es el valor inicial de un bucle.
CAMBLDA CLRS+1,X; Carga A con el valor de la posición CLRS+1 y siguientes.
 STA CLRS,X; Guarda el código de dicho valor en la posición CLRS y siguientes. Esto va cambiando los colores de derecha a izquierda.
 INX; Incrementa el valor de X.
 CPX #$27; Compara el valor de X con #$27, que es el final de la línea.
 BNE CAMB; Salta a CAMB hasta que el valor de X=#$27.
 PLA; Extrae el valor guardado antes en la pila y lo vuelve a dejar en A. Recordemos que este valor era el que correspondía a CLRS.
 STA CLRS + 39; Guarda el código de dicho valor en MAS-1, es decir, al final de la lista de colores.
 RTS; Retorno de subrutina.

Para entender más: Código de colores, escribir un texto cualquiera en la primera línea de la pantalla y pulsar SHIFT + RETURN, luego, más abajo, hacer el SYS 4096.
Para aprender más: Cambia los colores. Realiza este mismo programa en otras líneas de la pantalla (recuerda que cada línea tiene #40 caracteres).


Nº 7a.- Pulsar teclas de función
Por fermhg y _PaCo_, canal #c64 del irc-hispano

* = $1000 ; SYS 4096.
 TECLAJSR $FFE4; Salta a la subrutina en ROM $FFE4, que carga A con el valor de una tecla al ser pulsada.
 BEQ TECLA; Si es igual a #$00, es decir, si aún no se ha pulsado ninguna tecla, salta a TECLA.
 LDX #$00; Carga X con #$00, que es el valor inicial de un bucle.
BUCLECMP COMPI,X; Compara el valor de la tecla pulsada con el valor situado en la posición COMPI y siguientes.
 BEQ COLOR; Si coincide con alguna de las teclas de función, salta a COLOR.
 INX; Incrementa el valor de X.
 CPX #$08; Compara el valor de X con #$08, que lee el dato referido a F8, última de las teclas de función.
 BNE BUCLE; Salta a BUCLE hasta que X sea igual a alguno de los códigos de las teclas de función.
 JMP TECLA; Salta a TECLA, al detectar que la tecla pulsada no corresponde a las teclas de función.

; Si la tecla pulsada es una de las teclas de función entonces, la pantalla tomará el color equivalente al valor de X.

COLOR    STX $D020; Guarda el valor de X en la posición $D020, que corresponde al borde de la pantalla.
 STX $D021; Guarda el valor de X en la posición $D021, que corresponde al fondo de la pantalla.
 JMP TECLA; Salta a TECLA, pero esta vez para volver a tocar otra tecla de función.
COMPI.BYTE 133,137,134,138; Código de las teclas de función.
 .BYTE 135,139,136,140 

Para entender más: Código de Caracteres ASCII
Para aprender más: Al igual que las teclas de función, puedes utilizar el código ascii de otros caracteres.

Una segunda aplicación del anterior programa consiste en:

Nº 7b.- Cambiar colores al pulsar una tecla
Por Blackspawn en http://www.lemon64.com/forum/

* = $1000 ; SYS 4096.
 SEI; Prohibe las interrupciones IRQ, necesario para evitar que la CPU se centre en "otras cosas".
 LDA #<IRQ; Carga A con el byte bajo de la posición de la rutina IRQ.
 STA $0314; Guarda el valor de A en la dirección $0314.
 LDA #>IRQ; Carga A con el byte alto de la posición de la rutina IRQ.
 STA $0315; Guarda el valor de A en la dirección $0315.
 CLI; Permite las interrupciones IRQ.
 RTS; Retorna al BASIC.
IRQLDA $CB; Carga A con el código del carácter situado en la dirección $CB.
 CMP #$40; Compara el valor de A con #$40.
 BEQ FIN; Si es así va a FIN.
 INC $D020; Incrementa el valor de la dirección $D020, que corresponde al borde de la pantalla. Este incremento, junto con un bucle, produce un efecto de colores.
FINJMP $EA31; Salta a la subrutina en ROM $EA31, que se encarga de realizar las interrupciones.

Para entender más: Gracias a las interrupciones IRQ podemos asignar acciones al teclado que en BASIC no son posibles.
Para aprender más: ¿Serías capaz de conseguir, gracias a las interrupciones IRQ que, en vez de cambiar el color del borde, produjeras un sonido al pulsar una tecla? Para ello consulta el programa Nº 5 de esta sección.

Una tercera aplicación del anterior programa consiste en:

Nº 7c.- Cambiar colores del borde al pulsar las teclas F1 y F3
Por fermhg, canal #c64 del irc-hispano

* = $1000 ; SYS 4096.
INICIO LDA $C5; Carga A con el valor situado en la dirección $C5, que es la encargada de recoger el código de la tecla pulsada.
 CMP #$04; Compara el valor de A con #$04, que es la tecla F1.
 BEQ NEGRO; Si es F1 salta a NEGRO.
 CMP #$05; Compara el valor de A con #$05, que es la tecla F3.
 BEQ BLANCO; Si es F3 salta a BLANCO.
 JMP INICIO; Si no se ha pulsado ni F1 ni F3, salta a INICIO, esperando a que sean pulsadas una de esas dos teclas.
NEGROLDA #$00; Carga A con #$00, que es el código del color negro.
 STA $D020; Guarda el valor #$00 en la dirección $D020, que corresponde al borde de la pantalla.
 JMP INICIO; Salta a INICIO, esperando a que nuevamente sean pulsadas una de esas dos teclas.
BLANCOLDA #$01; Carga A con #$01, que es el código del color blanco.
 INC $D020; Guarda el valor #$01 en la dirección $D020.
 JMP INICIO; Salta a INICIO, esperando a que nuevamente sean pulsadas una de esas dos teclas.

Para entender más: Código del Teclado, la dirección $C5 controla la pulsación de la tecla y no controla el carácter de la tecla. La tecla F1 contiene los caracteres de F1 y F2; la tecla 1 contiene los caracteres 1 y !. Pero lo que realmente genera $C5 es el código de la tecla, no de los caracteres.
Para aprender más: Puedes hacer que este programa lea otras teclas. Además puedes asignar un sonido distindo a cada tecla pulsada.

Una cuarta aplicación consiste en:

Nº 7d.- Cambiar colores con el joystick (puerto 1)
Por Andreas Boose en comp.sys.cbm

* = $1000 ; SYS 4096.
 SEI; Prohibe las interrupciones IRQ, necesario para evitar que la CPU se centre en "otras cosas".
 LDY #$7F; Carga Y con #$7F, que en binario es %01111111.
BUCLE2STY $DC00; Guarda el valor de Y en la dirección $DC00, lo que habilita el joystick en el puerto 1.
 LDA $DC01; Carga A con el valor de la dirección $DC01.
 CMP #$EF; Compara el valor de A con #$EF.
 BNE BUCLE1; Salta a BUCLE1 hasta que el valor de A sea #$EF.
 INC $DC00; Incrementa el valor de la direccion de memoria $DC00.
 LDA $DC01; Carga A con el valor de $DC01.
 AND #$10; Efectúa un AND lógico entre A y #$10.
 LSR; Desplaza una vez los bits de A hacia la derecha.
 LSR; Desplaza una vez los bits de A hacia la derecha.
BUCLE1STA $D020; Guarda el valor de A en la dirección $D020, que corresponde al borde de la pantalla.
 JMP BUCLE2; Salta a BUCLE2.

Para entender más: $DC00 - $DC01. Debemos mirar una vez más los programas Nº 1b y Nº 1c para recordar un poco el uso de la CIA 1.
Para aprender más: Puedes hacer que cada posición del joystick imprima un caracter diferente, o que produzca un sonido diferente. Más adelante veremos el uso de los Sprites, una vez visto puedes asignar la dirección del Sprite utilizando el joystick.


Nº 8.- Degradado de color fijo en pantalla (controlando el raster)
Por _PaCo_, canal #c64 del irc-hispano

* = $1000 ; SYS 4096.
INISEI; Prohibe las interrupciones IRQ, necesario para evitar que la CPU se centre en "otras cosas".
BUCLELDA $D012; Carga A con el valor de la dirección $D012, leyendo la posición del raster (0-255). Cuando dicha posición está en 255 significa que ha hecho un barrido completo de pantalla.
 STA $D020; Guarda el valor de A en la dirección $D020, que corresponde al borde de la pantalla.
 NOP; Sincronismo
 NOP; NOP significa no operación, es decir, nada.
 NOP; Es necesario para ajustar el sincronismo del raster.
 NOP 
 NOP 
 JMP BUCLE; Salta a BUCLE, realizando un bucle sin fin.

Para entender más: La manera que tiene el monitor (televisor) de generar los efectos luminosos que dan origen a los caracteres en la pantalla se llama raster (espectro luminoso de arriba a abajo). Éste puede ser controlado desde el Commodore 64 para realizar divisiones, flashes, etc. en la pantalla. La dirección que controla el raster es $D012 más un bit (bit 8) que está el el bit 7 de la dirección $D011.
Para aprender más: Si añades o quitas NOP te darás cuenta de cómo el Commodore 64 necesita retardar el ensamblado con el fin de conseguir efectos como éste.


Nº 9a.- Interrupciones IRQ
Por Wanja Gayk en GO64! Magazine

* = $1000 ; SYS 4096.
 SEI; Prohibe las interrupciones IRQ, necesario para evitar que la CPU se centre en "otras cosas".
 LDA #<PRG; Carga A con el byte bajo de la posición donde empieza el texto.
 STA $0314; Guarda el valor de A en la dirección $0314.
 LDA #>PRG; Carga A con el byte alto de la posición donde empieza el texto.
 STA $0315; Guarda el valor de A en la dirección $0315.
 CLI; Permite las interrupciones IRQ.
 RTS; Retorna al BASIC.
PRGLDA #$08; Carga A con #$08, que corresponde al carácter “H”.
 STA $0400; Guarda el valor #$08 en la posición $0400 del mapa de memoria de pantalla.
 LDA #$0F; Carga A con #$0F, que corresponde al carácter “O”.
 STA $0401; Guarda el valor #$0F en la posición $0401.
 LDA #$0C; Carga A con #$0C, que corresponde al carácter “L”.
 STA $0402; Guarda el valor #$0C en la posición $0402.
 LDA #$01; Carga A con #$01, que corresponde al carácter “A”.
 STA $0403; Guarda el valor #$01en la posición $0403.
 LDA #$21; Carga A con #$21, que corresponde al carácter “!”.
 STA $0404; Guarda el valor #$21 en la posición $0404.
 JMP $EA31; Salta a la subrutina en ROM $EA31, que se encarga de realizar las interrupciones.

Para entender más: Para comprender exactamente lo que realiza este pequeño programa podemos ir a la esquina superior izquierda, donde aparece "HOLA!". Si intentamos eliminar o escribir encima de estas palabras veremos que no podemos.
Para aprender más: Si añades o quitas NOP te darás cuenta de cómo el Commodore 64 necesita retardar el ensamblado con el fin de conseguir efectos como éste.

Una segunda aplicación del anterior programa consiste en:

Nº 9b.- Interrupciones IRQ (2)
Por Wanja Gayk en GO64! Magazine

* = $1000 ; SYS 4096.
 SEI; Prohibe las interrupciones IRQ, necesario para evitar que la CPU se centre en "otras cosas".
 LDA #<INTROU; Carga A con el byte bajo de INTROU.
 STA $0314; Guarda el valor de A en la dirección $0314.
 LDA #>INTROU; Carga A con el byte alto de INTROU.
 STA $0315; Guarda el valor de A en la dirección $0315.
 LDA #$60; Carga A con #$60, que es el valor de la posición de la pantalla.
 STA $D012; Guarda el valor de A en la dirección $D012, que comienza la interrupción en la línea #$60 de la pantalla.
 LDA #$1B; Carga A con #$1B.
 STA $D011; Guarda el valor de A en la dirección $D011, que activa el texto en pantalla y deja el bit 7 en 0.
 LDA #$F1; Carga A con #$F1.
 STA $D01A; Guarda el valor de A en la dirección $D01A, que comienza la interrupción del raster.
 CLI; Permite las interrupciones IRQ.