1
0
mirror of https://github.com/fachat/xa65.git synced 2025-02-06 03:29:58 +00:00

fix string display in listing, fix listing line breaks with .listbytes

This commit is contained in:
fachat 2012-07-29 20:40:58 +02:00
parent 30a8eb61c2
commit 451e446016
4 changed files with 417 additions and 27 deletions

View File

@ -2583,6 +2583,32 @@ void list_setfile(FILE *fp) {
listfp = fp;
}
char *list_preamble(char *buf, int lineno, int seg, int pc) {
/* line number in file */
snprintf(buf, 10, "% 5d", lineno);
int i = strlen(buf);
buf += i;
buf += list_char(buf, ' ');
char c = '?';
/* preamble <segment>':'<address>' ' */
switch(seg) {
case SEG_ABS: c='A'; break;
case SEG_TEXT: c='T'; break;
case SEG_BSS: c='B'; break;
case SEG_DATA: c='D'; break;
case SEG_UNDEF: c='U'; break;
case SEG_ZERO: c='Z'; break;
}
buf = buf + list_char(buf, c);
buf = buf + list_char(buf, ':');
buf = buf + list_word(buf, pc);
buf = buf + list_nchar(buf, ' ', 2);
return buf;
}
/**
* listing/listing_len give the buffer address and length respectively that contains
* the token as they are produced by the tokenizer.
@ -2601,8 +2627,6 @@ void do_listing(signed char *listing, int listing_len, signed char *bincode, int
int lst_seg = listing[0];
int lst_pc = (listing[2]<<8) | (listing[1] & 255);
signed char c = '?';
/* no output file (not even stdout) */
if (listfp == NULL) return;
@ -2618,43 +2642,59 @@ void do_listing(signed char *listing, int listing_len, signed char *bincode, int
}
list_last_lineno = list_lineno;
/* line number in file */
snprintf(buf, 10, "% 5d", list_lineno);
i = strlen(buf);
buf += i;
buf += list_char(buf, ' ');
buf = list_preamble(buf, list_lineno, lst_seg, lst_pc);
/* preamble <segment>':'<address>' ' */
switch(lst_seg) {
case SEG_ABS: c='A'; break;
case SEG_TEXT: c='T'; break;
case SEG_BSS: c='B'; break;
case SEG_DATA: c='D'; break;
case SEG_UNDEF: c='U'; break;
case SEG_ZERO: c='Z'; break;
// check if we have labels, so we can adjust the max printable number of
// bytes in the last line
int num_last_line = 11;
int tmp = listing[3] & 255;
if (tmp == (T_DEFINE & 255)) {
// we have label definition
num_last_line = 8;
}
buf = buf + list_char(buf, c);
buf = buf + list_char(buf, ':');
buf = buf + list_word(buf, lst_pc);
buf = buf + list_nchar(buf, ' ', 2);
int overflow = 0;
/* binary output (up to 8 byte. If more than 8 byte, print 7 plus "..." */
n_hexb = bincode_len;
if (list_numbytes != 0 && n_hexb >= list_numbytes) {
n_hexb = list_numbytes-1;
overflow = 1;
}
for (i = 0; i < n_hexb; i++) {
buf = buf + list_byte(buf, bincode[i]);
buf = buf + list_sp(buf);
}
if ((n_hexb == 7) && (bincode_len > 7)) {
buf = buf + list_nchar(buf, '.', 3);
} else {
/* can move loop into nchar ... */
for (; i < 8; i++) {
buf = buf + list_nchar(buf, ' ', 3);
if ( (i%16) == 15) {
// make a break
buf[0] = 0;
fprintf(listfp, "%s\n", outline);
buf = outline;
buf = list_preamble(buf, list_lineno, lst_seg, lst_pc + i + 1);
}
}
if (overflow) {
// are we at the last byte?
if (n_hexb + 1 == bincode_len) {
// just print the last byte
buf = buf + list_byte(buf, bincode[i]);
buf = buf + list_sp(buf);
} else {
// display "..."
buf = buf + list_nchar(buf, '.', 3);
}
n_hexb++;
}
i = n_hexb % 16;
if (i > num_last_line) {
// make a break (Note: with original PC, as now the assembler text follows
buf[0] = 0;
fprintf(listfp, "%s\n", outline);
buf = outline;
buf = list_preamble(buf, list_lineno, lst_seg, lst_pc);
i = 0;
}
i = num_last_line - i;
buf = buf + list_nchar(buf, ' ', i * 3);
buf = buf + list_sp(buf);
buf += list_tokens(buf, listing + 3, listing_len - 3);
@ -2715,7 +2755,7 @@ int list_tokens(char *buf, signed char *input, int len) {
}
} else {
if (tmp >= 0 && tmp < Anzkey) {
outp += list_string(buf+outp, " ");
outp += list_string(buf+outp, " ");
}
}
@ -2820,6 +2860,18 @@ int list_tokens(char *buf, signed char *input, int len) {
inp += 6;
operator = 1; /* check if arithmetic operator follows */
break;
case '"':
// string display
inp++;
outp += list_char(buf+outp, '"');
int len = input[inp] & 0xff;
for (int i = 0; i < len; i++) {
inp++;
outp += list_char(buf+outp, input[inp]);
}
inp++;
outp += list_char(buf+outp, '"');
break;
default:
c = input[inp];
if (c > 31) {

16
xa/tests/listing/Makefile Normal file
View File

@ -0,0 +1,16 @@
#
# Makefile for tests
#
XA=../../xa
tests: linebreak clean
linebreak: linebreak.a65
${XA} -P- $< > a.out
cmp linebreak.out a.out
clean:
rm -f a.err a.o65 a.out

View File

@ -0,0 +1,160 @@
*=$1000
// default listbytes is 8
lda #$0
// first without labels
.(
// less than 8 bytes
.byt 0,1,2,3,4,5 ; 6
// seven bytes
.byt 0,1,2,3,4,5,6 ; 7
// eight bytes
.byt 0,1,2,3,4,5,6,7 ; 8
// nine bytes
.byt 0,1,2,3,4,5,6,7,8 ; 9
// ten bytes
.byt 0,1,2,3,4,5,6,7,8,9 ; 10
// eleven bytes
.byt 0,1,2,3,4,5,6,7,8,9,10 ; 11
// fifteen bytes
.asc "012345678901234" ; 15, asc test as well
// sixteen bytes
.asc "0123456789012345" ; 16
// seventeen bytes
.asc "01234567890123456"; 17
// thirtythree
.asc "012345678901234567890123456789012"; 32
// now with labels
// less than 8 bytes
l6 .byt 0,1,2,3,4,5 ; 6
// seven bytes
l7 .byt 0,1,2,3,4,5,6 ; 7
// eight bytes
l8 .byt 0,1,2,3,4,5,6,7 ; 8
// nine bytes
l9 .byt 0,1,2,3,4,5,6,7,8 ; 9
// ten bytes
l10 .byt 0,1,2,3,4,5,6,7,8,9 ; 10
// eleven bytes
l11 .byt 0,1,2,3,4,5,6,7,8,9,10 ; 11
// fifteen bytes
l15 .asc "012345678901234" ; 15, asc test as well
// sixteen bytes
l16 .asc "0123456789012345" ; 16
// seventeen bytes
l17 .asc "01234567890123456"; 17
// thirtythree
l32 .asc "012345678901234567890123456789012"; 32
.)
// now set number of bytes per listing line to 10
.listbytes 10
.(
// less than 8 bytes
.byt 0,1,2,3,4,5 ; 6
// seven bytes
.byt 0,1,2,3,4,5,6 ; 7
// eight bytes
.byt 0,1,2,3,4,5,6,7 ; 8
// nine bytes
.byt 0,1,2,3,4,5,6,7,8 ; 9
// ten bytes
.byt 0,1,2,3,4,5,6,7,8,9 ; 10
// eleven bytes
.byt 0,1,2,3,4,5,6,7,8,9,10 ; 11
// fifteen bytes
.asc "012345678901234" ; 15, asc test as well
// sixteen bytes
.asc "0123456789012345" ; 16
// seventeen bytes
.asc "01234567890123456"; 17
// thirtythree
.asc "012345678901234567890123456789012"; 32
// now with labels
// less than 8 bytes
l6 .byt 0,1,2,3,4,5 ; 6
// seven bytes
l7 .byt 0,1,2,3,4,5,6 ; 7
// eight bytes
l8 .byt 0,1,2,3,4,5,6,7 ; 8
// nine bytes
l9 .byt 01,2,3,4,5,6,7,8 ; 9
// ten bytes
l10 .byt 01,2,3,4,5,6,7,8,9 ; 10
// eleven bytes
l11 .byt 01,2,3,4,5,6,7,8,9,10 ; 11
// fifteen bytes
l15 .asc "012345678901234" ; 15, asc test as well
// sixteen bytes
l16 .asc "0123456789012345" ; 16
// seventeen bytes
l17 .asc "01234567890123456"; 17
// thirtythree
l32 .asc "012345678901234567890123456789012"; 32
.)
// set number of listing bytes to unlimited
.listbytes unlimited
.(
// less than 8 bytes
.byt 0,1,2,3,4,5 ; 6
// seven bytes
.byt 0,1,2,3,4,5,6 ; 7
// eight bytes
.byt 0,1,2,3,4,5,6,7 ; 8
// nine bytes
.byt 0,1,2,3,4,5,6,7,8 ; 9
// ten bytes
.byt 0,1,2,3,4,5,6,7,8,9 ; 10
// eleven bytes
.byt 0,1,2,3,4,5,6,7,8,9,10 ; 11
// fifteen bytes
.asc "012345678901234" ; 15, asc test as well
// sixteen bytes
.asc "0123456789012345" ; 16
// seventeen bytes
.asc "01234567890123456"; 17
// thirtythree
.asc "012345678901234567890123456789012"; 32
// now with labels
// less than 8 bytes
l6 .byt 0,1,2,3,4,5 ; 6
// seven bytes
l7 .byt 0,1,2,3,4,5,6 ; 7
// eight bytes
l8 .byt 0,1,2,3,4,5,6,7 ; 8
// nine byte
l9 .byt 0,1,2,3,4,5,6,7,8 ; 9
// ten bytes
l10 .byt 0,1,2,3,4,5,6,7,8,9 ; 10
// eleven bytes
l11 .byt 0,1,2,3,4,5,6,7,8,9,10 ; 11
// fifteen bytes
l15 .asc "012345678901234" ; 15, test as well
// sixteen bytes
l16 .asc "0123456789012345" ; 16
// seventeen bytes
l17 .asc "01234567890123456"; 17
// thirtythree
l32 .asc "012345678901234567890123456789012"; 32
.)

View File

@ -0,0 +1,162 @@
linebreak.a65
2 A:1000 *= $1000
6 A:1000 a9 00 lda #$00
10 A:1002 .(
12 A:1002 00 01 02 03 04 05 .byt 0,1,2,3,4,5; 6
14 A:1008 00 01 02 03 04 05 06 .byt 0,1,2,3,4,5,6; 7
16 A:100f 00 01 02 03 04 05 06 07 .byt 0,1,2,3,4,5,6,7; 8
18 A:1017 00 01 02 03 04 05 06 ... .byt 0,1,2,3,4,5,6,7,8; 9
20 A:1020 00 01 02 03 04 05 06 ... .byt 0,1,2,3,4,5,6,7,8,9; 10
22 A:102a 00 01 02 03 04 05 06 ... .byt 0,1,2,3,4,5,6,7,8,9,10; 11
24 A:1035 30 31 32 33 34 35 36 ... .asc "012345678901234" ; 15, asc test as well
26 A:1044 30 31 32 33 34 35 36 ... .asc "0123456789012345" ; 16
28 A:1054 30 31 32 33 34 35 36 ... .asc "01234567890123456"; 17
30 A:1065 30 31 32 33 34 35 36 ... .asc "012345678901234567890123456789012"; 32
35 A:1086 00 01 02 03 04 05 l6 .byt 0,1,2,3,4,5; 6
37 A:108c 00 01 02 03 04 05 06 l7 .byt 0,1,2,3,4,5,6; 7
39 A:1093 00 01 02 03 04 05 06 07 l8 .byt 0,1,2,3,4,5,6,7; 8
41 A:109b 00 01 02 03 04 05 06 ... l9 .byt 0,1,2,3,4,5,6,7,8; 9
43 A:10a4 00 01 02 03 04 05 06 ... l10 .byt 0,1,2,3,4,5,6,7,8,9; 10
45 A:10ae 00 01 02 03 04 05 06 ... l11 .byt 0,1,2,3,4,5,6,7,8,9,10; 11
47 A:10b9 30 31 32 33 34 35 36 ... l15 .asc "012345678901234"; 15, asc test as well
49 A:10c8 30 31 32 33 34 35 36 ... l16 .asc "0123456789012345"; 16
51 A:10d8 30 31 32 33 34 35 36 ... l17 .asc "01234567890123456"; 17
53 A:10e9 30 31 32 33 34 35 36 ... l32 .asc "012345678901234567890123456789012"; 32
55 A:110a .)
59 A:110a .listbytes 10
61 A:110a .(
63 A:110a 00 01 02 03 04 05 .byt 0,1,2,3,4,5; 6
65 A:1110 00 01 02 03 04 05 06 .byt 0,1,2,3,4,5,6; 7
67 A:1117 00 01 02 03 04 05 06 07 .byt 0,1,2,3,4,5,6,7; 8
69 A:111f 00 01 02 03 04 05 06 07 08 .byt 0,1,2,3,4,5,6,7,8; 9
71 A:1128 00 01 02 03 04 05 06 07 08 09 .byt 0,1,2,3,4,5,6,7,8,9; 10
73 A:1132 00 01 02 03 04 05 06 07 08 ... .byt 0,1,2,3,4,5,6,7,8,9,10; 11
75 A:113d 30 31 32 33 34 35 36 37 38 ... .asc "012345678901234" ; 15, asc test as well
77 A:114c 30 31 32 33 34 35 36 37 38 ... .asc "0123456789012345" ; 16
79 A:115c 30 31 32 33 34 35 36 37 38 ... .asc "01234567890123456"; 17
81 A:116d 30 31 32 33 34 35 36 37 38 ... .asc "012345678901234567890123456789012"; 32
87 A:118e 00 01 02 03 04 05 l6 .byt 0,1,2,3,4,5; 6
89 A:1194 00 01 02 03 04 05 06 l7 .byt 0,1,2,3,4,5,6; 7
91 A:119b 00 01 02 03 04 05 06 07 l8 .byt 0,1,2,3,4,5,6,7; 8
93 A:11a3 01 02 03 04 05 06 07 08 l9 .byt 1,2,3,4,5,6,7,8; 9
95 A:11ab 01 02 03 04 05 06 07 08 09
95 A:11ab l10 .byt 1,2,3,4,5,6,7,8,9; 10
97 A:11b4 01 02 03 04 05 06 07 08 09 0a
97 A:11b4 l11 .byt 1,2,3,4,5,6,7,8,9,10; 11
99 A:11be 30 31 32 33 34 35 36 37 38 ...
99 A:11be l15 .asc "012345678901234"; 15, asc test as well
101 A:11cd 30 31 32 33 34 35 36 37 38 ...
101 A:11cd l16 .asc "0123456789012345"; 16
103 A:11dd 30 31 32 33 34 35 36 37 38 ...
103 A:11dd l17 .asc "01234567890123456"; 17
105 A:11ee 30 31 32 33 34 35 36 37 38 ...
105 A:11ee l32 .asc "012345678901234567890123456789012"; 32
107 A:120f .)
110 A:120f .listbytes 0
112 A:120f .(
114 A:120f 00 01 02 03 04 05 .byt 0,1,2,3,4,5; 6
116 A:1215 00 01 02 03 04 05 06 .byt 0,1,2,3,4,5,6; 7
118 A:121c 00 01 02 03 04 05 06 07 .byt 0,1,2,3,4,5,6,7; 8
120 A:1224 00 01 02 03 04 05 06 07 08 .byt 0,1,2,3,4,5,6,7,8; 9
122 A:122d 00 01 02 03 04 05 06 07 08 09 .byt 0,1,2,3,4,5,6,7,8,9; 10
124 A:1237 00 01 02 03 04 05 06 07 08 09 0a .byt 0,1,2,3,4,5,6,7,8,9,10; 11
126 A:1242 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34
126 A:1242 .asc "012345678901234" ; 15, asc test as well
128 A:1251 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35
128 A:1261 .asc "0123456789012345" ; 16
130 A:1261 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35
130 A:1271 36 .asc "01234567890123456"; 17
132 A:1272 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35
132 A:1282 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31
132 A:1292 32 .asc "012345678901234567890123456789012"; 32
138 A:1293 00 01 02 03 04 05 l6 .byt 0,1,2,3,4,5; 6
140 A:1299 00 01 02 03 04 05 06 l7 .byt 0,1,2,3,4,5,6; 7
142 A:12a0 00 01 02 03 04 05 06 07 l8 .byt 0,1,2,3,4,5,6,7; 8
144 A:12a8 00 01 02 03 04 05 06 07 08
144 A:12a8 l9 .byt 0,1,2,3,4,5,6,7,8; 9
146 A:12b1 00 01 02 03 04 05 06 07 08 09
146 A:12b1 l10 .byt 0,1,2,3,4,5,6,7,8,9; 10
148 A:12bb 00 01 02 03 04 05 06 07 08 09 0a
148 A:12bb l11 .byt 0,1,2,3,4,5,6,7,8,9,10; 11
150 A:12c6 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34
150 A:12c6 l15 .asc "012345678901234"; 15, test as well
152 A:12d5 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35
152 A:12e5 l16 .asc "0123456789012345"; 16
154 A:12e5 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35
154 A:12f5 36 l17 .asc "01234567890123456"; 17
156 A:12f6 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35
156 A:1306 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31
156 A:1316 32 l32 .asc "012345678901234567890123456789012"; 32
158 A:1317 .)