Mostre suas fontes customizadas na tela do MSX
No artigo anterior aprendemos como extrair o padrão de fonte padrão de uma máquina MSX para a ferramenta TinySprite para que pudéssemos mudar o design e criar nossa própria fonte pessoal chique demais, mas todo esse conhecimento é inútil se não soubermos como trazer essa peça incrível da arte moderna de volta à nossa amada máquina, não é mesmo?
Para mostrar esse processo eu queria criar algo legal para mostrar o quão incrível uma fonte bem projetada pode melhorar jogos e programas, então aproveitei a oportunidade para usar o sensacional livro “Arcade Game Typography” que estava esperando na minha estante há um certo tempo.
Embora termos extraído todos os números, caracteres maiúsculos e minúsculos e alguns símbolos especiais, procurei um padrão especial que pudesse causar algum impacto, mesmo que não fornecesse todos os caracteres e símbolos. O escolhido foi de um jogo de arcade que eu ainda amo jogar mas nunca dominei devido a sua jogabilidade desafiadora: Shinobi
Com o TinySprite aberto e a fonte padrão carregada, tudo o que eu precisava fazer era apertar os olhos na página do livro e tentar replicar o padrão no campo quadriculado de cada slot. Demorou apenas algumas horas, mas o trabalho foi meio relaxante, para ser honesto! Infelizmente, esta tipografia tem apenas números e letras maiúsculas, então as letras minúsculas e os símbolos permanecerão os mesmos.
Com o padrão de caracteres pronto e parecendo impressionantemente nada mal, tudo que eu tinha que fazer era clicar em “Export Sprites”, selecionar “ASM Hexa” no campo “Export as” e copiar tudo para a área de transferência. Salvei os dados em um arquivo local apenas para ter certeza e também gerei um backup do meu trabalho para poder alterá-lo ainda mais no futuro, se necessário. Talvez eu também possa mudar as letras minúsculas se tiver coragem para isso.
Temos os dados, agora precisamos do programa
O código para carregar os dados do padrão de volta no MSX VRAM não é nada complicado. Eu adicionei uma rotina para imprimir todos os números e letras maiúsculas para que pudesse mostrar os resultados após a execução do programa, e também uma mensagem apenas por diversão!
CHGMOD: equ 0x005f ;Muda o modo de tela LDIRVM: equ 0x005C ;Função : Transferência de bloco para VRAM da memória ;Entrada : BC - Comprimento do bloco ; DE - Endereço inicial da VRAM ; HL - Endereço inicial da memória CHPUT: equ 0x00a2 ;Mostra o conteúdo apontado por A na tela org 0xC000 ;Alocando o programa no slot 3 start: ld a,1 ;Carregamos 1 em A chama CHGMOD ;depois chama CHGMOD para alterar to Screen 1 ld hl,ninjaFont ;aponta HL para a posição de memória da fonte ld de,0x8*48 ;depois carrega em DE o destino na VRAM ld bc,8*70 ;e em BC a quantidade de bytes a serem copiados chama LDIRVM ;terminando com a rotina que copia os bytes BC ;da posição HL na RAM para a ;posição DE na VRAM ;A partir deste ponto o padrão é carregado ;na VRAM, e você pode usá-lo normalmente mainloop: ;Vamos definir um loop para exibir a fonte agora ld b,26 ;carregando 26 em B = quantidade de caracteres para imprimir ld c,65 ;e 65 em C = código decimal da letra A chame printChars ;então chamamos a rotina printChars ld a," \r" ;Adicionamos um código de "retorno" em A call CHPUT ;e o imprimimos para mover o cursor para o ;início da linha ld a,"\n" ;A seguir carregamos uma "próxima linha" em A call CHPUT ;e imprima para mova o cursor para baixo ld b,10 ;Agora podemos carregar 10 em B = quantidade de números ld c,48 ;e 48 em C = código decimal do número 0 chame printChars ;depois imprimimos os números de 0 a 9 ld a ,"\r" ;Adicionamos um código de "retorno" em A call CHPUT ;e imprimimos para mover o cursor para o ;início da linha ld a,"\n" ;A seguir carregamos uma "próxima linha" em A chame CHPUT ;e imprima para mover o cursor para baixo ld hl,message ;e terminamos carregando nossa mensagem em HL chame printMessage ;e chame printMessage para mostrar o texto ret ;retornando para BASIC depois disso printChars: ld a,c ; Carregamos a posição apontada por C em A chamada CHPUT ;e chamamos a rotina para mostrá-la na tela INC C ;então incrementamos C para a próxima posição djnz printChars ;próximo djnz diminui B e volta para ;o início desta rotina até B = 0 ret ;que retorna o programa de volta ao mainloop printMessage: ld a,(hl) ;Para imprimir a mensagem carregamos o conteúdo de HL ;em A cp 0 ;Comparamos A com 0, que é nosso EOF ret z ; e retorne t o mainloop se o sinalizador Zero levantar chama CHPUT ;caso contrário chamamos CHPUT para imprimir o caractere inc hl ;então aumentamos HL para a próxima posição jr printMessage ;e repetimos a rotina até que 0 seja carregado em A ninjaFont: ;Copiado da exportação TinySprite opção; --- 0123 ;cada linha DB é referente a um char ; cor 1 ;e a cor aqui não importa DB $0E,$19,$31,$31,$31,$33,$3F,$1E ;Número 0 DB $06,$0E,$3C,$0C,$08,1TP3Number $38,$8 ; $1C,$36,$22,$06,$0C,$31,$7E,$7C ;Número 2 DB $1C,$36,$22,$0C,$02,$46,$7C,$38 ;Número 3 ; ;e assim por diante... ; --- 4567 ; color 1 DB $0C,$0C,$1A,$12,$64,$7F,$1E,$38 DB $26,$1F,$10,$3E,$33,$03,$7E,$38 DB $0E,$18,$30,$3C,$66,$46,$7C,$38 DB $42,$7F,$33,$04,$0C,$18,$38,$38; ; --- 89:; ; color 1 DB $1C,$3F,$26,$18,$24,$66,$7E,$3C DB $3C,$67,$67,$3E,$0C,$18,$38,$38 DB $00,$00,$20,$00,$00,$20,$00,$00 DB $00,$00,$20,$00,$00,$20,$20,$40; ; --- <>=? ; color 1 DB $18,$30,$60,$C0,$60,$30,$18,$00 DB $00,$00,$F8,$00,$F8,$00,$00,$00 DB $C0,$60,$30,$18,$30,$60,$C0,$00 DB $70,$88,$08,$10,$20,$00,$20,$00; ; --- @ABC ; color 1 DB $70,$88,$08,$68,$A8,$A8,$70,$00 DB $02,$06,$06,$4A,$73,$3B,$67,$66 DB $3E,$13,$16,$5C,$76,$33,$67,$7E DB $0C,$1A,$32,$20,$61,$62,$76,$3C; ; --- DEFG ; color 1 DB $3C,$12,$11,$51,$71,$23,$7E,$78 DB $23,$3E,$10,$5C,$70,$21,$67,$7C DB $43,$7E,$10,$52,$7C,$24,$60,$70 DB $0C,$1A,$32,$20,$67,$62,$76,$3C; ; --- HIJK; color 1 DB $31,$11,$12,$52,$7E,$22,$6E,$67 DB $06,$02,$04,$04,$2C,$1C,$18,$18 DB $07,$02,$02,$46,$24,$64,$6C,$38 DB $41,$31,$13,$26,$38,$6E,$67,$63; ; --- LMNO ; color 1 DB $18,$08,$10,$10,$30,$60,$7F,$76 DB $61,$33,$15,$29,$2A,$62,$67,$63 DB $61,$31,$13,$2A,$26,$62,$67,$63 DB $3E,$13,$21,$21,$61,$62,$3E,$18; ; --- PQRS ; color 1 DB $6E,$33,$11,$51,$72,$3C,$60,$60 DB $0E,$13,$21,$21,$65,$62,$7F,$39 DB $6E,$33,$11,$53,$7E,$28,$66,$63 DB $0E,$13,$11,$4C,$26,$63,$73,$3E; ; --- TUVW ; color 1 DB $67,$3E,$10,$10,$30,$60,$60,$60 DB $63,$31,$11,$21,$21,$62,$7E,$3C DB $61,$31,$13,$22,$24,$68,$70,$60 DB $63,$21,$29,$69,$6B,$7A,$7E,$34; ; --- XYZ[; color 1 DB $31,$11,$0A,$0C,$3C,$76,$67,$63 DB $31,$11,$1A,$0C,$0C,$18,$18,$18 DB $33,$1E,$04,$08,$10,$71,$7F,$66 DB $0E,$08,$08,$08,$08,$08,$0E,$00 ; ; --- \^]_ ; color 1 DB $00,$00,$80,$40,$20,$10,$08,$00 DB $70,$10,$10,$10,$10,$10,$70,$00 DB $20,$50,$88,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$F8,$00 ; ; --- `abc ; color 1 DB $40,$20,$10,$00,$00,$00,$00,$00 DB $00,$00,$70,$08,$78,$88,$78,$00 DB $80,$80,$B0,$C8,$88,$C8,$B0,$00 DB $00,$00,$70,$88,$80,$88,$70,$00; ; --- defg; color 1 DB $08,$08,$68,$98,$88,$98,$68,$00 DB $00,$00,$70,$88,$F8,$80,$70,$00 DB $10,$28,$20,$F8,$20,$20,$20,$00 DB $00,$00,$68,$98,$98,$68,$08,$70; ; --- hijk ; color 1 DB $80,$80,$F0,$88,$88,$88,$88,$00 DB $20,$00,$60,$20,$20,$20,$70,$00 DB $10,$00,$30,$10,$10,$10,$90,$60 DB $40,$40,$48,$50,$60,$50,$48,$00; ; --- lmno ; color 1 DB $60,$20,$20,$20,$20,$20,$70,$00 DB $00,$00,$D0,$A8,$A8,$A8,$A8,$00 DB $00,$00,$B0,$C8,$88,$88,$88,$00 DB $00,$00,$70,$88,$88,$88,$70,$00; ; --- pqrs; color 1 DB $00,$00,$B0,$C8,$C8,$B0,$80,$80 DB $00,$00,$68,$98,$98,$68,$08,$08 DB $00,$00,$B0,$C8,$80,$80,$80,$00 DB $00,$00,$78,$80,$F0,$08,$F0,$00 ; ; --- tuvw ; color 1 DB $40,$40,$F0,$40,$40,$48,$30,$00 DB $00,$00,$90,$90,$90,$90,$68,$00 DB $00,$00,$88,$88,$88,$50,$20,$00 DB $00,$00,$88,$A8,$A8,$A8,$50,$00; ; --- xyz ; color 1 DB $00,$00,$88,$50,$20,$50,$88,$00 DB $00,$00,$88,$88,$98,$68,$08,$70 DB $00,$00,$F8,$10,$20,$40,$F8,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 mensagem: ; Então definimos nossa mensagem aqui com o \r\n for like break db "\nTODO MUNDO ERA KUNG-FU \r\nFIGHTING\r\n\n" db "\t--- HUH!---\r\n \n" db "\nAQUELES GATOS ERAM RÁPIDOS COMO\r\nILUMINANDO\r\n\n" db "\t--- HA! ---\r\n\n",0 end start ; e isso termina o código
Você pode rodar o programa diretamente so site MSXPen através desse link, e removendo as rotinas mainloop, printchar e printmessage permitirá que você carregue o design da fonte em sua máquina e use os caracteres em programas BASIC. Isso não é bacana?
Terminamos com esse negócio de fontes?
Quase! No próximo artigo, mostrarei como definir cores para as fontes e qualquer outro truque legal que eu possa aprender até então. Enquanto isso, divirta-se com a fonte ninja!
Relacionado
No artigo anterior aprendemos como extrair o padrão de fonte padrão de uma máquina MSX para a ferramenta TinySprite para que pudéssemos mudar o design e criar nossa própria fonte pessoal, mas todo esse conhecimento é inútil se não soubermos como traga de volta aquela incrível obra de arte moderna…