| delorie.com/archives/browse.cgi | search |
| X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f |
| From: | blk5743 AT yahoo DOT com DOT tw |
| Newsgroups: | comp.os.msdos.djgpp |
| Subject: | Re: code from BC31(16bits) to DJGPP(32 bits) |
| Date: | 28 Nov 2005 19:27:44 -0800 |
| Organization: | http://groups.google.com |
| Lines: | 109 |
| Message-ID: | <1133234864.835782.126770@g49g2000cwa.googlegroups.com> |
| References: | <1133146328 DOT 335307 DOT 54810 AT g44g2000cwa DOT googlegroups DOT com> |
| <dmf6p4$kke$1 AT domitilla DOT aioe DOT org> | |
| <1133226276 DOT 234728 DOT 136880 AT f14g2000cwb DOT googlegroups DOT com> | |
| <dmgcpm$u34$1 AT domitilla DOT aioe DOT org> | |
| NNTP-Posting-Host: | 61.66.169.71 |
| Mime-Version: | 1.0 |
| X-Trace: | posting.google.com 1133234869 9434 127.0.0.1 (29 Nov 2005 03:27:49 GMT) |
| X-Complaints-To: | groups-abuse AT google DOT com |
| NNTP-Posting-Date: | Tue, 29 Nov 2005 03:27:49 +0000 (UTC) |
| In-Reply-To: | <dmgcpm$u34$1@domitilla.aioe.org> |
| User-Agent: | G2/0.2 |
| X-HTTP-UserAgent: | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1),gzip(gfe),gzip(gfe) |
| X-HTTP-Via: | 1.0 SVRPROXY |
| Complaints-To: | groups-abuse AT google DOT com |
| Injection-Info: | g49g2000cwa.googlegroups.com; posting-host=61.66.169.71; |
| posting-account=fl8v7w0AAAAQV4ThVU509YNPI8o0JeB3 | |
| To: | djgpp AT delorie DOT com |
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
| Reply-To: | djgpp AT delorie DOT com |
| Errors-To: | nobody AT delorie DOT com |
| X-Mailing-List: | djgpp AT delorie DOT com |
| X-Unsubscribes-To: | listserv AT delorie DOT com |
hello, this is my code of BC++ 31
i need to convert these code to DJGPP
i must know physical address of structrues and buffer which i must
assign to BIOS/INT call.
i do not know how can i get really address for these call that i can
use FP_SEG,FP_OFF in BC++ 31
#define TOTAL_REGIONS 12
//
// VDS DMA Descriptor Data Structure
typedef struct
{
ULONG RegionSize; // DDS region size
ULONG Offset; // DDS region offset
WORD Segment; // DDS region segement
WORD BufferID; // to be filled by VDS
ULONG PhysicalAddr; // to be filled by VDS
} DDS;
//
// VDS EDDS Region Data Structure
typedef struct
{
ULONG PhysicalAddr;
ULONG Size;
} REGION;
//
// VDS Extended DMA Descriptor Data Structure
typedef struct
{
ULONG RegionSize; // Size of the region
ULONG Offset; // Offset
ULONG Segment; // Segment, the upper 16 bits must be 0.
WORD NumberAvail; // number of region available
WORD NumberUsed; // number of region used, to be filled by
VDS
REGION Region[TOTAL_REGIONS]; // physical regions, to be filled
by VDS
} EDDS;
//
// PRD Table Structure
typedef struct // Physical Region Descriptor
{
ULONG BaseAddr; // Region base address
WORD ByteCount; // Region size
WORD EOT; // End of Table
} PRD_T;
//
typedef union
{
ULONG addr;
WORD addr_word[2];
} PRD_T_A;
BYTE far *r_buffer;
int LockDMARegion(ULONG size)
{
// Construct the EDDS table.
PRD_EDDS.RegionSize = size;
PRD_EDDS.Offset = FP_OFF(r_buffer);
PRD_EDDS.Segment = FP_SEG(r_buffer);
PRD_EDDS.NumberAvail = TOTAL_REGIONS;
_DI = (WORD)(&PRD_EDDS);
asm{
push es
mov ax, ds
mov es, ax // ES:DI points to PRD_EDDS
mov dx, 0 // DX = 0 as we does not use page-table EDDS
mov ax, 8105h // Scatter/Gather Lock Region request
int 4bh
pop es
jnc LockRegionOK
}
return 1; // Scatter/Gather Lock Region request failed.
LockRegionOK:
return 0; // Scatter/Gather Lock Region request OK.
}
int Lock_PRD()
{
if((*VDS_Exist) & 0x20)
{
if(PRD_DDS.BufferID == 0)
{
PRD_DDS.RegionSize = sizeof(PRD_Pool);
PRD_DDS.Offset = (WORD)(PRD_Table);
PRD_DDS.Segment = _DS;
_DI = (WORD)(&PRD_DDS);
asm{
push es
mov ax, ds
mov es, ax // ES:DI points to PRD_DDS
mov dx, 3ch
mov ax, 8103h
int 4bh // VDS: Lock DMA Buffer Region
pop es
jnc Lock_DDS_OK
}
return 1;
}
Lock_DDS_OK:
PRD_Addr.addr = PRD_DDS.PhysicalAddr;
}
else // VDS not exist
PRD_Addr.addr = ((ULONG)(_DS)<<4) + (WORD)(PRD_Table);
return 0;
}
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |