97/pcb/php-parser/010_template/orcad2x.bt
2025-02-22 18:50:46 +03:00

1 line
5.8 KiB
Plaintext

//-------------------------------------------------------------------------------------------------
//--- 010 Editor v13.0 Binary Template
//
// File: orcad21.bt
// Author: RomanRom2
// E-mail: RomanRom2@gmail.com
// Website: https://sprinter.ru/
// Version: 1.0
// Purpose: Parse OrCAD v2.10 database PCB (BRD?) files.
// It probably allowed to any 16-bit OrCad versions 1.xx, 2.xx, 3.xx and 4.xx
// Category: CAD
// File Mask: *.pcb
// ID Bytes:
// History:
// 1.0 2023-10-07 RomanRom2: Initial release
// References:
// https://reverse.sprinter.ru/orcad210
//-------------------------------------------------------------------------------------------------
typedef enum <byte> {
R_0 = 0,
R_90 = 1,
R_180 = 2,
R_270 = 3,
} TRotate;
typedef enum <byte> {
Bottom = 0,
Top = 1,
} TLayer;
typedef enum <byte> {
Begin = 0,
Continue = 1,
} TLineFlags;
typedef struct THeader {
char file_name[8];
short unk1; // version? always ADh
short comp_count <bgcolor=cLtPurple>; // real count + 1, why?
short unk3;
short unk4;
short unk5;
short unk6;
short unk7;
short unk8;
short unk9;
short unk10;
short unk11;
short texts_ofs <bgcolor=cWhite>;
short texts_size <bgcolor=cWhite>; // in bytes
short brd_points_count <bgcolor=cLtBlue>;
short net_points_count <bgcolor=cBlue>;
short unk16;
short unk17;
short unk18;
char file_ext[4];
};
THeader hdr;
// components
// ================================================================================================
SetBackColor( cLtPurple );
struct TComponent {
char timestamp[8];
byte unk1; // version? always AAh
TRotate rotate;
TLayer lines_layer;
byte unk3;
short pos_x_left;
short pos_x_right;
short pos_y_bottom;
short pos_y_top;
short pos_x;
short pos_y;
short height;
short width;
short lines_ofs;
short names_ofs;
short pads_ofs;
short next_ofs1;
short next_ofs2;
char pattern[8] <bgcolor=cRed>;
short next_ofs3;
// lines
SetBackColor( cLtYellow );
local int lines_count = (names_ofs - lines_ofs) / 6;
struct Tlines {
byte unk1;
TLineFlags flags;
short pos_x;
short pos_y;
} line[lines_count];
// names
SetBackColor( cLtGreen );
local short names_count = (pads_ofs - names_ofs) / 24;
struct TNames {
short unk1;
short unk2;
char str[8] <bgcolor=cRed>;
short unk4;
short unk5;
short unk6;
short unk7;
short pos_x;
short pos_y;
} name[names_count] <comment = str>;
// pads
typedef enum <byte> {
SMD = 1,
Plated = 3,
} TPadsFlags;
SetBackColor( cGray );
local short pads_count = (next_ofs1 - pads_ofs) / 24;
struct TPad {
char des[4];
char net[8];
byte shape;
short height;
short width;
TRotate rotate;
TPadsFlags flags;
byte hole_dia;
short pos_x;
short pos_y;
local string des_net = des + net;
} pad[pads_count] <optimize=false, comment = des_net>;
local string name_pattern = name[0].str + pattern;
} comp[hdr.comp_count-1] <optimize=false, comment = name_pattern>;
// text strings
// ================================================================================================
typedef enum <byte> {
Flipped = 0,
NotFlipped = 1,
} TFlagsA;
typedef enum <byte> {
NotVisible = 0,
Visible = 1,
} TFlagsB;
typedef struct {
BigEndian();
byte raw <format=binary>;
LittleEndian();
FSkip (-1);
BitfieldLeftToRight();
TFlagsA PadType: 4;
TFlagsB PinType: 4;
} TTextsFlags;
typedef struct {
char unk[12];
byte len;
short size_h;
short size_v;
TRotate rotate;
TLayer layer;
TTextsFlags flags;
short pos_x;
short pos_y;
char str[len];
} TTextString;
SetBackColor( cWhite );
local int index;
index = 0;
do {
TTextString txt <comment = str>;
index = index + 24 + txt.len;
}
while (index < hdr.texts_size);
// board points
// ================================================================================================
SetBackColor( cLtBlue );
typedef struct {
TLineFlags flags;
byte unk2;
short pos_x;
short pos_y;
short unk5;
} TBoardPoint;
TBoardPoint brd[hdr.brd_points_count];
// net points
// ================================================================================================
typedef enum <byte> {
NetBegin = 0,
NetContinue = 1,
VIA_special = 6,
VIA = 7,
} TNetPoiFlagsB;
typedef struct {
BigEndian();
byte raw <format=binary>;
LittleEndian();
FSkip (-1);
BitfieldLeftToRight();
byte layer: 4;
TNetPoiFlagsB PinType: 4;
} TNetPoiFlags;
SetBackColor( cBlue );
typedef struct {
TNetPoiFlags flags;
byte size;
short pos_x;
short pos_y;
short net_id;
} TNetPoint;
TNetPoint net[hdr.net_points_count] <optimize=true>;