• R/O
  • HTTP
  • SSH
  • HTTPS

common_source_project-fm7: コミット

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.

変更サマリ

差分

--- a/source/src/vm/fmtowns/towns_sprite.cpp
+++ b/source/src/vm/fmtowns/towns_sprite.cpp
@@ -25,14 +25,11 @@ void TOWNS_SPRITE::initialize(void)
2525 reg_spen = false;
2626 reg_addr = 0;
2727 memset(reg_data, 0x00, sizeof(reg_data));
28- render_num = 0;
29- render_mod = 0;
30- render_lines = 0;
31- split_rendering = true;
3228
3329 max_sprite_per_frame = 224;
3430 frame_sprite_count = 0;
35-
31+ register_frame_event(this);
32+ register_vline_event(this);
3633 }
3734
3835 void TOWNS_SPRITE::reset()
@@ -48,7 +45,9 @@ void TOWNS_SPRITE::reset()
4845 reg_addr = 0;
4946 render_num = 0;
5047 render_mod = 0;
51-// render_lines = 0;
48+ render_lines = 224;
49+ split_rendering = true;
50+
5251 sprite_enabled = false;
5352 now_transferring = false;
5453 max_sprite_per_frame = 224;
@@ -282,8 +281,8 @@ __DECL_VECTORIZED_LOOP
282281 }
283282 }
284283 }
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;
287286 if(!(is_halfx) && !(is_halfy)) { // not halfed
288287 int __xstart = 0;
289288 int __xend = 16;
@@ -338,7 +337,7 @@ __DECL_VECTORIZED_LOOP
338337 }
339338 if(d_vram != NULL) {
340339 __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);
342341 __DECL_VECTORIZED_LOOP
343342 for(int xx = 0; xx < 16; xx++) {
344343 source[(xx << 1) + 0] &= mbuf[xx].b.l;
@@ -349,9 +348,9 @@ __DECL_VECTORIZED_LOOP
349348 source[(xx << 1) + 0] |= lbuf[xx].b.l;
350349 source[(xx << 1) + 1] |= lbuf[xx].b.h;
351350 }
352- d_vram->set_buffer_to_vram(vpaddr, source, 16);
351+ d_vram->set_buffer_to_vram(vpaddr + noffset, source, 16);
353352 }
354- vpaddr = (vpaddr + (256 << 1)) & 0x7ffff;
353+ vpaddr = (vpaddr + (256 << 1)) & 0x1ffff;
355354 }
356355 } else if((is_halfx) && !(is_halfy)) { // halfx only
357356 /*
@@ -414,7 +413,7 @@ __DECL_VECTORIZED_LOOP
414413 }
415414 if(d_vram != NULL) {
416415 __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);
418417 __DECL_VECTORIZED_LOOP
419418 for(int xx = 0; xx < 8; xx++) {
420419 source[(xx << 1) + 0] &= mbuf[xx].b.l;
@@ -425,9 +424,9 @@ __DECL_VECTORIZED_LOOP
425424 source[(xx << 1) + 0] |= lbuf[xx].b.l;
426425 source[(xx << 1) + 1] |= lbuf[xx].b.h;
427426 }
428- d_vram->set_buffer_to_vram(vpaddr, source, 8);
427+ d_vram->set_buffer_to_vram(vpaddr + noffset, source, 8);
429428 }
430- vpaddr = (vpaddr + (256 << 1)) & 0x7ffff;
429+ vpaddr = (vpaddr + (256 << 1)) & 0x1ffff;
431430 }
432431 } else if(is_halfy) { // halfy only
433432 /* int __xstart;
@@ -491,7 +490,7 @@ __DECL_VECTORIZED_LOOP
491490 }
492491 if(d_vram != NULL) {
493492 __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);
495494 __DECL_VECTORIZED_LOOP
496495 for(int xx = 0; xx < 16; xx++) {
497496 source[(xx << 1) + 0] &= mbuf[xx].b.l;
@@ -502,9 +501,9 @@ __DECL_VECTORIZED_LOOP
502501 source[(xx << 1) + 0] |= lbuf[xx].b.l;
503502 source[(xx << 1) + 1] |= lbuf[xx].b.h;
504503 }
505- d_vram->set_buffer_to_vram(vpaddr, source, 16);
504+ d_vram->set_buffer_to_vram(vpaddr + noffset, source, 16);
506505 }
507- vpaddr = (vpaddr + (256 << 1)) & 0x7ffff;
506+ vpaddr = (vpaddr + (256 << 1)) & 0x1ffff;
508507 }
509508 } else { //halfx &&halfy
510509 /* int __xstart;
@@ -575,7 +574,7 @@ __DECL_VECTORIZED_LOOP
575574 if(d_vram != NULL) {
576575 //d_vram->write_sprite_data(x, y + (yy >>1), xoffset, yoffset, lbuf, 8);
577576 __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);
579578 __DECL_VECTORIZED_LOOP
580579 for(int xx = 0; xx < 8; xx++) {
581580 source[(xx << 1) + 0] &= mbuf[xx].b.l;
@@ -586,9 +585,9 @@ __DECL_VECTORIZED_LOOP
586585 source[(xx << 1) + 0] |= lbuf[xx].b.l;
587586 source[(xx << 1) + 1] |= lbuf[xx].b.h;
588587 }
589- d_vram->set_buffer_to_vram(vpaddr, source, 8);
588+ d_vram->set_buffer_to_vram(vpaddr + noffset, source, 8);
590589 }
591- vpaddr = (vpaddr + (256 << 1)) & 0x7ffff;
590+ vpaddr = (vpaddr + (256 << 1)) & 0x1ffff;
592591 }
593592 }
594593 __noop:
@@ -625,7 +624,7 @@ void TOWNS_SPRITE::render_full()
625624 int xaddr = _nx.w & 0x1ff;
626625 int yaddr = _ny.w & 0x1ff;
627626 // 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);
629628 render_sprite(render_num, xaddr, yaddr, _nattr.w, _ncol.w);
630629 frame_sprite_count++;
631630 if((frame_sprite_count >= max_sprite_per_frame) && (max_sprite_per_frame > 0)) break;
@@ -636,10 +635,7 @@ void TOWNS_SPRITE::render_full()
636635 void TOWNS_SPRITE::render_part(int start, int end)
637636 {
638637 // ToDo: Implement Register #2-5
639- uint16_t lot = reg_index & 0x3ff;
640- if(lot == 0) lot = 1024;
641638 if((start < 0) || (end < 0)) return;
642- if(end > lot) end = lot;
643639 if(start > end) return;
644640 // ToDo: Implement registers.
645641 if(reg_spen) {
@@ -660,7 +656,7 @@ void TOWNS_SPRITE::render_part(int start, int end)
660656 int yaddr = _ny.w & 0x1ff;
661657 // ToDo: wrap round.This is still bogus implement.
662658 // 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);
664660
665661 render_sprite(render_num, xaddr, yaddr, _nattr.w, _ncol.w);
666662 frame_sprite_count++;
@@ -832,30 +828,25 @@ bool TOWNS_SPRITE::write_debug_reg(const _TCHAR *reg, uint32_t data)
832828 void TOWNS_SPRITE::event_frame()
833829 {
834830 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+// }
839836 if(lot == 0) lot = 1024;
840837 frame_sprite_count = 0;
841838 if(sprite_enabled){
842839 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();
858844 }
845+ //} else {
846+ //render_num = 0;
847+ //render_mod = 0;
848+ //sprite_enabled = false;
849+ //}
859850 } else {
860851 render_num = 0;
861852 render_mod = 0;
@@ -864,6 +855,11 @@ void TOWNS_SPRITE::event_frame()
864855 }
865856 }
866857
858+void TOWNS_SPRITE::event_vline(int v, int clock)
859+{
860+ do_vline_hook(v);
861+}
862+
867863 void TOWNS_SPRITE::do_vline_hook(int line)
868864 {
869865 int lot = reg_index & 0x3ff;
@@ -871,15 +867,19 @@ void TOWNS_SPRITE::do_vline_hook(int line)
871867 if(lot == 0) lot = 1024;
872868 if((max_sprite_per_frame > 0) && (max_sprite_per_frame < lot)) lot = max_sprite_per_frame;
873869
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;
881882 }
882- if((nf >= 1) && (render_num < lot)) render_part(render_num, render_num + nf);
883883 }
884884 }
885885 // Q: Is changing pages syncing to Frame?
@@ -904,7 +904,12 @@ uint32_t TOWNS_SPRITE::read_signal(int id)
904904 {
905905 /*if(id == SIG_TOWNS_SPRITE_ANKCG) { // write CFF19
906906 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) {
908913 uint32_t v = ((tvram_enabled_bak) ? 0xffffffff : 0);
909914 tvram_enabled_bak = false;
910915 return v;
--- a/source/src/vm/fmtowns/towns_sprite.h
+++ b/source/src/vm/fmtowns/towns_sprite.h
@@ -128,6 +128,7 @@ public:
128128 uint32_t __FASTCALL read_signal(int id);
129129 void initialize();
130130 void event_frame();
131+ void event_vline(int v, int clk);
131132 bool process_state(FILEIO* state_fio, bool loading);
132133
133134 void set_context_vram(TOWNS_VRAM *p)
旧リポジトリブラウザで表示