Common Source Code Project for Qt (a.k.a for FM-7).
リビジョン | 5549094ae30db73c927abe9466aa644880a04566 (tree) |
---|---|
日時 | 2020-05-23 03:58:14 |
作者 | K.Ohta <whatisthis.sowhat@gmai...> |
コミッター | K.Ohta |
[VM][FMTOWNS][SPRITE] Start to adjust sprite.
@@ -25,14 +25,11 @@ void TOWNS_SPRITE::initialize(void) | ||
25 | 25 | reg_spen = false; |
26 | 26 | reg_addr = 0; |
27 | 27 | memset(reg_data, 0x00, sizeof(reg_data)); |
28 | - render_num = 0; | |
29 | - render_mod = 0; | |
30 | - render_lines = 0; | |
31 | - split_rendering = true; | |
32 | 28 | |
33 | 29 | max_sprite_per_frame = 224; |
34 | 30 | frame_sprite_count = 0; |
35 | - | |
31 | + register_frame_event(this); | |
32 | + register_vline_event(this); | |
36 | 33 | } |
37 | 34 | |
38 | 35 | void TOWNS_SPRITE::reset() |
@@ -48,7 +45,9 @@ void TOWNS_SPRITE::reset() | ||
48 | 45 | reg_addr = 0; |
49 | 46 | render_num = 0; |
50 | 47 | render_mod = 0; |
51 | -// render_lines = 0; | |
48 | + render_lines = 224; | |
49 | + split_rendering = true; | |
50 | + | |
52 | 51 | sprite_enabled = false; |
53 | 52 | now_transferring = false; |
54 | 53 | max_sprite_per_frame = 224; |
@@ -282,8 +281,8 @@ __DECL_VECTORIZED_LOOP | ||
282 | 281 | } |
283 | 282 | } |
284 | 283 | } |
285 | - | |
286 | - uint32_t vpaddr = (((x - xoffset) % 256 + ((y - yoffset) * 256)) << 1) & 0x7ffff; | |
284 | + uint32_t noffset = (disp_page1) ? 0x60000 : 0x40000; | |
285 | + uint32_t vpaddr = (((x - xoffset) % 256 + ((y - yoffset) * 256)) << 1) & 0x1ffff; | |
287 | 286 | if(!(is_halfx) && !(is_halfy)) { // not halfed |
288 | 287 | int __xstart = 0; |
289 | 288 | int __xend = 16; |
@@ -338,7 +337,7 @@ __DECL_VECTORIZED_LOOP | ||
338 | 337 | } |
339 | 338 | if(d_vram != NULL) { |
340 | 339 | __DECL_ALIGNED(16) uint8_t source[32] = {0}; |
341 | - d_vram->get_vram_to_buffer(vpaddr, source, 16); | |
340 | + d_vram->get_vram_to_buffer(vpaddr + noffset, source, 16); | |
342 | 341 | __DECL_VECTORIZED_LOOP |
343 | 342 | for(int xx = 0; xx < 16; xx++) { |
344 | 343 | source[(xx << 1) + 0] &= mbuf[xx].b.l; |
@@ -349,9 +348,9 @@ __DECL_VECTORIZED_LOOP | ||
349 | 348 | source[(xx << 1) + 0] |= lbuf[xx].b.l; |
350 | 349 | source[(xx << 1) + 1] |= lbuf[xx].b.h; |
351 | 350 | } |
352 | - d_vram->set_buffer_to_vram(vpaddr, source, 16); | |
351 | + d_vram->set_buffer_to_vram(vpaddr + noffset, source, 16); | |
353 | 352 | } |
354 | - vpaddr = (vpaddr + (256 << 1)) & 0x7ffff; | |
353 | + vpaddr = (vpaddr + (256 << 1)) & 0x1ffff; | |
355 | 354 | } |
356 | 355 | } else if((is_halfx) && !(is_halfy)) { // halfx only |
357 | 356 | /* |
@@ -414,7 +413,7 @@ __DECL_VECTORIZED_LOOP | ||
414 | 413 | } |
415 | 414 | if(d_vram != NULL) { |
416 | 415 | __DECL_ALIGNED(16) uint8_t source[32] = {0}; |
417 | - d_vram->get_vram_to_buffer(vpaddr, source, 8); | |
416 | + d_vram->get_vram_to_buffer(vpaddr + noffset, source, 8); | |
418 | 417 | __DECL_VECTORIZED_LOOP |
419 | 418 | for(int xx = 0; xx < 8; xx++) { |
420 | 419 | source[(xx << 1) + 0] &= mbuf[xx].b.l; |
@@ -425,9 +424,9 @@ __DECL_VECTORIZED_LOOP | ||
425 | 424 | source[(xx << 1) + 0] |= lbuf[xx].b.l; |
426 | 425 | source[(xx << 1) + 1] |= lbuf[xx].b.h; |
427 | 426 | } |
428 | - d_vram->set_buffer_to_vram(vpaddr, source, 8); | |
427 | + d_vram->set_buffer_to_vram(vpaddr + noffset, source, 8); | |
429 | 428 | } |
430 | - vpaddr = (vpaddr + (256 << 1)) & 0x7ffff; | |
429 | + vpaddr = (vpaddr + (256 << 1)) & 0x1ffff; | |
431 | 430 | } |
432 | 431 | } else if(is_halfy) { // halfy only |
433 | 432 | /* int __xstart; |
@@ -491,7 +490,7 @@ __DECL_VECTORIZED_LOOP | ||
491 | 490 | } |
492 | 491 | if(d_vram != NULL) { |
493 | 492 | __DECL_ALIGNED(16) uint8_t source[32] = {0}; |
494 | - d_vram->get_vram_to_buffer(vpaddr, source, 16); | |
493 | + d_vram->get_vram_to_buffer(vpaddr + noffset, source, 16); | |
495 | 494 | __DECL_VECTORIZED_LOOP |
496 | 495 | for(int xx = 0; xx < 16; xx++) { |
497 | 496 | source[(xx << 1) + 0] &= mbuf[xx].b.l; |
@@ -502,9 +501,9 @@ __DECL_VECTORIZED_LOOP | ||
502 | 501 | source[(xx << 1) + 0] |= lbuf[xx].b.l; |
503 | 502 | source[(xx << 1) + 1] |= lbuf[xx].b.h; |
504 | 503 | } |
505 | - d_vram->set_buffer_to_vram(vpaddr, source, 16); | |
504 | + d_vram->set_buffer_to_vram(vpaddr + noffset, source, 16); | |
506 | 505 | } |
507 | - vpaddr = (vpaddr + (256 << 1)) & 0x7ffff; | |
506 | + vpaddr = (vpaddr + (256 << 1)) & 0x1ffff; | |
508 | 507 | } |
509 | 508 | } else { //halfx &&halfy |
510 | 509 | /* int __xstart; |
@@ -575,7 +574,7 @@ __DECL_VECTORIZED_LOOP | ||
575 | 574 | if(d_vram != NULL) { |
576 | 575 | //d_vram->write_sprite_data(x, y + (yy >>1), xoffset, yoffset, lbuf, 8); |
577 | 576 | __DECL_ALIGNED(16) uint8_t source[32] = {0}; |
578 | - d_vram->get_vram_to_buffer(vpaddr, source, 8); | |
577 | + d_vram->get_vram_to_buffer(vpaddr + noffset, source, 8); | |
579 | 578 | __DECL_VECTORIZED_LOOP |
580 | 579 | for(int xx = 0; xx < 8; xx++) { |
581 | 580 | source[(xx << 1) + 0] &= mbuf[xx].b.l; |
@@ -586,9 +585,9 @@ __DECL_VECTORIZED_LOOP | ||
586 | 585 | source[(xx << 1) + 0] |= lbuf[xx].b.l; |
587 | 586 | source[(xx << 1) + 1] |= lbuf[xx].b.h; |
588 | 587 | } |
589 | - d_vram->set_buffer_to_vram(vpaddr, source, 8); | |
588 | + d_vram->set_buffer_to_vram(vpaddr + noffset, source, 8); | |
590 | 589 | } |
591 | - vpaddr = (vpaddr + (256 << 1)) & 0x7ffff; | |
590 | + vpaddr = (vpaddr + (256 << 1)) & 0x1ffff; | |
592 | 591 | } |
593 | 592 | } |
594 | 593 | __noop: |
@@ -625,7 +624,7 @@ void TOWNS_SPRITE::render_full() | ||
625 | 624 | int xaddr = _nx.w & 0x1ff; |
626 | 625 | int yaddr = _ny.w & 0x1ff; |
627 | 626 | // ToDo: wrap round.This is still bogus implement. |
628 | - //out_debug_log(_T("RENDER %d X=%d Y=%d ATTR=%04X COLOR=%04X"), render_num, xaddr, yaddr, _nattr.w, _ncol.w); | |
627 | + out_debug_log(_T("RENDER %d X=%d Y=%d ATTR=%04X COLOR=%04X"), render_num, xaddr, yaddr, _nattr.w, _ncol.w); | |
629 | 628 | render_sprite(render_num, xaddr, yaddr, _nattr.w, _ncol.w); |
630 | 629 | frame_sprite_count++; |
631 | 630 | if((frame_sprite_count >= max_sprite_per_frame) && (max_sprite_per_frame > 0)) break; |
@@ -636,10 +635,7 @@ void TOWNS_SPRITE::render_full() | ||
636 | 635 | void TOWNS_SPRITE::render_part(int start, int end) |
637 | 636 | { |
638 | 637 | // ToDo: Implement Register #2-5 |
639 | - uint16_t lot = reg_index & 0x3ff; | |
640 | - if(lot == 0) lot = 1024; | |
641 | 638 | if((start < 0) || (end < 0)) return; |
642 | - if(end > lot) end = lot; | |
643 | 639 | if(start > end) return; |
644 | 640 | // ToDo: Implement registers. |
645 | 641 | if(reg_spen) { |
@@ -660,7 +656,7 @@ void TOWNS_SPRITE::render_part(int start, int end) | ||
660 | 656 | int yaddr = _ny.w & 0x1ff; |
661 | 657 | // ToDo: wrap round.This is still bogus implement. |
662 | 658 | // ToDo: wrap round.This is still bogus implement. |
663 | - //out_debug_log(_T("RENDER %d X=%d Y=%d ATTR=%04X COLOR=%04X"), render_num, xaddr, yaddr, _nattr.w, _ncol.w); | |
659 | + out_debug_log(_T("RENDER %d X=%d Y=%d ATTR=%04X COLOR=%04X"), render_num, xaddr, yaddr, _nattr.w, _ncol.w); | |
664 | 660 | |
665 | 661 | render_sprite(render_num, xaddr, yaddr, _nattr.w, _ncol.w); |
666 | 662 | frame_sprite_count++; |
@@ -832,30 +828,25 @@ bool TOWNS_SPRITE::write_debug_reg(const _TCHAR *reg, uint32_t data) | ||
832 | 828 | void TOWNS_SPRITE::event_frame() |
833 | 829 | { |
834 | 830 | uint16_t lot = reg_index & 0x3ff; |
835 | - if(reg_spen && !(sprite_enabled)) { | |
836 | - sprite_enabled = true; | |
837 | - render_num = 0; | |
838 | - } | |
831 | +// if(reg_spen && !(sprite_enabled)) { | |
832 | + sprite_enabled = true; | |
833 | + render_num = 0; | |
834 | + render_mod = 0; | |
835 | +// } | |
839 | 836 | if(lot == 0) lot = 1024; |
840 | 837 | frame_sprite_count = 0; |
841 | 838 | if(sprite_enabled){ |
842 | 839 | if(d_vram != NULL) { |
843 | - if(d_vram->read_signal(SIG_TOWNS_VRAM_FRAMEBUFFER_READY) != 0) { | |
844 | - if(render_num >= lot) { | |
845 | - d_vram->write_signal(SIG_TOWNS_VRAM_SWAP_FRAMEBUFFER, 0xffffffff, 0xffffffff); | |
846 | - render_num = 0; | |
847 | - render_mod = 0; | |
848 | - } | |
849 | - // Set split_rendering from DIPSW. | |
850 | - // Set cache_enabled from DIPSW. | |
851 | - if(!split_rendering) { | |
852 | - render_full(); | |
853 | - } | |
854 | - } else { | |
855 | - render_num = 0; | |
856 | - render_mod = 0; | |
857 | - sprite_enabled = false; | |
840 | + // Set split_rendering from DIPSW. | |
841 | + // Set cache_enabled from DIPSW. | |
842 | + if(!split_rendering) { | |
843 | + render_full(); | |
858 | 844 | } |
845 | + //} else { | |
846 | + //render_num = 0; | |
847 | + //render_mod = 0; | |
848 | + //sprite_enabled = false; | |
849 | + //} | |
859 | 850 | } else { |
860 | 851 | render_num = 0; |
861 | 852 | render_mod = 0; |
@@ -864,6 +855,11 @@ void TOWNS_SPRITE::event_frame() | ||
864 | 855 | } |
865 | 856 | } |
866 | 857 | |
858 | +void TOWNS_SPRITE::event_vline(int v, int clock) | |
859 | +{ | |
860 | + do_vline_hook(v); | |
861 | +} | |
862 | + | |
867 | 863 | void TOWNS_SPRITE::do_vline_hook(int line) |
868 | 864 | { |
869 | 865 | int lot = reg_index & 0x3ff; |
@@ -871,15 +867,19 @@ void TOWNS_SPRITE::do_vline_hook(int line) | ||
871 | 867 | if(lot == 0) lot = 1024; |
872 | 868 | if((max_sprite_per_frame > 0) && (max_sprite_per_frame < lot)) lot = max_sprite_per_frame; |
873 | 869 | |
874 | - if((sprite_enabled) && (render_lines > 0)) { | |
875 | - int nf = lot / render_lines; | |
876 | - int nm = lot % render_lines; | |
877 | - render_mod += nm; | |
878 | - if(render_mod >= render_lines) { | |
879 | - nf++; | |
880 | - render_mod -= render_lines; | |
870 | + if((sprite_enabled) /*&& (render_lines > 0)*/) { | |
871 | +// int nf = lot / render_lines; | |
872 | +// int nm = lot % render_lines; | |
873 | +// render_mod += nm; | |
874 | +// if(render_mod >= render_lines) { | |
875 | +// nf++; | |
876 | +// render_mod -= render_lines; | |
877 | +// } | |
878 | + if(/*(nf >= 1) && */(render_num < lot)) { | |
879 | + render_part(render_num, render_num + 1/*+ nf*/); | |
880 | + } else if(render_num >= lot) { | |
881 | + sprite_enabled = false; | |
881 | 882 | } |
882 | - if((nf >= 1) && (render_num < lot)) render_part(render_num, render_num + nf); | |
883 | 883 | } |
884 | 884 | } |
885 | 885 | // Q: Is changing pages syncing to Frame? |
@@ -904,7 +904,12 @@ uint32_t TOWNS_SPRITE::read_signal(int id) | ||
904 | 904 | { |
905 | 905 | /*if(id == SIG_TOWNS_SPRITE_ANKCG) { // write CFF19 |
906 | 906 | return ((ankcg_enabled) ? 0xffffffff : 0); |
907 | - } else */ if(id == SIG_TOWNS_SPRITE_TVRAM_ENABLED) { | |
907 | + } else */ | |
908 | + if(id == SIG_TOWNS_SPRITE_BUSY) { | |
909 | + int lot = reg_index & 0x3ff; | |
910 | + if(lot == 0) lot = 1024; | |
911 | + return (/*(render_num < lot) && */(sprite_enabled)) ? 0xffffffff : 0; | |
912 | + } else if(id == SIG_TOWNS_SPRITE_TVRAM_ENABLED) { | |
908 | 913 | uint32_t v = ((tvram_enabled_bak) ? 0xffffffff : 0); |
909 | 914 | tvram_enabled_bak = false; |
910 | 915 | return v; |
@@ -128,6 +128,7 @@ public: | ||
128 | 128 | uint32_t __FASTCALL read_signal(int id); |
129 | 129 | void initialize(); |
130 | 130 | void event_frame(); |
131 | + void event_vline(int v, int clk); | |
131 | 132 | bool process_state(FILEIO* state_fio, bool loading); |
132 | 133 | |
133 | 134 | void set_context_vram(TOWNS_VRAM *p) |