added code to display dictionary compressed strings

This commit is contained in:
FeralChild64 committed 2020-06-23 19:38:56 +02:00
1 parent d3fdc6cc59
commit 3b4d1345db
13 files changed
+202 -78

No files matched your search

+3 -3
View File
@@ -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
+19
View File
@@ -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()
+19
View File
@@ -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
-9
View File
@@ -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
@@ -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
+40
View File
@@ -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
+6 -6
View File
@@ -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
View File
@@ -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;