Added JSR and RET functions to CMDFIFO (Voodoo2/Banshee/Voodoo3).
This commit is contained in:
parent
79c820e7b1
commit
f5e3dd9dce
@ -1509,7 +1509,9 @@ struct _cmdfifo_info
|
|||||||
Bit32u depth; /* current depth */
|
Bit32u depth; /* current depth */
|
||||||
Bit32u depth_needed; /* depth needed for command */
|
Bit32u depth_needed; /* depth needed for command */
|
||||||
Bit32u holes; /* number of holes */
|
Bit32u holes; /* number of holes */
|
||||||
|
Bit32u retAddr;
|
||||||
bool cmd_ready;
|
bool cmd_ready;
|
||||||
|
bool jsr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -2936,11 +2936,13 @@ Bit32u cmdfifo_r(cmdfifo_info *f)
|
|||||||
|
|
||||||
data = *(Bit32u*)(&v->fbi.ram[f->rdptr & v->fbi.mask]);
|
data = *(Bit32u*)(&v->fbi.ram[f->rdptr & v->fbi.mask]);
|
||||||
f->rdptr += 4;
|
f->rdptr += 4;
|
||||||
if (f->rdptr >= f->end) {
|
if (!f->jsr) {
|
||||||
BX_INFO(("CMDFIFO RdPtr rollover"));
|
if (f->rdptr >= f->end) {
|
||||||
f->rdptr = f->base;
|
BX_INFO(("CMDFIFO RdPtr rollover"));
|
||||||
|
f->rdptr = f->base;
|
||||||
|
}
|
||||||
|
f->depth--;
|
||||||
}
|
}
|
||||||
f->depth--;
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2961,6 +2963,24 @@ void cmdfifo_process(cmdfifo_info *f)
|
|||||||
switch (code) {
|
switch (code) {
|
||||||
case 0: // NOP
|
case 0: // NOP
|
||||||
break;
|
break;
|
||||||
|
case 1: // JSR
|
||||||
|
if (f->jsr) {
|
||||||
|
BX_ERROR(("cmdfifo_process(): JSR: already inside of subroutine"));
|
||||||
|
} else {
|
||||||
|
f->jsr = true;
|
||||||
|
f->retAddr = f->rdptr;
|
||||||
|
f->rdptr = (command >> 4) & 0xfffffc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: // RET
|
||||||
|
if (!f->jsr) {
|
||||||
|
BX_ERROR(("cmdfifo_process(): RET: not inside of subroutine"));
|
||||||
|
} else {
|
||||||
|
f->rdptr = f->retAddr;
|
||||||
|
f->retAddr = 0;
|
||||||
|
f->jsr = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 3: // JMP
|
case 3: // JMP
|
||||||
f->rdptr = (command >> 4) & 0xfffffc;
|
f->rdptr = (command >> 4) & 0xfffffc;
|
||||||
if (f->count_holes) {
|
if (f->count_holes) {
|
||||||
@ -3209,7 +3229,7 @@ void cmdfifo_process(cmdfifo_info *f)
|
|||||||
BX_ERROR(("CMDFIFO: unsupported packet type %d", type));
|
BX_ERROR(("CMDFIFO: unsupported packet type %d", type));
|
||||||
}
|
}
|
||||||
f->depth_needed = cmdfifo_calc_depth_needed(f);
|
f->depth_needed = cmdfifo_calc_depth_needed(f);
|
||||||
if (f->depth < f->depth_needed) {
|
if (!f->jsr && f->depth < f->depth_needed) {
|
||||||
f->cmd_ready = 0;
|
f->cmd_ready = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user