Proyecto Atari-DMD

Para comentar los proyectos de hardware presentados en la web.

Re: Proyecto Atari-DMD

Notapor Poltergeist el Vie Ene 24, 2014 3:26 pm

Muy buena!!! ya hay scroll y se ve perfecto!!!

Felicitaciones!!!
Avatar de Usuario
Poltergeist
expert
expert
 
Mensajes: 1540
Registrado: Lun Jul 14, 2008 11:36 pm

Re: Proyecto Atari-DMD

Notapor WillySoft el Sab Ene 25, 2014 12:56 pm

Nueva versión del driver, ahora con scrolling grueso, combinando las dos rutinas anteriores.

Vamos avanzando de a poco.

Código: Seleccionar todo
   *=$4000

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   rol prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta display,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

inicio
   jsr prepara.font
   jsr init.vbd

inicio.loop0
   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jsr wait
   inc scroll.puntero
   bne inicio.loop2.noinc
   inc scroll.puntero+1
inicio.loop2.noinc
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne inicio.loop1
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne inicio.loop1
   jmp inicio.loop0

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
scroll.puntero
   .byte 0,0
   
   *=$2e0
   .word inicio


Avatar de Usuario
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Proyecto Atari-DMD

Notapor WillySoft el Sab Ene 25, 2014 1:34 pm

Nueva versión. Se supone hace scrolling fino. ZZT, confirma please!!

Código: Seleccionar todo
   *=$4000

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   rol prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   rol prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio
Avatar de Usuario
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Proyecto Atari-DMD

Notapor ZZT el Sab Ene 25, 2014 6:36 pm

Y este es el código del Willy, que se fue al chancho con la velocidad de exploración, y por eso se ve muy ténue. Fácil de arreglar.

Si se fijan bien, las letras se ven pulento (es el font del atari itself). :-D
Avatar de Usuario
ZZT
Site Admin
Site Admin
 
Mensajes: 11051
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: Proyecto Atari-DMD

Notapor WillySoft el Sab Ene 25, 2014 6:55 pm

Se ven al revés las letras. Esto debiera arreglarlo:

Código: Seleccionar todo
   *=$4000

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   ror prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio

Avatar de Usuario
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Proyecto Atari-DMD

Notapor ZZT el Sab Ene 25, 2014 11:51 pm

Ahora si, se ven bacan pero aun muy tenues. Insisto, la velocidad de exploración está muy alta.
Avatar de Usuario
ZZT
Site Admin
Site Admin
 
Mensajes: 11051
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: Proyecto Atari-DMD

Notapor WillySoft el Dom Ene 26, 2014 12:35 am

Prueba esta versión, calibrable con el paddle:

Código: Seleccionar todo

   *=$4000

ciclos = 200 ; parámetro a calibrar

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c
paddl0 = $0270 ;paddle 0

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   jsr inicia.pantalla ; para que no quede sobrecargada la última columna
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   ldx paddl0
imprime.columna.loop
   nop
   nop
   nop
   dex
   bne imprime.columna.loop
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   ror prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio

Avatar de Usuario
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Proyecto Atari-DMD

Notapor WillySoft el Dom Ene 26, 2014 12:33 pm

Nueva versión: le agregué más NOP al grabar la columna, con ciclos regulables por paddle.

Le agregué además una instrucción que deje el color de fondo a blanco cuando termina la rutina, a fin de ver cuánto del barrido de la pantalla ocupa.

Saludos.

Código: Seleccionar todo
   *=$4000

ciclos = 200 ; parámetro a calibrar

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c
paddl0 = $0270 ;paddle 0
colbk= $d01a

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   lda #$0f
   sta colbk
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   jsr inicia.pantalla ; para que no quede sobrecargada la última columna
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   ldx paddl0
imprime.columna.loop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   dex
   bne imprime.columna.loop
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   ror prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio

Avatar de Usuario
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Proyecto Atari-DMD

Notapor Salonvip el Vie Ene 31, 2014 4:55 am

Increíble todo lo que se puede hacer con n atari.
Avatar de Usuario
Salonvip
hard player
hard player
 
Mensajes: 282
Registrado: Vie Nov 21, 2008 7:07 pm

Re: Proyecto Atari-DMD

Notapor ZZT el Vie Ene 31, 2014 6:02 am

Salonvip escribió:Increíble todo lo que se puede hacer con n atari.

Atari da pa mucho. Lo mejor detodo es que los flippers de su época corren el software y hardware casi iguales, por eso es relativamente fácil hacer compatibilidades. ;)

WillySoft escribió:Nueva versión: le agregué más NOP al grabar la columna, con ciclos regulables por paddle.

Le agregué además una instrucción que deje el color de fondo a blanco cuando termina la rutina, a fin de ver cuánto del barrido de la pantalla ocupa.

Saludos.
Spoiler: Mostrar
Código: Seleccionar todo
   *=$4000

ciclos = 200 ; parámetro a calibrar

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c
paddl0 = $0270 ;paddle 0
colbk= $d01a

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   lda #$0f
   sta colbk
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   jsr inicia.pantalla ; para que no quede sobrecargada la última columna
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   ldx paddl0
imprime.columna.loop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   dex
   bne imprime.columna.loop
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   ror prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio


Nup, no anda el scroll (se prenden solo la dos primeras columnas). El cambio de color de fondo si anda, y el efecto es alucinante!. XD
Avatar de Usuario
ZZT
Site Admin
Site Admin
 
Mensajes: 11051
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: Proyecto Atari-DMD

Notapor ZZT el Vie Ene 31, 2014 6:02 am

Salonvip escribió:Increíble todo lo que se puede hacer con n atari.

Atari da pa mucho. Lo mejor detodo es que los flippers de su época corren el software y hardware casi iguales, por eso es relativamente fácil hacer compatibilidades. ;)

WillySoft escribió:Nueva versión: le agregué más NOP al grabar la columna, con ciclos regulables por paddle.

Le agregué además una instrucción que deje el color de fondo a blanco cuando termina la rutina, a fin de ver cuánto del barrido de la pantalla ocupa.

Saludos.
Spoiler: Mostrar
Código: Seleccionar todo
   *=$4000

ciclos = 200 ; parámetro a calibrar

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c
paddl0 = $0270 ;paddle 0
colbk= $d01a

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   lda #$0f
   sta colbk
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
   jsr inicia.pantalla ; para que no quede sobrecargada la última columna
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   ldx paddl0
imprime.columna.loop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   dex
   bne imprime.columna.loop
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   ror prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio


Nup, no anda el scroll (se prenden solo la dos primeras columnas). El cambio de color de fondo si anda, y el efecto es alucinante!. XD
Avatar de Usuario
ZZT
Site Admin
Site Admin
 
Mensajes: 11051
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: Proyecto Atari-DMD

Notapor vitoco el Vie Ene 31, 2014 12:58 pm

Cool! XD
Avatar de Usuario
vitoco
expert
expert
 
Mensajes: 875
Registrado: Mié Nov 08, 2006 10:25 pm

Re: Proyecto Atari-DMD

Notapor WillySoft el Mar Feb 04, 2014 1:09 am

ZZT escribió:Nup, no anda el scroll (se prenden solo la dos primeras columnas). El cambio de color de fondo si anda, y el efecto es alucinante!. XD


Prueba esta versión, le saqué un JSR final que buscaba nivelar la intensidad de todas las columnas:

Código: Seleccionar todo
   *=$4000

ciclos = 200 ; parámetro a calibrar

font = $E000
font2 = $6000
pt.1 = $CB
pt.2 = $CD
pt.3 = $CF
porta =$d300   ; 54016
pactl =$d302   
setvbv =$e45c
xitvbv =$e462
clock = $14
CDTMV3 =$021c
paddl0 = $0270 ;paddle 0
colbk= $d01a

prepara.font.caracteres = 128
display.columnas = 48   ;¿pueden ser más?
display.caracteres = 6

vbd
   jsr borra.pantalla
   jsr despliega.pantalla
   jsr scroll
   lda #$0f
   sta colbk
   jmp xitvbv

init.vbd
   lda #$2B
   sta pactl
   lda #$FF
   sta porta
   ldy #<vbd
   ldx #>vbd
   lda #$07
   jsr setvbv

borra.pantalla
;vamos a tomar la rutina desplegada por ZZT.

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0
;joy_port
   lda #0
   sta porta      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)
   rts


despliega.pantalla
   ldx #display.columnas-1
despliega.pantalla.loop1
   jsr inicia.pantalla
   lda display,x
   jsr imprime.columna
   dex
   bpl despliega.pantalla.loop1
;   jsr inicia.pantalla ; para que no quede sobrecargada la última columna
   rts

inicia.pantalla
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso
         ; de la exploracion (si no pone 0 todas las columnas se activarían)
   rts

imprime.columna
   eor #$ff
   sta porta
   ldx paddl0
imprime.columna.loop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   dex
   bne imprime.columna.loop
   rts

display
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0

;lista la rutina del display, ahora la del font

prepara.font
   lda #>font
   sta pt.1+1
   lda #<font
   sta pt.1
   lda #>font2
   sta pt.2+1
   lda #<font2
   sta pt.2

   lda #prepara.font.caracteres   ; caracteres a transferir
   sta prepara.font.contador

prepara.font.loop1
   ldy #$7      ;transferimos el font a un buffer auxiliar para trabajar
prepara.font.loop2
   lda (pt.1),y
   sta prepara.font.buffer,y
   lda #$00
   sta prepara.font.buffer2,y
   dey
   bpl prepara.font.loop2

; Ahora vamos a transponer los datos
   ldx #$00
prepara.font.loop3
   asl prepara.font.buffer
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 1
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 2
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 3
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 4
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 5
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 6
   ror prepara.font.buffer2,x
   asl prepara.font.buffer + 7
   ror prepara.font.buffer2,x
   inx
   cpx #8
   bne prepara.font.loop3

; y ahora a copiar al font2
   ldy #$7
prepara.font.loop4
   lda prepara.font.buffer2,y
   sta (pt.2),y
   dey
   bpl prepara.font.loop4

   lda pt.1
   clc
   adc #$08
   sta pt.1
   lda pt.1+1
   adc #$00
   sta pt.1+1
   lda pt.2
   clc
   adc #$08
   sta pt.2
   lda pt.2+1
   adc #$00
   sta pt.2+1

   dec prepara.font.contador
   bne prepara.font.loop1
   rts

prepara.font.buffer
   .byte 0,0,0,0,0,0,0,0
prepara.font.buffer2
   .byte 0,0,0,0,0,0,0,0
prepara.font.contador
   .byte 0

;rutina que convierte el texto en caracteres de display
;Parámetros: "x" guarda el byte menor de la posición.
; "y" guarda el byte mayor de la posición
prepara.caracteres
   stx pt.1
   sty pt.1+1
   ldy #$00
   ldx #$00
prepara.caracteres.loop1
   lda (pt.1),y
   sta prepara.caracteres.caracter
   lda #$00
   sta prepara.caracteres.caracter+1
;vamos a multiplicarlo por 8
   asl prepara.caracteres.caracter ;*2
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*4
   rol prepara.caracteres.caracter+1
   asl prepara.caracteres.caracter ;*8
   rol prepara.caracteres.caracter+1

   lda prepara.caracteres.caracter
   clc
   adc #<font2
   sta pt.2
   lda prepara.caracteres.caracter+1
   adc #>font2
   sta pt.2+1
   sty pt.3
   ldy #$00
prepara.caracteres.loop2
   lda (pt.2),y
   sta scroll.tabla,x
   inx
   iny
   cpy #$08
   bne prepara.caracteres.loop2
   ldy pt.3
   iny
   cpy #display.caracteres+1
   bne prepara.caracteres.loop1

   rts

prepara.caracteres.caracter
   .byte 0,0

scroll
   dec scroll.aux
   bne scroll.no.reset
   lda #$8
   sta scroll.aux
   inc scroll.puntero
   bne scroll.noinc
   inc scroll.puntero+1
scroll.noinc
   ldx scroll.puntero
   ldy scroll.puntero+1
   jsr prepara.caracteres
   lda scroll.puntero
   cmp #<tabla.retrogames.fin
   bne scroll.no.reset
   lda scroll.puntero+1
   cmp #>tabla.retrogames.fin
   bne scroll.no.reset
   lda #<tabla.retrogames-1
   sta scroll.puntero
   lda #>tabla.retrogames-1
   sta scroll.puntero+1

scroll.no.reset
   lda #$8
   sec
   sbc scroll.aux
   tax
   ldy #$00
scroll.loop3
   lda scroll.tabla,x
   sta display,y
   inx
   iny
   cpy #display.columnas
   bne scroll.loop3
   rts

scroll.aux
   .byte 8
scroll.puntero
   .byte 0,0
scroll.tabla
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0
   .byte 0,0,0,0,0,0,0,0


inicio
   jsr prepara.font
   jsr init.vbd

   ldx #<tabla.retrogames
   ldy #>tabla.retrogames
   stx scroll.puntero
   sty scroll.puntero+1

inicio.loop1
   ldy #display.columnas-1
inicio.loop2
   lda display,y
   sta (88),y
   dey
   bpl inicio.loop2
   jmp inicio.loop1

wait
   lda #8
   sta CDTMV3
   lda #0
   sta CDTMV3+1
wait.loop
   lda CDTMV3
   bne wait.loop
   rts

tabla.retrogames
   .sbyte "      RETROGAMES"
tabla.retrogames.fin
   .sbyte "      "
   
   *=$2e0
   .word inicio

Avatar de Usuario
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Proyecto Atari-DMD

Notapor ZZT el Mar Feb 04, 2014 4:32 am

Sigue sin haber scroll.
Avatar de Usuario
ZZT
Site Admin
Site Admin
 
Mensajes: 11051
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: Proyecto Atari-DMD

Notapor seefahrer el Lun Jun 15, 2015 11:36 pm

Que hermoso y la mansa pega programando eso. A mi me vendría útil para la puerta de mi pieza un "no molestar" así de cool, :-D
Avatar de Usuario
seefahrer
medium
medium
 
Mensajes: 66
Registrado: Sab Nov 02, 2013 3:12 pm

AnteriorSiguiente

Volver a PROYECTOS

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado