diff options
Diffstat (limited to 'engines/cge/ems.cpp')
-rw-r--r-- | engines/cge/ems.cpp | 310 |
1 files changed, 148 insertions, 162 deletions
diff --git a/engines/cge/ems.cpp b/engines/cge/ems.cpp index abf118bda2..b654000553 100644 --- a/engines/cge/ems.cpp +++ b/engines/cge/ems.cpp @@ -24,217 +24,203 @@ * This code is based on original Soltys source code * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon */ - + #include "cge/general.h" namespace CGE { -#define EMS_INT 0x67 -#define PAGE_MASK 0x3FFF -#define SIZ(n) ((n) ? ((long)n) : (0x10000L)) +#define EMS_INT 0x67 +#define PAGE_MASK 0x3FFF +#define SIZ(n) ((n) ? ((long)n) : (0x10000L)) -enum EMM_FUN { GET_STATUS = 0x40, - GET_FRAME, - GET_SIZE, - OPEN_HANDLE, - MAP_PAGE, - CLOSE_HANDLE, - GET_VER, - SAVE_CONTEXT, - REST_CONTEXT, - GET_PAGES = 0x4B, - GET_HANDLES, - GET_INFO, - CONTROL }; +enum EMM_FUN { + GET_STATUS = 0x40, GET_FRAME, GET_SIZE, OPEN_HANDLE, MAP_PAGE, + CLOSE_HANDLE, GET_VER, SAVE_CONTEXT, REST_CONTEXT, GET_PAGES = 0x4B, + GET_HANDLES, GET_INFO, CONTROL +}; void *EMM::Frame = NULL; -EMM::EMM (long size): Han(-1), Top(0), Lim(0), List(NULL) { -/* - if (Test()) - { - asm mov ah,GET_FRAME // get EMS frame segment - asm int EMS_INT // do it! - asm or ah,ah // see status - asm jnz xit // abort on error - Frame = (void _seg *) _BX; // save frame segment - - if (size == 0) - { - asm mov ah,GET_SIZE // get EMS memory size - asm int EMS_INT // do it! - asm or ah,ah // see status - asm jnz xit // abort on error - asm or bx,bx // test page count - asm jz xit // abort if no free pages - // number of available pages in BX is ready to use by OPEN - } - else _BX = (uint16) ((size + PAGE_MASK) >> 14); - asm mov ah,OPEN_HANDLE // open EMM handle - asm int EMS_INT // do it! - asm or ah,ah // see status - asm jnz xit // abort on error - Han = _DX; - Lim = _BX; - Lim <<= 14; - _DX = Han; - asm mov ah,SAVE_CONTEXT // save mapping context - asm int EMS_INT // do it! - } - xit: -*/ +EMM::EMM(long size): Han(-1), Top(0), Lim(0), List(NULL) { + /* + if (Test()) + { + asm mov ah,GET_FRAME // get EMS frame segment + asm int EMS_INT // do it! + asm or ah,ah // see status + asm jnz xit // abort on error + Frame = (void _seg *) _BX; // save frame segment + + if (size == 0) + { + asm mov ah,GET_SIZE // get EMS memory size + asm int EMS_INT // do it! + asm or ah,ah // see status + asm jnz xit // abort on error + asm or bx,bx // test page count + asm jz xit // abort if no free pages + // number of available pages in BX is ready to use by OPEN + } + else _BX = (uint16) ((size + PAGE_MASK) >> 14); + asm mov ah,OPEN_HANDLE // open EMM handle + asm int EMS_INT // do it! + asm or ah,ah // see status + asm jnz xit // abort on error + Han = _DX; + Lim = _BX; + Lim <<= 14; + _DX = Han; + asm mov ah,SAVE_CONTEXT // save mapping context + asm int EMS_INT // do it! + } + xit: + */ warning("STUB: EMM:EMM"); } EMM::~EMM(void) { -/* - Release(); - if (Han >= 0) - { - _DX = Han; - asm mov ah,REST_CONTEXT - asm int EMS_INT - asm mov ah,CLOSE_HANDLE - asm int EMS_INT - } -*/ + /* + Release(); + if (Han >= 0) + { + _DX = Han; + asm mov ah,REST_CONTEXT + asm int EMS_INT + asm mov ah,CLOSE_HANDLE + asm int EMS_INT + } + */ warning("STUB: EMM::~EMM"); } - bool EMM::Test(void) { -/* - static char e[] = "EMMXXXX0"; - - asm mov ax,0x3D40 - asm mov dx,offset e - asm int 0x21 - asm jc fail - - asm push ax - asm mov bx,ax - asm mov ax,0x4407 - asm int 0x21 - - asm pop bx - asm push ax - asm mov ax,0x3E00 - asm int 0x21 - asm pop ax - - asm cmp al,0x00 - asm je fail - - success: - return TRUE; - fail: - return FALSE; -*/ + /* + static char e[] = "EMMXXXX0"; + + asm mov ax,0x3D40 + asm mov dx,offset e + asm int 0x21 + asm jc fail + + asm push ax + asm mov bx,ax + asm mov ax,0x4407 + asm int 0x21 + + asm pop bx + asm push ax + asm mov ax,0x3E00 + asm int 0x21 + asm pop ax + + asm cmp al,0x00 + asm je fail + + success: + return TRUE; + fail: + return FALSE; + */ warning("EMM::Test"); return FALSE; } -EMS * EMM::Alloc (uint16 siz) { -/* - long size = SIZ(siz), - top = Top; - - uint16 pgn = (uint16) (top >> 14), - cnt = (uint16) ((top + size + PAGE_MASK) >> 14) - pgn; +EMS *EMM::Alloc(uint16 siz) { + /* + long size = SIZ(siz), + top = Top; - if (cnt > 4) - { - top = (top + PAGE_MASK) & 0xFFFFC000L; - ++ pgn; - -- cnt; - } + uint16 pgn = (uint16) (top >> 14), + cnt = (uint16) ((top + size + PAGE_MASK) >> 14) - pgn; - if (size <= Lim - top) - { - EMS * e = new EMS, * f; + if (cnt > 4) + { + top = (top + PAGE_MASK) & 0xFFFFC000L; + ++ pgn; + -- cnt; + } - if (e) - { - Top = (e->Ptr = top) + (e->Siz = siz); - e->Emm = this; + if (size <= Lim - top) + { + EMS * e = new EMS, * f; - if (List) + if (e) { - for (f = List; f->Nxt; f = f->Nxt); - return (f->Nxt = e); // existing list: link to the end + Top = (e->Ptr = top) + (e->Siz = siz); + e->Emm = this; + + if (List) + { + for (f = List; f->Nxt; f = f->Nxt); + return (f->Nxt = e); // existing list: link to the end + } + else + { + return (List = e); // empty list: link to the head + } } - else - { - return (List = e); // empty list: link to the head } - } - } - fail: return NULL; -*/ + fail: return NULL; + */ warning("STUB: EMM::Alloc"); return NULL; } -void EMM::Release (void) { - while (List) - { - EMS * e = List; - List = e->Nxt; - delete e; - } - Top = 0; +void EMM::Release(void) { + while (List) { + EMS *e = List; + List = e->Nxt; + delete e; + } + Top = 0; } -EMS::EMS (void) -: Ptr(0), Siz(0), Nxt(NULL) -{ +EMS::EMS(void) : Ptr(0), Siz(0), Nxt(NULL) { } -void * EMS::operator & () const -{ -/* - uint16 pgn = (uint16) (Ptr >> 14), - off = (uint16) Ptr & PAGE_MASK, - cnt = (uint16) ((Ptr + SIZ(Siz) + PAGE_MASK) >> 14) - pgn, - cmd = MAP_PAGE << 8; - - _DX = Emm->Han; // take EMM handle - asm dec cnt // prapare for deferred checking - asm or dx,dx // see if valid - asm jns more // negative handle = unavailable - - fail: return NULL; - - more: - asm mov ax,cmd // command + page frame index - asm mov bx,pgn // logical page number - asm int EMS_INT // do it! - asm or ah,ah // check error code - asm jnz fail // exit on error - asm inc cmd // advance page frame index - asm inc pgn // advance logical page number - asm cmp al,byte ptr cnt // all pages? - asm jb more - - return (void *) (EMM::Frame + (void *) off); -*/ +void *EMS::operator & () const { + /* + uint16 pgn = (uint16) (Ptr >> 14), + off = (uint16) Ptr & PAGE_MASK, + cnt = (uint16) ((Ptr + SIZ(Siz) + PAGE_MASK) >> 14) - pgn, + cmd = MAP_PAGE << 8; + + _DX = Emm->Han; // take EMM handle + asm dec cnt // prapare for deferred checking + asm or dx,dx // see if valid + asm jns more // negative handle = unavailable + + fail: return NULL; + + more: + asm mov ax,cmd // command + page frame index + asm mov bx,pgn // logical page number + asm int EMS_INT // do it! + asm or ah,ah // check error code + asm jnz fail // exit on error + asm inc cmd // advance page frame index + asm inc pgn // advance logical page number + asm cmp al,byte ptr cnt // all pages? + asm jb more + + return (void *) (EMM::Frame + (void *) off); + */ warning("STUB: EMS::operator &"); return NULL; } -uint16 EMS::Size (void) -{ - return Siz; +uint16 EMS::Size(void) { + return Siz; } } // End of namespace CGE |