| |
jamiefuller Account closed
Registered: Mar 2018 Posts: 25 |
Generate better looking chars from ROM
Hi All,
I'm trying to create a font using the smallest amount of ram possible, It doesn't have to be the best font in the world but just something that looks at least a little different from the standard font.
This is the best I have come up with so far (71 bytes), it copies the font from ROM and "translates" parts of the font to make it look slightly different.
*=$0900
main
inc $DC0E
lda $01
and #$fb
sta $01
ldy #$01
@lp1 ldx #$00
@lp2 lda $d000,x
cmp #$76
bne *+4
lda #$7A
cmp #$60
bne *+4
lda #$70
cmp #$66
bne *+4
lda #$72
cmp #$6C
bne *+4
lda #$74
cmp #$6e
bne *+4
lda #$76
@lp3 sta $3000,x
inx
bne @lp2
inc @lp2+2
inc @lp3+2
dey
bpl @lp1
lda $01
ora #$04
sta $01
dec $DC0E
rts
Any suggestions for improving/reducing size? |
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
lda $d000,x
cmp #$40
bcc +
ora #$10
+ sta $3000,x |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Looks a bit like, but better than the one I used in the end part of Incoherent Nightmare
The code was also much simpler. This fetched one char from ROM to a sprite:
ldx #$07
!:
load: lda $d008,x
sta tmp
asl
and #$f0
ora tmp
sta (txtDestPnt),y
dey
dey
dey
dex
bpl !-
|
| |
Repose
Registered: Oct 2010 Posts: 225 |
Funny, I was just thinking about this! I want to morph the ROM into a half-sized charset. I wonder if I could just pick 3 columns from it... |
| |
jamiefuller Account closed
Registered: Mar 2018 Posts: 25 |
Thank you Micropenis and Cruzer!
those are both great methods.
Both of the suggested methods are 24 bytes smaller than my original code.
I've tried all 3 and generated an example below of the font created, would love to hear a vote on peoples favourite? Top, Middle or bottom?
|
| |
Tao
Registered: Aug 2002 Posts: 115 |
Some of my TRIAD-intros (such as TRIAD "Tao intro 1") use a modified version of the ROM-font. |
| |
Freddie
Registered: Jan 2004 Posts: 71 |
Quote: Thank you Micropenis and Cruzer!
those are both great methods.
Both of the suggested methods are 24 bytes smaller than my original code.
I've tried all 3 and generated an example below of the font created, would love to hear a vote on peoples favourite? Top, Middle or bottom?
I vote for number 3, looks really good. |
| |
jamiefuller Account closed
Registered: Mar 2018 Posts: 25 |
I've made a small tweak to my code and have come up with this, using the smaller two generation routines even after re-writing and adding my tweak its still smaller than my original code (by 5 bytes)
|
| |
lft
Registered: Jul 2007 Posts: 369 |
Of the three examples in post #5, the top one is my favourite. Compare the M's in "COMMODORE" for instance.
Anyway, this should totally be a compo. |
| |
Compyx
Registered: Jan 2005 Posts: 631 |
Too bad about the 'small size' requirement. I'd just pixel a charset and then write a script generating "LDA $Dxxx: EOR #$xx: STA $2xxx" for every byte in the charset that's different.
Could even optimize it a bit, using multiple STA's for the same value.
Worst case scenario is 8 bytes of code for each byte of charset, plus 1 for RTS. |
| |
spider-j
Registered: Oct 2004 Posts: 498 |
Compyx: that is indeed an interesting approach. Especially as the code generation could be automated with a crossdev tool. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
cruzer already won that compo if both size and niceness is considered, imho :) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
Quote: Funny, I was just thinking about this! I want to morph the ROM into a half-sized charset. I wonder if I could just pick 3 columns from it...
you could do it just as my code does, but with more cmp's
cmp #$40 checks if bit #$40 is set if yes C is set then set according column bit in the result etc etc. just take a column from both sides and one from middle. |
| |
Shadow Account closed
Registered: Apr 2002 Posts: 355 |
Quote: Of the three examples in post #5, the top one is my favourite. Compare the M's in "COMMODORE" for instance.
Anyway, this should totally be a compo.
The problem with a compo is that you have two dimensions - size and how good the font looks.
Perhaps having a fixed size limit like 64 or 128 bytes code, and then see who can come up with the nicest looking font could work? |
| |
Glasnost Account closed
Registered: Aug 2011 Posts: 26 |
@jamiefuller:
Your code can be better in 2 ways:
1.(-4 bytes) No need for
lda $01
and #$fb
sta $01
unless it runs while the datasette is loading :)
just..
lda #$33 (#$37 later)
sta $01
2. (-1 byte) by using the "illegal" opcodes dcp or isc in the loop to cancel use of y. dcp and isc are usefull for looping in some cases.
Illegal opcode ref:
http://www.oxyron.de/html/opcodes02.html |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Quoting lftAnyway, this should totally be a compo. Agree. We have way too few coding compos. I would definitely do some experiments, and compete if anything good came out of that. |
| |
Compyx
Registered: Jan 2005 Posts: 631 |
Setting rules will be difficult, the code-size restriction is simple: less code: more 'points'.
But what constitutes a 'better looking charset', how does one weigh that against the code size? |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Just set a sensible code size like 128b and let the voters decide. |
| |
4mat
Registered: May 2010 Posts: 66 |
I remember a while ago making the classic 'data 70' font out of the rom font in code. Can't remember if that was for a competition or something else. Anyway if you're looking for a target style that might be useful. |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
"Data Seventy is a high-tech style font, with the look of old computer lettering. Data Seventy gives any text a futuristic appearance."
Not so sure if the prefix "retro" should be there in front of "futuristic". :) |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Retrofuturism is a thing. |