added code to display dictionary compressed strings
This commit is contained in:
1 parent
d3fdc6cc59
commit
3b4d1345db
13 files changed
+202
-78
No files matched your search
@@ -178,15 +178,15 @@ updatebin:
|
||||
|
||||
$(TOOL_PNGPREPARE): tools/pngprepare.c
|
||||
@mkdir -p build/tools
|
||||
$(CC) -O2 -g -Wall -I/usr/local/include -L/usr/local/lib -o $@ $< -lpng
|
||||
$(CC) -O2 -Wall -I/usr/local/include -L/usr/local/lib -o $@ $< -lpng
|
||||
|
||||
build/tools/%: tools/%.c
|
||||
@mkdir -p build/tools
|
||||
$(CC) -O2 -g -Wall -o $@ $<
|
||||
$(CC) -O2 -Wall -o $@ $<
|
||||
|
||||
build/tools/%: tools/%.cc tools/common.h
|
||||
@mkdir -p build/tools
|
||||
$(CXX) -O2 -g -Wall -o $@ $<
|
||||
$(CXX) -O0 -g -Wall -o $@ $<
|
||||
|
||||
# Rules - CHARGEN
|
||||
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
packed_str_keywords_V2:
|
||||
#if CONFIG_COMPRESSION_LVL_2
|
||||
|
||||
put_freq_packed_keywords_V2()
|
||||
packed_dictionary:
|
||||
|
||||
put_packed_freq_DICTIONARY()
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# M65 BASIC_1 #TAKE
|
||||
// #LAYOUT# X16 BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
#if CONFIG_COMPRESSION_LVL_2
|
||||
|
||||
packed_dict_errors:
|
||||
|
||||
put_packed_dict_errors()
|
||||
|
||||
#else
|
||||
|
||||
packed_freq_errors:
|
||||
|
||||
put_packed_freq_errors()
|
||||
|
||||
#endif
|
||||
@@ -4,6 +4,6 @@
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
packed_str_errors:
|
||||
packed_freq_keywords_CC:
|
||||
|
||||
put_freq_packed_errors()
|
||||
put_packed_freq_keywords_CC()
|
||||
@@ -4,6 +4,6 @@
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
packed_str_keywords_CC:
|
||||
packed_freq_keywords_CD:
|
||||
|
||||
put_freq_packed_keywords_CC()
|
||||
put_packed_freq_keywords_CD()
|
||||
@@ -4,6 +4,6 @@
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
packed_str_keywords_CD:
|
||||
packed_freq_keywords_V2:
|
||||
|
||||
put_freq_packed_keywords_CD()
|
||||
put_packed_freq_keywords_V2()
|
||||
@@ -0,0 +1,19 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# M65 BASIC_1 #TAKE
|
||||
// #LAYOUT# X16 BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
#if CONFIG_COMPRESSION_LVL_2
|
||||
|
||||
packed_dict_misc:
|
||||
|
||||
put_packed_dict_misc()
|
||||
|
||||
#else
|
||||
|
||||
packed_freq_misc:
|
||||
|
||||
put_packed_freq_misc()
|
||||
|
||||
#endif
|
||||
@@ -1,9 +0,0 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# M65 BASIC_1 #TAKE
|
||||
// #LAYOUT# X16 BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
packed_str_misc:
|
||||
|
||||
put_freq_packed_misc()
|
||||
@@ -0,0 +1,67 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# M65 BASIC_1 #TAKE
|
||||
// #LAYOUT# X16 BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
#if CONFIG_COMPRESSION_LVL_2
|
||||
|
||||
print_packed_error: // .X - error string index
|
||||
|
||||
lda #<packed_dict_errors
|
||||
ldy #>packed_dict_errors
|
||||
bne print_dict_packed_string // branch always
|
||||
|
||||
print_packed_misc_str: // .X - misc string index
|
||||
|
||||
lda #<packed_dict_misc
|
||||
ldy #>packed_dict_misc
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
print_dict_packed_string:
|
||||
|
||||
// Search for the packed string on the list
|
||||
|
||||
jsr print_packed_search
|
||||
|
||||
ldy #$00
|
||||
!:
|
||||
// At this point FRESPC contains a pointer to the string to display
|
||||
// Fetch a byte-code
|
||||
|
||||
lda (FRESPC), y
|
||||
beq print_dict_packed_string_end // branch if everything displayed
|
||||
tax
|
||||
dex
|
||||
|
||||
// Call 'print_freq_packed_string' - but preserve all the data needed to progress further
|
||||
|
||||
phy_trash_a
|
||||
lda FRESPC+0
|
||||
pha
|
||||
lda FRESPC+1
|
||||
pha
|
||||
|
||||
lda #<packed_dictionary
|
||||
ldy #>packed_dictionary
|
||||
|
||||
jsr print_freq_packed_string
|
||||
|
||||
pla
|
||||
sta FRESPC+1
|
||||
pla
|
||||
sta FRESPC+0
|
||||
ply_trash_a
|
||||
|
||||
// Next iteration
|
||||
|
||||
iny
|
||||
bne !- // branch always
|
||||
|
||||
print_dict_packed_string_end:
|
||||
|
||||
rts
|
||||
|
||||
|
||||
#endif
|
||||
+16
-39
@@ -23,69 +23,46 @@ print_packed_misc_str:
|
||||
|
||||
#else
|
||||
|
||||
#if !CONFIG_COMPRESSION_LVL_2
|
||||
|
||||
print_packed_error: // .X - error string index
|
||||
|
||||
lda #<packed_str_errors
|
||||
ldy #>packed_str_errors
|
||||
lda #<packed_freq_errors
|
||||
ldy #>packed_freq_errors
|
||||
bne print_freq_packed_string // branch always
|
||||
|
||||
print_packed_misc_str: // .X - misc string index
|
||||
|
||||
lda #<packed_str_misc
|
||||
ldy #>packed_str_misc
|
||||
lda #<packed_freq_misc
|
||||
ldy #>packed_freq_misc
|
||||
bne print_freq_packed_string // branch always
|
||||
|
||||
#endif
|
||||
|
||||
print_packed_keyword_CC: // .X - token number
|
||||
|
||||
lda #<packed_str_keywords_CC
|
||||
ldy #>packed_str_keywords_CC
|
||||
lda #<packed_freq_keywords_CC
|
||||
ldy #>packed_freq_keywords_CC
|
||||
bne print_freq_packed_string // branch always
|
||||
|
||||
print_packed_keyword_CD: // .X - token number
|
||||
|
||||
lda #<packed_str_keywords_CD
|
||||
ldy #>packed_str_keywords_CD
|
||||
lda #<packed_freq_keywords_CD
|
||||
ldy #>packed_freq_keywords_CD
|
||||
bne print_freq_packed_string // branch always
|
||||
|
||||
print_packed_keyword_V2: // .X - token number
|
||||
|
||||
lda #<packed_str_keywords_V2
|
||||
ldy #>packed_str_keywords_V2
|
||||
lda #<packed_freq_keywords_V2
|
||||
ldy #>packed_freq_keywords_V2
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
print_freq_packed_string: // not to be used directly XXX rename to print_packed_string
|
||||
|
||||
// First store the initial address of the packed strings list
|
||||
// Search for the packed string on the list
|
||||
|
||||
sta FRESPC+0
|
||||
sty FRESPC+1
|
||||
|
||||
// Now find the address of the string to print out
|
||||
// The implementation assumes no packed string is longer than 255 bytes, including trailing zero
|
||||
!:
|
||||
cpx #$00
|
||||
beq print_freq_packed_string_found // branch if no need to advance anymore
|
||||
dex
|
||||
|
||||
ldy #$00
|
||||
!:
|
||||
lda (FRESPC), y
|
||||
iny
|
||||
cmp #$00
|
||||
bne !- // branch if not the end of packed string
|
||||
|
||||
clc // advance FREESPC pointer
|
||||
tya
|
||||
adc FRESPC+0
|
||||
sta FRESPC+0
|
||||
lda #$00
|
||||
adc FRESPC+1
|
||||
sta FRESPC+1
|
||||
|
||||
jmp !--
|
||||
|
||||
print_freq_packed_string_found:
|
||||
jsr print_packed_search
|
||||
|
||||
// At this point FRESPC contains a pointer to the string to display
|
||||
// and we should start from the lower nibble
|
||||
@@ -0,0 +1,40 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# M65 BASIC_1 #TAKE
|
||||
// #LAYOUT# X16 BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
print_packed_search:
|
||||
|
||||
// First store the initial address of the packed strings list
|
||||
|
||||
sta FRESPC+0
|
||||
sty FRESPC+1
|
||||
|
||||
// Now find the address of the string to print out
|
||||
// The implementation assumes no packed string is longer than 255 bytes, including trailing zero
|
||||
!:
|
||||
cpx #$00
|
||||
beq print_packed_done // branch if no need to advance anymore
|
||||
dex
|
||||
|
||||
ldy #$00
|
||||
!:
|
||||
lda (FRESPC), y
|
||||
iny
|
||||
cmp #$00
|
||||
bne !- // branch if not the end of packed string
|
||||
|
||||
clc // advance FREESPC pointer
|
||||
tya
|
||||
adc FRESPC+0
|
||||
sta FRESPC+0
|
||||
lda #$00
|
||||
adc FRESPC+1
|
||||
sta FRESPC+1
|
||||
|
||||
jmp !--
|
||||
|
||||
print_packed_done:
|
||||
|
||||
rts
|
||||
@@ -72,9 +72,9 @@ tokenise_line_loop:
|
||||
|
||||
// Check for BASIC V2 tokens
|
||||
|
||||
lda #<packed_str_keywords_V2
|
||||
lda #<packed_freq_keywords_V2
|
||||
sta FRESPC+0
|
||||
lda #>packed_str_keywords_V2
|
||||
lda #>packed_freq_keywords_V2
|
||||
sta FRESPC+1
|
||||
|
||||
jsr tk_search
|
||||
@@ -82,17 +82,17 @@ tokenise_line_loop:
|
||||
|
||||
// Check for extended tokens
|
||||
|
||||
lda #<packed_str_keywords_CC
|
||||
lda #<packed_freq_keywords_CC
|
||||
sta FRESPC+0
|
||||
lda #>packed_str_keywords_CC
|
||||
lda #>packed_freq_keywords_CC
|
||||
sta FRESPC+1
|
||||
|
||||
jsr tk_search
|
||||
bcc tokenise_line_keyword_CC // branch if keyword identified
|
||||
|
||||
lda #<packed_str_keywords_CD
|
||||
lda #<packed_freq_keywords_CD
|
||||
sta FRESPC+0
|
||||
lda #>packed_str_keywords_CD
|
||||
lda #>packed_freq_keywords_CD
|
||||
sta FRESPC+1
|
||||
|
||||
jsr tk_search
|
||||
|
||||
+20
-13
@@ -1279,16 +1279,19 @@ void DataSet::prepareOutput()
|
||||
const auto &stringEntryList = stringEntryLists[idxList];
|
||||
const auto &stringEncodedList = stringEncodedLists[idxList];
|
||||
|
||||
stream << std::endl;
|
||||
for (uint8_t idxString = 0; idxString < stringEncodedList.size(); idxString++)
|
||||
if (stringEntryList.type != ListType::DICTIONARY)
|
||||
{
|
||||
const auto &stringEntry = stringEntryList.list[idxString];
|
||||
const auto &stringEncoded = stringEncodedList[idxString];
|
||||
|
||||
if (!stringEncoded.empty())
|
||||
stream << std::endl;
|
||||
for (uint8_t idxString = 0; idxString < stringEncodedList.size(); idxString++)
|
||||
{
|
||||
stream << ".label IDX__" << stringEntry.alias << std::string(maxAliasLen - stringEntry.alias.length(), ' ') <<
|
||||
" = $" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << +idxString << std::endl;
|
||||
const auto &stringEntry = stringEntryList.list[idxString];
|
||||
const auto &stringEncoded = stringEncodedList[idxString];
|
||||
|
||||
if (!stringEncoded.empty())
|
||||
{
|
||||
stream << ".label IDX__" << stringEntry.alias << std::string(maxAliasLen - stringEntry.alias.length(), ' ') <<
|
||||
" = $" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << +idxString << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1302,11 +1305,11 @@ void DataSet::prepareOutput()
|
||||
|
||||
if (isCompressionLvl2(stringEntryList))
|
||||
{
|
||||
stream << std::endl << ".macro put_dict_packed_";
|
||||
stream << std::endl << ".macro put_packed_dict_";
|
||||
}
|
||||
else
|
||||
{
|
||||
stream << std::endl << ".macro put_freq_packed_";
|
||||
stream << std::endl << ".macro put_packed_freq_";
|
||||
}
|
||||
|
||||
stream << stringEntryList.name << "()" << std::endl << "{" << std::endl;
|
||||
@@ -1314,20 +1317,24 @@ void DataSet::prepareOutput()
|
||||
enum LastStr { NONE, SKIPPED, WRITTEN } lastStr = LastStr::NONE;
|
||||
for (uint8_t idxString = 0; idxString < stringEncodedList.size(); idxString++)
|
||||
{
|
||||
const auto &stringEntry = stringEntryList.list[idxString];
|
||||
const auto &stringEncoded = stringEncodedList[idxString];
|
||||
|
||||
if (stringEncoded.empty())
|
||||
{
|
||||
if (stringEntryList.type == ListType::DICTIONARY) ERROR("internal error"); // should never happen
|
||||
|
||||
if (lastStr == LastStr::WRITTEN) stream << std::endl;
|
||||
stream << "\t.byte $00 // skipped " << stringEntry.alias << std::endl;
|
||||
stream << "\t.byte $00 // skipped " << stringEntryList.list[idxString].alias << std::endl;
|
||||
lastStr = LastStr::SKIPPED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lastStr != LastStr::NONE) stream << std::endl;
|
||||
|
||||
stream << "\t// IDX__" << stringEntry.alias << std::endl;
|
||||
if (stringEntryList.type != ListType::DICTIONARY)
|
||||
{
|
||||
stream << "\t// IDX__" << stringEntryList.list[idxString].alias << std::endl;
|
||||
}
|
||||
stream << "\t.byte ";
|
||||
|
||||
bool first = true;
|
||||
|
||||
Reference in new issue
Block a user