begin implementing routine to print packed messages
This commit is contained in:
1 parent
c670ad212d
commit
8cd68452c1
1 file changed
+157
@@ -0,0 +1,157 @@
|
||||
;; This routine prints messages that have been packed
|
||||
;; using the make_error_tables program.
|
||||
;; The general idea is to save space in the ROM.
|
||||
|
||||
;; The output of make_error_tables is written to packed_messages.s, and
|
||||
;; contains the following:
|
||||
;;
|
||||
;; packed_message_words - List of nybl packed words.
|
||||
;; packed_message_tokens - List of tokens that get joined to make messages
|
||||
;; packed_message_chars - List of characters in messages sorted by frequency.
|
||||
|
||||
print_packed_message:
|
||||
;; X = message number
|
||||
|
||||
lda #$ff
|
||||
ldy #$ff
|
||||
packed_message_search:
|
||||
iny
|
||||
cpx #$00
|
||||
beq found_message_in_token_stream
|
||||
lda packed_message_tokens,y
|
||||
cmp #$ff
|
||||
bne +
|
||||
dex
|
||||
*
|
||||
cpy #$ff
|
||||
bne packed_message_search
|
||||
;; Could not find message
|
||||
sec
|
||||
rts
|
||||
|
||||
found_message_in_token_stream:
|
||||
;; Now print each word in the message
|
||||
tya
|
||||
pha
|
||||
lda packed_message_tokens,y
|
||||
cmp #$ff
|
||||
beq +
|
||||
jsr print_packed_word
|
||||
lda #$20
|
||||
jsr $ffd2
|
||||
pla
|
||||
tay
|
||||
iny
|
||||
bne found_message_in_token_stream
|
||||
*
|
||||
rts
|
||||
|
||||
print_packed_word:
|
||||
;; A = the word to print
|
||||
tax
|
||||
|
||||
;; Find the word in the list
|
||||
ldy #$ff
|
||||
packed_word_search:
|
||||
cpx #$00
|
||||
beq found_packed_word
|
||||
iny
|
||||
lda packed_message_words,y
|
||||
and #$0f
|
||||
cmp #$00
|
||||
bne +
|
||||
dex
|
||||
*
|
||||
cpy #$ff
|
||||
bne packed_word_search
|
||||
;; Could not find word
|
||||
sec
|
||||
rts
|
||||
|
||||
found_packed_word:
|
||||
inc $0427
|
||||
|
||||
;; Y = offset into packed word data - 1
|
||||
iny
|
||||
|
||||
;; Check for end of word
|
||||
lda packed_message_words,y
|
||||
cmp #$00
|
||||
beq done_printing_word
|
||||
and #$f0
|
||||
beq done_printing_word
|
||||
|
||||
;; Check if it is an uncommon char
|
||||
lda packed_message_words,y
|
||||
and #$f0
|
||||
cmp #$f0
|
||||
beq is_uncommon_char
|
||||
|
||||
;; Is not an uncommon char, so get char of upper nybl
|
||||
lda packed_message_words,y
|
||||
|
||||
;; Put high nybl into low bits of X
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
tax
|
||||
|
||||
;; Save Y so it doesn't get clobbered by $FFD2
|
||||
tya
|
||||
pha
|
||||
|
||||
;; X=1-14 = first 14 chars, so subtract one
|
||||
lda packed_message_chars-1,x
|
||||
jsr $FFD2
|
||||
inc $426
|
||||
|
||||
;; See if there is a char in the low nybl to print
|
||||
pla
|
||||
tay
|
||||
lda packed_message_words,y
|
||||
and #$0f
|
||||
beq no_lo_nybl_char
|
||||
cmp #$0f
|
||||
beq no_lo_nybl_char
|
||||
|
||||
has_lo_nybl_char:
|
||||
;; We need to print the low nybl char as well
|
||||
tax
|
||||
tya
|
||||
pha
|
||||
|
||||
;; Skip lower nybls of $F or $0 in nybl packed
|
||||
;; bytes, as these do not encode characters
|
||||
cpx #$f
|
||||
beq +
|
||||
cpx #0
|
||||
beq +
|
||||
|
||||
;; X=1-14 = first 14 chars, so subtract one
|
||||
lda packed_message_chars-1,x
|
||||
jsr $FFD2
|
||||
inc $426
|
||||
*
|
||||
pla
|
||||
tay
|
||||
cpy #$ff
|
||||
;; FALL THROUGH
|
||||
|
||||
no_lo_nybl_char:
|
||||
|
||||
bne found_packed_word
|
||||
;; Hit end of packed data
|
||||
rts
|
||||
|
||||
is_uncommon_char:
|
||||
;; Lower nybl has offset into low-frequency part of the table
|
||||
|
||||
lda packed_message_words,y
|
||||
and #$0f
|
||||
clc
|
||||
adc #14
|
||||
jmp has_lo_nybl_char
|
||||
|
||||
done_printing_word:
|
||||
rts
|
||||
Reference in new issue
Block a user