mirror of
https://github.com/KarolS/millfork.git
synced 2024-08-16 20:28:54 +00:00
202 lines
4.1 KiB
Plaintext
202 lines
4.1 KiB
Plaintext
#if ENCODING_SAME
|
|
|
|
#if ARCH_6502
|
|
inline asm byte __byte_identity(byte register(a) value) { ? rts }
|
|
inline asm void __pointer_to_void(pointer register(ax) value) { ? rts }
|
|
#elseif ARCH_I80
|
|
#pragma zilog_syntax
|
|
inline asm byte __byte_identity(byte register(a) value) { ? ret }
|
|
inline asm void __pointer_to_void(pointer register(hl) value) { ? ret }
|
|
#elseif ARCH_M6809
|
|
inline asm byte __byte_identity(byte register(b) value) { ? rts }
|
|
inline asm void __pointer_to_void(pointer register(d) value) { ? rts }
|
|
#else
|
|
inline byte __byte_identity(byte value) = a
|
|
inline void __pointer_to_void(pointer value) { }
|
|
#endif
|
|
|
|
alias from_screencode = __byte_identity
|
|
alias to_screencode = __byte_identity
|
|
alias strz_from_screencode = __pointer_to_void
|
|
alias strz_to_screencode = __pointer_to_void
|
|
alias pstr_from_screencode = __pointer_to_void
|
|
alias pstr_to_screencode = __pointer_to_void
|
|
|
|
#elseif ENCCONV_SUPPORTED
|
|
|
|
alias from_screencode = __from_screencode
|
|
alias to_screencode = __to_screencode
|
|
|
|
|
|
#if ARCH_6502
|
|
void strz_from_screencode(pointer p) {
|
|
asm {
|
|
? LDY #0
|
|
__strz_from_screencode__loop:
|
|
LDA (p),Y
|
|
? CMP #nullchar_scr
|
|
? BEQ __strz_from_screencode__end
|
|
? JSR from_screencode
|
|
? STA (p),Y
|
|
? INY
|
|
? JMP __strz_from_screencode__loop
|
|
__strz_from_screencode__end:
|
|
? LDA #nullchar
|
|
? STA (p),Y
|
|
}
|
|
}
|
|
void strz_to_screencode(pointer p) {
|
|
asm {
|
|
? LDY #0
|
|
__strz_to_screencode__loop:
|
|
LDA (p),Y
|
|
? CMP #nullchar
|
|
? BEQ __strz_to_screencode__end
|
|
? JSR to_screencode
|
|
? STA (p),Y
|
|
? INY
|
|
? JMP __strz_to_screencode__loop
|
|
__strz_to_screencode__end:
|
|
? LDA #nullchar_scr
|
|
? STA (p),Y
|
|
}
|
|
}
|
|
#else
|
|
void strz_from_screencode(pointer p) {
|
|
while true {
|
|
if p[0] == nullchar_scr {
|
|
p[0] = nullchar
|
|
return
|
|
}
|
|
p[0] = from_screencode(p[0])
|
|
p += 1
|
|
}
|
|
}
|
|
void strz_to_screencode(pointer p) {
|
|
while true {
|
|
if p[0] == nullchar {
|
|
p[0] = nullchar_scr
|
|
return
|
|
}
|
|
p[0] = to_screencode(p[0])
|
|
p += 1
|
|
}
|
|
}
|
|
|
|
void pstr_from_screencode(pointer p) {
|
|
byte i, l
|
|
l = p[0]
|
|
for i,1,parallelto,l {
|
|
p[i] = from_screencode(p[i])
|
|
}
|
|
}
|
|
void pstr_to_screencode(pointer p) {
|
|
byte i, l
|
|
l = p[0]
|
|
for i,1,parallelto,l {
|
|
p[i] = to_screencode(p[i])
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif // ENCODING_SAME/ENCCONV_SUPPORTED
|
|
|
|
|
|
// conversions for particular encoding pairs:
|
|
|
|
#if ARCH_6502
|
|
|
|
asm byte petscii_to_petscr(byte register(a) char) {
|
|
cmp #$20
|
|
bcc __petscii_to_petscr_ddRev
|
|
cmp #$60
|
|
bcc __petscii_to_petscr_dd1
|
|
cmp #$80
|
|
bcc __petscii_to_petscr_dd2
|
|
cmp #$a0
|
|
bcc __petscii_to_petscr_dd3
|
|
cmp #$c0
|
|
bcc __petscii_to_petscr_dd4
|
|
cmp #$ff
|
|
bcc __petscii_to_petscr_ddRev
|
|
lda #$5e
|
|
rts
|
|
__petscii_to_petscr_dd2:
|
|
and #$5f
|
|
rts
|
|
__petscii_to_petscr_dd3:
|
|
ora #$40
|
|
rts
|
|
__petscii_to_petscr_dd4:
|
|
eor #$c0
|
|
rts
|
|
__petscii_to_petscr_dd1:
|
|
and #$3f
|
|
rts
|
|
__petscii_to_petscr_ddRev:
|
|
eor #$80
|
|
rts
|
|
}
|
|
|
|
asm byte petscr_to_petscii(byte register(a) char) {
|
|
cmp #$20
|
|
bcs __petscr_to_petscii_40
|
|
ora #$40
|
|
rts
|
|
__petscr_to_petscii_40:
|
|
cmp #$40
|
|
bcs __petscr_to_petscii_60
|
|
rts
|
|
__petscr_to_petscii_60:
|
|
cmp #$60
|
|
bcs __petscr_to_petscii_80
|
|
eor #$80
|
|
rts
|
|
__petscr_to_petscii_80:
|
|
cmp #$80
|
|
bcs __petscr_to_petscii_a0
|
|
eor #$c0
|
|
rts
|
|
__petscr_to_petscii_a0:
|
|
cmp #$a0
|
|
bcs __petscr_to_petscii_c0
|
|
eor #$80
|
|
rts
|
|
__petscr_to_petscii_c0:
|
|
eor #$40
|
|
rts
|
|
}
|
|
|
|
asm byte atascii_to_atasciiscr(byte register(a) char) {
|
|
and #$7f
|
|
cmp #$20
|
|
bcs __atascii_to_atasciiscr_60
|
|
ora #$40
|
|
rts
|
|
__atascii_to_atasciiscr_60:
|
|
cmp #$60
|
|
bcs __atascii_to_atasciiscr_end
|
|
sec
|
|
sbc #$20
|
|
__atascii_to_atasciiscr_end:
|
|
rts
|
|
}
|
|
|
|
|
|
asm byte atasciiscr_to_atascii(byte register(a) char) {
|
|
and #$7f
|
|
cmp #$40
|
|
bcs __atascii_to_atasciiscr_60
|
|
clc
|
|
adc #$20
|
|
rts
|
|
__atascii_to_atasciiscr_60:
|
|
cmp #$60
|
|
bcs __atascii_to_atasciiscr_end
|
|
and #$1f
|
|
__atascii_to_atasciiscr_end:
|
|
rts
|
|
}
|
|
|
|
#endif |