LOCK prefix unallowed (op1=0x87, attr=0x300, mod=0xc0, nnn=5)
Any help would be appreciated.
Code: Select all
[extern _sched]
[extern _scrnPc]
[global _Switch]
_Switch:
REG_SAVE
call _sched
cli
REG_RESTORE_MASTER
sti
mov al,0x20
out 0x20,al
[extern _cProc]
%macro REG_SAVE 0
cld
pushad
push ds
push es
push fs
push gs
mov eax,[_cProc]
mov [eax],esp
%endmacro
%macro REG_RESTORE_MASTER 0
mov eax,[_cProc]
mov esp,[eax]
pop gs
pop fs
pop es
pop ds
popad
iretd
%endmacro
[global _mtask_start]
_mtask_start:
mov eax,[_cProc]
mov esp,[eax]
ret
Code: Select all
unsigned char kstacks[32][KSTACKTOP];
unsigned char ustacks[32][USTACKTOP];
unsigned int procnum;
typedef struct
{
unsigned int esp;
unsigned char is;
} proc_t;
proc_t * cProc;
proc_t aProc[32];
void init_task( int task , unsigned epoint )
{
...
}
void sched()
{
procnum++;
if (procnum > 32 || aProc[procnum].is != 1)
procnum = 1;
cProc = &aProc[procnum];
//scrnPc('0' + procnum);
}
void t1() {while(1){scrnPc('p');}}
void t2() {while(1){scrnPc('q');}}
void t3() {while(1){scrnPc('r');}}
void km(){for(;;){scrnPc('k');}};
void init_mtask()
{
init_task(1,(unsigned)km);
init_task(2,(unsigned)t1);
init_task(3,(unsigned)t2);
init_task(4,(unsigned)t3);
procnum = 1;
cProc = &aProc[procnum];
mtask_start();
}