Proyecto Atari-DMD

Para comentar los proyectos de hardware presentados en la web.
Avatar de Usuario
Poltergeist
expert
expert
Mensajes: 1770
Registrado: Lun Jul 14, 2008 7:36 pm
Reputation: 4

Re: Proyecto Atari-DMD

Mensaje por Poltergeist »

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

Felicitaciones!!!

Avatar de Usuario
WillySoft
expert
expert
Mensajes: 666
Registrado: Mar Nov 07, 2006 10:02 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por WillySoft »

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: 666
Registrado: Mar Nov 07, 2006 10:02 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por WillySoft »

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
ZZT
Site Admin
Site Admin
Mensajes: 11250
Registrado: Mar Nov 07, 2006 2:45 pm
Reputation: 0
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: Proyecto Atari-DMD

Mensaje por ZZT »

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
WillySoft
expert
expert
Mensajes: 666
Registrado: Mar Nov 07, 2006 10:02 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por WillySoft »

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
ZZT
Site Admin
Site Admin
Mensajes: 11250
Registrado: Mar Nov 07, 2006 2:45 pm
Reputation: 0
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: Proyecto Atari-DMD

Mensaje por ZZT »

Ahora si, se ven bacan pero aun muy tenues. Insisto, la velocidad de exploración está muy alta.

Avatar de Usuario
WillySoft
expert
expert
Mensajes: 666
Registrado: Mar Nov 07, 2006 10:02 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por WillySoft »

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: 666
Registrado: Mar Nov 07, 2006 10:02 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por WillySoft »

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
Salonvip
hard player
hard player
Mensajes: 282
Registrado: Vie Nov 21, 2008 4:07 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por Salonvip »

Increíble todo lo que se puede hacer con n atari.

Avatar de Usuario
ZZT
Site Admin
Site Admin
Mensajes: 11250
Registrado: Mar Nov 07, 2006 2:45 pm
Reputation: 0
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: Proyecto Atari-DMD

Mensaje por ZZT »

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

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: 11250
Registrado: Mar Nov 07, 2006 2:45 pm
Reputation: 0
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: Proyecto Atari-DMD

Mensaje por ZZT »

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

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
vitoco
expert
expert
Mensajes: 916
Registrado: Mié Nov 08, 2006 7:25 pm
Reputation: 0
Contactar:

Re: Proyecto Atari-DMD

Mensaje por vitoco »

Cool! XD

Avatar de Usuario
WillySoft
expert
expert
Mensajes: 666
Registrado: Mar Nov 07, 2006 10:02 pm
Reputation: 0

Re: Proyecto Atari-DMD

Mensaje por WillySoft »

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
ZZT
Site Admin
Site Admin
Mensajes: 11250
Registrado: Mar Nov 07, 2006 2:45 pm
Reputation: 0
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: Proyecto Atari-DMD

Mensaje por ZZT »

Sigue sin haber scroll.

Avatar de Usuario
seefahrer
medium
medium
Mensajes: 74
Registrado: Sab Nov 02, 2013 12:12 pm
Reputation: 2

Re: Proyecto Atari-DMD

Mensaje por seefahrer »

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

Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje