second: more compression

This commit is contained in:
Vince Weaver 2023-10-01 21:39:44 -04:00
parent 799ba457fd
commit fac6b54e18
3 changed files with 233 additions and 15 deletions

View File

@ -22,6 +22,8 @@ todo, compressed:
431 bytes: try12: with don't cares
336 bytes: try13: sort colors by popularity
299 bytes: try14: shrink the window for finding colors to only include colors
299 bytes: try15: sort BOX (not expected to be smaller)
293 bytes: try16: add BOX_ADD types
TODO:
Only use don't care result if not wider than max X or longer than

View File

@ -48,6 +48,10 @@ static char color_names[16][16]={
#define ACTION_HLIN_ADD 0x6
#define ACTION_HLIN_ADD_LSAME 0x7
#define ACTION_HLIN_ADD_RSAME 0x8
#define ACTION_BOX_ADD 0x9
#define ACTION_BOX_ADD_LSAME 0xA
#define ACTION_BOX_ADD_RSAME 0xB
#if 0
static char action_names[9][16]={
@ -407,35 +411,101 @@ int generate_frame(int print_results) {
old_color=primitive_list[i].color;
}
/* Sort BOX by Y1 */
int first_box=0,last_box=0,box_found;
old_color=primitive_list[0].color;
for(i=0;i<max_primitive;i++) {
if ((primitive_list[i].color!=old_color)||(i==max_primitive-1)) {
box_found=0;
first_box=0; last_box=0;
// fprintf(stderr,"Searching for BOX in color %d from %d to %d\n",
// old_color,last_color_start,i);
for(j=last_color_start;j<i;j++) {
if (primitive_list[j].type==ACTION_BOX) {
if (!box_found) {
first_box=j;
box_found=1;
}
last_box=j;
}
}
if (box_found) {
if (debug) fprintf(stderr,"Sorting color %d BOX Y1 from %d to %d\n",
old_color,first_box,last_box);
// qsort(base, num_members,size_members,compare func
qsort(&(primitive_list[first_box]),last_box-first_box,
sizeof(struct primitive_list_t),compare_y1);
}
else {
// fprintf(stderr,"No BOX in color %d\n",old_color);
}
last_color_start=i;
}
old_color=primitive_list[i].color;
}
/* Optimize HLIN */
int previous_entry=0,previous_y=0,previous_x1=0,previous_x2=0;
int previous_entry=0,previous_y1=0,previous_x1=0,previous_x2=0,previous_y2=0;
for(i=0;i<max_primitive;i++) {
if (primitive_list[i].type==ACTION_HLIN) {
if ( ((previous_entry==ACTION_HLIN)||(previous_entry==ACTION_HLIN_ADD) ||(previous_entry==ACTION_HLIN_ADD_LSAME)) &&
(previous_y==primitive_list[i].y1-1) &&
(previous_y1==primitive_list[i].y1-1) &&
(previous_x1==primitive_list[i].x1)) {
primitive_list[i].type=ACTION_HLIN_ADD_LSAME;
}
else
if ( ((previous_entry==ACTION_HLIN)||(previous_entry==ACTION_HLIN_ADD) ||(previous_entry==ACTION_HLIN_ADD_RSAME)) &&
(previous_y==primitive_list[i].y1-1) &&
(previous_y1==primitive_list[i].y1-1) &&
(previous_x2==primitive_list[i].x2)) {
primitive_list[i].type=ACTION_HLIN_ADD_RSAME;
}
else
if ( ((previous_entry==ACTION_HLIN) || (previous_entry==ACTION_HLIN_ADD) || (previous_entry==ACTION_PLOT)) &&
(previous_y==primitive_list[i].y1-1)) {
(previous_y1==primitive_list[i].y1-1)) {
primitive_list[i].type=ACTION_HLIN_ADD;
}
}
previous_entry=primitive_list[i].type;
previous_y=primitive_list[i].y1;
previous_y1=primitive_list[i].y1;
previous_x1=primitive_list[i].x1;
previous_x2=primitive_list[i].x2;
}
/* Optimize BOX */
previous_entry=0,previous_y1=0,previous_y2=0,previous_x1=0,previous_x2=0;
for(i=0;i<max_primitive;i++) {
if (primitive_list[i].type==ACTION_BOX) {
if ( ((previous_entry==ACTION_BOX)||(previous_entry==ACTION_BOX_ADD) ||(previous_entry==ACTION_BOX_ADD_LSAME)) &&
(previous_y2==primitive_list[i].y1-1) &&
(previous_x1==primitive_list[i].x1)) {
primitive_list[i].type=ACTION_BOX_ADD_LSAME;
}
else
if ( ((previous_entry==ACTION_BOX)||(previous_entry==ACTION_BOX_ADD) ||(previous_entry==ACTION_BOX_ADD_RSAME)) &&
(previous_y2==primitive_list[i].y1-1) &&
(previous_x2==primitive_list[i].x2)) {
primitive_list[i].type=ACTION_BOX_ADD_RSAME;
}
else
if ( ((previous_entry==ACTION_BOX) || (previous_entry==ACTION_BOX_ADD)) &&
(previous_y2==primitive_list[i].y1-1)) {
primitive_list[i].type=ACTION_BOX_ADD;
}
}
previous_entry=primitive_list[i].type;
previous_x1=primitive_list[i].x1;
previous_y1=primitive_list[i].y1;
previous_x2=primitive_list[i].x2;
previous_y2=primitive_list[i].y2;
}
/* Dump results */
for(i=0;i<max_primitive;i++) {
if (primitive_list[i].color==0) continue;
@ -578,6 +648,63 @@ int generate_frame(int print_results) {
}
break;
case ACTION_BOX_ADD:
if (primitive_list[i].type==previous_primitive) {
printf("\t.byte %d,%d,%d\t; %d\n",
primitive_list[i].x1,
primitive_list[i].x2,
primitive_list[i].y2,
primitive_list[i].y1);
total_size+=3;
}
else {
printf("\t.byte BOX_ADD,%d,%d,%d\t; %d\n",
primitive_list[i].x1,
primitive_list[i].x2,
primitive_list[i].y2,
primitive_list[i].y1);
total_size+=4;
previous_primitive=ACTION_BOX_ADD;
}
break;
case ACTION_BOX_ADD_LSAME:
if (primitive_list[i].type==previous_primitive) {
printf("\t.byte %d,%d\n",
primitive_list[i].x2,
primitive_list[i].y2);
total_size+=2;
}
else {
printf("\t.byte BOX_ADD_LSAME,%d,%d ; %d, %d\n",
primitive_list[i].x2,
primitive_list[i].y2,
primitive_list[i].x1,
primitive_list[i].y1);
total_size+=3;
previous_primitive=ACTION_BOX_ADD_LSAME;
}
break;
case ACTION_BOX_ADD_RSAME:
if (primitive_list[i].type==previous_primitive) {
printf("\t.byte %d,%d\t; %d %d\n",
primitive_list[i].x1,
primitive_list[i].y2,
primitive_list[i].x2,
primitive_list[i].y1);
total_size+=2;
}
else {
printf("\t.byte BOX_ADD_RSAME,%d,%d\n",
primitive_list[i].x1,
primitive_list[i].y2);
total_size+=3;
previous_primitive=ACTION_BOX_ADD_RSAME;
}
break;
default:
fprintf(stderr,"Error unknown type!\n");
exit(1);

View File

@ -20,6 +20,9 @@ PLOT = $85
HLIN_ADD= $86
HLIN_ADD_LSAME= $87
HLIN_ADD_RSAME= $88
BOX_ADD= $89
BOX_ADD_LSAME= $8A
BOX_ADD_RSAME= $8B
BLACK = $00
RED = $01
@ -123,12 +126,14 @@ update_pointer:
draw_table_l:
.byte <(clear_screen-1),<(draw_box-1),<(draw_hlin-1),<(draw_vlin-1)
.byte <(draw_plot-1),<(draw_hlin_add-1)
.byte <(draw_hlin_add_lsame-1),<(draw_hlin_add_rsame-1)
.byte <(draw_plot-1)
.byte <(draw_hlin_add-1),<(draw_hlin_add_lsame-1),<(draw_hlin_add_rsame-1)
.byte <(draw_box_add-1),<(draw_box_add_lsame-1),<(draw_box_add_rsame-1)
draw_table_h:
.byte >(clear_screen-1),>(draw_box-1),>(draw_hlin-1),>(draw_vlin-1)
.byte >(draw_plot-1),>(draw_hlin_add-1)
.byte >(draw_hlin_add_lsame-1),>(draw_hlin_add_rsame-1)
.byte >(draw_plot-1)
.byte >(draw_hlin_add-1),>(draw_hlin_add_lsame-1),>(draw_hlin_add_rsame-1)
.byte >(draw_box_add-1),>(draw_box_add_lsame-1),>(draw_box_add_rsame-1)
;=================================
;=================================
@ -170,6 +175,17 @@ draw_box:
lda (INL),Y
sta Y2
jsr draw_box_common
done_draw_box:
lda #4
jmp update_pointer
;==================================
; draw box common
;==================================
draw_box_common:
lda Y2
lsr
; if even, go to one less
@ -246,8 +262,8 @@ done_draw_box_yloop:
definitely_odd_bottom:
; done
lda #4
jmp update_pointer
rts
;=================================
@ -257,7 +273,6 @@ definitely_odd_bottom:
;=================================
draw_hlin:
; iny ; FIXME: move to common code
lda (INL),Y
sta X1
iny
@ -292,7 +307,6 @@ hlin_done:
; increment Y1
draw_hlin_add:
; iny ; FIXME: move to common code
lda (INL),Y
sta X1
iny
@ -328,7 +342,6 @@ hlin_add_done:
; use old left value
draw_hlin_add_lsame:
; iny ; FIXME: move to common code
lda (INL),Y
sta X2
@ -361,7 +374,6 @@ hlin_add_lsame_done:
; use old right value
draw_hlin_add_rsame:
; iny ; FIXME: move to common code
lda (INL),Y
sta X1
@ -385,6 +397,83 @@ hlin_add_rsame_done:
jmp update_pointer
;=================================
;=================================
; draw box add
;=================================
;=================================
; increment Y2, put into Y1
draw_box_add:
lda Y2
sta Y1
inc Y1
lda (INL),Y
sta X1
iny
lda (INL),Y
sta X2
iny
lda (INL),Y
sta Y2
jsr draw_box_common
lda #3
jmp update_pointer
;=================================
;=================================
; draw box add_lsame
;=================================
;=================================
; increment Y2, store in Y1
; use old X1 value
draw_box_add_lsame:
lda Y2
sta Y1
inc Y1
lda (INL),Y
sta X2
iny
lda (INL),Y
sta Y2
jsr draw_box_common
lda #2
jmp update_pointer
;=================================
;=================================
; draw box add_rsame
;=================================
;=================================
; increment Y2, put in Y1
; use old right value X2
draw_box_add_rsame:
lda Y2
sta Y1
inc Y1
lda (INL),Y
sta X1
iny
lda (INL),Y
sta Y2
jsr draw_box_common
lda #2
jmp update_pointer
;=================================