mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-02-10 10:30:57 +00:00
second: more compression
This commit is contained in:
parent
799ba457fd
commit
fac6b54e18
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;=================================
|
||||
|
Loading…
x
Reference in New Issue
Block a user