# jrmcpeek/vb3dec architecture

> Architecture diagram of the GitHub repository jrmcpeek/vb3dec, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jrmcpeek/vb3dec
- Repository: https://github.com/jrmcpeek/vb3dec
- Video tour (about a minute): https://gitdiagram.com/jrmcpeek/vb3dec/video

## Overview

vb3dec is a Go decompiler for 16-bit Visual Basic 3 executables. Its CLI opens an NE binary, recovers project metadata and form resources, and reconstructs form files and assets; it also disassembles P-code into Basic modules and writes project artifacts. The README documents broader P-code analysis capabilities, including control-flow recovery, type and parameter inference, and event mapping. Sampled source confirms NE parsing, form decoding, asset extraction, and ANSI conversion; P-code orchestration details are not fully shown, so uncertain internal wiring is omitted.

Main entry points: [`cmd/vb3dec/main.go`](https://github.com/jrmcpeek/vb3dec/blob/main/cmd/vb3dec/main.go) (Decompiler CLI), [`pkg/frm/extractor.go`](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/extractor.go) (Form extraction), [`pkg/frm/decoder.go`](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/decoder.go) (Form stream decoder), [`pkg/pcode/disasm.go`](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/disasm.go) (P-Code disassembler)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Command line"]
  node_cli["Decompiler CLI<br/>[main.go]"]
end

subgraph group_binary["NE parsing"]
  node_neparse["NE file parser<br/>[ne.go]"]
  node_resources["Resource directory<br/>[resource.go]"]
end

subgraph group_forms["Forms and assets"]
  node_vbproject["VB project metadata<br/>[project.go]"]
  node_formextract["Form extraction<br/>[extractor.go]"]
  node_formdecode["Form stream decoder<br/>[decoder.go]"]
  node_assetextract["FRX asset extraction<br/>[asset.go]"]
  node_formwriter["Form artifact writer<br/>[writer.go]"]
  node_encoding["Windows-1252 conversion<br/>[win1252.go]"]
end

subgraph group_code["P-Code reconstruction"]
  node_pcodeproject["P-Code project analysis<br/>[project.go]"]
  node_disasm["P-Code disassembler<br/>[disasm.go]"]
  node_opcodes["Opcode definitions<br/>[opcodes.go]"]
  node_controltable["Control token table<br/>[control_table.go]"]
end

node_user(("Analyst"))
node_target["VB3 executable"]
node_output["Project artifacts"]

node_user -->|"runs"| node_cli
node_target -->|"supplies input"| node_cli
node_cli -->|"opens binary"| node_neparse
node_neparse -->|"parses resources"| node_resources
node_cli -->|"extracts forms"| node_formextract
node_formextract -->|"parses project"| node_vbproject
node_formextract -->|"reads resources"| node_resources
node_formextract -->|"decodes streams"| node_formdecode
node_formdecode -->|"decodes text"| node_encoding
node_formdecode -->|"provides FRX data"| node_assetextract
node_cli -->|"saves forms"| node_formwriter
node_formwriter -->|"writes artifacts"| node_output
node_cli -->|"decompiles code"| node_pcodeproject
node_pcodeproject -->|"disassembles procedures"| node_disasm
node_disasm -->|"looks up opcodes"| node_opcodes
node_disasm -->|"maps control tokens"| node_controltable
node_cli -->|"writes project files"| node_output

click node_cli "https://github.com/jrmcpeek/vb3dec/blob/main/cmd/vb3dec/main.go"
click node_neparse "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/ne/ne.go"
click node_resources "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/ne/resource.go"
click node_vbproject "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/project.go"
click node_formextract "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/extractor.go"
click node_formdecode "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/decoder.go"
click node_assetextract "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/asset.go"
click node_formwriter "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/writer.go"
click node_pcodeproject "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/project.go"
click node_disasm "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/disasm.go"
click node_opcodes "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/opcodes.go"
click node_controltable "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/control_table.go"
click node_encoding "https://github.com/jrmcpeek/vb3dec/blob/main/pkg/win1252/win1252.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli toneBlue
class node_neparse,node_resources toneAmber
class node_vbproject,node_formextract,node_formdecode,node_assetextract,node_formwriter,node_encoding toneMint
class node_pcodeproject,node_disasm,node_opcodes,node_controltable toneRose
class node_user,node_target,node_output toneIndigo
```

## Components

### Command line

- [Decompiler CLI](https://github.com/jrmcpeek/vb3dec/blob/main/cmd/vb3dec/main.go): `cmd/vb3dec/main.go`

### NE parsing

- [NE file parser](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/ne/ne.go): `pkg/ne/ne.go`
- [Resource directory](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/ne/resource.go): `pkg/ne/resource.go`

### Forms and assets

- [VB project metadata](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/project.go): `pkg/frm/project.go`
- [Form extraction](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/extractor.go): `pkg/frm/extractor.go`
- [Form stream decoder](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/decoder.go): `pkg/frm/decoder.go`
- [FRX asset extraction](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/asset.go): `pkg/frm/asset.go`
- [Form artifact writer](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/frm/writer.go): `pkg/frm/writer.go`
- [Windows-1252 conversion](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/win1252/win1252.go): `pkg/win1252/win1252.go`

### P-Code reconstruction

- [P-Code project analysis](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/project.go): `pkg/pcode/project.go`
- [P-Code disassembler](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/disasm.go): `pkg/pcode/disasm.go`
- [Opcode definitions](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/opcodes.go): `pkg/pcode/opcodes.go`
- [Control token table](https://github.com/jrmcpeek/vb3dec/blob/main/pkg/pcode/control_table.go): `pkg/pcode/control_table.go`

### Other components

- **Analyst**
- **VB3 executable**
- **Project artifacts**

## Connections

- Analyst → Decompiler CLI: runs
- VB3 executable → Decompiler CLI: supplies input
- Decompiler CLI → NE file parser: opens binary
- NE file parser → Resource directory: parses resources
- Decompiler CLI → Form extraction: extracts forms
- Form extraction → VB project metadata: parses project
- Form extraction → Resource directory: reads resources
- Form extraction → Form stream decoder: decodes streams
- Form stream decoder → Windows-1252 conversion: decodes text
- Form stream decoder → FRX asset extraction: provides FRX data
- Decompiler CLI → Form artifact writer: saves forms
- Form artifact writer → Project artifacts: writes artifacts
- Decompiler CLI → P-Code project analysis: decompiles code
- P-Code project analysis → P-Code disassembler: disassembles procedures
- P-Code disassembler → Opcode definitions: looks up opcodes
- P-Code disassembler → Control token table: maps control tokens
- Decompiler CLI → Project artifacts: writes project files
