> 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 - 10 | translate this page

> Página Cero | Basic ROM | Kernal ROM
> VIC II | SID | CIA

> A = Acumulador | X = Registro X | Y = 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.
> DATS | LDA 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.
> PRG | JSR 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.
> COM | 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.
> DATS | LDA 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 |
> EFECT | LDA 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.
> CAMB | LDA 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
> Po r fermhg y _PaCo_, canal #c64 del irc-hispano

> * = $1000 |  | ; SYS 4096.
> TECLA | JSR $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.
> BUCLE | CMP 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.
> IRQ | LDA $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.
> FIN | JMP $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
> Po r 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.
> NEGRO | LDA #$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.
> BLANCO | LDA #$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)
> Po r 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.
> BUCLE2 | STY $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.
> BUCLE1 | STA $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.
> INI | SEI | ; Prohibe las interrupciones IRQ, necesario para evitar que la CPU se centre en "otras cosas".
> BUCLE | LDA $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.
> PRG | LDA #$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.