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
Por 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
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. 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)
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. 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.