aboutsummaryrefslogtreecommitdiff
path: root/lib/cpcrslib/GphStrStd.s
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-11-05 11:22:55 +0000
committerJuan J. Martinez <jjm@usebox.net>2023-11-05 11:31:28 +0000
commit2fbdf974338bde8576efdae40a819a76b2391033 (patch)
tree64d41a37470143f142344f9a439d96de3e7918c2 /lib/cpcrslib/GphStrStd.s
downloadkitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.tar.gz
kitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.zip
Initial import of the open source release
Diffstat (limited to 'lib/cpcrslib/GphStrStd.s')
-rw-r--r--lib/cpcrslib/GphStrStd.s412
1 files changed, 412 insertions, 0 deletions
diff --git a/lib/cpcrslib/GphStrStd.s b/lib/cpcrslib/GphStrStd.s
new file mode 100644
index 0000000..08c19ec
--- /dev/null
+++ b/lib/cpcrslib/GphStrStd.s
@@ -0,0 +1,412 @@
+; ******************************************************
+; ** Librería de rutinas SDCC para Amstrad CPC **
+; ** Raúl Simarro (Artaburu) - 2009, 2012 **
+; ******************************************************
+
+cpc_GetScrAddress0: ;en HL están las coordenadas
+
+ ;LD A,H
+ LD (#inc_ancho+1),A
+ LD A,L
+ SRL A
+ SRL A
+ SRL A
+ ; A indica el bloque a multiplicar x &50
+ LD D,A ;D
+ SLA A
+ SLA A
+ SLA A
+ SUB L
+ NEG
+ ; A indica el desplazamiento a multiplicar x &800
+ LD E,A ;E
+ LD L,D
+ LD H,#0
+ ADD HL,HL
+ LD BC,#bloques
+ ADD HL,BC
+ ;HL APUNTA AL BLOQUE BUSCADO
+ LD C,(HL)
+ INC HL
+ LD H,(HL)
+ LD L,C
+ ;HL TIENE EL VALOR DEL BLOQUE DE 8 BUSCADO
+ PUSH HL
+ LD D,#0
+ LD HL,#sub_bloques
+ ADD HL,DE
+ LD A,(HL)
+ POP HL
+ ADD H
+ LD H,A
+inc_ancho:
+ LD E,#0
+ ADD HL,DE
+ RET
+
+bloques:
+.DW #0XC000,#0XC050,#0XC0A0,#0XC0F0,#0XC140,#0XC190,#0XC1E0,#0XC230,#0XC280,#0XC2D0,#0XC320,#0XC370,#0XC3C0,#0XC410,#0XC460,#0XC4B0,#0XC500,#0XC550,#0XC5A0,#0XC5F0,#0XC640,#0XC690,#0XC6E0,#0XC730,#0XC780
+sub_bloques:
+.DB #0X00,#0X08,#0X10,#0X18,#0X20,#0X28,#0X30,#0X38
+
+
+
+
+.globl _cpc_PrintGphStrStd
+
+_cpc_PrintGphStrStd::
+ ld ix,#2
+ add ix,sp
+ ld l,3 (ix)
+ ld h,4 (ix) ;destino
+ ld e,1 (ix)
+ ld d,2 (ix) ;texto origen
+ ld a,0 (ix) ;color
+ ld (#color_uso+1),a
+ JP cpc_PrintGphStrStd0
+
+
+.globl _cpc_PrintGphStrStdXY
+
+_cpc_PrintGphStrStdXY::
+;preparación datos impresión. El ancho y alto son fijos!
+ ld ix,#2
+ add ix,sp
+ ld L,4 (ix)
+ ld A,3 (ix) ;pantalla
+ call cpc_GetScrAddress0
+ ld e,1 (ix)
+ ld d,2 (ix) ;texto origen
+ ld a,0 (ix) ;color
+ ld (#color_uso+1),a
+ JP cpc_PrintGphStrStd0
+
+color0:
+ XOR A
+ CALL metecolor
+ JP sigue
+color1:
+ LD A,#0B00001000
+ CALL metecolor
+ JP sigue
+color2:
+ LD A,#0B10000000
+ CALL metecolor
+ JP sigue
+color3:
+ LD A,#0b10001000
+ CALL metecolor
+ JP sigue
+metecolor:
+ LD (#cc0_gpstd-1),A
+ LD (#cc4_gpstd-1),A
+ SRL A
+ LD (#cc1_gpstd-1),A
+ LD (#cc5_gpstd-1),A
+ SRL A
+ LD (#cc2_gpstd-1),A
+ LD (#cc6_gpstd-1),A
+ SRL A
+ LD (#cc3_gpstd-1),A
+ LD (#cc7_gpstd-1),A
+ RET
+
+cpc_PrintGphStrStd0:
+;; marcará el color con que se imprime
+color_uso:
+ LD A,#1
+ OR A
+ JP Z,color0
+ CP #1
+ JP Z,color1
+ CP #2
+ JP Z,color2
+ CP #3
+ JP Z,color3
+sigue:
+
+ ;trabajo previo: Para tener una lista de trabajos de impresión. No se interrumpe
+ ;la impresión en curso.
+ LD A,(#imprimiendo)
+ CP #1
+ JP Z,add_elemento
+ LD (#direcc_destino),HL
+ EX DE,HL
+ CALL bucle_texto0
+
+;antes de terminar, se mira si hay algo en cola.
+bucle_cola_impresion:
+ LD A,(#elementos_cola)
+ OR A
+ JP Z,terminar_impresion
+ CALL leer_elemento
+ JP bucle_cola_impresion
+
+terminar_impresion:
+ XOR A
+ LD (#imprimiendo),A
+ RET
+entrar_cola_impresion:
+ ;si se está imprimiendo se mete el valor en la cola
+ RET
+add_elemento:
+ DI
+ LD IX,(#pos_cola)
+ LD 0 (IX),L
+ LD 1 (IX),H
+ LD 2 (IX),E
+ LD 3 (IX),D
+ INC IX
+ INC IX
+ INC IX
+ INC IX
+ Ld (#pos_cola),IX
+ LD HL,#elementos_cola
+ INC (HL)
+ EI
+ RET
+leer_elemento:
+ DI
+ LD IX,(#pos_cola)
+ LD L,0 (IX)
+ LD H,1 (IX)
+ LD E,2 (IX)
+ LD D,3 (IX)
+ DEC IX
+ DEC IX
+ DEC IX
+ DEC IX
+ LD (#pos_cola),IX
+ LD HL,#elementos_cola
+ DEC (HL)
+ EI
+ RET
+
+elementos_cola:
+ .DW #0
+pos_cola:
+ .DW cola_impresion
+cola_impresion:
+ .DB #0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0 ; defs 12
+bucle_texto0:
+ LD A,#1
+ LD (#imprimiendo),A
+ LD A,(#first_char8)
+ LD B,A ;resto 48 para saber el número del caracter (En ASCII 0=48)
+ LD A,(HL)
+ OR A ;CP 0
+ RET Z
+ SUB B
+ LD BC,#cpc_Chars8 ;apunto a la primera letra
+ PUSH HL
+ LD L,A
+ LD H,#0
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,BC
+ CALL escribe_letra_gpstd
+ LD HL,(#direcc_destino)
+
+ LD DE,#letra_decodificada
+ CALL cpc_PutSp0_gpstd
+ LD HL,(#direcc_destino)
+ INC HL
+ INC HL
+ LD (#direcc_destino),HL
+ POP HL
+ INC HL
+ JP bucle_texto0
+
+imprimiendo:
+ .db #0
+direcc_destino:
+ .dw #0
+
+
+cpc_PutSp0_gpstd:
+ .DB #0XFD
+ LD H,#8
+ LD B,#7
+ LD C,B
+loop_alto_2_gpstd:
+loop_ancho_2_gpstd:
+ EX DE,HL
+ LDI
+ LDI
+ .DB #0XFD
+ DEC H
+ RET Z
+ EX DE,HL
+salto_linea_gpstd:
+ LD C,#0XFE
+ ADD HL,BC
+ JP NC,loop_alto_2_gpstd
+ LD BC,#0XC050
+ ADD HL,BC
+ LD B,#7
+ JP loop_alto_2_gpstd
+
+
+
+escribe_letra_gpstd: ;; lee el byte y lo interpreta
+ LD IY,#letra_decodificada
+ LD B,#8
+bucle_alto_gpstd:
+ PUSH BC ;leo el byte... ahora se miran sus bits y se rellena el caracter a imprimir
+ XOR A
+ LD B,(HL)
+ BIT 7,B
+ JP Z,cc0_gpstd
+ OR #0b10001000
+cc0_gpstd:
+ BIT 6,B
+ JP Z,cc1_gpstd
+ OR #0b01000100
+cc1_gpstd:
+ BIT 5,B
+ JP Z,cc2_gpstd
+ OR #0b00100010
+cc2_gpstd:
+ BIT 4,B
+ JP Z,cc3_gpstd
+ OR #0b00010001
+cc3_gpstd:
+ ;primer byte
+ LD 0 (IY),A
+ INC IY
+ XOR A
+ BIT 3,B
+ JP Z,cc4_gpstd
+ OR #0b10001000
+cc4_gpstd:
+ BIT 2,B
+ JP Z,cc5_gpstd
+ OR #0b01000100
+cc5_gpstd:
+ BIT 1,B
+ JP Z,cc6_gpstd
+ OR #0b00100010
+cc6_gpstd:
+ BIT 0,B
+ JP Z,cc7_gpstd
+ OR #0b00010001
+cc7_gpstd:
+ ;segundo byte
+ LD 0 (IY),A
+ INC IY
+ INC HL
+ POP BC
+ DJNZ bucle_alto_gpstd
+ RET
+
+
+
+byte_tmp: ;DEFS 2
+ .DB #0,#0
+letra_decodificada:
+ .DB #0,#0,#0,#0,#0,#0,#0,#0 ;DEFS 16
+ .DB #0,#0,#0,#0,#0,#0,#0,#0 ;USO ESTE ESPACIO PARA GUARDAR LA LETRA QUE SE DECODIFICA
+
+;DEFC direcc_destino0s_m1 = direcc_destino
+
+first_char8:
+ .DB #32 ;first defined char number (ASCII)
+cpc_Chars8: ;each bit of each byte is a pixel,#same way as SYMBOL function of Locomotive BASIC.
+ ;; KEY SET BY ANJUEL & NA_TH_AN FROM NANAKO CPC GAME.
+ .DB #0,#0,#0,#0,#0,#0,#0,#0
+ .DB #28,#8,#8,#8,#28,#0,#8,#0
+ .DB #10,#10,#0,#0,#0,#0,#0,#0
+ .DB #36,#126,#36,#36,#36,#126,#36,#0
+ .DB #16,#62,#32,#60,#4,#124,#8,#0
+ .DB #0,#50,#52,#8,#22,#38,#0,#0
+ .DB #0,#16,#40,#58,#68,#58,#0,#0
+ .DB #16,#16,#0,#0,#0,#0,#0,#0
+ .DB #16,#112,#80,#64,#80,#112,#16,#0
+ .DB #8,#14,#10,#2,#10,#14,#8,#0
+ .DB #0,#42,#28,#28,#42,#0,#0,#0
+ .DB #0,#8,#8,#62,#8,#8,#0,#0
+ .DB #0,#0,#0,#0,#12,#12,#0,#0
+ .DB #0,#0,#0,#62,#0,#0,#0,#0
+ .DB #0,#0,#0,#0,#12,#12,#16,#0
+ .DB #0,#4,#8,#16,#32,#64,#0,#0
+ .DB #62,#34,#34,#34,#34,#34,#62,#0
+ .DB #12,#4,#4,#4,#4,#4,#4,#0
+ .DB #62,#34,#2,#62,#32,#34,#62,#0
+ .DB #62,#36,#4,#28,#4,#36,#62,#0
+ .DB #32,#32,#36,#62,#4,#4,#14,#0
+ .DB #62,#32,#32,#62,#2,#34,#62,#0
+ .DB #62,#32,#32,#62,#34,#34,#62,#0
+ .DB #62,#36,#4,#4,#4,#4,#14,#0
+ .DB #62,#34,#34,#62,#34,#34,#62,#0
+ .DB #62,#34,#34,#62,#2,#34,#62,#0
+ .DB #0,#24,#24,#0,#0,#24,#24,#0
+ .DB #0,#24,#24,#0,#0,#24,#24,#32
+ .DB #4,#8,#16,#32,#16,#8,#4,#0
+ .DB #0,#0,#126,#0,#0,#126,#0,#0
+ .DB #32,#16,#8,#4,#8,#16,#32,#0
+ .DB #64,#124,#68,#4,#28,#16,#0,#16
+ .DB #0,#56,#84,#92,#64,#60,#0,#0
+ .DB #126,#36,#36,#36,#60,#36,#102,#0
+ .DB #124,#36,#36,#62,#34,#34,#126,#0
+ .DB #2,#126,#66,#64,#66,#126,#2,#0
+ .DB #126,#34,#34,#34,#34,#34,#126,#0
+ .DB #2,#126,#66,#120,#66,#126,#2,#0
+ .DB #2,#126,#34,#48,#32,#32,#112,#0
+ .DB #2,#126,#34,#32,#46,#36,#124,#0
+ .DB #102,#36,#36,#60,#36,#36,#102,#0
+ .DB #56,#16,#16,#16,#16,#16,#56,#0
+ .DB #28,#8,#8,#8,#8,#40,#56,#0
+ .DB #108,#40,#40,#124,#36,#36,#102,#0
+ .DB #112,#32,#32,#32,#34,#126,#2,#0
+ .DB #127,#42,#42,#42,#42,#107,#8,#0
+ .DB #126,#36,#36,#36,#36,#36,#102,#0
+ .DB #126,#66,#66,#66,#66,#66,#126,#0
+ .DB #126,#34,#34,#126,#32,#32,#112,#0
+ .DB #126,#66,#66,#74,#126,#8,#28,#0
+ .DB #126,#34,#34,#126,#36,#36,#114,#0
+ .DB #126,#66,#64,#126,#2,#66,#126,#0
+ .DB #34,#62,#42,#8,#8,#8,#28,#0
+ .DB #102,#36,#36,#36,#36,#36,#126,#0
+ .DB #102,#36,#36,#36,#36,#24,#0,#0
+ .DB #107,#42,#42,#42,#42,#42,#62,#0
+ .DB #102,#36,#36,#24,#36,#36,#102,#0
+ .DB #102,#36,#36,#60,#8,#8,#28,#0
+ .DB #126,#66,#4,#8,#16,#34,#126,#0
+ .DB #4,#60,#36,#32,#36,#60,#4,#0
+ .DB #0,#64,#32,#16,#8,#4,#0,#0
+ .DB #32,#60,#36,#4,#36,#60,#32,#0
+ .DB #0,#16,#40,#68,#0,#0,#0,#0
+ .DB #0,#0,#0,#0,#0,#0,#0,#0
+ .DB #0,#100,#104,#16,#44,#76,#0,#0
+ .DB #126,#36,#36,#36,#60,#36,#102,#0
+ .DB #124,#36,#36,#62,#34,#34,#126,#0
+ .DB #2,#126,#66,#64,#66,#126,#2,#0
+ .DB #126,#34,#34,#34,#34,#34,#126,#0
+ .DB #2,#126,#66,#120,#66,#126,#2,#0
+ .DB #2,#126,#34,#48,#32,#32,#112,#0
+ .DB #2,#126,#34,#32,#46,#36,#124,#0
+ .DB #102,#36,#36,#60,#36,#36,#102,#0
+ .DB #56,#16,#16,#16,#16,#16,#56,#0
+ .DB #28,#8,#8,#8,#8,#40,#56,#0
+ .DB #108,#40,#40,#124,#36,#36,#102,#0
+ .DB #112,#32,#32,#32,#34,#126,#2,#0
+ .DB #127,#42,#42,#42,#42,#107,#8,#0
+ .DB #126,#36,#36,#36,#36,#36,#102,#0
+ .DB #126,#66,#66,#66,#66,#66,#126,#0
+ .DB #126,#34,#34,#126,#32,#32,#112,#0
+ .DB #126,#66,#66,#74,#126,#8,#28,#0
+ .DB #126,#34,#34,#126,#36,#36,#114,#0
+ .DB #126,#66,#64,#126,#2,#66,#126,#0
+ .DB #34,#62,#42,#8,#8,#8,#28,#0
+ .DB #102,#36,#36,#36,#36,#36,#126,#0
+ .DB #102,#36,#36,#36,#36,#24,#0,#0
+ .DB #107,#42,#42,#42,#42,#42,#62,#0
+ .DB #102,#36,#36,#24,#36,#36,#102,#0
+ .DB #102,#36,#36,#60,#8,#8,#28,#0
+ .DB #126,#66,#4,#8,#16,#34,#126,#0
+ .DB #4,#60,#36,#96,#96,#36,#60,#4
+ .DB #0,#16,#16,#16,#16,#16,#16,#0
+ .DB #32,#60,#36,#6,#6,#36,#60,#32
+ .DB #0,#0,#16,#40,#68,#0,#0,#0
+ .DB #126,#66,#90,#82,#90,#66,#126,#0 \ No newline at end of file