LOADER DINAMIC adaptado por DaDMaN

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
trocoloco
Megaforero
Megaforero
Mensajes: 335
Registrado: Lun 16 Abr , 2007 11:02 am

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor trocoloco » Mar 18 Feb , 2020 4:39 pm

Ahí va código, sólo modicado lo que son la llamada y ejecución, dirección de la entrada, tamaño de archivo y paleta.

Código: Seleccionar todo

; DESENSAMBLADO CARGADOR ASPAR GP - MODIFICADO POR DADMAN 2006
;
; CARGADOR REUBICABLE A PARTIR DE &FF AUTOEJECUTABLE
; SALVAR CON ' SAVE"LOADER.",B,&FF,(tamaño del loader),&FF '
; EJECUTAR CON ' RUN"LOADER"
;
; COMPILABLE CON MAXAM Y WINAPE ASSEMBLER
;
; ADAPTADO CONCRETAMENTE PARA CARGA TURBO GHOSTS N GOBLINS
;

; Variables
GATE_ARRAY equ #7f
SCR equ #c000
BUFFERSCR equ #2710
FLAG equ #ff
TINTA equ %01000000
; Final Variables


ORG &FF ; Dirección de compilación y ejecución

Inicio:
;xor a ; xor a = 0 (mode 0)
ld a,0 ; a = 0, 1, 2 (mode 0, 1, 2)
call #bc0e ; Pone la pantalla en mode 'a'

; --------------------------------------------
; Programa principal
; --------------------------------------------

ld hl,Paleta
call Colores
call RutinaCarga
call #5000 ;call #701c ; LLamada y ejecución del Bloque de datos
ei
ret

; --------------------------------------------
; Fin del programa principal
; --------------------------------------------


Colores:
ld c,16 ; Número de colores a cambiar + 1
ld b,GATE_ARRAY

Bucle:
ld a,(hL)
add a,TINTA
inc hl
dec c
out (c),c ; Pluma
out (c),a
jr nz,Bucle ; Siguiente Pluma
ld a,17
out (c),a ; Color Borde de Pantalla
ld a,(hl)
adc a,TINTA
out (c),a
ret


RutinaCarga:

jr l0012 ; (+#10)

lda02: nop
dec bc
inc bc
ld a,(bc)
ld b,#01
inc d
jr l0018 ; (+#0d)
add hl,de
ld (bc),a
djnz l001e ; (+#0f)
ld (de),a
add hl,bc
ld a,(de)

l0012: ld hl,#1388

l0018: dec hl
ld a,h
or l
jr nz,l0018 ; (-#05)
di
l001e: ld bc,#f792
out (c),c
dec b
ld c,#10
out (c),c
ex af,af'
push af
exx
push bc
ld bc,#f500
exx

; Orden de carga

call Pantalla ; Carga Pantalla de Carga
call Datos ; Carga Bloque de datos

; Final

ld bc,#f782
out (c),c
exx
pop bc
out (c),c
exx
pop af
ex af,af'
ret


Loader: inc d
ex af,af'
dec d
ld bc,#7f10
out (c),c
ld c,#4b
out (c),c
exx
in a,(c)
exx
rra
and #40
or #02
ld c,a
cp a
l0097: ret nz

l0098: call lda04
jr nc,l0097 ; (-#06)
ld hl,#0415
l00a0: djnz l00a0 ; (-#02)
dec hl
ld a,h
or l
jr nz,l00a0 ; (-#07)
call lda05
jr nc,l0097 ; (-#15)
l00ac: ld b,#9c
call lda05
jr nc,l0097 ; (-#1c)
ld a,#c6
cp b
jr nc,l0098 ; (-#20)
inc h
jr nz,l00ac ; (-#0f)
l00bb: ld b,#c9
call lda04
jr nc,l0097 ; (-#2b)
ld a,b
cp #d4
jr nc,l00bb ; (-#0c)
call lda04
ret nc

ld a,c
xor #03
ld c,a
ld h,#00
ld b,#cd
jr l00f4 ; (+#1f)
l00d5: ex af,af'
jr nz,l00df ; (+#07)
jr nc,l00e9 ; (+#0f)
ld (ix+#00),l
jr l00ee ; (+#0f)
l00df: rl c
xor l
ret nz

ld a,c
rra
ld c,a
inc de
jr l00f0 ; (+#07)
l00e9: ld a,(ix+#00)
xor l
ret nz

l00ee: inc ix
l00f0: dec de
ex af,af'
ld b,#ce
l00f4: ld l,#01
l00f6: call lda05
ret nc

ld a,#dc
cp b
rl l
ld b,#cd
jr nc,l00f6 ; (-#0d)
ld a,h
xor l
ld h,a
ld a,d
or e
jr nz,l00d5 ; (-#35)
ld bc,#7f00
ld a,#54
out (c),a
ret

lda05: call lda04
ret nc

lda04: ld a,#18
l0118: dec a
jr nz,l0118 ; (-#03)
and a
l011c: inc b
ret z

exx
in a,(c)
exx
rra
xor c
and #40
jr z,l011c ; (-#0c)
ld a,c
xor #40
and #5f
inc a
ld c,a
and #3f
or #40
exx
ld b,GATE_ARRAY
out (c),a
ld b,#f5
exx
scf
ret

Pantalla:
ld ix,BUFFERSCR ; Dirección de memoria Buffer de pantalla
ld de,#4000 ; Tamaño del bloque de datos (16384 bytes)
ld a,FLAG ; FlagByte (255)
scf
call Loader ; Llamada a la rutina de Carga
ld hl,BUFFERSCR
ld de,SCR ; Dirección de memoria de pantalla
ld bc,#4000 ; Tamaño del bloque de datos (16384 bytes)
ldir ; Transferencia Buffer a memoria de pantalla
ret

Datos:
ld ix,#1800 ; Dirección de memoria de carga de datos
ld de,#8E00 ; Tamaño del bloque de datos (36.352 bytes)
ld a,FLAG ; FlagByte (255)
scf
call Loader ; Llamada a la rutina de Carga
ret

; Paleta de colores ; Desde la pluma 15 a la 0
;Paleta db &19,&12,&09,&0a,&0b,&03,&01,&0e,&02,&11,&06,&18,&0f,&0d,&1a,&14,&14,&14 ;inverso
Paleta db &1a,&0d,&00,&0f,&18,&06,&10,&02,&0e,&01,&03,&0b,&0a,&09,&12,&19; derecho

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor Artaburu » Mar 18 Feb , 2020 5:36 pm

Pero ahi no veo que entre call colores y call rutinacarga hayas metido ninguna pausa.
Salu2,
Arta

trocoloco
Megaforero
Megaforero
Mensajes: 335
Registrado: Lun 16 Abr , 2007 11:02 am

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor trocoloco » Mar 18 Feb , 2020 6:27 pm

Ensamblando el archivo "LOADER" con este código hace que se vea así :-k

Imagen

Código: Seleccionar todo

;
; DESENSAMBLADO CARGADOR ASPAR GP - MODIFICADO POR DADMAN 2006
;
; CARGADOR REUBICABLE A PARTIR DE &FF AUTOEJECUTABLE
; SALVAR CON ' SAVE"LOADER.",B,&FF,(tamaño del loader),&FF '
; EJECUTAR CON ' RUN"LOADER"
;
; COMPILABLE CON MAXAM Y WINAPE ASSEMBLER
;
; ADAPTADO CONCRETAMENTE PARA CARGA TURBO GHOSTS N GOBLINS
;

; Variables
GATE_ARRAY equ #7f
SCR equ #c000
BUFFERSCR equ #2710
FLAG equ #ff
TINTA equ %01000000
; Final Variables


ORG &FF ; Dirección de compilación y ejecución

Inicio:
;xor a ; xor a = 0 (mode 0)
ld a,1 ; a = 0, 1, 2 (mode 0, 1, 2)
call #bc0e ; Pone la pantalla en mode 'a'

; --------------------------------------------
; Programa principal
; --------------------------------------------

ld hl,Paleta
call Colores
halt
halt
halt
halt
halt
call RutinaCarga
call #5000 ;call #701c ; LLamada y ejecución del Bloque de datos
ei
ret

; --------------------------------------------
; Fin del programa principal
; --------------------------------------------


Colores:
ld c,16 ; Número de colores a cambiar + 1
ld b,GATE_ARRAY

Bucle:
ld a,(hL)
add a,TINTA
inc hl
dec c
out (c),c ; Pluma
out (c),a
jr nz,Bucle ; Siguiente Pluma
ld a,17
out (c),a ; Color Borde de Pantalla
ld a,(hl)
adc a,TINTA
out (c),a
ret


RutinaCarga:

jr l0012 ; (+#10)

lda02: nop
dec bc
inc bc
ld a,(bc)
ld b,#01
inc d
jr l0018 ; (+#0d)
add hl,de
ld (bc),a
djnz l001e ; (+#0f)
ld (de),a
add hl,bc
ld a,(de)

l0012: ld hl,#1388

l0018: dec hl
ld a,h
or l
jr nz,l0018 ; (-#05)
di
l001e: ld bc,#f792
out (c),c
dec b
ld c,#10
out (c),c
ex af,af'
push af
exx
push bc
ld bc,#f500
exx

; Orden de carga

call Pantalla ; Carga Pantalla de Carga
call Datos ; Carga Bloque de datos

; Final

ld bc,#f782
out (c),c
exx
pop bc
out (c),c
exx
pop af
ex af,af'
ret


Loader: inc d
ex af,af'
dec d
ld bc,#7f10
out (c),c
ld c,#4b
out (c),c
exx
in a,(c)
exx
rra
and #40
or #02
ld c,a
cp a
l0097: ret nz

l0098: call lda04
jr nc,l0097 ; (-#06)
ld hl,#0415
l00a0: djnz l00a0 ; (-#02)
dec hl
ld a,h
or l
jr nz,l00a0 ; (-#07)
call lda05
jr nc,l0097 ; (-#15)
l00ac: ld b,#9c
call lda05
jr nc,l0097 ; (-#1c)
ld a,#c6
cp b
jr nc,l0098 ; (-#20)
inc h
jr nz,l00ac ; (-#0f)
l00bb: ld b,#c9
call lda04
jr nc,l0097 ; (-#2b)
ld a,b
cp #d4
jr nc,l00bb ; (-#0c)
call lda04
ret nc

ld a,c
xor #03
ld c,a
ld h,#00
ld b,#cd
jr l00f4 ; (+#1f)
l00d5: ex af,af'
jr nz,l00df ; (+#07)
jr nc,l00e9 ; (+#0f)
ld (ix+#00),l
jr l00ee ; (+#0f)
l00df: rl c
xor l
ret nz

ld a,c
rra
ld c,a
inc de
jr l00f0 ; (+#07)
l00e9: ld a,(ix+#00)
xor l
ret nz

l00ee: inc ix
l00f0: dec de
ex af,af'
ld b,#ce
l00f4: ld l,#01
l00f6: call lda05
ret nc

ld a,#dc
cp b
rl l
ld b,#cd
jr nc,l00f6 ; (-#0d)
ld a,h
xor l
ld h,a
ld a,d
or e
jr nz,l00d5 ; (-#35)
ld bc,#7f00
ld a,#54
out (c),a
ret

lda05: call lda04
ret nc

lda04: ld a,#18
l0118: dec a
jr nz,l0118 ; (-#03)
and a
l011c: inc b
ret z

exx
in a,(c)
exx
rra
xor c
and #40
jr z,l011c ; (-#0c)
ld a,c
xor #40
and #5f
inc a
ld c,a
and #3f
or #40
exx
ld b,GATE_ARRAY
out (c),a
ld b,#f5
exx
scf
ret

Pantalla:
ld ix,BUFFERSCR ; Dirección de memoria Buffer de pantalla
ld de,#4000 ; Tamaño del bloque de datos (16384 bytes)
ld a,FLAG ; FlagByte (255)
scf
call Loader ; Llamada a la rutina de Carga
ld hl,BUFFERSCR
ld de,SCR ; Dirección de memoria de pantalla
ld bc,#4000 ; Tamaño del bloque de datos (16384 bytes)
ldir ; Transferencia Buffer a memoria de pantalla
ret

Datos:
ld ix,#1800 ; Dirección de memoria de carga de datos
ld de,#8E00 ; Tamaño del bloque de datos (36.352 bytes)
ld a,FLAG ; FlagByte (255)
scf
call Loader ; Llamada a la rutina de Carga
ret

; Paleta de colores ; Desde la pluma 15 a la 0
;Paleta db &19,&12,&09,&0a,&0b,&03,&01,&0e,&02,&11,&06,&18,&0f,&0d,&1a,&14,&14,&14 ;inverso
Paleta db &1a,&0d,&00,&0f,&18,&06,&10,&02,&0e,&01,&03,&0b,&0a,&09,&12,&19; derecho

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor Artaburu » Mar 18 Feb , 2020 6:36 pm

Prueba a poner Mode 0
Salu2,
Arta

trocoloco
Megaforero
Megaforero
Mensajes: 335
Registrado: Lun 16 Abr , 2007 11:02 am

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor trocoloco » Mar 18 Feb , 2020 6:47 pm

Puesto en modo 0, 1 y 24 y el cabrito hace lo que le parece, ahora sale así. Si quieres dejo un enlace con el DSK de donde saco los archivos. De todas formas no te quiero marear mucho con el tema, bastante me estás ayudando ya.

Imagen

Código: Seleccionar todo

;
; DESENSAMBLADO CARGADOR ASPAR GP - MODIFICADO POR DADMAN 2006
;
; CARGADOR REUBICABLE A PARTIR DE &FF AUTOEJECUTABLE
; SALVAR CON ' SAVE"LOADER.",B,&FF,(tamaño del loader),&FF '
; EJECUTAR CON ' RUN"LOADER"
;
; COMPILABLE CON MAXAM Y WINAPE ASSEMBLER
;
; ADAPTADO CONCRETAMENTE PARA CARGA TURBO GHOSTS N GOBLINS
;

; Variables
GATE_ARRAY equ #7f
SCR equ #c000
BUFFERSCR equ #2710
FLAG equ #ff
TINTA equ %01000000
; Final Variables


ORG &FF ; Dirección de compilación y ejecución

Inicio:
;xor a ; xor a = 0 (mode 0)
ld a,0 ; a = 0, 1, 2 (mode 0, 1, 2)
call #bc0e ; Pone la pantalla en mode 'a'

; --------------------------------------------
; Programa principal
; --------------------------------------------

ld hl,Paleta
call Colores
halt
halt
halt
halt
halt
call RutinaCarga
call #5000 ;call #701c ; LLamada y ejecución del Bloque de datos
ei
ret

; --------------------------------------------
; Fin del programa principal
; --------------------------------------------


Colores:
ld c,16 ; Número de colores a cambiar + 1
ld b,GATE_ARRAY

Bucle:
ld a,(hL)
add a,TINTA
inc hl
dec c
out (c),c ; Pluma
out (c),a
jr nz,Bucle ; Siguiente Pluma
ld a,17
out (c),a ; Color Borde de Pantalla
ld a,(hl)
adc a,TINTA
out (c),a
ret


RutinaCarga:

jr l0012 ; (+#10)

lda02: nop
dec bc
inc bc
ld a,(bc)
ld b,#01
inc d
jr l0018 ; (+#0d)
add hl,de
ld (bc),a
djnz l001e ; (+#0f)
ld (de),a
add hl,bc
ld a,(de)

l0012: ld hl,#1388

l0018: dec hl
ld a,h
or l
jr nz,l0018 ; (-#05)
di
l001e: ld bc,#f792
out (c),c
dec b
ld c,#10
out (c),c
ex af,af'
push af
exx
push bc
ld bc,#f500
exx

; Orden de carga

call Pantalla ; Carga Pantalla de Carga
call Datos ; Carga Bloque de datos

; Final

ld bc,#f782
out (c),c
exx
pop bc
out (c),c
exx
pop af
ex af,af'
ret


Loader: inc d
ex af,af'
dec d
ld bc,#7f10
out (c),c
ld c,#4b
out (c),c
exx
in a,(c)
exx
rra
and #40
or #02
ld c,a
cp a
l0097: ret nz

l0098: call lda04
jr nc,l0097 ; (-#06)
ld hl,#0415
l00a0: djnz l00a0 ; (-#02)
dec hl
ld a,h
or l
jr nz,l00a0 ; (-#07)
call lda05
jr nc,l0097 ; (-#15)
l00ac: ld b,#9c
call lda05
jr nc,l0097 ; (-#1c)
ld a,#c6
cp b
jr nc,l0098 ; (-#20)
inc h
jr nz,l00ac ; (-#0f)
l00bb: ld b,#c9
call lda04
jr nc,l0097 ; (-#2b)
ld a,b
cp #d4
jr nc,l00bb ; (-#0c)
call lda04
ret nc

ld a,c
xor #03
ld c,a
ld h,#00
ld b,#cd
jr l00f4 ; (+#1f)
l00d5: ex af,af'
jr nz,l00df ; (+#07)
jr nc,l00e9 ; (+#0f)
ld (ix+#00),l
jr l00ee ; (+#0f)
l00df: rl c
xor l
ret nz

ld a,c
rra
ld c,a
inc de
jr l00f0 ; (+#07)
l00e9: ld a,(ix+#00)
xor l
ret nz

l00ee: inc ix
l00f0: dec de
ex af,af'
ld b,#ce
l00f4: ld l,#01
l00f6: call lda05
ret nc

ld a,#dc
cp b
rl l
ld b,#cd
jr nc,l00f6 ; (-#0d)
ld a,h
xor l
ld h,a
ld a,d
or e
jr nz,l00d5 ; (-#35)
ld bc,#7f00
ld a,#54
out (c),a
ret

lda05: call lda04
ret nc

lda04: ld a,#18
l0118: dec a
jr nz,l0118 ; (-#03)
and a
l011c: inc b
ret z

exx
in a,(c)
exx
rra
xor c
and #40
jr z,l011c ; (-#0c)
ld a,c
xor #40
and #5f
inc a
ld c,a
and #3f
or #40
exx
ld b,GATE_ARRAY
out (c),a
ld b,#f5
exx
scf
ret

Pantalla:
ld ix,BUFFERSCR ; Dirección de memoria Buffer de pantalla
ld de,#4000 ; Tamaño del bloque de datos (16384 bytes)
ld a,FLAG ; FlagByte (255)
scf
call Loader ; Llamada a la rutina de Carga
ld hl,BUFFERSCR
ld de,SCR ; Dirección de memoria de pantalla
ld bc,#4000 ; Tamaño del bloque de datos (16384 bytes)
ldir ; Transferencia Buffer a memoria de pantalla
ret

Datos:
ld ix,#1800 ; Dirección de memoria de carga de datos
ld de,#8E00 ; Tamaño del bloque de datos (36.352 bytes)
ld a,FLAG ; FlagByte (255)
scf
call Loader ; Llamada a la rutina de Carga
ret

; Paleta de colores ; Desde la pluma 15 a la 0
;Paleta db &19,&12,&09,&0a,&0b,&03,&01,&0e,&02,&11,&06,&18,&0f,&0d,&1a ;inverso
Paleta db &1a,&0d,&00,&0f,&18,&06,&10,&02,&0e,&01,&03,&0b,&0a,&09,&12,&19; derecho

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor Artaburu » Mar 18 Feb , 2020 7:13 pm

Prueba esta paleta, creo que estás poniendo colores "firmware" cuando la rutina es con números de color "hardware"
Paleta db 11,0,20,14,24,12,7,21,32,4,28,23,6,22,18,3; derecho
Salu2,
Arta

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6971
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor MiguelSky » Mar 18 Feb , 2020 8:48 pm

Eso lo pensé yo en un primer momento :-k

trocoloco
Megaforero
Megaforero
Mensajes: 335
Registrado: Lun 16 Abr , 2007 11:02 am

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor trocoloco » Mar 18 Feb , 2020 9:06 pm

Estabas en lo correcto! \:D/ Sólo que el orden de la paleta era a la inversa. Que grande eres, vuelvo a darte las gracias por aguantar la murga que te he dado y lo que me has ayudado =D>

Y para que conste en acta, aquí está la prueba. Dejo el archivo por si alguien lo quiere.

Imagen
Adjuntos
Ghosts N' Goblins.cdt
GNG con cargador de colores
(52.61 KiB) Descargado 36 veces

Avatar de Usuario
Pentapolín
Forum Addict
Forum Addict
Mensajes: 434
Registrado: Sab 15 Abr , 2017 4:53 pm
Ubicación: Ávila

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor Pentapolín » Mar 18 Feb , 2020 9:13 pm

Pregunto desde la ignorancia: ¿para qué sirve lo que has hecho? :?:

trocoloco
Megaforero
Megaforero
Mensajes: 335
Registrado: Lun 16 Abr , 2007 11:02 am

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor trocoloco » Mar 18 Feb , 2020 9:40 pm

Básicamente para aprender e intentar comprender un poquillo el asm. Por gusto, tenía esa cosa de aprender a hacer un CDT propio con rasters y oye si el día de mañana aprendo a hacer alguna cosilla pues queda chulo algo así. <rX

Avatar de Usuario
Pentapolín
Forum Addict
Forum Addict
Mensajes: 434
Registrado: Sab 15 Abr , 2017 4:53 pm
Ubicación: Ávila

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor Pentapolín » Mar 18 Feb , 2020 10:03 pm

Entendido.

Por cierto, ¿el monstruo que sale a la derecha va en tanga? :lol:

trocoloco
Megaforero
Megaforero
Mensajes: 335
Registrado: Lun 16 Abr , 2007 11:02 am

Re: LOADER DINAMIC adaptado por DaDMaN

Mensajepor trocoloco » Mar 18 Feb , 2020 11:25 pm

<XX sí, dice que es lo más cómodo para ponerse moreno en la playa


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic