| Changelog |
| Area | Changes | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Bug Fixes |
Removed dead code: gen_double() removed from all backends (never called, had bug in 8086exe doing ×4 instead of ×2). gen_store_imm_param 8080/8085: Fixed address corruption bug where mvi l/mvi h overwrote computed address after dad b; now uses register A correctly. 8086mz ast_gen_rvalue_sec: Added missing "8086mz" target to secondary register optimization check; 8086exe/8086mz now correctly avoids push/pop for RHS constants and local/param variables. | ||||||||||||
| Condition Opt. |
Eliminated redundant comparison with 0 in if/while/for/?:/&&/|| conditions. Now uses gen_jz/gen_jnz directly instead of push; load 0; pop; cmp_eq; jz. Z80: 6 → 3 instructions (50% reduction). 8086: 6 → 2 instructions (67% reduction). | ||||||||||||
| Comparison Opt. |
All 6 comparison operators (==, !=, <, >, <=, >=) now use ast_gen_rvalue_sec to avoid push/pop when RHS is constant, local, or param variable. Same optimization already used for arithmetic operators. Saves 2 instructions per comparison on Z80/8086/8086exe/8086mz. | ||||||||||||
| Strength Reduction |
Division: x / 2n → x >> n (right shift) for power-of-2 divisors. Modulo: x % 2n → x & (2n - 1) (bitwise AND) for power-of-2 divisors. Modulo 1: x % 1 → 0. Replaces 16+ instruction division loop with 4 instruction AND on Z80. | ||||||||||||
| Compound Assign Opt. |
var += const now uses gen_load_imm_sec + gen_exchange instead of push; load_imm; pop on targets with secondary register optimization (Z80, 8086, 8086exe, 8086mz). Saves 2 instructions per compound assignment with constant RHS. | ||||||||||||
| Code Refactor | Created target_has_sec_reg_opt() helper function to replace repetitive !strcmp(target_cpu, ...) checks across 10+ locations in ast.c. | ||||||||||||
| Example (Z80) |
; Condition: if (x) ; Before: 6 instructions push hl ld hl, 0 pop de or a sbc hl, de ld hl, 0 jr nz, .L1 inc hl .L1: ld a, h or l jp z, .L2 ; After: 3 instructions ld a, h or l jp z, .L2 ; Modulo by 8: x % 8 ; Before: 16+ instr (division loop) ; After: 4 instr (bitwise AND) ld de, 7 ex de, hl ld a, e and l ld l, a ld a, d and h ld h, a | ||||||||||||
| Performance |
| ||||||||||||
| Test Suite | 43/43 tests passing across all platforms (Z80, 8080, 8085, 8086, 8086exe). Zero regressions. All 9 test programs compile successfully on all 5 architectures. |
| Area | Changes |
|---|---|
| AST Infrastructure |
New ast.h / ast.c module with complete AST implementation: 40+ node types (literals, operators, comparisons, logical, statements). Constant folding: 5 + 3 → 8, 2 * 3 → 6. Algebraic simplification: x+0→x, x*1→x, x*0→0. AST discarded immediately after code generation (low memory). |
| Code Gen Opt. |
New gen_store_imm_local() for immediate-to-local stores: Z80: 12 instr → 3 instr (75% reduction). 8086: 5 instr → 2 instr (60% reduction). 8080/8085: 10 instr → 5 instr (50% reduction). Special case: zero uses xor reg,reg for smaller encoding. |
| Example (Z80) |
; Before: 12 instr, ~30 bytes push ix pop hl ld de, -2 add hl, de push hl ld hl, 65 pop de ex de, hl ld [hl], e inc hl ld [hl], d ; After: 3 instr, ~9 bytes ld a, 65 ld [ix-2], a ld a, 0 ld [ix-1], a |
| Test Suite | 43/43 tests passing. Zero regressions. |
| Area | Changes |
|---|---|
| Z80 Peephole Fixes |
Pattern 15 (inc): fixed to match 21 instructions (was 19) — added final pop de; ex de, hl. Pattern 16 (dec): fixed to match 23 instructions (was 21) — added final pop de; ex de, hl. Eliminates leftover pop de; ex de, hl after optimized inc/dec word [ix+N]. |
| Assembler Fix |
Z80 emit_im(): corrected token validation (!= TOK_VALUE → == TOK_VALUE). Instructions IM 0, IM 1, IM 2 now assemble correctly. |
| Test Suite | 43/43 tests passing (was 42/43). asm/z80/all_opcodes now passes. Zero regressions. |
| Area | Changes | ||||
|---|---|---|---|---|---|
| Z80 Peephole Opt. |
Pattern 15 (inc): push ix; pop hl; ld de,OFF; add hl,de; push hl; ld a,[hl]; inc hl; ld h,[hl]; ld l,a; push hl; push hl; ld hl,1; pop de; add hl,de; pop de; ex de,hl; ld [hl],e; inc hl; ld [hl],d → inc word [ix+OFF] — 19→1 instructions (95% reduction). Pattern 16 (dec): push ix; pop hl; ld de,OFF; add hl,de; push hl; ld a,[hl]; inc hl; ld h,[hl]; ld l,a; push hl; push hl; ld hl,1; pop de; ex de,hl; or a; sbc hl,de; pop de; ex de,hl; ld [hl],e; inc hl; ld [hl],d → dec word [ix+OFF] — 21→1 instructions (95% reduction). PEEP_WINDOW: increased from 12 to 25 to support larger pattern matching. | ||||
| Example |
; Before (a++) push ix pop hl ld de, -2 add hl, de push hl ld a, [hl] inc hl ld h, [hl] ld l, a push hl push hl ld hl, 1 pop de add hl, de pop de ex de, hl ld [hl], e inc hl ld [hl], d ; After inc word [ix-2] | ||||
| Test Suite | 42/42 tests passing across all platforms (Z80, 8080, 8085, 8086, 8086exe). Zero regressions. | ||||
| Performance |
|
| Area | Changes | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Variable Access Opt. |
Z80 gen_local_addr/gen_param_addr: changed to keep result in HL, eliminating redundant register swaps. 8086 immediate ops: push ax; mov ax,IMM; pop bx; op ax,bx → op ax,IMM (4→1 instr, 75% reduction). 8086 inc/dec: inc word [bp+VAR], dec word [bp+VAR] (7→1 instr). Z80 inc/dec: inc word [ix+VAR], dec word [ix+VAR] (8→1 instr). 8080/8085 store imm: 8 instr → 5 using MVI instead of LXI+XCHG (37.5% reduction). | ||||||||||
| Parser Fix | Peephole parser now accepts multiple tabs/spaces at line start (was only 1 tab or exactly 3 spaces) — critical fix enabling pattern detection across all backends. | ||||||||||
| Validation |
1,614 automated tests generated covering all B language constructs (arithmetic, bitwise, comparison, logical, control flow, functions, arrays, expressions, edge cases). 6,456 successful compilations (1,614 × 4 platforms). 100% success rate — zero errors across Z80, 8086, 8080, 8085. Zero regressions — all 9 official tests continue passing. | ||||||||||
| Performance |
|
| Area | Changes |
|---|---|
| Assembler — New Instr. |
8080/8085 ldax: added ldax b/d/bc/de/[bc]/[de]/[b]/[d] — completes the original 8080 instruction set. Z80 EX (SP),IX/IY: added exchange of stack top with index registers — completes the Z80 instruction set. |
| Peephole Refactor |
Patterns moved from peep.c into per-CPU backends via gen_peep_replace() callback. Each processor implementation is now fully self-contained. Window size fixed to allow w≥1 and same-count replacements (n≤w). |
| New Z80 Opt. |
ld hl,N; add hl,sp; ld sp,hl → inc sp×N — up to -4 bytes/call. push bc; pop hl → ld h,b; ld l,c — 47% faster. ex de,hl; inc sp×N; ex de,hl → inc sp×N. |
| New 8086 Opt. |
mov ax,0 → xor ax,ax — -1 byte (7 occurrences in test suite). mov dx,0 → xor dx,dx (8086exe) — -1 byte (36 occurrences). |
| New 8086exe Opt. | not ax; not dx; add ax,1; adc dx,0 → neg dx; neg ax; sbb dx,0 — -2 bytes. |
| New 8080/8085 Opt. |
push h; pop b → mov b,h; mov c,l — 10 T faster. push h; lxi h,N; pop d; xchg → xchg; lxi h,N; xchg — -1 byte, 16 T faster. |
| Math Library |
__mul16, __div16, __mod16 moved from inline code to runtime library for 8080/8085 targets. B compiler emits call __mul16 etc. instead of ~30 bytes inline per operation. Also added __div8, __mod8, cbw, comparison and shift helpers. |
| Documentation |
All 54 source files now have bilingual (English + Portuguese) comments on every function. Long functions have logical block comments in both languages. |
| Test Suite | 24/24 B language tests passing across 3 platforms (Z80 8/8, 8080 8/8, 8086 8/8), verified via msxdosemu and emu2 emulators. All outputs match expected values exactly. |
| Area | Changes |
|---|---|
| 8080/8085 Fixes |
gen_cmp_gt: removed xchg (operand swap caused > to compute reverse). gen_mul/div/mod: added push b/pop b to preserve frame pointer. Local offset formula fixed: -(offset*2+4) instead of offset*2-2-nlocals*2. |
| Builder |
Removed RetroLang references: retrolang- → hcbcomp-, [retrolang:include_path] → [blang:include_path]. Removed .rl extension. Added -I include path support for .b files. |
| Test Suite | 42/42 tests passing across 5 platforms (Z80 11/11, 8080 10/10, 8085 1/1, 8086 11/11, 8086exe 9/9). 8086 tests now run on emu2. |
| Documentation |
New HTML3 website (site/) with frameset, sidebar, 20+ pages. Landing page (site-principal/). Expanded builder .prj reference (all 6 sections, every key). Expanded B language reference (13 sections, 7 examples). REX format specification. Librarian docs corrected. macOS prerequisites added. Downloads page with /hcsdk/distrosite/ links. GitHub links updated. |
| Area | Changes |
|---|---|
| RTL Args | Right-to-left evaluation via two-pass fseek. gen_reverse_args() removed (~180 lines). Unlimited arguments, nested calls. No ABI change. |
| Peephole | New peep.c module. Z80: local load 9→2 instr, store imm 12→3. 8086: LEA+deref 3→1, global deref 3→1, store imm 5→1. ~30% reduction. |
| Z80 Fixes | gen_cmp_gt/lt/le/ge: added missing ex de,hl. gen_cmp_le: fixed inverted branch. |
| 8080/8085 Fixes | gen_sub: removed erroneous xchg that swapped operands. |
| Assembler | Fixed 8086 segfault (|→&&). Added mov word [mem], imm encoding. |
| Builder | Added [files:8086exe] platform selector. MZ EXE linker format. |
| Hello-B | Fixed 8086 EXE project ([files:8086] → [files:8086exe]) for far-pointer library compatibility. |
| Area | Changes |
|---|---|
| Initial Release | Multi-target B compiler (Z80, 8080, 8085, 8086). Assembler, linker, librarian, builder, CP/M emulator. Full B language with preprocessor. Runtime libraries for CP/M and MS-DOS. |