Ahí va una rutinilla que diseñé hace tiempo y que pertenece a mi pequeña biblioteca de rutinas en ensamblador. La presenté en un concurso de programación del C64 y creo recordar que quedó en la séptima u octava posición. Creo que está bastante bien comentada y fue escrita utilizando el MESS assembler, un paquete de programación en ensamblador que apareció publicado en el especial utilidades de Commodore World (casi pierdo las yemas de los dedos tecleándolo) :shock: .
Se basa en lo que yo llamo DDC "definición dinámica de carácteres" y se me ocurrió para ahorrar carácteres en las animaciones, aunque seguro que ya habría algo parecido por ahí y hasta tendrá su nombre técnico y todo
.
¿Que qué hace? probadla y veréis. La rutina funciona por interrupciones.
[code]00000 ; ***************************
00010 ; * RUTINA CONTADOR POR *
00020 ; * DESLIZAMIENTO DE CIFRAS *
00030 ; * TIPO CUENTAKILOMETROS *
00040 ; ***************************
00050 ;
00060 ;
00070 ; ------------------------
00080 ; *** DEFINE ETIQUETAS ***
00090 ;
00100CARM .DE $3208 ;PRIMERA POSICION DEL CARACTER DECENA DE MILLAR
00110CARO .DE $30D0 ;+#$B0 APUNTA A LA PRIMERA POSICION DEL PATRON DE BITS DEL NUMERO CERO
00120CARC .DE $320F ;ULTIMA POSICION DEL CARACTER DECENA DE MILLAR
00130PVAR .DE $A8 ;PRIMERA POSICION DEL AREA DE VARIABLES
00140TEMP .DE $B1 ;VARIABLE DEL TEMPORIZADOR
00150CCAE .DE $B4 ;VARIABLE DEL NUMERO DE DESLIZAMIENTOS DEL CARACTER
00160NCON .DE $B0 ;VARIABLE DEL NUMERO DE VECES QUE HAY QUE CONTAR
00170 ; -------------------------
00180 ;
00190 .BA $1000 ; ENSAMBLAR EN $1000
00200 .OS ; ENSAMBLA EN LA MEMORIA
00210 ;
00220 PHA ;GUARDA A EN EL STACK
00230 LDA NCON ;COMPRUEBA SI SE DEBE INICIAR
00240 BEQ B00 ;LA CUENTA SI NO SALTA TODA LA RUTINA
00250 DEC TEMP ;DECREMENTA TEMPORIZADOR EN UNO
00260 BNE B00 ;SI NO SE HA LLEGADO A CERO SALTA TODA LA RUTINA
00270 TYA ;SALVA REGISTROS
00280 PHA ;X E Y EN
00290 TXA ;EL STACK
00300 PHA ;
00310 LDX #$20 ;X SUMADO A CARM APUNTA PRIMERA POSICION CARACTER UNIDADES
00320B01 LDY #$07 ;CARGA Y CON NUMERO DE POSICIONES QUE COMPONEN EL CARACTER
00330B02 LDA CARM+1,X ;TOMA DATO UNA POSICION ADELANTADA+X Y
00340 STA CARM,X ;LO ALMACENA EN POSICION ORIGINAL+X
00350 INX ;INCREMENTA X PARA POSICION SIGUIENTE
00360 DEY ;DECREMENTA NUMERO DE POSICIONES QUE COMPONEN EL CARACTER
00370 BNE B02 ;SALTA PARA COMPLETAR TODO EL CARACTER
00380 STX PVAR+6 ;SE GUARDA X PARA USO POSTERIOR
00390 LDX PVAR+7 ;CARGA X CON NUMERO DE CIFRA EN LA QUE SE ESTA TRABAJANDO
00400 LDY PVAR,X ;CARGA Y CON DESPLAZAMIENTO PARA PUNTERO CARO
00410 LDA CARO,Y ;CARGA A CON EL PATRON DE BITS DE LA CIFRA QUE DEBE APARECER POR ABAJO
00420 LDY PVAR ;CARGA Y CON DESPLAZAMIENTO PARA PUNTERO CARC
00430 STA CARC,Y ;ALMACENA PATRON DE BITS EN ULTIMA POSICION DEL CARACTER QUE SE TRABAJA
00440 LDY PVAR,X ;CARGA Y CON DESPLAZAMIENTO PARA PUNTERO CARO PARA COMPARARLO DESPUES
00450 INC PVAR,X ;INCREMENTA DESPLAZAMIENTO PARA QUE CARO APUNTE A PATRON DE BITS SIGUIENTE
00460 BNE B03 ;COMPRUEBA SI EL DESPLAZAMIENTO ES CERO (SE HA LLEGADO A NUMERO NUEVE)
00470 LDA #$B0 ;ENTONCES SE CARGA A CON EL DESPLAZAMIENTO PARA EL NUMERO CERO Y
00480 STA PVAR,X ;SE ALMACENA EN LA POSICION DE LA CIFRA CORRESPONDIENTE
00490B03 CPY #$B8 ;COMPRUEBA SI LA CIFRA QUE APARECE POR ABAJO ES EL CERO
00500 BCS B04 ;SI NO ES ASI SALTA
00510 LDA PVAR ;SI ES ASI SE LE RESTA OCHO AL DESPLAZAMIENTO PARA PUNTERO CARC PARA
00520 SEC ;QUE APUNTE ASI A LA ULTIMA POSICION DEL CARACTER SIGUIENTE
00530 SBC #$08 ;DE ORDEN SUPERIOR (POR EJEMPLO EL CARACTER PARA LAS DECENAS)
00540 STA PVAR ;Y SE GUARDA
00550 LDA PVAR+6 ;SE CARGA A CON EL VALOR DE X ANTES GUARDADO Y SE LE RESTA QUINCE PARA
00560 SBC #$0F ;QUE EL SCROLL HACIA ARRIBA SE HAGA EN EL SIGUIENTE CARACTER DE ORDEN
00570 TAX ;SUPERIOR (DESPLAZAMIENTO PARA CARM) Y SE TRANSFIERE A X
00580 DEC PVAR+7 ;SE SITUA PUNTERO EN LA CIFRA SIGUIENTE DE ORDEN SUPERIOR EN LA QUE SE
00590 BNE B01 ;DEBE TRABAJAR Y SALTA PARA DESLIZAR DICHA CIFRA
00600B04 LDA #$20 ;RESTAURA DESPLAZAMIENTO PARA CARC PARA APUNTAR DE NUEVO A
00610 STA PVAR ;ULTIMA POSICION DEL CARACTER UNIDADES
00620 LDA #$05 ;RESTAURA POSICION DEL CARACTER EN LA QUE SE DEBE TRABAJAR
00630 STA PVAR+7 ;A LA DE UNIDADES
00640 DEC CCAE ;DECREMENTA NUMERO DE DESLIZAMIENTOS DEL CARACTER Y
00650 BNE B05 ;COMPRUEBA SI SE HA DESLIZADO EL CARACTER COMPLETO SI NO ES ASI SALTA
00660 DEC NCON ;SI ES ASI DECREMENTA EL NUMERO DE VECES QUE SE HA DE CONTAR EN UNO
00670 LDA #$08 ;RESTAURA EL NUMERO DE DESLIZAMIENTOS A OCHO (EL CARACTER COMPLETO)
00680 STA CCAE ;
00690B05 LDA #$04 ;RESTAURA EL TEMPORIZADOR
00700 STA TEMP ;
00710 PLA ;RECUPERA TODOS LOS REGISTROS DEL STACK
00720 TAX ;
00730 PLA ;
00740 TAY ;
00750B00 PLA ;
00760 JMP $EA31 ;SALTA A LA RUTINA DE INTERRUPCIONES
RUTINA DE INICIALIZACION DE VARIABLES
=====================================
00000 ; ************************
00010 ; * NICIALIZACION *
00020 ; * DE VARIABLES PARA LA *
00030 ; * RUTINA CONTADOR *
00040 ; ************************
00050 ;
00060 ;
00070 ; ------------------------
00080 ; *** DEFINE ETIQUETAS ***
00090 ;
00100PVAR .DE $A8 ;
00110TEMP .DE $B1 ;
00120CCAE .DE $B4 ;
00130 ; ------------------------
00140 ;
00150 .BA $106A ; ENSAMBLAR EN $106A
00160 .OS ; ENSAMBLA EN LA MEMORIA
00170 ;
00180 SEI ;
00190 LDX #$05 ;
00200 LDA #$B0 ;
00210B00 STA PVAR,X ;
00220 DEX ;
00230 BNE B00 ;
00240 LDA #$04 ;
00250 LDX #$08 ;
00260 LDY #$05 ;
00270 STA TEMP ;
00280 STX CCAE ;
00290 STY PVAR+7 ;
00300 LDA #$20 ;
00310 STA PVAR ;
00320 LDA #$00 ;
00330 STA $0314 ;
00340 LDA #$10 ;
00350 STA $0315 ;
00360 CLI ;
00370 RTS ;
COMO CARGAR Y USAR LA RUTINA
============================
CARGAR PRIMERO "CONTADOR+INICIAL",8,1 Y DESPUES "INICIALIZACION",8. UNA VEZ CARGADOS LOS DOS PROGRAMAS HACER 'RUN', EL C64 QUEDARA UNOS SEGUNDOS COMO PARADO, DESPUES IMPRIMIRA LOS CARACTERES DEL CONTADOR Y PONDRA A CERO EL MISMO.
HACIENDO POKE176,XXX EL CONTADOR EMPEZARA A CONTAR, XXX ES CUALQUIER NUMERO DESDE 1 HASTA 255. PARA PONER A CERO EL CONTADOR HACER SYS4202 Y DESPUES POKE176,1.
[/quote]
La tengo en una imagen de disco .d64 si alguno está interesado se la mando.
¡Por cierto! Raúl, el lunes te enviaré algo visible de la carretera.