Last active
April 4, 2023 23:07
-
-
Save AleixMT/05337dc80fd479b8152cf86e7ab6b43d to your computer and use it in GitHub Desktop.
function from Garlic OS phase 2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.global _gm_pintarFranjas | |
@; Rutina para para pintar las franjas verticales correspondientes a un | |
@; conjunto de franjas consecutivas de memoria asignadas a un segmento | |
@; (de código o datos) del zócalo indicado por parámetro. | |
@;Parámetros: | |
@; R0: el número de zócalo que reserva la memoria (0 para borrar) | |
@; R1: el índice inicial de las franjas | |
@; R2: el número de franjas a pintar | |
@; R3: el tipo de segmento reservado (0 -> código, 1 -> datos) | |
_gm_pintarFranjas: | |
push {r0-r12,lr} | |
mov r4, #0x06200000 @; Direccion inicial memoria video procesador grafico 2 | |
add r5, r4, #0x00004000 | |
add r6, r5, #0x8000 @;r6 = base de baldosas para gestion de memoria | |
ldr r4, =_gs_colZoc | |
add r9, r4, r0 | |
ldrb r10, [r9] @;r10 = seleccion del color | |
mov r11, #0 @;contar en que columna estamos de las 8 de cada baldosa | |
push {r0-r3} | |
mov r0, r1 | |
mov r1, #8 | |
ldr r2, =quo | |
ldr r3, =res | |
bl _ga_divmod | |
ldr r8, [r2] | |
ldr r5, [r3] | |
pop {r0-r3} @; r8 = para definir que baldosa y r5 la columna en esa baldosa | |
add r11, r5 | |
mov r7, #64 | |
mul r8, r7 @; r8 *64 porque cada baldosa son 64 bytes | |
add r8, r5 @; r8+r5 para posicionarme en la columna correcta (NO HABRIA QUE MULTIPLICAR R5 POR 8?) | |
mov r5, #0 @; r5 =0 contador | |
.Lbuclesico: | |
cmp r11, #8 | |
beq .Lnuevabaldosa @; si hemos acabado la baldosa, siguiente | |
mov r7, r8 | |
add r7, #16 @; r7=r8+16 para ponernos en las casillas a printear | |
mov r12, #0 @; r12 = 0 para comprobar el byte que se printea | |
.Lbuclesico2: | |
cmp r12, #4 @; si ya se han printeado los 4 de la columna, siguiente columna | |
beq .Lfuerabuclesico2 | |
cmp r3, #0 | |
bne .Ldatos @; r3 nos permite diferenciar entre si printeamos datos (salto) o codigo (se queda aqui). Al final es el mismo fundamento con diferente colores. | |
ldrh r0, [r6, r7] @; carga el halfword en r0 | |
mov r4, r10 @; r4=r10 | |
cmp r11, #1 @; compara si estas en la columna 1,3,5 o 7 de la baldosa para mover el color para insertarlo en la parte alta del halfword | |
moveq r4, r10, lsl #8 | |
cmp r11, #3 | |
moveq r4, r10, lsl #8 | |
cmp r11, #5 | |
moveq r4, r10, lsl #8 | |
cmp r11, #7 | |
moveq r4, r10, lsl #8 | |
add r0, r4 @; añade el color al halfword de r0 | |
cmp r10, #0 @; compara si el color es negro (está liberando memoria) | |
andeq r0, r4 @; si está liberando memoria le hace una AND al halfword a insertar para borrar la memoria en pantalla | |
strh r0, [r6, r7] @; guarda r0 en la pantalla | |
add r7, #8 @; r7 = r7+8 para continuar en la columna | |
add r12, #1 @; r12 = r12+1 indicando que añade una columna | |
b .Lbuclesico2 | |
.Ldatos: | |
cmp r5, #0 @; contador de r5 para hacer el patron pixel de color y pixel negro | |
bne .Luno | |
ldrh r0, [r6, r7] @; carga el halfword en r0 | |
mov r4, r10 @; r4=r10 | |
cmp r11, #1 @; compara si estas en la columna 1,3,5 o 7 de la baldosa para mover el color para insertarlo en la parte alta del halfword | |
moveq r4, r10, lsl #8 | |
cmp r11, #3 | |
moveq r4, r10, lsl #8 | |
cmp r11, #5 | |
moveq r4, r10, lsl #8 | |
cmp r11, #7 | |
moveq r4, r10, lsl #8 | |
add r0, r4 @; añade el color al halfword de r0 | |
strh r0, [r6, r7] @; guarda r0 en la pantalla | |
add r7, #8 @; r7 = r7+8 para continuar en la columna | |
add r12, #1 @; r12 = r12+1 indicando que añade una columna | |
mov r5, #1 @; se mueve el bit a r5 a 1 para que el siguiente pixel sea negro | |
b .Lbuclesico2 | |
.Luno: | |
add r7, #8 @; r7 = r7+8 para continuar en la columna | |
add r12, #1 @; r12 = r12+1 indicando que añade una columna | |
mov r5, #0 @; se mueve el bit a r5 a 0 para que el siguiente pixel sea de color | |
b .Lbuclesico2 | |
.Lfuerabuclesico2: | |
add r8, #1 @; r8= r8+1 para la siguiente columna | |
add r11, #1 @; añade una columna al contador | |
sub r2, #1 @; se resta una a las columnas que se tienen que printear | |
cmp r5, #0 | |
beq .Lponauno | |
mov r5, #0 @; cambia r5 para la sigiente columna | |
cmp r2, #0 | |
bne .Lbuclesico @; si no se han acabado las columnas, se sigue, sino se acaba | |
beq .Lfinpintar | |
.Lponauno: | |
mov r5, #1 @; cambia r5 para la sigiente columna | |
cmp r2, #0 | |
bne .Lbuclesico | |
beq .Lfinpintar @; sino quedan mas columnas, se acaba | |
.Lnuevabaldosa: @; para la siguiente columna se tiene que añadir los 56 bytes al r8 | |
add r8, #56 | |
mov r11, #0 @; además se mueve r11 que indica la columna, a 0 para la siguiente baldosa | |
b .Lbuclesico | |
.Lfinpintar: | |
pop {r0-r12,pc} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment