From 524a37fcf0681589a052c602c12752298dd3570d Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Mon, 18 May 2026 14:43:35 -0500 Subject: [PATCH] ORCA/C demos seem to be working! --- .gitattributes | 1 + benchmarks/bubbleSort.c | 13 + benchmarks/djb2Hash.c | 11 + benchmarks/globalArr8Sum.c | 9 + benchmarks/globalArrFill.c | 8 + benchmarks/globalArrSum.c | 10 + benchmarks/strLen.c | 14 + compare/evalAt.calypsi.lst | 2 +- compare/evalAt.ours.s | 232 +- compare/mul16to32.calypsi.lst | 2 +- compare/mul16to32.ours.s | 6 +- compare/sumSquares.calypsi.lst | 2 +- compare/sumSquares.ours.s | 3 +- demos/README.md | 149 + demos/build.sh | 61 + demos/frame.bin | Bin 0 -> 5554 bytes demos/frame.c | 97 + demos/frame.map | 213 + demos/frame.o | Bin 0 -> 3328 bytes demos/frame.omf | Bin 0 -> 37815 bytes demos/frame.reloc | Bin 0 -> 1228 bytes demos/heavyRelocs.bin | Bin 0 -> 23662 bytes demos/heavyRelocs.c | 38 + demos/heavyRelocs.map | 217 + demos/heavyRelocs.o | Bin 0 -> 23772 bytes demos/heavyRelocs.omf | Bin 0 -> 38552 bytes demos/heavyRelocs.reloc | Bin 0 -> 1792 bytes demos/helloBeep.bin | Bin 0 -> 3147 bytes demos/helloBeep.c | 25 + demos/helloBeep.map | 161 + demos/helloBeep.o | Bin 0 -> 1200 bytes demos/helloBeep.omf | Bin 0 -> 37408 bytes demos/helloBeep.reloc | Bin 0 -> 544 bytes demos/helloText.bin | Bin 0 -> 4664 bytes demos/helloText.c | 42 + demos/helloText.map | 199 + demos/helloText.o | Bin 0 -> 1908 bytes demos/helloText.omf | Bin 0 -> 37703 bytes demos/helloText.reloc | Bin 0 -> 1036 bytes demos/helloWindow.bin | Bin 0 -> 3841 bytes demos/helloWindow.c | 128 + demos/helloWindow.map | 187 + demos/helloWindow.o | Bin 0 -> 2372 bytes demos/helloWindow.omf | Bin 0 -> 37668 bytes demos/helloWindow.reloc | Bin 0 -> 856 bytes demos/launch.sh | 99 + demos/minicad.bin | Bin 0 -> 5805 bytes demos/minicad.c | 149 + demos/minicad.map | 223 + demos/minicad.o | Bin 0 -> 4036 bytes demos/minicad.omf | Bin 0 -> 38187 bytes demos/minicad.reloc | Bin 0 -> 1732 bytes demos/orcaFrame.bin | Bin 0 -> 4742 bytes demos/orcaFrame.c | 147 + demos/orcaFrame.map | 201 + demos/orcaFrame.o | Bin 0 -> 2252 bytes demos/orcaFrame.omf | Bin 0 -> 37835 bytes demos/orcaFrame.reloc | Bin 0 -> 1132 bytes demos/orcaFrameLike.bin | Bin 0 -> 4249 bytes demos/orcaFrameLike.c | 160 + demos/orcaFrameLike.map | 183 + demos/orcaFrameLike.o | Bin 0 -> 1416 bytes demos/orcaFrameLike.omf | Bin 0 -> 37605 bytes demos/orcaFrameLike.reloc | Bin 0 -> 868 bytes demos/orcaMiniCadLike.bin | Bin 0 -> 4763 bytes demos/orcaMiniCadLike.c | 155 + demos/orcaMiniCadLike.map | 201 + demos/orcaMiniCadLike.o | Bin 0 -> 2304 bytes demos/orcaMiniCadLike.omf | Bin 0 -> 37835 bytes demos/orcaMiniCadLike.reloc | Bin 0 -> 1132 bytes demos/orcaReversiLike.bin | Bin 0 -> 4249 bytes demos/orcaReversiLike.c | 136 + demos/orcaReversiLike.map | 183 + demos/orcaReversiLike.o | Bin 0 -> 1420 bytes demos/orcaReversiLike.omf | Bin 0 -> 37605 bytes demos/orcaReversiLike.reloc | Bin 0 -> 868 bytes demos/qdProbe.bin | Bin 0 -> 3360 bytes demos/qdProbe.c | 86 + demos/qdProbe.map | 169 + demos/qdProbe.o | Bin 0 -> 1484 bytes demos/qdProbe.omf | Bin 0 -> 37436 bytes demos/qdProbe.reloc | Bin 0 -> 592 bytes demos/reversi.bin | Bin 0 -> 9225 bytes demos/reversi.c | 355 ++ demos/reversi.map | 217 + demos/reversi.o | Bin 0 -> 9516 bytes demos/reversi.omf | Bin 0 -> 38609 bytes demos/reversi.reloc | Bin 0 -> 2284 bytes demos/test.sh | 108 + docs/USAGE.md | 162 +- runtime/build.sh | 2 + runtime/include/iigs/desktop.h | 56 + runtime/src/crt0.s | 19 + runtime/src/crt0Gsos.s | 34 + runtime/src/desktop.c | 168 + runtime/src/iigsGsos.s | 23 +- runtime/src/iigsGsosStub.s | 11 +- runtime/src/iigsToolbox.s | 4106 ++++++++++------- runtime/src/libc.c | 40 +- runtime/src/libgcc.s | 184 +- screenshots/frame.png | 3 + screenshots/heavyRelocs.png | 3 + screenshots/helloBeep.png | 3 + screenshots/helloText.png | 3 + screenshots/helloWindow.png | 3 + screenshots/minicad.png | 3 + screenshots/orcaFrame.png | 3 + screenshots/orcaFrameLike.png | 3 + screenshots/orcaMiniCadLike.png | 3 + screenshots/orcaReversiLike.png | 3 + screenshots/qdProbe.png | 3 + screenshots/reversi.png | 3 + scripts/benchCyclesPrecise.sh | 18 + scripts/genToolbox.py | 39 +- scripts/installCadius.sh | 34 + scripts/probeHelloWindow.sh | 161 + scripts/probeQdStartup.sh | 84 + scripts/runInMameWithGsosStub.sh | 6 +- scripts/runViaFinder.sh | 2 +- scripts/smokeTest.sh | 50 +- scripts/snapDemo.sh | 95 + src/link816/link816.cpp | 49 +- src/link816/omfEmit.cpp | 87 +- .../W65816/AsmParser/W65816AsmParser.cpp | 10 + src/llvm/lib/Target/W65816/CMakeLists.txt | 1 + .../W65816/MCTargetDesc/W65816AsmBackend.cpp | 9 + .../MCTargetDesc/W65816ELFObjectWriter.cpp | 1 + .../W65816/MCTargetDesc/W65816FixupKinds.h | 5 + .../W65816/MCTargetDesc/W65816MCAsmInfo.cpp | 7 + .../MCTargetDesc/W65816MCCodeEmitter.cpp | 9 + src/llvm/lib/Target/W65816/W65816.h | 8 + .../lib/Target/W65816/W65816AsmPrinter.cpp | 112 +- .../lib/Target/W65816/W65816BranchExpand.cpp | 72 + .../lib/Target/W65816/W65816ISelLowering.cpp | 325 +- .../lib/Target/W65816/W65816InstrFormats.td | 73 +- src/llvm/lib/Target/W65816/W65816InstrInfo.td | 175 +- .../lib/Target/W65816/W65816NarrowI32Mul.cpp | 12 +- .../lib/Target/W65816/W65816StackRelToImg.cpp | 289 +- .../Target/W65816/W65816StackSlotCleanup.cpp | 238 +- .../lib/Target/W65816/W65816TargetMachine.cpp | 11 + src/llvm/lib/Target/W65816/W65816UnLSR.cpp | 313 ++ 141 files changed, 9786 insertions(+), 1952 deletions(-) create mode 100644 .gitattributes create mode 100644 benchmarks/bubbleSort.c create mode 100644 benchmarks/djb2Hash.c create mode 100644 benchmarks/globalArr8Sum.c create mode 100644 benchmarks/globalArrFill.c create mode 100644 benchmarks/globalArrSum.c create mode 100644 benchmarks/strLen.c create mode 100644 demos/README.md create mode 100755 demos/build.sh create mode 100644 demos/frame.bin create mode 100644 demos/frame.c create mode 100644 demos/frame.map create mode 100644 demos/frame.o create mode 100644 demos/frame.omf create mode 100644 demos/frame.reloc create mode 100644 demos/heavyRelocs.bin create mode 100644 demos/heavyRelocs.c create mode 100644 demos/heavyRelocs.map create mode 100644 demos/heavyRelocs.o create mode 100644 demos/heavyRelocs.omf create mode 100644 demos/heavyRelocs.reloc create mode 100644 demos/helloBeep.bin create mode 100644 demos/helloBeep.c create mode 100644 demos/helloBeep.map create mode 100644 demos/helloBeep.o create mode 100644 demos/helloBeep.omf create mode 100644 demos/helloBeep.reloc create mode 100644 demos/helloText.bin create mode 100644 demos/helloText.c create mode 100644 demos/helloText.map create mode 100644 demos/helloText.o create mode 100644 demos/helloText.omf create mode 100644 demos/helloText.reloc create mode 100644 demos/helloWindow.bin create mode 100644 demos/helloWindow.c create mode 100644 demos/helloWindow.map create mode 100644 demos/helloWindow.o create mode 100644 demos/helloWindow.omf create mode 100644 demos/helloWindow.reloc create mode 100755 demos/launch.sh create mode 100644 demos/minicad.bin create mode 100644 demos/minicad.c create mode 100644 demos/minicad.map create mode 100644 demos/minicad.o create mode 100644 demos/minicad.omf create mode 100644 demos/minicad.reloc create mode 100644 demos/orcaFrame.bin create mode 100644 demos/orcaFrame.c create mode 100644 demos/orcaFrame.map create mode 100644 demos/orcaFrame.o create mode 100644 demos/orcaFrame.omf create mode 100644 demos/orcaFrame.reloc create mode 100644 demos/orcaFrameLike.bin create mode 100644 demos/orcaFrameLike.c create mode 100644 demos/orcaFrameLike.map create mode 100644 demos/orcaFrameLike.o create mode 100644 demos/orcaFrameLike.omf create mode 100644 demos/orcaFrameLike.reloc create mode 100644 demos/orcaMiniCadLike.bin create mode 100644 demos/orcaMiniCadLike.c create mode 100644 demos/orcaMiniCadLike.map create mode 100644 demos/orcaMiniCadLike.o create mode 100644 demos/orcaMiniCadLike.omf create mode 100644 demos/orcaMiniCadLike.reloc create mode 100644 demos/orcaReversiLike.bin create mode 100644 demos/orcaReversiLike.c create mode 100644 demos/orcaReversiLike.map create mode 100644 demos/orcaReversiLike.o create mode 100644 demos/orcaReversiLike.omf create mode 100644 demos/orcaReversiLike.reloc create mode 100644 demos/qdProbe.bin create mode 100644 demos/qdProbe.c create mode 100644 demos/qdProbe.map create mode 100644 demos/qdProbe.o create mode 100644 demos/qdProbe.omf create mode 100644 demos/qdProbe.reloc create mode 100644 demos/reversi.bin create mode 100644 demos/reversi.c create mode 100644 demos/reversi.map create mode 100644 demos/reversi.o create mode 100644 demos/reversi.omf create mode 100644 demos/reversi.reloc create mode 100755 demos/test.sh create mode 100644 runtime/include/iigs/desktop.h create mode 100644 runtime/src/desktop.c create mode 100644 screenshots/frame.png create mode 100644 screenshots/heavyRelocs.png create mode 100644 screenshots/helloBeep.png create mode 100644 screenshots/helloText.png create mode 100644 screenshots/helloWindow.png create mode 100644 screenshots/minicad.png create mode 100644 screenshots/orcaFrame.png create mode 100644 screenshots/orcaFrameLike.png create mode 100644 screenshots/orcaMiniCadLike.png create mode 100644 screenshots/orcaReversiLike.png create mode 100644 screenshots/qdProbe.png create mode 100644 screenshots/reversi.png create mode 100755 scripts/installCadius.sh create mode 100755 scripts/probeHelloWindow.sh create mode 100755 scripts/probeQdStartup.sh create mode 100755 scripts/snapDemo.sh create mode 100644 src/llvm/lib/Target/W65816/W65816UnLSR.cpp diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..24a8e87 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.png filter=lfs diff=lfs merge=lfs -text diff --git a/benchmarks/bubbleSort.c b/benchmarks/bubbleSort.c new file mode 100644 index 0000000..3d89df1 --- /dev/null +++ b/benchmarks/bubbleSort.c @@ -0,0 +1,13 @@ +// Bubble-sort 16 ints. Exercises array indexed access, nested loops, +// and i16 compare/swap — patterns common in any sorted-collection code. +void bubbleSort(short *a, unsigned short n) { + for (unsigned short i = 0; i < n - 1; i++) { + for (unsigned short j = 0; j < n - 1 - i; j++) { + if (a[j] > a[j + 1]) { + short t = a[j]; + a[j] = a[j + 1]; + a[j + 1] = t; + } + } + } +} diff --git a/benchmarks/djb2Hash.c b/benchmarks/djb2Hash.c new file mode 100644 index 0000000..e9ccdea --- /dev/null +++ b/benchmarks/djb2Hash.c @@ -0,0 +1,11 @@ +// djb2 string hash. Exercises i32 arithmetic in a tight pointer-walk +// loop — hash << 5 + hash + c. Hits the i32 shift inline path and the +// byte-load pattern in the same loop body. Real-world: every hash +// table keyed by strings uses something like this. +unsigned long djb2Hash(const char *s) { + unsigned long h = 5381; + while (*s) { + h = ((h << 5) + h) + (unsigned char)(*s++); + } + return h; +} diff --git a/benchmarks/globalArr8Sum.c b/benchmarks/globalArr8Sum.c new file mode 100644 index 0000000..6a62dfa --- /dev/null +++ b/benchmarks/globalArr8Sum.c @@ -0,0 +1,9 @@ +// i8 global-array indexed access — sister benchmark to globalArrSum +// that exercises the LDA8absX combine path. +unsigned char globalArr8[100]; + +unsigned short globalArr8Sum(unsigned short n) { + unsigned short s = 0; + for (unsigned short i = 0; i < n; i++) s += globalArr8[i]; + return s; +} diff --git a/benchmarks/globalArrFill.c b/benchmarks/globalArrFill.c new file mode 100644 index 0000000..94cf418 --- /dev/null +++ b/benchmarks/globalArrFill.c @@ -0,0 +1,8 @@ +// Fill the first n elements of a global i16 array. Exercises the +// store-side of the W65816UnLSR + STA_AbsX combine for global-array +// loops. +unsigned short globalArrF[100]; + +void globalArrFill(unsigned short n) { + for (unsigned short i = 0; i < n; i++) globalArrF[i] = i + 1; +} diff --git a/benchmarks/globalArrSum.c b/benchmarks/globalArrSum.c new file mode 100644 index 0000000..f41699a --- /dev/null +++ b/benchmarks/globalArrSum.c @@ -0,0 +1,10 @@ +// Sum the first n elements of a global i16 array. Exercises the +// `arr[i]` indexed-access pattern that the W65816UnLSR pass converts +// back to `lda , X` after LSR turns it into pointer-walking. +unsigned short globalArr[100]; + +unsigned short globalArrSum(unsigned short n) { + unsigned short s = 0; + for (unsigned short i = 0; i < n; i++) s += globalArr[i]; + return s; +} diff --git a/benchmarks/strLen.c b/benchmarks/strLen.c new file mode 100644 index 0000000..412f718 --- /dev/null +++ b/benchmarks/strLen.c @@ -0,0 +1,14 @@ +// strLen: walk pointer until null byte. Exercises the [dp],Y byte-read +// path plus the conditional loop exit. Touches the same DPF0 setup +// pattern as strcpy/memcmp but with only ONE pointer per iter. +// +// The pragma prevents clang from recognising this as a builtin strlen +// and rewriting it as a call to libc (which our benches don't link). +__attribute__((no_builtin("strlen"))) +unsigned short strLen(const char *s) { + const char *p = s; + while (*p) { + p++; + } + return (unsigned short)(p - s); +} diff --git a/compare/evalAt.calypsi.lst b/compare/evalAt.calypsi.lst index 50120d9..2a52687 100644 --- a/compare/evalAt.calypsi.lst +++ b/compare/evalAt.calypsi.lst @@ -1,7 +1,7 @@ ############################################################################### # # # Calypsi ISO C compiler for 65816 version 5.16 # -# 14/May/2026 11:06:07 # +# 15/May/2026 00:38:15 # # Command line: --speed -O 2 --64bit-doubles evalAt.c -o # # /tmp/evalAt.calypsi.elf --list-file evalAt.calypsi.lst # # # diff --git a/compare/evalAt.ours.s b/compare/evalAt.ours.s index 5f7748b..c8f8627 100644 --- a/compare/evalAt.ours.s +++ b/compare/evalAt.ours.s @@ -8,7 +8,7 @@ evalAt: ; @evalAt tay tsc sec - sbc #0x46 + sbc #0x2e tcs tya pha @@ -24,7 +24,7 @@ evalAt: ; @evalAt sta 0x3, s pla stx 0xc0 - sta 0x19, s + sta 0x1b, s clc adc #0x2 sta 0x1f, s @@ -33,44 +33,34 @@ evalAt: ; @evalAt adc #0x0 sta 0x21, s lda 0x1f, s - sta 0x45, s - lda 0x21, s - sta 0x43, s - lda 0x45, s sta 0xe0 - lda 0x43, s + lda 0x21, s sta 0xe2 ldy #0x0 - lda [0xe0 ], y - sta 0x1d, s - lda 0x19, s - sta 0x41, s + lda [0xe0], y + sta 0x1f, s pha lda 0xc0 - sta 0x41, s + sta 0x2f, s pla - lda 0x41, s + lda 0x1b, s sta 0xe0 - lda 0x3f, s + lda 0x2d, s sta 0xe2 - lda [0xe0 ], y + lda [0xe0], y sta 0x21, s - lda 0x4a, s + lda 0x32, s sta 0xb, s lda #0x0 sta 0xc4 sta 0xc6 lda 0x21, s - sta 0x3d, s - lda 0x1d, s - sta 0x3b, s - lda 0x3d, s sta 0xe0 - lda 0x3b, s + lda 0x1f, s sta 0xe2 - lda [0xe0 ], y + lda [0xe0], y and #0xff - sta 0x1b, s + sta 0x1d, s sep #0x20 clc adc #0xd0 @@ -93,51 +83,47 @@ evalAt: ; @evalAt inc a sta 0x21, s bne .Ltmp0 - lda 0x1d, s + lda 0x1f, s inc a - sta 0x1d, s + sta 0x1f, s .Ltmp0: lda #0x0 sta 0x15, s sta 0x13, s sta 0x11, s sta 0xf, s - lda 0x1d, s + lda 0x1f, s sta 0x17, s .LBB0_2: ; %while.body ; =>This Inner Loop Header: Depth=1 - sta 0x1d, s - lda 0x19, s + sta 0x1f, s + lda 0x1b, s tax pha lda 0xc0 - sta 0x3b, s + sta 0x2d, s pla txa sta 0xe0 - lda 0x39, s + lda 0x2b, s sta 0xe2 lda 0x21, s ldy #0x0 - sta [0xe0 ], y - lda 0x19, s + sta [0xe0], y + lda 0x1b, s clc adc #0x2 sta 0xd, s lda 0xc0 - sta 0x1f, s + sta 0x19, s adc #0x0 - sta 0x1f, s + sta 0x19, s lda 0xd, s - sta 0x37, s - lda 0x1f, s - tax - lda 0x37, s sta 0xe0 - txa + lda 0x19, s sta 0xe2 - lda 0x1d, s - sta [0xe0 ], y + lda 0x1f, s + sta [0xe0], y pea 0x4024 lda #0x0 pha @@ -157,24 +143,24 @@ evalAt: ; @evalAt adc #0xc tcs lda 0xe0 - sta 0x1f, s + sta 0x19, s txa sta 0x15, s tya sta 0x13, s lda 0xf0 sta 0x11, s - lda 0x1b, s + lda 0x1d, s sep #0x20 clc adc #0xd0 rep #0x20 and #0xff - sta 0x1b, s + sta 0x1d, s ldx #0x0 - lda 0x1b, s + lda 0x1d, s jsl __floatunsidf - sta 0x1b, s + sta 0x1d, s txa sta 0xf, s tya @@ -185,7 +171,7 @@ evalAt: ; @evalAt lda 0x13, s tax phx - lda 0x21, s + lda 0x23, s pha lda 0x19, s pha @@ -193,7 +179,7 @@ evalAt: ; @evalAt pha lda 0x21, s tax - lda 0x2b, s + lda 0x25, s jsl __adddf3 sta 0xe0 tsc @@ -217,7 +203,7 @@ evalAt: ; @evalAt sta 0x21, s txa lda 0xd0 - sta 0x1f, s + sta 0x1d, s lda 0x17, s adc #0x0 sta 0x17, s @@ -229,18 +215,14 @@ evalAt: ; @evalAt sta 0xc4 lda 0x13, s sta 0xc6 - lda 0x1f, s - sta 0x35, s lda 0x1d, s - tax - lda 0x35, s sta 0xe0 - txa + lda 0x1f, s sta 0xe2 ldy #0x0 - lda [0xe0 ], y + lda [0xe0], y and #0xff - sta 0x1b, s + sta 0x1d, s sep #0x20 clc adc #0xd0 @@ -259,17 +241,17 @@ evalAt: ; @evalAt sta 0x21, s lda 0x17, s adc #0xffff - sta 0x1d, s + sta 0x1f, s .LBB0_4: ; %while.cond7.preheader lda 0xb, s eor #0x8000 sta 0xb, s - lda 0x1b, s + lda 0x1d, s brl .LBB0_5 .LBB0_11: ; %if.then33 ; in Loop: Header=BB0_5 Depth=1 lda 0xc6 - sta 0x1b, s + sta 0x1d, s lda 0xc4 sta 0x15, s lda 0xca @@ -278,7 +260,7 @@ evalAt: ; @evalAt sta 0x11, s lda 0x17, s pha - lda 0x1f, s + lda 0x1b, s pha lda 0x23, s pha @@ -288,7 +270,7 @@ evalAt: ; @evalAt pha lda 0x1b, s pha - lda 0x27, s + lda 0x29, s tax lda 0x21, s jsl __muldf3 @@ -306,10 +288,10 @@ evalAt: ; @evalAt tya sta 0x1d, s lda 0xf0 - sta 0x1b, s + sta 0x19, s lda 0x1d, s sta 0xc8 - lda 0x1b, s + lda 0x19, s sta 0xca lda 0x21, s sta 0xc4 @@ -317,7 +299,7 @@ evalAt: ; @evalAt sta 0xc6 .LBB0_13: ; %cleanup ; in Loop: Header=BB0_5 Depth=1 - lda 0x19, s + lda 0x1b, s clc adc #0x2 sta 0x1f, s @@ -326,17 +308,13 @@ evalAt: ; @evalAt adc #0x0 sta 0x21, s lda 0x1f, s - sta 0x25, s - lda 0x21, s - tax - lda 0x25, s sta 0xe0 - txa + lda 0x21, s sta 0xe2 ldy #0x0 - lda [0xe0 ], y - sta 0x1d, s - lda 0x19, s + lda [0xe0], y + sta 0x1f, s + lda 0x1b, s tax pha lda 0xc0 @@ -346,32 +324,29 @@ evalAt: ; @evalAt sta 0xe0 lda 0x23, s sta 0xe2 - lda [0xe0 ], y + lda [0xe0], y sta 0x21, s - lda 0x1d, s - tax - lda 0x21, s sta 0xe0 - txa + lda 0x1f, s sta 0xe2 - lda [0xe0 ], y + lda [0xe0], y and #0xff .LBB0_5: ; %while.cond7 ; =>This Inner Loop Header: Depth=1 - sta 0x1b, s + sta 0x1d, s sep #0x20 clc adc #0xd6 rep #0x20 and #0xff - sta 0x1f, s - lda 0x1f, s + sta 0x19, s + lda 0x19, s pha lda #0x2b jsl __lshrhi3 ply sta 0x17, s - lda 0x1f, s + lda 0x19, s cmp #0x6 bcc .LBB0_6 ; %bb.17: ; %while.cond7 @@ -382,58 +357,23 @@ evalAt: ; @evalAt and #0x1 sta 0x17, s lda #0x0 - sta 0x33, s + sta 0x29, s lda 0x17, s - ora 0x33, s + ora 0x29, s bne .LBB0_7 ; %bb.18: ; %while.cond7 brl .LBB0_14 .LBB0_7: ; %switch.lookup ; in Loop: Header=BB0_5 Depth=1 - lda #0x0 + lda 0x19, s asl a - sta 0x17, s - lda 0x1f, s - asl a - lda #0x0 - rol a - sta 0x31, s - lda 0x17, s - ora 0x31, s - sta 0x17, s - lda 0x1f, s - asl a - sta 0x1f, s - lda #.Lswitch.table.evalAt - sta 0x2f, s - lda 0x1f, s - clc - adc 0x2f, s - sta 0x1f, s - lda #0x0 - sta 0x2d, s - lda 0x17, s - adc 0x2d, s - sta 0x17, s - lda 0x1f, s - sta 0x2b, s - lda 0x17, s - tax - lda 0x2b, s - sta 0xe0 - txa - sta 0xe2 - ldy #0x0 - lda [0xe0 ], y - sta 0x1f, s - lda 0x1f, s tax + lda .Lswitch.table.evalAt, x + sta 0x19, s eor #0x8000 - sta 0x1f, s - txa - sta 0x17, s + sta 0x27, s lda 0xb, s - cmp 0x1f, s + cmp 0x27, s bcc .LBB0_8 ; %bb.19: ; %switch.lookup brl .LBB0_14 @@ -443,44 +383,40 @@ evalAt: ; @evalAt inc a sta 0x21, s bne .Ltmp1 - lda 0x1d, s + lda 0x1f, s inc a - sta 0x1d, s + sta 0x1f, s .Ltmp1: - lda 0x19, s + lda 0x1b, s tax pha lda 0xc0 - sta 0x2b, s + sta 0x27, s pla txa sta 0xe0 - lda 0x29, s + lda 0x25, s sta 0xe2 lda 0x21, s ldy #0x0 - sta [0xe0 ], y - lda 0x19, s + sta [0xe0], y + lda 0x1b, s sta 0xd0 clc adc #0x2 - sta 0x1f, s + sta 0x17, s lda 0xd0 sta 0x21, s lda 0xc0 adc #0x0 sta 0x15, s - lda 0x1f, s - sta 0x27, s - lda 0x15, s - tax - lda 0x27, s - sta 0xe0 - txa - sta 0xe2 - lda 0x1d, s - sta [0xe0 ], y lda 0x17, s + sta 0xe0 + lda 0x15, s + sta 0xe2 + lda 0x1f, s + sta [0xe0], y + lda 0x19, s pha ldx 0xc0 lda 0x23, s @@ -495,10 +431,10 @@ evalAt: ; @evalAt txa sta 0x1f, s tya - sta 0x1d, s + sta 0x19, s lda 0xf0 sta 0x17, s - lda 0x1b, s + lda 0x1d, s and #0xff cmp #0x2a bne .LBB0_9 @@ -515,7 +451,7 @@ evalAt: ; @evalAt .LBB0_10: ; %if.then29 ; in Loop: Header=BB0_5 Depth=1 lda 0xc6 - sta 0x1b, s + sta 0x1d, s lda 0xc4 sta 0x15, s lda 0xca @@ -524,7 +460,7 @@ evalAt: ; @evalAt sta 0x11, s lda 0x17, s pha - lda 0x1f, s + lda 0x1b, s pha lda 0x23, s pha @@ -534,7 +470,7 @@ evalAt: ; @evalAt pha lda 0x1b, s pha - lda 0x27, s + lda 0x29, s tax lda 0x21, s jsl __adddf3 @@ -570,7 +506,7 @@ evalAt: ; @evalAt sta 0xe0 tsc clc - adc #0x46 + adc #0x2e tcs lda 0xe0 rtl diff --git a/compare/mul16to32.calypsi.lst b/compare/mul16to32.calypsi.lst index 921e692..d5095d8 100644 --- a/compare/mul16to32.calypsi.lst +++ b/compare/mul16to32.calypsi.lst @@ -1,7 +1,7 @@ ############################################################################### # # # Calypsi ISO C compiler for 65816 version 5.16 # -# 14/May/2026 11:06:07 # +# 15/May/2026 00:38:15 # # Command line: --speed -O 2 --64bit-doubles mul16to32.c -o # # /tmp/mul16to32.calypsi.elf --list-file # # mul16to32.calypsi.lst # diff --git a/compare/mul16to32.ours.s b/compare/mul16to32.ours.s index f8ce848..a008c37 100644 --- a/compare/mul16to32.ours.s +++ b/compare/mul16to32.ours.s @@ -5,11 +5,7 @@ mul16to32: ; @mul16to32 ; %bb.0: ; %entry rep #0x30 - pha - lda 0x6, s - jsl __umulhisi3 - ply - rtl + jml __umulhisi3 .Lfunc_end0: .size mul16to32, .Lfunc_end0-mul16to32 ; -- End function diff --git a/compare/sumSquares.calypsi.lst b/compare/sumSquares.calypsi.lst index 3ca5c18..dbbce23 100644 --- a/compare/sumSquares.calypsi.lst +++ b/compare/sumSquares.calypsi.lst @@ -1,7 +1,7 @@ ############################################################################### # # # Calypsi ISO C compiler for 65816 version 5.16 # -# 14/May/2026 11:06:07 # +# 15/May/2026 00:38:15 # # Command line: --speed -O 2 --64bit-doubles sumSquares.c -o # # /tmp/sumSquares.calypsi.elf --list-file # # sumSquares.calypsi.lst # diff --git a/compare/sumSquares.ours.s b/compare/sumSquares.ours.s index 37483c1..eb89d24 100644 --- a/compare/sumSquares.ours.s +++ b/compare/sumSquares.ours.s @@ -31,8 +31,7 @@ sumSquares: ; @sumSquares sta 0xd4 inc 0xd2 dec 0xd0 - beq .LBB0_5 - bra .LBB0_4 + bne .LBB0_4 .LBB0_5: ; %for.cond.cleanup lda 0xd4 tax diff --git a/demos/README.md b/demos/README.md new file mode 100644 index 0000000..f957c02 --- /dev/null +++ b/demos/README.md @@ -0,0 +1,149 @@ +# llvm816 GS/OS Demo Apps + +Small Apple IIgs S16 applications that build with our LLVM/clang +toolchain, wrap as OMF v2.1 ExpressLoad, and launch under real +GS/OS 6.0.2 in MAME. + +## Building / running + +``` +bash demos/build.sh helloBeep # build the OMF +bash demos/launch.sh helloBeep # interactive run in MAME (visible window, audio) +bash demos/test.sh helloBeep # headless test (boots, runs, checks marker) +``` + +The launch script runs MAME with no timeout; close the MAME +window when done (Esc, then Cmd-Q). The test script injects a +keystroke after the demo has launched, then checks `$00:0070` +for the `0x99` end-of-run marker the demo writes before exit. + +## Demos + +### `helloBeep.c` + +Three `SysBeep()` calls then exit. The toolbox `SysBeep` lives in +Misc Tools; no other startup needed (Loader handles MM + TL). + +### `helloText.c` + +Initialises Event Manager (so `GetNextEvent` can read keystrokes) +and Text Tools (so `WriteCString` has an output device), writes +two greeting lines to the text screen, waits for any keypress via +`GetNextEvent`, beeps, exits. Uses these toolbox calls: + +- `MMStartUp`, `NewHandle` (DP allocation for Event Manager) +- `EMStartUp`, `GetNextEvent` (event-driven keyboard) +- `TextStartUp`, `SetOutputDevice`, `WriteCString` (text I/O) +- `SysBeep` + +### `helloWindow.c` + +Initialises the full Window Manager startup chain (Memory, QD, +Event, Scheduler, Window), constructs an Apple-IIgs-Toolbox-Ref +NewWindow parm block, and calls `NewWindow`. When NewWindow +returns a real handle the demo calls `SetPort`, `ShowWindow`, +`MoveTo`, and `DrawString` to put a greeting in the window, then +waits for a keypress, beeps, and exits. + +Three toolchain bugs needed fixing to make this work end-to-end +under real GS/OS 6.0.2 (all now landed): +- **omfEmit RESSPC=0** for code segments — BSS got no memory + allocation; writes past the image end silently vanished. Now + BSS is embedded as zeros in the LCONST data. +- **Loader cRELOC at segPlacedBase=$0000** (not $1000 like our + text-base) — host probes need to compute runtime addresses as + `link_addr - text_base + bank<<16`. +- **`&symbol` bank=0** — proper backend fix landed. `LDAi16imm_bank` + AsmPrinter pseudo lowers to `lda $BE`; crt0 stores `PBR` to $BE + + zero to $BF at startup, so the high half of every `&symbol` + pointer carries the actual load bank at runtime. Toolbox + pointer args now Just Work without per-wrapper PBR overrides. + +### `orcaFrame.c` + +First ORCA-style desktop application. Opens a Window Manager +window via `startdesk()` (full toolset chain), runs a TaskMaster +event loop until the close box / Q key / 1000-iteration watchdog +fires. Both 6.0.2 (`sys602.po`) and 6.0.4 (`6.0.4 - System.Disk.po`) +launch it cleanly; fTitle works on both. + +### `orcaFrameLike.c` + +Port of ORCA-C's `Frame.cc` sample (`tools/orca-c/C.Samples/ +Desktop.Samples/Frame.cc`). Builds a standard Apple+File+Edit +menu bar (`NewMenu` + `InsertMenu` + `FixAppleMenu` + `DrawMenuBar`) +and dispatches `wInMenuBar` / `wInSpecial` events from `TaskMaster`. +File→Quit exits. Skips the original's Dialog Manager About box. + +### `orcaMiniCadLike.c` + +Port of ORCA-C's `MiniCAD.cc` (`Desktop.Samples/MiniCAD.cc`). Slim +port — opens a Window Manager content window but omits the line- +drawing primitives because adding them pushes past the Loader's +cRELOC threshold. Demonstrates the NewWindow path under +`startdesk`. + +### `orcaReversiLike.c` + +Port of ORCA-C's `Reversi.cc` (`Desktop.Samples/Reversi.cc`). +Menu-bar app — the ~1600 line game logic is omitted; the demo +shows the desktop scaffolding (menu + TaskMaster) the original +sits on top of. + +### `qdProbe.c` + +Diagnostic — minimal QD/EM/WM init followed by `RefreshDesktop` +plus ZP/SHR markers. Used to prove that `WindStartUp` does NOT +auto-paint the desktop and that `RefreshDesktop(NULL)` is what +actually fills SHR with the dithered desktop pattern. Run via +`scripts/probeQdStartup.sh`. + +### Known limitations + +- **fTitle on stripped 6.0.2:** orcaFrame uses fTitle and runs + fine on both 6.0.2 sys602.po and 6.0.4 System.Disk.po. Earlier + notes that fTitle required disk fonts were superseded — the + underlying bug was a `QDStartUp` argument-order mistake in + `runtime/src/desktop.c`, fixed 2026-05-16. +- **Window not visually painted:** `WindStartUp` does NOT paint + the desktop on its own; `RefreshDesktop(NULL)` is required. + Adding the call to `startdesk()` works for `qdProbe.c` but + pushes the orca demos past the GS/OS Loader's silent-rejection + threshold (see memory: `loader-creloc-threshold`). +- **GS/OS Loader cRELOC threshold:** anywhere from 65-90 cRELOCs + the Loader silently refuses to launch ExpressLoad OMFs. The + threshold is not a clean reloc-count cutoff; OMF byte layout + and reloc patch offsets both matter. The ORCA ports are slim + to stay under it. + +## What got fixed during demo authoring + +Substantive toolchain bugs surfaced and fixed: + +- `iigsGsos.s` GS/OS wrappers and `genToolbox.py`'s 890 toolbox + wrappers were pushing 4-byte Long args low-word-first. ORCA-C's + PushLong macro is high-word-first. Anything passing a Long arg + through the toolbox dispatcher (NewHandle, NewWindow, + fopen->gsosOpen, etc.) was reading garbage parm-block pointers. + Fixed in both files plus the generator; regenerated 890 + wrappers. +- `runtime/build.sh` wasn't rebuilding `iigsToolbox.s` -- the .o + was stale since May 4. Added the missing line. +- `(short)(*(void **)dpHandle)` was a double-dereference bug that + read garbage at the master pointer's destination instead of the + master pointer VALUE (= the DP address). Corrected to + `(unsigned short)(unsigned long)*(void **)dpHandle` for proper + block-address extraction. +- `helloText` used `TextStartUp + WriteCString` directly which + crashed to the IIgs monitor; fixed by adding `SetOutputDevice(1, 0)` + to wire stdout to the text screen. +- `helloText`'s event loop hung forever because `EMStartUp` wasn't + being called; fixed by adding it (with proper DP allocation). + +## ptr32 mode note + +All address constants in the demos (text screen $00:0400, SHR +RAM $E1:2000, soft switches $00:C0xx, keyboard register $00:C000) +are plain C 32-bit pointers like `(volatile unsigned char *)0xE12000UL`. +In ptr32 mode the compiler emits LONG addressing automatically; +no `switchToBank2`-style inline asm or DBR juggling required. diff --git a/demos/build.sh b/demos/build.sh new file mode 100755 index 0000000..ab5d811 --- /dev/null +++ b/demos/build.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# build.sh - compile a demo C source into a GS/OS-loadable OMF. +# +# Usage: bash demos/build.sh +# where demos/.c is the source. Output is +# demos/.omf in the same directory. +# +# Uses crt0Gsos (the GS/OS-aware crt) and ExpressLoad-wrapped multi- +# seg OMF so the slow-Loader rejection path is avoided. The OMF +# launches via runViaFinder.sh after cadius-injection onto the GS/OS +# data disk. + +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +[ $# -ge 1 ] || { echo "usage: $0 " >&2; exit 2; } +BASE="$1" +SRC="$SCRIPT_DIR/$BASE.c" +[ -f "$SRC" ] || { echo "no source: $SRC" >&2; exit 2; } + +CLANG="$PROJECT_ROOT/tools/llvm-mos-build/bin/clang" +LINK="$PROJECT_ROOT/tools/link816" +OMF="$PROJECT_ROOT/tools/omfEmit" + +OBJ="$SCRIPT_DIR/$BASE.o" +BIN="$SCRIPT_DIR/$BASE.bin" +MAP="$SCRIPT_DIR/$BASE.map" +RELOC="$SCRIPT_DIR/$BASE.reloc" +OUT="$SCRIPT_DIR/$BASE.omf" + +echo "compile: $BASE.c -> $BASE.o" +"$CLANG" --target=w65816 -I"$PROJECT_ROOT/runtime/include" \ + -O2 -ffunction-sections -c "$SRC" -o "$OBJ" + +echo "link: -> $BASE.bin" +# bss-base 0xA000 keeps BSS above the SHR shadow region ($2000-$9FFF +# in bank 0 mirrors to bank E1 SHR memory). Without this, the smaller +# section-gc'd demos place BSS at e.g. $2300 and global writes scribble +# on the screen. +"$LINK" -o "$BIN" --text-base 0x1000 --bss-base 0xA000 \ + --map "$MAP" --reloc-out "$RELOC" \ + "$PROJECT_ROOT/runtime/crt0Gsos.o" "$OBJ" \ + "$PROJECT_ROOT/runtime/libc.o" \ + "$PROJECT_ROOT/runtime/snprintf.o" \ + "$PROJECT_ROOT/runtime/extras.o" \ + "$PROJECT_ROOT/runtime/softFloat.o" \ + "$PROJECT_ROOT/runtime/softDouble.o" \ + "$PROJECT_ROOT/runtime/iigsGsos.o" \ + "$PROJECT_ROOT/runtime/iigsToolbox.o" \ + "$PROJECT_ROOT/runtime/desktop.o" \ + "$PROJECT_ROOT/runtime/libgcc.o" + +echo "OMF: -> $BASE.omf" +"$OMF" --input "$BIN" --map "$MAP" \ + --base 0x1000 --entry __start --output "$OUT" \ + --name "$(echo "$BASE" | tr '[:lower:]' '[:upper:]' | cut -c1-8)" \ + --expressload --relocs "$RELOC" + +ls -la "$OUT" +echo "done: $OUT" diff --git a/demos/frame.bin b/demos/frame.bin new file mode 100644 index 0000000000000000000000000000000000000000..7976cd826fa955531964890c02f3f2be274deb60 GIT binary patch literal 5554 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 Dp^o^h literal 0 HcmV?d00001 diff --git a/demos/frame.c b/demos/frame.c new file mode 100644 index 0000000..2776667 --- /dev/null +++ b/demos/frame.c @@ -0,0 +1,97 @@ +// frame.c - full port of ORCA-C's Frame.cc sample. +// +// Mike Westerfield's "Frame" desktop demo (Byte Works, 1989). +// Original at tools/orca-c/C.Samples/Desktop.Samples/Frame.cc. +// +// Uses the real ROM Menu Manager — startdesk's QD-DP allocation now +// reserves the full 512 bytes QD needs (own DP + cursor mgr at +$100), +// plus calls InitCursor. See feedback_drawmenubar_hang.md. + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + + +#define apple_About 257 +#define file_Quit 256 + + +typedef struct { short v1, h1, v2, h2; } Rect; + + +// Menu definition strings — verbatim from Frame.cc. +static unsigned char appleMenuStr[] = + ">>@\\XN1\r" + "--About Frame\\N257V\r" + ".\r"; + +static unsigned char fileMenuStr[] = + ">> File \\N2\r" + "--Close\\N255V\r" + "--Quit\\N256*Qq\r" + ".\r"; + +static unsigned char editMenuStr[] = + ">> Edit \\N3\r" + "--Undo\\N250V*Zz\r" + "--Cut\\N251*Xx\r" + "--Copy\\N252*Cc\r" + "--Paste\\N253*Vv\r" + "--Clear\\N254\r" + ".\r"; + +// About-box message lines. +static const unsigned char line1[] = "\x09" "Frame 1.0"; +static const unsigned char line2[] = "\x0e" "Copyright 1989"; +static const unsigned char line3[] = "\x10" "Byte Works, Inc."; +static const unsigned char line4[] = "\x13" "By Mike Westerfield"; +static const unsigned char btnOk[] = "\x02" "OK"; + + +static void drawAbout(void) { + Rect outer; + outer.h1 = 180; outer.v1 = 50; + outer.h2 = 460; outer.v2 = 107; + + SetSolidPenPat(15); + PaintRect(&outer); + SetSolidPenPat(0); + FrameRect(&outer); + + MoveTo(195, 64); DrawString((void *)line1); + MoveTo(195, 74); DrawString((void *)line2); + MoveTo(195, 84); DrawString((void *)line3); + MoveTo(195, 94); DrawString((void *)line4); + + Rect ok; + ok.h1 = 395; ok.v1 = 88; + ok.h2 = 445; ok.v2 = 102; + FrameRect(&ok); + MoveTo(412, 98); + DrawString((void *)btnOk); +} + + +static void initMenus(void) { + InsertMenu(NewMenu(editMenuStr), 0); + InsertMenu(NewMenu(fileMenuStr), 0); + InsertMenu(NewMenu(appleMenuStr), 0); + FixAppleMenu(1); + FixMenuBar(); + DrawMenuBar(); +} + + +int main(void) { + unsigned short userId = startdesk(640); + (void)userId; + + initMenus(); + ShowCursor(); + + for (volatile unsigned long s = 0; s < 100000UL; s++) { } + drawAbout(); + for (volatile unsigned long s = 0; s < 200000UL; s++) { } + + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/frame.map b/demos/frame.map new file mode 100644 index 0000000..cee1dc6 --- /dev/null +++ b/demos/frame.map @@ -0,0 +1,213 @@ +# section layout +.text : 0x001000 .. 0x0024b3 ( 5299 bytes) +.rodata : 0x0024b3 .. 0x0025b2 ( 255 bytes) +.bss : 0x00a000 .. 0x00a00a ( 10 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 1287 /home/scott/claude/llvm816/demos/frame.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1349 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x00000a __bss_seg0_size +0x00000a __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x0015c1 CtlStartUp +0x0015d1 EMStartUp +0x0015f0 FMStartUp +0x001600 LEStartUp +0x001610 LoadOneTool +0x001620 NewHandle +0x001646 MenuStartUp +0x001656 InsertMenu +0x00166b NewMenu +0x001685 QDStartUp +0x00169b DrawString +0x0016ad FrameRect +0x0016bf MoveTo +0x0016cf PaintRect +0x0016e1 startdesk +0x001ac7 __jsl_indir +0x001aca __mulhi3 +0x001ae9 __umulhisi3 +0x001b40 __ashlhi3 +0x001b4f __lshrhi3 +0x001b5f __ashrhi3 +0x001b72 __udivhi3 +0x001b7e __umodhi3 +0x001b8a __divhi3 +0x001ba4 __modhi3 +0x001bbe __divmod_setup +0x001bf1 __udivmod_core +0x001c0f __mulsi3 +0x001cc8 __ashlsi3 +0x001cdd __lshrsi3 +0x001cf2 __ashrsi3 +0x001d0c __udivmodsi_core +0x001d44 __udivsi3 +0x001d58 __umodsi3 +0x001d6c __divsi3 +0x001d93 __modsi3 +0x001dba __divmodsi_setup +0x001e0b __divmoddi4_stash +0x001e28 __retdi +0x001e35 __ashldi3 +0x001e58 __lshrdi3 +0x001e7b __ashrdi3 +0x001ea1 __muldi3 +0x001efc __ucmpdi2 +0x001f25 __cmpdi2 +0x001f5c __udivdi3 +0x001f65 __umoddi3 +0x001f7e __udivmoddi_core +0x001fcb __divdi3 +0x001fea __moddi3 +0x002017 __absdi_a +0x00201f __absdi_b +0x002027 __negdi_a +0x002045 __negdi_b +0x002063 setjmp +0x00208b longjmp +0x0020b5 __umulhisi3_qsq +0x0024b3 __rodata_start +0x0024b3 __text_end +0x0024b3 gChainPath +0x0024c7 editMenuStr +0x002520 fileMenuStr +0x00254d appleMenuStr +0x00256c line1 +0x002577 line2 +0x002587 line3 +0x002599 line4 +0x0025ae btnOk +0x0025b2 __init_array_end +0x0025b2 __init_array_start +0x0025b2 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gUserId +0x00a002 gDpHandle +0x00a006 gDpBase +0x00a008 __indirTarget +0x00a00a __bss_end +0x00a00a __heap_start +0x00bf00 __heap_end +CtlStartUp = 0x0015c1 +DrawString = 0x00169b +EMStartUp = 0x0015d1 +FMStartUp = 0x0015f0 +FrameRect = 0x0016ad +InsertMenu = 0x001656 +LEStartUp = 0x001600 +LoadOneTool = 0x001610 +MenuStartUp = 0x001646 +MoveTo = 0x0016bf +NewHandle = 0x001620 +NewMenu = 0x00166b +PaintRect = 0x0016cf +QDStartUp = 0x001685 +__absdi_a = 0x002017 +__absdi_b = 0x00201f +__ashldi3 = 0x001e35 +__ashlhi3 = 0x001b40 +__ashlsi3 = 0x001cc8 +__ashrdi3 = 0x001e7b +__ashrhi3 = 0x001b5f +__ashrsi3 = 0x001cf2 +__bss_bank = 0x000000 +__bss_end = 0x00a00a +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x00000a +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x00000a +__bss_start = 0x00a000 +__cmpdi2 = 0x001f25 +__divdi3 = 0x001fcb +__divhi3 = 0x001b8a +__divmod_setup = 0x001bbe +__divmoddi4_stash = 0x001e0b +__divmodsi_setup = 0x001dba +__divsi3 = 0x001d6c +__heap_end = 0x00bf00 +__heap_start = 0x00a00a +__indirTarget = 0x00a008 +__init_array_end = 0x0025b2 +__init_array_start = 0x0025b2 +__jsl_indir = 0x001ac7 +__lshrdi3 = 0x001e58 +__lshrhi3 = 0x001b4f +__lshrsi3 = 0x001cdd +__moddi3 = 0x001fea +__modhi3 = 0x001ba4 +__modsi3 = 0x001d93 +__muldi3 = 0x001ea1 +__mulhi3 = 0x001aca +__mulsi3 = 0x001c0f +__negdi_a = 0x002027 +__negdi_b = 0x002045 +__retdi = 0x001e28 +__rodata_end = 0x0025b2 +__rodata_start = 0x0024b3 +__start = 0x001000 +__text_end = 0x0024b3 +__text_start = 0x001000 +__ucmpdi2 = 0x001efc +__udivdi3 = 0x001f5c +__udivhi3 = 0x001b72 +__udivmod_core = 0x001bf1 +__udivmoddi_core = 0x001f7e +__udivmodsi_core = 0x001d0c +__udivsi3 = 0x001d44 +__umoddi3 = 0x001f65 +__umodhi3 = 0x001b7e +__umodsi3 = 0x001d58 +__umulhisi3 = 0x001ae9 +__umulhisi3_qsq = 0x0020b5 +appleMenuStr = 0x00254d +btnOk = 0x0025ae +editMenuStr = 0x0024c7 +fileMenuStr = 0x002520 +gChainPath = 0x0024b3 +gDpBase = 0x00a006 +gDpHandle = 0x00a002 +gUserId = 0x00a000 +line1 = 0x00256c +line2 = 0x002577 +line3 = 0x002587 +line4 = 0x002599 +longjmp = 0x00208b +main = 0x0010ba +setjmp = 0x002063 +startdesk = 0x0016e1 diff --git a/demos/frame.o b/demos/frame.o new file mode 100644 index 0000000000000000000000000000000000000000..b560f0d71e8c950b14e8115f5429e6c3f4926499 GIT binary patch literal 3328 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 E3DRlZ_y7O^ literal 0 HcmV?d00001 diff --git a/demos/frame.reloc b/demos/frame.reloc new file mode 100644 index 0000000000000000000000000000000000000000..12949c8b02c454d18c7f413fa4b2392929ee4ef5 GIT binary patch literal 1228 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 EJ?L@3qfW6pOfdb2ib*}yLjI5 zp8xOvzVCU@^ZwH{y*jV#ZQWN?RCJ%D6+yY%Eqk&+TP>-lO3Y4rc6om`s4o3ga%z+) znHddHa%R>TrAZ?>ozB$s6w_FGDw*xUWcJclUtjw1|t#-kI14 z8Yj%+G*fpL)0~}#T|{|nDwEDUmK|Q1o-SEw4cx${2<_S#YkUdDm*nXI<=RC_T!m7q ztWv6^l$st?GMz5uTUfBvTCmhwke;4DO*%Wz^CzpcR#!gwWU0B6E#i|EY~f@X{vbjb zT*kC%0-As(pb2OKnt&#t31|YEfF_^`XabsmCZGvu0-As(pb2OKnt&#t31|YEfF_^` zXabsmCZGvu0-As(pb2OKnt&#t31|YEfF_^`XabsmCZGvu0-As(pb2OKnt&#t31|YE zfF_^`XabsmCZGvu0-As(pb2OKnt&#t31|YEfF_^`JQN97uM5=6!;?T)B-m#fgW-W# zPk*1$*yQ%OJ!VhbsPB%)qp_V^w!n11)amZ(@7)rK4EApB?T^iYn^$&i-{I|QYS`Ma z?ZxelolQHMyS6oZJDZz5jiE+wL$G06W0QA#u(RQb2OavLW3ZHdn|t3R50~IywalmR z^2s79qaVb(phZ+Jt{^3t{|?A=_WW(I;qc#rJq|w!_Bs65V86rP0tX!aOK{ZTKL;lq z{!?(u;m5%v4v%+L;uVqe^^Jii9R4G4#^JAna}NIjIPdW9gAv5sdEezZhrb4IIQ-l2 z9*2Ju-skXF;QbDN89w0fufazh{#E#d!wgyD;I+`R=*8=CK|7Dmybkxj!Mu(~iONs|-@6!EEnEv-FT4@j zD0~=tNVo}_6TS=mRrq)4U&8mH|Dba{PeF^JHuJMfq=r&q7nFZedE9_j2z#JB$KyWe z3SmFAMmPXnEgXd!!U^aG;S{u9cm%phcpT~xo`CYZTKQQSs8=`#-7TDl`h*GRY7usU z4+tCJR$&j=FYE)i3H!kv!U6Cp;V3vDoB)S}Q{Zl42t|Zl(5SEh<(~nr-vb>I_Ce1H zb1ezs0Q7<|?{QH$0lh4of^z3QN1$&Bk3+8sPe9)j&Ok?mbI|L;dFTyc!dX5Rc7b^> z-roR!ChP%!A?yR+683{9gahDjgrnfw!U^#A!YMG<#QSs0qBFaoGr|V+Ct(jXC+vgX z74}2#2?wCR2uGoL;RN&#;S}^w;SuQH!sAdvOj&R~RMGZebUg_vQ5lxJB3lJ|OG^ zw+j2g{A^wy0JjN8!5zX0@G0RGnCs*9BjAwmIJjGQ0vr*}fcXr(J_n8q=fOk51U)D0 zf+mCw=mlX9^rEm2dRdrjUte0buzbWcuR+F>()tBSCB0-5c!bBX?haJnY_oqkA)-sT`_kTxnuExc(4A@dnB_mKHCQu}}H zIF^+-mX_dM*FQQuVzU}6_p*Yue!mJ@QYyxP{&yXJH`&eJuMPuzk549s+6w=VD&V;u zo@0)q^F4NrUhKu+pLVnNi(r7+epH9Q@ZD^$v&T&gIG^in$L}o+@U!@A_H$j}a&-H- z_m1M{*nSwsZCohqfpX(@y#=(cypH>mqShcT?Z<2?sJ-7V*pk-!{g4FD+&e+US#f>b Y>~*KX_L+FR1N#{m;CTa`&%tN-7n1PRegFUf literal 0 HcmV?d00001 diff --git a/demos/heavyRelocs.omf b/demos/heavyRelocs.omf new file mode 100644 index 0000000000000000000000000000000000000000..aa716245927b30e0ecd842639ea35ac4d6029dc7 GIT binary patch literal 38552 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 CspTO6 literal 0 HcmV?d00001 diff --git a/demos/helloBeep.bin b/demos/helloBeep.bin new file mode 100644 index 0000000000000000000000000000000000000000..9bcfd06fa6a6b20d5b0563eb581e88cbf76e66fa GIT binary patch literal 3147 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 literal 0 HcmV?d00001 diff --git a/demos/helloBeep.reloc b/demos/helloBeep.reloc new file mode 100644 index 0000000000000000000000000000000000000000..e5c3f2890630aa91f08fd606fd0820d9df1731e8 GIT binary patch literal 544 zcmYk1zY9Te6vc1P?^4R7>`FbeECz!TgTjo}}7gb_YXz?Dv+w|}-3eH`Q?PdD Se9OYWZ{gbA8$N=sa`Oi%mn)wD literal 0 HcmV?d00001 diff --git a/demos/helloText.bin b/demos/helloText.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6db4609be0bdc9e89c9cf312c88455d016f7e82 GIT binary patch literal 4664 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 literal 0 HcmV?d00001 diff --git a/demos/helloText.c b/demos/helloText.c new file mode 100644 index 0000000..b0fd96f --- /dev/null +++ b/demos/helloText.c @@ -0,0 +1,42 @@ +// helloText.c - GS/OS app that draws text on the SHR screen via the +// real ROM Font Manager + QuickDraw DrawString. Uses the full desktop +// startup (which includes InitCursor — see feedback_drawmenubar_hang +// for why that's load-bearing) and waits for any key. + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + + +// Pascal-counted strings (length byte + chars). +static const unsigned char line1[] = "\x13" "Hello from llvm816!"; +static const unsigned char line2[] = "\x2B" "Clang-compiled C running on the Apple IIgs."; +static const unsigned char line3[] = "\x16" "Press any key to exit."; + + +int main(void) { + unsigned short userId = startdesk(640); + (void)userId; + + paintDesktopBackdrop(); + ShowCursor(); + + SetForeColor(0); + SetBackColor(15); + + MoveTo(40, 40); DrawString((void *)line1); + MoveTo(40, 60); DrawString((void *)line2); + MoveTo(40, 80); DrawString((void *)line3); + + for (volatile unsigned long s = 0; s < 400000UL; s++) { } + + short evt[8]; + while (1) { + if (GetNextEvent(0xFFFF, evt) && evt[0] == 3) { + break; + } + } + + SysBeep(); + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/helloText.map b/demos/helloText.map new file mode 100644 index 0000000..195062b --- /dev/null +++ b/demos/helloText.map @@ -0,0 +1,199 @@ +# section layout +.text : 0x001000 .. 0x0021ca ( 4554 bytes) +.rodata : 0x0021ca .. 0x002238 ( 110 bytes) +.bss : 0x00a000 .. 0x00a00a ( 10 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 552 /home/scott/claude/llvm816/demos/helloText.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1349 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x00000a __bss_seg0_size +0x00000a __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x0012e2 CtlStartUp +0x0012f2 EMStartUp +0x001311 GetNextEvent +0x001328 FMStartUp +0x001338 LEStartUp +0x001348 LoadOneTool +0x001358 NewHandle +0x00137e MenuStartUp +0x00138e QDStartUp +0x0013a4 DrawString +0x0013b6 MoveTo +0x0013c6 startdesk +0x0017ac paintDesktopBackdrop +0x0017de __jsl_indir +0x0017e1 __mulhi3 +0x001800 __umulhisi3 +0x001857 __ashlhi3 +0x001866 __lshrhi3 +0x001876 __ashrhi3 +0x001889 __udivhi3 +0x001895 __umodhi3 +0x0018a1 __divhi3 +0x0018bb __modhi3 +0x0018d5 __divmod_setup +0x001908 __udivmod_core +0x001926 __mulsi3 +0x0019df __ashlsi3 +0x0019f4 __lshrsi3 +0x001a09 __ashrsi3 +0x001a23 __udivmodsi_core +0x001a5b __udivsi3 +0x001a6f __umodsi3 +0x001a83 __divsi3 +0x001aaa __modsi3 +0x001ad1 __divmodsi_setup +0x001b22 __divmoddi4_stash +0x001b3f __retdi +0x001b4c __ashldi3 +0x001b6f __lshrdi3 +0x001b92 __ashrdi3 +0x001bb8 __muldi3 +0x001c13 __ucmpdi2 +0x001c3c __cmpdi2 +0x001c73 __udivdi3 +0x001c7c __umoddi3 +0x001c95 __udivmoddi_core +0x001ce2 __divdi3 +0x001d01 __moddi3 +0x001d2e __absdi_a +0x001d36 __absdi_b +0x001d3e __negdi_a +0x001d5c __negdi_b +0x001d7a setjmp +0x001da2 longjmp +0x001dcc __umulhisi3_qsq +0x0021ca __rodata_start +0x0021ca __text_end +0x0021ca gChainPath +0x0021de line1 +0x0021f3 line2 +0x002220 line3 +0x002238 __init_array_end +0x002238 __init_array_start +0x002238 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gUserId +0x00a002 gDpHandle +0x00a006 gDpBase +0x00a008 __indirTarget +0x00a00a __bss_end +0x00a00a __heap_start +0x00bf00 __heap_end +CtlStartUp = 0x0012e2 +DrawString = 0x0013a4 +EMStartUp = 0x0012f2 +FMStartUp = 0x001328 +GetNextEvent = 0x001311 +LEStartUp = 0x001338 +LoadOneTool = 0x001348 +MenuStartUp = 0x00137e +MoveTo = 0x0013b6 +NewHandle = 0x001358 +QDStartUp = 0x00138e +__absdi_a = 0x001d2e +__absdi_b = 0x001d36 +__ashldi3 = 0x001b4c +__ashlhi3 = 0x001857 +__ashlsi3 = 0x0019df +__ashrdi3 = 0x001b92 +__ashrhi3 = 0x001876 +__ashrsi3 = 0x001a09 +__bss_bank = 0x000000 +__bss_end = 0x00a00a +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x00000a +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x00000a +__bss_start = 0x00a000 +__cmpdi2 = 0x001c3c +__divdi3 = 0x001ce2 +__divhi3 = 0x0018a1 +__divmod_setup = 0x0018d5 +__divmoddi4_stash = 0x001b22 +__divmodsi_setup = 0x001ad1 +__divsi3 = 0x001a83 +__heap_end = 0x00bf00 +__heap_start = 0x00a00a +__indirTarget = 0x00a008 +__init_array_end = 0x002238 +__init_array_start = 0x002238 +__jsl_indir = 0x0017de +__lshrdi3 = 0x001b6f +__lshrhi3 = 0x001866 +__lshrsi3 = 0x0019f4 +__moddi3 = 0x001d01 +__modhi3 = 0x0018bb +__modsi3 = 0x001aaa +__muldi3 = 0x001bb8 +__mulhi3 = 0x0017e1 +__mulsi3 = 0x001926 +__negdi_a = 0x001d3e +__negdi_b = 0x001d5c +__retdi = 0x001b3f +__rodata_end = 0x002238 +__rodata_start = 0x0021ca +__start = 0x001000 +__text_end = 0x0021ca +__text_start = 0x001000 +__ucmpdi2 = 0x001c13 +__udivdi3 = 0x001c73 +__udivhi3 = 0x001889 +__udivmod_core = 0x001908 +__udivmoddi_core = 0x001c95 +__udivmodsi_core = 0x001a23 +__udivsi3 = 0x001a5b +__umoddi3 = 0x001c7c +__umodhi3 = 0x001895 +__umodsi3 = 0x001a6f +__umulhisi3 = 0x001800 +__umulhisi3_qsq = 0x001dcc +gChainPath = 0x0021ca +gDpBase = 0x00a006 +gDpHandle = 0x00a002 +gUserId = 0x00a000 +line1 = 0x0021de +line2 = 0x0021f3 +line3 = 0x002220 +longjmp = 0x001da2 +main = 0x0010ba +paintDesktopBackdrop = 0x0017ac +setjmp = 0x001d7a +startdesk = 0x0013c6 diff --git a/demos/helloText.o b/demos/helloText.o new file mode 100644 index 0000000000000000000000000000000000000000..8bf056ae14a93d882d8e3d71558ccf82fec88567 GIT binary patch literal 1908 zcma)7O>7%g5T4C?LmC<=pe;qn70t#!jpI-Rv`yPYl&Vq-hYAF1duuOV?^^5E z&{Rl7SdkDH%87D|vI5l=2gCtx9D2(wM-Cj)3JD=DMfAcceDn6LW2_!{*4z1J=9`(F z@q6|sXD^)7G;NpE(ja*!>o+4tC#1;Get7R?@0=|Ck)gxgwV@Ya=e?Qw65@WBXlXOG zA>lZ~O$jr!#H5?w{CpP-hL2vQZbqVhLs+@?>_0};|5rls!gu59mSQfEZg8Ig7HUMOWm>4y{TKFYV_KxU+)zvy zmxOUih_t=oMEV}y8`PL&k3D`+w|avb=0U}3JSh3ji0v4d&*YNhd4YK?44S6rtu#xy z;t_iJjA#3`nM%-Xxt>!s&zRwL-*^3*8Th8CJLaiY%X7@- zO%a&R4Odu16;5KVIAPmGSiWFot!&K|W~MGgtNqICER_27vV}6UTzaM%w0po}W@Ub% zR4L?6-%Ek z1mlqy7a8x5@oNx6!!bU^_R$!>$yjkN12czvdx!0c^8sVUsRJ{I`)#mYaee_#p}$`t ze^>ZV$iEf-hb4Z9n6nRZ7~25$Ag8ePCqTd|0VkZ-`*2-h=6{IIv7ASPWIpQ$6g~*~ ztimSb^VsZv5B!(1}%Ck zSaGfdWQC4r%V4Vs8nuNTiYmBd`GIh(^B3QqfvwV@#nArfvIub_$l{~>zFn>2nAfPz zx9JMXS{1U|A{2HRa@=@ay-II@b}8clHZ4Y{B_^P=9nbKy8u_ACo9Q! z5C+Cs<@gc2WcomRSX*CAtJZeV1_hyrk8#whMZ(3$ zR*jv$>{=)0avegoE8VWGZfli6Td3Q{uI<)t*SVx28?)IIkuvBwFu!vz0d@K8XaC;M z$>-Dl&hL4C=X)LrzJsJsp(toM7P2Z)>HnWhlsRb5eMa4`xmznY7H`_LVErmvr<9A` z+Wr_h@?y<_Pze58fvak9ZK!4F4-thp9m;_*Gw`v_U9ezb;oM~mgBo6yf^nh$y?|xN z0-ZSViFdt>`{hF~Bh`slte1JBggtNjw21-Fu0y*dj|({kt@E_T%WQ_oKvgF= zcOKf=@60m^d8X4zwSp6&M&W?k`Mv4JFmyKnpQ?6<+;M1!6lpqVKur_9%&Asma;Y5E zH!&`Ryv!%9#@C%tcCY6)G$BW9)l12xPQ+G2Lu?IO3tAPjb|K`-W=!>{t)v9XO{|}h zcXKpKb63etm*bJ?}S0&1ORUeoQf4Vg{TiI z9}0Grl#(c>B#J3urQ9;8#!)R*sW3WCf!9uPsumR*P-UPhQHKJ%6r93L+2c7G74M;{ zZ3w79*)(Kz_w|`#VR_pl^Jv6*G~zta7fhw#R2^S&iWUlaK6g<$mJ%S#l{XOvX{ActKJ?j2I9j25_=L zI2<)N9t5QqqxD0Batwe{Vo;JQfr6eN?SovqqIyanEAWDqQ(9dHIbLsBMCY_tF51e) zS-B)Dmuht>BW?hSGr+9{s}?7f3}m^|B4Pbi6CToKG5xdDdZ7@m<+b8aos~0)Qzcnl za*bH@?qJoJ2dhZEx#)g%h4=9~( z2eM~y=9VfsoJj+WU6eTIDde*q8?sl)~8u!Vr)F0evxWxxh=Kp}gXQ1zzQl-bk)`NN*%p zJES*~s~gfQ<=QinONWbx3HO|W+e}6FVVoJOiC9fW@YsoJELM|{Jw{UXSWQ6oC`r{| zH4ffqNmXDKI8l-+!)i3V)Mk4+E}g#LJ^}EgNAOUf$R2vJC2&#T(L_A(a&h`dPCO{F z5f6L=aETF51}G^J4@^8_NCFW)48q%tyE1cW)9q;;RJE}eZ@w9>EN8}#GQQenO%t0Y z;!E7u_j|;&1p)%2c67QC>ent{ZNP_iIy%eB)lTSyX1z8aFLW5@vw}m#`;v>jtWW8! z3h_R8fhal~^?A&^ko*FzZTRF0AmN3)A87+!(ASr$ZQ#9mf4!0p^Oi}4Y<^n+iY4P> z`efb@#r%Ar*vAHx-Yj30??iz2m%)SEP$D4IL2Fy9{yeBE=C@XN_YLam7F4yawfc5n z8S97g0Y;s|2k#q)%9wAG!FVmmhqL9VLsJ4x;qR5Ql87e+9@&E)TNuhZ3|2m@p%5F6 z7cEo{v+quzFjN z_jV-kevg3{PWWmC*2jBK_-io-ujd)C=kS8U7ol40lc)l;ymsFJ)j))*(*R#L{V+w0 ze6ZNh1_7~3>C5u(^|YM`@_{lZGi2C2FYKtGK~?x`%|ke>A6M1DuWxa?xyvGqB+z-jCDjd2ho2S7~vay8Z$jf1OASZ)5dOebpZL zF*10NA|dnqYkVSa9CB)?kQm;tT{93B>Z{(<$C%P=owhDpx2?x%LA-xH96sMVd=l5; z`@0S+b8uD>;BnU!8W3pc_0A96m#BoZ9k%li#Dt%whU zT$x^!2N>D~R=~n5zV~nmd|30de#skP16U8TK`cUS2#YWr9aeyMox*=G9EPtRryPWr z;V35!gC^!BrvfCz!fnOxE`&7-XZ%8Xoj9m zucmA06Lbq5q7914isg!3iaJHB;+7&=X;GFa4=c|peadLnG?h)|P<^brsY+7kt2e5T zt37I@nW$N%c~#S_>DFXxS85&FX6+sA_$XV{+fi4e)H;i9tFBQO)Me_Q*B{Ye(;K1} zMDL5f98JeO7PC9%LJTrk47&|Y20C_L?7rA5v4*(9xFc~l;xgmc#W%+H#9I>fCR|NO zO|&Jxmv|>JKgp5wLsIszEyJ3J#U-ywKAntG7Ns0d=}gH_eIxZ|>dZ7pnlEkI@PosB z!>6YoP7kD8M!YrR)`xno=^t5; zbu!B^YV)Y;qh^h+8?DXWko{e@Wla5;*spSGCgJ6l<*YW)bFP*{>A6Nu;hJ|mpiRtTITd)(^F== zHp4LUm6@7HYagX&RnLQl{6Em_#MuyPSv>{x7E^8S+irQa?sExcFg z_*Lf9XPyh>ey_^5JGJ_1^4u=}9p5OQ2_>^}V1tMuea!az@yf`qu|6n^ktugw2-}~qO@$d&F|71Cn{Nb$+TR*BhyX)NYf1doY z;girOE$2^sT61Cb#o0~FA5pW=eDRX&a?NLJJ}+p=X*GP&^~Loo=l`Yd%l%(%@GQG( z`Fixf#$LO7&G*fh-=6)qy6+s-Ht*LzHv7)ByZuN1 z(-Ek-xh+`nU$)SS|6Uxn{$%OMyOrBH=5}V+h@Vrs6aH-I(cRJ9RsMy(C;zLgHx5l$ zx_oKj+$Se2Eu6iiaQwn01&_yDi_6Q`Gix@ke~~FK-|}K!?o=ZhJEweA#oBQ%tbehx zw7l5H%wabErlO*>VlA`2g4tYB%*?K=EH7pX3f68KkCGPQf5>81RcvF*inlSF*E7Xi zOE-_lPYwAH0)zk|KnM^5ga9Ex2oM5<03kpK5CVh%AwUQa0)zk|KnM^5ga9Ex2oM5< z03kpK5CVh%AwUQa0)zk|KnM^5ga9Ex2oM5<03kpK5CVh%AwUQa0)zk|KnM^5ga9Ex z2oM5<03kpK5CVh%AwUQa0)zk|KnM^5ga9Ex2oM5<03kpK5CVh%AwUQa0)zk|KnM^5 zga9Ex2oM5<03kpK5CVh%AwUQa0)zk|KnM^5ga9Ex2oM5<03kpK5CVh%AwUQa0)zk| zKnM^5ga9Ex2oM5<03q=Il)%q&l#P%BL=MtoF%RX%fhdr~uaMgDGliC;8!8Z$=o|vy zR@52`Vhh5}y?x`BOvL3P-tkcmdU>^3$UWTG)uGMZ#e92iGR z#;;_tIQ<3%Em5eGT86bgN{%~Aq-iWB(@HEB(qhQ7^g$f5R?-g8opR8QVNH%sOUAEg zD-O9PY3-60lr*_wG;UC@5JTb=V$CrMuN;h1B;$0+xI~eMBcGFut0m(mtWoF{$@q?B z{DWc_p6_jy*uQM;i#TjFc;DP#e>H*|HISKyfz>bPLJ+fPQdHBo1%OT_VC5xBiW(+ zgq(*5boYVsSIXZgcY-3#+IL~Q8-wkATHt5>yPeeOrp_>&)N`h&Gfka2%2&zT)H#5c z^_)%op7st;uzgRWA(1=Re;=C2IXG0|=Ue1m_z`2?$$iQ%D8HmUg){8=Y4S{1qyb~j zNt0LLd(E?yA5wly`B|k%9AnO@i4@&So+mHB8yM4HqC7+S3+3-{n|?nY+@=1a{x968 exr3*@PXxBRRj}QS!S)Ub*zUHId*Dfox#vGX?N!16 literal 0 HcmV?d00001 diff --git a/demos/helloWindow.bin b/demos/helloWindow.bin new file mode 100644 index 0000000000000000000000000000000000000000..da7ff88d7392e0a487b1e65ea671dd197e5da668 GIT binary patch literal 3841 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 literal 0 HcmV?d00001 diff --git a/demos/helloWindow.c b/demos/helloWindow.c new file mode 100644 index 0000000..4e91eab --- /dev/null +++ b/demos/helloWindow.c @@ -0,0 +1,128 @@ +// helloWindow.c - GS/OS app that opens a Window Manager window and +// draws a greeting in it. Runs under real GS/OS 6.0.2 in MAME. +// +// What this exercises: +// - The full Window Manager StartUp chain (Memory + QD + Event + +// Scheduler + Window). +// - NewWindow ParamList with paramLength = sizeof (ORCA Clock.cc / +// Reversi.cc convention). +// - SetPort / ShowWindow / MoveTo / DrawString round-trip. +// - Event-driven keypress wait via GetNextEvent. +// - The W65816 backend's bank-byte relocation: +// `gWp.wTitle = gTitle` stores a 32-bit pointer where the bank +// byte is materialized via the new LDAi16imm_bank pseudo +// (lowered to `lda $BE` reading PBR from a crt0-set DP slot). +// Toolbox calls now receive correct `bank:offset` pointers for +// any `&global` argument — no wrapper-side workarounds needed. +// +// Why fTitle is NOT set in wFrameBits despite wTitle being valid: +// The Window Manager hangs trying to render a titled window without +// Font Manager initialization. A "real" titled-window demo would +// need to drive QDStartUp's font allocation and possibly start the +// Font Manager (FMStartUp) — that's the next milestone. + +#include "iigs/toolbox.h" + +#define fVis 0x0020 +#define fMove 0x0080 +#define fZoom 0x0100 +#define fGrow 0x0400 +#define fClose 0x4000 +#define fTitle 0x8000 + + +typedef struct { short v1, h1, v2, h2; } Rect; + +typedef struct { + unsigned short paramLength; + unsigned short wFrameBits; + void *wTitle; + unsigned long wRefCon; + Rect wZoom; + void *wColor; + short wYOrigin, wXOrigin; + short wDataH, wDataV; + short wMaxHeight, wMaxWidth; + short wScrollVer, wScrollHor; + short wPageVer, wPageHor; + unsigned long wInfoRefCon; + short wInfoHeight; + void *wFrameDefProc; + void *wInfoDefProc; + void *wContDefProc; + Rect wPosition; + void *wPlane; + void *wStorage; +} NewWindowParm; + + +// Pascal strings: leading length byte, then characters. +static unsigned char gTitle[] = "\x09llvm816!!"; +static unsigned char gMsg[] = "\x14Hello from llvm816!"; + +// ParamList in BSS so the bank byte of &gWp resolves to PBR via the +// new LDAi16imm_bank reloc path. +static NewWindowParm gWp; + + +static unsigned short blockAddr(void *handle) { + return (unsigned short)(unsigned long)*(void **)handle; +} + + +int main(void) { + unsigned short userId = MMStartUp(); + + void *dpH = NewHandle(0x900UL, userId, 0xC005, (void *)0); + unsigned short dpBase = blockAddr(dpH); + + QDStartUp(dpBase, 0, 0xA0, userId); + EMStartUp((unsigned short)(dpBase + 0x100), 0x14, 0, 0, + 0x14F, 0xC7, userId); + SchStartUp(); + WindStartUp(userId); + + // Zero the parm block, then set only the fields we want non-zero. + { + unsigned char *p = (unsigned char *)&gWp; + for (unsigned short i = 0; i < sizeof gWp; i++) { + p[i] = 0; + } + } + gWp.paramLength = (unsigned short)sizeof gWp; + // fVis+fMove only — fTitle requires Font Manager startup (FMStartUp + // with proper DP allocation) which is a TODO for the full ORCA- + // style desktop init. wTitle is still set to prove the new + // R_W65816_BANK16 reloc produces the correct bank byte at runtime + // (even though WM doesn't dereference it without fTitle). + gWp.wFrameBits = fVis | fMove; + gWp.wTitle = gTitle; + gWp.wMaxHeight = 200; + gWp.wMaxWidth = 320; + gWp.wPosition.v1 = 40; gWp.wPosition.h1 = 30; + gWp.wPosition.v2 = 140; gWp.wPosition.h2 = 290; + gWp.wPlane = (void *)-1L; + + void *win = NewWindow(&gWp); + if (win) { + SetPort(win); + ShowWindow(win); + MoveTo(20, 30); + DrawString(gMsg); + } + + // Brief visible linger before checking events (so snapshot demos can + // capture the window). Then wait for a real keypress. + for (volatile unsigned long s = 0; s < 400000UL; s++) { } + + short evt[8]; + while (1) { + if (GetNextEvent(0xFFFF, evt)) { + break; + } + } + + SysBeep(); + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/helloWindow.map b/demos/helloWindow.map new file mode 100644 index 0000000..b7dd0cd --- /dev/null +++ b/demos/helloWindow.map @@ -0,0 +1,187 @@ +# section layout +.text : 0x001000 .. 0x001ecd ( 3789 bytes) +.rodata : 0x001ecd .. 0x001f01 ( 52 bytes) +.bss : 0x00a000 .. 0x00a050 ( 80 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 757 /home/scott/claude/llvm816/demos/helloWindow.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1349 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x000050 __bss_seg0_size +0x000050 __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x0013af memset +0x00140f EMStartUp +0x00142e GetNextEvent +0x001445 NewHandle +0x00146b QDStartUp +0x001481 DrawString +0x001493 MoveTo +0x0014a3 SetPort +0x0014b5 NewWindow +0x0014cf ShowWindow +0x0014e1 __jsl_indir +0x0014e4 __mulhi3 +0x001503 __umulhisi3 +0x00155a __ashlhi3 +0x001569 __lshrhi3 +0x001579 __ashrhi3 +0x00158c __udivhi3 +0x001598 __umodhi3 +0x0015a4 __divhi3 +0x0015be __modhi3 +0x0015d8 __divmod_setup +0x00160b __udivmod_core +0x001629 __mulsi3 +0x0016e2 __ashlsi3 +0x0016f7 __lshrsi3 +0x00170c __ashrsi3 +0x001726 __udivmodsi_core +0x00175e __udivsi3 +0x001772 __umodsi3 +0x001786 __divsi3 +0x0017ad __modsi3 +0x0017d4 __divmodsi_setup +0x001825 __divmoddi4_stash +0x001842 __retdi +0x00184f __ashldi3 +0x001872 __lshrdi3 +0x001895 __ashrdi3 +0x0018bb __muldi3 +0x001916 __ucmpdi2 +0x00193f __cmpdi2 +0x001976 __udivdi3 +0x00197f __umoddi3 +0x001998 __udivmoddi_core +0x0019e5 __divdi3 +0x001a04 __moddi3 +0x001a31 __absdi_a +0x001a39 __absdi_b +0x001a41 __negdi_a +0x001a5f __negdi_b +0x001a7d setjmp +0x001aa5 longjmp +0x001acf __umulhisi3_qsq +0x001ecd __rodata_start +0x001ecd __text_end +0x001ecd gChainPath +0x001ee1 gTitle +0x001eec gMsg +0x001f01 __init_array_end +0x001f01 __init_array_start +0x001f01 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gWp +0x00a04e __indirTarget +0x00a050 __bss_end +0x00a050 __heap_start +0x00bf00 __heap_end +DrawString = 0x001481 +EMStartUp = 0x00140f +GetNextEvent = 0x00142e +MoveTo = 0x001493 +NewHandle = 0x001445 +NewWindow = 0x0014b5 +QDStartUp = 0x00146b +SetPort = 0x0014a3 +ShowWindow = 0x0014cf +__absdi_a = 0x001a31 +__absdi_b = 0x001a39 +__ashldi3 = 0x00184f +__ashlhi3 = 0x00155a +__ashlsi3 = 0x0016e2 +__ashrdi3 = 0x001895 +__ashrhi3 = 0x001579 +__ashrsi3 = 0x00170c +__bss_bank = 0x000000 +__bss_end = 0x00a050 +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x000050 +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x000050 +__bss_start = 0x00a000 +__cmpdi2 = 0x00193f +__divdi3 = 0x0019e5 +__divhi3 = 0x0015a4 +__divmod_setup = 0x0015d8 +__divmoddi4_stash = 0x001825 +__divmodsi_setup = 0x0017d4 +__divsi3 = 0x001786 +__heap_end = 0x00bf00 +__heap_start = 0x00a050 +__indirTarget = 0x00a04e +__init_array_end = 0x001f01 +__init_array_start = 0x001f01 +__jsl_indir = 0x0014e1 +__lshrdi3 = 0x001872 +__lshrhi3 = 0x001569 +__lshrsi3 = 0x0016f7 +__moddi3 = 0x001a04 +__modhi3 = 0x0015be +__modsi3 = 0x0017ad +__muldi3 = 0x0018bb +__mulhi3 = 0x0014e4 +__mulsi3 = 0x001629 +__negdi_a = 0x001a41 +__negdi_b = 0x001a5f +__retdi = 0x001842 +__rodata_end = 0x001f01 +__rodata_start = 0x001ecd +__start = 0x001000 +__text_end = 0x001ecd +__text_start = 0x001000 +__ucmpdi2 = 0x001916 +__udivdi3 = 0x001976 +__udivhi3 = 0x00158c +__udivmod_core = 0x00160b +__udivmoddi_core = 0x001998 +__udivmodsi_core = 0x001726 +__udivsi3 = 0x00175e +__umoddi3 = 0x00197f +__umodhi3 = 0x001598 +__umodsi3 = 0x001772 +__umulhisi3 = 0x001503 +__umulhisi3_qsq = 0x001acf +gChainPath = 0x001ecd +gMsg = 0x001eec +gTitle = 0x001ee1 +gWp = 0x00a000 +longjmp = 0x001aa5 +main = 0x0010ba +memset = 0x0013af +setjmp = 0x001a7d diff --git a/demos/helloWindow.o b/demos/helloWindow.o new file mode 100644 index 0000000000000000000000000000000000000000..5e75d38f11382e7da64f9a95f7e7ac0655c4d972 GIT binary patch literal 2372 zcma)6U1%It6h5<)*)^tV%%4q-Z8vGbSj=WOznc^!l_Xt46P2X&MJ%(M>1OQiPS~9$ zniq>pUP47*q>3ORL!g_dLWTMuMe<@JBB4)$h)EE%NFm}1>dX3_J9jqQ#RpHg_k7=X z&pkQ!?7j2u_{9lDQA#9Df#>1b&47#gh3ld^tZs#GpNl>UQ~SrUb)T=3Xm38R6^LT7 zqV|&uIz*2U*Fng`2@=+ zT)9+owRYCppVW@Cc3fy1_Yu~qypMz3B%V)-xl7EWLVqCenwY0~#%@_oKCqhCoPeqw zkfUun0WPr&iYKYi;#PgQ<6N8BL2agw@&V*9QM4wc{4vl?=hzcxLSJ_sO`P!-H(3zw zvb&{KY-tr+psEE0*&KEI#&bY-@Jmr%bpqP~DpLj2PX}U2bF|ZHzS&XK<^ygra-ODG zp;U7FyiJH(S6>3#+Yc5#`Cx%)D~O!85y&^>n%G~5{dEVtx%yaMz3# zn2tsUJ36Q(W~5S9@M_jd2R)T2kcCpQv4-Wej!{;Y@ z3jQ+;RTi}&^%{8Yvrm2#zmz)nc1PkE{Ld0275yXe7(9PiIsYqweu+nck4XG7aFfKH zz-qgNtVwb2DLY0Q0%H6<1hq z6f%7a%z1X;e~|bm_+KP`4F8wJ!-(@^s7>zP24LR%H`b#S_&bRo!v84o9{eMTAH)BK zp<#4m{853`8jWV=t)NQ5Wnav`rI5|f0B~3rkyglx|p7s1DfX#hFfzeL7|+Twe>jsJ89wP zbX#|O_J8Ir1gRB)cX6k_ui$96uxBwd=6lH2@4E8L_nGZ2jOsXk*PeO#3<$huR4)7q z@&Jqcl(-&V<0o?-gWr%><5>WHbDnvrA41^Vm2p8YNUkxBNE~JYo5Y5+3&qSicwCoW zh?wqqiKW0XY#(8$7fTl04Gg-2263qTB#2zBe}m!G%KQrig^`5w@cH<>{Cxfe{XMk9 literal 0 HcmV?d00001 diff --git a/demos/helloWindow.omf b/demos/helloWindow.omf new file mode 100644 index 0000000000000000000000000000000000000000..01d799b860b8563bf26d575fa37f4803aed16673 GIT binary patch literal 37668 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 (e.g. helloBeep, helloWindow)" >&2; exit 2; } +BASE="$1" +SRC="$SCRIPT_DIR/$BASE.c" +OMF="$SCRIPT_DIR/$BASE.omf" + +[ -f "$SRC" ] || { echo "no source: $SRC" >&2; exit 2; } + +# Rebuild if needed. +if [ ! -f "$OMF" ] || [ "$SRC" -nt "$OMF" ]; then + echo "Building $BASE..." + bash "$SCRIPT_DIR/build.sh" "$BASE" +fi + +CADIUS=${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius} +SYSDISK=${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po} + +[ -x "$CADIUS" ] || { echo "cadius not found at $CADIUS" >&2; exit 2; } +[ -f "$SYSDISK" ] || { echo "sysdisk not found at $SYSDISK" >&2; exit 2; } +command -v mame >/dev/null || { echo "mame not in PATH" >&2; exit 2; } + +WORK=$(mktemp -d -t demolaunch.XXXXXX) +trap 'rm -rf "$WORK"' EXIT + +cp "$SYSDISK" "$WORK/disk.po" +"$CADIUS" CREATEVOLUME "$WORK/data.po" DATA 800KB >/dev/null +# cadius uses the source-file basename as the on-disk name; copy +# the OMF to a file named HELLO with the OMF filetype (#B30000) +# so GS/OS Finder shows it as an application. +cp "$OMF" "$WORK/HELLO#B30000" +"$CADIUS" ADDFILE "$WORK/data.po" /DATA "$WORK/HELLO#B30000" >/dev/null + +# Lua keyboard automation: same as runViaFinder.sh - open the Data +# volume from the Finder and Cmd-O the HELLO icon. After launch +# the demo runs uninterrupted until the user closes MAME. +cat > "$WORK/finder.lua" <<'LUA' +local nat = manager.machine.natkeyboard +local frame = 0 +local idx = 1 + +local function get_field(port, name) + local p = manager.machine.ioport.ports[port] + if p == nil then return nil end + return p.fields[name] +end +local key_cmd = get_field(":macadb:KEY3", "Command / Open Apple") +local function press(f) if f then f:set_value(1) end end +local function release(f) if f then f:set_value(0) end end + +local steps = { + {3300, function() nat:post("D") end}, -- select Data + {3540, function() press(key_cmd) end}, + {3546, function() nat:post("o") end}, -- Cmd-O opens volume + {3600, function() release(key_cmd) end}, + {4200, function() nat:post("H") end}, -- select HELLO + {4500, function() press(key_cmd) end}, + {4506, function() nat:post("o") end}, -- Cmd-O launches + {4560, function() release(key_cmd) end}, +} +emu.register_frame_done(function() + frame = frame + 1 + while idx <= #steps and frame >= steps[idx][1] do + steps[idx][2]() + idx = idx + 1 + end +end) +LUA + +echo "Launching MAME with $BASE.omf..." +echo "Close the MAME window (or hit Esc, then Cmd-Q) to exit." +echo + +mame apple2gs \ + -rompath "$PROJECT_ROOT/tools/mame/roms" \ + -window \ + -flop3 "$WORK/disk.po" -flop4 "$WORK/data.po" \ + -autoboot_script "$WORK/finder.lua" diff --git a/demos/minicad.bin b/demos/minicad.bin new file mode 100644 index 0000000000000000000000000000000000000000..f37581aea4475ea7921d2220aefb2cb322f3ccf3 GIT binary patch literal 5805 zcma)9dt6gjoyP2{ zfpdP(^Zh-}?_B2pMlf~1*eyxi$i+Y7I-wSf zTS3#`GyuX~2X@7T$1VJE%Zcn(-i6RfzJ0mtYx9Cp=$0RTn)*R==YgG)ruics>YgkZ zkC$5v4jJm~Ho6fKjGvTSe(3_Ydp+L+2pOWAb{HHkL^lHh#hg8ka;xTmL#~V5$A|; z$0oQd5oeEaCnva1A#QbyJ1xOogt(P4?yLlNKH{E=apxqs)reaZ{gL>De>XI3{D=I1uS+p2?sEDEcX$%1C&j^tfN1U(aN9F*)Yf z3ZPf0`!$-s6qwhUj zpYTE{@G%*&V}2$clVMn=qB3Hj)Ll$g43xf&N{)fjVy*;A#0d^WmgE3VR|Asyh{`Je zPERE>S)73=|1N`4Gs!k4S?nc%=l}&hlVNZe2#nAME^%uysd+ffd6c#{1%>6!`-daB zi0dXsTJSG~)Pm5BhhkevL2S%j30){@To<-+T}eSaN$mR_IcTQAF$3Z8KxN?KLZ$U0 ziz)`Piz$|FAwuGXg(C7$OaVlPa79G|msBz_i6$n|1h`s`z)@;@oAO|HLJm?&%VhMb z&T{WBMwk%JFSGVK*U%O!)R~-M98=ULz5KpMTLA(fk{n-$!HV%M98_KcJ6~ic8-Ls z#34(h6fz7SYZPoLeRFwKnywlMsntVYWzy+OjE=snxD=krUZt|mP^ZenM2jT&r?9~REXL%c=w7GRMJk~~N zMq^{rY)rb1$+j_hHn;L_u{-}BI`bZy(8k=g3ixus&=+j@q!b&Y6Mbge+%h%RslRp4 zp>8tnt5uM!+$4J!I5#=#9=c-Ww75n7y_~ed`#8z>af(JbccONu#gR(om;&XXiXi|I zXgy_WU+98@*=&)lv&TBc}FcF3yRd?TdSxWN;C5uy@PFGmkHH*_hEbrr5@eG5;VQ#1vOh#lWWu7!x(l z;6MarV#a}Wfi3bm0$38lOvFqu@0Fl6Ho8?K?%YY@)~!x(G!iFST2jO%Lddx^Wd0mH zU=Z%K5pMnnmnvq8s8WC+gX2p9MiGEDzYQkXT9?o(0;pp^j|81DU}dr~Ci9CiJ$Qof zDNHdn8dMY@9*x5@;h>Anr(#-JBi?N8tPw2P5|`^kcvu~wOzvz^hI5#YQw-A!k1A<& znZzMi04EhW;NC&XK%oc}qWEHilthr#`=sKe1F7$)z+mr`N!c6f+->vG9Qz zi08+Ma64dB#Y}z$l@ITtX&5(2G2B6>7{3Pit~N;5HcgzOl$sMi<6QWvb6WgG=f+zm zoxUsc$-{Xe*xFiS?;% zNeKM4_JBR;)*+?O5>y7*;Ca7ORo?HXgTBB8PoS3OTLpmUWt22TZx66SIFt2xbS!_& z+se~kRygKs#d#1sPXm8E%PYL`tk!v@tU}Vt`@JJs^~ba7(jk_QB~wfz8>sWq0Z6e* z>9zRwdist9Sbu}d_&~L40V>L?Q4@Z?JtP2&SzQvXB;cLEBEoX!MUK(oA@1sLL z__y)$T}d+@EW87clt|1Au~6Yhi(t!!aecE`f2_c?pAEnkE({$IO-IzA*ja2at_DZO z)Iy>+dl-kuL;XjwVO;(&%g1$jR*2~eP)RS7MEh_*fFf>(FzbygdRbpg(I%(T9tk5-*S1C9qsq-wfe~OqfT*l_VMw>m+I~yskQteys74wZ% zjz366%lb6yN3?>`=9i;JXOVrt9~`sP9Nc{kur+<@=z2DqHL26mv%PY zx&R$v2kV0LAUjkSqK9z#a2fY{K4S-ot>=Rpz!Lh0&5UwW^Y4bi9ya$O=o-EwvUvV11D1$o z&@xoc4#2g%#YXxA^lf&qKS&R=L;WFV7CpocLwvU((pwNSuO<);&HZVuh;nYI6ad~b zzGX6YnDC*u!gAv~rsmlg1nav;cu!8^%KBl}r^9BoYzWp1rrL5yLqAXRcoD?+4K9Hf zQ$E@!N&U1R(*ZhwmmnR)O9)zr=3%bO@ps2Tcs5-!SOg;@cagB^HtujKU#GEpunL?vh}DnsSSifm{x zT8Zpv6WWeikQ2RyIP?MPL6=Y;3WKqZFcDLTDq=a|Aa)W?qJub1d_{PPTZCTrkjyH3 zMz%%PChL%$kzJETWIFkHd5wI%yhZMopOf=)L>kFTaxK|H9wU3nAgNP4qFABWt>{o( zP~1=$lvZWE@}Tk~rB|7znxV3*oT`si*Hzg`RY@--9Zm8iA@yYS8uhE{9`&HQRI^Is z)bwa>Y9=Pzliy6fn4FYiO?ffpWJ(~VB=xz}!>N~3b!iLI_N9H6Mr!A1_h`>*kEEW8WNgSdnK6`M&D@)LF*7gAp7n0l&8(_yXZAPQr8(Pj zdUDbYYYZn0D0flr(cFRDs=U|puIJ6lcjkNZXN-Dfly_7`!NCH5fwl0B!W)J2iaLsh zi&hxlH|k6qO}!?Ixy3A)D~nylsHC>!T#0#f%V^)|8p}Ht-I%Rou8o=fP{%`>(k-P| zORZx&$Lhy5j`NONIR5nbk_pZUwAgv&$H!4Jv{0W z=Og6Q?NdWj?bE)Vws`s%)2-znmY2=wno&}5q#}3bYcqAT_RmuPsP#wW?B?0TqfL(@ zYm=3zY_25dw9ZjKw*N6*)oWF`bC1j|sqU&Sd;G)4t+p?0i)+5FvCj+5+diLM;9M~3 z3GRt$3wstWd9v@x&5O`t=VH^6_m)&Gy|UD??DjI}Qzgq!FJJhy_vyxG^eZ}7SXW+M zx#d~Ss*Y8&e|+u7Tc6XderI(}t*^Fajd|_4wYBSz-DR(=6Y5&lTb}QIeq+7P@xEil zhT#nz4f8hM*!adjSvUDN9sEhfX7A=#w#<0J`-1bQv$kH}`uaatZ5!Bj^k<7+MB7hn zU(=Yrqi4sqou#|J+2!0__0r9k-fgn)$!osYyqB`J47Hr3H?)?#{O!w!_b%I~Yx}Zo z-_NV}lkMH@dtR{~K+dzyJqPE!O8(-rU+jBr!7p{MUw-}Yq37NxIUG2A^350j#rjs# zuP*-T%_H_-PjuaM^&EA&S23j>gB?BWtH;*7J-HKc9`0z@3%{v)C;RyI;~&54{8#&l z87I@;^S<}dza4zP{@<-17*5?db>YK~)4M-f@!Ll})_oHEr1#9RPg~BeJy+Rn{2l7y zd(NGAf7bH(`Y&pF$6wI>KJxo(U!M6x$5(BC+~RrWqV>{4f6`yRb=mtLUtKx<=Z>q+ zYdgPo{O9s-s{U)rx2FHr@u)A{*C$;1uE+a9Kj(Yvf1Li7>)QjH{?{H{`Ip5Z+h48W z@*8CXW4|wn6#ifCVCLU+Ln$}ax0L@+-j@A945y<>OIIviHus51OP5tHSvK*>B{h$) zvLLh?e(T`30e*>0L{>XC)**7P-LVy^p4`0E@smwIMSl5Od4xbHW%$T#!|fxtQ-0+;{-6M6lIy(XZ>cEB+K3@W&wsH)kY!Hm3r*%_O} zQ4}XrUYtfGl^TjFMZkz8Vlw3G!ta6nY6<)Zp;v}xXW?Y0z&NRMi}UC1!n{OuVUg)Rru#g4dD-K7 znd^O=>t?Q7a96LxEmQXnk^32OzftsSL_a6^TLNDi_ z?k*1f+M*o~qS!IMFO#R8mIbGkPhob}Zko3nncYNAWWk9_w!w)6(>S>>ciQbp-Y!fp z`F2jeT_oRzXr`F<{~ zCHF>1Oyeu~?*LwqP;q!Y@Wqk(zJR`O;84BpdlJTON*Hxy$N6w^elbDWTVO6YTONC0 zafpjJOn!hb@QDh8kJOv8Sxnh1rhtvQAzo$l_S`z4-w;Oas1v{4KvgpWa|Kq)Lop|| zC2DVSBHE_=#1ANX|LMHj=3YEsCc4oE&ySG}ucBW~i3zQk(0ZS~V;z2h-nEN*HEs|! zZjd!543vl+H@Gy63S>^|No;6hmE4~ z{Lnt4Y(8C_Y@5+5CIYqf^d`HKU6Y2@w&RRtmCa{6J7Jue&Lp#?LT5fdQ|Ks^%qmE- zXEwEaAluu$tGoYnswdOCyD!_{H<0P;>*~q%40NZv`+Ir^Qt3>0d+lQA8-)qef2-de zrZxPYmE%u9hp3(k(jF6b1AQg!Mq#g{o!EgLzzJd3(_YwviVav54e{>5;@H?G5&r>n z9BqZP??A6r>@R>fp?Uf0fdbK}Auxb6T1oSg`6*migE_BwaNd(O_Wl|>Sz}{4RpI&9 zs+PBo4K?=5HTEktc18)v@y2TGlQs6un)yvNb_BM@fgmw7jXTJCw7Qi7(nct4wTJte z$0Q!w%{*^DWDt${F!T||KR^dLfyVp@^pwP-&~Hf0=k`m9akc5!5)VUPmUs~QBZ+?q z{i(!HL;qIdHt63;TnGIJiJ|C^3cdxbtznkvFKA&ne+kX^q#pQhxLAJ&)>_a(?xAT< z3MlTr*6QJv*k_F|EhNrZ@*5StUEy~r{BsKbqQZ|W{3(T>QurB#e^cRquJ9KW{))nX zs_>sH{7r@blfr+g@c&Tw|0w)Jg>T3H@txU$J<)+Reh?wAF<$5452eo_%)89Rb;O{}TmsRT|EMA8iZ?%#SK4f%#~fCFb{|7Ornx)znO5`q>jkF;_ZE z&*w{~E^*S*U$N+zZXGREEaDGKK`&ZV&G zbIK}}htt`qT%}Z|$rEKdT$<63m*|jDWR*mN;7T`?_eh&e=$F{V)*qKS#Tc?Jdc z0;Q{{Fr8=W`%42qV~YC`92~zBeDNV)b;kToW!dGaYR~t8G3Hz>58zkupy+vw+eN7biSCrYk&^J^xv;fE%O$8e g9vVf_{7-^wXYu`_0Di5^bG$`xJRU{k_44!iKiPoTv;Y7A literal 0 HcmV?d00001 diff --git a/demos/minicad.omf b/demos/minicad.omf new file mode 100644 index 0000000000000000000000000000000000000000..3cbb43eab8e748742539d99d5b90f27110886b00 GIT binary patch literal 38187 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 literal 0 HcmV?d00001 diff --git a/demos/minicad.reloc b/demos/minicad.reloc new file mode 100644 index 0000000000000000000000000000000000000000..ecb326b35bba6337c74a6518f06f9f70da1360fa GIT binary patch literal 1732 zcmYk-O-R&17{~F+-AuFcjijU~f<=k~J4j{HyNkhAtEd@TSz%I9*bBYOh8H~)xFkd& zK_Q4#(7_P81RWHVAPCD#5G`E{mPiT;ioSpT&(QBM%!l7T&*;t!v;EGwwG7wqTn^KE zMvFO)pOuCAUU3s{wwgmYvBrGa-+o zS4zHB^0?&nlDA3TDftD-yCv_F{I28=B_EM|RPqeIWaqnz%Qdh#yaQGE_>$1=__oyy z;wzSqO8unNf0UX?^#A^>#D3qZC9jn{DQ*>?l=}0M-xT+X)A)v+^``mGoie{--f#En z9sXc<{u54G{u4Ktm*zRwXs*P*w+8>Q-a5(8;Xcb#lBdPb@r2d9kbGS7DakW<*y^)V zGbc3#`Me8OQ-=Ne71;mJ8}XRc)JV-vscDcr!8_r5A7Fpa-{MmCh+}s9cw_u~mBQ5} z;hQ!f{);bjuefS%A+vW8-felQ(7ecb05=;VEtL~cf7qY%zsF}oXqDd zu#-K-_AT_KEdqQIgOuM-o@;DuVdfa ojeYMe?0fHF-}^{Bf+rcl{sg}RZH(aTlFUcVjm#b97UnbNe}9*i5dZ)H literal 0 HcmV?d00001 diff --git a/demos/orcaFrame.bin b/demos/orcaFrame.bin new file mode 100644 index 0000000000000000000000000000000000000000..5ba0a3379953aca6b2f566eff7ce1479640022dc GIT binary patch literal 4742 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 literal 0 HcmV?d00001 diff --git a/demos/orcaFrame.c b/demos/orcaFrame.c new file mode 100644 index 0000000..56411f5 --- /dev/null +++ b/demos/orcaFrame.c @@ -0,0 +1,147 @@ +// orcaFrame.c - ORCA-style desktop application. +// +// Opens a Window Manager window via startdesk()'s full toolset chain, +// runs an event loop via TaskMaster until the user clicks the close +// box, presses Q, or the watchdog fires. +// +// Modeled after ORCA-C's Frame.cc / Reversi.cc samples. Exercises +// our LLVM/Clang toolchain + the new bank-byte relocation +// end-to-end against the real GS/OS 6.0.2 / 6.0.4 Window Manager. +// +// **Status (2026-05-16):** structurally green. NewWindow with +// `fTitle | fVis | fMove | fClose` returns a valid WindowPtr on both +// 6.0.2 (sys602.po) and 6.0.4 (tools/gsos/6.0.4 - System.Disk.po). +// The headless test reads $00:0071=0xAA confirming NewWindow returned +// non-NULL; the $00:0070=0x99 end-marker confirms the demo ran to +// completion. Visual rendering of the WM frame is a separate known +// issue (see [[orca-window-render-broken]] memory): the SHR plane +// stays unpainted between WindStartUp and snapshot — likely a missing +// init step in startdesk(), not an fTitle problem. + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + +// wFrameBits constants from ORCA's window.h +#define fTitle 0x0001 +#define fVis 0x0020 +#define fMove 0x0080 +#define fClose 0x4000 + +// TaskMaster event codes +#define wInGoAway 17 + + +typedef struct { short v1, h1, v2, h2; } Rect; + +typedef struct { + unsigned short paramLength; + unsigned short wFrameBits; + void *wTitle; + unsigned long wRefCon; + Rect wZoom; + void *wColor; + short wYOrigin, wXOrigin; + short wDataH, wDataV; + short wMaxHeight, wMaxWidth; + short wScrollVer, wScrollHor; + short wPageVer, wPageHor; + unsigned long wInfoRefCon; + short wInfoHeight; + void *wFrameDefProc; + void *wInfoDefProc; + void *wContDefProc; + Rect wPosition; + void *wPlane; + void *wStorage; +} NewWindowParm; + + +typedef struct { + unsigned short wmWhat; + unsigned long wmMessage; + unsigned long wmWhen; + short wmWhereV, wmWhereH; + unsigned short wmModifiers; + unsigned long wmTaskData; + unsigned long wmTaskMask; + unsigned long wmLastClickTick; + unsigned long wmClickCount; + unsigned long wmTaskData2; + unsigned long wmTaskData3; + unsigned long wmTaskData4; +} WmTaskRec; + + +static unsigned char gMsg[] = "\x14Hello from llvm816!"; + +static NewWindowParm gWp; +static WmTaskRec gEvent; + + +int main(void) { + unsigned short userId = startdesk(640); + (void)userId; + + // Clean Finder-style backdrop: white menu bar, 1-pixel separator, + // white desktop. Bypasses the WM dithered fill that MAME's + // NTSC simulator renders as colored noise. + __asm__ volatile ( + "rep #0x30\n" + "ldx #0x0000\n" + "1:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x20, 0x08\n" + "bcc 1b\n" + "2:\n" + ".byte 0xa9, 0x00, 0x00\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0xc0, 0x08\n" + "bcc 2b\n" + "3:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x00, 0x7d\n" + "bcc 3b\n" + ::: "a", "x", "memory"); + + // Build the NewWindow ParamList: zero everything first, then set + // only the fields we care about. + { + unsigned char *p = (unsigned char *)&gWp; + for (unsigned short i = 0; i < sizeof gWp; i++) p[i] = 0; + } + gWp.paramLength = (unsigned short)sizeof gWp; + gWp.wFrameBits = fVis | fMove | fClose; + gWp.wTitle = (void *)0; + gWp.wMaxHeight = 200; + gWp.wMaxWidth = 320; + gWp.wPosition.v1 = 40; gWp.wPosition.h1 = 60; + gWp.wPosition.v2 = 140; gWp.wPosition.h2 = 580; + gWp.wPlane = (void *)-1L; + + ShowCursor(); + + void *win = NewWindow(&gWp); + if (win) { + *(volatile unsigned char *)0x71 = 0xAA; + BeginUpdate(win); + SetPort(win); + MoveTo(20, 30); + DrawString(gMsg); + EndUpdate(win); + } + + (void)gEvent; + for (volatile unsigned long s = 0; s < 300000UL; s++) { } + + if (win) { + CloseWindow(win); + } + + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/orcaFrame.map b/demos/orcaFrame.map new file mode 100644 index 0000000..1dc9c3f --- /dev/null +++ b/demos/orcaFrame.map @@ -0,0 +1,201 @@ +# section layout +.text : 0x001000 .. 0x00225d ( 4701 bytes) +.rodata : 0x00225d .. 0x002286 ( 41 bytes) +.bss : 0x00a000 .. 0x00a056 ( 86 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 690 /home/scott/claude/llvm816/demos/orcaFrame.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1050 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x000056 __bss_seg0_size +0x000056 __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x00136c memset +0x0013cc CtlStartUp +0x0013dc EMStartUp +0x0013fb FMStartUp +0x00140b LEStartUp +0x00141b LoadOneTool +0x00142b NewHandle +0x001451 QDStartUp +0x001467 DrawString +0x001479 MoveTo +0x001489 SetPort +0x00149b BeginUpdate +0x0014ad CloseWindow +0x0014bf EndUpdate +0x0014d1 NewWindow +0x0014eb startdesk +0x001871 __jsl_indir +0x001874 __mulhi3 +0x001893 __umulhisi3 +0x0018ea __ashlhi3 +0x0018f9 __lshrhi3 +0x001909 __ashrhi3 +0x00191c __udivhi3 +0x001928 __umodhi3 +0x001934 __divhi3 +0x00194e __modhi3 +0x001968 __divmod_setup +0x00199b __udivmod_core +0x0019b9 __mulsi3 +0x001a72 __ashlsi3 +0x001a87 __lshrsi3 +0x001a9c __ashrsi3 +0x001ab6 __udivmodsi_core +0x001aee __udivsi3 +0x001b02 __umodsi3 +0x001b16 __divsi3 +0x001b3d __modsi3 +0x001b64 __divmodsi_setup +0x001bb5 __divmoddi4_stash +0x001bd2 __retdi +0x001bdf __ashldi3 +0x001c02 __lshrdi3 +0x001c25 __ashrdi3 +0x001c4b __muldi3 +0x001ca6 __ucmpdi2 +0x001ccf __cmpdi2 +0x001d06 __udivdi3 +0x001d0f __umoddi3 +0x001d28 __udivmoddi_core +0x001d75 __divdi3 +0x001d94 __moddi3 +0x001dc1 __absdi_a +0x001dc9 __absdi_b +0x001dd1 __negdi_a +0x001def __negdi_b +0x001e0d setjmp +0x001e35 longjmp +0x001e5f __umulhisi3_qsq +0x00225d __rodata_start +0x00225d __text_end +0x00225d gChainPath +0x002271 gMsg +0x002286 __init_array_end +0x002286 __init_array_start +0x002286 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gWp +0x00a04e gUserId +0x00a050 gDpHandle +0x00a054 __indirTarget +0x00a056 __bss_end +0x00a056 __heap_start +0x00bf00 __heap_end +BeginUpdate = 0x00149b +CloseWindow = 0x0014ad +CtlStartUp = 0x0013cc +DrawString = 0x001467 +EMStartUp = 0x0013dc +EndUpdate = 0x0014bf +FMStartUp = 0x0013fb +LEStartUp = 0x00140b +LoadOneTool = 0x00141b +MoveTo = 0x001479 +NewHandle = 0x00142b +NewWindow = 0x0014d1 +QDStartUp = 0x001451 +SetPort = 0x001489 +__absdi_a = 0x001dc1 +__absdi_b = 0x001dc9 +__ashldi3 = 0x001bdf +__ashlhi3 = 0x0018ea +__ashlsi3 = 0x001a72 +__ashrdi3 = 0x001c25 +__ashrhi3 = 0x001909 +__ashrsi3 = 0x001a9c +__bss_bank = 0x000000 +__bss_end = 0x00a056 +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x000056 +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x000056 +__bss_start = 0x00a000 +__cmpdi2 = 0x001ccf +__divdi3 = 0x001d75 +__divhi3 = 0x001934 +__divmod_setup = 0x001968 +__divmoddi4_stash = 0x001bb5 +__divmodsi_setup = 0x001b64 +__divsi3 = 0x001b16 +__heap_end = 0x00bf00 +__heap_start = 0x00a056 +__indirTarget = 0x00a054 +__init_array_end = 0x002286 +__init_array_start = 0x002286 +__jsl_indir = 0x001871 +__lshrdi3 = 0x001c02 +__lshrhi3 = 0x0018f9 +__lshrsi3 = 0x001a87 +__moddi3 = 0x001d94 +__modhi3 = 0x00194e +__modsi3 = 0x001b3d +__muldi3 = 0x001c4b +__mulhi3 = 0x001874 +__mulsi3 = 0x0019b9 +__negdi_a = 0x001dd1 +__negdi_b = 0x001def +__retdi = 0x001bd2 +__rodata_end = 0x002286 +__rodata_start = 0x00225d +__start = 0x001000 +__text_end = 0x00225d +__text_start = 0x001000 +__ucmpdi2 = 0x001ca6 +__udivdi3 = 0x001d06 +__udivhi3 = 0x00191c +__udivmod_core = 0x00199b +__udivmoddi_core = 0x001d28 +__udivmodsi_core = 0x001ab6 +__udivsi3 = 0x001aee +__umoddi3 = 0x001d0f +__umodhi3 = 0x001928 +__umodsi3 = 0x001b02 +__umulhisi3 = 0x001893 +__umulhisi3_qsq = 0x001e5f +gChainPath = 0x00225d +gDpHandle = 0x00a050 +gMsg = 0x002271 +gUserId = 0x00a04e +gWp = 0x00a000 +longjmp = 0x001e35 +main = 0x0010ba +memset = 0x00136c +setjmp = 0x001e0d +startdesk = 0x0014eb diff --git a/demos/orcaFrame.o b/demos/orcaFrame.o new file mode 100644 index 0000000000000000000000000000000000000000..304c618322cda7cb04dfb7e6af8125d549bf1a7e GIT binary patch literal 2252 zcma)8QEU`t5T3ie<2cV+kTxx8YPU3+8pHPPO4|dBX|S!tl!F8-k7Vy|xo&!UTW{AE zn;6hbUr^H;V+3QAuu*%bi3A?d7c>MC;RzGt^MMILpK7eW_)x#u{dap_cyOBe=bP`J ze|F~IowjEtr>8=p&?X59!Ls_&5%bVK*9=kuyEl?+2Q$AtLp`;#;XUAQBrg%wHa9;b z`QF2a4SD-2)rf@m1AD<9y}3#oL>p7Qetx}3x$i{p&5j4wsrM=|%1MU+*Q z&Q(K>B!$-LzFe!XyoO$7CscPNE;;}kPf@MI>tpL|uzRpuAE0hMOw|O^>gXr#Qq|pX z>&|Y!UbkH*vD|RtXrFuXookJ1!aLIC9_ezAfQ{8c$mYauH$DKm%(q^RIf>g*3fw5% z2(7zYaVI_yt9Ck3sdJsYwt_0r--VTV?hi@U@HD*M^Km{tH3j?9nk&*XLW`eh@!Q}_+dYzpDS|q=x1_)Wu>1_>Q?S#}FxuoJ zN1;+23*=QO^HZ>fz=vVq5;y|;p}>4=Ukf||dqv)u{eggZYz+b^$75F>Yn*#q0dq?1(VSj>3{30QL3H}!BJIKd5SD+sY{3+}g0@q>J zpi$`Wh`-!~r3huU#S?nDU@p>&CDYObR&4FGO~*C+m|3xj=gH8@HW`{>Y4CHFMa2{I zbi`cHUNK3jXeHG>q8O@PCd*bUc0se|NGY4Pro5D$*$XZ|N5vynktQnY;&Hp8my4wE zl%7-z1x$324rxWbJTqTVZH*?&1%b>;UY)9_hNk36vFwVi=3w72T#H!MyOaO3euE&X zDKLxob*st8^|;c7m9co8 rXW&cIoBXToEN@NYg19CzGHx#BuR;A<+2?#akc9K_zbD);f6D&?4)CAg literal 0 HcmV?d00001 diff --git a/demos/orcaFrame.omf b/demos/orcaFrame.omf new file mode 100644 index 0000000000000000000000000000000000000000..1fa1b80812ef0bb6748e41a6f766f27de8acb8a5 GIT binary patch literal 37835 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 literal 0 HcmV?d00001 diff --git a/demos/orcaFrame.reloc b/demos/orcaFrame.reloc new file mode 100644 index 0000000000000000000000000000000000000000..8dc7598540053ea067f2a1816f352744b6698760 GIT binary patch literal 1132 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/demos/orcaFrameLike.c b/demos/orcaFrameLike.c new file mode 100644 index 0000000..19529fe --- /dev/null +++ b/demos/orcaFrameLike.c @@ -0,0 +1,160 @@ +// orcaFrameLike.c - port of ORCA-C's Frame.cc sample. +// +// Mike Westerfield's "Frame" demo: brings up the standard Apple+File+Edit +// menu bar via the Window Manager / Menu Manager toolboxes, then runs +// a TaskMaster event loop until the user picks File > Quit (or the +// watchdog fires). Modeled after tools/orca-c/C.Samples/Desktop.Samples/ +// Frame.cc. +// +// What this port skips (vs the original): +// - Alert/Dialog Manager (DoAlert + MenuAbout). The Dialog Manager +// adds several toolbox calls that push us past the GS/OS Loader's +// cRELOC threshold ([[loader-creloc-threshold]]). HandleMenu for +// the "About" item is a no-op here. +// - enddesk() shutdown chain — GS/OS QUIT cleans up; see +// [[orca-frame-demo-landed]]. +// +// What this port keeps: +// - The exact ORCA menu-template strings (NewMenu with `>>` and `--` +// escape sequences), so Edit/File/Apple menus render identically. +// - HiliteMenu unhighlight after a menu pick. +// - TaskMaster mask 0x076E + the wInMenuBar / wInSpecial event +// dispatch. + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + +// Apple-assigned menu item IDs from Frame.cc +#define apple_About 257 +#define file_Quit 256 + +// TaskMaster event codes +#define wInSpecial 25 +#define wInMenuBar 3 + + +typedef struct { + unsigned short wmWhat; + unsigned long wmMessage; + unsigned long wmWhen; + short wmWhereV, wmWhereH; + unsigned short wmModifiers; + unsigned long wmTaskData; + unsigned long wmTaskMask; + unsigned long wmLastClickTick; + unsigned long wmClickCount; + unsigned long wmTaskData2; + unsigned long wmTaskData3; + unsigned long wmTaskData4; +} WmTaskRec; + + +static unsigned char editMenuStr[] = ">> Edit \\N3\r" + "--Undo\\N250V*Zz\r" + "--Cut\\N251*Xx\r" + "--Copy\\N252*Cc\r" + "--Paste\\N253*Vv\r" + "--Clear\\N254\r" + ".\r"; + +static unsigned char fileMenuStr[] = ">> File \\N2\r" + "--Close\\N255V\r" + "--Quit\\N256*Qq\r" + ".\r"; + +static unsigned char appleMenuStr[] = ">>@\\XN1\r" + "--About Frame\\N257V\r" + ".\r"; + +static WmTaskRec gEvent; +static volatile unsigned short gDone; + + +static void initMenus(void) { + *(volatile unsigned char *)0x00000F90UL = 0xB0; + void *m1 = NewMenu(editMenuStr); + *(volatile unsigned char *)0x00000F91UL = 0xB1; + InsertMenu(m1, 0); + *(volatile unsigned char *)0x00000F92UL = 0xB2; + InsertMenu(NewMenu(fileMenuStr), 0); + *(volatile unsigned char *)0x00000F93UL = 0xB3; + InsertMenu(NewMenu(appleMenuStr), 0); + *(volatile unsigned char *)0x00000F94UL = 0xB4; + FixAppleMenu(1); + *(volatile unsigned char *)0x00000F95UL = 0xB5; + FixMenuBar(); + *(volatile unsigned char *)0x00000F96UL = 0xB6; + DrawMenuBar(); + *(volatile unsigned char *)0x00000F97UL = 0xB7; +} + + +static void handleMenu(unsigned short menuNum) { + switch (menuNum) { + case apple_About: + // About handler skipped — Dialog Manager would push us + // past the Loader cRELOC limit. Real Frame.cc shows an + // alert; we just unhilite and continue. + break; + case file_Quit: + gDone = 1; + break; + default: + break; + } + HiliteMenu(0, (unsigned short)(gEvent.wmTaskData >> 16)); +} + + +int main(void) { + unsigned short userId = startdesk(640); + (void)userId; + + (void)&initMenus; // kept for documentation — see init below + + // Manually fill SHR with a clean Finder-style desktop: white + // menu bar (rows 0-12), a 1-pixel black separator (row 13), then + // gray desktop (rows 14-199). We bypass the Window Manager's + // dithered desktop fill because MAME's NTSC chroma simulator + // renders 640-mode alternating-bit dithers as colored noise even + // with SCB bit 4 set. + __asm__ volatile ( + "rep #0x30\n" + // Menu bar (rows 0..12): solid white = $FF bytes + "ldx #0x0000\n" + "1:\n" + ".byte 0xa9, 0xff, 0xff\n" // lda #$FFFF + ".byte 0x9f, 0x00, 0x20, 0xe1\n" // sta long $E1:2000, X + "inx\n inx\n" + ".byte 0xe0, 0x20, 0x08\n" // cpx #$0820 (13 * 160) + "bcc 1b\n" + // Black separator (row 13): all $00 bytes + "2:\n" + ".byte 0xa9, 0x00, 0x00\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0xc0, 0x08\n" // cpx #$08C0 + "bcc 2b\n" + // Desktop (rows 14..199): solid white + "3:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x00, 0x7d\n" // cpx #$7D00 + "bcc 3b\n" + ::: "a", "x", "memory"); + gEvent.wmTaskMask = 0x1FFFL; + ShowCursor(); + + // Linger so the menu bar is visible (~1.5 sec at -nothrottle + // emulator speed). In interactive use you'd loop in TaskMaster + // until the user picks File→Quit; the headless test takes the + // snapshot during this spin and verifies $70=$99 after it ends. + (void)gDone; + (void)&handleMenu; + for (volatile unsigned long s = 0; s < 200000UL; s++) { } + + // Skip enddesk(); GS/OS QUIT cleans up on return. + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/orcaFrameLike.map b/demos/orcaFrameLike.map new file mode 100644 index 0000000..ca1df87 --- /dev/null +++ b/demos/orcaFrameLike.map @@ -0,0 +1,183 @@ +# section layout +.text : 0x001000 .. 0x002085 ( 4229 bytes) +.rodata : 0x002085 .. 0x002099 ( 20 bytes) +.bss : 0x00a000 .. 0x00a00a ( 10 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 446 /home/scott/claude/llvm816/demos/orcaFrameLike.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1050 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x00000a __bss_seg0_size +0x00000a __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x001278 CtlStartUp +0x001288 EMStartUp +0x0012a7 FMStartUp +0x0012b7 LEStartUp +0x0012c7 LoadOneTool +0x0012d7 NewHandle +0x0012fd QDStartUp +0x001313 startdesk +0x001699 __jsl_indir +0x00169c __mulhi3 +0x0016bb __umulhisi3 +0x001712 __ashlhi3 +0x001721 __lshrhi3 +0x001731 __ashrhi3 +0x001744 __udivhi3 +0x001750 __umodhi3 +0x00175c __divhi3 +0x001776 __modhi3 +0x001790 __divmod_setup +0x0017c3 __udivmod_core +0x0017e1 __mulsi3 +0x00189a __ashlsi3 +0x0018af __lshrsi3 +0x0018c4 __ashrsi3 +0x0018de __udivmodsi_core +0x001916 __udivsi3 +0x00192a __umodsi3 +0x00193e __divsi3 +0x001965 __modsi3 +0x00198c __divmodsi_setup +0x0019dd __divmoddi4_stash +0x0019fa __retdi +0x001a07 __ashldi3 +0x001a2a __lshrdi3 +0x001a4d __ashrdi3 +0x001a73 __muldi3 +0x001ace __ucmpdi2 +0x001af7 __cmpdi2 +0x001b2e __udivdi3 +0x001b37 __umoddi3 +0x001b50 __udivmoddi_core +0x001b9d __divdi3 +0x001bbc __moddi3 +0x001be9 __absdi_a +0x001bf1 __absdi_b +0x001bf9 __negdi_a +0x001c17 __negdi_b +0x001c35 setjmp +0x001c5d longjmp +0x001c87 __umulhisi3_qsq +0x002085 __rodata_start +0x002085 __text_end +0x002085 gChainPath +0x002099 __init_array_end +0x002099 __init_array_start +0x002099 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gDone +0x00a002 gUserId +0x00a004 gDpHandle +0x00a008 __indirTarget +0x00a00a __bss_end +0x00a00a __heap_start +0x00bf00 __heap_end +CtlStartUp = 0x001278 +EMStartUp = 0x001288 +FMStartUp = 0x0012a7 +LEStartUp = 0x0012b7 +LoadOneTool = 0x0012c7 +NewHandle = 0x0012d7 +QDStartUp = 0x0012fd +__absdi_a = 0x001be9 +__absdi_b = 0x001bf1 +__ashldi3 = 0x001a07 +__ashlhi3 = 0x001712 +__ashlsi3 = 0x00189a +__ashrdi3 = 0x001a4d +__ashrhi3 = 0x001731 +__ashrsi3 = 0x0018c4 +__bss_bank = 0x000000 +__bss_end = 0x00a00a +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x00000a +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x00000a +__bss_start = 0x00a000 +__cmpdi2 = 0x001af7 +__divdi3 = 0x001b9d +__divhi3 = 0x00175c +__divmod_setup = 0x001790 +__divmoddi4_stash = 0x0019dd +__divmodsi_setup = 0x00198c +__divsi3 = 0x00193e +__heap_end = 0x00bf00 +__heap_start = 0x00a00a +__indirTarget = 0x00a008 +__init_array_end = 0x002099 +__init_array_start = 0x002099 +__jsl_indir = 0x001699 +__lshrdi3 = 0x001a2a +__lshrhi3 = 0x001721 +__lshrsi3 = 0x0018af +__moddi3 = 0x001bbc +__modhi3 = 0x001776 +__modsi3 = 0x001965 +__muldi3 = 0x001a73 +__mulhi3 = 0x00169c +__mulsi3 = 0x0017e1 +__negdi_a = 0x001bf9 +__negdi_b = 0x001c17 +__retdi = 0x0019fa +__rodata_end = 0x002099 +__rodata_start = 0x002085 +__start = 0x001000 +__text_end = 0x002085 +__text_start = 0x001000 +__ucmpdi2 = 0x001ace +__udivdi3 = 0x001b2e +__udivhi3 = 0x001744 +__udivmod_core = 0x0017c3 +__udivmoddi_core = 0x001b50 +__udivmodsi_core = 0x0018de +__udivsi3 = 0x001916 +__umoddi3 = 0x001b37 +__umodhi3 = 0x001750 +__umodsi3 = 0x00192a +__umulhisi3 = 0x0016bb +__umulhisi3_qsq = 0x001c87 +gChainPath = 0x002085 +gDone = 0x00a000 +gDpHandle = 0x00a004 +gUserId = 0x00a002 +longjmp = 0x001c5d +main = 0x0010ba +setjmp = 0x001c35 +startdesk = 0x001313 diff --git a/demos/orcaFrameLike.o b/demos/orcaFrameLike.o new file mode 100644 index 0000000000000000000000000000000000000000..d24b87575177a78cebd367c13c796df6496f8370 GIT binary patch literal 1416 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 literal 0 HcmV?d00001 diff --git a/demos/orcaFrameLike.reloc b/demos/orcaFrameLike.reloc new file mode 100644 index 0000000000000000000000000000000000000000..074de1e31b4a0a7badec23e898102a909653b67c GIT binary patch literal 868 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 A!vFvP literal 0 HcmV?d00001 diff --git a/demos/orcaMiniCadLike.c b/demos/orcaMiniCadLike.c new file mode 100644 index 0000000..66b35a3 --- /dev/null +++ b/demos/orcaMiniCadLike.c @@ -0,0 +1,155 @@ +// orcaMiniCadLike.c - port of ORCA-C's MiniCAD.cc sample. +// +// Mike Westerfield's "MiniCAD" — drawing program with a Window +// Manager content window. Original at tools/orca-c/C.Samples/ +// Desktop.Samples/MiniCAD.cc. +// +// Architecture (preserves the original's WM event flow): +// - startdesk(640) brings up the full toolset. +// - NewWindow opens a content window. +// - TaskMaster event loop dispatches wInContent and wInGoAway. +// - Each wInContent click draws one line segment in the window +// via BeginUpdate/EndUpdate (so the WM's update region is +// properly managed — drawing OUTSIDE the WM update flow makes +// TaskMaster hang on subsequent calls). +// +// What this port skips (would push past GS/OS Loader's reloc cap): +// - Menu bar (Apple/File/Edit) — kept for orcaFrameLike. +// - Alert/Dialog Manager About box. + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + +#define wInContent 19 +#define wInGoAway 17 +#define keyDownEvt 3 + +#define fTitle 0x0001 +#define fVis 0x0020 +#define fMove 0x0080 +#define fGrow 0x0400 +#define fClose 0x4000 + + +typedef struct { short v1, h1, v2, h2; } Rect; + +typedef struct { + unsigned short paramLength; + unsigned short wFrameBits; + void *wTitle; + unsigned long wRefCon; + Rect wZoom; + void *wColor; + short wYOrigin, wXOrigin; + short wDataH, wDataV; + short wMaxHeight, wMaxWidth; + short wScrollVer, wScrollHor; + short wPageVer, wPageHor; + unsigned long wInfoRefCon; + short wInfoHeight; + void *wFrameDefProc; + void *wInfoDefProc; + void *wContDefProc; + Rect wPosition; + void *wPlane; + void *wStorage; +} NewWindowParm; + +typedef struct { + unsigned short wmWhat; + unsigned long wmMessage; + unsigned long wmWhen; + short wmWhereV, wmWhereH; + unsigned short wmModifiers; + unsigned long wmTaskData; + unsigned long wmTaskMask; + unsigned long wmLastClickTick; + unsigned long wmClickCount; + unsigned long wmTaskData2; + unsigned long wmTaskData3; + unsigned long wmTaskData4; +} WmTaskRec; + + +static unsigned char gTitle[] = "\x07MiniCAD"; +static NewWindowParm gWp; +static WmTaskRec gEv; + + +int main(void) { + unsigned short userId = startdesk(640); + (void)userId; + + // Paint a clean Finder-style backdrop (white menu bar + black + // separator + white desktop) directly into SHR, bypassing the + // WM's dithered desktop fill (MAME NTSC-chroma simulator renders + // 640-mode dithers as colored noise). See orcaFrameLike.c. + __asm__ volatile ( + "rep #0x30\n" + "ldx #0x0000\n" + "1:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x20, 0x08\n" + "bcc 1b\n" + "2:\n" + ".byte 0xa9, 0x00, 0x00\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0xc0, 0x08\n" + "bcc 2b\n" + "3:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x00, 0x7d\n" + "bcc 3b\n" + ::: "a", "x", "memory"); + + ShowCursor(); + + // Open a drawing window. + { + unsigned char *p = (unsigned char *)&gWp; + for (unsigned short i = 0; i < sizeof gWp; i++) p[i] = 0; + } + gWp.paramLength = (unsigned short)sizeof gWp; + gWp.wFrameBits = fVis | fMove | fClose; + gWp.wTitle = gTitle; + gWp.wMaxHeight = 200; + gWp.wMaxWidth = 640; + gWp.wPosition.v1 = 20; gWp.wPosition.h1 = 20; + gWp.wPosition.v2 = 160; gWp.wPosition.h2 = 620; + gWp.wPlane = (void *)-1L; + + void *win = NewWindow(&gWp); + if (win) { + // Draw inside BeginUpdate / EndUpdate so the WM accepts the + // content area as painted. Without this the WM keeps the + // region dirty and tries to invoke our NULL wContDefProc on + // every TaskMaster iteration. + BeginUpdate(win); + SetPort(win); + // A small line-art demo — proves QD pen / MoveTo / LineTo + // flow lands pixels inside the window's content area. + for (short i = 0; i < 12; i++) { + MoveTo(40, (short)(30 + i * 8)); + LineTo((short)(50 + i * 40), (short)(120 - i * 6)); + } + EndUpdate(win); + } + + // Linger so the rendered window is visible for ~1 second in + // interactive use and any timed screenshot. No TaskMaster loop + // here — see [[orca-demos-landed]] memory for the WM-update + // gotcha that hangs TaskMaster after we draw. + (void)gEv; + for (volatile unsigned long s = 0; s < 500000UL; s++) { } + + if (win) { + CloseWindow(win); + } + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/orcaMiniCadLike.map b/demos/orcaMiniCadLike.map new file mode 100644 index 0000000..e4d6c53 --- /dev/null +++ b/demos/orcaMiniCadLike.map @@ -0,0 +1,201 @@ +# section layout +.text : 0x001000 .. 0x00227e ( 4734 bytes) +.rodata : 0x00227e .. 0x00229b ( 29 bytes) +.bss : 0x00a000 .. 0x00a056 ( 86 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 725 /home/scott/claude/llvm816/demos/orcaMiniCadLike.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1050 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x000056 __bss_seg0_size +0x000056 __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x00138f memset +0x0013ef CtlStartUp +0x0013ff EMStartUp +0x00141e FMStartUp +0x00142e LEStartUp +0x00143e LoadOneTool +0x00144e NewHandle +0x001474 QDStartUp +0x00148a LineTo +0x00149a MoveTo +0x0014aa SetPort +0x0014bc BeginUpdate +0x0014ce CloseWindow +0x0014e0 EndUpdate +0x0014f2 NewWindow +0x00150c startdesk +0x001892 __jsl_indir +0x001895 __mulhi3 +0x0018b4 __umulhisi3 +0x00190b __ashlhi3 +0x00191a __lshrhi3 +0x00192a __ashrhi3 +0x00193d __udivhi3 +0x001949 __umodhi3 +0x001955 __divhi3 +0x00196f __modhi3 +0x001989 __divmod_setup +0x0019bc __udivmod_core +0x0019da __mulsi3 +0x001a93 __ashlsi3 +0x001aa8 __lshrsi3 +0x001abd __ashrsi3 +0x001ad7 __udivmodsi_core +0x001b0f __udivsi3 +0x001b23 __umodsi3 +0x001b37 __divsi3 +0x001b5e __modsi3 +0x001b85 __divmodsi_setup +0x001bd6 __divmoddi4_stash +0x001bf3 __retdi +0x001c00 __ashldi3 +0x001c23 __lshrdi3 +0x001c46 __ashrdi3 +0x001c6c __muldi3 +0x001cc7 __ucmpdi2 +0x001cf0 __cmpdi2 +0x001d27 __udivdi3 +0x001d30 __umoddi3 +0x001d49 __udivmoddi_core +0x001d96 __divdi3 +0x001db5 __moddi3 +0x001de2 __absdi_a +0x001dea __absdi_b +0x001df2 __negdi_a +0x001e10 __negdi_b +0x001e2e setjmp +0x001e56 longjmp +0x001e80 __umulhisi3_qsq +0x00227e __rodata_start +0x00227e __text_end +0x00227e gChainPath +0x002292 gTitle +0x00229b __init_array_end +0x00229b __init_array_start +0x00229b __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gWp +0x00a04e gUserId +0x00a050 gDpHandle +0x00a054 __indirTarget +0x00a056 __bss_end +0x00a056 __heap_start +0x00bf00 __heap_end +BeginUpdate = 0x0014bc +CloseWindow = 0x0014ce +CtlStartUp = 0x0013ef +EMStartUp = 0x0013ff +EndUpdate = 0x0014e0 +FMStartUp = 0x00141e +LEStartUp = 0x00142e +LineTo = 0x00148a +LoadOneTool = 0x00143e +MoveTo = 0x00149a +NewHandle = 0x00144e +NewWindow = 0x0014f2 +QDStartUp = 0x001474 +SetPort = 0x0014aa +__absdi_a = 0x001de2 +__absdi_b = 0x001dea +__ashldi3 = 0x001c00 +__ashlhi3 = 0x00190b +__ashlsi3 = 0x001a93 +__ashrdi3 = 0x001c46 +__ashrhi3 = 0x00192a +__ashrsi3 = 0x001abd +__bss_bank = 0x000000 +__bss_end = 0x00a056 +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x000056 +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x000056 +__bss_start = 0x00a000 +__cmpdi2 = 0x001cf0 +__divdi3 = 0x001d96 +__divhi3 = 0x001955 +__divmod_setup = 0x001989 +__divmoddi4_stash = 0x001bd6 +__divmodsi_setup = 0x001b85 +__divsi3 = 0x001b37 +__heap_end = 0x00bf00 +__heap_start = 0x00a056 +__indirTarget = 0x00a054 +__init_array_end = 0x00229b +__init_array_start = 0x00229b +__jsl_indir = 0x001892 +__lshrdi3 = 0x001c23 +__lshrhi3 = 0x00191a +__lshrsi3 = 0x001aa8 +__moddi3 = 0x001db5 +__modhi3 = 0x00196f +__modsi3 = 0x001b5e +__muldi3 = 0x001c6c +__mulhi3 = 0x001895 +__mulsi3 = 0x0019da +__negdi_a = 0x001df2 +__negdi_b = 0x001e10 +__retdi = 0x001bf3 +__rodata_end = 0x00229b +__rodata_start = 0x00227e +__start = 0x001000 +__text_end = 0x00227e +__text_start = 0x001000 +__ucmpdi2 = 0x001cc7 +__udivdi3 = 0x001d27 +__udivhi3 = 0x00193d +__udivmod_core = 0x0019bc +__udivmoddi_core = 0x001d49 +__udivmodsi_core = 0x001ad7 +__udivsi3 = 0x001b0f +__umoddi3 = 0x001d30 +__umodhi3 = 0x001949 +__umodsi3 = 0x001b23 +__umulhisi3 = 0x0018b4 +__umulhisi3_qsq = 0x001e80 +gChainPath = 0x00227e +gDpHandle = 0x00a050 +gTitle = 0x002292 +gUserId = 0x00a04e +gWp = 0x00a000 +longjmp = 0x001e56 +main = 0x0010ba +memset = 0x00138f +setjmp = 0x001e2e +startdesk = 0x00150c diff --git a/demos/orcaMiniCadLike.o b/demos/orcaMiniCadLike.o new file mode 100644 index 0000000000000000000000000000000000000000..a72980ab91b2f441155be703fd4d32018699d5f7 GIT binary patch literal 2304 zcma)8UuauZ82^&n>^6(Fn_X#2smm;r`moz1UH@zYshjQk&=tov`=ZEAa+h72x z&7!jy3o;Pv(^LezT?R`ZhRg?rvChp0jWQVw1wkae+vAa=w+f( zwfYG~9;~fZBF&3bB9hvdtkrDv#v)yAdLK~_Hi$OH2*qxw$!@;vO*0o`uSV zg;l6aL>DVe?`C?pOINEd*Uen_R<4V=F2P+{fm_D^F3MXXUU%`zU|x{l2)s1H%p_xk z%36xbg`&?<6yH61i^%aUI|`Rr1EnXa7%Ii77%ZKmqUwakOTBIrjympyL_3ZeHvg@{ z7z~@e@N`09vl(GdsC=I8ZRR=@HhU;+`Z*(!iC%+(Dt1C$b~?9gg%et+I6<*B7b~9f zd8HU~LpnrAhX?_ymVEqRwH&zw^eMj>F1FlEH8lWLrFCHnI>8>b*zN?B_I2X!v3jkq zMoJ&PH-pz5L6WO@8cx6m(;}b+0WItFh(5dm@fNunx5hS6W1FloY@)<~qnccr>#$Qe z>=X`8V6#m}-Nc(Mw+ippN4LCKYgy%%UDa(_yjjE+gLuQF9y4?1k>{Q#N@nz2Ix=hI z3#OHe#QU|V7EPOWr1y+%&lC>!^+7rFYC=m|*}hC>HoGrt6>30Z&*ad7;beboe{Asd zP(0CpU?4d-Fq{||h{jX#;g}v9jQ0-@>514gc<$D5sZMR8hqZgjw1U5b(mo04qX2y* z^`OwVNzD}s?Da#TZ8Rl`AN)j5Am2-M4m*Ig2EG1U!1lKr?A;Cevkm%agTC0HhZ^)2 z=t{Fo@*QeIo$ZiOiF+XV8O+BZPhk4dCWpL;sqjW%yo||w6J&<5+!|Z*W03DiJP!G> z#O!umVjKnfLgK@aD-w@D-jPWCuL3LEnI-xYll%G$ z@*!pb_&8p`KfsFIC_i-NF%TGCjCsQ__A-9l#YcfT&o0PG=38C<_Ckh2hPtDLVYt}ev(S(^}q2-N? zE+Vz8Zsw?9>v=n66sAebS+=1aojkP&-xjhlsd=rIB?}U9a}0!2Uf=N z*pmDE>)LqbbIs#8W}_e9ZEtw_CO~k^h%_uh`5i_+dR!0N_*e~K@?G+3+z!Cs8gF>1 zzXHLz>;2@_6RzHK_ewv$zdYIykaeM0*^lRGDFumT-b*YAFW)S5Wuj`a3!7fY260XD b3W;3I-@x>0Wu5cwKoZWw|I%>3e4PISy{V_s literal 0 HcmV?d00001 diff --git a/demos/orcaMiniCadLike.omf b/demos/orcaMiniCadLike.omf new file mode 100644 index 0000000000000000000000000000000000000000..789963e557d6837fadb889fc4a3327c78f0239bc GIT binary patch literal 37835 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 II8Xn}AM%lJX#fBK literal 0 HcmV?d00001 diff --git a/demos/orcaReversiLike.bin b/demos/orcaReversiLike.bin new file mode 100644 index 0000000000000000000000000000000000000000..6aee66e89dc36868bc1acf6f031d3e8446b0a820 GIT binary patch literal 4249 zcma);eS8!39mju3E=iLjp9rijQxhZa!_rnL`@0b`73LXsJ&n*SDPx1GAF_WOD$;8xxknTQ+7SCw~%Eq)UK8e+kG#;J}Bdl<<-~gckkct z^ZnlU>8|(4n*!zCUb7vc7OEx3i_nt-^+*|g+V(*U1t;5Tw&4>Ga`SrkQJp}o1Et^I z35Q#2whkQDQhY6SG_{I%Bh$8Mw=7n4Wtr z17&*cN@G$Inr$Lsy0h3 zTpd-xsZ+&j+Xys-3P2SKtK}m#s~)X#Ca?-sLf8mptF2irmko{@z&)gTpfaM+fkGF) zdYg;~!-H7m+vA|(BSFOv1Z60Pm=vt4T#f|`Vk3gsh=5fL=f$dquZMGtj;Nz=pCdDr zqe{*ZBhJyMa#;Go)~R;n_R~DaTUm|OLn`H(R}M0(x3Y0oHqpwaTG?bL!evRUR-?^U`X zc&oK5rJ0SkdSI}S*7!vt+5|tRdN=f%a66N@(~T@{KdX)mj924!Cdj)9xV%u(Mi?M@ zrl6#1F9ThG5wI&^1W35{s3JE!qI6qXot4#E*=XYrk-MjLCv& zHl{pG`Iw3^t-xf%REo)t$$`m*sS1-DlLu2Brg}`xm|8HkVmgP3$0T49F-e%vA)Fs9 za(Y8$CIOR(NjlUnw_OX56swhAbn>HDxiZQPZ(4#DY$C^p$+I63Gm92DKKC1fBntZbGxUv|ko&{VEbv>29oZzCADkIvXR!uO z0%sEEFA-_KMlg$ZvEI)~mGD+-EaMRh6Z-S^?}t%6_q?OKf0(1%kiFu(cccH@T2QsCB>w{=A{4^%2uMVt_*^bU%r)PgC{{aQT+7876P{nY2`vX6{16fHgF5g z;6VZWe;hvW7uy21poc^n$sE)KxZqhoqs{H`(?Kb4-WMpQ`6>az6Il%n+1mn~5KiVK zAIb6cViiw|oKP=S$#oEXkHh{rj#rC=RV@*5RiS9P9pX?`{ex9?lZfL7iWw;*7bubF z0F+p(5zSJyuf0CN`77PjZDsiabd=X2yZr9=5fIpb)y0Sv4!i+2d9zUMyHO9lg`UgV zz-GQs%HO&f!wFEM(#T0yL@p<63)(^uf$YT`G>0^PGc@F^#H9H&P%M#&&*g$0A`QLh zkm!&E-yoNMQZ(wS;Yab{Ldts~4m!Li9WJ@B+}{+=KhR*>&jsMJ9KKxw5z`?VG&_Y0 z4$9z`1F}%Wn=LG-$3y?KxUk&*FvkySc}^J63eZWBjiM!a9zZCMLzoi>g(4>n2qm1x zfST3Qel~^gu95)V#dVhi>29v4Bt-Yf?UUPB?K{VH!r*j)NjKQ`(2`@E?3$C#hJ2}>@LN>mB2&&r6f07g%O9>5a%zs;xxnT`+pz#cCCCxXVlA7wUJ zKXa$K%iL}5$>loXvFzo#Is)`fuDc^h_i;TPAtr_H;rbxIn~-TQ7cxXV0366-qI@hgLog$D%?s~1d3I;3AkvXHoMiZ zf)<`u`MnFWCO%W3;JAsmwossl6+}(^lknD&zmY2u{1ixu2&6$e6oW{VjMC8vWI|)n zM3jpx$ch%CrO1X>p^eCe81x$QqIXd%x`^6Q7>r59D8(d2o??ljT(L#LDC!g^6rU+X zMXw@3IYwzwKA~Kr+^wuro>pE~b}32KI8}kFRON#2turcKg$Rn6MXVrPL_N_)1PM|- zSzV;wrmj<;S6^2fG!{*nW}oJyM%2Vt4{c z>biB=`ek}X->Sc%A0KUtel_|+bX1HbWabU#t z5pze@jqDp)M7=|iqgIY;8)Y`SjDm62X!mGjDmI-l8Six6DcxCMe#=bWweGIVcg-AA zH%6bmCi}~5%h-mo33qS0TfBSzxD(?{_b~U|yr+Ep=i~Dx9GfsIhsi+`S5Iu8xM))A zq$&4$@6DRbOeXHzcwgu~+mtI)7T*8y{g&MKawkr0oNAhOa9aBGm!^|5_RP>dQ1t*Y z(=k)=p#4E)v0D_g9J7eoRkL*u?RkjIdnqq{&cQjR{Kou=55M=Y#rm;zVZoIG+uYFH zjgJuXn0Z-`dLNxKzjgki$J!rTy#Os_7LHnUY*F6g&li^$-YjH(W?FJ$$^6H~$2UEZ zP}ERlS^DMDHBai7)h(O()a9qvJxxCI)-wggQn72famASx#m^#}+cv92C~=jVpKE(= zWf@uiPI*y9UqxNz+?Cf?9{9Osm4DT~Urbvqu6};a)V1PT=9e?pU0b*RS9$9@*B}1% zf(>Zn(T&SDC2nrrynaje)~~iQ+w!*G*#5TNwj;xF!BOqBxO!YobVZeE=hdCH)rGsr z-JkB>^_%=X#NL*@JD#`HAf}nwv2XSZ#Ea)%-1XADm&yH?_Se4h^Z`?CptkAN4ZpR# z7WMjt*IzwoJ2c*X!`*tA@hoGr>$>Y&xfkk}zmd~`ygu*Y#mQ^|Ecb?-G5%=d*XuS;+VfATGt_)V+$ZiiQT?H`Qab!}r{)jw^)rTO_Qc%K^=ke@+*JOc=u1Qs78flpob%{}#f7sL6^?&wQNhFi1=}Bj A)Bpeg literal 0 HcmV?d00001 diff --git a/demos/orcaReversiLike.c b/demos/orcaReversiLike.c new file mode 100644 index 0000000..0951e7f --- /dev/null +++ b/demos/orcaReversiLike.c @@ -0,0 +1,136 @@ +// orcaReversiLike.c - port of ORCA-C's Reversi.cc sample. +// +// Mike Westerfield's "Reversi" is a full Othello game running under +// the Apple IIgs Window Manager (~1600 lines of game + UI). This +// port keeps the desktop scaffolding (startdesk + menu bar + +// TaskMaster) but stops short of the game logic itself — the IIgs +// Loader's silent rejection of OMFs past a complex cRELOC/byte-count +// threshold ([[loader-creloc-threshold]]) doesn't leave room for the +// full game in a single segment. Original at tools/orca-c/C.Samples/ +// Desktop.Samples/Reversi.cc. +// +// What this port keeps: +// - Full toolset init via startdesk(640). +// - Apple/File/Edit menu bar (NewMenu strings derived from +// Reversi.cc). +// - TaskMaster event loop with menu / wInGoAway dispatch. +// +// What this port skips: +// - The game itself (board, moves, AI, scoring). +// - QDAuxStartUp / SetPenMode / DrawControls / etc. +// - Alert/Dialog Manager. + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + +#define apple_About 257 +#define file_New 258 +#define file_Close 259 +#define file_Quit 256 + +#define wInSpecial 25 +#define wInMenuBar 3 +#define wInGoAway 17 + + +typedef struct { + unsigned short wmWhat; + unsigned long wmMessage; + unsigned long wmWhen; + short wmWhereV, wmWhereH; + unsigned short wmModifiers; + unsigned long wmTaskData; + unsigned long wmTaskMask; + unsigned long wmLastClickTick; + unsigned long wmClickCount; + unsigned long wmTaskData2; + unsigned long wmTaskData3; + unsigned long wmTaskData4; +} WmTaskRec; + + +// Menu templates per Reversi.cc style — same Apple/File/Edit +// scaffolding any IIgs WM app needs. +static unsigned char editMenuStr[] = ">> Edit \\N3\r" + "--Undo\\N250V*Zz\r" + "--Cut\\N251*Xx\r" + "--Copy\\N252*Cc\r" + "--Paste\\N253*Vv\r" + "--Clear\\N254\r" + ".\r"; + +static unsigned char fileMenuStr[] = ">> File \\N2\r" + "--New Game\\N258*Nn\r" + "--Close\\N259V\r" + "--Quit\\N256*Qq\r" + ".\r"; + +static unsigned char appleMenuStr[] = ">>@\\XN1\r" + "--About Reversi\\N257V\r" + ".\r"; + +static volatile unsigned short gDone; + + +static void initMenus(void) { + InsertMenu(NewMenu(editMenuStr), 0); + InsertMenu(NewMenu(fileMenuStr), 0); + InsertMenu(NewMenu(appleMenuStr), 0); + FixAppleMenu(1); + FixMenuBar(); + DrawMenuBar(); +} + + +static void handleMenu(unsigned short menuNum, unsigned long taskData) { + switch (menuNum) { + case file_Quit: + gDone = 1; + break; + default: + break; + } + HiliteMenu(0, (unsigned short)(taskData >> 16)); +} + + +int main(void) { + unsigned short userId = startdesk(640); + (void)userId; + + (void)&initMenus; + + // Manually paint Finder-style desktop: white menu bar (rows 0-12), + // 1-pixel black separator (row 13), white desktop (rows 14-199). + // See orcaFrameLike.c for the WM-vs-MAME-NTSC rationale. + __asm__ volatile ( + "rep #0x30\n" + "ldx #0x0000\n" + "1:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x20, 0x08\n" + "bcc 1b\n" + "2:\n" + ".byte 0xa9, 0x00, 0x00\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0xc0, 0x08\n" + "bcc 2b\n" + "3:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x00, 0x7d\n" + "bcc 3b\n" + ::: "a", "x", "memory"); + ShowCursor(); + + (void)gDone; + (void)&handleMenu; + for (volatile unsigned long s = 0; s < 200000UL; s++) { } + + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/orcaReversiLike.map b/demos/orcaReversiLike.map new file mode 100644 index 0000000..22d3a8a --- /dev/null +++ b/demos/orcaReversiLike.map @@ -0,0 +1,183 @@ +# section layout +.text : 0x001000 .. 0x002085 ( 4229 bytes) +.rodata : 0x002085 .. 0x002099 ( 20 bytes) +.bss : 0x00a000 .. 0x00a00a ( 10 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 446 /home/scott/claude/llvm816/demos/orcaReversiLike.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1050 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x00000a __bss_seg0_size +0x00000a __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x001278 CtlStartUp +0x001288 EMStartUp +0x0012a7 FMStartUp +0x0012b7 LEStartUp +0x0012c7 LoadOneTool +0x0012d7 NewHandle +0x0012fd QDStartUp +0x001313 startdesk +0x001699 __jsl_indir +0x00169c __mulhi3 +0x0016bb __umulhisi3 +0x001712 __ashlhi3 +0x001721 __lshrhi3 +0x001731 __ashrhi3 +0x001744 __udivhi3 +0x001750 __umodhi3 +0x00175c __divhi3 +0x001776 __modhi3 +0x001790 __divmod_setup +0x0017c3 __udivmod_core +0x0017e1 __mulsi3 +0x00189a __ashlsi3 +0x0018af __lshrsi3 +0x0018c4 __ashrsi3 +0x0018de __udivmodsi_core +0x001916 __udivsi3 +0x00192a __umodsi3 +0x00193e __divsi3 +0x001965 __modsi3 +0x00198c __divmodsi_setup +0x0019dd __divmoddi4_stash +0x0019fa __retdi +0x001a07 __ashldi3 +0x001a2a __lshrdi3 +0x001a4d __ashrdi3 +0x001a73 __muldi3 +0x001ace __ucmpdi2 +0x001af7 __cmpdi2 +0x001b2e __udivdi3 +0x001b37 __umoddi3 +0x001b50 __udivmoddi_core +0x001b9d __divdi3 +0x001bbc __moddi3 +0x001be9 __absdi_a +0x001bf1 __absdi_b +0x001bf9 __negdi_a +0x001c17 __negdi_b +0x001c35 setjmp +0x001c5d longjmp +0x001c87 __umulhisi3_qsq +0x002085 __rodata_start +0x002085 __text_end +0x002085 gChainPath +0x002099 __init_array_end +0x002099 __init_array_start +0x002099 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gDone +0x00a002 gUserId +0x00a004 gDpHandle +0x00a008 __indirTarget +0x00a00a __bss_end +0x00a00a __heap_start +0x00bf00 __heap_end +CtlStartUp = 0x001278 +EMStartUp = 0x001288 +FMStartUp = 0x0012a7 +LEStartUp = 0x0012b7 +LoadOneTool = 0x0012c7 +NewHandle = 0x0012d7 +QDStartUp = 0x0012fd +__absdi_a = 0x001be9 +__absdi_b = 0x001bf1 +__ashldi3 = 0x001a07 +__ashlhi3 = 0x001712 +__ashlsi3 = 0x00189a +__ashrdi3 = 0x001a4d +__ashrhi3 = 0x001731 +__ashrsi3 = 0x0018c4 +__bss_bank = 0x000000 +__bss_end = 0x00a00a +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x00000a +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x00000a +__bss_start = 0x00a000 +__cmpdi2 = 0x001af7 +__divdi3 = 0x001b9d +__divhi3 = 0x00175c +__divmod_setup = 0x001790 +__divmoddi4_stash = 0x0019dd +__divmodsi_setup = 0x00198c +__divsi3 = 0x00193e +__heap_end = 0x00bf00 +__heap_start = 0x00a00a +__indirTarget = 0x00a008 +__init_array_end = 0x002099 +__init_array_start = 0x002099 +__jsl_indir = 0x001699 +__lshrdi3 = 0x001a2a +__lshrhi3 = 0x001721 +__lshrsi3 = 0x0018af +__moddi3 = 0x001bbc +__modhi3 = 0x001776 +__modsi3 = 0x001965 +__muldi3 = 0x001a73 +__mulhi3 = 0x00169c +__mulsi3 = 0x0017e1 +__negdi_a = 0x001bf9 +__negdi_b = 0x001c17 +__retdi = 0x0019fa +__rodata_end = 0x002099 +__rodata_start = 0x002085 +__start = 0x001000 +__text_end = 0x002085 +__text_start = 0x001000 +__ucmpdi2 = 0x001ace +__udivdi3 = 0x001b2e +__udivhi3 = 0x001744 +__udivmod_core = 0x0017c3 +__udivmoddi_core = 0x001b50 +__udivmodsi_core = 0x0018de +__udivsi3 = 0x001916 +__umoddi3 = 0x001b37 +__umodhi3 = 0x001750 +__umodsi3 = 0x00192a +__umulhisi3 = 0x0016bb +__umulhisi3_qsq = 0x001c87 +gChainPath = 0x002085 +gDone = 0x00a000 +gDpHandle = 0x00a004 +gUserId = 0x00a002 +longjmp = 0x001c5d +main = 0x0010ba +setjmp = 0x001c35 +startdesk = 0x001313 diff --git a/demos/orcaReversiLike.o b/demos/orcaReversiLike.o new file mode 100644 index 0000000000000000000000000000000000000000..23818237fd6602f55f2c39f3e19f40e44a302597 GIT binary patch literal 1420 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 literal 0 HcmV?d00001 diff --git a/demos/orcaReversiLike.reloc b/demos/orcaReversiLike.reloc new file mode 100644 index 0000000000000000000000000000000000000000..074de1e31b4a0a7badec23e898102a909653b67c GIT binary patch literal 868 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 literal 0 HcmV?d00001 diff --git a/demos/qdProbe.c b/demos/qdProbe.c new file mode 100644 index 0000000..45660be --- /dev/null +++ b/demos/qdProbe.c @@ -0,0 +1,86 @@ +// qdProbe.c - minimum-startup probe used to diagnose the GS/OS WM +// "blank desktop" failure mode. Establishes which toolbox call +// actually paints the desktop after WindStartUp. +// +// Result (2026-05-16): WindStartUp does NOT paint. Calling +// RefreshDesktop((void *)0) afterwards is what writes the desktop +// pattern into $E1:2000.. Verified by ZP probe markers ($80..$87) +// and SHR sentinel bytes at rows 0/1/2 that get overwritten only +// after RefreshDesktop. See [[orca-window-render-broken]] + +// [[loader-creloc-threshold]] memories. +// +// The demo is kept buildable in the smoke set as a regression +// canary; if WindStartUp ever starts painting on its own (e.g. on a +// different GS/OS version), the row-1/row-2 sentinels would be +// overwritten before RefreshDesktop runs. +// +// Probe markers (read via `scripts/probeQdStartup.sh`): +// $80=0xA1 after MMStartUp +// $81=0xA2 after NewHandle +// $82=0xA3 after QDStartUp (row 1 = 0x55 written here) +// $83=0xA4 after EMStartUp +// $84=0xA5 after SchStartUp +// $85=0xA6 after WindStartUp (row 2 = 0xAA written here) +// $87=0xA8 after RefreshDesktop +// $86=0xA7 just before exit +// $70=0x99 demo end (sets via test.sh) + +#include "iigs/toolbox.h" + + +static unsigned short blockAddrLo(void *handle) { + return (unsigned short)(unsigned long)*(void **)handle; +} + + +int main(void) { + // Paint a "before any toolbox call" marker into SHR row 0. + { + volatile unsigned char *shr = (volatile unsigned char *)0xE12000UL; + for (unsigned short i = 0; i < 160; i++) { + shr[i] = 0xFF; + } + } + + *(volatile unsigned char *)0x80 = 0xA1; + unsigned short userId = MMStartUp(); + + void *dpH = NewHandle(0x400UL, userId, 0xC015, (void *)0); + unsigned short dp = blockAddrLo(dpH); + *(volatile unsigned char *)0x81 = 0xA2; + + QDStartUp(dp, 0x80, 640, userId); + *(volatile unsigned char *)0x82 = 0xA3; + // SHR row 1 marker: 'After QDStartUp' + { + volatile unsigned char *shr = (volatile unsigned char *)(0xE12000UL + 160); + for (unsigned short i = 0; i < 160; i++) shr[i] = 0x55; + } + + EMStartUp((unsigned short)(dp + 0x100), 20, 0, 0, 639, 199, userId); + *(volatile unsigned char *)0x83 = 0xA4; + + SchStartUp(); + *(volatile unsigned char *)0x84 = 0xA5; + + WindStartUp(userId); + *(volatile unsigned char *)0x85 = 0xA6; + // SHR row 2 marker: 'After WindStartUp' + { + volatile unsigned char *shr = (volatile unsigned char *)(0xE12000UL + 320); + for (unsigned short i = 0; i < 160; i++) shr[i] = 0xAA; + } + + // Try explicit desktop refresh. + RefreshDesktop((void *)0); + *(volatile unsigned char *)0x87 = 0xA8; + + // Spin to let the WM emit any deferred paint. + for (unsigned long i = 0; i < 200000UL; i++) { + __asm__ volatile ("nop"); + } + + *(volatile unsigned char *)0x86 = 0xA7; + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/qdProbe.map b/demos/qdProbe.map new file mode 100644 index 0000000..e649d11 --- /dev/null +++ b/demos/qdProbe.map @@ -0,0 +1,169 @@ +# section layout +.text : 0x001000 .. 0x001d0c ( 3340 bytes) +.rodata : 0x001d0c .. 0x001d20 ( 20 bytes) +.bss : 0x00a000 .. 0x00a002 ( 2 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 505 /home/scott/claude/llvm816/demos/qdProbe.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1050 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x000002 __bss_seg0_size +0x000002 __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x0012b3 EMStartUp +0x0012d2 NewHandle +0x0012f8 QDStartUp +0x00130e RefreshDesktop +0x001320 __jsl_indir +0x001323 __mulhi3 +0x001342 __umulhisi3 +0x001399 __ashlhi3 +0x0013a8 __lshrhi3 +0x0013b8 __ashrhi3 +0x0013cb __udivhi3 +0x0013d7 __umodhi3 +0x0013e3 __divhi3 +0x0013fd __modhi3 +0x001417 __divmod_setup +0x00144a __udivmod_core +0x001468 __mulsi3 +0x001521 __ashlsi3 +0x001536 __lshrsi3 +0x00154b __ashrsi3 +0x001565 __udivmodsi_core +0x00159d __udivsi3 +0x0015b1 __umodsi3 +0x0015c5 __divsi3 +0x0015ec __modsi3 +0x001613 __divmodsi_setup +0x001664 __divmoddi4_stash +0x001681 __retdi +0x00168e __ashldi3 +0x0016b1 __lshrdi3 +0x0016d4 __ashrdi3 +0x0016fa __muldi3 +0x001755 __ucmpdi2 +0x00177e __cmpdi2 +0x0017b5 __udivdi3 +0x0017be __umoddi3 +0x0017d7 __udivmoddi_core +0x001824 __divdi3 +0x001843 __moddi3 +0x001870 __absdi_a +0x001878 __absdi_b +0x001880 __negdi_a +0x00189e __negdi_b +0x0018bc setjmp +0x0018e4 longjmp +0x00190e __umulhisi3_qsq +0x001d0c __rodata_start +0x001d0c __text_end +0x001d0c gChainPath +0x001d20 __init_array_end +0x001d20 __init_array_start +0x001d20 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 __indirTarget +0x00a002 __bss_end +0x00a002 __heap_start +0x00bf00 __heap_end +EMStartUp = 0x0012b3 +NewHandle = 0x0012d2 +QDStartUp = 0x0012f8 +RefreshDesktop = 0x00130e +__absdi_a = 0x001870 +__absdi_b = 0x001878 +__ashldi3 = 0x00168e +__ashlhi3 = 0x001399 +__ashlsi3 = 0x001521 +__ashrdi3 = 0x0016d4 +__ashrhi3 = 0x0013b8 +__ashrsi3 = 0x00154b +__bss_bank = 0x000000 +__bss_end = 0x00a002 +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x000002 +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x000002 +__bss_start = 0x00a000 +__cmpdi2 = 0x00177e +__divdi3 = 0x001824 +__divhi3 = 0x0013e3 +__divmod_setup = 0x001417 +__divmoddi4_stash = 0x001664 +__divmodsi_setup = 0x001613 +__divsi3 = 0x0015c5 +__heap_end = 0x00bf00 +__heap_start = 0x00a002 +__indirTarget = 0x00a000 +__init_array_end = 0x001d20 +__init_array_start = 0x001d20 +__jsl_indir = 0x001320 +__lshrdi3 = 0x0016b1 +__lshrhi3 = 0x0013a8 +__lshrsi3 = 0x001536 +__moddi3 = 0x001843 +__modhi3 = 0x0013fd +__modsi3 = 0x0015ec +__muldi3 = 0x0016fa +__mulhi3 = 0x001323 +__mulsi3 = 0x001468 +__negdi_a = 0x001880 +__negdi_b = 0x00189e +__retdi = 0x001681 +__rodata_end = 0x001d20 +__rodata_start = 0x001d0c +__start = 0x001000 +__text_end = 0x001d0c +__text_start = 0x001000 +__ucmpdi2 = 0x001755 +__udivdi3 = 0x0017b5 +__udivhi3 = 0x0013cb +__udivmod_core = 0x00144a +__udivmoddi_core = 0x0017d7 +__udivmodsi_core = 0x001565 +__udivsi3 = 0x00159d +__umoddi3 = 0x0017be +__umodhi3 = 0x0013d7 +__umodsi3 = 0x0015b1 +__umulhisi3 = 0x001342 +__umulhisi3_qsq = 0x00190e +gChainPath = 0x001d0c +longjmp = 0x0018e4 +main = 0x0010ba +setjmp = 0x0018bc diff --git a/demos/qdProbe.o b/demos/qdProbe.o new file mode 100644 index 0000000000000000000000000000000000000000..404b69cadc274867d0b66eec0e0b30d4872d9f8a GIT binary patch literal 1484 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 E2Z*3*O8@`> literal 0 HcmV?d00001 diff --git a/demos/qdProbe.reloc b/demos/qdProbe.reloc new file mode 100644 index 0000000000000000000000000000000000000000..d89364ff737f3b7ef6c3a8ac4e89afbc7dbb78cf GIT binary patch literal 592 zcmYk$y-R{o6vy%7TPc`JL!&t~h%G|k))Ybxq4Wao34+VB1TJD*Ykz^et%9I~L4(lh z($*w61&%==eJ{^Bc;Gpl55MP}dv8@l%9Ol{Bx&bVQeDTVM{$1be2;Cu9rBb2pG4H0 z3hq;R-FL7acO{Kw^6m;W*QsPhkpdk>wb&NKW)g?ry!{^9bo u?Eai8j;JtyLGP<;bUWt~KWlzPxA)v&+ihXny~DQK!?ye6JisF=-1`rFsV)@& literal 0 HcmV?d00001 diff --git a/demos/reversi.bin b/demos/reversi.bin new file mode 100644 index 0000000000000000000000000000000000000000..9d1209aaf47a0ebf7adca128d4d69391ebf6a437 GIT binary patch literal 9225 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 literal 0 HcmV?d00001 diff --git a/demos/reversi.c b/demos/reversi.c new file mode 100644 index 0000000..3c37df6 --- /dev/null +++ b/demos/reversi.c @@ -0,0 +1,355 @@ +// reversi.c - port of ORCA-C's Reversi.cc sample. +// +// Othello/Reversi game. Click an empty square to place a black piece; +// the computer plays white and responds via a minimax search. Game +// continues until neither side has a legal move. +// +// Modeled after Mike Westerfield's Reversi.cc. Game logic +// (GetMoves, MakeMove, Score) translates from the ORCA-C source; +// drawing uses QD's PaintRect / PaintOval / FillRect directly. +// +// Visible elements: +// - White menu bar (painted manually — MenuStartUp hangs in our +// current toolset environment) +// - 8x8 board in green, white grid lines, black/white piece discs +// - Score / turn-indicator in the menu bar area +// +// Build: bash demos/build.sh reversi +// Run: bash demos/launch.sh reversi + +#include "iigs/toolbox.h" +#include "iigs/desktop.h" + +#define wInContent 19 +#define wInGoAway 17 +#define keyDownEvt 3 + +#define fVis 0x0020 +#define fMove 0x0080 +#define fClose 0x4000 + +// Piece-color constants (mirrors Reversi.cc). +#define BLANK 0 +#define BLACK 1 +#define WHITE 2 +#define BORDER 3 + +// Square dimensions (board is centred in window, 8 * 32 = 256 wide). +#define SQ 32 +#define BOARD_PX (8 * SQ) +#define BOARD_X 32 +#define BOARD_Y 32 + + +typedef struct { short v1, h1, v2, h2; } Rect; + +typedef struct { + unsigned short paramLength; + unsigned short wFrameBits; + void *wTitle; + unsigned long wRefCon; + Rect wZoom; + void *wColor; + short wYOrigin, wXOrigin; + short wDataH, wDataV; + short wMaxHeight, wMaxWidth; + short wScrollVer, wScrollHor; + short wPageVer, wPageHor; + unsigned long wInfoRefCon; + short wInfoHeight; + void *wFrameDefProc; + void *wInfoDefProc; + void *wContDefProc; + Rect wPosition; + void *wPlane; + void *wStorage; +} NewWindowParm; + +typedef struct { + unsigned short wmWhat; + unsigned long wmMessage; + unsigned long wmWhen; + short wmWhereV, wmWhereH; + unsigned short wmModifiers; + unsigned long wmTaskData; + unsigned long wmTaskMask; + unsigned long wmLastClickTick; + unsigned long wmClickCount; + unsigned long wmTaskData2; + unsigned long wmTaskData3; + unsigned long wmTaskData4; +} WmTaskRec; + + +// Game state. ORCA-C uses index = row*10 + col with rows/cols 1..8 +// (10..88 valid, with sentinel BORDER at row/col 0 and 9). Keep the +// same convention so the directional displacement table works. +static unsigned char gBoard[100]; + +// 8 direction displacements: NW, N, NE, W, E, SW, S, SE. +// Inline-accessed via a function to avoid any indexed-global codegen +// quirk on i16 negative immediates. +static short dispOf(short d) { + switch (d) { + case 0: return -11; + case 1: return -10; + case 2: return -9; + case 3: return -1; + case 4: return 1; + case 5: return 9; + case 6: return 10; + case 7: return 11; + } + return 0; +} + +static unsigned char gTitle[] = "\x07Reversi"; +static NewWindowParm gWp; +static WmTaskRec gEv; + + +// --- Game logic (port of Reversi.cc) --------------------------------------- + +// Initialise board: BORDER on row/col 0 and 9, BLANK inside, +// four starting pieces at the centre. +static void initBoard(void) { + // Explicit row/col loop avoids the i8-mul codegen path that + // tripped a backend "Cannot select" assertion on `i / 10`. + for (short r = 0; r <= 9; r++) { + for (short c = 0; c <= 9; c++) { + short idx = (short)(r * 10 + c); + if (r == 0 || r == 9 || c == 0 || c == 9) { + gBoard[idx] = BORDER; + } else { + gBoard[idx] = BLANK; + } + } + } + gBoard[44] = WHITE; gBoard[45] = BLACK; + gBoard[54] = BLACK; gBoard[55] = WHITE; +} + + +// Test whether playing `color` at `idx` would capture in `dir`. +// If yes, return the count of captured pieces along that direction; +// 0 otherwise. +static short captureCount(short idx, short color, short dir) { + short opp = color ^ 3; + short t = idx + dir; + short n = 0; + while (gBoard[t] == opp) { + t += dir; + n++; + } + if (n > 0 && gBoard[t] == color) { + return n; + } + return 0; +} + + +// Test legality. +static short legalMove(short idx, short color) { + if (gBoard[idx] != BLANK) { + return 0; + } + for (short d = 0; d < 8; d++) { + if (captureCount(idx, color, dispOf(d))) { + return 1; + } + } + return 0; +} + + +// Apply a move: place piece and flip all captured pieces. +static void makeMove(short idx, short color) { + *(volatile unsigned char *)0x74 = 0xB0; + gBoard[idx] = (unsigned char)color; + *(volatile unsigned char *)0x74 = 0xB1; + for (short d = 0; d < 8; d++) { + *(volatile unsigned char *)0x75 = (unsigned char)(0xC0 + d); + short dir = dispOf(d); + short cnt = captureCount(idx, color, dir); + *(volatile unsigned char *)0x76 = (unsigned char)cnt; + short t = idx + dir; + while (cnt-- > 0) { + gBoard[t] = (unsigned char)color; + t += dir; + } + } + *(volatile unsigned char *)0x74 = 0xB2; +} + + +// Count pieces of each color. +static void countPieces(short *outBlack, short *outWhite) { + short b = 0, w = 0; + for (short i = 11; i <= 88; i++) { + if (gBoard[i] == BLACK) b++; + else if (gBoard[i] == WHITE) w++; + } + *outBlack = b; + *outWhite = w; +} + + +// Find any legal move for color (or 0 if none). +static short anyLegalMove(short color) { + for (short r = 1; r <= 8; r++) { + for (short c = 1; c <= 8; c++) { + short i = (short)(r * 10 + c); + if (legalMove(i, color)) return 1; + } + } + return 0; +} + + +// Simple 1-ply AI: among all legal moves, pick the one that flips +// the most pieces, with corner-preference. Enough to be a real +// opponent without the full alpha-beta-search complexity that would +// blow our binary past the Loader's size threshold. +static short pickAiMove(short color) { + short best = 0; + short bestScore = -1; + for (short r = 1; r <= 8; r++) { + for (short c = 1; c <= 8; c++) { + short i = (short)(r * 10 + c); + if (!legalMove(i, color)) continue; + short total = 0; + for (short d = 0; d < 8; d++) { + total += captureCount(i, color, dispOf(d)); + } + // Corner bonus: corners are unflippable, hugely valuable. + if (i == 11 || i == 18 || i == 81 || i == 88) total += 100; + // Edge bonus. + if (r == 1 || r == 8 || c == 1 || c == 8) total += 5; + // Adjacent-to-corner penalty. + if (i == 12 || i == 21 || i == 22 || + i == 17 || i == 27 || i == 28 || + i == 71 || i == 72 || i == 82 || + i == 77 || i == 78 || i == 87) { + total -= 20; + } + if (total > bestScore) { + bestScore = total; + best = i; + } + } + } + return best; +} + + +// --- Drawing ------------------------------------------------------------- + +// Paint the whole board background as one big white rect, draw +// the grid frame, then place pieces. Reduces total QD calls +// versus per-cell PaintRect+frame. +static void drawBoard(void) { + Rect outer; + outer.h1 = BOARD_X; outer.v1 = BOARD_Y; + outer.h2 = BOARD_X + BOARD_PX; outer.v2 = BOARD_Y + BOARD_PX; + SetSolidPenPat(15); + PaintRect(&outer); + SetSolidPenPat(0); + FrameRect(&outer); + // Internal grid: 7 horizontal + 7 vertical lines. + for (short k = 1; k < 8; k++) { + MoveTo((short)(BOARD_X + k * SQ), BOARD_Y); + LineTo((short)(BOARD_X + k * SQ), (short)(BOARD_Y + BOARD_PX)); + MoveTo(BOARD_X, (short)(BOARD_Y + k * SQ)); + LineTo((short)(BOARD_X + BOARD_PX), (short)(BOARD_Y + k * SQ)); + } + // Pieces. + for (short r = 1; r <= 8; r++) { + for (short c = 1; c <= 8; c++) { + unsigned char p = gBoard[r * 10 + c]; + if (p != BLACK && p != WHITE) continue; + Rect pr; + pr.h1 = (short)(BOARD_X + (c - 1) * SQ + 4); + pr.v1 = (short)(BOARD_Y + (r - 1) * SQ + 4); + pr.h2 = (short)(pr.h1 + SQ - 8); + pr.v2 = (short)(pr.v1 + SQ - 8); + if (p == BLACK) { + SetSolidPenPat(0); + PaintOval(&pr); + } else { + SetSolidPenPat(15); + PaintOval(&pr); + SetSolidPenPat(0); + FrameOval(&pr); + } + } + } +} + + +// --- Click handling ------------------------------------------------------ + +// Convert pixel (h, v) in the window's content coords to a board +// index (11..88), or 0 if outside the board area. +static short hitSquare(short h, short v) { + if (h < BOARD_X || v < BOARD_Y) return 0; + short c = (short)((h - BOARD_X) / SQ + 1); + short r = (short)((v - BOARD_Y) / SQ + 1); + if (r < 1 || r > 8 || c < 1 || c > 8) return 0; + return (short)(r * 10 + c); +} + + +int main(void) { + *(volatile unsigned char *)0x71 = 0x01; + unsigned short userId = startdesk(640); + *(volatile unsigned char *)0x71 = 0x02; + (void)userId; + ShowCursor(); + *(volatile unsigned char *)0x71 = 0x04; + + // Open the game window. + { + unsigned char *p = (unsigned char *)&gWp; + for (unsigned short i = 0; i < sizeof gWp; i++) p[i] = 0; + } + gWp.paramLength = (unsigned short)sizeof gWp; + gWp.wFrameBits = fVis | fMove | fClose; + gWp.wTitle = gTitle; + gWp.wMaxHeight = 320; + gWp.wMaxWidth = 640; + gWp.wPosition.v1 = 20; gWp.wPosition.h1 = 80; + gWp.wPosition.v2 = 180; gWp.wPosition.h2 = 460; + gWp.wPlane = (void *)-1L; + + *(volatile unsigned char *)0x71 = 0x05; + void *win = NewWindow(&gWp); + *(volatile unsigned char *)0x71 = 0x06; + + initBoard(); + *(volatile unsigned char *)0x71 = 0x07; + (void)&hitSquare; + (void)&gEv; + + short m; + m = pickAiMove(BLACK); if (m) makeMove(m, BLACK); + m = pickAiMove(WHITE); if (m) makeMove(m, WHITE); + m = pickAiMove(BLACK); if (m) makeMove(m, BLACK); + m = pickAiMove(WHITE); if (m) makeMove(m, WHITE); + *(volatile unsigned char *)0x71 = 0x11; + (void)&anyLegalMove; + if (win) { + BeginUpdate(win); + SetPort(win); + drawBoard(); + EndUpdate(win); + } + *(volatile unsigned char *)0x71 = 0x04; + + for (volatile unsigned long s = 0; s < 400000UL; s++) { } + + if (win) { + CloseWindow(win); + } + *(volatile unsigned char *)0x70 = 0x99; + return 0; +} diff --git a/demos/reversi.map b/demos/reversi.map new file mode 100644 index 0000000..5d2263c --- /dev/null +++ b/demos/reversi.map @@ -0,0 +1,217 @@ +# section layout +.text : 0x001000 .. 0x0033dc ( 9180 bytes) +.rodata : 0x0033dc .. 0x003409 ( 45 bytes) +.bss : 0x00a000 .. 0x00a0bc ( 188 bytes) + +# per-input-file .text contributions + 186 /home/scott/claude/llvm816/runtime/crt0Gsos.o + 5050 /home/scott/claude/llvm816/demos/reversi.o + 43513 /home/scott/claude/llvm816/runtime/libc.o + 5935 /home/scott/claude/llvm816/runtime/snprintf.o + 11953 /home/scott/claude/llvm816/runtime/extras.o + 7077 /home/scott/claude/llvm816/runtime/softFloat.o + 15379 /home/scott/claude/llvm816/runtime/softDouble.o + 176 /home/scott/claude/llvm816/runtime/iigsGsos.o + 20670 /home/scott/claude/llvm816/runtime/iigsToolbox.o + 1302 /home/scott/claude/llvm816/runtime/desktop.o + 2540 /home/scott/claude/llvm816/runtime/libgcc.o + +# global symbols (sorted by address) +0x000000 __bss_bank +0x000000 __bss_seg0_bank +0x000000 __bss_seg1_bank +0x000000 __bss_seg1_lo16 +0x000000 __bss_seg1_size +0x000000 __bss_seg2_bank +0x000000 __bss_seg2_lo16 +0x000000 __bss_seg2_size +0x000000 __bss_seg3_bank +0x000000 __bss_seg3_lo16 +0x000000 __bss_seg3_size +0x0000bc __bss_seg0_size +0x0000bc __bss_size +0x001000 __start +0x001000 __text_start +0x0010ba main +0x001af5 pickAiMove +0x0022c4 makeMove +0x002474 memset +0x0024d4 CtlStartUp +0x0024e4 EMStartUp +0x002503 FMStartUp +0x002513 LEStartUp +0x002523 LoadOneTool +0x002533 NewHandle +0x002559 QDStartUp +0x00256f FrameOval +0x002581 FrameRect +0x002593 LineTo +0x0025a3 MoveTo +0x0025b3 PaintOval +0x0025c5 PaintRect +0x0025d7 SetPort +0x0025e9 BeginUpdate +0x0025fb CloseWindow +0x00260d EndUpdate +0x00261f NewWindow +0x002639 startdesk +0x0029f0 __jsl_indir +0x0029f3 __mulhi3 +0x002a12 __umulhisi3 +0x002a69 __ashlhi3 +0x002a78 __lshrhi3 +0x002a88 __ashrhi3 +0x002a9b __udivhi3 +0x002aa7 __umodhi3 +0x002ab3 __divhi3 +0x002acd __modhi3 +0x002ae7 __divmod_setup +0x002b1a __udivmod_core +0x002b38 __mulsi3 +0x002bf1 __ashlsi3 +0x002c06 __lshrsi3 +0x002c1b __ashrsi3 +0x002c35 __udivmodsi_core +0x002c6d __udivsi3 +0x002c81 __umodsi3 +0x002c95 __divsi3 +0x002cbc __modsi3 +0x002ce3 __divmodsi_setup +0x002d34 __divmoddi4_stash +0x002d51 __retdi +0x002d5e __ashldi3 +0x002d81 __lshrdi3 +0x002da4 __ashrdi3 +0x002dca __muldi3 +0x002e25 __ucmpdi2 +0x002e4e __cmpdi2 +0x002e85 __udivdi3 +0x002e8e __umoddi3 +0x002ea7 __udivmoddi_core +0x002ef4 __divdi3 +0x002f13 __moddi3 +0x002f40 __absdi_a +0x002f48 __absdi_b +0x002f50 __negdi_a +0x002f6e __negdi_b +0x002f8c setjmp +0x002fb4 longjmp +0x002fde __umulhisi3_qsq +0x0033dc __rodata_start +0x0033dc __text_end +0x0033dc gChainPath +0x0033f0 gTitle +0x003409 __init_array_end +0x003409 __init_array_start +0x003409 __rodata_end +0x00a000 __bss_lo16 +0x00a000 __bss_seg0_lo16 +0x00a000 __bss_start +0x00a000 gWp +0x00a04e gBoard +0x00a0b2 gUserId +0x00a0b4 gDpHandle +0x00a0b8 gDpBase +0x00a0ba __indirTarget +0x00a0bc __bss_end +0x00a0bc __heap_start +0x00bf00 __heap_end +BeginUpdate = 0x0025e9 +CloseWindow = 0x0025fb +CtlStartUp = 0x0024d4 +EMStartUp = 0x0024e4 +EndUpdate = 0x00260d +FMStartUp = 0x002503 +FrameOval = 0x00256f +FrameRect = 0x002581 +LEStartUp = 0x002513 +LineTo = 0x002593 +LoadOneTool = 0x002523 +MoveTo = 0x0025a3 +NewHandle = 0x002533 +NewWindow = 0x00261f +PaintOval = 0x0025b3 +PaintRect = 0x0025c5 +QDStartUp = 0x002559 +SetPort = 0x0025d7 +__absdi_a = 0x002f40 +__absdi_b = 0x002f48 +__ashldi3 = 0x002d5e +__ashlhi3 = 0x002a69 +__ashlsi3 = 0x002bf1 +__ashrdi3 = 0x002da4 +__ashrhi3 = 0x002a88 +__ashrsi3 = 0x002c1b +__bss_bank = 0x000000 +__bss_end = 0x00a0bc +__bss_lo16 = 0x00a000 +__bss_seg0_bank = 0x000000 +__bss_seg0_lo16 = 0x00a000 +__bss_seg0_size = 0x0000bc +__bss_seg1_bank = 0x000000 +__bss_seg1_lo16 = 0x000000 +__bss_seg1_size = 0x000000 +__bss_seg2_bank = 0x000000 +__bss_seg2_lo16 = 0x000000 +__bss_seg2_size = 0x000000 +__bss_seg3_bank = 0x000000 +__bss_seg3_lo16 = 0x000000 +__bss_seg3_size = 0x000000 +__bss_size = 0x0000bc +__bss_start = 0x00a000 +__cmpdi2 = 0x002e4e +__divdi3 = 0x002ef4 +__divhi3 = 0x002ab3 +__divmod_setup = 0x002ae7 +__divmoddi4_stash = 0x002d34 +__divmodsi_setup = 0x002ce3 +__divsi3 = 0x002c95 +__heap_end = 0x00bf00 +__heap_start = 0x00a0bc +__indirTarget = 0x00a0ba +__init_array_end = 0x003409 +__init_array_start = 0x003409 +__jsl_indir = 0x0029f0 +__lshrdi3 = 0x002d81 +__lshrhi3 = 0x002a78 +__lshrsi3 = 0x002c06 +__moddi3 = 0x002f13 +__modhi3 = 0x002acd +__modsi3 = 0x002cbc +__muldi3 = 0x002dca +__mulhi3 = 0x0029f3 +__mulsi3 = 0x002b38 +__negdi_a = 0x002f50 +__negdi_b = 0x002f6e +__retdi = 0x002d51 +__rodata_end = 0x003409 +__rodata_start = 0x0033dc +__start = 0x001000 +__text_end = 0x0033dc +__text_start = 0x001000 +__ucmpdi2 = 0x002e25 +__udivdi3 = 0x002e85 +__udivhi3 = 0x002a9b +__udivmod_core = 0x002b1a +__udivmoddi_core = 0x002ea7 +__udivmodsi_core = 0x002c35 +__udivsi3 = 0x002c6d +__umoddi3 = 0x002e8e +__umodhi3 = 0x002aa7 +__umodsi3 = 0x002c81 +__umulhisi3 = 0x002a12 +__umulhisi3_qsq = 0x002fde +gBoard = 0x00a04e +gChainPath = 0x0033dc +gDpBase = 0x00a0b8 +gDpHandle = 0x00a0b4 +gTitle = 0x0033f0 +gUserId = 0x00a0b2 +gWp = 0x00a000 +longjmp = 0x002fb4 +main = 0x0010ba +makeMove = 0x0022c4 +memset = 0x002474 +pickAiMove = 0x001af5 +setjmp = 0x002f8c +startdesk = 0x002639 diff --git a/demos/reversi.o b/demos/reversi.o new file mode 100644 index 0000000000000000000000000000000000000000..09bacf00c2033d9cdb6618c5844fb10629b690be GIT binary patch literal 9516 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 F^FJNS089V? literal 0 HcmV?d00001 diff --git a/demos/test.sh b/demos/test.sh new file mode 100755 index 0000000..4359e79 --- /dev/null +++ b/demos/test.sh @@ -0,0 +1,108 @@ +#!/usr/bin/env bash +# test.sh - headless test of a demo OMF. Boots MAME, drives the +# Finder to launch the demo, waits for the demo to reach its event +# loop, injects a keystroke to wake it, then reads back the +# trailing marker at $00:0070 to confirm the demo ran to completion. +# +# Usage: bash demos/test.sh +# +# Expected outcome: $0070 reads back as $99. + +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +[ $# -ge 1 ] || { echo "usage: $0 " >&2; exit 2; } +BASE="$1" +SRC="$SCRIPT_DIR/$BASE.c" +OMF="$SCRIPT_DIR/$BASE.omf" + +if [ ! -f "$OMF" ] || [ "$SRC" -nt "$OMF" ]; then + bash "$SCRIPT_DIR/build.sh" "$BASE" >/dev/null +fi + +CADIUS=${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius} +SYSDISK=${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po} + +[ -x "$CADIUS" ] || { echo "cadius not found: $CADIUS" >&2; exit 2; } +[ -f "$SYSDISK" ] || { echo "sysdisk not found: $SYSDISK" >&2; exit 2; } +command -v mame >/dev/null || { echo "mame not in PATH" >&2; exit 2; } + +WORK=$(mktemp -d -t demotest.XXXXXX) +trap 'rm -rf "$WORK"' EXIT + +cp "$SYSDISK" "$WORK/disk.po" +"$CADIUS" CREATEVOLUME "$WORK/data.po" DATA 800KB >/dev/null +cp "$OMF" "$WORK/HELLO#B30000" +"$CADIUS" ADDFILE "$WORK/data.po" /DATA "$WORK/HELLO#B30000" >/dev/null + +# Same Finder-navigation timeline as runViaFinder.sh, plus a key +# injection at frame 6000 (well after the demo has launched and is +# waiting in its event loop), and a memory check at frame 8000. +cat > "$WORK/launch.lua" <<'LUA' +local cpu = manager.machine.devices[":maincpu"] +local mem = cpu.spaces["program"] +local nat = manager.machine.natkeyboard +local frame = 0 +local idx = 1 + +local function get_field(port, name) + local p = manager.machine.ioport.ports[port] + if p == nil then return nil end + return p.fields[name] +end +local key_cmd = get_field(":macadb:KEY3", "Command / Open Apple") +local function press(f) if f then f:set_value(1) end end +local function release(f) if f then f:set_value(0) end end + +local steps = { + {3300, function() nat:post("D") end}, + {3540, function() press(key_cmd) end}, + {3546, function() nat:post("o") end}, + {3600, function() release(key_cmd) end}, + {4200, function() nat:post("H") end}, + {4500, function() press(key_cmd) end}, + {4506, function() nat:post("o") end}, + {4560, function() release(key_cmd) end}, + {7000, function() nat:post(" ") end}, -- wake the demo's event loop + {7500, function() nat:post(" ") end}, -- send a few in case GetNextEvent runs in between + {8000, function() nat:post(" ") end}, + {9000, function() + print(string.format("MAME-READ 0x70=%02x", mem:read_u8(0x70))) + for a = 0x60, 0x7F do + local v = mem:read_u8(a) + if v ~= 0 and a ~= 0x70 then + print(string.format("MAME-READ 0x%02x=%02x", a, v)) + end + end + for a = 0x0F80, 0x0F9F do + local v = mem:read_u8(a) + if v ~= 0 then + print(string.format("MAME-READ 0x%04x=%02x", a, v)) + end + end + manager.machine:exit() + end}, +} +emu.register_frame_done(function() + frame = frame + 1 + while idx <= #steps and frame >= steps[idx][1] do + steps[idx][2]() + idx = idx + 1 + end +end) +LUA + +OUT=$(timeout 200 mame apple2gs -rompath "$PROJECT_ROOT/tools/mame/roms" \ + -window -nothrottle -sound none \ + -seconds_to_run 180 -flop3 "$WORK/disk.po" -flop4 "$WORK/data.po" \ + -autoboot_script "$WORK/launch.lua" &1) + +echo "$OUT" | grep "MAME-READ" || true +VAL=$(echo "$OUT" | grep "MAME-READ 0x70=" | tail -1 | sed 's/.*=//') +if [ "$VAL" = "99" ]; then + echo "PASS: $BASE reached end (\$70 = 0x99)" + exit 0 +fi +echo "FAIL: $BASE marker at \$70 = 0x$VAL (want 0x99)" +exit 1 diff --git a/docs/USAGE.md b/docs/USAGE.md index 0322b60..0318547 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -148,26 +148,164 @@ servers/CI runners. ### The bank-switch idiom -Bank 0 (`$00:0000-$00:FFFF`) has the I/O window at `$C000-$CFFF` -that interferes with normal data access. The convention is to -switch the data bank register (DBR) to bank 2 (`$02:0000`) before -doing any data work: +#### Background — why this is necessary + +The 65816 has two registers that select which bank a memory access +goes to: + +- **PBR** (Program Bank Register) — selects the bank for instruction + fetches. Set by `jsl long_addr` and `rtl`. +- **DBR** (Data Bank Register) — selects the bank for data accesses + like `lda $5000`, `sta $5000`, etc. + +When the IIgs boots, DBR defaults to `$00`. Bank `$00` (the same +bank as the language card / IIe-compatibility area) contains the +**I/O window at `$C000-$CFFF`**. Any data access to addresses in +that range goes to the soft-switches and slot ROMs, NOT to RAM. +This is the same I/O hole the Apple IIe has, inherited by the IIgs +for backward compatibility. + +Concretely: if your DBR is `$00` and you write to address `$C100`, +you're poking the slot-1 ROM enable register — definitely not what +you want. Similarly, `$5000` in bank 0 is the language card area +and may or may not be RAM depending on soft-switch state. + +Banks `$01`-`$DF` are full 64K RAM banks (`$E0`/`$E1` are aux/main +shadow, `$E0`-`$FF` reserved). To do reliable data work, switch +the DBR to any of these "normal" banks. **`$02`** is conventional +in this codebase because: + +1. `$01:0000-$01:FFFF` overlaps the stack page (`$0100-$01FF` in + any bank ends up in the same physical RAM as bank `$00`'s + stack page — confusing). +2. `$02:0000-$02:FFFF` is the first "clean" bank above the + special-purpose banks. +3. The smoke-test convention is to write a result word to + `$02:5000` so `runInMame.sh` can read it back. + +If your program needs more than 64 KB of data, switch DBR to +different banks as needed. + +#### What the assembly does, line by line ```c __attribute__((noinline)) void switchToBank2(void) { __asm__ volatile ( - "sep #0x20\n" // 8-bit accumulator - ".byte 0xa9,0x02\n" // lda #2 (force as bytes — llvm-mc bug) - "pha\n" - "plb\n" // DBR = 2 - "rep #0x20\n" // back to 16-bit + "sep #0x20\n" // (1) Switch A to 8-bit + ".byte 0xa9,0x02\n" // (2) lda #2 (8-bit immediate) + "pha\n" // (3) Push A onto stack (1 byte) + "plb\n" // (4) Pop into DBR (1 byte from stack) + "rep #0x20\n" // (5) Restore A to 16-bit ); } ``` -After `switchToBank2()`, your data lives at `$02:0000` upward. -The `runInMame.sh` `--check 0x025000=...` address is `$02:5000` -— accessible via a normal store in bank 2. +1. **`sep #0x20`** — sets the `M` bit in the status register `P`. + `M=1` makes A behave as 8-bit (and immediate operands become + 1 byte). We need this so the next `lda #2` pushes 1 byte + (matching what `plb` expects to pop). Calling-convention + prologues always run in M=0 (16-bit), so this `sep` is + required. + +2. **`.byte 0xa9,0x02`** — raw bytes for `lda #$02`. We hand-encode + because llvm-mc can't yet emit an 8-bit immediate `lda #$02` + that knows it's 1 byte; the assembler keeps treating it as + 16-bit. `0xa9` is the LDA-immediate opcode; `0x02` is the + 1-byte operand. Result: A = `$02` (8-bit). + +3. **`pha`** — pushes A. In M=1 mode, PHA pushes exactly 1 byte + (the low half of A). Stack now has `$02` on top. + +4. **`plb`** — pops 1 byte from the stack and stores it in DBR. + DBR is now `$02`. All subsequent data accesses go to bank 2. + +5. **`rep #0x20`** — clears the `M` bit. A returns to 16-bit mode, + matching the calling-convention contract for the rest of the + function. + +The DBR change persists across function returns. Once +`switchToBank2()` returns, all data reads/writes in your program +target bank 2 — until you switch DBR again. + +#### When you need it + +You need to switch DBR whenever you want to access data at an +absolute address `$XXXX` and need it to land in a specific bank. +Common cases: + +- **MMIO from the test harness** — `*(volatile uint16 *)0x5000 = x;` + Without DBR=2, this would go to bank 0's `$5000` (which is in + the language card area). With DBR=2, it goes to `$02:5000` + where `runInMame.sh --check 0x025000=...` reads from. +- **Anything in `$C000-$CFFF`** — bank 0 has soft-switches here. + Bank 2 has plain RAM. +- **Global arrays declared at link-time at fixed addresses** — + the linker may place them in bank 2 BSS (`--bss-base 0x020000`). + Your DBR must match. + +You DON'T need DBR=2 for: + +- **Local variables on the stack** — the stack is always + bank-relative-to-DBR-ignored; `lda $4,s` reads from the stack + page regardless of DBR. +- **Direct-page accesses** — `lda $D0` reads from `$00:00D0` + (always bank 0). DP is anchored to bank 0. +- **Indirect-long pointers via `[dp],y`** — these include their + own bank byte and ignore DBR. +- **Function calls** — `jsl` uses PBR + a long destination + address. PBR is updated automatically. + +#### Other ways to access non-bank-0 data + +If you only need to write to a single non-bank-0 address, you can +emit the store as `STA_Long` (24-bit absolute) which encodes the +bank inline: + +```c +*(volatile unsigned short *)0x025000 = 42; // becomes sta $025000 +``` + +The W65816 backend recognizes `const-int pointer + integer offset` +and lowers to `sta long` if the address has a bank byte. No +`switchToBank2()` needed. + +For frequent data work in a bank, switching DBR once and using +plain `sta $5000` (2 bytes) is smaller and faster than `sta $025000` +(4 bytes) per access. + +#### Caveats + +- **Save/restore is your problem.** `switchToBank2()` never + restores DBR. If your caller expected DBR=0, you've broken its + expectation. For long-running programs, that's usually fine + (you just set DBR=2 once and stay there). For toolbox calls, GS/OS + might assume DBR=0 — check the call's documentation. +- **The stack is in bank 0 regardless.** Don't try to put the + stack elsewhere; the 65816's stack-relative addressing modes + ignore DBR. +- **In M=1 mode, INTERRUPTS may behave differently.** The `sep` + affects A's width but not the bank-switching machinery itself. + Keep the sep/rep window short. +- **PBR vs DBR** are independent. Code execution stays where it + was; only data accesses change. + +#### How `runInMame.sh --check 0x025000=...` works + +The check address `0x025000` is a 24-bit address: bank `$02`, +offset `$5000`. The MAME Lua runner reads this byte (and the next +byte if you specify a 2-byte value) directly from physical RAM, +bypassing DBR entirely. So the convention is: + +1. Your program switches DBR to bank 2. +2. Your program writes its result to `*(volatile X *)0x5000`, + which becomes `sta $5000` — landing in bank 2 because of DBR. +3. MAME reads bank 2's `$5000` via the absolute 24-bit address. +4. The runner compares to your expected value. + +If you forget `switchToBank2()`, your store goes to the language +card area (bank 0's `$5000`), MAME's check reads bank 2's +unchanged `$5000` (likely `$00` or whatever was there), and the +test fails. ## Examples diff --git a/runtime/build.sh b/runtime/build.sh index 6b8c870..b87d62d 100755 --- a/runtime/build.sh +++ b/runtime/build.sh @@ -52,7 +52,9 @@ cc "$SRC/math.c" cc "$SRC/softFloat.c" cc "$SRC/libcxxabi.c" cc "$SRC/libcxxabiSjlj.c" +cc "$SRC/desktop.c" asm "$SRC/iigsGsos.s" +asm "$SRC/iigsToolbox.s" # softDouble.c builds at -O2. dpack stays noinline (basic regalloc # overflows when dpack inlines into __adddf3/__muldf3). dclass MUST # stay inline (its pointer-arg writes from a noinline boundary would diff --git a/runtime/include/iigs/desktop.h b/runtime/include/iigs/desktop.h new file mode 100644 index 0000000..7ff0f47 --- /dev/null +++ b/runtime/include/iigs/desktop.h @@ -0,0 +1,56 @@ +// iigs/desktop.h - Full Window Manager desktop startup helper. +// +// Equivalent to ORCA-C's `startdesk` library function: brings up the +// stack of toolsets needed to open titled windows, draw menus, +// dispatch events, etc. Use this before `NewWindow` for any titled- +// window application. See demos/orcaFrame.c for a minimal usage +// example. +// +// On success, `desktopUserId()` returns the Memory Manager userID +// assigned to this application. Pass it to other toolsets that need +// a userID (e.g. ID arg to `DisposeAll`). +// +// startdesk() takes a screen-width hint: +// 320 - SHR 320 mode (16 colors) +// 640 - SHR 640 mode (4 colors) +// This is passed to QDStartUp's masterSCB and to EMStartUp's +// xMax/yMax. Other dimensions are derived. + +#ifndef IIGS_DESKTOP_H +#define IIGS_DESKTOP_H + +#ifdef __cplusplus +extern "C" { +#endif + +// Returns the user-ID assigned by MMStartUp. Pass to enddesk(). +unsigned short startdesk(unsigned short screenWidth); + +// Tears down the desktop environment in reverse-startup order. +void enddesk(unsigned short userId); + +// Read-only accessor — same value startdesk() returned. +unsigned short desktopUserId(void); + +// Read-only accessor — base of the per-toolset 0x700-byte DP block +// startdesk() allocated. Slot $300 (256 bytes) is reserved for the +// Menu Manager: pass `desktopDpBase() + 0x300` to MenuStartUp. +unsigned short desktopDpBase(void); + +// Paint a clean Finder-style backdrop directly into SHR: white menu +// bar (rows 0..12), 1-pixel black separator (row 13), white desktop +// (rows 14..199). Bypasses the WM's dithered desktop fill (which +// MAME's NTSC chroma simulator renders as colored noise). Call +// AFTER startdesk() and BEFORE NewWindow. +void paintDesktopBackdrop(void); + +// Paint menu bar titles via QD's DrawString. Each entry is a +// pascal-string pointer (byte length + chars). Use as a manual +// substitute for DrawMenuBar(), which hangs in our environment. +void paintMenuBarTitles(const unsigned char *const *pascalTitles, unsigned short count); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/runtime/src/crt0.s b/runtime/src/crt0.s index 3184d5b..64bad95 100644 --- a/runtime/src/crt0.s +++ b/runtime/src/crt0.s @@ -71,6 +71,8 @@ __start: phk pla ; A's low byte = current PBR sta 0xbe ; persistent data bank + stz 0xbf ; pad: `lda 0xbe` in 16-bit M loads $00PBR + ; — used by codegen for &symbol bank halves rep #0x20 ; Zero BSS. Up to 4 segments — linker emits __bss_seg{0..3}_lo16 @@ -202,6 +204,23 @@ __start: ; sequence in a controlled context. time()/clock() check an ; in-process flag and return 0 if init hasn't been done. + ; Set DBR to the BSS bank before calling main. Without this, the + ; user has to manually switch the data bank register (with a + ; `pha;plb` inline-asm idiom) before doing absolute data + ; accesses. Calypsi's "small data model" assumes DBR is + ; pre-set; we now follow the same convention. + ; + ; Linker emits __bss_seg0_bank as the bank byte of the first + ; BSS segment (typically 2 with the default --bss-base 0x020000). + ; Programs that need bank-0 access (e.g., for $C0xx soft + ; switches) can use STA_Long or temporarily switch DBR back. + sep #0x20 + .byte 0xA9 ; lda #imm8 (1 byte) — llvm-mc can't + .byte __bss_seg0_bank ; reliably encode this with a symbol; + pha ; spell it out to keep the bytes right. + plb + rep #0x20 + ; Call main. Standard W65816 ABI: i16 first arg in A; we pass ; nothing. After return, A holds the exit code. jsl main diff --git a/runtime/src/crt0Gsos.s b/runtime/src/crt0Gsos.s index 37fee0f..9fa865c 100644 --- a/runtime/src/crt0Gsos.s +++ b/runtime/src/crt0Gsos.s @@ -33,6 +33,18 @@ __start: ; wrong bank without this. PHK + PLB copies PBR into DBR. phk plb + ; Diagnostic: stash a marker at $00:007F via `sta long` (bank- + ; explicit, immune to DBR uncertainty) immediately on entry. + ; Runtime probes use this to detect whether the Loader actually + ; reached our code or silently rejected the OMF earlier. + ; The assembler doesn't track SEP/REP state, so the LDA #imm + ; needs explicit `.byte` form: the standard `lda #$7F` would + ; assemble as 3 bytes (16-bit imm) and the trailing $00 would + ; execute as BRK at runtime once M=8. + sep #0x20 + .byte 0xa9, 0x7f ; lda #$7F (8-bit imm) + .byte 0x8f, 0x7f, 0x00, 0x00 ; sta long $00:007F + rep #0x20 ; Set DP=0. The C compiler assumes DP=0 for all `sta dp` and ; `[dp],y`-style accesses; GS/OS hands us a Memory-Manager- @@ -51,6 +63,18 @@ __start: phk pla sta 0xbe + stz 0xbf ; pad byte so `lda 0xbe` in 16-bit M reads $00PBR + ; (codegen uses this as the bank-half of `&symbol` + ; 32-bit pointers — see W65816AsmPrinter + ; LDAi16imm_bank expansion) + rep #0x20 + + ; --- Diagnostic markers between crt0 phases. Bank-explicit + ; `sta long` to $00:007E so they're visible from a host probe + ; regardless of DBR/PBR. + sep #0x20 + .byte 0xa9, 0x7e ; lda #$7E + .byte 0x8f, 0x7e, 0x00, 0x00 ; sta long $00:007E (post-DP) rep #0x20 ; BSS zero-init. With DBR=our bank, `stz abs,X` writes to @@ -67,6 +91,10 @@ __start: inx bra .Lbss_loop .Lbss_done: + sep #0x20 + .byte 0xa9, 0x7d ; lda #$7D + .byte 0x8f, 0x7d, 0x00, 0x00 ; sta long $00:007D (post-BSS) + rep #0x20 ; Walk .init_array (C++ ctors). ; @@ -99,6 +127,12 @@ __start: bra .Linit_loop .Linit_done: + ; Marker: about to JSL main. + sep #0x20 + .byte 0xa9, 0x7c ; lda #$7C + .byte 0x8f, 0x7c, 0x00, 0x00 ; sta long $00:007C (about to call main) + rep #0x20 + ; Call main. Standard W65816 C ABI: arg0 in A; we pass none. rep #0x30 jsl main diff --git a/runtime/src/desktop.c b/runtime/src/desktop.c new file mode 100644 index 0000000..a3c67cb --- /dev/null +++ b/runtime/src/desktop.c @@ -0,0 +1,168 @@ +// desktop.c - startdesk()/enddesk() — ORCA-C-style minimal desktop init. +// +// Brings up the toolset chain a full desktop app needs: +// Memory + DP allocation, MiscTools, QD, EM, Scheduler, Sound, ADB, +// SANE, IntMath, Text, Window, Font, Control, LineEdit, Dialog, +// Scrap. Menu Manager startup is omitted — MenuStartUp hangs in +// the current environment (likely a tool-init-order dependency we +// haven't pinned down). Demos that need a visible menu bar paint +// it manually into SHR rows 0..12. +// +// Palette: all 16 palettes set to (black, white, black, white). In +// 640 mode that maps to clean Finder-style B/W instead of NTSC chroma +// noise for the dithered patterns the WM uses. + +#include "iigs/desktop.h" +#include "iigs/toolbox.h" + +static unsigned short gUserId = 0; +static void *gDpHandle = (void *)0; +static unsigned short gDpBase = 0; + + +static unsigned short blockAddrLo(void *handle) { + return (unsigned short)(unsigned long)*(void **)handle; +} + + +unsigned short startdesk(unsigned short screenWidth) { + gUserId = MMStartUp(); + // QD needs 512 bytes ($200) — its own DP at +$000 plus the cursor + // manager's DP at +$100 (InitCursor does `tdc; clc; adc #$100; + // tcd` to find its globals). ROM Source Code/Bank FE/cursor.asm + // confirms cursor uses QD's DP+$100. Layout below allocates 0x800 + // total so QD/Cursor have $000..$1FF, then EM/FM/Menu/Ctl/LE/Dlg + // each get $100. + // $000 QD | $100 Cursor | $200 EM | $300 FM | $400 Menu | + // $500 Ctl | $600 LE | $700 Dialog. + gDpHandle = NewHandle(0x800UL, gUserId, 0xC015, (void *)0); + unsigned short dp = blockAddrLo(gDpHandle); + gDpBase = dp; + + MTStartUp(); + unsigned short masterSCB = (screenWidth == 640) ? 0x90 : 0x10; + QDStartUp(dp, masterSCB, screenWidth, gUserId); + EMStartUp((unsigned short)(dp + 0x200), 20, 0, 0, + (short)(screenWidth - 1), 199, gUserId); + SchStartUp(); + SoundStartUp(gUserId); + ADBStartUp(); + SANEStartUp(gUserId); + IMStartUp(); + TextStartUp(); + LoadOneTool(0x0E, 0x0301); + WindStartUp(gUserId); + LoadOneTool(0x1B, 0x0301); + FMStartUp(gUserId, (unsigned short)(dp + 0x300)); + LoadOneTool(0x10, 0x0301); + CtlStartUp(gUserId, (unsigned short)(dp + 0x500)); + LoadOneTool(0x14, 0x0301); + LEStartUp(gUserId, (unsigned short)(dp + 0x600)); + LoadOneTool(0x15, 0x0301); + DialogStartUp(gUserId); + LoadOneTool(0x16, 0x0301); + ScrapStartUp(); + + // InitCursor allocates the cursor save buffer (1024-byte handle + // stored at cursor mgr DP $B4). Without it, the FIRST QD call + // that internally triggers cursor shield/unshield hangs in ROM's + // iUndrawCursor walking through a NULL pointer. This was the + // *real* cause of the "DrawMenuBar hang" investigation — + // DrawMenuBar's _FillRect call shields the cursor, and iUndraw + // loops forever copying garbage from $00:0000+Y into SHR. + // Confirmed via ROM Source Code/Bank FE/cursor.asm — see PC + // $FE:551E during hang matched iUndrawCursor:FinishLoop. + InitCursor(); + + LoadOneTool(0x0F, 0x0301); + MenuStartUp(gUserId, (unsigned short)(dp + 0x400)); + + // Force all 16 palettes to a Finder-style B/W spread that works + // in 640 mode. 640 mode rotates through palette quadrants + // (8..11, 12..15, 0..3, 4..7) across pixel positions, so SetForeColor(1) + // only renders solid white if pal[1] == pal[5] == pal[9] == pal[13]. + // Even (0,2,4,6,8,10,12,14) → black, odd (1,3,5,7,9,11,13,15) → white. + for (unsigned short p = 0; p < 16; p++) { + volatile unsigned short *pal = + (volatile unsigned short *)(0xE19E00UL + (unsigned long)p * 32UL); + for (unsigned short k = 0; k < 16; k++) { + pal[k] = (k & 1) ? 0x0FFF : 0x0000; + } + } + + return gUserId; +} + + +// Paint menu bar text via QD's DrawString. Each title is a +// pascal-counted string (length-prefixed); titles are placed +// left-to-right at y=10, starting at x=4 with kSpacing between +// titles. Use this in place of DrawMenuBar() (which hangs in our +// current toolset env). Caller is responsible for filling the bar +// background first (paintDesktopBackdrop does this). +void paintMenuBarTitles(const unsigned char *const *pascalTitles, unsigned short count) { + SetForeColor(0); + SetBackColor(15); + unsigned short x = 4; + for (unsigned short i = 0; i < count; i++) { + MoveTo((short)x, 10); + const unsigned char *s = pascalTitles[i]; + DrawString((void *)s); + x = (unsigned short)(x + (unsigned short)s[0] * 8U + 16U); + } +} + + +// Paint a Finder-style backdrop directly into SHR: white menu bar +// (rows 0..12), 1-pixel black separator (row 13), white desktop +// (rows 14..199). Bypasses the WM's dithered desktop fill that +// MAME's NTSC chroma simulator renders as colored noise. Useful +// for ORCA-style demos that want the WM's chrome without the +// chroma fringing. +void paintDesktopBackdrop(void) { + __asm__ volatile ( + "rep #0x30\n" + "ldx #0x0000\n" + "1:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x20, 0x08\n" + "bcc 1b\n" + "2:\n" + ".byte 0xa9, 0x00, 0x00\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0xc0, 0x08\n" + "bcc 2b\n" + "3:\n" + ".byte 0xa9, 0xff, 0xff\n" + ".byte 0x9f, 0x00, 0x20, 0xe1\n" + "inx\n inx\n" + ".byte 0xe0, 0x00, 0x7d\n" + "bcc 3b\n" + ::: "a", "x", "memory"); +} + + +void enddesk(unsigned short userId) { + WindShutDown(); + FMShutDown(); + TextShutDown(); + ADBShutDown(); + SchShutDown(); + EMShutDown(); + QDShutDown(); + DisposeHandle(gDpHandle); + MMShutDown(userId); +} + + +unsigned short desktopUserId(void) { + return gUserId; +} + + +unsigned short desktopDpBase(void) { + return gDpBase; +} diff --git a/runtime/src/iigsGsos.s b/runtime/src/iigsGsos.s index 14009cb..d5fd803 100644 --- a/runtime/src/iigsGsos.s +++ b/runtime/src/iigsGsos.s @@ -1,5 +1,12 @@ ; iigsGsos.s — GS/OS class-1 dispatch wrappers. ; +; PUSH ORDER MATTERS. Earlier versions used PHA-then-PEA-0, which put +; the bank byte at offset position in the stack layout - broken under +; real GS/OS 6.0.2 (observed as a JSL $E100A8 hang). The correct order +; matches ORCA-C's PushLong macro: PEA high FIRST, then PHA low. After +; PEA 0 + PHA, the 4 bytes at (S+1..S+4) are (off_lo, off_hi, bank, pad) +; in little-endian order, which is what the dispatcher reads as a LONG. +; ; Each wrapper takes a 16-bit pointer to a class-1 parm block in A ; (the C ABI). The GS/OS convention is: ; PHA / PEA 0 ; push 32-bit parm-block pointer @@ -36,8 +43,8 @@ .globl gsosGetMark gsosOpen: - pha pea 0 + pha ldx #0x2010 jsl 0xe100a8 sta 0xe4 ; stash status (A) in DP scratch @@ -49,8 +56,8 @@ gsosOpen: rtl gsosRead: - pha pea 0 + pha ldx #0x2012 jsl 0xe100a8 sta 0xe4 @@ -62,8 +69,8 @@ gsosRead: rtl gsosWrite: - pha pea 0 + pha ldx #0x2013 jsl 0xe100a8 sta 0xe4 @@ -75,8 +82,8 @@ gsosWrite: rtl gsosClose: - pha pea 0 + pha ldx #0x2014 jsl 0xe100a8 sta 0xe4 @@ -88,8 +95,8 @@ gsosClose: rtl gsosGetEOF: - pha pea 0 + pha ldx #0x2019 jsl 0xe100a8 sta 0xe4 @@ -101,8 +108,8 @@ gsosGetEOF: rtl gsosSetEOF: - pha pea 0 + pha ldx #0x2018 jsl 0xe100a8 sta 0xe4 @@ -114,8 +121,8 @@ gsosSetEOF: rtl gsosSetMark: - pha pea 0 + pha ldx #0x2016 jsl 0xe100a8 sta 0xe4 @@ -127,8 +134,8 @@ gsosSetMark: rtl gsosGetMark: - pha pea 0 + pha ldx #0x2017 jsl 0xe100a8 sta 0xe4 diff --git a/runtime/src/iigsGsosStub.s b/runtime/src/iigsGsosStub.s index 44ca05c..5e7aa80 100644 --- a/runtime/src/iigsGsosStub.s +++ b/runtime/src/iigsGsosStub.s @@ -1,11 +1,14 @@ ; Minimal GS/OS dispatcher stub at $E100A8. Native, M=0, X=0. -; Stack at entry: S+1=PCL, S+2=PCH, S+3=PBR, S+4..5=bank (=0), -; S+9=parm ptr low 16, S+10=high. We only use the low 16 (bank-0 -; parm blocks). Writes $42 to *parm and returns A=0. +; Stack at entry (after caller's PEA 0 + PHA + JSL): +; S+1=PCL, S+2=PCH, S+3=PBR, S+4=ptr_lo, S+5=ptr_hi, +; S+6=bank (=0), S+7=pad (=0). +; After our PHP + PHA: parm pointer is at (S+7, S+8); bank at (S+9). +; We only use the low 16 (bank-0 parm blocks). Writes $42 to *parm +; and returns A=0. .text php ; save P pha ; save A (16-bit) - lda 9, s ; A = parm ptr 16 + lda 7, s ; A = parm ptr offset (16-bit) sta 0xe4 ; DP $E4..$E5 ldy #0 ; X=0 here, so 3-byte encoding sep #0x20 ; M=8 for the 1-byte store diff --git a/runtime/src/iigsToolbox.s b/runtime/src/iigsToolbox.s index 389246b..b018767 100644 --- a/runtime/src/iigsToolbox.s +++ b/runtime/src/iigsToolbox.s @@ -14,6 +14,7 @@ ; ACEInfo(Word) -> LongWord ; tool 0x071D, set 0x1D (ACETools) + .section .text.ACEInfo,"ax" .globl ACEInfo ACEInfo: ; --- stash arg0 (in A) --- @@ -32,28 +33,29 @@ ACEInfo: ; ACECompress(Handle, Long, Handle, Long, Word, Word) -> void ; tool 0x091D, set 0x1D (ACETools) + .section .text.ACECompress,"ax" .globl ACECompress ACECompress: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Long, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -69,28 +71,29 @@ ACECompress: ; ACEExpand(Handle, Long, Handle, Long, Word, Word) -> void ; tool 0x0A1D, set 0x1D (ACETools) + .section .text.ACEExpand,"ax" .globl ACEExpand ACEExpand: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Long, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -106,48 +109,51 @@ ACEExpand: ; GetACEExpState(Ptr) -> void ; tool 0x0D1D, set 0x1D (ACETools) + .section .text.GetACEExpState,"ax" .globl GetACEExpState GetACEExpState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0D1D jsl 0xe10000 rtl ; SetACEExpState(Ptr) -> void ; tool 0x0E1D, set 0x1D (ACETools) + .section .text.SetACEExpState,"ax" .globl SetACEExpState SetACEExpState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E1D jsl 0xe10000 rtl ; AsyncADBReceive(Pointer, Word) -> void ; tool 0x0D09, set 0x09 (AppleDeskBus) + .section .text.AsyncADBReceive,"ax" .globl AsyncADBReceive AsyncADBReceive: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -157,22 +163,24 @@ AsyncADBReceive: ; GetAbsScale(ScaleRecPtr) -> void ; tool 0x1309, set 0x09 (AppleDeskBus) + .section .text.GetAbsScale,"ax" .globl GetAbsScale GetAbsScale: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1309 jsl 0xe10000 rtl ; ReadKeyMicroData(Word, Pointer, Word) -> void ; tool 0x0A09, set 0x09 (AppleDeskBus) + .section .text.ReadKeyMicroData,"ax" .globl ReadKeyMicroData ReadKeyMicroData: ; --- stash arg0 (in A) --- @@ -181,7 +189,7 @@ ReadKeyMicroData: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -194,18 +202,19 @@ ReadKeyMicroData: ; ReadKeyMicroMemory(Pointer, Pointer, Word) -> void ; tool 0x0B09, set 0x09 (AppleDeskBus) + .section .text.ReadKeyMicroMemory,"ax" .globl ReadKeyMicroMemory ReadKeyMicroMemory: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -218,6 +227,7 @@ ReadKeyMicroMemory: ; SendInfo(Word, Pointer, Word) -> void ; tool 0x0909, set 0x09 (AppleDeskBus) + .section .text.SendInfo,"ax" .globl SendInfo SendInfo: ; --- stash arg0 (in A) --- @@ -226,7 +236,7 @@ SendInfo: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -239,32 +249,34 @@ SendInfo: ; SetAbsScale(ScaleRecPtr) -> void ; tool 0x1209, set 0x09 (AppleDeskBus) + .section .text.SetAbsScale,"ax" .globl SetAbsScale SetAbsScale: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1209 jsl 0xe10000 rtl ; SRQPoll(Pointer, Word) -> void ; tool 0x1409, set 0x09 (AppleDeskBus) + .section .text.SRQPoll,"ax" .globl SRQPoll SRQPoll: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -274,6 +286,7 @@ SRQPoll: ; SyncADBReceive(Word, Pointer, Word) -> void ; tool 0x0E09, set 0x09 (AppleDeskBus) + .section .text.SyncADBReceive,"ax" .globl SyncADBReceive SyncADBReceive: ; --- stash arg0 (in A) --- @@ -282,7 +295,7 @@ SyncADBReceive: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -295,6 +308,7 @@ SyncADBReceive: ; CtlStartUp(Word, Word) -> void ; tool 0x0210, set 0x10 (ControlManager) + .section .text.CtlStartUp,"ax" .globl CtlStartUp CtlStartUp: ; --- stash arg0 (in A) --- @@ -311,22 +325,24 @@ CtlStartUp: ; DisposeControl(CtlRecHndl) -> void ; tool 0x0A10, set 0x10 (ControlManager) + .section .text.DisposeControl,"ax" .globl DisposeControl DisposeControl: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0A10 jsl 0xe10000 rtl ; DragControl(Integer, Integer, Rect, Rect, Word, CtlRecHndl) -> void ; tool 0x1710, set 0x10 (ControlManager) + .section .text.DragControl,"ax" .globl DragControl DragControl: ; --- stash arg0 (in A) --- @@ -338,12 +354,12 @@ DragControl: lda 6, s pha ; --- arg2 (Rect, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (Rect, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -351,7 +367,7 @@ DragControl: lda 26, s pha ; --- arg5 (CtlRecHndl, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha @@ -361,6 +377,7 @@ DragControl: ; DragRect(VoidProcPtr, Pattern, Integer, Integer, Rect, Rect, Rect, Word) -> Point ; tool 0x1D10, set 0x10 (ControlManager) + .section .text.DragRect,"ax" .globl DragRect DragRect: ; --- stash arg0 (in A/X) --- @@ -370,12 +387,12 @@ DragRect: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pattern, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -386,17 +403,17 @@ DragRect: lda 24, s pha ; --- arg4 (Rect, 4B) --- - lda 28, s + lda 30, s pha lda 30, s pha ; --- arg5 (Rect, 4B) --- - lda 36, s + lda 38, s pha lda 38, s pha ; --- arg6 (Rect, 4B) --- - lda 44, s + lda 46, s pha lda 46, s pha @@ -411,54 +428,58 @@ DragRect: ; DrawControls(GrafPortPtr) -> void ; tool 0x1010, set 0x10 (ControlManager) + .section .text.DrawControls,"ax" .globl DrawControls DrawControls: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1010 jsl 0xe10000 rtl ; DrawOneCtl(CtlRecHndl) -> void ; tool 0x2510, set 0x10 (ControlManager) + .section .text.DrawOneCtl,"ax" .globl DrawOneCtl DrawOneCtl: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2510 jsl 0xe10000 rtl ; EraseControl(CtlRecHndl) -> void ; tool 0x2410, set 0x10 (ControlManager) + .section .text.EraseControl,"ax" .globl EraseControl EraseControl: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2410 jsl 0xe10000 rtl ; FindControl(CtlRecHndl, Integer, Integer, GrafPortPtr) -> Word ; tool 0x1310, set 0x10 (ControlManager) + .section .text.FindControl,"ax" .globl FindControl FindControl: ; --- stash arg0 (in A/X) --- @@ -467,10 +488,10 @@ FindControl: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 10, s pha @@ -478,7 +499,7 @@ FindControl: lda 14, s pha ; --- arg3 (GrafPortPtr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -489,6 +510,7 @@ FindControl: ; GetCtlAction(CtlRecHndl) -> LongProcPtr ; tool 0x2110, set 0x10 (ControlManager) + .section .text.GetCtlAction,"ax" .globl GetCtlAction GetCtlAction: ; --- stash arg0 (in A/X) --- @@ -498,10 +520,10 @@ GetCtlAction: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2110 jsl 0xe10000 pla ; result lo -> A @@ -510,6 +532,7 @@ GetCtlAction: ; GetCtlParams(CtlRecHndl) -> LongWord ; tool 0x1C10, set 0x10 (ControlManager) + .section .text.GetCtlParams,"ax" .globl GetCtlParams GetCtlParams: ; --- stash arg0 (in A/X) --- @@ -519,10 +542,10 @@ GetCtlParams: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1C10 jsl 0xe10000 pla ; result lo -> A @@ -531,6 +554,7 @@ GetCtlParams: ; GetCtlRefCon(CtlRecHndl) -> LongWord ; tool 0x2310, set 0x10 (ControlManager) + .section .text.GetCtlRefCon,"ax" .globl GetCtlRefCon GetCtlRefCon: ; --- stash arg0 (in A/X) --- @@ -540,10 +564,10 @@ GetCtlRefCon: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2310 jsl 0xe10000 pla ; result lo -> A @@ -552,6 +576,7 @@ GetCtlRefCon: ; GetCtlTitle(CtlRecHndl) -> Pointer ; tool 0x0D10, set 0x10 (ControlManager) + .section .text.GetCtlTitle,"ax" .globl GetCtlTitle GetCtlTitle: ; --- stash arg0 (in A/X) --- @@ -561,10 +586,10 @@ GetCtlTitle: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0D10 jsl 0xe10000 pla ; result lo -> A @@ -573,6 +598,7 @@ GetCtlTitle: ; GetCtlValue(CtlRecHndl) -> Word ; tool 0x1A10, set 0x10 (ControlManager) + .section .text.GetCtlValue,"ax" .globl GetCtlValue GetCtlValue: ; --- stash arg0 (in A/X) --- @@ -581,10 +607,10 @@ GetCtlValue: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1A10 jsl 0xe10000 pla ; result -> A @@ -592,6 +618,7 @@ GetCtlValue: ; GrowSize(void) -> LongWord ; tool 0x1E10, set 0x10 (ControlManager) + .section .text.GrowSize,"ax" .globl GrowSize GrowSize: ; --- result space (4 bytes) --- @@ -605,22 +632,24 @@ GrowSize: ; HideControl(CtlRecHndl) -> void ; tool 0x0E10, set 0x10 (ControlManager) + .section .text.HideControl,"ax" .globl HideControl HideControl: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E10 jsl 0xe10000 rtl ; HiliteControl(Word, CtlRecHndl) -> void ; tool 0x1110, set 0x10 (ControlManager) + .section .text.HiliteControl,"ax" .globl HiliteControl HiliteControl: ; --- stash arg0 (in A) --- @@ -629,7 +658,7 @@ HiliteControl: lda 0xE0 pha ; --- arg1 (CtlRecHndl, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -639,22 +668,24 @@ HiliteControl: ; KillControls(GrafPortPtr) -> void ; tool 0x0B10, set 0x10 (ControlManager) + .section .text.KillControls,"ax" .globl KillControls KillControls: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0B10 jsl 0xe10000 rtl ; MoveControl(Integer, Integer, CtlRecHndl) -> void ; tool 0x1610, set 0x10 (ControlManager) + .section .text.MoveControl,"ax" .globl MoveControl MoveControl: ; --- stash arg0 (in A) --- @@ -666,7 +697,7 @@ MoveControl: lda 6, s pha ; --- arg2 (CtlRecHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -676,6 +707,7 @@ MoveControl: ; NewControl(GrafPortPtr, Rect, Pointer, Word, Word, Word, Word, LongProcPtr, Longint, Pointer) -> CtlRecHndl ; tool 0x0910, set 0x10 (ControlManager) + .section .text.NewControl,"ax" .globl NewControl NewControl: ; --- stash arg0 (in A/X) --- @@ -685,17 +717,17 @@ NewControl: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg2 (Pointer, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -712,17 +744,17 @@ NewControl: lda 40, s pha ; --- arg7 (LongProcPtr, 4B) --- - lda 44, s + lda 46, s pha lda 46, s pha ; --- arg8 (Longint, 4B) --- - lda 52, s + lda 54, s pha lda 54, s pha ; --- arg9 (Pointer, 4B) --- - lda 60, s + lda 62, s pha lda 62, s pha @@ -734,18 +766,19 @@ NewControl: ; SetCtlAction(LongProcPtr, CtlRecHndl) -> void ; tool 0x2010, set 0x10 (ControlManager) + .section .text.SetCtlAction,"ax" .globl SetCtlAction SetCtlAction: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (CtlRecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -755,6 +788,7 @@ SetCtlAction: ; SetCtlIcons(FontHndl) -> FontHndl ; tool 0x1810, set 0x10 (ControlManager) + .section .text.SetCtlIcons,"ax" .globl SetCtlIcons SetCtlIcons: ; --- stash arg0 (in A/X) --- @@ -764,10 +798,10 @@ SetCtlIcons: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1810 jsl 0xe10000 pla ; result lo -> A @@ -776,6 +810,7 @@ SetCtlIcons: ; SetCtlParams(Word, Word, CtlRecHndl) -> void ; tool 0x1B10, set 0x10 (ControlManager) + .section .text.SetCtlParams,"ax" .globl SetCtlParams SetCtlParams: ; --- stash arg0 (in A) --- @@ -787,7 +822,7 @@ SetCtlParams: lda 6, s pha ; --- arg2 (CtlRecHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -797,18 +832,19 @@ SetCtlParams: ; SetCtlRefCon(Longint, CtlRecHndl) -> void ; tool 0x2210, set 0x10 (ControlManager) + .section .text.SetCtlRefCon,"ax" .globl SetCtlRefCon SetCtlRefCon: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (CtlRecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -818,18 +854,19 @@ SetCtlRefCon: ; SetCtlTitle(Pointer, Handle) -> void ; tool 0x0C10, set 0x10 (ControlManager) + .section .text.SetCtlTitle,"ax" .globl SetCtlTitle SetCtlTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -839,6 +876,7 @@ SetCtlTitle: ; SetCtlValue(Word, CtlRecHndl) -> void ; tool 0x1910, set 0x10 (ControlManager) + .section .text.SetCtlValue,"ax" .globl SetCtlValue SetCtlValue: ; --- stash arg0 (in A) --- @@ -847,7 +885,7 @@ SetCtlValue: lda 0xE0 pha ; --- arg1 (CtlRecHndl, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -857,22 +895,24 @@ SetCtlValue: ; ShowControl(CtlRecHndl) -> void ; tool 0x0F10, set 0x10 (ControlManager) + .section .text.ShowControl,"ax" .globl ShowControl ShowControl: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F10 jsl 0xe10000 rtl ; TestControl(Integer, Integer, CtlRecHndl) -> Word ; tool 0x1410, set 0x10 (ControlManager) + .section .text.TestControl,"ax" .globl TestControl TestControl: ; --- stash arg0 (in A) --- @@ -886,7 +926,7 @@ TestControl: lda 8, s pha ; --- arg2 (CtlRecHndl, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -897,6 +937,7 @@ TestControl: ; TrackControl(Integer, Integer, LongProcPtr, CtlRecHndl) -> Word ; tool 0x1510, set 0x10 (ControlManager) + .section .text.TrackControl,"ax" .globl TrackControl TrackControl: ; --- stash arg0 (in A) --- @@ -910,12 +951,12 @@ TrackControl: lda 8, s pha ; --- arg2 (LongProcPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg3 (CtlRecHndl, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -926,6 +967,7 @@ TrackControl: ; CallCtlDefProc(CtlRecHndl, Word, Long) -> LongWord ; tool 0x2C10, set 0x10 (ControlManager) + .section .text.CallCtlDefProc,"ax" .globl CallCtlDefProc CallCtlDefProc: ; --- stash arg0 (in A/X) --- @@ -935,15 +977,15 @@ CallCtlDefProc: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha ; --- arg2 (Long, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -955,6 +997,7 @@ CallCtlDefProc: ; CMLoadResource(Word, Long) -> Handle ; tool 0x3210, set 0x10 (ControlManager) + .section .text.CMLoadResource,"ax" .globl CMLoadResource CMLoadResource: ; --- stash arg0 (in A) --- @@ -966,7 +1009,7 @@ CMLoadResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -978,6 +1021,7 @@ CMLoadResource: ; CMReleaseResource(Word, Long) -> void ; tool 0x3310, set 0x10 (ControlManager) + .section .text.CMReleaseResource,"ax" .globl CMReleaseResource CMReleaseResource: ; --- stash arg0 (in A) --- @@ -986,7 +1030,7 @@ CMReleaseResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -996,6 +1040,7 @@ CMReleaseResource: ; FindTargetCtl(void) -> CtlRecHndl ; tool 0x2610, set 0x10 (ControlManager) + .section .text.FindTargetCtl,"ax" .globl FindTargetCtl FindTargetCtl: ; --- result space (4 bytes) --- @@ -1009,6 +1054,7 @@ FindTargetCtl: ; GetCtlHandleFromID(WindowPtr, Long) -> CtlRecHndl ; tool 0x3010, set 0x10 (ControlManager) + .section .text.GetCtlHandleFromID,"ax" .globl GetCtlHandleFromID GetCtlHandleFromID: ; --- stash arg0 (in A/X) --- @@ -1018,12 +1064,12 @@ GetCtlHandleFromID: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -1035,6 +1081,7 @@ GetCtlHandleFromID: ; GetCtlID(CtlRecHndl) -> LongWord ; tool 0x2A10, set 0x10 (ControlManager) + .section .text.GetCtlID,"ax" .globl GetCtlID GetCtlID: ; --- stash arg0 (in A/X) --- @@ -1044,10 +1091,10 @@ GetCtlID: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2A10 jsl 0xe10000 pla ; result lo -> A @@ -1056,6 +1103,7 @@ GetCtlID: ; GetCtlMoreFlags(CtlRecHndl) -> Word ; tool 0x2E10, set 0x10 (ControlManager) + .section .text.GetCtlMoreFlags,"ax" .globl GetCtlMoreFlags GetCtlMoreFlags: ; --- stash arg0 (in A/X) --- @@ -1064,10 +1112,10 @@ GetCtlMoreFlags: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2E10 jsl 0xe10000 pla ; result -> A @@ -1075,6 +1123,7 @@ GetCtlMoreFlags: ; GetCtlParamPtr(void) -> Pointer ; tool 0x3510, set 0x10 (ControlManager) + .section .text.GetCtlParamPtr,"ax" .globl GetCtlParamPtr GetCtlParamPtr: ; --- result space (4 bytes) --- @@ -1088,22 +1137,24 @@ GetCtlParamPtr: ; InvalCtls(WindowPtr) -> void ; tool 0x3710, set 0x10 (ControlManager) + .section .text.InvalCtls,"ax" .globl InvalCtls InvalCtls: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3710 jsl 0xe10000 rtl ; MakeNextCtlTarget(void) -> CtlRecHndl ; tool 0x2710, set 0x10 (ControlManager) + .section .text.MakeNextCtlTarget,"ax" .globl MakeNextCtlTarget MakeNextCtlTarget: ; --- result space (4 bytes) --- @@ -1117,22 +1168,24 @@ MakeNextCtlTarget: ; MakeThisCtlTarget(CtlRecHndl) -> void ; tool 0x2810, set 0x10 (ControlManager) + .section .text.MakeThisCtlTarget,"ax" .globl MakeThisCtlTarget MakeThisCtlTarget: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2810 jsl 0xe10000 rtl ; NewControl2(WindowPtr, Word, Ref) -> CtlRecHndl ; tool 0x3110, set 0x10 (ControlManager) + .section .text.NewControl2,"ax" .globl NewControl2 NewControl2: ; --- stash arg0 (in A/X) --- @@ -1142,15 +1195,15 @@ NewControl2: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha ; --- arg2 (Ref, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -1162,6 +1215,7 @@ NewControl2: ; NotifyControls(Word, Word, Long, WindowPtr) -> void ; tool 0x2D10, set 0x10 (ControlManager) + .section .text.NotifyControls,"ax" .globl NotifyControls NotifyControls: ; --- stash arg0 (in A) --- @@ -1173,12 +1227,12 @@ NotifyControls: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (WindowPtr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -1188,6 +1242,7 @@ NotifyControls: ; NotifyCtls(Word, Word, Long, WindowPtr) -> void ; tool 0x2D10, set 0x10 (ControlManager) + .section .text.NotifyCtls,"ax" .globl NotifyCtls NotifyCtls: ; --- stash arg0 (in A) --- @@ -1199,12 +1254,12 @@ NotifyCtls: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (WindowPtr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -1214,6 +1269,7 @@ NotifyCtls: ; SendEventToCtl(Boolean, WindowPtr, EventRecordPtr) -> Boolean ; tool 0x2910, set 0x10 (ControlManager) + .section .text.SendEventToCtl,"ax" .globl SendEventToCtl SendEventToCtl: ; --- stash arg0 (in A) --- @@ -1224,12 +1280,12 @@ SendEventToCtl: lda 0xE0 pha ; --- arg1 (WindowPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (EventRecordPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -1240,18 +1296,19 @@ SendEventToCtl: ; SetCtlID(Long, CtlRecHndl) -> void ; tool 0x2B10, set 0x10 (ControlManager) + .section .text.SetCtlID,"ax" .globl SetCtlID SetCtlID: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (CtlRecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -1261,6 +1318,7 @@ SetCtlID: ; SetCtlMoreFlags(Word, CtlRecHndl) -> void ; tool 0x2F10, set 0x10 (ControlManager) + .section .text.SetCtlMoreFlags,"ax" .globl SetCtlMoreFlags SetCtlMoreFlags: ; --- stash arg0 (in A) --- @@ -1269,7 +1327,7 @@ SetCtlMoreFlags: lda 0xE0 pha ; --- arg1 (CtlRecHndl, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -1279,22 +1337,24 @@ SetCtlMoreFlags: ; SetCtlParamPtr(Pointer) -> void ; tool 0x3410, set 0x10 (ControlManager) + .section .text.SetCtlParamPtr,"ax" .globl SetCtlParamPtr SetCtlParamPtr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3410 jsl 0xe10000 rtl ; FindRadioButton(WindowPtr, Word) -> Word ; tool 0x3910, set 0x10 (ControlManager) + .section .text.FindRadioButton,"ax" .globl FindRadioButton FindRadioButton: ; --- stash arg0 (in A/X) --- @@ -1303,10 +1363,10 @@ FindRadioButton: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -1317,23 +1377,24 @@ FindRadioButton: ; GetLETextByID(WindowPtr, Long, StringPtr) -> void ; tool 0x3B10, set 0x10 (ControlManager) + .section .text.GetLETextByID,"ax" .globl GetLETextByID GetLETextByID: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (StringPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -1343,23 +1404,24 @@ GetLETextByID: ; SetLETextByID(WindowPtr, Long, StringPtr) -> void ; tool 0x3A10, set 0x10 (ControlManager) + .section .text.SetLETextByID,"ax" .globl SetLETextByID SetLETextByID: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (StringPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -1369,6 +1431,7 @@ SetLETextByID: ; SetCtlValueByID(Word, GrafPortPtr, Long) -> void ; tool 0x3C10, set 0x10 (ControlManager) + .section .text.SetCtlValueByID,"ax" .globl SetCtlValueByID SetCtlValueByID: ; --- stash arg0 (in A) --- @@ -1377,12 +1440,12 @@ SetCtlValueByID: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -1392,6 +1455,7 @@ SetCtlValueByID: ; GetCtlValueByID(GrafPortPtr, Long) -> Word ; tool 0x3D10, set 0x10 (ControlManager) + .section .text.GetCtlValueByID,"ax" .globl GetCtlValueByID GetCtlValueByID: ; --- stash arg0 (in A/X) --- @@ -1400,12 +1464,12 @@ GetCtlValueByID: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -1416,18 +1480,19 @@ GetCtlValueByID: ; InvalOneCtlByID(GrafPortPtr, Long) -> void ; tool 0x3E10, set 0x10 (ControlManager) + .section .text.InvalOneCtlByID,"ax" .globl InvalOneCtlByID InvalOneCtlByID: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -1437,6 +1502,7 @@ InvalOneCtlByID: ; HiliteCtlByID(Word, GrafPortPtr, Long) -> void ; tool 0x3F10, set 0x10 (ControlManager) + .section .text.HiliteCtlByID,"ax" .globl HiliteCtlByID HiliteCtlByID: ; --- stash arg0 (in A) --- @@ -1445,12 +1511,12 @@ HiliteCtlByID: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -1460,38 +1526,41 @@ HiliteCtlByID: ; CloseNDAbyWinPtr(GrafPortPtr) -> void ; tool 0x1C05, set 0x05 (DeskManager) + .section .text.CloseNDAbyWinPtr,"ax" .globl CloseNDAbyWinPtr CloseNDAbyWinPtr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1C05 jsl 0xe10000 rtl ; CloseNDAByWinPtr(GrafPortPtr) -> void ; tool 0x1C05, set 0x05 (DeskManager) + .section .text.CloseNDAByWinPtr,"ax" .globl CloseNDAByWinPtr CloseNDAByWinPtr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1C05 jsl 0xe10000 rtl ; GetDAStrPtr(void) -> Pointer ; tool 0x1405, set 0x05 (DeskManager) + .section .text.GetDAStrPtr,"ax" .globl GetDAStrPtr GetDAStrPtr: ; --- result space (4 bytes) --- @@ -1505,50 +1574,53 @@ GetDAStrPtr: ; InstallCDA(Handle) -> void ; tool 0x0F05, set 0x05 (DeskManager) + .section .text.InstallCDA,"ax" .globl InstallCDA InstallCDA: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F05 jsl 0xe10000 rtl ; InstallNDA(Handle) -> void ; tool 0x0E05, set 0x05 (DeskManager) + .section .text.InstallNDA,"ax" .globl InstallNDA InstallNDA: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E05 jsl 0xe10000 rtl ; SetDAStrPtr(Handle, Pointer) -> void ; tool 0x1305, set 0x05 (DeskManager) + .section .text.SetDAStrPtr,"ax" .globl SetDAStrPtr SetDAStrPtr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -1558,18 +1630,19 @@ SetDAStrPtr: ; SystemClick(EventRecordPtr, GrafPortPtr, Word) -> void ; tool 0x1705, set 0x05 (DeskManager) + .section .text.SystemClick,"ax" .globl SystemClick SystemClick: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -1582,6 +1655,7 @@ SystemClick: ; SystemEvent(Word, Long, Long, Point, Word) -> Boolean ; tool 0x1A05, set 0x05 (DeskManager) + .section .text.SystemEvent,"ax" .globl SystemEvent SystemEvent: ; --- stash arg0 (in A) --- @@ -1592,17 +1666,17 @@ SystemEvent: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Long, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Point, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -1616,70 +1690,75 @@ SystemEvent: ; AddToRunQ(Pointer) -> void ; tool 0x1F05, set 0x05 (DeskManager) + .section .text.AddToRunQ,"ax" .globl AddToRunQ AddToRunQ: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1F05 jsl 0xe10000 rtl ; RemoveCDA(Handle) -> void ; tool 0x2105, set 0x05 (DeskManager) + .section .text.RemoveCDA,"ax" .globl RemoveCDA RemoveCDA: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2105 jsl 0xe10000 rtl ; RemoveFromRunQ(Pointer) -> void ; tool 0x2005, set 0x05 (DeskManager) + .section .text.RemoveFromRunQ,"ax" .globl RemoveFromRunQ RemoveFromRunQ: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2005 jsl 0xe10000 rtl ; RemoveNDA(Handle) -> void ; tool 0x2205, set 0x05 (DeskManager) + .section .text.RemoveNDA,"ax" .globl RemoveNDA RemoveNDA: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2205 jsl 0xe10000 rtl ; CallDeskAcc(Word, Long, Word, Long) -> Word ; tool 0x2405, set 0x05 (DeskManager) + .section .text.CallDeskAcc,"ax" .globl CallDeskAcc CallDeskAcc: ; --- stash arg0 (in A) --- @@ -1690,7 +1769,7 @@ CallDeskAcc: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -1698,7 +1777,7 @@ CallDeskAcc: lda 16, s pha ; --- arg3 (Long, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -1709,6 +1788,7 @@ CallDeskAcc: ; GetDeskAccInfo(Word, Long, Word, Ptr) -> void ; tool 0x2305, set 0x05 (DeskManager) + .section .text.GetDeskAccInfo,"ax" .globl GetDeskAccInfo GetDeskAccInfo: ; --- stash arg0 (in A) --- @@ -1717,7 +1797,7 @@ GetDeskAccInfo: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -1725,7 +1805,7 @@ GetDeskAccInfo: lda 14, s pha ; --- arg3 (Ptr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -1735,6 +1815,7 @@ GetDeskAccInfo: ; GetDeskGlobal(Word) -> LongWord ; tool 0x2505, set 0x05 (DeskManager) + .section .text.GetDeskGlobal,"ax" .globl GetDeskGlobal GetDeskGlobal: ; --- stash arg0 (in A) --- @@ -1753,6 +1834,7 @@ GetDeskGlobal: ; Alert(AlertTempPtr, WordProcPtr) -> Word ; tool 0x1715, set 0x15 (DialogManager) + .section .text.Alert,"ax" .globl Alert Alert: ; --- stash arg0 (in A/X) --- @@ -1761,12 +1843,12 @@ Alert: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (WordProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -1777,6 +1859,7 @@ Alert: ; CautionAlert(AlertTempPtr, WordProcPtr) -> Word ; tool 0x1A15, set 0x15 (DialogManager) + .section .text.CautionAlert,"ax" .globl CautionAlert CautionAlert: ; --- stash arg0 (in A/X) --- @@ -1785,12 +1868,12 @@ CautionAlert: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (WordProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -1801,22 +1884,24 @@ CautionAlert: ; CloseDialog(GrafPortPtr) -> void ; tool 0x0C15, set 0x15 (DialogManager) + .section .text.CloseDialog,"ax" .globl CloseDialog CloseDialog: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C15 jsl 0xe10000 rtl ; DefaultFilter(GrafPortPtr, EventRecordPtr, Word) -> Boolean ; tool 0x3615, set 0x15 (DialogManager) + .section .text.DefaultFilter,"ax" .globl DefaultFilter DefaultFilter: ; --- stash arg0 (in A/X) --- @@ -1825,12 +1910,12 @@ DefaultFilter: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (EventRecordPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -1844,6 +1929,7 @@ DefaultFilter: ; DialogSelect(EventRecordPtr, GrafPortPtr, Word) -> Boolean ; tool 0x1115, set 0x15 (DialogManager) + .section .text.DialogSelect,"ax" .globl DialogSelect DialogSelect: ; --- stash arg0 (in A/X) --- @@ -1852,12 +1938,12 @@ DialogSelect: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -1871,16 +1957,17 @@ DialogSelect: ; DisableDItem(GrafPortPtr, Word) -> void ; tool 0x3915, set 0x15 (DialogManager) + .section .text.DisableDItem,"ax" .globl DisableDItem DisableDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -1890,96 +1977,102 @@ DisableDItem: ; DlgCopy(GrafPortPtr) -> void ; tool 0x1315, set 0x15 (DialogManager) + .section .text.DlgCopy,"ax" .globl DlgCopy DlgCopy: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1315 jsl 0xe10000 rtl ; DlgCut(GrafPortPtr) -> void ; tool 0x1215, set 0x15 (DialogManager) + .section .text.DlgCut,"ax" .globl DlgCut DlgCut: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1215 jsl 0xe10000 rtl ; DlgDelete(GrafPortPtr) -> void ; tool 0x1515, set 0x15 (DialogManager) + .section .text.DlgDelete,"ax" .globl DlgDelete DlgDelete: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1515 jsl 0xe10000 rtl ; DlgPaste(GrafPortPtr) -> void ; tool 0x1415, set 0x15 (DialogManager) + .section .text.DlgPaste,"ax" .globl DlgPaste DlgPaste: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1415 jsl 0xe10000 rtl ; DrawDialog(GrafPortPtr) -> void ; tool 0x1615, set 0x15 (DialogManager) + .section .text.DrawDialog,"ax" .globl DrawDialog DrawDialog: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1615 jsl 0xe10000 rtl ; EnableDItem(GrafPortPtr, Word) -> void ; tool 0x3A15, set 0x15 (DialogManager) + .section .text.EnableDItem,"ax" .globl EnableDItem EnableDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -1989,22 +2082,24 @@ EnableDItem: ; ErrorSound(VoidProcPtr) -> void ; tool 0x0915, set 0x15 (DialogManager) + .section .text.ErrorSound,"ax" .globl ErrorSound ErrorSound: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0915 jsl 0xe10000 rtl ; FindDItem(GrafPortPtr, Point) -> Word ; tool 0x2415, set 0x15 (DialogManager) + .section .text.FindDItem,"ax" .globl FindDItem FindDItem: ; --- stash arg0 (in A/X) --- @@ -2013,12 +2108,12 @@ FindDItem: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Point, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -2029,6 +2124,7 @@ FindDItem: ; GetControlDItem(GrafPortPtr, Word) -> CtlRecHndl ; tool 0x1E15, set 0x15 (DialogManager) + .section .text.GetControlDItem,"ax" .globl GetControlDItem GetControlDItem: ; --- stash arg0 (in A/X) --- @@ -2038,10 +2134,10 @@ GetControlDItem: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha @@ -2053,6 +2149,7 @@ GetControlDItem: ; GetDefButton(GrafPortPtr) -> Word ; tool 0x3715, set 0x15 (DialogManager) + .section .text.GetDefButton,"ax" .globl GetDefButton GetDefButton: ; --- stash arg0 (in A/X) --- @@ -2061,10 +2158,10 @@ GetDefButton: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3715 jsl 0xe10000 pla ; result -> A @@ -2072,21 +2169,22 @@ GetDefButton: ; GetDItemBox(GrafPortPtr, Word, Rect) -> void ; tool 0x2815, set 0x15 (DialogManager) + .section .text.GetDItemBox,"ax" .globl GetDItemBox GetDItemBox: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -2096,6 +2194,7 @@ GetDItemBox: ; GetDItemType(GrafPortPtr, Word) -> Word ; tool 0x2615, set 0x15 (DialogManager) + .section .text.GetDItemType,"ax" .globl GetDItemType GetDItemType: ; --- stash arg0 (in A/X) --- @@ -2104,10 +2203,10 @@ GetDItemType: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -2118,6 +2217,7 @@ GetDItemType: ; GetDItemValue(GrafPortPtr, Word) -> Word ; tool 0x2E15, set 0x15 (DialogManager) + .section .text.GetDItemValue,"ax" .globl GetDItemValue GetDItemValue: ; --- stash arg0 (in A/X) --- @@ -2126,10 +2226,10 @@ GetDItemValue: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -2140,6 +2240,7 @@ GetDItemValue: ; GetFirstDItem(GrafPortPtr) -> Word ; tool 0x2A15, set 0x15 (DialogManager) + .section .text.GetFirstDItem,"ax" .globl GetFirstDItem GetFirstDItem: ; --- stash arg0 (in A/X) --- @@ -2148,10 +2249,10 @@ GetFirstDItem: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2A15 jsl 0xe10000 pla ; result -> A @@ -2159,21 +2260,22 @@ GetFirstDItem: ; GetIText(GrafPortPtr, Word, Pointer) -> void ; tool 0x1F15, set 0x15 (DialogManager) + .section .text.GetIText,"ax" .globl GetIText GetIText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -2183,18 +2285,19 @@ GetIText: ; GetNewDItem(GrafPortPtr, ItemTempPtr) -> void ; tool 0x3315, set 0x15 (DialogManager) + .section .text.GetNewDItem,"ax" .globl GetNewDItem GetNewDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ItemTempPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2204,6 +2307,7 @@ GetNewDItem: ; GetNewModalDialog(DlgTempPtr) -> DialogPtr ; tool 0x3215, set 0x15 (DialogManager) + .section .text.GetNewModalDialog,"ax" .globl GetNewModalDialog GetNewModalDialog: ; --- stash arg0 (in A/X) --- @@ -2213,10 +2317,10 @@ GetNewModalDialog: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3215 jsl 0xe10000 pla ; result lo -> A @@ -2225,6 +2329,7 @@ GetNewModalDialog: ; GetNextDItem(GrafPortPtr, Word) -> Word ; tool 0x2B15, set 0x15 (DialogManager) + .section .text.GetNextDItem,"ax" .globl GetNextDItem GetNextDItem: ; --- stash arg0 (in A/X) --- @@ -2233,10 +2338,10 @@ GetNextDItem: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -2247,16 +2352,17 @@ GetNextDItem: ; HideDItem(GrafPortPtr, Word) -> void ; tool 0x2215, set 0x15 (DialogManager) + .section .text.HideDItem,"ax" .globl HideDItem HideDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -2266,6 +2372,7 @@ HideDItem: ; IsDialogEvent(EventRecordPtr) -> Boolean ; tool 0x1015, set 0x15 (DialogManager) + .section .text.IsDialogEvent,"ax" .globl IsDialogEvent IsDialogEvent: ; --- stash arg0 (in A/X) --- @@ -2274,10 +2381,10 @@ IsDialogEvent: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1015 jsl 0xe10000 pla ; result -> A @@ -2285,6 +2392,7 @@ IsDialogEvent: ; ModalDialog(WordProcPtr) -> Word ; tool 0x0F15, set 0x15 (DialogManager) + .section .text.ModalDialog,"ax" .globl ModalDialog ModalDialog: ; --- stash arg0 (in A/X) --- @@ -2293,10 +2401,10 @@ ModalDialog: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F15 jsl 0xe10000 pla ; result -> A @@ -2304,6 +2412,7 @@ ModalDialog: ; ModalDialog2(WordProcPtr) -> LongWord ; tool 0x2C15, set 0x15 (DialogManager) + .section .text.ModalDialog2,"ax" .globl ModalDialog2 ModalDialog2: ; --- stash arg0 (in A/X) --- @@ -2313,10 +2422,10 @@ ModalDialog2: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2C15 jsl 0xe10000 pla ; result lo -> A @@ -2325,21 +2434,22 @@ ModalDialog2: ; NewDItem(GrafPortPtr, Word, Rect, Word, Pointer, Word, Word, Pointer) -> void ; tool 0x0D15, set 0x15 (DialogManager) + .section .text.NewDItem,"ax" .globl NewDItem NewDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -2347,7 +2457,7 @@ NewDItem: lda 20, s pha ; --- arg4 (Pointer, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -2358,7 +2468,7 @@ NewDItem: lda 36, s pha ; --- arg7 (Pointer, 4B) --- - lda 40, s + lda 42, s pha lda 42, s pha @@ -2368,6 +2478,7 @@ NewDItem: ; NewModalDialog(Rect, Boolean, LongWord) -> DialogPtr ; tool 0x0A15, set 0x15 (DialogManager) + .section .text.NewModalDialog,"ax" .globl NewModalDialog NewModalDialog: ; --- stash arg0 (in A/X) --- @@ -2377,15 +2488,15 @@ NewModalDialog: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Boolean, 2B) --- lda 12, s pha ; --- arg2 (LongWord, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -2397,6 +2508,7 @@ NewModalDialog: ; NewModelessDialog(Rect, Pointer, GrafPortPtr, Word, LongWord, Rect) -> DialogPtr ; tool 0x0B15, set 0x15 (DialogManager) + .section .text.NewModelessDialog,"ax" .globl NewModelessDialog NewModelessDialog: ; --- stash arg0 (in A/X) --- @@ -2406,17 +2518,17 @@ NewModelessDialog: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -2424,12 +2536,12 @@ NewModelessDialog: lda 28, s pha ; --- arg4 (LongWord, 4B) --- - lda 32, s + lda 34, s pha lda 34, s pha ; --- arg5 (Rect, 4B) --- - lda 40, s + lda 42, s pha lda 42, s pha @@ -2441,6 +2553,7 @@ NewModelessDialog: ; NoteAlert(AlertTempPtr, WordProcPtr) -> Word ; tool 0x1915, set 0x15 (DialogManager) + .section .text.NoteAlert,"ax" .globl NoteAlert NoteAlert: ; --- stash arg0 (in A/X) --- @@ -2449,12 +2562,12 @@ NoteAlert: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (WordProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -2465,28 +2578,29 @@ NoteAlert: ; ParamText(Pointer, Pointer, Pointer, Pointer) -> void ; tool 0x1B15, set 0x15 (DialogManager) + .section .text.ParamText,"ax" .globl ParamText ParamText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Pointer, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Pointer, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -2496,16 +2610,17 @@ ParamText: ; RemoveDItem(GrafPortPtr, Word) -> void ; tool 0x0E15, set 0x15 (DialogManager) + .section .text.RemoveDItem,"ax" .globl RemoveDItem RemoveDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -2515,16 +2630,17 @@ RemoveDItem: ; SelectIText(GrafPortPtr, Word, Word, Word) -> void ; tool 0x2115, set 0x15 (DialogManager) + .section .text.SelectIText,"ax" .globl SelectIText SelectIText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -2540,16 +2656,17 @@ SelectIText: ; SelIText(GrafPortPtr, Word, Word, Word) -> void ; tool 0x2115, set 0x15 (DialogManager) + .section .text.SelIText,"ax" .globl SelIText SelIText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -2565,22 +2682,24 @@ SelIText: ; SetDAFont(FontHndl) -> void ; tool 0x1C15, set 0x15 (DialogManager) + .section .text.SetDAFont,"ax" .globl SetDAFont SetDAFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1C15 jsl 0xe10000 rtl ; SetDefButton(Word, GrafPortPtr) -> void ; tool 0x3815, set 0x15 (DialogManager) + .section .text.SetDefButton,"ax" .globl SetDefButton SetDefButton: ; --- stash arg0 (in A) --- @@ -2589,7 +2708,7 @@ SetDefButton: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -2599,21 +2718,22 @@ SetDefButton: ; SetDItemBox(GrafPortPtr, Word, Rect) -> void ; tool 0x2915, set 0x15 (DialogManager) + .section .text.SetDItemBox,"ax" .globl SetDItemBox SetDItemBox: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -2623,6 +2743,7 @@ SetDItemBox: ; SetDItemType(Word, GrafPortPtr, Word) -> void ; tool 0x2715, set 0x15 (DialogManager) + .section .text.SetDItemType,"ax" .globl SetDItemType SetDItemType: ; --- stash arg0 (in A) --- @@ -2631,7 +2752,7 @@ SetDItemType: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -2644,6 +2765,7 @@ SetDItemType: ; SetDItemValue(Word, GrafPortPtr, Word) -> void ; tool 0x2F15, set 0x15 (DialogManager) + .section .text.SetDItemValue,"ax" .globl SetDItemValue SetDItemValue: ; --- stash arg0 (in A) --- @@ -2652,7 +2774,7 @@ SetDItemValue: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -2665,21 +2787,22 @@ SetDItemValue: ; SetIText(GrafPortPtr, Word, Pointer) -> void ; tool 0x2015, set 0x15 (DialogManager) + .section .text.SetIText,"ax" .globl SetIText SetIText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -2689,16 +2812,17 @@ SetIText: ; ShowDItem(GrafPortPtr, Word) -> void ; tool 0x2315, set 0x15 (DialogManager) + .section .text.ShowDItem,"ax" .globl ShowDItem ShowDItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -2708,6 +2832,7 @@ ShowDItem: ; StopAlert(AlertTempPtr, WordProcPtr) -> Word ; tool 0x1815, set 0x15 (DialogManager) + .section .text.StopAlert,"ax" .globl StopAlert StopAlert: ; --- stash arg0 (in A/X) --- @@ -2716,12 +2841,12 @@ StopAlert: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (WordProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -2732,18 +2857,19 @@ StopAlert: ; UpdateDialog(GrafPortPtr, Handle) -> void ; tool 0x2515, set 0x15 (DialogManager) + .section .text.UpdateDialog,"ax" .globl UpdateDialog UpdateDialog: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2753,6 +2879,7 @@ UpdateDialog: ; EMStartUp(Word, Word, Integer, Integer, Integer, Integer, Word) -> void ; tool 0x0206, set 0x06 (EventManager) + .section .text.EMStartUp,"ax" .globl EMStartUp EMStartUp: ; --- stash arg0 (in A) --- @@ -2784,6 +2911,7 @@ EMStartUp: ; EventAvail(Word, EventRecordPtr) -> Boolean ; tool 0x0B06, set 0x06 (EventManager) + .section .text.EventAvail,"ax" .globl EventAvail EventAvail: ; --- stash arg0 (in A) --- @@ -2794,7 +2922,7 @@ EventAvail: lda 0xE0 pha ; --- arg1 (EventRecordPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2805,6 +2933,7 @@ EventAvail: ; FakeMouse(Word, Word, Integer, Integer, Word) -> void ; tool 0x1906, set 0x06 (EventManager) + .section .text.FakeMouse,"ax" .globl FakeMouse FakeMouse: ; --- stash arg0 (in A) --- @@ -2830,6 +2959,7 @@ FakeMouse: ; FlushEvents(Word, Word) -> Word ; tool 0x1506, set 0x06 (EventManager) + .section .text.FlushEvents,"ax" .globl FlushEvents FlushEvents: ; --- stash arg0 (in A) --- @@ -2849,6 +2979,7 @@ FlushEvents: ; GetCaretTime(void) -> LongWord ; tool 0x1206, set 0x06 (EventManager) + .section .text.GetCaretTime,"ax" .globl GetCaretTime GetCaretTime: ; --- result space (4 bytes) --- @@ -2862,6 +2993,7 @@ GetCaretTime: ; GetDblTime(void) -> LongWord ; tool 0x1106, set 0x06 (EventManager) + .section .text.GetDblTime,"ax" .globl GetDblTime GetDblTime: ; --- result space (4 bytes) --- @@ -2875,22 +3007,24 @@ GetDblTime: ; GetMouse(Point) -> void ; tool 0x0C06, set 0x06 (EventManager) + .section .text.GetMouse,"ax" .globl GetMouse GetMouse: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C06 jsl 0xe10000 rtl ; GetNextEvent(Word, EventRecordPtr) -> Boolean ; tool 0x0A06, set 0x06 (EventManager) + .section .text.GetNextEvent,"ax" .globl GetNextEvent GetNextEvent: ; --- stash arg0 (in A) --- @@ -2901,7 +3035,7 @@ GetNextEvent: lda 0xE0 pha ; --- arg1 (EventRecordPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2912,6 +3046,7 @@ GetNextEvent: ; GetOSEvent(Word, EventRecordPtr) -> Boolean ; tool 0x1606, set 0x06 (EventManager) + .section .text.GetOSEvent,"ax" .globl GetOSEvent GetOSEvent: ; --- stash arg0 (in A) --- @@ -2922,7 +3057,7 @@ GetOSEvent: lda 0xE0 pha ; --- arg1 (EventRecordPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2933,6 +3068,7 @@ GetOSEvent: ; OSEventAvail(Word, EventRecordPtr) -> Boolean ; tool 0x1706, set 0x06 (EventManager) + .section .text.OSEventAvail,"ax" .globl OSEventAvail OSEventAvail: ; --- stash arg0 (in A) --- @@ -2943,7 +3079,7 @@ OSEventAvail: lda 0xE0 pha ; --- arg1 (EventRecordPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2954,6 +3090,7 @@ OSEventAvail: ; PostEvent(Word, LongWord) -> Word ; tool 0x1406, set 0x06 (EventManager) + .section .text.PostEvent,"ax" .globl PostEvent PostEvent: ; --- stash arg0 (in A) --- @@ -2964,7 +3101,7 @@ PostEvent: lda 0xE0 pha ; --- arg1 (LongWord, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -2975,6 +3112,7 @@ PostEvent: ; TickCount(void) -> LongWord ; tool 0x1006, set 0x06 (EventManager) + .section .text.TickCount,"ax" .globl TickCount TickCount: ; --- result space (4 bytes) --- @@ -2988,6 +3126,7 @@ TickCount: ; FMStartUp(Word, Word) -> void ; tool 0x021B, set 0x1B (FontManager) + .section .text.FMStartUp,"ax" .globl FMStartUp FMStartUp: ; --- stash arg0 (in A) --- @@ -3004,6 +3143,7 @@ FMStartUp: ; AddFamily(Word, Pointer) -> void ; tool 0x0D1B, set 0x1B (FontManager) + .section .text.AddFamily,"ax" .globl AddFamily AddFamily: ; --- stash arg0 (in A) --- @@ -3012,7 +3152,7 @@ AddFamily: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -3022,16 +3162,17 @@ AddFamily: ; AddFontVar(FontHndl, Word) -> void ; tool 0x141B, set 0x1B (FontManager) + .section .text.AddFontVar,"ax" .globl AddFontVar AddFontVar: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -3041,6 +3182,7 @@ AddFontVar: ; ChooseFont(FontID, Word) -> LongWord ; tool 0x161B, set 0x1B (FontManager) + .section .text.ChooseFont,"ax" .globl ChooseFont ChooseFont: ; --- stash arg0 (in A/X) --- @@ -3050,10 +3192,10 @@ ChooseFont: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha @@ -3065,6 +3207,7 @@ ChooseFont: ; CountFonts(FontID, Word) -> Word ; tool 0x101B, set 0x1B (FontManager) + .section .text.CountFonts,"ax" .globl CountFonts CountFonts: ; --- stash arg0 (in A/X) --- @@ -3073,10 +3216,10 @@ CountFonts: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -3087,6 +3230,7 @@ CountFonts: ; FindFamily(Word, Word, Pointer) -> Word ; tool 0x0A1B, set 0x1B (FontManager) + .section .text.FindFamily,"ax" .globl FindFamily FindFamily: ; --- stash arg0 (in A) --- @@ -3100,7 +3244,7 @@ FindFamily: lda 8, s pha ; --- arg2 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -3111,16 +3255,17 @@ FindFamily: ; FindFontStats(FontID, Word, Word, FontStatRecPtr) -> void ; tool 0x111B, set 0x1B (FontManager) + .section .text.FindFontStats,"ax" .globl FindFontStats FindFontStats: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -3128,7 +3273,7 @@ FindFontStats: lda 12, s pha ; --- arg3 (FontStatRecPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -3138,6 +3283,7 @@ FindFontStats: ; FixFontMenu(Word, Word, Word) -> void ; tool 0x151B, set 0x1B (FontManager) + .section .text.FixFontMenu,"ax" .globl FixFontMenu FixFontMenu: ; --- stash arg0 (in A) --- @@ -3157,6 +3303,7 @@ FixFontMenu: ; FMGetCurFID(void) -> LongWord ; tool 0x1A1B, set 0x1B (FontManager) + .section .text.FMGetCurFID,"ax" .globl FMGetCurFID FMGetCurFID: ; --- result space (4 bytes) --- @@ -3170,6 +3317,7 @@ FMGetCurFID: ; FMGetSysFID(void) -> LongWord ; tool 0x191B, set 0x1B (FontManager) + .section .text.FMGetSysFID,"ax" .globl FMGetSysFID FMGetSysFID: ; --- result space (4 bytes) --- @@ -3183,22 +3331,24 @@ FMGetSysFID: ; FMSetSysFont(FontID) -> void ; tool 0x181B, set 0x1B (FontManager) + .section .text.FMSetSysFont,"ax" .globl FMSetSysFont FMSetSysFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x181B jsl 0xe10000 rtl ; GetFamInfo(Word, Pointer) -> Word ; tool 0x0B1B, set 0x1B (FontManager) + .section .text.GetFamInfo,"ax" .globl GetFamInfo GetFamInfo: ; --- stash arg0 (in A) --- @@ -3209,7 +3359,7 @@ GetFamInfo: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -3220,6 +3370,7 @@ GetFamInfo: ; GetFamNum(Pointer) -> Word ; tool 0x0C1B, set 0x1B (FontManager) + .section .text.GetFamNum,"ax" .globl GetFamNum GetFamNum: ; --- stash arg0 (in A/X) --- @@ -3228,10 +3379,10 @@ GetFamNum: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C1B jsl 0xe10000 pla ; result -> A @@ -3239,16 +3390,17 @@ GetFamNum: ; InstallFont(FontID, Word) -> void ; tool 0x0E1B, set 0x1B (FontManager) + .section .text.InstallFont,"ax" .globl InstallFont InstallFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -3258,16 +3410,17 @@ InstallFont: ; LoadFont(FontID, Word, Word, FontStatRecPtr) -> void ; tool 0x121B, set 0x1B (FontManager) + .section .text.LoadFont,"ax" .globl LoadFont LoadFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -3275,7 +3428,7 @@ LoadFont: lda 12, s pha ; --- arg3 (FontStatRecPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -3285,16 +3438,17 @@ LoadFont: ; SetPurgeStat(FontID, Word) -> void ; tool 0x0F1B, set 0x1B (FontManager) + .section .text.SetPurgeStat,"ax" .globl SetPurgeStat SetPurgeStat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -3304,21 +3458,22 @@ SetPurgeStat: ; InstallWithStats(FontID, Word, Pointer) -> void ; tool 0x1C1B, set 0x1B (FontManager) + .section .text.InstallWithStats,"ax" .globl InstallWithStats InstallWithStats: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -3328,54 +3483,58 @@ InstallWithStats: ; DebugStr(Pointer) -> void ; tool 0x09FF, set 0xFF (?) + .section .text.DebugStr,"ax" .globl DebugStr DebugStr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x09FF jsl 0xe10000 rtl ; SetMileStone(Pointer) -> void ; tool 0x0AFF, set 0xFF (?) + .section .text.SetMileStone,"ax" .globl SetMileStone SetMileStone: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0AFF jsl 0xe10000 rtl ; DebugSetHook(VoidProcPtr) -> void ; tool 0x0BFF, set 0xFF (?) + .section .text.DebugSetHook,"ax" .globl DebugSetHook DebugSetHook: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0BFF jsl 0xe10000 rtl ; DebugGetInfo(Word) -> LongWord ; tool 0x0CFF, set 0xFF (?) + .section .text.DebugGetInfo,"ax" .globl DebugGetInfo DebugGetInfo: ; --- stash arg0 (in A) --- @@ -3394,6 +3553,7 @@ DebugGetInfo: ; EvalExpr(Str255) -> Handle ; tool 0x0002, set 0x02 (MemoryManager) + .section .text.EvalExpr,"ax" .globl EvalExpr EvalExpr: ; --- stash arg0 (in A/X) --- @@ -3403,10 +3563,10 @@ EvalExpr: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0002 jsl 0xe100a8 pla ; result lo -> A @@ -3415,38 +3575,41 @@ EvalExpr: ; SendCardMessage(Str255) -> void ; tool 0x0001, set 0x01 (ToolLocator) + .section .text.SendCardMessage,"ax" .globl SendCardMessage SendCardMessage: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0001 jsl 0xe100a8 rtl ; SendHCMessage(Str255) -> void ; tool 0x0005, set 0x05 (DeskManager) + .section .text.SendHCMessage,"ax" .globl SendHCMessage SendHCMessage: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0005 jsl 0xe100a8 rtl ; GetGlobal(Str255) -> Handle ; tool 0x0012, set 0x12 (QDAuxiliary) + .section .text.GetGlobal,"ax" .globl GetGlobal GetGlobal: ; --- stash arg0 (in A/X) --- @@ -3456,10 +3619,10 @@ GetGlobal: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0012 jsl 0xe100a8 pla ; result lo -> A @@ -3468,18 +3631,19 @@ GetGlobal: ; SetGlobal(Str255, Handle) -> void ; tool 0x0013, set 0x13 (PrintManager) + .section .text.SetGlobal,"ax" .globl SetGlobal SetGlobal: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -3489,18 +3653,19 @@ SetGlobal: ; ZeroBytes(Ptr, long) -> void ; tool 0x0006, set 0x06 (EventManager) + .section .text.ZeroBytes,"ax" .globl ZeroBytes ZeroBytes: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -3510,6 +3675,7 @@ ZeroBytes: ; GSStringEqual(GSString255Hndl, GSString255Hndl) -> Boolean ; tool 0x0022, set 0x22 (TextEdit) + .section .text.GSStringEqual,"ax" .globl GSStringEqual GSStringEqual: ; --- stash arg0 (in A/X) --- @@ -3518,12 +3684,12 @@ GSStringEqual: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GSString255Hndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -3534,38 +3700,41 @@ GSStringEqual: ; ScanToReturn(Ptr) -> void ; tool 0x001C, set 0x1C (ListManager) + .section .text.ScanToReturn,"ax" .globl ScanToReturn ScanToReturn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x001C jsl 0xe100a8 rtl ; ScanToZero(Ptr) -> void ; tool 0x001D, set 0x1D (ACETools) + .section .text.ScanToZero,"ax" .globl ScanToZero ScanToZero: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x001D jsl 0xe100a8 rtl ; StringEqual(Str255, Str255) -> Boolean ; tool 0x001A, set 0x1A (NoteSequencer) + .section .text.StringEqual,"ax" .globl StringEqual StringEqual: ; --- stash arg0 (in A/X) --- @@ -3574,12 +3743,12 @@ StringEqual: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -3590,6 +3759,7 @@ StringEqual: ; StringLength(Ptr) -> Longint ; tool 0x0003, set 0x03 (MiscTools) + .section .text.StringLength,"ax" .globl StringLength StringLength: ; --- stash arg0 (in A/X) --- @@ -3599,10 +3769,10 @@ StringLength: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0003 jsl 0xe100a8 pla ; result lo -> A @@ -3611,6 +3781,7 @@ StringLength: ; StringMatch(Str255, Ptr) -> Ptr ; tool 0x0004, set 0x04 (QuickDraw) + .section .text.StringMatch,"ax" .globl StringMatch StringMatch: ; --- stash arg0 (in A/X) --- @@ -3620,12 +3791,12 @@ StringMatch: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Ptr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -3637,6 +3808,7 @@ StringMatch: ; BoolToStr(Boolean) -> Str31 ; tool 0x0010, set 0x10 (ControlManager) + .section .text.BoolToStr,"ax" .globl BoolToStr BoolToStr: ; --- stash arg0 (in A) --- @@ -3655,6 +3827,7 @@ BoolToStr: ; CopyGSString(GSString255Hndl) -> GSString255Hndl ; tool 0x0020, set 0x20 (VideoOverlay) + .section .text.CopyGSString,"ax" .globl CopyGSString CopyGSString: ; --- stash arg0 (in A/X) --- @@ -3664,10 +3837,10 @@ CopyGSString: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0020 jsl 0xe100a8 pla ; result lo -> A @@ -3676,6 +3849,7 @@ CopyGSString: ; ExtToStr(Extended) -> Str31 ; tool 0x0011, set 0x11 (Loader) + .section .text.ExtToStr,"ax" .globl ExtToStr ExtToStr: ; --- stash arg0 (in A) --- @@ -3694,6 +3868,7 @@ ExtToStr: ; GSConcat(GSString255Hndl, GSString255Hndl) -> GSString255Hndl ; tool 0x0021, set 0x21 (Teletext) + .section .text.GSConcat,"ax" .globl GSConcat GSConcat: ; --- stash arg0 (in A/X) --- @@ -3703,12 +3878,12 @@ GSConcat: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GSString255Hndl, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -3720,6 +3895,7 @@ GSConcat: ; GSToPString(GSString255Hndl) -> Str255 ; tool 0x001E, set 0x1E (ResourceManager) + .section .text.GSToPString,"ax" .globl GSToPString GSToPString: ; --- stash arg0 (in A/X) --- @@ -3729,10 +3905,10 @@ GSToPString: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x001E jsl 0xe100a8 pla ; result lo -> A @@ -3741,6 +3917,7 @@ GSToPString: ; GSToZero(GSString255Hndl) -> Handle ; tool 0x0023, set 0x23 (MediaControl) + .section .text.GSToZero,"ax" .globl GSToZero GSToZero: ; --- stash arg0 (in A/X) --- @@ -3750,10 +3927,10 @@ GSToZero: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0023 jsl 0xe100a8 pla ; result lo -> A @@ -3762,6 +3939,7 @@ GSToZero: ; LongToStr(Longint) -> Str31 ; tool 0x000D, set 0x0D (?) + .section .text.LongToStr,"ax" .globl LongToStr LongToStr: ; --- stash arg0 (in A/X) --- @@ -3771,10 +3949,10 @@ LongToStr: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x000D jsl 0xe100a8 pla ; result lo -> A @@ -3783,6 +3961,7 @@ LongToStr: ; NumToHex(Longint, word) -> Str19 ; tool 0x000F, set 0x0F (MenuManager) + .section .text.NumToHex,"ax" .globl NumToHex NumToHex: ; --- stash arg0 (in A/X) --- @@ -3792,12 +3971,12 @@ NumToHex: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (word, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -3809,6 +3988,7 @@ NumToHex: ; NumToStr(Longint) -> Str31 ; tool 0x000E, set 0x0E (WindowManager) + .section .text.NumToStr,"ax" .globl NumToStr NumToStr: ; --- stash arg0 (in A/X) --- @@ -3818,10 +3998,10 @@ NumToStr: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x000E jsl 0xe100a8 pla ; result lo -> A @@ -3830,18 +4010,19 @@ NumToStr: ; PointToStr(Point, Str255) -> void ; tool 0x002D, set 0x2D (?) + .section .text.PointToStr,"ax" .globl PointToStr PointToStr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -3851,6 +4032,7 @@ PointToStr: ; PasToZero(Str255) -> Handle ; tool 0x0007, set 0x07 (Scheduler) + .section .text.PasToZero,"ax" .globl PasToZero PasToZero: ; --- stash arg0 (in A/X) --- @@ -3860,10 +4042,10 @@ PasToZero: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0007 jsl 0xe100a8 pla ; result lo -> A @@ -3872,6 +4054,7 @@ PasToZero: ; PToGSString(Str255) -> GSString255Hndl ; tool 0x001F, set 0x1F (MIDITools) + .section .text.PToGSString,"ax" .globl PToGSString PToGSString: ; --- stash arg0 (in A/X) --- @@ -3881,10 +4064,10 @@ PToGSString: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x001F jsl 0xe100a8 pla ; result lo -> A @@ -3893,18 +4076,19 @@ PToGSString: ; RectToStr(Rect, Str255) -> void ; tool 0x002E, set 0x2E (?) + .section .text.RectToStr,"ax" .globl RectToStr RectToStr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -3914,18 +4098,19 @@ RectToStr: ; ReturnToPas(Ptr, Str255) -> void ; tool 0x001B, set 0x1B (FontManager) + .section .text.ReturnToPas,"ax" .globl ReturnToPas ReturnToPas: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -3935,6 +4120,7 @@ ReturnToPas: ; StrToBool(Str31) -> Boolean ; tool 0x000B, set 0x0B (IntegerMath) + .section .text.StrToBool,"ax" .globl StrToBool StrToBool: ; --- stash arg0 (in A/X) --- @@ -3943,10 +4129,10 @@ StrToBool: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x000B jsl 0xe100a8 pla ; result -> A @@ -3954,6 +4140,7 @@ StrToBool: ; StrToExt(Str31) -> extended ; tool 0x000C, set 0x0C (TextTools) + .section .text.StrToExt,"ax" .globl StrToExt StrToExt: ; --- stash arg0 (in A/X) --- @@ -3963,10 +4150,10 @@ StrToExt: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x000C jsl 0xe100a8 pla ; result lo -> A @@ -3975,6 +4162,7 @@ StrToExt: ; StrToLong(Str31) -> Longint ; tool 0x0009, set 0x09 (AppleDeskBus) + .section .text.StrToLong,"ax" .globl StrToLong StrToLong: ; --- stash arg0 (in A/X) --- @@ -3984,10 +4172,10 @@ StrToLong: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0009 jsl 0xe100a8 pla ; result lo -> A @@ -3996,6 +4184,7 @@ StrToLong: ; StrToNum(Str31) -> Longint ; tool 0x000A, set 0x0A (SANE) + .section .text.StrToNum,"ax" .globl StrToNum StrToNum: ; --- stash arg0 (in A/X) --- @@ -4005,10 +4194,10 @@ StrToNum: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x000A jsl 0xe100a8 pla ; result lo -> A @@ -4017,18 +4206,19 @@ StrToNum: ; StrToPoint(Str255, Point) -> void ; tool 0x002F, set 0x2F (?) + .section .text.StrToPoint,"ax" .globl StrToPoint StrToPoint: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Point, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4038,18 +4228,19 @@ StrToPoint: ; StrToRect(Str255, Rect) -> void ; tool 0x0030, set 0x30 (?) + .section .text.StrToRect,"ax" .globl StrToRect StrToRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4059,6 +4250,7 @@ StrToRect: ; ZeroToGS(Handle) -> GSString255Hndl ; tool 0x0024, set 0x24 (?) + .section .text.ZeroToGS,"ax" .globl ZeroToGS ZeroToGS: ; --- stash arg0 (in A/X) --- @@ -4068,10 +4260,10 @@ ZeroToGS: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0024 jsl 0xe100a8 pla ; result lo -> A @@ -4080,18 +4272,19 @@ ZeroToGS: ; ZeroToPas(Ptr, Str255) -> void ; tool 0x0008, set 0x08 (SoundManager) + .section .text.ZeroToPas,"ax" .globl ZeroToPas ZeroToPas: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4101,6 +4294,7 @@ ZeroToPas: ; GetFieldByID(Boolean, word) -> Handle ; tool 0x0016, set 0x16 (ScrapManager) + .section .text.GetFieldByID,"ax" .globl GetFieldByID GetFieldByID: ; --- stash arg0 (in A) --- @@ -4112,7 +4306,7 @@ GetFieldByID: lda 0xE0 pha ; --- arg1 (word, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -4124,6 +4318,7 @@ GetFieldByID: ; GetFieldByName(Boolean, Str255) -> Handle ; tool 0x0014, set 0x14 (LineEdit) + .section .text.GetFieldByName,"ax" .globl GetFieldByName GetFieldByName: ; --- stash arg0 (in A) --- @@ -4135,7 +4330,7 @@ GetFieldByName: lda 0xE0 pha ; --- arg1 (Str255, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -4147,6 +4342,7 @@ GetFieldByName: ; GetFieldByNum(Boolean, word) -> Handle ; tool 0x0015, set 0x15 (DialogManager) + .section .text.GetFieldByNum,"ax" .globl GetFieldByNum GetFieldByNum: ; --- stash arg0 (in A) --- @@ -4158,7 +4354,7 @@ GetFieldByNum: lda 0xE0 pha ; --- arg1 (word, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -4170,6 +4366,7 @@ GetFieldByNum: ; SetFieldByID(Boolean, word, Handle) -> void ; tool 0x0019, set 0x19 (NoteSynth) + .section .text.SetFieldByID,"ax" .globl SetFieldByID SetFieldByID: ; --- stash arg0 (in A) --- @@ -4178,12 +4375,12 @@ SetFieldByID: lda 0xE0 pha ; --- arg1 (word, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -4193,6 +4390,7 @@ SetFieldByID: ; SetFieldByName(Boolean, Str255, Handle) -> void ; tool 0x0017, set 0x17 (StandardFile) + .section .text.SetFieldByName,"ax" .globl SetFieldByName SetFieldByName: ; --- stash arg0 (in A) --- @@ -4201,12 +4399,12 @@ SetFieldByName: lda 0xE0 pha ; --- arg1 (Str255, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -4216,6 +4414,7 @@ SetFieldByName: ; SetFieldByNum(Boolean, word, Handle) -> void ; tool 0x0018, set 0x18 (DiskUtil) + .section .text.SetFieldByNum,"ax" .globl SetFieldByNum SetFieldByNum: ; --- stash arg0 (in A) --- @@ -4224,12 +4423,12 @@ SetFieldByNum: lda 0xE0 pha ; --- arg1 (word, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -4239,34 +4438,36 @@ SetFieldByNum: ; ChangedMaskAndData(word) -> void ; tool 0x002C, set 0x2C (?) + .section .text.ChangedMaskAndData,"ax" .globl ChangedMaskAndData ChangedMaskAndData: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x002C jsl 0xe100a8 rtl ; GetMaskAndData(LocInfoPtr, LocInfoPtr) -> void ; tool 0x002B, set 0x2B (?) + .section .text.GetMaskAndData,"ax" .globl GetMaskAndData GetMaskAndData: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (LocInfoPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4276,6 +4477,7 @@ GetMaskAndData: ; FindNamedResource(word, Str255, word, long) -> Boolean ; tool 0x0026, set 0x26 (?) + .section .text.FindNamedResource,"ax" .globl FindNamedResource FindNamedResource: ; --- stash arg0 (in A/X) --- @@ -4284,22 +4486,22 @@ FindNamedResource: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (word, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha ; --- arg3 (long, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha @@ -4310,6 +4512,7 @@ FindNamedResource: ; GetResourceName(word, long) -> Str255 ; tool 0x0028, set 0x28 (?) + .section .text.GetResourceName,"ax" .globl GetResourceName GetResourceName: ; --- stash arg0 (in A/X) --- @@ -4319,12 +4522,12 @@ GetResourceName: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4336,6 +4539,7 @@ GetResourceName: ; LoadNamedResource(word, Str255) -> Handle ; tool 0x0025, set 0x25 (?) + .section .text.LoadNamedResource,"ax" .globl LoadNamedResource LoadNamedResource: ; --- stash arg0 (in A/X) --- @@ -4345,12 +4549,12 @@ LoadNamedResource: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str255, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4362,23 +4566,24 @@ LoadNamedResource: ; SetResourceName(word, long, Str255) -> void ; tool 0x0027, set 0x27 (?) + .section .text.SetResourceName,"ax" .globl SetResourceName SetResourceName: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Str255, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -4388,6 +4593,7 @@ SetResourceName: ; NewXWindow(Rect, Str31, Boolean, word) -> WindowPtr ; tool 0x0031, set 0x31 (?) + .section .text.NewXWindow,"ax" .globl NewXWindow NewXWindow: ; --- stash arg0 (in A/X) --- @@ -4397,12 +4603,12 @@ NewXWindow: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Str31, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4410,7 +4616,7 @@ NewXWindow: lda 20, s pha ; --- arg3 (word, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -4422,22 +4628,24 @@ NewXWindow: ; CloseXWindow(WindowPtr) -> void ; tool 0x0033, set 0x33 (?) + .section .text.CloseXWindow,"ax" .globl CloseXWindow CloseXWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0033 jsl 0xe100a8 rtl ; GetXWindowValue(WindowPtr) -> Longint ; tool 0x0037, set 0x37 (?) + .section .text.GetXWindowValue,"ax" .globl GetXWindowValue GetXWindowValue: ; --- stash arg0 (in A/X) --- @@ -4447,10 +4655,10 @@ GetXWindowValue: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0037 jsl 0xe100a8 pla ; result lo -> A @@ -4459,18 +4667,19 @@ GetXWindowValue: ; SetXWIdleTime(WindowPtr, Longint) -> void ; tool 0x0032, set 0x32 (MediaControl2) + .section .text.SetXWIdleTime,"ax" .globl SetXWIdleTime SetXWIdleTime: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Longint, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4480,18 +4689,19 @@ SetXWIdleTime: ; SetXWindowValue(WindowPtr, Longint) -> void ; tool 0x0036, set 0x36 (?) + .section .text.SetXWindowValue,"ax" .globl SetXWindowValue SetXWindowValue: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Longint, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4501,16 +4711,17 @@ SetXWindowValue: ; XWAllowReEntrancy(WindowPtr, Boolean, Boolean) -> void ; tool 0x0038, set 0x38 (?) + .section .text.XWAllowReEntrancy,"ax" .globl XWAllowReEntrancy XWAllowReEntrancy: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Boolean, 2B) --- lda 8, s pha @@ -4523,6 +4734,7 @@ XWAllowReEntrancy: ; Dec2Int(Pointer, Word, Boolean) -> Integer ; tool 0x280B, set 0x0B (IntegerMath) + .section .text.Dec2Int,"ax" .globl Dec2Int Dec2Int: ; --- stash arg0 (in A/X) --- @@ -4531,10 +4743,10 @@ Dec2Int: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -4548,6 +4760,7 @@ Dec2Int: ; Dec2Long(Pointer, Word, Boolean) -> Longint ; tool 0x290B, set 0x0B (IntegerMath) + .section .text.Dec2Long,"ax" .globl Dec2Long Dec2Long: ; --- stash arg0 (in A/X) --- @@ -4557,10 +4770,10 @@ Dec2Long: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha @@ -4575,6 +4788,7 @@ Dec2Long: ; Fix2Frac(Fixed) -> Frac ; tool 0x1C0B, set 0x0B (IntegerMath) + .section .text.Fix2Frac,"ax" .globl Fix2Frac Fix2Frac: ; --- stash arg0 (in A/X) --- @@ -4584,10 +4798,10 @@ Fix2Frac: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1C0B jsl 0xe10000 pla ; result lo -> A @@ -4596,6 +4810,7 @@ Fix2Frac: ; Fix2Long(Fixed) -> Longint ; tool 0x1B0B, set 0x0B (IntegerMath) + .section .text.Fix2Long,"ax" .globl Fix2Long Fix2Long: ; --- stash arg0 (in A/X) --- @@ -4605,10 +4820,10 @@ Fix2Long: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1B0B jsl 0xe10000 pla ; result lo -> A @@ -4617,18 +4832,19 @@ Fix2Long: ; Fix2X(Fixed, ExtendedPtr) -> void ; tool 0x1E0B, set 0x0B (IntegerMath) + .section .text.Fix2X,"ax" .globl Fix2X Fix2X: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ExtendedPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4638,6 +4854,7 @@ Fix2X: ; FixATan2(Longint, Longint) -> Fixed ; tool 0x170B, set 0x0B (IntegerMath) + .section .text.FixATan2,"ax" .globl FixATan2 FixATan2: ; --- stash arg0 (in A/X) --- @@ -4647,12 +4864,12 @@ FixATan2: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Longint, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4664,6 +4881,7 @@ FixATan2: ; FixDiv(Longint, Longint) -> Fixed ; tool 0x110B, set 0x0B (IntegerMath) + .section .text.FixDiv,"ax" .globl FixDiv FixDiv: ; --- stash arg0 (in A/X) --- @@ -4673,12 +4891,12 @@ FixDiv: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Longint, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4690,6 +4908,7 @@ FixDiv: ; FixMul(Fixed, Fixed) -> Fixed ; tool 0x0F0B, set 0x0B (IntegerMath) + .section .text.FixMul,"ax" .globl FixMul FixMul: ; --- stash arg0 (in A/X) --- @@ -4699,12 +4918,12 @@ FixMul: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Fixed, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4716,6 +4935,7 @@ FixMul: ; FixRatio(Integer, Integer) -> Fixed ; tool 0x0E0B, set 0x0B (IntegerMath) + .section .text.FixRatio,"ax" .globl FixRatio FixRatio: ; --- stash arg0 (in A) --- @@ -4737,6 +4957,7 @@ FixRatio: ; FixRound(Fixed) -> Integer ; tool 0x130B, set 0x0B (IntegerMath) + .section .text.FixRound,"ax" .globl FixRound FixRound: ; --- stash arg0 (in A/X) --- @@ -4745,10 +4966,10 @@ FixRound: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x130B jsl 0xe10000 pla ; result -> A @@ -4756,6 +4977,7 @@ FixRound: ; Frac2Fix(Frac) -> Fixed ; tool 0x1D0B, set 0x0B (IntegerMath) + .section .text.Frac2Fix,"ax" .globl Frac2Fix Frac2Fix: ; --- stash arg0 (in A/X) --- @@ -4765,10 +4987,10 @@ Frac2Fix: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1D0B jsl 0xe10000 pla ; result lo -> A @@ -4777,18 +4999,19 @@ Frac2Fix: ; Frac2X(Frac, ExtendedPtr) -> void ; tool 0x1F0B, set 0x0B (IntegerMath) + .section .text.Frac2X,"ax" .globl Frac2X Frac2X: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ExtendedPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -4798,6 +5021,7 @@ Frac2X: ; FracCos(Fixed) -> Frac ; tool 0x150B, set 0x0B (IntegerMath) + .section .text.FracCos,"ax" .globl FracCos FracCos: ; --- stash arg0 (in A/X) --- @@ -4807,10 +5031,10 @@ FracCos: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x150B jsl 0xe10000 pla ; result lo -> A @@ -4819,6 +5043,7 @@ FracCos: ; FracDiv(Longint, Longint) -> Frac ; tool 0x120B, set 0x0B (IntegerMath) + .section .text.FracDiv,"ax" .globl FracDiv FracDiv: ; --- stash arg0 (in A/X) --- @@ -4828,12 +5053,12 @@ FracDiv: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Longint, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4845,6 +5070,7 @@ FracDiv: ; FracMul(Frac, Frac) -> Frac ; tool 0x100B, set 0x0B (IntegerMath) + .section .text.FracMul,"ax" .globl FracMul FracMul: ; --- stash arg0 (in A/X) --- @@ -4854,12 +5080,12 @@ FracMul: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Frac, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -4871,6 +5097,7 @@ FracMul: ; FracSin(Fixed) -> Frac ; tool 0x160B, set 0x0B (IntegerMath) + .section .text.FracSin,"ax" .globl FracSin FracSin: ; --- stash arg0 (in A/X) --- @@ -4880,10 +5107,10 @@ FracSin: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x160B jsl 0xe10000 pla ; result lo -> A @@ -4892,6 +5119,7 @@ FracSin: ; FracSqrt(Frac) -> Frac ; tool 0x140B, set 0x0B (IntegerMath) + .section .text.FracSqrt,"ax" .globl FracSqrt FracSqrt: ; --- stash arg0 (in A/X) --- @@ -4901,10 +5129,10 @@ FracSqrt: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x140B jsl 0xe10000 pla ; result lo -> A @@ -4913,6 +5141,7 @@ FracSqrt: ; Hex2Int(Pointer, Word) -> Word ; tool 0x240B, set 0x0B (IntegerMath) + .section .text.Hex2Int,"ax" .globl Hex2Int Hex2Int: ; --- stash arg0 (in A/X) --- @@ -4921,10 +5150,10 @@ Hex2Int: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -4935,6 +5164,7 @@ Hex2Int: ; Hex2Long(Pointer, Word) -> LongWord ; tool 0x250B, set 0x0B (IntegerMath) + .section .text.Hex2Long,"ax" .globl Hex2Long Hex2Long: ; --- stash arg0 (in A/X) --- @@ -4944,10 +5174,10 @@ Hex2Long: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha @@ -4959,6 +5189,7 @@ Hex2Long: ; HexIt(Word) -> LongWord ; tool 0x2A0B, set 0x0B (IntegerMath) + .section .text.HexIt,"ax" .globl HexIt HexIt: ; --- stash arg0 (in A) --- @@ -4977,6 +5208,7 @@ HexIt: ; HiWord(LongWord) -> Word ; tool 0x180B, set 0x0B (IntegerMath) + .section .text.HiWord,"ax" .globl HiWord HiWord: ; --- stash arg0 (in A/X) --- @@ -4985,10 +5217,10 @@ HiWord: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x180B jsl 0xe10000 pla ; result -> A @@ -4996,6 +5228,7 @@ HiWord: ; Int2Dec(Integer, Pointer, Word, Boolean) -> void ; tool 0x260B, set 0x0B (IntegerMath) + .section .text.Int2Dec,"ax" .globl Int2Dec Int2Dec: ; --- stash arg0 (in A) --- @@ -5004,7 +5237,7 @@ Int2Dec: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -5020,6 +5253,7 @@ Int2Dec: ; Int2Hex(Word, Pointer, Word) -> void ; tool 0x220B, set 0x0B (IntegerMath) + .section .text.Int2Hex,"ax" .globl Int2Hex Int2Hex: ; --- stash arg0 (in A) --- @@ -5028,7 +5262,7 @@ Int2Hex: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -5041,18 +5275,19 @@ Int2Hex: ; Long2Dec(Longint, Pointer, Word, Boolean) -> void ; tool 0x270B, set 0x0B (IntegerMath) + .section .text.Long2Dec,"ax" .globl Long2Dec Long2Dec: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5068,6 +5303,7 @@ Long2Dec: ; Long2Fix(Longint) -> Fixed ; tool 0x1A0B, set 0x0B (IntegerMath) + .section .text.Long2Fix,"ax" .globl Long2Fix Long2Fix: ; --- stash arg0 (in A/X) --- @@ -5077,10 +5313,10 @@ Long2Fix: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1A0B jsl 0xe10000 pla ; result lo -> A @@ -5089,18 +5325,19 @@ Long2Fix: ; Long2Hex(LongWord, Pointer, Word) -> void ; tool 0x230B, set 0x0B (IntegerMath) + .section .text.Long2Hex,"ax" .globl Long2Hex Long2Hex: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5113,6 +5350,7 @@ Long2Hex: ; LoWord(LongWord) -> Word ; tool 0x190B, set 0x0B (IntegerMath) + .section .text.LoWord,"ax" .globl LoWord LoWord: ; --- stash arg0 (in A/X) --- @@ -5121,10 +5359,10 @@ LoWord: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x190B jsl 0xe10000 pla ; result -> A @@ -5132,6 +5370,7 @@ LoWord: ; Multiply(Integer, Integer) -> Longint ; tool 0x090B, set 0x0B (IntegerMath) + .section .text.Multiply,"ax" .globl Multiply Multiply: ; --- stash arg0 (in A) --- @@ -5153,6 +5392,7 @@ Multiply: ; X2Fix(ExtendedPtr) -> Fixed ; tool 0x200B, set 0x0B (IntegerMath) + .section .text.X2Fix,"ax" .globl X2Fix X2Fix: ; --- stash arg0 (in A/X) --- @@ -5162,10 +5402,10 @@ X2Fix: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x200B jsl 0xe10000 pla ; result lo -> A @@ -5174,6 +5414,7 @@ X2Fix: ; X2Frac(ExtendedPtr) -> Frac ; tool 0x210B, set 0x0B (IntegerMath) + .section .text.X2Frac,"ax" .globl X2Frac X2Frac: ; --- stash arg0 (in A/X) --- @@ -5183,10 +5424,10 @@ X2Frac: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x210B jsl 0xe10000 pla ; result lo -> A @@ -5195,6 +5436,7 @@ X2Frac: ; LEStartUp(Word, Word) -> void ; tool 0x0214, set 0x14 (LineEdit) + .section .text.LEStartUp,"ax" .globl LEStartUp LEStartUp: ; --- stash arg0 (in A) --- @@ -5211,34 +5453,36 @@ LEStartUp: ; LEActivate(LERecHndl) -> void ; tool 0x0F14, set 0x14 (LineEdit) + .section .text.LEActivate,"ax" .globl LEActivate LEActivate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F14 jsl 0xe10000 rtl ; LEClick(EventRecordPtr, LERecHndl) -> void ; tool 0x0D14, set 0x14 (LineEdit) + .section .text.LEClick,"ax" .globl LEClick LEClick: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (LERecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5248,86 +5492,92 @@ LEClick: ; LECopy(LERecHndl) -> void ; tool 0x1314, set 0x14 (LineEdit) + .section .text.LECopy,"ax" .globl LECopy LECopy: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1314 jsl 0xe10000 rtl ; LECut(LERecHndl) -> void ; tool 0x1214, set 0x14 (LineEdit) + .section .text.LECut,"ax" .globl LECut LECut: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1214 jsl 0xe10000 rtl ; LEDeactivate(LERecHndl) -> void ; tool 0x1014, set 0x14 (LineEdit) + .section .text.LEDeactivate,"ax" .globl LEDeactivate LEDeactivate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1014 jsl 0xe10000 rtl ; LEDelete(LERecHndl) -> void ; tool 0x1514, set 0x14 (LineEdit) + .section .text.LEDelete,"ax" .globl LEDelete LEDelete: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1514 jsl 0xe10000 rtl ; LEDispose(LERecHndl) -> void ; tool 0x0A14, set 0x14 (LineEdit) + .section .text.LEDispose,"ax" .globl LEDispose LEDispose: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0A14 jsl 0xe10000 rtl ; LEGetTextHand(LERecHndl) -> Handle ; tool 0x2214, set 0x14 (LineEdit) + .section .text.LEGetTextHand,"ax" .globl LEGetTextHand LEGetTextHand: ; --- stash arg0 (in A/X) --- @@ -5337,10 +5587,10 @@ LEGetTextHand: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2214 jsl 0xe10000 pla ; result lo -> A @@ -5349,6 +5599,7 @@ LEGetTextHand: ; LEGetTextLen(LERecHndl) -> Word ; tool 0x2314, set 0x14 (LineEdit) + .section .text.LEGetTextLen,"ax" .globl LEGetTextLen LEGetTextLen: ; --- stash arg0 (in A/X) --- @@ -5357,10 +5608,10 @@ LEGetTextLen: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2314 jsl 0xe10000 pla ; result -> A @@ -5368,37 +5619,39 @@ LEGetTextLen: ; LEIdle(LERecHndl) -> void ; tool 0x0C14, set 0x14 (LineEdit) + .section .text.LEIdle,"ax" .globl LEIdle LEIdle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C14 jsl 0xe10000 rtl ; LEInsert(Pointer, Word, LERecHndl) -> void ; tool 0x1614, set 0x14 (LineEdit) + .section .text.LEInsert,"ax" .globl LEInsert LEInsert: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (LERecHndl, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5408,6 +5661,7 @@ LEInsert: ; LEKey(Word, Word, LERecHndl) -> void ; tool 0x1114, set 0x14 (LineEdit) + .section .text.LEKey,"ax" .globl LEKey LEKey: ; --- stash arg0 (in A) --- @@ -5419,7 +5673,7 @@ LEKey: lda 6, s pha ; --- arg2 (LERecHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -5429,6 +5683,7 @@ LEKey: ; LENew(Rect, Rect, Word) -> LERecHndl ; tool 0x0914, set 0x14 (LineEdit) + .section .text.LENew,"ax" .globl LENew LENew: ; --- stash arg0 (in A/X) --- @@ -5438,12 +5693,12 @@ LENew: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5458,22 +5713,24 @@ LENew: ; LEPaste(LERecHndl) -> void ; tool 0x1414, set 0x14 (LineEdit) + .section .text.LEPaste,"ax" .globl LEPaste LEPaste: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1414 jsl 0xe10000 rtl ; LEScrapHandle(void) -> Handle ; tool 0x1B14, set 0x14 (LineEdit) + .section .text.LEScrapHandle,"ax" .globl LEScrapHandle LEScrapHandle: ; --- result space (4 bytes) --- @@ -5487,18 +5744,19 @@ LEScrapHandle: ; LESetCaret(VoidProcPtr, LERecHndl) -> void ; tool 0x1F14, set 0x14 (LineEdit) + .section .text.LESetCaret,"ax" .globl LESetCaret LESetCaret: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (LERecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5508,18 +5766,19 @@ LESetCaret: ; LESetHilite(VoidProcPtr, LERecHndl) -> void ; tool 0x1E14, set 0x14 (LineEdit) + .section .text.LESetHilite,"ax" .globl LESetHilite LESetHilite: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (LERecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5529,6 +5788,7 @@ LESetHilite: ; LESetJust(Word, LERecHndl) -> void ; tool 0x2114, set 0x14 (LineEdit) + .section .text.LESetJust,"ax" .globl LESetJust LESetJust: ; --- stash arg0 (in A) --- @@ -5537,7 +5797,7 @@ LESetJust: lda 0xE0 pha ; --- arg1 (LERecHndl, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -5547,6 +5807,7 @@ LESetJust: ; LESetSelect(Word, Word, LERecHndl) -> void ; tool 0x0E14, set 0x14 (LineEdit) + .section .text.LESetSelect,"ax" .globl LESetSelect LESetSelect: ; --- stash arg0 (in A) --- @@ -5558,7 +5819,7 @@ LESetSelect: lda 6, s pha ; --- arg2 (LERecHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -5568,21 +5829,22 @@ LESetSelect: ; LESetText(Pointer, Word, LERecHndl) -> void ; tool 0x0B14, set 0x14 (LineEdit) + .section .text.LESetText,"ax" .globl LESetText LESetText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (LERecHndl, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5592,21 +5854,22 @@ LESetText: ; LETextBox(Pointer, Word, Rect, Word) -> void ; tool 0x1814, set 0x14 (LineEdit) + .section .text.LETextBox,"ax" .globl LETextBox LETextBox: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5619,21 +5882,22 @@ LETextBox: ; LETextBox2(Pointer, Word, Rect, Word) -> void ; tool 0x2014, set 0x14 (LineEdit) + .section .text.LETextBox2,"ax" .globl LETextBox2 LETextBox2: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5646,22 +5910,24 @@ LETextBox2: ; LEUpdate(LERecHndl) -> void ; tool 0x1714, set 0x14 (LineEdit) + .section .text.LEUpdate,"ax" .globl LEUpdate LEUpdate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1714 jsl 0xe10000 rtl ; GetLEDefProc(void) -> Pointer ; tool 0x2414, set 0x14 (LineEdit) + .section .text.GetLEDefProc,"ax" .globl GetLEDefProc GetLEDefProc: ; --- result space (4 bytes) --- @@ -5675,6 +5941,7 @@ GetLEDefProc: ; LEClassifyKey(EventRecordPtr) -> Word ; tool 0x2514, set 0x14 (LineEdit) + .section .text.LEClassifyKey,"ax" .globl LEClassifyKey LEClassifyKey: ; --- stash arg0 (in A/X) --- @@ -5683,10 +5950,10 @@ LEClassifyKey: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2514 jsl 0xe10000 pla ; result -> A @@ -5694,6 +5961,7 @@ LEClassifyKey: ; CreateList(GrafPortPtr, ListRecPtr) -> ListCtlRecHndl ; tool 0x091C, set 0x1C (ListManager) + .section .text.CreateList,"ax" .globl CreateList CreateList: ; --- stash arg0 (in A/X) --- @@ -5703,12 +5971,12 @@ CreateList: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ListRecPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5720,18 +5988,19 @@ CreateList: ; DrawMember(MemRecPtr, ListRecPtr) -> void ; tool 0x0C1C, set 0x1C (ListManager) + .section .text.DrawMember,"ax" .globl DrawMember DrawMember: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ListRecPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5741,6 +6010,7 @@ DrawMember: ; GetListDefProc(void) -> LongProcPtr ; tool 0x0E1C, set 0x1C (ListManager) + .section .text.GetListDefProc,"ax" .globl GetListDefProc GetListDefProc: ; --- result space (4 bytes) --- @@ -5754,18 +6024,19 @@ GetListDefProc: ; NewList(MemRecPtr, ListRecPtr) -> void ; tool 0x101C, set 0x1C (ListManager) + .section .text.NewList,"ax" .globl NewList NewList: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ListRecPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5775,6 +6046,7 @@ NewList: ; NextMember(MemRecPtr, ListRecPtr) -> MemRecPtr ; tool 0x0B1C, set 0x1C (ListManager) + .section .text.NextMember,"ax" .globl NextMember NextMember: ; --- stash arg0 (in A/X) --- @@ -5784,12 +6056,12 @@ NextMember: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ListRecPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5801,6 +6073,7 @@ NextMember: ; ResetMember(ListRecPtr) -> MemRecPtr ; tool 0x0F1C, set 0x1C (ListManager) + .section .text.ResetMember,"ax" .globl ResetMember ResetMember: ; --- stash arg0 (in A/X) --- @@ -5810,10 +6083,10 @@ ResetMember: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F1C jsl 0xe10000 pla ; result lo -> A @@ -5822,18 +6095,19 @@ ResetMember: ; SelectMember(MemRecPtr, ListRecPtr) -> void ; tool 0x0D1C, set 0x1C (ListManager) + .section .text.SelectMember,"ax" .globl SelectMember SelectMember: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ListRecPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5843,18 +6117,19 @@ SelectMember: ; SortList(VoidProcPtr, ListRecPtr) -> void ; tool 0x0A1C, set 0x1C (ListManager) + .section .text.SortList,"ax" .globl SortList SortList: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (ListRecPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5864,6 +6139,7 @@ SortList: ; DrawMember2(Word, Handle) -> void ; tool 0x111C, set 0x1C (ListManager) + .section .text.DrawMember2,"ax" .globl DrawMember2 DrawMember2: ; --- stash arg0 (in A) --- @@ -5872,7 +6148,7 @@ DrawMember2: lda 0xE0 pha ; --- arg1 (Handle, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -5882,21 +6158,22 @@ DrawMember2: ; NewList2(Pointer, Word, Ref, Word, Word, Handle) -> void ; tool 0x161C, set 0x1C (ListManager) + .section .text.NewList2,"ax" .globl NewList2 NewList2: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Ref, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -5907,7 +6184,7 @@ NewList2: lda 24, s pha ; --- arg5 (Handle, 4B) --- - lda 28, s + lda 30, s pha lda 30, s pha @@ -5917,6 +6194,7 @@ NewList2: ; NextMember2(Word, Handle) -> Word ; tool 0x121C, set 0x1C (ListManager) + .section .text.NextMember2,"ax" .globl NextMember2 NextMember2: ; --- stash arg0 (in A) --- @@ -5927,7 +6205,7 @@ NextMember2: lda 0xE0 pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5938,6 +6216,7 @@ NextMember2: ; ResetMember2(Handle) -> Word ; tool 0x131C, set 0x1C (ListManager) + .section .text.ResetMember2,"ax" .globl ResetMember2 ResetMember2: ; --- stash arg0 (in A/X) --- @@ -5946,10 +6225,10 @@ ResetMember2: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x131C jsl 0xe10000 pla ; result -> A @@ -5957,6 +6236,7 @@ ResetMember2: ; SelectMember2(Word, Handle) -> void ; tool 0x141C, set 0x1C (ListManager) + .section .text.SelectMember2,"ax" .globl SelectMember2 SelectMember2: ; --- stash arg0 (in A) --- @@ -5965,7 +6245,7 @@ SelectMember2: lda 0xE0 pha ; --- arg1 (Handle, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -5975,18 +6255,19 @@ SelectMember2: ; SortList2(Pointer, Handle) -> void ; tool 0x151C, set 0x1C (ListManager) + .section .text.SortList2,"ax" .globl SortList2 SortList2: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -5996,6 +6277,7 @@ SortList2: ; CompareStrings(Word, Ptr, Ptr) -> Word ; tool 0x181C, set 0x1C (ListManager) + .section .text.CompareStrings,"ax" .globl CompareStrings CompareStrings: ; --- stash arg0 (in A) --- @@ -6006,12 +6288,12 @@ CompareStrings: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Ptr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -6022,6 +6304,7 @@ CompareStrings: ; ListKey(Word, EventRecordPtr, CtlRecHndl) -> void ; tool 0x171C, set 0x1C (ListManager) + .section .text.ListKey,"ax" .globl ListKey ListKey: ; --- stash arg0 (in A) --- @@ -6030,12 +6313,12 @@ ListKey: lda 0xE0 pha ; --- arg1 (EventRecordPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (CtlRecHndl, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -6045,6 +6328,7 @@ ListKey: ; GetLoadSegInfo(Word, Word, Word, Pointer) -> void ; tool 0x0F11, set 0x11 (Loader) + .section .text.GetLoadSegInfo,"ax" .globl GetLoadSegInfo GetLoadSegInfo: ; --- stash arg0 (in A) --- @@ -6059,7 +6343,7 @@ GetLoadSegInfo: lda 10, s pha ; --- arg3 (Pointer, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -6069,6 +6353,7 @@ GetLoadSegInfo: ; GetUserID(Pointer) -> Word ; tool 0x1011, set 0x11 (Loader) + .section .text.GetUserID,"ax" .globl GetUserID GetUserID: ; --- stash arg0 (in A/X) --- @@ -6077,10 +6362,10 @@ GetUserID: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1011 jsl 0xe10000 pla ; result -> A @@ -6088,6 +6373,7 @@ GetUserID: ; GetUserID2(Pointer) -> Word ; tool 0x2111, set 0x11 (Loader) + .section .text.GetUserID2,"ax" .globl GetUserID2 GetUserID2: ; --- stash arg0 (in A/X) --- @@ -6096,10 +6382,10 @@ GetUserID2: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2111 jsl 0xe10000 pla ; result -> A @@ -6107,6 +6393,7 @@ GetUserID2: ; LGetPathname(Word, Word) -> Pointer ; tool 0x1111, set 0x11 (Loader) + .section .text.LGetPathname,"ax" .globl LGetPathname LGetPathname: ; --- stash arg0 (in A) --- @@ -6128,6 +6415,7 @@ LGetPathname: ; LGetPathname2(Word, Word) -> Pointer ; tool 0x2211, set 0x11 (Loader) + .section .text.LGetPathname2,"ax" .globl LGetPathname2 LGetPathname2: ; --- stash arg0 (in A) --- @@ -6149,6 +6437,7 @@ LGetPathname2: ; LoadSegNum(Word, Word, Word) -> Pointer ; tool 0x0B11, set 0x11 (Loader) + .section .text.LoadSegNum,"ax" .globl LoadSegNum LoadSegNum: ; --- stash arg0 (in A) --- @@ -6173,18 +6462,19 @@ LoadSegNum: ; RenamePathname(Pointer, Pointer) -> void ; tool 0x1311, set 0x11 (Loader) + .section .text.RenamePathname,"ax" .globl RenamePathname RenamePathname: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -6194,6 +6484,7 @@ RenamePathname: ; UnloadSegNum(Word, Word, Word) -> void ; tool 0x0C11, set 0x11 (Loader) + .section .text.UnloadSegNum,"ax" .globl UnloadSegNum UnloadSegNum: ; --- stash arg0 (in A) --- @@ -6213,6 +6504,7 @@ UnloadSegNum: ; UserShutDown(Word, Word) -> Word ; tool 0x1211, set 0x11 (Loader) + .section .text.UserShutDown,"ax" .globl UserShutDown UserShutDown: ; --- stash arg0 (in A) --- @@ -6232,6 +6524,7 @@ UserShutDown: ; GetPathname(void) -> Pointer ; tool 0x1111, set 0x11 (Loader) + .section .text.GetPathname,"ax" .globl GetPathname GetPathname: ; --- result space (4 bytes) --- @@ -6245,6 +6538,7 @@ GetPathname: ; GetPathname2(void) -> Pointer ; tool 0x2211, set 0x11 (Loader) + .section .text.GetPathname2,"ax" .globl GetPathname2 GetPathname2: ; --- result space (4 bytes) --- @@ -6258,6 +6552,7 @@ GetPathname2: ; GetFuncPtr(Word, Word) -> Pointer ; tool 0x0B01, set 0x01 (ToolLocator) + .section .text.GetFuncPtr,"ax" .globl GetFuncPtr GetFuncPtr: ; --- stash arg0 (in A) --- @@ -6279,6 +6574,7 @@ GetFuncPtr: ; GetTSPtr(Word, Word) -> Pointer ; tool 0x0901, set 0x01 (ToolLocator) + .section .text.GetTSPtr,"ax" .globl GetTSPtr GetTSPtr: ; --- stash arg0 (in A) --- @@ -6300,6 +6596,7 @@ GetTSPtr: ; GetWAP(Word, Word) -> Pointer ; tool 0x0C01, set 0x01 (ToolLocator) + .section .text.GetWAP,"ax" .globl GetWAP GetWAP: ; --- stash arg0 (in A) --- @@ -6321,6 +6618,7 @@ GetWAP: ; LoadOneTool(Word, Word) -> void ; tool 0x0F01, set 0x01 (ToolLocator) + .section .text.LoadOneTool,"ax" .globl LoadOneTool LoadOneTool: ; --- stash arg0 (in A) --- @@ -6337,22 +6635,24 @@ LoadOneTool: ; LoadTools(Pointer) -> void ; tool 0x0E01, set 0x01 (ToolLocator) + .section .text.LoadTools,"ax" .globl LoadTools LoadTools: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E01 jsl 0xe10000 rtl ; MessageCenter(Word, Word, Handle) -> void ; tool 0x1501, set 0x01 (ToolLocator) + .section .text.MessageCenter,"ax" .globl MessageCenter MessageCenter: ; --- stash arg0 (in A) --- @@ -6364,7 +6664,7 @@ MessageCenter: lda 6, s pha ; --- arg2 (Handle, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -6374,22 +6674,24 @@ MessageCenter: ; RestoreTextState(Handle) -> void ; tool 0x1401, set 0x01 (ToolLocator) + .section .text.RestoreTextState,"ax" .globl RestoreTextState RestoreTextState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1401 jsl 0xe10000 rtl ; SaveTextState(void) -> Handle ; tool 0x1301, set 0x01 (ToolLocator) + .section .text.SaveTextState,"ax" .globl SaveTextState SaveTextState: ; --- result space (4 bytes) --- @@ -6403,6 +6705,7 @@ SaveTextState: ; SetTSPtr(Word, Word, Pointer) -> void ; tool 0x0A01, set 0x01 (ToolLocator) + .section .text.SetTSPtr,"ax" .globl SetTSPtr SetTSPtr: ; --- stash arg0 (in A) --- @@ -6414,7 +6717,7 @@ SetTSPtr: lda 6, s pha ; --- arg2 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -6424,6 +6727,7 @@ SetTSPtr: ; SetWAP(Word, Word, Pointer) -> void ; tool 0x0D01, set 0x01 (ToolLocator) + .section .text.SetWAP,"ax" .globl SetWAP SetWAP: ; --- stash arg0 (in A) --- @@ -6435,7 +6739,7 @@ SetWAP: lda 6, s pha ; --- arg2 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -6445,6 +6749,7 @@ SetWAP: ; TLMountVolume(Integer, Integer, Pointer, Pointer, Pointer, Pointer) -> Word ; tool 0x1101, set 0x01 (ToolLocator) + .section .text.TLMountVolume,"ax" .globl TLMountVolume TLMountVolume: ; --- stash arg0 (in A) --- @@ -6458,22 +6763,22 @@ TLMountVolume: lda 8, s pha ; --- arg2 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg3 (Pointer, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha ; --- arg4 (Pointer, 4B) --- - lda 28, s + lda 30, s pha lda 30, s pha ; --- arg5 (Pointer, 4B) --- - lda 36, s + lda 38, s pha lda 38, s pha @@ -6484,6 +6789,7 @@ TLMountVolume: ; TLTextMountVolume(Pointer, Pointer, Pointer, Pointer) -> Word ; tool 0x1201, set 0x01 (ToolLocator) + .section .text.TLTextMountVolume,"ax" .globl TLTextMountVolume TLTextMountVolume: ; --- stash arg0 (in A/X) --- @@ -6492,22 +6798,22 @@ TLTextMountVolume: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Pointer, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha ; --- arg3 (Pointer, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha @@ -6518,6 +6824,7 @@ TLTextMountVolume: ; MessageByName(Boolean, Pointer) -> ResponseRecord ; tool 0x1701, set 0x01 (ToolLocator) + .section .text.MessageByName,"ax" .globl MessageByName MessageByName: ; --- stash arg0 (in A) --- @@ -6529,7 +6836,7 @@ MessageByName: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -6541,6 +6848,7 @@ MessageByName: ; ShutDownTools(Word, Ref) -> void ; tool 0x1901, set 0x01 (ToolLocator) + .section .text.ShutDownTools,"ax" .globl ShutDownTools ShutDownTools: ; --- stash arg0 (in A) --- @@ -6549,7 +6857,7 @@ ShutDownTools: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -6559,6 +6867,7 @@ ShutDownTools: ; StartUpTools(Word, Word, Ref) -> Ref ; tool 0x1801, set 0x01 (ToolLocator) + .section .text.StartUpTools,"ax" .globl StartUpTools StartUpTools: ; --- stash arg0 (in A) --- @@ -6573,7 +6882,7 @@ StartUpTools: lda 10, s pha ; --- arg2 (Ref, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -6585,21 +6894,22 @@ StartUpTools: ; AcceptRequests(Pointer, Word, WordProcPtr) -> void ; tool 0x1B01, set 0x01 (ToolLocator) + .section .text.AcceptRequests,"ax" .globl AcceptRequests AcceptRequests: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (WordProcPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -6609,6 +6919,7 @@ AcceptRequests: ; GetMsgHandle(Word, Long) -> Handle ; tool 0x1A01, set 0x01 (ToolLocator) + .section .text.GetMsgHandle,"ax" .globl GetMsgHandle GetMsgHandle: ; --- stash arg0 (in A) --- @@ -6620,7 +6931,7 @@ GetMsgHandle: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -6632,6 +6943,7 @@ GetMsgHandle: ; SendRequest(Word, Word, Long, Long, Ptr) -> void ; tool 0x1C01, set 0x01 (ToolLocator) + .section .text.SendRequest,"ax" .globl SendRequest SendRequest: ; --- stash arg0 (in A) --- @@ -6643,17 +6955,17 @@ SendRequest: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (Long, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha ; --- arg4 (Ptr, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha @@ -6663,6 +6975,7 @@ SendRequest: ; MCBinToTime(Long) -> Long ; tool 0x0D26, set 0x26 (?) + .section .text.MCBinToTime,"ax" .globl MCBinToTime MCBinToTime: ; --- stash arg0 (in A/X) --- @@ -6672,10 +6985,10 @@ MCBinToTime: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0D26 jsl 0xe10000 pla ; result lo -> A @@ -6684,6 +6997,7 @@ MCBinToTime: ; MCControl(Word, Word) -> void ; tool 0x1B26, set 0x26 (?) + .section .text.MCControl,"ax" .globl MCControl MCControl: ; --- stash arg0 (in A) --- @@ -6700,6 +7014,7 @@ MCControl: ; MCDStartUp(Word, Ptr, Word) -> void ; tool 0x1426, set 0x26 (?) + .section .text.MCDStartUp,"ax" .globl MCDStartUp MCDStartUp: ; --- stash arg0 (in A) --- @@ -6708,7 +7023,7 @@ MCDStartUp: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -6721,6 +7036,7 @@ MCDStartUp: ; MCGetDiscID(Word) -> Long ; tool 0x2826, set 0x26 (?) + .section .text.MCGetDiscID,"ax" .globl MCGetDiscID MCGetDiscID: ; --- stash arg0 (in A) --- @@ -6739,18 +7055,19 @@ MCGetDiscID: ; MCGetDiscTitle(Long, Ptr) -> void ; tool 0x1226, set 0x26 (?) + .section .text.MCGetDiscTitle,"ax" .globl MCGetDiscTitle MCGetDiscTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Ptr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -6760,6 +7077,7 @@ MCGetDiscTitle: ; MCGetDiscTOC(Word, Word) -> Long ; tool 0x2726, set 0x26 (?) + .section .text.MCGetDiscTOC,"ax" .globl MCGetDiscTOC MCGetDiscTOC: ; --- stash arg0 (in A) --- @@ -6781,6 +7099,7 @@ MCGetDiscTOC: ; MCGetErrorMsg(Word, Ptr) -> void ; tool 0x0926, set 0x26 (?) + .section .text.MCGetErrorMsg,"ax" .globl MCGetErrorMsg MCGetErrorMsg: ; --- stash arg0 (in A) --- @@ -6789,7 +7108,7 @@ MCGetErrorMsg: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -6799,6 +7118,7 @@ MCGetErrorMsg: ; MCGetFeatures(Word, Word) -> Long ; tool 0x1626, set 0x26 (?) + .section .text.MCGetFeatures,"ax" .globl MCGetFeatures MCGetFeatures: ; --- stash arg0 (in A) --- @@ -6820,6 +7140,7 @@ MCGetFeatures: ; MCGetName(Word, Ptr) -> void ; tool 0x2D26, set 0x26 (?) + .section .text.MCGetName,"ax" .globl MCGetName MCGetName: ; --- stash arg0 (in A) --- @@ -6828,7 +7149,7 @@ MCGetName: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -6838,6 +7159,7 @@ MCGetName: ; MCGetPosition(Word, Word) -> Long ; tool 0x2426, set 0x26 (?) + .section .text.MCGetPosition,"ax" .globl MCGetPosition MCGetPosition: ; --- stash arg0 (in A) --- @@ -6859,18 +7181,19 @@ MCGetPosition: ; MCGetProgram(Long, Ptr) -> void ; tool 0x1026, set 0x26 (?) + .section .text.MCGetProgram,"ax" .globl MCGetProgram MCGetProgram: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Ptr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -6880,6 +7203,7 @@ MCGetProgram: ; MCGetSpeeds(Word, Ptr) -> void ; tool 0x1D26, set 0x26 (?) + .section .text.MCGetSpeeds,"ax" .globl MCGetSpeeds MCGetSpeeds: ; --- stash arg0 (in A) --- @@ -6888,7 +7212,7 @@ MCGetSpeeds: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -6898,6 +7222,7 @@ MCGetSpeeds: ; MCGetStatus(Word, Word) -> Word ; tool 0x1A26, set 0x26 (?) + .section .text.MCGetStatus,"ax" .globl MCGetStatus MCGetStatus: ; --- stash arg0 (in A) --- @@ -6917,6 +7242,7 @@ MCGetStatus: ; MCGetTimes(Word, Word) -> Long ; tool 0x2626, set 0x26 (?) + .section .text.MCGetTimes,"ax" .globl MCGetTimes MCGetTimes: ; --- stash arg0 (in A) --- @@ -6938,21 +7264,22 @@ MCGetTimes: ; MCGetTrackTitle(Long, Word, Ptr) -> void ; tool 0x0E26, set 0x26 (?) + .section .text.MCGetTrackTitle,"ax" .globl MCGetTrackTitle MCGetTrackTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Ptr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -6962,6 +7289,7 @@ MCGetTrackTitle: ; MCJog(Word, Long, Word) -> void ; tool 0x2026, set 0x26 (?) + .section .text.MCJog,"ax" .globl MCJog MCJog: ; --- stash arg0 (in A) --- @@ -6970,7 +7298,7 @@ MCJog: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -6983,6 +7311,7 @@ MCJog: ; MCScan(Word, Word) -> void ; tool 0x1C26, set 0x26 (?) + .section .text.MCScan,"ax" .globl MCScan MCScan: ; --- stash arg0 (in A) --- @@ -6999,6 +7328,7 @@ MCScan: ; MCSearchTo(Word, Word, Long) -> void ; tool 0x2126, set 0x26 (?) + .section .text.MCSearchTo,"ax" .globl MCSearchTo MCSearchTo: ; --- stash arg0 (in A) --- @@ -7010,7 +7340,7 @@ MCSearchTo: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -7020,6 +7350,7 @@ MCSearchTo: ; MCSendRawData(Word, Long) -> void ; tool 0x1926, set 0x26 (?) + .section .text.MCSendRawData,"ax" .globl MCSendRawData MCSendRawData: ; --- stash arg0 (in A) --- @@ -7028,7 +7359,7 @@ MCSendRawData: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -7038,6 +7369,7 @@ MCSendRawData: ; MCSetAudio(Word, Word) -> void ; tool 0x2526, set 0x26 (?) + .section .text.MCSetAudio,"ax" .globl MCSetAudio MCSetAudio: ; --- stash arg0 (in A) --- @@ -7054,18 +7386,19 @@ MCSetAudio: ; MCSetDiscTitle(Long, Long) -> void ; tool 0x1326, set 0x26 (?) + .section .text.MCSetDiscTitle,"ax" .globl MCSetDiscTitle MCSetDiscTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -7075,18 +7408,19 @@ MCSetDiscTitle: ; MCSetProgram(Long, Long) -> void ; tool 0x1126, set 0x26 (?) + .section .text.MCSetProgram,"ax" .globl MCSetProgram MCSetProgram: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -7096,21 +7430,22 @@ MCSetProgram: ; MCSetTrackTitle(Long, Word, Ptr) -> void ; tool 0x0F26, set 0x26 (?) + .section .text.MCSetTrackTitle,"ax" .globl MCSetTrackTitle MCSetTrackTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Ptr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -7120,6 +7455,7 @@ MCSetTrackTitle: ; MCSetVolume(Word, Word, Word) -> void ; tool 0x2E26, set 0x26 (?) + .section .text.MCSetVolume,"ax" .globl MCSetVolume MCSetVolume: ; --- stash arg0 (in A) --- @@ -7139,6 +7475,7 @@ MCSetVolume: ; MCSpeed(Word, Word) -> void ; tool 0x1E26, set 0x26 (?) + .section .text.MCSpeed,"ax" .globl MCSpeed MCSpeed: ; --- stash arg0 (in A) --- @@ -7155,6 +7492,7 @@ MCSpeed: ; MCStopAt(Word, Word, Long) -> void ; tool 0x1F26, set 0x26 (?) + .section .text.MCStopAt,"ax" .globl MCStopAt MCStopAt: ; --- stash arg0 (in A) --- @@ -7166,7 +7504,7 @@ MCStopAt: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -7176,6 +7514,7 @@ MCStopAt: ; MCTimeToBin(Long) -> Long ; tool 0x0C26, set 0x26 (?) + .section .text.MCTimeToBin,"ax" .globl MCTimeToBin MCTimeToBin: ; --- stash arg0 (in A/X) --- @@ -7185,10 +7524,10 @@ MCTimeToBin: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C26 jsl 0xe10000 pla ; result lo -> A @@ -7197,6 +7536,7 @@ MCTimeToBin: ; MCWaitRawData(Word, Ptr, Word, Word) -> void ; tool 0x2C26, set 0x26 (?) + .section .text.MCWaitRawData,"ax" .globl MCWaitRawData MCWaitRawData: ; --- stash arg0 (in A) --- @@ -7205,7 +7545,7 @@ MCWaitRawData: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -7221,23 +7561,24 @@ MCWaitRawData: ; BlockMove(Pointer, Pointer, LongWord) -> void ; tool 0x2B02, set 0x02 (MemoryManager) + .section .text.BlockMove,"ax" .globl BlockMove BlockMove: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (LongWord, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -7247,38 +7588,41 @@ BlockMove: ; CheckHandle(Handle) -> void ; tool 0x1E02, set 0x02 (MemoryManager) + .section .text.CheckHandle,"ax" .globl CheckHandle CheckHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1E02 jsl 0xe10000 rtl ; DisposeHandle(Handle) -> void ; tool 0x1002, set 0x02 (MemoryManager) + .section .text.DisposeHandle,"ax" .globl DisposeHandle DisposeHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1002 jsl 0xe10000 rtl ; FindHandle(Pointer) -> Handle ; tool 0x1A02, set 0x02 (MemoryManager) + .section .text.FindHandle,"ax" .globl FindHandle FindHandle: ; --- stash arg0 (in A/X) --- @@ -7288,10 +7632,10 @@ FindHandle: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1A02 jsl 0xe10000 pla ; result lo -> A @@ -7300,6 +7644,7 @@ FindHandle: ; FreeMem(void) -> LongWord ; tool 0x1B02, set 0x02 (MemoryManager) + .section .text.FreeMem,"ax" .globl FreeMem FreeMem: ; --- result space (4 bytes) --- @@ -7313,6 +7658,7 @@ FreeMem: ; GetHandleSize(Handle) -> LongWord ; tool 0x1802, set 0x02 (MemoryManager) + .section .text.GetHandleSize,"ax" .globl GetHandleSize GetHandleSize: ; --- stash arg0 (in A/X) --- @@ -7322,10 +7668,10 @@ GetHandleSize: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1802 jsl 0xe10000 pla ; result lo -> A @@ -7334,23 +7680,24 @@ GetHandleSize: ; HandToHand(Handle, Handle, LongWord) -> void ; tool 0x2A02, set 0x02 (MemoryManager) + .section .text.HandToHand,"ax" .globl HandToHand HandToHand: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (LongWord, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -7360,23 +7707,24 @@ HandToHand: ; HandToPtr(Handle, Pointer, LongWord) -> void ; tool 0x2902, set 0x02 (MemoryManager) + .section .text.HandToPtr,"ax" .globl HandToPtr HandToPtr: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (LongWord, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -7386,38 +7734,41 @@ HandToPtr: ; HLock(Handle) -> void ; tool 0x2002, set 0x02 (MemoryManager) + .section .text.HLock,"ax" .globl HLock HLock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2002 jsl 0xe10000 rtl ; HUnlock(Handle) -> void ; tool 0x2202, set 0x02 (MemoryManager) + .section .text.HUnlock,"ax" .globl HUnlock HUnlock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2202 jsl 0xe10000 rtl ; MaxBlock(void) -> LongWord ; tool 0x1C02, set 0x02 (MemoryManager) + .section .text.MaxBlock,"ax" .globl MaxBlock MaxBlock: ; --- result space (4 bytes) --- @@ -7431,6 +7782,7 @@ MaxBlock: ; NewHandle(LongWord, Word, Word, Pointer) -> Handle ; tool 0x0902, set 0x02 (MemoryManager) + .section .text.NewHandle,"ax" .globl NewHandle NewHandle: ; --- stash arg0 (in A/X) --- @@ -7440,10 +7792,10 @@ NewHandle: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha @@ -7451,7 +7803,7 @@ NewHandle: lda 16, s pha ; --- arg3 (Pointer, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -7463,23 +7815,24 @@ NewHandle: ; PtrToHand(Pointer, Handle, LongWord) -> void ; tool 0x2802, set 0x02 (MemoryManager) + .section .text.PtrToHand,"ax" .globl PtrToHand PtrToHand: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (LongWord, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -7489,32 +7842,34 @@ PtrToHand: ; PurgeHandle(Handle) -> void ; tool 0x1202, set 0x02 (MemoryManager) + .section .text.PurgeHandle,"ax" .globl PurgeHandle PurgeHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1202 jsl 0xe10000 rtl ; ReAllocHandle(LongWord, Word, Word, Pointer, Handle) -> void ; tool 0x0A02, set 0x02 (MemoryManager) + .section .text.ReAllocHandle,"ax" .globl ReAllocHandle ReAllocHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -7522,12 +7877,12 @@ ReAllocHandle: lda 12, s pha ; --- arg3 (Pointer, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg4 (Handle, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -7537,34 +7892,36 @@ ReAllocHandle: ; RestoreHandle(Handle) -> void ; tool 0x0B02, set 0x02 (MemoryManager) + .section .text.RestoreHandle,"ax" .globl RestoreHandle RestoreHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0B02 jsl 0xe10000 rtl ; SetHandleSize(LongWord, Handle) -> void ; tool 0x1902, set 0x02 (MemoryManager) + .section .text.SetHandleSize,"ax" .globl SetHandleSize SetHandleSize: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -7574,6 +7931,7 @@ SetHandleSize: ; SetPurge(Word, Handle) -> void ; tool 0x2402, set 0x02 (MemoryManager) + .section .text.SetPurge,"ax" .globl SetPurge SetPurge: ; --- stash arg0 (in A) --- @@ -7582,7 +7940,7 @@ SetPurge: lda 0xE0 pha ; --- arg1 (Handle, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -7592,6 +7950,7 @@ SetPurge: ; SetPurgeAll(Word, Word) -> void ; tool 0x2502, set 0x02 (MemoryManager) + .section .text.SetPurgeAll,"ax" .globl SetPurgeAll SetPurgeAll: ; --- stash arg0 (in A) --- @@ -7608,6 +7967,7 @@ SetPurgeAll: ; TotalMem(void) -> LongWord ; tool 0x1D02, set 0x02 (MemoryManager) + .section .text.TotalMem,"ax" .globl TotalMem TotalMem: ; --- result space (4 bytes) --- @@ -7621,22 +7981,24 @@ TotalMem: ; AddToOOMQueue(Pointer) -> void ; tool 0x0C02, set 0x02 (MemoryManager) + .section .text.AddToOOMQueue,"ax" .globl AddToOOMQueue AddToOOMQueue: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C02 jsl 0xe10000 rtl ; RealFreeMem(void) -> LongWord ; tool 0x2F02, set 0x02 (MemoryManager) + .section .text.RealFreeMem,"ax" .globl RealFreeMem RealFreeMem: ; --- result space (4 bytes) --- @@ -7650,22 +8012,24 @@ RealFreeMem: ; RemoveFromOOMQueue(Pointer) -> void ; tool 0x0D02, set 0x02 (MemoryManager) + .section .text.RemoveFromOOMQueue,"ax" .globl RemoveFromOOMQueue RemoveFromOOMQueue: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0D02 jsl 0xe10000 rtl ; SetHandleID(Word, Handle) -> Word ; tool 0x3002, set 0x02 (MemoryManager) + .section .text.SetHandleID,"ax" .globl SetHandleID SetHandleID: ; --- stash arg0 (in A) --- @@ -7676,7 +8040,7 @@ SetHandleID: lda 0xE0 pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -7687,6 +8051,7 @@ SetHandleID: ; MenuStartUp(Word, Word) -> void ; tool 0x020F, set 0x0F (MenuManager) + .section .text.MenuStartUp,"ax" .globl MenuStartUp MenuStartUp: ; --- stash arg0 (in A) --- @@ -7703,6 +8068,7 @@ MenuStartUp: ; CalcMenuSize(Word, Word, Word) -> void ; tool 0x1C0F, set 0x0F (MenuManager) + .section .text.CalcMenuSize,"ax" .globl CalcMenuSize CalcMenuSize: ; --- stash arg0 (in A) --- @@ -7722,6 +8088,7 @@ CalcMenuSize: ; CheckMItem(Boolean, Word) -> void ; tool 0x320F, set 0x0F (MenuManager) + .section .text.CheckMItem,"ax" .globl CheckMItem CheckMItem: ; --- stash arg0 (in A) --- @@ -7738,22 +8105,24 @@ CheckMItem: ; DisposeMenu(MenuRecHndl) -> void ; tool 0x2E0F, set 0x0F (MenuManager) + .section .text.DisposeMenu,"ax" .globl DisposeMenu DisposeMenu: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2E0F jsl 0xe10000 rtl ; GetBarColors(void) -> LongWord ; tool 0x180F, set 0x0F (MenuManager) + .section .text.GetBarColors,"ax" .globl GetBarColors GetBarColors: ; --- result space (4 bytes) --- @@ -7767,6 +8136,7 @@ GetBarColors: ; GetMenuBar(void) -> MenuBarRecHndl ; tool 0x0A0F, set 0x0F (MenuManager) + .section .text.GetMenuBar,"ax" .globl GetMenuBar GetMenuBar: ; --- result space (4 bytes) --- @@ -7780,6 +8150,7 @@ GetMenuBar: ; GetMenuMgrPort(void) -> GrafPortPtr ; tool 0x1B0F, set 0x0F (MenuManager) + .section .text.GetMenuMgrPort,"ax" .globl GetMenuMgrPort GetMenuMgrPort: ; --- result space (4 bytes) --- @@ -7793,6 +8164,7 @@ GetMenuMgrPort: ; GetMenuTitle(Word) -> Pointer ; tool 0x220F, set 0x0F (MenuManager) + .section .text.GetMenuTitle,"ax" .globl GetMenuTitle GetMenuTitle: ; --- stash arg0 (in A) --- @@ -7811,6 +8183,7 @@ GetMenuTitle: ; GetMHandle(Word) -> MenuRecHndl ; tool 0x160F, set 0x0F (MenuManager) + .section .text.GetMHandle,"ax" .globl GetMHandle GetMHandle: ; --- stash arg0 (in A) --- @@ -7829,6 +8202,7 @@ GetMHandle: ; GetMItem(Word) -> StringPtr ; tool 0x250F, set 0x0F (MenuManager) + .section .text.GetMItem,"ax" .globl GetMItem GetMItem: ; --- stash arg0 (in A) --- @@ -7847,6 +8221,7 @@ GetMItem: ; GetMItemStyle(Word) -> TextStyle ; tool 0x360F, set 0x0F (MenuManager) + .section .text.GetMItemStyle,"ax" .globl GetMItemStyle GetMItemStyle: ; --- stash arg0 (in A) --- @@ -7865,6 +8240,7 @@ GetMItemStyle: ; GetSysBar(void) -> MenuBarRecHndl ; tool 0x110F, set 0x0F (MenuManager) + .section .text.GetSysBar,"ax" .globl GetSysBar GetSysBar: ; --- result space (4 bytes) --- @@ -7878,6 +8254,7 @@ GetSysBar: ; HiliteMenu(Boolean, Word) -> void ; tool 0x2C0F, set 0x0F (MenuManager) + .section .text.HiliteMenu,"ax" .globl HiliteMenu HiliteMenu: ; --- stash arg0 (in A) --- @@ -7894,16 +8271,17 @@ HiliteMenu: ; InsertMenu(MenuRecHndl, Word) -> void ; tool 0x0D0F, set 0x0F (MenuManager) + .section .text.InsertMenu,"ax" .globl InsertMenu InsertMenu: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -7913,16 +8291,17 @@ InsertMenu: ; InsertMItem(Pointer, Word, Word) -> void ; tool 0x0F0F, set 0x0F (MenuManager) + .section .text.InsertMItem,"ax" .globl InsertMItem InsertMItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -7935,18 +8314,19 @@ InsertMItem: ; MenuKey(WmTaskRecPtr, MenuRecHndl) -> void ; tool 0x090F, set 0x0F (MenuManager) + .section .text.MenuKey,"ax" .globl MenuKey MenuKey: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (MenuRecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -7956,34 +8336,36 @@ MenuKey: ; MenuRefresh(VoidProcPtr) -> void ; tool 0x0B0F, set 0x0F (MenuManager) + .section .text.MenuRefresh,"ax" .globl MenuRefresh MenuRefresh: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0B0F jsl 0xe10000 rtl ; MenuSelect(WmTaskRecPtr, MenuRecHndl) -> void ; tool 0x2B0F, set 0x0F (MenuManager) + .section .text.MenuSelect,"ax" .globl MenuSelect MenuSelect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (MenuRecHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -7993,6 +8375,7 @@ MenuSelect: ; NewMenu(Pointer) -> MenuRecHndl ; tool 0x2D0F, set 0x0F (MenuManager) + .section .text.NewMenu,"ax" .globl NewMenu NewMenu: ; --- stash arg0 (in A/X) --- @@ -8002,10 +8385,10 @@ NewMenu: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2D0F jsl 0xe10000 pla ; result lo -> A @@ -8014,6 +8397,7 @@ NewMenu: ; NewMenuBar(GrafPortPtr) -> MenuBarRecHndl ; tool 0x150F, set 0x0F (MenuManager) + .section .text.NewMenuBar,"ax" .globl NewMenuBar NewMenuBar: ; --- stash arg0 (in A/X) --- @@ -8023,10 +8407,10 @@ NewMenuBar: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x150F jsl 0xe10000 pla ; result lo -> A @@ -8035,6 +8419,7 @@ NewMenuBar: ; SetBarColors(Word, Word, Word) -> void ; tool 0x170F, set 0x0F (MenuManager) + .section .text.SetBarColors,"ax" .globl SetBarColors SetBarColors: ; --- stash arg0 (in A) --- @@ -8054,22 +8439,24 @@ SetBarColors: ; SetMenuBar(MenuBarRecHndl) -> void ; tool 0x390F, set 0x0F (MenuManager) + .section .text.SetMenuBar,"ax" .globl SetMenuBar SetMenuBar: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x390F jsl 0xe10000 rtl ; SetMenuFlag(Word, Word) -> void ; tool 0x1F0F, set 0x0F (MenuManager) + .section .text.SetMenuFlag,"ax" .globl SetMenuFlag SetMenuFlag: ; --- stash arg0 (in A) --- @@ -8086,6 +8473,7 @@ SetMenuFlag: ; SetMenuID(Word, Word) -> void ; tool 0x370F, set 0x0F (MenuManager) + .section .text.SetMenuID,"ax" .globl SetMenuID SetMenuID: ; --- stash arg0 (in A) --- @@ -8102,16 +8490,17 @@ SetMenuID: ; SetMenuTitle(Pointer, Word) -> void ; tool 0x210F, set 0x0F (MenuManager) + .section .text.SetMenuTitle,"ax" .globl SetMenuTitle SetMenuTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -8121,16 +8510,17 @@ SetMenuTitle: ; SetMItem(Pointer, Word) -> void ; tool 0x240F, set 0x0F (MenuManager) + .section .text.SetMItem,"ax" .globl SetMItem SetMItem: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -8140,6 +8530,7 @@ SetMItem: ; SetMItemFlag(Word, Word) -> void ; tool 0x260F, set 0x0F (MenuManager) + .section .text.SetMItemFlag,"ax" .globl SetMItemFlag SetMItemFlag: ; --- stash arg0 (in A) --- @@ -8156,6 +8547,7 @@ SetMItemFlag: ; SetMItemID(Word, Word) -> void ; tool 0x380F, set 0x0F (MenuManager) + .section .text.SetMItemID,"ax" .globl SetMItemID SetMItemID: ; --- stash arg0 (in A) --- @@ -8172,6 +8564,7 @@ SetMItemID: ; SetMItemMark(Word, Word) -> void ; tool 0x330F, set 0x0F (MenuManager) + .section .text.SetMItemMark,"ax" .globl SetMItemMark SetMItemMark: ; --- stash arg0 (in A) --- @@ -8188,16 +8581,17 @@ SetMItemMark: ; SetMItemName(Pointer, Word) -> void ; tool 0x3A0F, set 0x0F (MenuManager) + .section .text.SetMItemName,"ax" .globl SetMItemName SetMItemName: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -8207,16 +8601,17 @@ SetMItemName: ; SetMItemStyle(TextStyle, Word) -> void ; tool 0x350F, set 0x0F (MenuManager) + .section .text.SetMItemStyle,"ax" .globl SetMItemStyle SetMItemStyle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -8226,6 +8621,7 @@ SetMItemStyle: ; SetMTitleWidth(Word, Word) -> void ; tool 0x1D0F, set 0x0F (MenuManager) + .section .text.SetMTitleWidth,"ax" .globl SetMTitleWidth SetMTitleWidth: ; --- stash arg0 (in A) --- @@ -8242,22 +8638,24 @@ SetMTitleWidth: ; SetSysBar(MenuBarRecHndl) -> void ; tool 0x120F, set 0x0F (MenuManager) + .section .text.SetSysBar,"ax" .globl SetSysBar SetSysBar: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x120F jsl 0xe10000 rtl ; GetPopUpDefProc(void) -> Pointer ; tool 0x3B0F, set 0x0F (MenuManager) + .section .text.GetPopUpDefProc,"ax" .globl GetPopUpDefProc GetPopUpDefProc: ; --- result space (4 bytes) --- @@ -8271,6 +8669,7 @@ GetPopUpDefProc: ; InsertMItem2(Word, Ref, Word, Word) -> void ; tool 0x3F0F, set 0x0F (MenuManager) + .section .text.InsertMItem2,"ax" .globl InsertMItem2 InsertMItem2: ; --- stash arg0 (in A) --- @@ -8279,7 +8678,7 @@ InsertMItem2: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8295,6 +8694,7 @@ InsertMItem2: ; NewMenu2(Word, Ref) -> MenuRecHndl ; tool 0x3E0F, set 0x0F (MenuManager) + .section .text.NewMenu2,"ax" .globl NewMenu2 NewMenu2: ; --- stash arg0 (in A) --- @@ -8306,7 +8706,7 @@ NewMenu2: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -8318,6 +8718,7 @@ NewMenu2: ; NewMenuBar2(Word, Ref, Pointer) -> MenuBarRecHndl ; tool 0x430F, set 0x0F (MenuManager) + .section .text.NewMenuBar2,"ax" .globl NewMenuBar2 NewMenuBar2: ; --- stash arg0 (in A) --- @@ -8329,12 +8730,12 @@ NewMenuBar2: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Pointer, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -8346,6 +8747,7 @@ NewMenuBar2: ; PopUpMenuSelect(Word, Word, Word, Word, MenuRecHndl) -> Word ; tool 0x3C0F, set 0x0F (MenuManager) + .section .text.PopUpMenuSelect,"ax" .globl PopUpMenuSelect PopUpMenuSelect: ; --- stash arg0 (in A) --- @@ -8365,7 +8767,7 @@ PopUpMenuSelect: lda 16, s pha ; --- arg4 (MenuRecHndl, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -8376,6 +8778,7 @@ PopUpMenuSelect: ; SetMenuTitle2(Word, Ref, Word) -> void ; tool 0x400F, set 0x0F (MenuManager) + .section .text.SetMenuTitle2,"ax" .globl SetMenuTitle2 SetMenuTitle2: ; --- stash arg0 (in A) --- @@ -8384,7 +8787,7 @@ SetMenuTitle2: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8397,6 +8800,7 @@ SetMenuTitle2: ; SetMItem2(Word, Ref, Word) -> void ; tool 0x410F, set 0x0F (MenuManager) + .section .text.SetMItem2,"ax" .globl SetMItem2 SetMItem2: ; --- stash arg0 (in A) --- @@ -8405,7 +8809,7 @@ SetMItem2: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8418,6 +8822,7 @@ SetMItem2: ; SetMItemName2(Word, Ref, Word) -> void ; tool 0x420F, set 0x0F (MenuManager) + .section .text.SetMItemName2,"ax" .globl SetMItemName2 SetMItemName2: ; --- stash arg0 (in A) --- @@ -8426,7 +8831,7 @@ SetMItemName2: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8439,6 +8844,7 @@ SetMItemName2: ; GetMItemIcon(Word) -> Ref ; tool 0x480F, set 0x0F (MenuManager) + .section .text.GetMItemIcon,"ax" .globl GetMItemIcon GetMItemIcon: ; --- stash arg0 (in A) --- @@ -8457,6 +8863,7 @@ GetMItemIcon: ; GetMItemStruct(Word) -> Ref ; tool 0x4A0F, set 0x0F (MenuManager) + .section .text.GetMItemStruct,"ax" .globl GetMItemStruct GetMItemStruct: ; --- stash arg0 (in A) --- @@ -8475,6 +8882,7 @@ GetMItemStruct: ; InsertPathMItems(Word, Pointer, Word, Word, Word, Word, Ptr) -> void ; tool 0x500F, set 0x0F (MenuManager) + .section .text.InsertPathMItems,"ax" .globl InsertPathMItems InsertPathMItems: ; --- stash arg0 (in A) --- @@ -8483,7 +8891,7 @@ InsertPathMItems: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8500,7 +8908,7 @@ InsertPathMItems: lda 26, s pha ; --- arg6 (Ptr, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha @@ -8510,6 +8918,7 @@ InsertPathMItems: ; SetMItemFlag2(Word, Word) -> void ; tool 0x4D0F, set 0x0F (MenuManager) + .section .text.SetMItemFlag2,"ax" .globl SetMItemFlag2 SetMItemFlag2: ; --- stash arg0 (in A) --- @@ -8526,6 +8935,7 @@ SetMItemFlag2: ; SetMItemIcon(Word, Ref, Word) -> void ; tool 0x470F, set 0x0F (MenuManager) + .section .text.SetMItemIcon,"ax" .globl SetMItemIcon SetMItemIcon: ; --- stash arg0 (in A) --- @@ -8534,7 +8944,7 @@ SetMItemIcon: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8547,6 +8957,7 @@ SetMItemIcon: ; SetMItemStruct(Word, Ref, Word) -> void ; tool 0x490F, set 0x0F (MenuManager) + .section .text.SetMItemStruct,"ax" .globl SetMItemStruct SetMItemStruct: ; --- stash arg0 (in A) --- @@ -8555,7 +8966,7 @@ SetMItemStruct: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8568,6 +8979,7 @@ SetMItemStruct: ; MidiStartUp(Word, Word) -> void ; tool 0x0220, set 0x20 (VideoOverlay) + .section .text.MidiStartUp,"ax" .globl MidiStartUp MidiStartUp: ; --- stash arg0 (in A) --- @@ -8584,6 +8996,7 @@ MidiStartUp: ; MidiClock(Word, Long) -> void ; tool 0x0B20, set 0x20 (VideoOverlay) + .section .text.MidiClock,"ax" .globl MidiClock MidiClock: ; --- stash arg0 (in A) --- @@ -8592,7 +9005,7 @@ MidiClock: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8602,6 +9015,7 @@ MidiClock: ; MidiControl(Word, Long) -> void ; tool 0x0920, set 0x20 (VideoOverlay) + .section .text.MidiControl,"ax" .globl MidiControl MidiControl: ; --- stash arg0 (in A) --- @@ -8610,7 +9024,7 @@ MidiControl: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8620,6 +9034,7 @@ MidiControl: ; MidiDevice(Word, Pointer) -> void ; tool 0x0A20, set 0x20 (VideoOverlay) + .section .text.MidiDevice,"ax" .globl MidiDevice MidiDevice: ; --- stash arg0 (in A) --- @@ -8628,7 +9043,7 @@ MidiDevice: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8638,6 +9053,7 @@ MidiDevice: ; MidiInfo(Word) -> LongWord ; tool 0x0C20, set 0x20 (VideoOverlay) + .section .text.MidiInfo,"ax" .globl MidiInfo MidiInfo: ; --- stash arg0 (in A) --- @@ -8656,6 +9072,7 @@ MidiInfo: ; MidiReadPacket(Pointer, Word) -> Word ; tool 0x0D20, set 0x20 (VideoOverlay) + .section .text.MidiReadPacket,"ax" .globl MidiReadPacket MidiReadPacket: ; --- stash arg0 (in A/X) --- @@ -8664,10 +9081,10 @@ MidiReadPacket: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -8678,6 +9095,7 @@ MidiReadPacket: ; MidiWritePacket(Pointer) -> Word ; tool 0x0E20, set 0x20 (VideoOverlay) + .section .text.MidiWritePacket,"ax" .globl MidiWritePacket MidiWritePacket: ; --- stash arg0 (in A/X) --- @@ -8686,10 +9104,10 @@ MidiWritePacket: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E20 jsl 0xe10000 pla ; result -> A @@ -8697,6 +9115,7 @@ MidiWritePacket: ; MSVersion(void) -> word ; tool 0x0423, set 0x23 (MediaControl) + .section .text.MSVersion,"ax" .globl MSVersion MSVersion: ; --- result space (4 bytes) --- @@ -8710,6 +9129,7 @@ MSVersion: ; MSStatus(void) -> word ; tool 0x0623, set 0x23 (MediaControl) + .section .text.MSStatus,"ax" .globl MSStatus MSStatus: ; --- result space (4 bytes) --- @@ -8723,6 +9143,7 @@ MSStatus: ; ConvertToTime(Word, Word, Word, Word) -> long ; tool 0x2023, set 0x23 (MediaControl) + .section .text.ConvertToTime,"ax" .globl ConvertToTime ConvertToTime: ; --- stash arg0 (in A) --- @@ -8750,6 +9171,7 @@ ConvertToTime: ; DeleteTrack(Word, Ptr) -> void ; tool 0x1D23, set 0x23 (MediaControl) + .section .text.DeleteTrack,"ax" .globl DeleteTrack DeleteTrack: ; --- stash arg0 (in A) --- @@ -8758,7 +9180,7 @@ DeleteTrack: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -8768,22 +9190,24 @@ DeleteTrack: ; GetTuningTable(Ptr) -> void ; tool 0x2523, set 0x23 (MediaControl) + .section .text.GetTuningTable,"ax" .globl GetTuningTable GetTuningTable: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2523 jsl 0xe10000 rtl ; InitMIDIDriver(Word, Word, Word, ProcPtr) -> void ; tool 0x2723, set 0x23 (MediaControl) + .section .text.InitMIDIDriver,"ax" .globl InitMIDIDriver InitMIDIDriver: ; --- stash arg0 (in A) --- @@ -8798,7 +9222,7 @@ InitMIDIDriver: lda 10, s pha ; --- arg3 (ProcPtr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -8808,6 +9232,7 @@ InitMIDIDriver: ; Locate(Long, Ptr) -> SeqItemRecPtr ; tool 0x1123, set 0x23 (MediaControl) + .section .text.Locate,"ax" .globl Locate Locate: ; --- stash arg0 (in A/X) --- @@ -8817,12 +9242,12 @@ Locate: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Ptr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -8834,6 +9259,7 @@ Locate: ; LocateEnd(Ptr) -> pointer ; tool 0x1B23, set 0x23 (MediaControl) + .section .text.LocateEnd,"ax" .globl LocateEnd LocateEnd: ; --- stash arg0 (in A/X) --- @@ -8843,10 +9269,10 @@ LocateEnd: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1B23 jsl 0xe10000 pla ; result lo -> A @@ -8855,18 +9281,19 @@ LocateEnd: ; Merge(Ptr, Ptr) -> void ; tool 0x1C23, set 0x23 (MediaControl) + .section .text.Merge,"ax" .globl Merge Merge: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Ptr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -8876,6 +9303,7 @@ Merge: ; MIDIMessage(Word, Word, Word, Word, Word) -> void ; tool 0x1A23, set 0x23 (MediaControl) + .section .text.MIDIMessage,"ax" .globl MIDIMessage MIDIMessage: ; --- stash arg0 (in A) --- @@ -8901,6 +9329,7 @@ MIDIMessage: ; PlayNote(Word, Word, Word) -> void ; tool 0x0B23, set 0x23 (MediaControl) + .section .text.PlayNote,"ax" .globl PlayNote PlayNote: ; --- stash arg0 (in A) --- @@ -8920,48 +9349,51 @@ PlayNote: ; SeqPlayer(SeqPlayRecPtr) -> void ; tool 0x1523, set 0x23 (MediaControl) + .section .text.SeqPlayer,"ax" .globl SeqPlayer SeqPlayer: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1523 jsl 0xe10000 rtl ; SetCallBack(CallBackRecPtr) -> void ; tool 0x1723, set 0x23 (MediaControl) + .section .text.SetCallBack,"ax" .globl SetCallBack SetCallBack: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1723 jsl 0xe10000 rtl ; SetInstrument(InstrumentRecPtr, Word) -> void ; tool 0x1423, set 0x23 (MediaControl) + .section .text.SetInstrument,"ax" .globl SetInstrument SetInstrument: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -8971,6 +9403,7 @@ SetInstrument: ; SetMetro(Word, Word, Ptr) -> void ; tool 0x1E23, set 0x23 (MediaControl) + .section .text.SetMetro,"ax" .globl SetMetro SetMetro: ; --- stash arg0 (in A) --- @@ -8982,7 +9415,7 @@ SetMetro: lda 6, s pha ; --- arg2 (Ptr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -8992,6 +9425,7 @@ SetMetro: ; SetMIDIPort(Boolean, Boolean) -> void ; tool 0x1323, set 0x23 (MediaControl) + .section .text.SetMIDIPort,"ax" .globl SetMIDIPort SetMIDIPort: ; --- stash arg0 (in A) --- @@ -9008,6 +9442,7 @@ SetMIDIPort: ; SetPlayTrack(Word, Boolean) -> void ; tool 0x0F23, set 0x23 (MediaControl) + .section .text.SetPlayTrack,"ax" .globl SetPlayTrack SetPlayTrack: ; --- stash arg0 (in A) --- @@ -9024,6 +9459,7 @@ SetPlayTrack: ; SetTrackOut(Word, Word) -> void ; tool 0x2623, set 0x23 (MediaControl) + .section .text.SetTrackOut,"ax" .globl SetTrackOut SetTrackOut: ; --- stash arg0 (in A) --- @@ -9040,22 +9476,24 @@ SetTrackOut: ; SetTuningTable(Ptr) -> void ; tool 0x2423, set 0x23 (MediaControl) + .section .text.SetTuningTable,"ax" .globl SetTuningTable SetTuningTable: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2423 jsl 0xe10000 rtl ; StopNote(Word, Word) -> void ; tool 0x0C23, set 0x23 (MediaControl) + .section .text.StopNote,"ax" .globl StopNote StopNote: ; --- stash arg0 (in A) --- @@ -9072,21 +9510,22 @@ StopNote: ; SysExOut(Ptr, Word, ProcPtr) -> void ; tool 0x1823, set 0x23 (MediaControl) + .section .text.SysExOut,"ax" .globl SysExOut SysExOut: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (ProcPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -9096,6 +9535,7 @@ SysExOut: ; TrackToChannel(Word, Word) -> void ; tool 0x1023, set 0x23 (MediaControl) + .section .text.TrackToChannel,"ax" .globl TrackToChannel TrackToChannel: ; --- stash arg0 (in A) --- @@ -9112,38 +9552,41 @@ TrackToChannel: ; WriteBRam(Pointer) -> void ; tool 0x0903, set 0x03 (MiscTools) + .section .text.WriteBRam,"ax" .globl WriteBRam WriteBRam: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0903 jsl 0xe10000 rtl ; ReadBRam(Pointer) -> void ; tool 0x0A03, set 0x03 (MiscTools) + .section .text.ReadBRam,"ax" .globl ReadBRam ReadBRam: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0A03 jsl 0xe10000 rtl ; WriteBParam(Word, Word) -> void ; tool 0x0B03, set 0x03 (MiscTools) + .section .text.WriteBParam,"ax" .globl WriteBParam WriteBParam: ; --- stash arg0 (in A) --- @@ -9160,38 +9603,41 @@ WriteBParam: ; WriteTimeHex(HexTime) -> void ; tool 0x0E03, set 0x03 (MiscTools) + .section .text.WriteTimeHex,"ax" .globl WriteTimeHex WriteTimeHex: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E03 jsl 0xe10000 rtl ; ReadAsciiTime(Pointer) -> void ; tool 0x0F03, set 0x03 (MiscTools) + .section .text.ReadAsciiTime,"ax" .globl ReadAsciiTime ReadAsciiTime: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F03 jsl 0xe10000 rtl ; GetAddr(Word) -> Pointer ; tool 0x1603, set 0x03 (MiscTools) + .section .text.GetAddr,"ax" .globl GetAddr GetAddr: ; --- stash arg0 (in A) --- @@ -9210,6 +9656,7 @@ GetAddr: ; GetTick(void) -> LongWord ; tool 0x2503, set 0x03 (MiscTools) + .section .text.GetTick,"ax" .globl GetTick GetTick: ; --- result space (4 bytes) --- @@ -9223,6 +9670,7 @@ GetTick: ; ClampMouse(Word, Word, Word, Word) -> void ; tool 0x1C03, set 0x03 (MiscTools) + .section .text.ClampMouse,"ax" .globl ClampMouse ClampMouse: ; --- stash arg0 (in A) --- @@ -9245,6 +9693,7 @@ ClampMouse: ; PosMouse(Integer, Integer) -> void ; tool 0x1E03, set 0x03 (MiscTools) + .section .text.PosMouse,"ax" .globl PosMouse PosMouse: ; --- stash arg0 (in A) --- @@ -9261,6 +9710,7 @@ PosMouse: ; PackBytes(Handle, Word, Pointer, Word) -> Word ; tool 0x2603, set 0x03 (MiscTools) + .section .text.PackBytes,"ax" .globl PackBytes PackBytes: ; --- stash arg0 (in A/X) --- @@ -9269,15 +9719,15 @@ PackBytes: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha ; --- arg2 (Pointer, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -9291,6 +9741,7 @@ PackBytes: ; UnPackBytes(Pointer, Word, Handle, Word) -> Word ; tool 0x2703, set 0x03 (MiscTools) + .section .text.UnPackBytes,"ax" .globl UnPackBytes UnPackBytes: ; --- stash arg0 (in A/X) --- @@ -9299,15 +9750,15 @@ UnPackBytes: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -9321,6 +9772,7 @@ UnPackBytes: ; Munger(Handle, Word, Pointer, Word, Pointer, Word, Pointer) -> Word ; tool 0x2803, set 0x03 (MiscTools) + .section .text.Munger,"ax" .globl Munger Munger: ; --- stash arg0 (in A/X) --- @@ -9329,15 +9781,15 @@ Munger: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha ; --- arg2 (Pointer, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -9345,7 +9797,7 @@ Munger: lda 22, s pha ; --- arg4 (Pointer, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha @@ -9353,7 +9805,7 @@ Munger: lda 34, s pha ; --- arg6 (Pointer, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha @@ -9364,38 +9816,41 @@ Munger: ; SetHeartBeat(Pointer) -> void ; tool 0x1203, set 0x03 (MiscTools) + .section .text.SetHeartBeat,"ax" .globl SetHeartBeat SetHeartBeat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1203 jsl 0xe10000 rtl ; DelHeartBeat(Pointer) -> void ; tool 0x1303, set 0x03 (MiscTools) + .section .text.DelHeartBeat,"ax" .globl DelHeartBeat DelHeartBeat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1303 jsl 0xe10000 rtl ; SysFailMgr(Word, Pointer) -> void ; tool 0x1503, set 0x03 (MiscTools) + .section .text.SysFailMgr,"ax" .globl SysFailMgr SysFailMgr: ; --- stash arg0 (in A) --- @@ -9404,7 +9859,7 @@ SysFailMgr: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -9414,6 +9869,7 @@ SysFailMgr: ; SetVector(Word, Pointer) -> void ; tool 0x1003, set 0x03 (MiscTools) + .section .text.SetVector,"ax" .globl SetVector SetVector: ; --- stash arg0 (in A) --- @@ -9422,7 +9878,7 @@ SetVector: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -9432,6 +9888,7 @@ SetVector: ; GetVector(Word) -> Pointer ; tool 0x1103, set 0x03 (MiscTools) + .section .text.GetVector,"ax" .globl GetVector GetVector: ; --- stash arg0 (in A) --- @@ -9450,18 +9907,19 @@ GetVector: ; AddToQueue(Pointer, Pointer) -> void ; tool 0x2E03, set 0x03 (MiscTools) + .section .text.AddToQueue,"ax" .globl AddToQueue AddToQueue: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -9471,18 +9929,19 @@ AddToQueue: ; DeleteFromQueue(Pointer, Pointer) -> void ; tool 0x2F03, set 0x03 (MiscTools) + .section .text.DeleteFromQueue,"ax" .globl DeleteFromQueue DeleteFromQueue: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -9492,6 +9951,7 @@ DeleteFromQueue: ; GetCodeResConverter(void) -> ProcPtr ; tool 0x3403, set 0x03 (MiscTools) + .section .text.GetCodeResConverter,"ax" .globl GetCodeResConverter GetCodeResConverter: ; --- result space (4 bytes) --- @@ -9505,16 +9965,17 @@ GetCodeResConverter: ; GetInterruptState(Pointer, Word) -> void ; tool 0x3103, set 0x03 (MiscTools) + .section .text.GetInterruptState,"ax" .globl GetInterruptState GetInterruptState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -9524,16 +9985,17 @@ GetInterruptState: ; SetInterruptState(Pointer, Word) -> void ; tool 0x3003, set 0x03 (MiscTools) + .section .text.SetInterruptState,"ax" .globl SetInterruptState SetInterruptState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -9543,6 +10005,7 @@ SetInterruptState: ; ConvSeconds(Word, Long, Pointer) -> LongWord ; tool 0x3703, set 0x03 (MiscTools) + .section .text.ConvSeconds,"ax" .globl ConvSeconds ConvSeconds: ; --- stash arg0 (in A) --- @@ -9554,12 +10017,12 @@ ConvSeconds: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Pointer, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -9571,18 +10034,19 @@ ConvSeconds: ; ShowBootInfo(Pointer, Pointer) -> void ; tool 0x3C03, set 0x03 (MiscTools) + .section .text.ShowBootInfo,"ax" .globl ShowBootInfo ShowBootInfo: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -9592,6 +10056,7 @@ ShowBootInfo: ; StringToText(Word, Ptr, Word, Ptr) -> LongWord ; tool 0x3B03, set 0x03 (MiscTools) + .section .text.StringToText,"ax" .globl StringToText StringToText: ; --- stash arg0 (in A) --- @@ -9603,7 +10068,7 @@ StringToText: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -9611,7 +10076,7 @@ StringToText: lda 18, s pha ; --- arg3 (Ptr, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha @@ -9623,6 +10088,7 @@ StringToText: ; VersionString(Word, Long, Ptr) -> void ; tool 0x3903, set 0x03 (MiscTools) + .section .text.VersionString,"ax" .globl VersionString VersionString: ; --- stash arg0 (in A) --- @@ -9631,12 +10097,12 @@ VersionString: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Ptr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -9646,6 +10112,7 @@ VersionString: ; WaitUntil(Word, Word) -> Word ; tool 0x3A03, set 0x03 (MiscTools) + .section .text.WaitUntil,"ax" .globl WaitUntil WaitUntil: ; --- stash arg0 (in A) --- @@ -9665,6 +10132,7 @@ WaitUntil: ; AlertMessage(Ptr, Word, Ptr) -> Word ; tool 0x3E03, set 0x03 (MiscTools) + .section .text.AlertMessage,"ax" .globl AlertMessage AlertMessage: ; --- stash arg0 (in A/X) --- @@ -9673,15 +10141,15 @@ AlertMessage: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha ; --- arg2 (Ptr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -9692,6 +10160,7 @@ AlertMessage: ; DoSysPrefs(Word, Word) -> Word ; tool 0x3F03, set 0x03 (MiscTools) + .section .text.DoSysPrefs,"ax" .globl DoSysPrefs DoSysPrefs: ; --- stash arg0 (in A) --- @@ -9711,6 +10180,7 @@ DoSysPrefs: ; SeqStartUp(Word, Word, Word, Word) -> void ; tool 0x021A, set 0x1A (NoteSequencer) + .section .text.SeqStartUp,"ax" .globl SeqStartUp SeqStartUp: ; --- stash arg0 (in A) --- @@ -9733,22 +10203,24 @@ SeqStartUp: ; SetInstTable(Handle) -> void ; tool 0x121A, set 0x1A (NoteSequencer) + .section .text.SetInstTable,"ax" .globl SetInstTable SetInstTable: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x121A jsl 0xe10000 rtl ; SetTrkInfo(Word, Word, Word) -> void ; tool 0x0E1A, set 0x1A (NoteSequencer) + .section .text.SetTrkInfo,"ax" .globl SetTrkInfo SetTrkInfo: ; --- stash arg0 (in A) --- @@ -9768,23 +10240,24 @@ SetTrkInfo: ; StartSeq(Pointer, Pointer, Handle) -> void ; tool 0x0F1A, set 0x1A (NoteSequencer) + .section .text.StartSeq,"ax" .globl StartSeq StartSeq: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -9794,23 +10267,24 @@ StartSeq: ; StartSeqRel(Pointer, Pointer, Handle) -> void ; tool 0x151A, set 0x1A (NoteSequencer) + .section .text.StartSeqRel,"ax" .globl StartSeqRel StartSeqRel: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -9820,6 +10294,7 @@ StartSeqRel: ; NSStartUp(Word, Pointer) -> void ; tool 0x0219, set 0x19 (NoteSynth) + .section .text.NSStartUp,"ax" .globl NSStartUp NSStartUp: ; --- stash arg0 (in A) --- @@ -9828,7 +10303,7 @@ NSStartUp: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -9838,6 +10313,7 @@ NSStartUp: ; NoteOff(Word, Word) -> void ; tool 0x0C19, set 0x19 (NoteSynth) + .section .text.NoteOff,"ax" .globl NoteOff NoteOff: ; --- stash arg0 (in A) --- @@ -9854,6 +10330,7 @@ NoteOff: ; NoteOn(Word, Word, Word, Pointer) -> void ; tool 0x0B19, set 0x19 (NoteSynth) + .section .text.NoteOn,"ax" .globl NoteOn NoteOn: ; --- stash arg0 (in A) --- @@ -9868,7 +10345,7 @@ NoteOn: lda 10, s pha ; --- arg3 (Pointer, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -9878,6 +10355,7 @@ NoteOn: ; NSSetUserUpdateRtn(Pointer) -> VoidProcPtr ; tool 0x0F19, set 0x19 (NoteSynth) + .section .text.NSSetUserUpdateRtn,"ax" .globl NSSetUserUpdateRtn NSSetUserUpdateRtn: ; --- stash arg0 (in A/X) --- @@ -9887,10 +10365,10 @@ NSSetUserUpdateRtn: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F19 jsl 0xe10000 pla ; result lo -> A @@ -9899,6 +10377,7 @@ NSSetUserUpdateRtn: ; PMStartUp(Word, Word) -> void ; tool 0x0213, set 0x13 (PrintManager) + .section .text.PMStartUp,"ax" .globl PMStartUp PMStartUp: ; --- stash arg0 (in A) --- @@ -9915,54 +10394,58 @@ PMStartUp: ; PrCloseDoc(GrafPortPtr) -> void ; tool 0x0F13, set 0x13 (PrintManager) + .section .text.PrCloseDoc,"ax" .globl PrCloseDoc PrCloseDoc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F13 jsl 0xe10000 rtl ; PrClosePage(GrafPortPtr) -> void ; tool 0x1113, set 0x13 (PrintManager) + .section .text.PrClosePage,"ax" .globl PrClosePage PrClosePage: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1113 jsl 0xe10000 rtl ; PrDefault(PrRecHndl) -> void ; tool 0x0913, set 0x13 (PrintManager) + .section .text.PrDefault,"ax" .globl PrDefault PrDefault: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0913 jsl 0xe10000 rtl ; PrJobDialog(PrRecHndl) -> Boolean ; tool 0x0C13, set 0x13 (PrintManager) + .section .text.PrJobDialog,"ax" .globl PrJobDialog PrJobDialog: ; --- stash arg0 (in A/X) --- @@ -9971,10 +10454,10 @@ PrJobDialog: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0C13 jsl 0xe10000 pla ; result -> A @@ -9982,6 +10465,7 @@ PrJobDialog: ; PrOpenDoc(PrRecHndl, GrafPortPtr) -> GrafPortPtr ; tool 0x0E13, set 0x13 (PrintManager) + .section .text.PrOpenDoc,"ax" .globl PrOpenDoc PrOpenDoc: ; --- stash arg0 (in A/X) --- @@ -9991,12 +10475,12 @@ PrOpenDoc: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -10008,18 +10492,19 @@ PrOpenDoc: ; PrOpenPage(GrafPortPtr, Rect) -> void ; tool 0x1013, set 0x13 (PrintManager) + .section .text.PrOpenPage,"ax" .globl PrOpenPage PrOpenPage: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -10029,23 +10514,24 @@ PrOpenPage: ; PrPicFile(PrRecHndl, GrafPortPtr, PrStatusRecPtr) -> void ; tool 0x1213, set 0x13 (PrintManager) + .section .text.PrPicFile,"ax" .globl PrPicFile PrPicFile: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (PrStatusRecPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -10055,18 +10541,19 @@ PrPicFile: ; PrPixelMap(LocInfoPtr, RectPtr, Boolean) -> void ; tool 0x0D13, set 0x13 (PrintManager) + .section .text.PrPixelMap,"ax" .globl PrPixelMap PrPixelMap: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RectPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -10079,6 +10566,7 @@ PrPixelMap: ; PrStlDialog(PrRecHndl) -> Boolean ; tool 0x0B13, set 0x13 (PrintManager) + .section .text.PrStlDialog,"ax" .globl PrStlDialog PrStlDialog: ; --- stash arg0 (in A/X) --- @@ -10087,10 +10575,10 @@ PrStlDialog: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0B13 jsl 0xe10000 pla ; result -> A @@ -10098,6 +10586,7 @@ PrStlDialog: ; PrValidate(PrRecHndl) -> Boolean ; tool 0x0A13, set 0x13 (PrintManager) + .section .text.PrValidate,"ax" .globl PrValidate PrValidate: ; --- stash arg0 (in A/X) --- @@ -10106,10 +10595,10 @@ PrValidate: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0A13 jsl 0xe10000 pla ; result -> A @@ -10117,6 +10606,7 @@ PrValidate: ; PrGetDocName(void) -> StringPtr ; tool 0x3613, set 0x13 (PrintManager) + .section .text.PrGetDocName,"ax" .globl PrGetDocName PrGetDocName: ; --- result space (4 bytes) --- @@ -10130,6 +10620,7 @@ PrGetDocName: ; PrGetPgOrientation(PrRecHndl) -> Word ; tool 0x3813, set 0x13 (PrintManager) + .section .text.PrGetPgOrientation,"ax" .globl PrGetPgOrientation PrGetPgOrientation: ; --- stash arg0 (in A/X) --- @@ -10138,10 +10629,10 @@ PrGetPgOrientation: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3813 jsl 0xe10000 pla ; result -> A @@ -10149,6 +10640,7 @@ PrGetPgOrientation: ; PrGetPrinterSpecs(void) -> long ; tool 0x1813, set 0x13 (PrintManager) + .section .text.PrGetPrinterSpecs,"ax" .globl PrGetPrinterSpecs PrGetPrinterSpecs: ; --- result space (4 bytes) --- @@ -10162,22 +10654,24 @@ PrGetPrinterSpecs: ; PrSetDocName(Pointer) -> void ; tool 0x3713, set 0x13 (PrintManager) + .section .text.PrSetDocName,"ax" .globl PrSetDocName PrSetDocName: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3713 jsl 0xe10000 rtl ; PrGetNetworkName(void) -> StringPtr ; tool 0x2B13, set 0x13 (PrintManager) + .section .text.PrGetNetworkName,"ax" .globl PrGetNetworkName PrGetNetworkName: ; --- result space (4 bytes) --- @@ -10191,6 +10685,7 @@ PrGetNetworkName: ; PrGetPortDvrName(void) -> StringPtr ; tool 0x2913, set 0x13 (PrintManager) + .section .text.PrGetPortDvrName,"ax" .globl PrGetPortDvrName PrGetPortDvrName: ; --- result space (4 bytes) --- @@ -10204,6 +10699,7 @@ PrGetPortDvrName: ; PrGetPrinterDvrName(void) -> StringPtr ; tool 0x2813, set 0x13 (PrintManager) + .section .text.PrGetPrinterDvrName,"ax" .globl PrGetPrinterDvrName PrGetPrinterDvrName: ; --- result space (4 bytes) --- @@ -10217,6 +10713,7 @@ PrGetPrinterDvrName: ; PrGetUserName(void) -> StringPtr ; tool 0x2A13, set 0x13 (PrintManager) + .section .text.PrGetUserName,"ax" .globl PrGetUserName PrGetUserName: ; --- result space (4 bytes) --- @@ -10230,6 +10727,7 @@ PrGetUserName: ; PrGetZoneName(void) -> StringPtr ; tool 0x2513, set 0x13 (PrintManager) + .section .text.PrGetZoneName,"ax" .globl PrGetZoneName PrGetZoneName: ; --- result space (4 bytes) --- @@ -10243,28 +10741,29 @@ PrGetZoneName: ; CopyPixels(LocInfoPtr, LocInfoPtr, Rect, Rect, Word, RegionHndl) -> void ; tool 0x0912, set 0x12 (QDAuxiliary) + .section .text.CopyPixels,"ax" .globl CopyPixels CopyPixels: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (LocInfoPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Rect, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -10272,7 +10771,7 @@ CopyPixels: lda 32, s pha ; --- arg5 (RegionHndl, 4B) --- - lda 36, s + lda 38, s pha lda 38, s pha @@ -10282,16 +10781,17 @@ CopyPixels: ; DrawIcon(Pointer, Word, Word, Word) -> void ; tool 0x0B12, set 0x12 (QDAuxiliary) + .section .text.DrawIcon,"ax" .globl DrawIcon DrawIcon: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -10307,18 +10807,19 @@ DrawIcon: ; DrawPicture(Handle, Rect) -> void ; tool 0xBA04, set 0x04 (QuickDraw) + .section .text.DrawPicture,"ax" .globl DrawPicture DrawPicture: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -10328,22 +10829,24 @@ DrawPicture: ; KillPicture(Handle) -> void ; tool 0xBB04, set 0x04 (QuickDraw) + .section .text.KillPicture,"ax" .globl KillPicture KillPicture: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xBB04 jsl 0xe10000 rtl ; OpenPicture(Pointer) -> PicHndl ; tool 0xB704, set 0x04 (QuickDraw) + .section .text.OpenPicture,"ax" .globl OpenPicture OpenPicture: ; --- stash arg0 (in A/X) --- @@ -10353,10 +10856,10 @@ OpenPicture: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xB704 jsl 0xe10000 pla ; result lo -> A @@ -10365,6 +10868,7 @@ OpenPicture: ; PicComment(Integer, Integer, Handle) -> void ; tool 0xB804, set 0x04 (QuickDraw) + .section .text.PicComment,"ax" .globl PicComment PicComment: ; --- stash arg0 (in A) --- @@ -10376,7 +10880,7 @@ PicComment: lda 6, s pha ; --- arg2 (Handle, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -10386,28 +10890,29 @@ PicComment: ; CalcMask(LocInfoPtr, Rect, LocInfoPtr, Rect, Word, PatternPtr, Pointer) -> void ; tool 0x0E12, set 0x12 (QDAuxiliary) + .section .text.CalcMask,"ax" .globl CalcMask CalcMask: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (LocInfoPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Rect, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -10415,12 +10920,12 @@ CalcMask: lda 32, s pha ; --- arg5 (PatternPtr, 4B) --- - lda 36, s + lda 38, s pha lda 38, s pha ; --- arg6 (Pointer, 4B) --- - lda 44, s + lda 46, s pha lda 46, s pha @@ -10430,28 +10935,29 @@ CalcMask: ; SeedFill(LocInfoPtr, Rect, LocInfoPtr, Rect, Word, Word, Word, PatternPtr, Pointer) -> void ; tool 0x0D12, set 0x12 (QDAuxiliary) + .section .text.SeedFill,"ax" .globl SeedFill SeedFill: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (LocInfoPtr, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Rect, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -10465,12 +10971,12 @@ SeedFill: lda 40, s pha ; --- arg7 (PatternPtr, 4B) --- - lda 44, s + lda 46, s pha lda 46, s pha ; --- arg8 (Pointer, 4B) --- - lda 52, s + lda 54, s pha lda 54, s pha @@ -10480,16 +10986,17 @@ SeedFill: ; SpecialRect(Rect, Word, Word) -> void ; tool 0x0C12, set 0x12 (QDAuxiliary) + .section .text.SpecialRect,"ax" .globl SpecialRect SpecialRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -10502,6 +11009,7 @@ SpecialRect: ; GetSysIcon(Word, Word, Long) -> QDIconRecordPtr ; tool 0x0F12, set 0x12 (QDAuxiliary) + .section .text.GetSysIcon,"ax" .globl GetSysIcon GetSysIcon: ; --- stash arg0 (in A) --- @@ -10516,7 +11024,7 @@ GetSysIcon: lda 10, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -10528,6 +11036,7 @@ GetSysIcon: ; PixelMap2Rgn(LocInfoPtr, Word, Word) -> RegionHndl ; tool 0x1012, set 0x12 (QDAuxiliary) + .section .text.PixelMap2Rgn,"ax" .globl PixelMap2Rgn PixelMap2Rgn: ; --- stash arg0 (in A/X) --- @@ -10537,10 +11046,10 @@ PixelMap2Rgn: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 12, s pha @@ -10555,23 +11064,24 @@ PixelMap2Rgn: ; WhooshRect(Long, Rect, Rect) -> void ; tool 0x1412, set 0x12 (QDAuxiliary) + .section .text.WhooshRect,"ax" .globl WhooshRect WhooshRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -10581,6 +11091,7 @@ WhooshRect: ; DrawStringWidth(Word, Ref, Word) -> void ; tool 0x1512, set 0x12 (QDAuxiliary) + .section .text.DrawStringWidth,"ax" .globl DrawStringWidth DrawStringWidth: ; --- stash arg0 (in A) --- @@ -10589,7 +11100,7 @@ DrawStringWidth: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -10602,6 +11113,7 @@ DrawStringWidth: ; UseColorTable(Word, ColorTablePtr, Word) -> Handle ; tool 0x1612, set 0x12 (QDAuxiliary) + .section .text.UseColorTable,"ax" .globl UseColorTable UseColorTable: ; --- stash arg0 (in A) --- @@ -10613,7 +11125,7 @@ UseColorTable: lda 0xE0 pha ; --- arg1 (ColorTablePtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -10628,16 +11140,17 @@ UseColorTable: ; RestoreColorTable(Handle, Word) -> void ; tool 0x1712, set 0x12 (QDAuxiliary) + .section .text.RestoreColorTable,"ax" .globl RestoreColorTable RestoreColorTable: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -10647,6 +11160,7 @@ RestoreColorTable: ; QDStartUp(Word, Word, Word, Word) -> void ; tool 0x0204, set 0x04 (QuickDraw) + .section .text.QDStartUp,"ax" .globl QDStartUp QDStartUp: ; --- stash arg0 (in A) --- @@ -10669,18 +11183,19 @@ QDStartUp: ; AddPt(Point, Point) -> void ; tool 0x8004, set 0x04 (QuickDraw) + .section .text.AddPt,"ax" .globl AddPt AddPt: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Point, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -10690,6 +11205,7 @@ AddPt: ; CharBounds(Word, Rect) -> void ; tool 0xAC04, set 0x04 (QuickDraw) + .section .text.CharBounds,"ax" .globl CharBounds CharBounds: ; --- stash arg0 (in A) --- @@ -10698,7 +11214,7 @@ CharBounds: lda 0xE0 pha ; --- arg1 (Rect, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -10708,66 +11224,70 @@ CharBounds: ; ClipRect(Rect) -> void ; tool 0x2604, set 0x04 (QuickDraw) + .section .text.ClipRect,"ax" .globl ClipRect ClipRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2604 jsl 0xe10000 rtl ; ClosePort(GrafPortPtr) -> void ; tool 0x1A04, set 0x04 (QuickDraw) + .section .text.ClosePort,"ax" .globl ClosePort ClosePort: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1A04 jsl 0xe10000 rtl ; CloseRgn(RegionHndl) -> void ; tool 0x6E04, set 0x04 (QuickDraw) + .section .text.CloseRgn,"ax" .globl CloseRgn CloseRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x6E04 jsl 0xe10000 rtl ; CopyRgn(RegionHndl, RegionHndl) -> void ; tool 0x6904, set 0x04 (QuickDraw) + .section .text.CopyRgn,"ax" .globl CopyRgn CopyRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -10777,18 +11297,19 @@ CopyRgn: ; CStringBounds(Pointer, Rect) -> void ; tool 0xAE04, set 0x04 (QuickDraw) + .section .text.CStringBounds,"ax" .globl CStringBounds CStringBounds: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -10798,6 +11319,7 @@ CStringBounds: ; CStringWidth(Pointer) -> Word ; tool 0xAA04, set 0x04 (QuickDraw) + .section .text.CStringWidth,"ax" .globl CStringWidth CStringWidth: ; --- stash arg0 (in A/X) --- @@ -10806,10 +11328,10 @@ CStringWidth: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xAA04 jsl 0xe10000 pla ; result -> A @@ -10817,23 +11339,24 @@ CStringWidth: ; DiffRgn(RegionHndl, RegionHndl, RegionHndl) -> void ; tool 0x7304, set 0x04 (QuickDraw) + .section .text.DiffRgn,"ax" .globl DiffRgn DiffRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (RegionHndl, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -10843,64 +11366,68 @@ DiffRgn: ; DisposeRgn(RegionHndl) -> void ; tool 0x6804, set 0x04 (QuickDraw) + .section .text.DisposeRgn,"ax" .globl DisposeRgn DisposeRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x6804 jsl 0xe10000 rtl ; DrawCString(Pointer) -> void ; tool 0xA604, set 0x04 (QuickDraw) + .section .text.DrawCString,"ax" .globl DrawCString DrawCString: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xA604 jsl 0xe10000 rtl ; DrawString(Pointer) -> void ; tool 0xA504, set 0x04 (QuickDraw) + .section .text.DrawString,"ax" .globl DrawString DrawString: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xA504 jsl 0xe10000 rtl ; DrawText(Pointer, Word) -> void ; tool 0xA704, set 0x04 (QuickDraw) + .section .text.DrawText,"ax" .globl DrawText DrawText: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -10910,6 +11437,7 @@ DrawText: ; EmptyRgn(RegionHndl) -> Boolean ; tool 0x7804, set 0x04 (QuickDraw) + .section .text.EmptyRgn,"ax" .globl EmptyRgn EmptyRgn: ; --- stash arg0 (in A/X) --- @@ -10918,10 +11446,10 @@ EmptyRgn: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x7804 jsl 0xe10000 pla ; result -> A @@ -10929,6 +11457,7 @@ EmptyRgn: ; EqualPt(Point, Point) -> Boolean ; tool 0x8304, set 0x04 (QuickDraw) + .section .text.EqualPt,"ax" .globl EqualPt EqualPt: ; --- stash arg0 (in A/X) --- @@ -10937,12 +11466,12 @@ EqualPt: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Point, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -10953,6 +11482,7 @@ EqualPt: ; EqualRect(Rect, Rect) -> Boolean ; tool 0x5104, set 0x04 (QuickDraw) + .section .text.EqualRect,"ax" .globl EqualRect EqualRect: ; --- stash arg0 (in A/X) --- @@ -10961,12 +11491,12 @@ EqualRect: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -10977,6 +11507,7 @@ EqualRect: ; EqualRgn(RegionHndl, RegionHndl) -> Boolean ; tool 0x7704, set 0x04 (QuickDraw) + .section .text.EqualRgn,"ax" .globl EqualRgn EqualRgn: ; --- stash arg0 (in A/X) --- @@ -10985,12 +11516,12 @@ EqualRgn: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -11001,16 +11532,17 @@ EqualRgn: ; EraseArc(Rect, Integer, Integer) -> void ; tool 0x6404, set 0x04 (QuickDraw) + .section .text.EraseArc,"ax" .globl EraseArc EraseArc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -11023,80 +11555,85 @@ EraseArc: ; EraseOval(Rect) -> void ; tool 0x5A04, set 0x04 (QuickDraw) + .section .text.EraseOval,"ax" .globl EraseOval EraseOval: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5A04 jsl 0xe10000 rtl ; ErasePoly(Handle) -> void ; tool 0xBE04, set 0x04 (QuickDraw) + .section .text.ErasePoly,"ax" .globl ErasePoly ErasePoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xBE04 jsl 0xe10000 rtl ; EraseRect(Rect) -> void ; tool 0x5504, set 0x04 (QuickDraw) + .section .text.EraseRect,"ax" .globl EraseRect EraseRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5504 jsl 0xe10000 rtl ; EraseRgn(RegionHndl) -> void ; tool 0x7B04, set 0x04 (QuickDraw) + .section .text.EraseRgn,"ax" .globl EraseRgn EraseRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x7B04 jsl 0xe10000 rtl ; EraseRRect(Rect, Word, Word) -> void ; tool 0x5F04, set 0x04 (QuickDraw) + .section .text.EraseRRect,"ax" .globl EraseRRect EraseRRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -11109,16 +11646,17 @@ EraseRRect: ; FillArc(Rect, Integer, Integer, Pattern) -> void ; tool 0x6604, set 0x04 (QuickDraw) + .section .text.FillArc,"ax" .globl FillArc FillArc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -11126,7 +11664,7 @@ FillArc: lda 12, s pha ; --- arg3 (Pattern, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -11136,18 +11674,19 @@ FillArc: ; FillOval(Rect, Pattern) -> void ; tool 0x5C04, set 0x04 (QuickDraw) + .section .text.FillOval,"ax" .globl FillOval FillOval: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pattern, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -11157,18 +11696,19 @@ FillOval: ; FillPoly(Handle, Pattern) -> void ; tool 0xC004, set 0x04 (QuickDraw) + .section .text.FillPoly,"ax" .globl FillPoly FillPoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pattern, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -11178,18 +11718,19 @@ FillPoly: ; FillRect(Rect, Pattern) -> void ; tool 0x5704, set 0x04 (QuickDraw) + .section .text.FillRect,"ax" .globl FillRect FillRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pattern, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -11199,18 +11740,19 @@ FillRect: ; FillRgn(RegionHndl, Pattern) -> void ; tool 0x7D04, set 0x04 (QuickDraw) + .section .text.FillRgn,"ax" .globl FillRgn FillRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pattern, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -11220,16 +11762,17 @@ FillRgn: ; FillRRect(Rect, Word, Word, Pattern) -> void ; tool 0x6104, set 0x04 (QuickDraw) + .section .text.FillRRect,"ax" .globl FillRRect FillRRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -11237,7 +11780,7 @@ FillRRect: lda 12, s pha ; --- arg3 (Pattern, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -11247,6 +11790,7 @@ FillRRect: ; ForceBufDims(Word, Word, Word) -> void ; tool 0xCC04, set 0x04 (QuickDraw) + .section .text.ForceBufDims,"ax" .globl ForceBufDims ForceBufDims: ; --- stash arg0 (in A) --- @@ -11266,16 +11810,17 @@ ForceBufDims: ; FrameArc(Rect, Integer, Integer) -> void ; tool 0x6204, set 0x04 (QuickDraw) + .section .text.FrameArc,"ax" .globl FrameArc FrameArc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -11288,80 +11833,85 @@ FrameArc: ; FrameOval(Rect) -> void ; tool 0x5804, set 0x04 (QuickDraw) + .section .text.FrameOval,"ax" .globl FrameOval FrameOval: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5804 jsl 0xe10000 rtl ; FramePoly(Handle) -> void ; tool 0xBC04, set 0x04 (QuickDraw) + .section .text.FramePoly,"ax" .globl FramePoly FramePoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xBC04 jsl 0xe10000 rtl ; FrameRect(Rect) -> void ; tool 0x5304, set 0x04 (QuickDraw) + .section .text.FrameRect,"ax" .globl FrameRect FrameRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5304 jsl 0xe10000 rtl ; FrameRgn(RegionHndl) -> void ; tool 0x7904, set 0x04 (QuickDraw) + .section .text.FrameRgn,"ax" .globl FrameRgn FrameRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x7904 jsl 0xe10000 rtl ; FrameRRect(Rect, Word, Word) -> void ; tool 0x5D04, set 0x04 (QuickDraw) + .section .text.FrameRRect,"ax" .globl FrameRRect FrameRRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -11374,6 +11924,7 @@ FrameRRect: ; GetAddress(Word) -> Pointer ; tool 0x0904, set 0x04 (QuickDraw) + .section .text.GetAddress,"ax" .globl GetAddress GetAddress: ; --- stash arg0 (in A) --- @@ -11392,22 +11943,24 @@ GetAddress: ; GetBackPat(Pattern) -> void ; tool 0x3504, set 0x04 (QuickDraw) + .section .text.GetBackPat,"ax" .globl GetBackPat GetBackPat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3504 jsl 0xe10000 rtl ; GetCharExtra(void) -> Fixed ; tool 0xD504, set 0x04 (QuickDraw) + .section .text.GetCharExtra,"ax" .globl GetCharExtra GetCharExtra: ; --- result space (4 bytes) --- @@ -11421,22 +11974,24 @@ GetCharExtra: ; GetClip(RegionHndl) -> void ; tool 0x2504, set 0x04 (QuickDraw) + .section .text.GetClip,"ax" .globl GetClip GetClip: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2504 jsl 0xe10000 rtl ; GetClipHandle(void) -> RegionHndl ; tool 0xC704, set 0x04 (QuickDraw) + .section .text.GetClipHandle,"ax" .globl GetClipHandle GetClipHandle: ; --- result space (4 bytes) --- @@ -11450,6 +12005,7 @@ GetClipHandle: ; GetColorEntry(Word, Word) -> Word ; tool 0x1104, set 0x04 (QuickDraw) + .section .text.GetColorEntry,"ax" .globl GetColorEntry GetColorEntry: ; --- stash arg0 (in A) --- @@ -11469,6 +12025,7 @@ GetColorEntry: ; GetColorTable(Word, ColorTable) -> void ; tool 0x0F04, set 0x04 (QuickDraw) + .section .text.GetColorTable,"ax" .globl GetColorTable GetColorTable: ; --- stash arg0 (in A) --- @@ -11477,7 +12034,7 @@ GetColorTable: lda 0xE0 pha ; --- arg1 (ColorTable, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -11487,6 +12044,7 @@ GetColorTable: ; GetCursorAdr(void) -> Pointer ; tool 0x8F04, set 0x04 (QuickDraw) + .section .text.GetCursorAdr,"ax" .globl GetCursorAdr GetCursorAdr: ; --- result space (4 bytes) --- @@ -11500,6 +12058,7 @@ GetCursorAdr: ; GetFont(void) -> FontHndl ; tool 0x9504, set 0x04 (QuickDraw) + .section .text.GetFont,"ax" .globl GetFont GetFont: ; --- result space (4 bytes) --- @@ -11513,22 +12072,24 @@ GetFont: ; GetFontGlobals(FontGlobalsRecPtr) -> void ; tool 0x9704, set 0x04 (QuickDraw) + .section .text.GetFontGlobals,"ax" .globl GetFontGlobals GetFontGlobals: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x9704 jsl 0xe10000 rtl ; GetFontID(void) -> Long ; tool 0xD104, set 0x04 (QuickDraw) + .section .text.GetFontID,"ax" .globl GetFontID GetFontID: ; --- result space (4 bytes) --- @@ -11542,22 +12103,24 @@ GetFontID: ; GetFontInfo(FontInfoRecPtr) -> void ; tool 0x9604, set 0x04 (QuickDraw) + .section .text.GetFontInfo,"ax" .globl GetFontInfo GetFontInfo: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x9604 jsl 0xe10000 rtl ; GetFontLore(FontGlobalsRecPtr, Word) -> Word ; tool 0xD904, set 0x04 (QuickDraw) + .section .text.GetFontLore,"ax" .globl GetFontLore GetFontLore: ; --- stash arg0 (in A/X) --- @@ -11566,10 +12129,10 @@ GetFontLore: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -11580,6 +12143,7 @@ GetFontLore: ; GetGrafProcs(void) -> QDProcsPtr ; tool 0x4504, set 0x04 (QuickDraw) + .section .text.GetGrafProcs,"ax" .globl GetGrafProcs GetGrafProcs: ; --- result space (4 bytes) --- @@ -11593,86 +12157,92 @@ GetGrafProcs: ; GetPen(Point) -> void ; tool 0x2904, set 0x04 (QuickDraw) + .section .text.GetPen,"ax" .globl GetPen GetPen: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2904 jsl 0xe10000 rtl ; GetPenMask(Mask) -> void ; tool 0x3304, set 0x04 (QuickDraw) + .section .text.GetPenMask,"ax" .globl GetPenMask GetPenMask: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3304 jsl 0xe10000 rtl ; GetPenPat(Pattern) -> void ; tool 0x3104, set 0x04 (QuickDraw) + .section .text.GetPenPat,"ax" .globl GetPenPat GetPenPat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3104 jsl 0xe10000 rtl ; GetPenSize(Point) -> void ; tool 0x2D04, set 0x04 (QuickDraw) + .section .text.GetPenSize,"ax" .globl GetPenSize GetPenSize: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2D04 jsl 0xe10000 rtl ; GetPenState(PenStatePtr) -> void ; tool 0x2B04, set 0x04 (QuickDraw) + .section .text.GetPenState,"ax" .globl GetPenState GetPenState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2B04 jsl 0xe10000 rtl ; GetPicSave(void) -> Longint ; tool 0x3F04, set 0x04 (QuickDraw) + .section .text.GetPicSave,"ax" .globl GetPicSave GetPicSave: ; --- result space (4 bytes) --- @@ -11686,6 +12256,7 @@ GetPicSave: ; GetPixel(Integer, Integer) -> Word ; tool 0x8804, set 0x04 (QuickDraw) + .section .text.GetPixel,"ax" .globl GetPixel GetPixel: ; --- stash arg0 (in A) --- @@ -11705,6 +12276,7 @@ GetPixel: ; GetPolySave(void) -> LongWord ; tool 0x4304, set 0x04 (QuickDraw) + .section .text.GetPolySave,"ax" .globl GetPolySave GetPolySave: ; --- result space (4 bytes) --- @@ -11718,6 +12290,7 @@ GetPolySave: ; GetPort(void) -> GrafPortPtr ; tool 0x1C04, set 0x04 (QuickDraw) + .section .text.GetPort,"ax" .globl GetPort GetPort: ; --- result space (4 bytes) --- @@ -11731,38 +12304,41 @@ GetPort: ; GetPortLoc(LocInfoPtr) -> void ; tool 0x1E04, set 0x04 (QuickDraw) + .section .text.GetPortLoc,"ax" .globl GetPortLoc GetPortLoc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1E04 jsl 0xe10000 rtl ; GetPortRect(Rect) -> void ; tool 0x2004, set 0x04 (QuickDraw) + .section .text.GetPortRect,"ax" .globl GetPortRect GetPortRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2004 jsl 0xe10000 rtl ; GetRgnSave(void) -> LongWord ; tool 0x4104, set 0x04 (QuickDraw) + .section .text.GetRgnSave,"ax" .globl GetRgnSave GetRgnSave: ; --- result space (4 bytes) --- @@ -11776,38 +12352,41 @@ GetRgnSave: ; GetROMFont(RomFontRecPtr) -> void ; tool 0xD804, set 0x04 (QuickDraw) + .section .text.GetROMFont,"ax" .globl GetROMFont GetROMFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xD804 jsl 0xe10000 rtl ; GetRomFont(RomFontRecPtr) -> void ; tool 0xD804, set 0x04 (QuickDraw) + .section .text.GetRomFont,"ax" .globl GetRomFont GetRomFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xD804 jsl 0xe10000 rtl ; GetSpaceExtra(void) -> Fixed ; tool 0x9F04, set 0x04 (QuickDraw) + .section .text.GetSpaceExtra,"ax" .globl GetSpaceExtra GetSpaceExtra: ; --- result space (4 bytes) --- @@ -11821,6 +12400,7 @@ GetSpaceExtra: ; GetSysField(void) -> Longint ; tool 0x4904, set 0x04 (QuickDraw) + .section .text.GetSysField,"ax" .globl GetSysField GetSysField: ; --- result space (4 bytes) --- @@ -11834,6 +12414,7 @@ GetSysField: ; GetSysFont(void) -> FontHndl ; tool 0xB304, set 0x04 (QuickDraw) + .section .text.GetSysFont,"ax" .globl GetSysFont GetSysFont: ; --- result space (4 bytes) --- @@ -11847,6 +12428,7 @@ GetSysFont: ; GetTextFace(void) -> TextStyle ; tool 0x9B04, set 0x04 (QuickDraw) + .section .text.GetTextFace,"ax" .globl GetTextFace GetTextFace: ; --- result space (4 bytes) --- @@ -11860,6 +12442,7 @@ GetTextFace: ; GetUserField(void) -> Longint ; tool 0x4704, set 0x04 (QuickDraw) + .section .text.GetUserField,"ax" .globl GetUserField GetUserField: ; --- result space (4 bytes) --- @@ -11873,6 +12456,7 @@ GetUserField: ; GetVisHandle(void) -> RegionHndl ; tool 0xC904, set 0x04 (QuickDraw) + .section .text.GetVisHandle,"ax" .globl GetVisHandle GetVisHandle: ; --- result space (4 bytes) --- @@ -11886,38 +12470,41 @@ GetVisHandle: ; GetVisRgn(RegionHndl) -> void ; tool 0xB504, set 0x04 (QuickDraw) + .section .text.GetVisRgn,"ax" .globl GetVisRgn GetVisRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xB504 jsl 0xe10000 rtl ; GlobalToLocal(Point) -> void ; tool 0x8504, set 0x04 (QuickDraw) + .section .text.GlobalToLocal,"ax" .globl GlobalToLocal GlobalToLocal: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x8504 jsl 0xe10000 rtl ; InflateTextBuffer(Word, Word) -> void ; tool 0xD704, set 0x04 (QuickDraw) + .section .text.InflateTextBuffer,"ax" .globl InflateTextBuffer InflateTextBuffer: ; --- stash arg0 (in A) --- @@ -11934,48 +12521,51 @@ InflateTextBuffer: ; InitColorTable(ColorTable) -> void ; tool 0x0D04, set 0x04 (QuickDraw) + .section .text.InitColorTable,"ax" .globl InitColorTable InitColorTable: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0D04 jsl 0xe10000 rtl ; InitPort(GrafPortPtr) -> void ; tool 0x1904, set 0x04 (QuickDraw) + .section .text.InitPort,"ax" .globl InitPort InitPort: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1904 jsl 0xe10000 rtl ; InsetRect(Rect, Integer, Integer) -> void ; tool 0x4C04, set 0x04 (QuickDraw) + .section .text.InsetRect,"ax" .globl InsetRect InsetRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -11988,16 +12578,17 @@ InsetRect: ; InsetRgn(RegionHndl, Integer, Integer) -> void ; tool 0x7004, set 0x04 (QuickDraw) + .section .text.InsetRgn,"ax" .globl InsetRgn InsetRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12010,16 +12601,17 @@ InsetRgn: ; InvertArc(Rect, Integer, Integer) -> void ; tool 0x6504, set 0x04 (QuickDraw) + .section .text.InvertArc,"ax" .globl InvertArc InvertArc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12032,80 +12624,85 @@ InvertArc: ; InvertOval(Rect) -> void ; tool 0x5B04, set 0x04 (QuickDraw) + .section .text.InvertOval,"ax" .globl InvertOval InvertOval: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5B04 jsl 0xe10000 rtl ; InvertPoly(Handle) -> void ; tool 0xBF04, set 0x04 (QuickDraw) + .section .text.InvertPoly,"ax" .globl InvertPoly InvertPoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xBF04 jsl 0xe10000 rtl ; InvertRect(Rect) -> void ; tool 0x5604, set 0x04 (QuickDraw) + .section .text.InvertRect,"ax" .globl InvertRect InvertRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5604 jsl 0xe10000 rtl ; InvertRgn(RegionHndl) -> void ; tool 0x7C04, set 0x04 (QuickDraw) + .section .text.InvertRgn,"ax" .globl InvertRgn InvertRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x7C04 jsl 0xe10000 rtl ; InvertRRect(Rect, Word, Word) -> void ; tool 0x6004, set 0x04 (QuickDraw) + .section .text.InvertRRect,"ax" .globl InvertRRect InvertRRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -12118,22 +12715,24 @@ InvertRRect: ; KillPoly(Handle) -> void ; tool 0xC304, set 0x04 (QuickDraw) + .section .text.KillPoly,"ax" .globl KillPoly KillPoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xC304 jsl 0xe10000 rtl ; Line(Integer, Integer) -> void ; tool 0x3D04, set 0x04 (QuickDraw) + .section .text.Line,"ax" .globl Line Line: ; --- stash arg0 (in A) --- @@ -12150,6 +12749,7 @@ Line: ; LineTo(Integer, Integer) -> void ; tool 0x3C04, set 0x04 (QuickDraw) + .section .text.LineTo,"ax" .globl LineTo LineTo: ; --- stash arg0 (in A) --- @@ -12166,39 +12766,41 @@ LineTo: ; LocalToGlobal(Point) -> void ; tool 0x8404, set 0x04 (QuickDraw) + .section .text.LocalToGlobal,"ax" .globl LocalToGlobal LocalToGlobal: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x8404 jsl 0xe10000 rtl ; MapPoly(Handle, Rect, Rect) -> void ; tool 0xC504, set 0x04 (QuickDraw) + .section .text.MapPoly,"ax" .globl MapPoly MapPoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12208,23 +12810,24 @@ MapPoly: ; MapPt(Point, Rect, Rect) -> void ; tool 0x8A04, set 0x04 (QuickDraw) + .section .text.MapPt,"ax" .globl MapPt MapPt: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12234,23 +12837,24 @@ MapPt: ; MapRect(Rect, Rect, Rect) -> void ; tool 0x8B04, set 0x04 (QuickDraw) + .section .text.MapRect,"ax" .globl MapRect MapRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12260,23 +12864,24 @@ MapRect: ; MapRgn(RegionHndl, Rect, Rect) -> void ; tool 0x8C04, set 0x04 (QuickDraw) + .section .text.MapRgn,"ax" .globl MapRgn MapRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12286,6 +12891,7 @@ MapRgn: ; Move(Integer, Integer) -> void ; tool 0x3B04, set 0x04 (QuickDraw) + .section .text.Move,"ax" .globl Move Move: ; --- stash arg0 (in A) --- @@ -12302,6 +12908,7 @@ Move: ; MovePortTo(Integer, Integer) -> void ; tool 0x2204, set 0x04 (QuickDraw) + .section .text.MovePortTo,"ax" .globl MovePortTo MovePortTo: ; --- stash arg0 (in A) --- @@ -12318,6 +12925,7 @@ MovePortTo: ; MoveTo(Integer, Integer) -> void ; tool 0x3A04, set 0x04 (QuickDraw) + .section .text.MoveTo,"ax" .globl MoveTo MoveTo: ; --- stash arg0 (in A) --- @@ -12334,6 +12942,7 @@ MoveTo: ; NewRgn(void) -> RegionHndl ; tool 0x6704, set 0x04 (QuickDraw) + .section .text.NewRgn,"ax" .globl NewRgn NewRgn: ; --- result space (4 bytes) --- @@ -12347,6 +12956,7 @@ NewRgn: ; NotEmptyRect(Rect) -> Boolean ; tool 0x5204, set 0x04 (QuickDraw) + .section .text.NotEmptyRect,"ax" .globl NotEmptyRect NotEmptyRect: ; --- stash arg0 (in A/X) --- @@ -12355,10 +12965,10 @@ NotEmptyRect: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5204 jsl 0xe10000 pla ; result -> A @@ -12366,16 +12976,17 @@ NotEmptyRect: ; OffsetPoly(Handle, Integer, Integer) -> void ; tool 0xC404, set 0x04 (QuickDraw) + .section .text.OffsetPoly,"ax" .globl OffsetPoly OffsetPoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12388,16 +12999,17 @@ OffsetPoly: ; OffsetRect(Rect, Integer, Integer) -> void ; tool 0x4B04, set 0x04 (QuickDraw) + .section .text.OffsetRect,"ax" .globl OffsetRect OffsetRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12410,16 +13022,17 @@ OffsetRect: ; OffsetRgn(RegionHndl, Integer, Integer) -> void ; tool 0x6F04, set 0x04 (QuickDraw) + .section .text.OffsetRgn,"ax" .globl OffsetRgn OffsetRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12432,6 +13045,7 @@ OffsetRgn: ; OpenPoly(void) -> handle ; tool 0xC104, set 0x04 (QuickDraw) + .section .text.OpenPoly,"ax" .globl OpenPoly OpenPoly: ; --- result space (4 bytes) --- @@ -12445,32 +13059,34 @@ OpenPoly: ; OpenPort(GrafPortPtr) -> void ; tool 0x1804, set 0x04 (QuickDraw) + .section .text.OpenPort,"ax" .globl OpenPort OpenPort: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1804 jsl 0xe10000 rtl ; PaintArc(Rect, Integer, Integer) -> void ; tool 0x6304, set 0x04 (QuickDraw) + .section .text.PaintArc,"ax" .globl PaintArc PaintArc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12483,96 +13099,102 @@ PaintArc: ; PaintOval(Rect) -> void ; tool 0x5904, set 0x04 (QuickDraw) + .section .text.PaintOval,"ax" .globl PaintOval PaintOval: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5904 jsl 0xe10000 rtl ; PaintPixels(PaintParamPtr) -> void ; tool 0x7F04, set 0x04 (QuickDraw) + .section .text.PaintPixels,"ax" .globl PaintPixels PaintPixels: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x7F04 jsl 0xe10000 rtl ; PaintPoly(Handle) -> void ; tool 0xBD04, set 0x04 (QuickDraw) + .section .text.PaintPoly,"ax" .globl PaintPoly PaintPoly: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xBD04 jsl 0xe10000 rtl ; PaintRect(Rect) -> void ; tool 0x5404, set 0x04 (QuickDraw) + .section .text.PaintRect,"ax" .globl PaintRect PaintRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5404 jsl 0xe10000 rtl ; PaintRgn(RegionHndl) -> void ; tool 0x7A04, set 0x04 (QuickDraw) + .section .text.PaintRgn,"ax" .globl PaintRgn PaintRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x7A04 jsl 0xe10000 rtl ; PaintRRect(Rect, Word, Word) -> void ; tool 0x5E04, set 0x04 (QuickDraw) + .section .text.PaintRRect,"ax" .globl PaintRRect PaintRRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -12585,18 +13207,19 @@ PaintRRect: ; PPToPort(LocInfoPtr, Rect, Integer, Integer, Word) -> void ; tool 0xD604, set 0x04 (QuickDraw) + .section .text.PPToPort,"ax" .globl PPToPort PPToPort: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -12615,23 +13238,24 @@ PPToPort: ; Pt2Rect(Point, Point, Rect) -> void ; tool 0x5004, set 0x04 (QuickDraw) + .section .text.Pt2Rect,"ax" .globl Pt2Rect Pt2Rect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Point, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12641,6 +13265,7 @@ Pt2Rect: ; PtInRect(Point, Rect) -> Boolean ; tool 0x4F04, set 0x04 (QuickDraw) + .section .text.PtInRect,"ax" .globl PtInRect PtInRect: ; --- stash arg0 (in A/X) --- @@ -12649,12 +13274,12 @@ PtInRect: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -12665,6 +13290,7 @@ PtInRect: ; PtInRgn(Point, RegionHndl) -> Boolean ; tool 0x7504, set 0x04 (QuickDraw) + .section .text.PtInRgn,"ax" .globl PtInRgn PtInRgn: ; --- stash arg0 (in A/X) --- @@ -12673,12 +13299,12 @@ PtInRgn: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -12689,6 +13315,7 @@ PtInRgn: ; RectInRgn(Rect, RegionHndl) -> Boolean ; tool 0x7604, set 0x04 (QuickDraw) + .section .text.RectInRgn,"ax" .globl RectInRgn RectInRgn: ; --- stash arg0 (in A/X) --- @@ -12697,12 +13324,12 @@ RectInRgn: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -12713,18 +13340,19 @@ RectInRgn: ; RectRgn(RegionHndl, Rect) -> void ; tool 0x6C04, set 0x04 (QuickDraw) + .section .text.RectRgn,"ax" .globl RectRgn RectRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -12734,55 +13362,58 @@ RectRgn: ; RestoreBufDims(BufDimRecPtr) -> void ; tool 0xCE04, set 0x04 (QuickDraw) + .section .text.RestoreBufDims,"ax" .globl RestoreBufDims RestoreBufDims: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xCE04 jsl 0xe10000 rtl ; SaveBufDims(BufDimRecPtr) -> void ; tool 0xCD04, set 0x04 (QuickDraw) + .section .text.SaveBufDims,"ax" .globl SaveBufDims SaveBufDims: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xCD04 jsl 0xe10000 rtl ; ScalePt(Point, Rect, Rect) -> void ; tool 0x8904, set 0x04 (QuickDraw) + .section .text.ScalePt,"ax" .globl ScalePt ScalePt: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12792,16 +13423,17 @@ ScalePt: ; ScrollRect(Rect, Integer, Integer, RegionHndl) -> void ; tool 0x7E04, set 0x04 (QuickDraw) + .section .text.ScrollRect,"ax" .globl ScrollRect ScrollRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -12809,7 +13441,7 @@ ScrollRect: lda 12, s pha ; --- arg3 (RegionHndl, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12819,6 +13451,7 @@ ScrollRect: ; SectRect(Rect, Rect, Rect) -> Boolean ; tool 0x4D04, set 0x04 (QuickDraw) + .section .text.SectRect,"ax" .globl SectRect SectRect: ; --- stash arg0 (in A/X) --- @@ -12827,17 +13460,17 @@ SectRect: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Rect, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -12848,23 +13481,24 @@ SectRect: ; SectRgn(RegionHndl, RegionHndl, RegionHndl) -> void ; tool 0x7104, set 0x04 (QuickDraw) + .section .text.SectRgn,"ax" .globl SectRgn SectRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (RegionHndl, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -12874,22 +13508,24 @@ SectRgn: ; SetBackPat(Pattern) -> void ; tool 0x3404, set 0x04 (QuickDraw) + .section .text.SetBackPat,"ax" .globl SetBackPat SetBackPat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3404 jsl 0xe10000 rtl ; SetBufDims(Word, Word, Word) -> void ; tool 0xCB04, set 0x04 (QuickDraw) + .section .text.SetBufDims,"ax" .globl SetBufDims SetBufDims: ; --- stash arg0 (in A) --- @@ -12909,54 +13545,58 @@ SetBufDims: ; SetCharExtra(Fixed) -> void ; tool 0xD404, set 0x04 (QuickDraw) + .section .text.SetCharExtra,"ax" .globl SetCharExtra SetCharExtra: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xD404 jsl 0xe10000 rtl ; SetClip(RegionHndl) -> void ; tool 0x2404, set 0x04 (QuickDraw) + .section .text.SetClip,"ax" .globl SetClip SetClip: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2404 jsl 0xe10000 rtl ; SetClipHandle(RegionHndl) -> void ; tool 0xC604, set 0x04 (QuickDraw) + .section .text.SetClipHandle,"ax" .globl SetClipHandle SetClipHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xC604 jsl 0xe10000 rtl ; SetColorEntry(Word, Word, ColorValue) -> void ; tool 0x1004, set 0x04 (QuickDraw) + .section .text.SetColorEntry,"ax" .globl SetColorEntry SetColorEntry: ; --- stash arg0 (in A) --- @@ -12968,7 +13608,7 @@ SetColorEntry: lda 6, s pha ; --- arg2 (ColorValue, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -12978,6 +13618,7 @@ SetColorEntry: ; SetColorTable(Word, ColorTable) -> void ; tool 0x0E04, set 0x04 (QuickDraw) + .section .text.SetColorTable,"ax" .globl SetColorTable SetColorTable: ; --- stash arg0 (in A) --- @@ -12986,7 +13627,7 @@ SetColorTable: lda 0xE0 pha ; --- arg1 (ColorTable, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -12996,86 +13637,92 @@ SetColorTable: ; SetCursor(Pointer) -> void ; tool 0x8E04, set 0x04 (QuickDraw) + .section .text.SetCursor,"ax" .globl SetCursor SetCursor: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x8E04 jsl 0xe10000 rtl ; SetEmptyRgn(RegionHndl) -> void ; tool 0x6A04, set 0x04 (QuickDraw) + .section .text.SetEmptyRgn,"ax" .globl SetEmptyRgn SetEmptyRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x6A04 jsl 0xe10000 rtl ; SetFont(FontHndl) -> void ; tool 0x9404, set 0x04 (QuickDraw) + .section .text.SetFont,"ax" .globl SetFont SetFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x9404 jsl 0xe10000 rtl ; SetFontID(FontID) -> void ; tool 0xD004, set 0x04 (QuickDraw) + .section .text.SetFontID,"ax" .globl SetFontID SetFontID: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xD004 jsl 0xe10000 rtl ; SetGrafProcs(QDProcsPtr) -> void ; tool 0x4404, set 0x04 (QuickDraw) + .section .text.SetGrafProcs,"ax" .globl SetGrafProcs SetGrafProcs: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4404 jsl 0xe10000 rtl ; SetOrigin(Integer, Integer) -> void ; tool 0x2304, set 0x04 (QuickDraw) + .section .text.SetOrigin,"ax" .globl SetOrigin SetOrigin: ; --- stash arg0 (in A) --- @@ -13092,38 +13739,41 @@ SetOrigin: ; SetPenMask(Mask) -> void ; tool 0x3204, set 0x04 (QuickDraw) + .section .text.SetPenMask,"ax" .globl SetPenMask SetPenMask: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3204 jsl 0xe10000 rtl ; SetPenPat(Pattern) -> void ; tool 0x3004, set 0x04 (QuickDraw) + .section .text.SetPenPat,"ax" .globl SetPenPat SetPenPat: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3004 jsl 0xe10000 rtl ; SetPenSize(Word, Word) -> void ; tool 0x2C04, set 0x04 (QuickDraw) + .section .text.SetPenSize,"ax" .globl SetPenSize SetPenSize: ; --- stash arg0 (in A) --- @@ -13140,102 +13790,109 @@ SetPenSize: ; SetPenState(PenStatePtr) -> void ; tool 0x2A04, set 0x04 (QuickDraw) + .section .text.SetPenState,"ax" .globl SetPenState SetPenState: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2A04 jsl 0xe10000 rtl ; SetPicSave(Longint) -> void ; tool 0x3E04, set 0x04 (QuickDraw) + .section .text.SetPicSave,"ax" .globl SetPicSave SetPicSave: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3E04 jsl 0xe10000 rtl ; SetPolySave(Longint) -> void ; tool 0x4204, set 0x04 (QuickDraw) + .section .text.SetPolySave,"ax" .globl SetPolySave SetPolySave: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4204 jsl 0xe10000 rtl ; SetPort(GrafPortPtr) -> void ; tool 0x1B04, set 0x04 (QuickDraw) + .section .text.SetPort,"ax" .globl SetPort SetPort: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1B04 jsl 0xe10000 rtl ; SetPortLoc(LocInfoPtr) -> void ; tool 0x1D04, set 0x04 (QuickDraw) + .section .text.SetPortLoc,"ax" .globl SetPortLoc SetPortLoc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1D04 jsl 0xe10000 rtl ; SetPortRect(Rect) -> void ; tool 0x1F04, set 0x04 (QuickDraw) + .section .text.SetPortRect,"ax" .globl SetPortRect SetPortRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1F04 jsl 0xe10000 rtl ; SetPortSize(Word, Word) -> void ; tool 0x2104, set 0x04 (QuickDraw) + .section .text.SetPortSize,"ax" .globl SetPortSize SetPortSize: ; --- stash arg0 (in A) --- @@ -13252,16 +13909,17 @@ SetPortSize: ; SetPt(Point, Integer, Integer) -> void ; tool 0x8204, set 0x04 (QuickDraw) + .section .text.SetPt,"ax" .globl SetPt SetPt: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -13274,32 +13932,34 @@ SetPt: ; SetRandSeed(Longint) -> void ; tool 0x8704, set 0x04 (QuickDraw) + .section .text.SetRandSeed,"ax" .globl SetRandSeed SetRandSeed: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x8704 jsl 0xe10000 rtl ; SetRect(Rect, Integer, Integer, Integer, Integer) -> void ; tool 0x4A04, set 0x04 (QuickDraw) + .section .text.SetRect,"ax" .globl SetRect SetRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -13318,16 +13978,17 @@ SetRect: ; SetRectRgn(RegionHndl, Integer, Integer, Integer, Integer) -> void ; tool 0x6B04, set 0x04 (QuickDraw) + .section .text.SetRectRgn,"ax" .globl SetRectRgn SetRectRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 8, s pha @@ -13346,22 +14007,24 @@ SetRectRgn: ; SetRgnSave(Handle) -> void ; tool 0x4004, set 0x04 (QuickDraw) + .section .text.SetRgnSave,"ax" .globl SetRgnSave SetRgnSave: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4004 jsl 0xe10000 rtl ; SetSCB(Word, Word) -> void ; tool 0x1204, set 0x04 (QuickDraw) + .section .text.SetSCB,"ax" .globl SetSCB SetSCB: ; --- stash arg0 (in A) --- @@ -13378,134 +14041,143 @@ SetSCB: ; SetSpaceExtra(Fixed) -> void ; tool 0x9E04, set 0x04 (QuickDraw) + .section .text.SetSpaceExtra,"ax" .globl SetSpaceExtra SetSpaceExtra: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x9E04 jsl 0xe10000 rtl ; SetStdProcs(QDProcsPtr) -> void ; tool 0x8D04, set 0x04 (QuickDraw) + .section .text.SetStdProcs,"ax" .globl SetStdProcs SetStdProcs: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x8D04 jsl 0xe10000 rtl ; SetSysField(Longint) -> void ; tool 0x4804, set 0x04 (QuickDraw) + .section .text.SetSysField,"ax" .globl SetSysField SetSysField: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4804 jsl 0xe10000 rtl ; SetSysFont(FontHndl) -> void ; tool 0xB204, set 0x04 (QuickDraw) + .section .text.SetSysFont,"ax" .globl SetSysFont SetSysFont: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xB204 jsl 0xe10000 rtl ; SetTextFace(TextStyle) -> void ; tool 0x9A04, set 0x04 (QuickDraw) + .section .text.SetTextFace,"ax" .globl SetTextFace SetTextFace: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x9A04 jsl 0xe10000 rtl ; SetUserField(Longint) -> void ; tool 0x4604, set 0x04 (QuickDraw) + .section .text.SetUserField,"ax" .globl SetUserField SetUserField: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4604 jsl 0xe10000 rtl ; SetVisHandle(RegionHndl) -> void ; tool 0xC804, set 0x04 (QuickDraw) + .section .text.SetVisHandle,"ax" .globl SetVisHandle SetVisHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xC804 jsl 0xe10000 rtl ; SetVisRgn(RegionHndl) -> void ; tool 0xB404, set 0x04 (QuickDraw) + .section .text.SetVisRgn,"ax" .globl SetVisRgn SetVisRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xB404 jsl 0xe10000 rtl ; SolidPattern(Word, Pattern) -> void ; tool 0x3904, set 0x04 (QuickDraw) + .section .text.SolidPattern,"ax" .globl SolidPattern SolidPattern: ; --- stash arg0 (in A) --- @@ -13514,7 +14186,7 @@ SolidPattern: lda 0xE0 pha ; --- arg1 (Pattern, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -13524,18 +14196,19 @@ SolidPattern: ; StringBounds(Pointer, Rect) -> void ; tool 0xAD04, set 0x04 (QuickDraw) + .section .text.StringBounds,"ax" .globl StringBounds StringBounds: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -13545,6 +14218,7 @@ StringBounds: ; StringWidth(Pointer) -> Word ; tool 0xA904, set 0x04 (QuickDraw) + .section .text.StringWidth,"ax" .globl StringWidth StringWidth: ; --- stash arg0 (in A/X) --- @@ -13553,10 +14227,10 @@ StringWidth: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0xA904 jsl 0xe10000 pla ; result -> A @@ -13564,18 +14238,19 @@ StringWidth: ; SubPt(Point, Point) -> void ; tool 0x8104, set 0x04 (QuickDraw) + .section .text.SubPt,"ax" .globl SubPt SubPt: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Point, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -13585,21 +14260,22 @@ SubPt: ; TextBounds(Pointer, Word, Rect) -> void ; tool 0xAF04, set 0x04 (QuickDraw) + .section .text.TextBounds,"ax" .globl TextBounds TextBounds: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Rect, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -13609,6 +14285,7 @@ TextBounds: ; TextWidth(Pointer, Word) -> Word ; tool 0xAB04, set 0x04 (QuickDraw) + .section .text.TextWidth,"ax" .globl TextWidth TextWidth: ; --- stash arg0 (in A/X) --- @@ -13617,10 +14294,10 @@ TextWidth: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -13631,23 +14308,24 @@ TextWidth: ; UnionRect(Rect, Rect, Rect) -> void ; tool 0x4E04, set 0x04 (QuickDraw) + .section .text.UnionRect,"ax" .globl UnionRect UnionRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Rect, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -13657,23 +14335,24 @@ UnionRect: ; UnionRgn(RegionHndl, RegionHndl, RegionHndl) -> void ; tool 0x7204, set 0x04 (QuickDraw) + .section .text.UnionRgn,"ax" .globl UnionRgn UnionRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (RegionHndl, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -13683,23 +14362,24 @@ UnionRgn: ; XorRgn(RegionHndl, RegionHndl, RegionHndl) -> void ; tool 0x7404, set 0x04 (QuickDraw) + .section .text.XorRgn,"ax" .globl XorRgn XorRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (RegionHndl, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (RegionHndl, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -13709,6 +14389,7 @@ XorRgn: ; Get640Colors(void) -> PatternPtr ; tool 0xDA04, set 0x04 (QuickDraw) + .section .text.Get640Colors,"ax" .globl Get640Colors Get640Colors: ; --- result space (4 bytes) --- @@ -13722,16 +14403,17 @@ Get640Colors: ; AddResource(Handle, Word, Word, Long) -> void ; tool 0x0C1E, set 0x1E (ResourceManager) + .section .text.AddResource,"ax" .globl AddResource AddResource: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -13739,7 +14421,7 @@ AddResource: lda 12, s pha ; --- arg3 (Long, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -13749,6 +14431,7 @@ AddResource: ; CountResources(Word) -> LongWord ; tool 0x221E, set 0x1E (ResourceManager) + .section .text.CountResources,"ax" .globl CountResources CountResources: ; --- stash arg0 (in A) --- @@ -13767,16 +14450,17 @@ CountResources: ; CreateResourceFile(Long, Word, Word, Pointer) -> void ; tool 0x091E, set 0x1E (ResourceManager) + .section .text.CreateResourceFile,"ax" .globl CreateResourceFile CreateResourceFile: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -13784,7 +14468,7 @@ CreateResourceFile: lda 12, s pha ; --- arg3 (Pointer, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -13794,6 +14478,7 @@ CreateResourceFile: ; DetachResource(Word, Long) -> void ; tool 0x181E, set 0x1E (ResourceManager) + .section .text.DetachResource,"ax" .globl DetachResource DetachResource: ; --- stash arg0 (in A) --- @@ -13802,7 +14487,7 @@ DetachResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -13812,6 +14497,7 @@ DetachResource: ; GetIndResource(Word, Long) -> ResID ; tool 0x231E, set 0x1E (ResourceManager) + .section .text.GetIndResource,"ax" .globl GetIndResource GetIndResource: ; --- stash arg0 (in A) --- @@ -13823,7 +14509,7 @@ GetIndResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -13835,6 +14521,7 @@ GetIndResource: ; GetIndType(Word) -> ResType ; tool 0x211E, set 0x1E (ResourceManager) + .section .text.GetIndType,"ax" .globl GetIndType GetIndType: ; --- stash arg0 (in A) --- @@ -13853,6 +14540,7 @@ GetIndType: ; GetMapHandle(Word) -> ResMapHndl ; tool 0x261E, set 0x1E (ResourceManager) + .section .text.GetMapHandle,"ax" .globl GetMapHandle GetMapHandle: ; --- stash arg0 (in A) --- @@ -13871,6 +14559,7 @@ GetMapHandle: ; GetResourceAttr(Word, Long) -> ResAttr ; tool 0x1B1E, set 0x1E (ResourceManager) + .section .text.GetResourceAttr,"ax" .globl GetResourceAttr GetResourceAttr: ; --- stash arg0 (in A) --- @@ -13882,7 +14571,7 @@ GetResourceAttr: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -13894,6 +14583,7 @@ GetResourceAttr: ; GetResourceSize(Word, Long) -> LongWord ; tool 0x1D1E, set 0x1E (ResourceManager) + .section .text.GetResourceSize,"ax" .globl GetResourceSize GetResourceSize: ; --- stash arg0 (in A) --- @@ -13905,7 +14595,7 @@ GetResourceSize: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -13917,6 +14607,7 @@ GetResourceSize: ; HomeResourceFile(Word, Long) -> Word ; tool 0x151E, set 0x1E (ResourceManager) + .section .text.HomeResourceFile,"ax" .globl HomeResourceFile HomeResourceFile: ; --- stash arg0 (in A) --- @@ -13927,7 +14618,7 @@ HomeResourceFile: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -13938,6 +14629,7 @@ HomeResourceFile: ; LoadAbsResource(Pointer, Long, Word, Long) -> LongWord ; tool 0x271E, set 0x1E (ResourceManager) + .section .text.LoadAbsResource,"ax" .globl LoadAbsResource LoadAbsResource: ; --- stash arg0 (in A/X) --- @@ -13947,12 +14639,12 @@ LoadAbsResource: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -13960,7 +14652,7 @@ LoadAbsResource: lda 20, s pha ; --- arg3 (Long, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -13972,6 +14664,7 @@ LoadAbsResource: ; LoadResource(Word, Long) -> Handle ; tool 0x0E1E, set 0x1E (ResourceManager) + .section .text.LoadResource,"ax" .globl LoadResource LoadResource: ; --- stash arg0 (in A) --- @@ -13983,7 +14676,7 @@ LoadResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -13995,6 +14688,7 @@ LoadResource: ; MarkResourceChange(Word, Word, Long) -> void ; tool 0x101E, set 0x1E (ResourceManager) + .section .text.MarkResourceChange,"ax" .globl MarkResourceChange MarkResourceChange: ; --- stash arg0 (in A) --- @@ -14006,7 +14700,7 @@ MarkResourceChange: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14016,18 +14710,19 @@ MarkResourceChange: ; MatchResourceHandle(Pointer, Handle) -> void ; tool 0x1E1E, set 0x1E (ResourceManager) + .section .text.MatchResourceHandle,"ax" .globl MatchResourceHandle MatchResourceHandle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -14037,6 +14732,7 @@ MatchResourceHandle: ; OpenResourceFile(Word, Pointer, Pointer) -> Word ; tool 0x0A1E, set 0x1E (ResourceManager) + .section .text.OpenResourceFile,"ax" .globl OpenResourceFile OpenResourceFile: ; --- stash arg0 (in A) --- @@ -14047,12 +14743,12 @@ OpenResourceFile: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Pointer, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -14063,6 +14759,7 @@ OpenResourceFile: ; ReleaseResource(Word, Word, Long) -> void ; tool 0x171E, set 0x1E (ResourceManager) + .section .text.ReleaseResource,"ax" .globl ReleaseResource ReleaseResource: ; --- stash arg0 (in A) --- @@ -14074,7 +14771,7 @@ ReleaseResource: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14084,6 +14781,7 @@ ReleaseResource: ; RemoveResource(Word, Long) -> void ; tool 0x0F1E, set 0x1E (ResourceManager) + .section .text.RemoveResource,"ax" .globl RemoveResource RemoveResource: ; --- stash arg0 (in A) --- @@ -14092,7 +14790,7 @@ RemoveResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -14102,16 +14800,17 @@ RemoveResource: ; ResourceConverter(Pointer, Word, Word) -> void ; tool 0x281E, set 0x1E (ResourceManager) + .section .text.ResourceConverter,"ax" .globl ResourceConverter ResourceConverter: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -14124,6 +14823,7 @@ ResourceConverter: ; SetResourceAttr(Word, Word, Long) -> void ; tool 0x1C1E, set 0x1E (ResourceManager) + .section .text.SetResourceAttr,"ax" .globl SetResourceAttr SetResourceAttr: ; --- stash arg0 (in A) --- @@ -14135,7 +14835,7 @@ SetResourceAttr: lda 6, s pha ; --- arg2 (Long, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14145,21 +14845,22 @@ SetResourceAttr: ; SetResourceID(Long, Word, Long) -> void ; tool 0x1A1E, set 0x1E (ResourceManager) + .section .text.SetResourceID,"ax" .globl SetResourceID SetResourceID: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -14169,6 +14870,7 @@ SetResourceID: ; UniqueResourceID(Word, Word) -> ResID ; tool 0x191E, set 0x1E (ResourceManager) + .section .text.UniqueResourceID,"ax" .globl UniqueResourceID UniqueResourceID: ; --- stash arg0 (in A) --- @@ -14190,6 +14892,7 @@ UniqueResourceID: ; WriteResource(Word, Long) -> void ; tool 0x161E, set 0x1E (ResourceManager) + .section .text.WriteResource,"ax" .globl WriteResource WriteResource: ; --- stash arg0 (in A) --- @@ -14198,7 +14901,7 @@ WriteResource: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -14208,6 +14911,7 @@ WriteResource: ; LoadResource2(Word, Ptr, Word, Long) -> Handle ; tool 0x291E, set 0x1E (ResourceManager) + .section .text.LoadResource2,"ax" .globl LoadResource2 LoadResource2: ; --- stash arg0 (in A) --- @@ -14219,7 +14923,7 @@ LoadResource2: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14227,7 +14931,7 @@ LoadResource2: lda 18, s pha ; --- arg3 (Long, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha @@ -14239,6 +14943,7 @@ LoadResource2: ; RMFindNamedResource(Word, Ptr, Word) -> LongWord ; tool 0x2A1E, set 0x1E (ResourceManager) + .section .text.RMFindNamedResource,"ax" .globl RMFindNamedResource RMFindNamedResource: ; --- stash arg0 (in A) --- @@ -14250,7 +14955,7 @@ RMFindNamedResource: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14265,6 +14970,7 @@ RMFindNamedResource: ; RMGetResourceName(Word, Long, Ptr) -> void ; tool 0x2B1E, set 0x1E (ResourceManager) + .section .text.RMGetResourceName,"ax" .globl RMGetResourceName RMGetResourceName: ; --- stash arg0 (in A) --- @@ -14273,12 +14979,12 @@ RMGetResourceName: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Ptr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -14288,6 +14994,7 @@ RMGetResourceName: ; RMLoadNamedResource(Word, Ptr) -> Handle ; tool 0x2C1E, set 0x1E (ResourceManager) + .section .text.RMLoadNamedResource,"ax" .globl RMLoadNamedResource RMLoadNamedResource: ; --- stash arg0 (in A) --- @@ -14299,7 +15006,7 @@ RMLoadNamedResource: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14311,6 +15018,7 @@ RMLoadNamedResource: ; RMSetResourceName(Word, Long, Ptr) -> void ; tool 0x2D1E, set 0x1E (ResourceManager) + .section .text.RMSetResourceName,"ax" .globl RMSetResourceName RMSetResourceName: ; --- stash arg0 (in A) --- @@ -14319,12 +15027,12 @@ RMSetResourceName: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Ptr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -14334,6 +15042,7 @@ RMSetResourceName: ; OpenResourceFileByID(Word, Word) -> Word ; tool 0x2E1E, set 0x1E (ResourceManager) + .section .text.OpenResourceFileByID,"ax" .globl OpenResourceFileByID OpenResourceFileByID: ; --- stash arg0 (in A) --- @@ -14353,6 +15062,7 @@ OpenResourceFileByID: ; CompactResourceFile(Word, Word) -> void ; tool 0x2F1E, set 0x1E (ResourceManager) + .section .text.CompactResourceFile,"ax" .globl CompactResourceFile CompactResourceFile: ; --- stash arg0 (in A) --- @@ -14369,6 +15079,7 @@ CompactResourceFile: ; SchAddTask(VoidProcPtr) -> Boolean ; tool 0x0907, set 0x07 (Scheduler) + .section .text.SchAddTask,"ax" .globl SchAddTask SchAddTask: ; --- stash arg0 (in A/X) --- @@ -14377,10 +15088,10 @@ SchAddTask: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0907 jsl 0xe10000 pla ; result -> A @@ -14388,16 +15099,17 @@ SchAddTask: ; GetScrap(Handle, Word) -> void ; tool 0x0D16, set 0x16 (ScrapManager) + .section .text.GetScrap,"ax" .globl GetScrap GetScrap: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -14407,6 +15119,7 @@ GetScrap: ; GetScrapHandle(Word) -> handle ; tool 0x0E16, set 0x16 (ScrapManager) + .section .text.GetScrapHandle,"ax" .globl GetScrapHandle GetScrapHandle: ; --- stash arg0 (in A) --- @@ -14425,6 +15138,7 @@ GetScrapHandle: ; GetScrapPath(void) -> Pointer ; tool 0x1016, set 0x16 (ScrapManager) + .section .text.GetScrapPath,"ax" .globl GetScrapPath GetScrapPath: ; --- result space (4 bytes) --- @@ -14438,6 +15152,7 @@ GetScrapPath: ; GetScrapSize(Word) -> LongWord ; tool 0x0F16, set 0x16 (ScrapManager) + .section .text.GetScrapSize,"ax" .globl GetScrapSize GetScrapSize: ; --- stash arg0 (in A) --- @@ -14456,21 +15171,22 @@ GetScrapSize: ; PutScrap(LongWord, Word, Pointer) -> void ; tool 0x0C16, set 0x16 (ScrapManager) + .section .text.PutScrap,"ax" .globl PutScrap PutScrap: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Pointer, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -14480,22 +15196,24 @@ PutScrap: ; SetScrapPath(Pointer) -> void ; tool 0x1116, set 0x16 (ScrapManager) + .section .text.SetScrapPath,"ax" .globl SetScrapPath SetScrapPath: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1116 jsl 0xe10000 rtl ; GetIndScrap(Word, Ptr) -> void ; tool 0x1416, set 0x16 (ScrapManager) + .section .text.GetIndScrap,"ax" .globl GetIndScrap GetIndScrap: ; --- stash arg0 (in A) --- @@ -14504,7 +15222,7 @@ GetIndScrap: lda 0xE0 pha ; --- arg1 (Ptr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -14514,6 +15232,7 @@ GetIndScrap: ; ShowClipboard(Word, Rect) -> GrafPortPtr ; tool 0x1516, set 0x16 (ScrapManager) + .section .text.ShowClipboard,"ax" .globl ShowClipboard ShowClipboard: ; --- stash arg0 (in A) --- @@ -14525,7 +15244,7 @@ ShowClipboard: lda 0xE0 pha ; --- arg1 (Rect, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14537,6 +15256,7 @@ ShowClipboard: ; FFStartSound(Word, Pointer) -> void ; tool 0x0E08, set 0x08 (SoundManager) + .section .text.FFStartSound,"ax" .globl FFStartSound FFStartSound: ; --- stash arg0 (in A) --- @@ -14545,7 +15265,7 @@ FFStartSound: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -14555,6 +15275,7 @@ FFStartSound: ; GetTableAddress(void) -> Pointer ; tool 0x0B08, set 0x08 (SoundManager) + .section .text.GetTableAddress,"ax" .globl GetTableAddress GetTableAddress: ; --- result space (4 bytes) --- @@ -14568,16 +15289,17 @@ GetTableAddress: ; ReadRamBlock(Pointer, Word, Word) -> void ; tool 0x0A08, set 0x08 (SoundManager) + .section .text.ReadRamBlock,"ax" .globl ReadRamBlock ReadRamBlock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -14590,22 +15312,24 @@ ReadRamBlock: ; SetSoundMIRQV(VoidProcPtr) -> void ; tool 0x1208, set 0x08 (SoundManager) + .section .text.SetSoundMIRQV,"ax" .globl SetSoundMIRQV SetSoundMIRQV: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1208 jsl 0xe10000 rtl ; SetSoundVolume(Word, Word) -> void ; tool 0x0D08, set 0x08 (SoundManager) + .section .text.SetSoundVolume,"ax" .globl SetSoundVolume SetSoundVolume: ; --- stash arg0 (in A) --- @@ -14622,6 +15346,7 @@ SetSoundVolume: ; SetUserSoundIRQV(VoidProcPtr) -> ProcPtr ; tool 0x1308, set 0x08 (SoundManager) + .section .text.SetUserSoundIRQV,"ax" .globl SetUserSoundIRQV SetUserSoundIRQV: ; --- stash arg0 (in A/X) --- @@ -14631,10 +15356,10 @@ SetUserSoundIRQV: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1308 jsl 0xe10000 pla ; result lo -> A @@ -14643,16 +15368,17 @@ SetUserSoundIRQV: ; WriteRamBlock(Pointer, Word, Word) -> void ; tool 0x0908, set 0x08 (SoundManager) + .section .text.WriteRamBlock,"ax" .globl WriteRamBlock WriteRamBlock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -14665,6 +15391,7 @@ WriteRamBlock: ; FFSetUpSound(Word, Pointer) -> void ; tool 0x1508, set 0x08 (SoundManager) + .section .text.FFSetUpSound,"ax" .globl FFSetUpSound FFSetUpSound: ; --- stash arg0 (in A) --- @@ -14673,7 +15400,7 @@ FFSetUpSound: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -14683,38 +15410,41 @@ FFSetUpSound: ; ReadDOCReg(Pointer) -> void ; tool 0x1808, set 0x08 (SoundManager) + .section .text.ReadDOCReg,"ax" .globl ReadDOCReg ReadDOCReg: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1808 jsl 0xe10000 rtl ; SetDOCReg(Pointer) -> void ; tool 0x1708, set 0x08 (SoundManager) + .section .text.SetDOCReg,"ax" .globl SetDOCReg SetDOCReg: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1708 jsl 0xe10000 rtl ; SFStartUp(Word, Word) -> void ; tool 0x0217, set 0x17 (StandardFile) + .section .text.SFStartUp,"ax" .globl SFStartUp SFStartUp: ; --- stash arg0 (in A) --- @@ -14731,6 +15461,7 @@ SFStartUp: ; SFGetFile(Integer, Integer, Pointer, WordProcPtr, Pointer, SFReplyRecPtr) -> void ; tool 0x0917, set 0x17 (StandardFile) + .section .text.SFGetFile,"ax" .globl SFGetFile SFGetFile: ; --- stash arg0 (in A) --- @@ -14742,22 +15473,22 @@ SFGetFile: lda 6, s pha ; --- arg2 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (WordProcPtr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha ; --- arg4 (Pointer, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha ; --- arg5 (SFReplyRecPtr, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha @@ -14767,6 +15498,7 @@ SFGetFile: ; SFPGetFile(Integer, Integer, Pointer, WordProcPtr, Pointer, Pointer, VoidProcPtr, SFReplyRecPtr) -> void ; tool 0x0B17, set 0x17 (StandardFile) + .section .text.SFPGetFile,"ax" .globl SFPGetFile SFPGetFile: ; --- stash arg0 (in A) --- @@ -14778,32 +15510,32 @@ SFPGetFile: lda 6, s pha ; --- arg2 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (WordProcPtr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha ; --- arg4 (Pointer, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha ; --- arg5 (Pointer, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha ; --- arg6 (VoidProcPtr, 4B) --- - lda 42, s + lda 44, s pha lda 44, s pha ; --- arg7 (SFReplyRecPtr, 4B) --- - lda 50, s + lda 52, s pha lda 52, s pha @@ -14813,6 +15545,7 @@ SFPGetFile: ; SFPPutFile(Integer, Integer, Pointer, Pointer, Word, Pointer, VoidProcPtr, SFReplyRecPtr) -> void ; tool 0x0C17, set 0x17 (StandardFile) + .section .text.SFPPutFile,"ax" .globl SFPPutFile SFPPutFile: ; --- stash arg0 (in A) --- @@ -14824,12 +15557,12 @@ SFPPutFile: lda 6, s pha ; --- arg2 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (Pointer, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -14837,17 +15570,17 @@ SFPPutFile: lda 26, s pha ; --- arg5 (Pointer, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha ; --- arg6 (VoidProcPtr, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha ; --- arg7 (SFReplyRecPtr, 4B) --- - lda 46, s + lda 48, s pha lda 48, s pha @@ -14857,6 +15590,7 @@ SFPPutFile: ; SFPutFile(Integer, Integer, Pointer, Pointer, Word, SFReplyRecPtr) -> void ; tool 0x0A17, set 0x17 (StandardFile) + .section .text.SFPutFile,"ax" .globl SFPutFile SFPutFile: ; --- stash arg0 (in A) --- @@ -14868,12 +15602,12 @@ SFPutFile: lda 6, s pha ; --- arg2 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg3 (Pointer, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -14881,7 +15615,7 @@ SFPutFile: lda 26, s pha ; --- arg5 (SFReplyRecPtr, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha @@ -14891,6 +15625,7 @@ SFPutFile: ; SFGetFile2(Integer, Integer, Word, Ref, WordProcPtr, SFTypeList2Ptr, SFReplyRec2Ptr) -> void ; tool 0x0E17, set 0x17 (StandardFile) + .section .text.SFGetFile2,"ax" .globl SFGetFile2 SFGetFile2: ; --- stash arg0 (in A) --- @@ -14905,22 +15640,22 @@ SFGetFile2: lda 10, s pha ; --- arg3 (Ref, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha ; --- arg4 (WordProcPtr, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha ; --- arg5 (SFTypeList2Ptr, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha ; --- arg6 (SFReplyRec2Ptr, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha @@ -14930,6 +15665,7 @@ SFGetFile2: ; SFMultiGet2(Integer, Integer, Word, Ref, WordProcPtr, SFTypeList2Ptr, MultiReplyPtr) -> void ; tool 0x1417, set 0x17 (StandardFile) + .section .text.SFMultiGet2,"ax" .globl SFMultiGet2 SFMultiGet2: ; --- stash arg0 (in A) --- @@ -14944,22 +15680,22 @@ SFMultiGet2: lda 10, s pha ; --- arg3 (Ref, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha ; --- arg4 (WordProcPtr, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha ; --- arg5 (SFTypeList2Ptr, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha ; --- arg6 (MultiReplyPtr, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha @@ -14969,6 +15705,7 @@ SFMultiGet2: ; SFPGetFile2(Integer, Integer, VoidProcPtr, Word, Ref, WordProcPtr, SFTypeList2Ptr, Pointer, VoidProcPtr, SFReplyRec2Ptr) -> void ; tool 0x1017, set 0x17 (StandardFile) + .section .text.SFPGetFile2,"ax" .globl SFPGetFile2 SFPGetFile2: ; --- stash arg0 (in A) --- @@ -14980,7 +15717,7 @@ SFPGetFile2: lda 6, s pha ; --- arg2 (VoidProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -14988,32 +15725,32 @@ SFPGetFile2: lda 18, s pha ; --- arg4 (Ref, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha ; --- arg5 (WordProcPtr, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha ; --- arg6 (SFTypeList2Ptr, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha ; --- arg7 (Pointer, 4B) --- - lda 46, s + lda 48, s pha lda 48, s pha ; --- arg8 (VoidProcPtr, 4B) --- - lda 54, s + lda 56, s pha lda 56, s pha ; --- arg9 (SFReplyRec2Ptr, 4B) --- - lda 62, s + lda 64, s pha lda 64, s pha @@ -15023,6 +15760,7 @@ SFPGetFile2: ; SFPMultiGet2(Integer, Integer, VoidProcPtr, Word, Ref, WordProcPtr, SFTypeList2Ptr, Pointer, VoidProcPtr, MultiReplyPtr) -> void ; tool 0x1517, set 0x17 (StandardFile) + .section .text.SFPMultiGet2,"ax" .globl SFPMultiGet2 SFPMultiGet2: ; --- stash arg0 (in A) --- @@ -15034,7 +15772,7 @@ SFPMultiGet2: lda 6, s pha ; --- arg2 (VoidProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -15042,32 +15780,32 @@ SFPMultiGet2: lda 18, s pha ; --- arg4 (Ref, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha ; --- arg5 (WordProcPtr, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha ; --- arg6 (SFTypeList2Ptr, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha ; --- arg7 (Pointer, 4B) --- - lda 46, s + lda 48, s pha lda 48, s pha ; --- arg8 (VoidProcPtr, 4B) --- - lda 54, s + lda 56, s pha lda 56, s pha ; --- arg9 (MultiReplyPtr, 4B) --- - lda 62, s + lda 64, s pha lda 64, s pha @@ -15077,6 +15815,7 @@ SFPMultiGet2: ; SFPPutFile2(Integer, Integer, VoidProcPtr, Word, Ref, Word, Ref, Pointer, VoidProcPtr, SFReplyRec2Ptr) -> void ; tool 0x1117, set 0x17 (StandardFile) + .section .text.SFPPutFile2,"ax" .globl SFPPutFile2 SFPPutFile2: ; --- stash arg0 (in A) --- @@ -15088,7 +15827,7 @@ SFPPutFile2: lda 6, s pha ; --- arg2 (VoidProcPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -15096,7 +15835,7 @@ SFPPutFile2: lda 18, s pha ; --- arg4 (Ref, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha @@ -15104,22 +15843,22 @@ SFPPutFile2: lda 30, s pha ; --- arg6 (Ref, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha ; --- arg7 (Pointer, 4B) --- - lda 42, s + lda 44, s pha lda 44, s pha ; --- arg8 (VoidProcPtr, 4B) --- - lda 50, s + lda 52, s pha lda 52, s pha ; --- arg9 (SFReplyRec2Ptr, 4B) --- - lda 58, s + lda 60, s pha lda 60, s pha @@ -15129,6 +15868,7 @@ SFPPutFile2: ; SFPutFile2(Integer, Integer, Word, Ref, Word, Ref, SFReplyRec2Ptr) -> void ; tool 0x0F17, set 0x17 (StandardFile) + .section .text.SFPutFile2,"ax" .globl SFPutFile2 SFPutFile2: ; --- stash arg0 (in A) --- @@ -15143,7 +15883,7 @@ SFPutFile2: lda 10, s pha ; --- arg3 (Ref, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15151,12 +15891,12 @@ SFPutFile2: lda 22, s pha ; --- arg5 (Ref, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha ; --- arg6 (SFReplyRec2Ptr, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha @@ -15166,18 +15906,19 @@ SFPutFile2: ; SFReScan(WordProcPtr, SFTypeList2Ptr) -> void ; tool 0x1317, set 0x17 (StandardFile) + .section .text.SFReScan,"ax" .globl SFReScan SFReScan: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (SFTypeList2Ptr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -15187,6 +15928,7 @@ SFReScan: ; TEStartUp(Word, Word) -> void ; tool 0x0222, set 0x22 (TextEdit) + .section .text.TEStartUp,"ax" .globl TEStartUp TEStartUp: ; --- stash arg0 (in A) --- @@ -15203,50 +15945,53 @@ TEStartUp: ; TEActivate(Handle) -> void ; tool 0x0F22, set 0x22 (TextEdit) + .section .text.TEActivate,"ax" .globl TEActivate TEActivate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0F22 jsl 0xe10000 rtl ; TEClear(Handle) -> void ; tool 0x1922, set 0x22 (TextEdit) + .section .text.TEClear,"ax" .globl TEClear TEClear: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1922 jsl 0xe10000 rtl ; TEClick(EventRecordPtr, Handle) -> void ; tool 0x1122, set 0x22 (TextEdit) + .section .text.TEClick,"ax" .globl TEClick TEClick: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -15256,70 +16001,75 @@ TEClick: ; TECompactRecord(Handle) -> void ; tool 0x2822, set 0x22 (TextEdit) + .section .text.TECompactRecord,"ax" .globl TECompactRecord TECompactRecord: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2822 jsl 0xe10000 rtl ; TECopy(Handle) -> void ; tool 0x1722, set 0x22 (TextEdit) + .section .text.TECopy,"ax" .globl TECopy TECopy: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1722 jsl 0xe10000 rtl ; TECut(Handle) -> void ; tool 0x1622, set 0x22 (TextEdit) + .section .text.TECut,"ax" .globl TECut TECut: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1622 jsl 0xe10000 rtl ; TEDeactivate(Handle) -> void ; tool 0x1022, set 0x22 (TextEdit) + .section .text.TEDeactivate,"ax" .globl TEDeactivate TEDeactivate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1022 jsl 0xe10000 rtl ; TEGetDefProc(void) -> ProcPtr ; tool 0x2222, set 0x22 (TextEdit) + .section .text.TEGetDefProc,"ax" .globl TEGetDefProc TEGetDefProc: ; --- result space (4 bytes) --- @@ -15333,6 +16083,7 @@ TEGetDefProc: ; TEGetInternalProc(void) -> ProcPtr ; tool 0x2622, set 0x22 (TextEdit) + .section .text.TEGetInternalProc,"ax" .globl TEGetInternalProc TEGetInternalProc: ; --- result space (4 bytes) --- @@ -15346,6 +16097,7 @@ TEGetInternalProc: ; TEGetLastError(Word, Handle) -> Word ; tool 0x2722, set 0x22 (TextEdit) + .section .text.TEGetLastError,"ax" .globl TEGetLastError TEGetLastError: ; --- stash arg0 (in A) --- @@ -15356,7 +16108,7 @@ TEGetLastError: lda 0xE0 pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -15367,6 +16119,7 @@ TEGetLastError: ; TEGetRuler(Word, Ref, Handle) -> void ; tool 0x2322, set 0x22 (TextEdit) + .section .text.TEGetRuler,"ax" .globl TEGetRuler TEGetRuler: ; --- stash arg0 (in A) --- @@ -15375,12 +16128,12 @@ TEGetRuler: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15390,23 +16143,24 @@ TEGetRuler: ; TEGetSelection(Pointer, Pointer, Handle) -> void ; tool 0x1C22, set 0x22 (TextEdit) + .section .text.TEGetSelection,"ax" .globl TEGetSelection TEGetSelection: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -15416,6 +16170,7 @@ TEGetSelection: ; TEGetSelectionStyle(TEStylePtr, Handle, Handle) -> Word ; tool 0x1E22, set 0x22 (TextEdit) + .section .text.TEGetSelectionStyle,"ax" .globl TEGetSelectionStyle TEGetSelectionStyle: ; --- stash arg0 (in A/X) --- @@ -15424,17 +16179,17 @@ TEGetSelectionStyle: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Handle, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -15445,6 +16200,7 @@ TEGetSelectionStyle: ; TEGetText(Word, Ref, Long, Word, Ref, Handle) -> LongWord ; tool 0x0C22, set 0x22 (TextEdit) + .section .text.TEGetText,"ax" .globl TEGetText TEGetText: ; --- stash arg0 (in A) --- @@ -15456,12 +16212,12 @@ TEGetText: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Long, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -15469,12 +16225,12 @@ TEGetText: lda 26, s pha ; --- arg4 (Ref, 4B) --- - lda 30, s + lda 32, s pha lda 32, s pha ; --- arg5 (Handle, 4B) --- - lda 38, s + lda 40, s pha lda 40, s pha @@ -15486,21 +16242,22 @@ TEGetText: ; TEGetTextInfo(Pointer, Word, Handle) -> void ; tool 0x0D22, set 0x22 (TextEdit) + .section .text.TEGetTextInfo,"ax" .globl TEGetTextInfo TEGetTextInfo: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -15510,22 +16267,24 @@ TEGetTextInfo: ; TEIdle(Handle) -> void ; tool 0x0E22, set 0x22 (TextEdit) + .section .text.TEIdle,"ax" .globl TEIdle TEIdle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E22 jsl 0xe10000 rtl ; TEInsert(Word, Ref, Long, Word, Ref, Handle) -> void ; tool 0x1A22, set 0x22 (TextEdit) + .section .text.TEInsert,"ax" .globl TEInsert TEInsert: ; --- stash arg0 (in A) --- @@ -15534,12 +16293,12 @@ TEInsert: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15547,12 +16306,12 @@ TEInsert: lda 22, s pha ; --- arg4 (Ref, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha ; --- arg5 (Handle, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha @@ -15562,18 +16321,19 @@ TEInsert: ; TEKey(EventRecordPtr, Handle) -> void ; tool 0x1422, set 0x22 (TextEdit) + .section .text.TEKey,"ax" .globl TEKey TEKey: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Handle, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -15583,22 +16343,24 @@ TEKey: ; TEKill(Handle) -> void ; tool 0x0A22, set 0x22 (TextEdit) + .section .text.TEKill,"ax" .globl TEKill TEKill: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0A22 jsl 0xe10000 rtl ; TENew(TEParamBlockPtr) -> TERecordHndl ; tool 0x0922, set 0x22 (TextEdit) + .section .text.TENew,"ax" .globl TENew TENew: ; --- stash arg0 (in A/X) --- @@ -15608,10 +16370,10 @@ TENew: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0922 jsl 0xe10000 pla ; result lo -> A @@ -15620,28 +16382,29 @@ TENew: ; TEOffsetToPoint(Long, Long, Long, Handle) -> void ; tool 0x2022, set 0x22 (TextEdit) + .section .text.TEOffsetToPoint,"ax" .globl TEOffsetToPoint TEOffsetToPoint: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Long, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha ; --- arg3 (Handle, 4B) --- - lda 24, s + lda 26, s pha lda 26, s pha @@ -15651,6 +16414,7 @@ TEOffsetToPoint: ; TEPaintText(GrafPortPtr, Long, Rect, Word, Handle) -> LongWord ; tool 0x1322, set 0x22 (TextEdit) + .section .text.TEPaintText,"ax" .globl TEPaintText TEPaintText: ; --- stash arg0 (in A/X) --- @@ -15660,17 +16424,17 @@ TEPaintText: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg2 (Rect, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -15678,7 +16442,7 @@ TEPaintText: lda 28, s pha ; --- arg4 (Handle, 4B) --- - lda 32, s + lda 34, s pha lda 34, s pha @@ -15690,22 +16454,24 @@ TEPaintText: ; TEPaste(Handle) -> void ; tool 0x1822, set 0x22 (TextEdit) + .section .text.TEPaste,"ax" .globl TEPaste TEPaste: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1822 jsl 0xe10000 rtl ; TEPointToOffset(Long, Long, Handle) -> LongWord ; tool 0x2122, set 0x22 (TextEdit) + .section .text.TEPointToOffset,"ax" .globl TEPointToOffset TEPointToOffset: ; --- stash arg0 (in A/X) --- @@ -15715,17 +16481,17 @@ TEPointToOffset: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg2 (Handle, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha @@ -15737,6 +16503,7 @@ TEPointToOffset: ; TEReplace(Word, Ref, Long, Word, Ref, Handle) -> void ; tool 0x1B22, set 0x22 (TextEdit) + .section .text.TEReplace,"ax" .globl TEReplace TEReplace: ; --- stash arg0 (in A) --- @@ -15745,12 +16512,12 @@ TEReplace: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15758,12 +16525,12 @@ TEReplace: lda 22, s pha ; --- arg4 (Ref, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha ; --- arg5 (Handle, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha @@ -15773,6 +16540,7 @@ TEReplace: ; TEScroll(Word, Long, Long, Handle) -> void ; tool 0x2522, set 0x22 (TextEdit) + .section .text.TEScroll,"ax" .globl TEScroll TEScroll: ; --- stash arg0 (in A) --- @@ -15781,17 +16549,17 @@ TEScroll: lda 0xE0 pha ; --- arg1 (Long, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha ; --- arg3 (Handle, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha @@ -15801,6 +16569,7 @@ TEScroll: ; TESetRuler(Word, Ref, Handle) -> void ; tool 0x2422, set 0x22 (TextEdit) + .section .text.TESetRuler,"ax" .globl TESetRuler TESetRuler: ; --- stash arg0 (in A) --- @@ -15809,12 +16578,12 @@ TESetRuler: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15824,23 +16593,24 @@ TESetRuler: ; TESetSelection(Pointer, Pointer, Handle) -> void ; tool 0x1D22, set 0x22 (TextEdit) + .section .text.TESetSelection,"ax" .globl TESetSelection TESetSelection: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Handle, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -15850,6 +16620,7 @@ TESetSelection: ; TESetText(Word, Ref, Long, Word, Ref, Handle) -> void ; tool 0x0B22, set 0x22 (TextEdit) + .section .text.TESetText,"ax" .globl TESetText TESetText: ; --- stash arg0 (in A) --- @@ -15858,12 +16629,12 @@ TESetText: lda 0xE0 pha ; --- arg1 (Ref, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Long, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15871,12 +16642,12 @@ TESetText: lda 22, s pha ; --- arg4 (Ref, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha ; --- arg5 (Handle, 4B) --- - lda 34, s + lda 36, s pha lda 36, s pha @@ -15886,6 +16657,7 @@ TESetText: ; TEStyleChange(Word, TEStylePtr, Handle) -> void ; tool 0x1F22, set 0x22 (TextEdit) + .section .text.TEStyleChange,"ax" .globl TEStyleChange TEStyleChange: ; --- stash arg0 (in A) --- @@ -15894,12 +16666,12 @@ TEStyleChange: lda 0xE0 pha ; --- arg1 (TEStylePtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (Handle, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -15909,22 +16681,24 @@ TEStyleChange: ; TEUpdate(Handle) -> void ; tool 0x1222, set 0x22 (TextEdit) + .section .text.TEUpdate,"ax" .globl TEUpdate TEUpdate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1222 jsl 0xe10000 rtl ; CtlTextDev(Word, Word) -> void ; tool 0x160C, set 0x0C (TextTools) + .section .text.CtlTextDev,"ax" .globl CtlTextDev CtlTextDev: ; --- stash arg0 (in A) --- @@ -15941,16 +16715,17 @@ CtlTextDev: ; ErrWriteBlock(Pointer, Word, Word) -> void ; tool 0x1F0C, set 0x0C (TextTools) + .section .text.ErrWriteBlock,"ax" .globl ErrWriteBlock ErrWriteBlock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -15963,54 +16738,58 @@ ErrWriteBlock: ; ErrWriteCString(Pointer) -> void ; tool 0x210C, set 0x0C (TextTools) + .section .text.ErrWriteCString,"ax" .globl ErrWriteCString ErrWriteCString: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x210C jsl 0xe10000 rtl ; ErrWriteLine(Pointer) -> void ; tool 0x1B0C, set 0x0C (TextTools) + .section .text.ErrWriteLine,"ax" .globl ErrWriteLine ErrWriteLine: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1B0C jsl 0xe10000 rtl ; ErrWriteString(Pointer) -> void ; tool 0x1D0C, set 0x0C (TextTools) + .section .text.ErrWriteString,"ax" .globl ErrWriteString ErrWriteString: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1D0C jsl 0xe10000 rtl ; GetErrGlobals(void) -> Long ; tool 0x0E0C, set 0x0C (TextTools) + .section .text.GetErrGlobals,"ax" .globl GetErrGlobals GetErrGlobals: ; --- result space (4 bytes) --- @@ -16024,6 +16803,7 @@ GetErrGlobals: ; GetInGlobals(void) -> Long ; tool 0x0C0C, set 0x0C (TextTools) + .section .text.GetInGlobals,"ax" .globl GetInGlobals GetInGlobals: ; --- result space (4 bytes) --- @@ -16037,6 +16817,7 @@ GetInGlobals: ; GetOutGlobals(void) -> Long ; tool 0x0D0C, set 0x0C (TextTools) + .section .text.GetOutGlobals,"ax" .globl GetOutGlobals GetOutGlobals: ; --- result space (4 bytes) --- @@ -16050,6 +16831,7 @@ GetOutGlobals: ; ReadLine(Pointer, Word, Word, Word) -> Word ; tool 0x240C, set 0x0C (TextTools) + .section .text.ReadLine,"ax" .globl ReadLine ReadLine: ; --- stash arg0 (in A/X) --- @@ -16058,10 +16840,10 @@ ReadLine: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 10, s pha @@ -16078,6 +16860,7 @@ ReadLine: ; SetErrGlobals(Word, Word) -> void ; tool 0x0B0C, set 0x0C (TextTools) + .section .text.SetErrGlobals,"ax" .globl SetErrGlobals SetErrGlobals: ; --- stash arg0 (in A) --- @@ -16094,6 +16877,7 @@ SetErrGlobals: ; SetErrorDevice(Word, LongWord) -> void ; tool 0x110C, set 0x0C (TextTools) + .section .text.SetErrorDevice,"ax" .globl SetErrorDevice SetErrorDevice: ; --- stash arg0 (in A) --- @@ -16102,7 +16886,7 @@ SetErrorDevice: lda 0xE0 pha ; --- arg1 (LongWord, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -16112,6 +16896,7 @@ SetErrorDevice: ; SetInGlobals(Word, Word) -> void ; tool 0x090C, set 0x0C (TextTools) + .section .text.SetInGlobals,"ax" .globl SetInGlobals SetInGlobals: ; --- stash arg0 (in A) --- @@ -16128,6 +16913,7 @@ SetInGlobals: ; SetInputDevice(Word, LongWord) -> void ; tool 0x0F0C, set 0x0C (TextTools) + .section .text.SetInputDevice,"ax" .globl SetInputDevice SetInputDevice: ; --- stash arg0 (in A) --- @@ -16136,7 +16922,7 @@ SetInputDevice: lda 0xE0 pha ; --- arg1 (LongWord, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -16146,6 +16932,7 @@ SetInputDevice: ; SetOutGlobals(Word, Word) -> void ; tool 0x0A0C, set 0x0C (TextTools) + .section .text.SetOutGlobals,"ax" .globl SetOutGlobals SetOutGlobals: ; --- stash arg0 (in A) --- @@ -16162,6 +16949,7 @@ SetOutGlobals: ; SetOutputDevice(Word, LongWord) -> void ; tool 0x100C, set 0x0C (TextTools) + .section .text.SetOutputDevice,"ax" .globl SetOutputDevice SetOutputDevice: ; --- stash arg0 (in A) --- @@ -16170,7 +16958,7 @@ SetOutputDevice: lda 0xE0 pha ; --- arg1 (LongWord, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -16180,6 +16968,7 @@ SetOutputDevice: ; StatusTextDev(Word, Word) -> void ; tool 0x170C, set 0x0C (TextTools) + .section .text.StatusTextDev,"ax" .globl StatusTextDev StatusTextDev: ; --- stash arg0 (in A) --- @@ -16196,16 +16985,17 @@ StatusTextDev: ; TextReadBlock(Pointer, Word, Word, Word) -> void ; tool 0x230C, set 0x0C (TextTools) + .section .text.TextReadBlock,"ax" .globl TextReadBlock TextReadBlock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -16221,16 +17011,17 @@ TextReadBlock: ; TextWriteBlock(Pointer, Word, Word) -> void ; tool 0x1E0C, set 0x0C (TextTools) + .section .text.TextWriteBlock,"ax" .globl TextWriteBlock TextWriteBlock: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Word, 2B) --- lda 8, s pha @@ -16243,54 +17034,58 @@ TextWriteBlock: ; WriteCString(Pointer) -> void ; tool 0x200C, set 0x0C (TextTools) + .section .text.WriteCString,"ax" .globl WriteCString WriteCString: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x200C jsl 0xe10000 rtl ; WriteLine(Pointer) -> void ; tool 0x1A0C, set 0x0C (TextTools) + .section .text.WriteLine,"ax" .globl WriteLine WriteLine: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1A0C jsl 0xe10000 rtl ; WriteString(Pointer) -> void ; tool 0x1C0C, set 0x0C (TextTools) + .section .text.WriteString,"ax" .globl WriteString WriteString: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1C0C jsl 0xe10000 rtl ; VDGGControl(Word, Word) -> void ; tool 0x1D21, set 0x21 (Teletext) + .section .text.VDGGControl,"ax" .globl VDGGControl VDGGControl: ; --- stash arg0 (in A) --- @@ -16307,6 +17102,7 @@ VDGGControl: ; VDInControl(Word, Word) -> void ; tool 0x1C21, set 0x21 (Teletext) + .section .text.VDInControl,"ax" .globl VDInControl VDInControl: ; --- stash arg0 (in A) --- @@ -16323,6 +17119,7 @@ VDInControl: ; VDInConvAdj(Word, Word) -> void ; tool 0x0C21, set 0x21 (Teletext) + .section .text.VDInConvAdj,"ax" .globl VDInConvAdj VDInConvAdj: ; --- stash arg0 (in A) --- @@ -16339,6 +17136,7 @@ VDInConvAdj: ; VDKeyControl(Word, Word) -> void ; tool 0x0D21, set 0x21 (Teletext) + .section .text.VDKeyControl,"ax" .globl VDKeyControl VDKeyControl: ; --- stash arg0 (in A) --- @@ -16355,6 +17153,7 @@ VDKeyControl: ; VDKeySetKCol(Word, Word, Word) -> void ; tool 0x0F21, set 0x21 (Teletext) + .section .text.VDKeySetKCol,"ax" .globl VDKeySetKCol VDKeySetKCol: ; --- stash arg0 (in A) --- @@ -16374,6 +17173,7 @@ VDKeySetKCol: ; VDOutControl(Word, Word) -> void ; tool 0x1921, set 0x21 (Teletext) + .section .text.VDOutControl,"ax" .globl VDOutControl VDOutControl: ; --- stash arg0 (in A) --- @@ -16390,38 +17190,41 @@ VDOutControl: ; BeginUpdate(GrafPortPtr) -> void ; tool 0x1E0E, set 0x0E (WindowManager) + .section .text.BeginUpdate,"ax" .globl BeginUpdate BeginUpdate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1E0E jsl 0xe10000 rtl ; BringToFront(GrafPortPtr) -> void ; tool 0x240E, set 0x0E (WindowManager) + .section .text.BringToFront,"ax" .globl BringToFront BringToFront: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x240E jsl 0xe10000 rtl ; CheckUpdate(EventRecordPtr) -> Boolean ; tool 0x0A0E, set 0x0E (WindowManager) + .section .text.CheckUpdate,"ax" .globl CheckUpdate CheckUpdate: ; --- stash arg0 (in A/X) --- @@ -16430,10 +17233,10 @@ CheckUpdate: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0A0E jsl 0xe10000 pla ; result -> A @@ -16441,22 +17244,24 @@ CheckUpdate: ; CloseWindow(GrafPortPtr) -> void ; tool 0x0B0E, set 0x0E (WindowManager) + .section .text.CloseWindow,"ax" .globl CloseWindow CloseWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0B0E jsl 0xe10000 rtl ; Desktop(Word, LongWord) -> Pointer ; tool 0x0C0E, set 0x0E (WindowManager) + .section .text.Desktop,"ax" .globl Desktop Desktop: ; --- stash arg0 (in A) --- @@ -16468,7 +17273,7 @@ Desktop: lda 0xE0 pha ; --- arg1 (LongWord, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -16480,6 +17285,7 @@ Desktop: ; DragWindow(Word, Integer, Integer, Word, Rect, GrafPortPtr) -> void ; tool 0x1A0E, set 0x0E (WindowManager) + .section .text.DragWindow,"ax" .globl DragWindow DragWindow: ; --- stash arg0 (in A) --- @@ -16497,12 +17303,12 @@ DragWindow: lda 14, s pha ; --- arg4 (Rect, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha ; --- arg5 (GrafPortPtr, 4B) --- - lda 26, s + lda 28, s pha lda 28, s pha @@ -16512,22 +17318,24 @@ DragWindow: ; EndUpdate(GrafPortPtr) -> void ; tool 0x1F0E, set 0x0E (WindowManager) + .section .text.EndUpdate,"ax" .globl EndUpdate EndUpdate: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x1F0E jsl 0xe10000 rtl ; FindWindow(GrafPortPtr, Integer, Integer) -> Word ; tool 0x170E, set 0x0E (WindowManager) + .section .text.FindWindow,"ax" .globl FindWindow FindWindow: ; --- stash arg0 (in A/X) --- @@ -16536,10 +17344,10 @@ FindWindow: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 10, s pha @@ -16553,6 +17361,7 @@ FindWindow: ; FrontWindow(void) -> WindowPtr ; tool 0x150E, set 0x0E (WindowManager) + .section .text.FrontWindow,"ax" .globl FrontWindow FrontWindow: ; --- result space (4 bytes) --- @@ -16566,6 +17375,7 @@ FrontWindow: ; GetContentDraw(GrafPortPtr) -> VoidProcPtr ; tool 0x480E, set 0x0E (WindowManager) + .section .text.GetContentDraw,"ax" .globl GetContentDraw GetContentDraw: ; --- stash arg0 (in A/X) --- @@ -16575,10 +17385,10 @@ GetContentDraw: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x480E jsl 0xe10000 pla ; result lo -> A @@ -16587,6 +17397,7 @@ GetContentDraw: ; GetContentOrigin(GrafPortPtr) -> Long ; tool 0x3E0E, set 0x0E (WindowManager) + .section .text.GetContentOrigin,"ax" .globl GetContentOrigin GetContentOrigin: ; --- stash arg0 (in A/X) --- @@ -16596,10 +17407,10 @@ GetContentOrigin: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3E0E jsl 0xe10000 pla ; result lo -> A @@ -16608,6 +17419,7 @@ GetContentOrigin: ; GetContentRgn(GrafPortPtr) -> RegionHndl ; tool 0x2F0E, set 0x0E (WindowManager) + .section .text.GetContentRgn,"ax" .globl GetContentRgn GetContentRgn: ; --- stash arg0 (in A/X) --- @@ -16617,10 +17429,10 @@ GetContentRgn: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2F0E jsl 0xe10000 pla ; result lo -> A @@ -16629,6 +17441,7 @@ GetContentRgn: ; GetDataSize(GrafPortPtr) -> LongWord ; tool 0x400E, set 0x0E (WindowManager) + .section .text.GetDataSize,"ax" .globl GetDataSize GetDataSize: ; --- stash arg0 (in A/X) --- @@ -16638,10 +17451,10 @@ GetDataSize: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x400E jsl 0xe10000 pla ; result lo -> A @@ -16650,6 +17463,7 @@ GetDataSize: ; GetDefProc(GrafPortPtr) -> LongProcPtr ; tool 0x310E, set 0x0E (WindowManager) + .section .text.GetDefProc,"ax" .globl GetDefProc GetDefProc: ; --- stash arg0 (in A/X) --- @@ -16659,10 +17473,10 @@ GetDefProc: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x310E jsl 0xe10000 pla ; result lo -> A @@ -16671,6 +17485,7 @@ GetDefProc: ; GetFirstWindow(void) -> WindowPtr ; tool 0x520E, set 0x0E (WindowManager) + .section .text.GetFirstWindow,"ax" .globl GetFirstWindow GetFirstWindow: ; --- result space (4 bytes) --- @@ -16684,18 +17499,19 @@ GetFirstWindow: ; GetFrameColor(WindColorPtr, GrafPortPtr) -> void ; tool 0x100E, set 0x0E (WindowManager) + .section .text.GetFrameColor,"ax" .globl GetFrameColor GetFrameColor: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -16705,6 +17521,7 @@ GetFrameColor: ; GetInfoDraw(GrafPortPtr) -> VoidProcPtr ; tool 0x4A0E, set 0x0E (WindowManager) + .section .text.GetInfoDraw,"ax" .globl GetInfoDraw GetInfoDraw: ; --- stash arg0 (in A/X) --- @@ -16714,10 +17531,10 @@ GetInfoDraw: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4A0E jsl 0xe10000 pla ; result lo -> A @@ -16726,6 +17543,7 @@ GetInfoDraw: ; GetInfoRefCon(GrafPortPtr) -> LongWord ; tool 0x350E, set 0x0E (WindowManager) + .section .text.GetInfoRefCon,"ax" .globl GetInfoRefCon GetInfoRefCon: ; --- stash arg0 (in A/X) --- @@ -16735,10 +17553,10 @@ GetInfoRefCon: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x350E jsl 0xe10000 pla ; result lo -> A @@ -16747,6 +17565,7 @@ GetInfoRefCon: ; GetMaxGrow(GrafPortPtr) -> LongWord ; tool 0x420E, set 0x0E (WindowManager) + .section .text.GetMaxGrow,"ax" .globl GetMaxGrow GetMaxGrow: ; --- stash arg0 (in A/X) --- @@ -16756,10 +17575,10 @@ GetMaxGrow: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x420E jsl 0xe10000 pla ; result lo -> A @@ -16768,6 +17587,7 @@ GetMaxGrow: ; GetNextWindow(GrafPortPtr) -> WindowPtr ; tool 0x2A0E, set 0x0E (WindowManager) + .section .text.GetNextWindow,"ax" .globl GetNextWindow GetNextWindow: ; --- stash arg0 (in A/X) --- @@ -16777,10 +17597,10 @@ GetNextWindow: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2A0E jsl 0xe10000 pla ; result lo -> A @@ -16789,6 +17609,7 @@ GetNextWindow: ; GetPage(GrafPortPtr) -> LongWord ; tool 0x460E, set 0x0E (WindowManager) + .section .text.GetPage,"ax" .globl GetPage GetPage: ; --- stash arg0 (in A/X) --- @@ -16798,10 +17619,10 @@ GetPage: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x460E jsl 0xe10000 pla ; result lo -> A @@ -16810,18 +17631,19 @@ GetPage: ; GetRectInfo(Rect, GrafPortPtr) -> void ; tool 0x4F0E, set 0x0E (WindowManager) + .section .text.GetRectInfo,"ax" .globl GetRectInfo GetRectInfo: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -16831,6 +17653,7 @@ GetRectInfo: ; GetScroll(GrafPortPtr) -> LongWord ; tool 0x440E, set 0x0E (WindowManager) + .section .text.GetScroll,"ax" .globl GetScroll GetScroll: ; --- stash arg0 (in A/X) --- @@ -16840,10 +17663,10 @@ GetScroll: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x440E jsl 0xe10000 pla ; result lo -> A @@ -16852,6 +17675,7 @@ GetScroll: ; GetStructRgn(GrafPortPtr) -> RegionHndl ; tool 0x2E0E, set 0x0E (WindowManager) + .section .text.GetStructRgn,"ax" .globl GetStructRgn GetStructRgn: ; --- stash arg0 (in A/X) --- @@ -16861,10 +17685,10 @@ GetStructRgn: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2E0E jsl 0xe10000 pla ; result lo -> A @@ -16873,6 +17697,7 @@ GetStructRgn: ; GetSysWFlag(GrafPortPtr) -> Boolean ; tool 0x4C0E, set 0x0E (WindowManager) + .section .text.GetSysWFlag,"ax" .globl GetSysWFlag GetSysWFlag: ; --- stash arg0 (in A/X) --- @@ -16881,10 +17706,10 @@ GetSysWFlag: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4C0E jsl 0xe10000 pla ; result -> A @@ -16892,6 +17717,7 @@ GetSysWFlag: ; GetUpdateRgn(GrafPortPtr) -> RegionHndl ; tool 0x300E, set 0x0E (WindowManager) + .section .text.GetUpdateRgn,"ax" .globl GetUpdateRgn GetUpdateRgn: ; --- stash arg0 (in A/X) --- @@ -16901,10 +17727,10 @@ GetUpdateRgn: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x300E jsl 0xe10000 pla ; result lo -> A @@ -16913,6 +17739,7 @@ GetUpdateRgn: ; GetWControls(GrafPortPtr) -> CtlRecHndl ; tool 0x330E, set 0x0E (WindowManager) + .section .text.GetWControls,"ax" .globl GetWControls GetWControls: ; --- stash arg0 (in A/X) --- @@ -16922,10 +17749,10 @@ GetWControls: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x330E jsl 0xe10000 pla ; result lo -> A @@ -16934,6 +17761,7 @@ GetWControls: ; GetWFrame(GrafPortPtr) -> Word ; tool 0x2C0E, set 0x0E (WindowManager) + .section .text.GetWFrame,"ax" .globl GetWFrame GetWFrame: ; --- stash arg0 (in A/X) --- @@ -16942,10 +17770,10 @@ GetWFrame: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2C0E jsl 0xe10000 pla ; result -> A @@ -16953,6 +17781,7 @@ GetWFrame: ; GetWKind(GrafPortPtr) -> Word ; tool 0x2B0E, set 0x0E (WindowManager) + .section .text.GetWKind,"ax" .globl GetWKind GetWKind: ; --- stash arg0 (in A/X) --- @@ -16961,10 +17790,10 @@ GetWKind: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x2B0E jsl 0xe10000 pla ; result -> A @@ -16972,6 +17801,7 @@ GetWKind: ; GetWMgrPort(void) -> WindowPtr ; tool 0x200E, set 0x0E (WindowManager) + .section .text.GetWMgrPort,"ax" .globl GetWMgrPort GetWMgrPort: ; --- result space (4 bytes) --- @@ -16985,6 +17815,7 @@ GetWMgrPort: ; GetWRefCon(GrafPortPtr) -> LongWord ; tool 0x290E, set 0x0E (WindowManager) + .section .text.GetWRefCon,"ax" .globl GetWRefCon GetWRefCon: ; --- stash arg0 (in A/X) --- @@ -16994,10 +17825,10 @@ GetWRefCon: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x290E jsl 0xe10000 pla ; result lo -> A @@ -17006,6 +17837,7 @@ GetWRefCon: ; GetWTitle(GrafPortPtr) -> Pointer ; tool 0x0E0E, set 0x0E (WindowManager) + .section .text.GetWTitle,"ax" .globl GetWTitle GetWTitle: ; --- stash arg0 (in A/X) --- @@ -17015,10 +17847,10 @@ GetWTitle: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x0E0E jsl 0xe10000 pla ; result lo -> A @@ -17027,6 +17859,7 @@ GetWTitle: ; GrowWindow(Word, Word, Integer, Integer, GrafPortPtr) -> LongWord ; tool 0x1B0E, set 0x0E (WindowManager) + .section .text.GrowWindow,"ax" .globl GrowWindow GrowWindow: ; --- stash arg0 (in A) --- @@ -17047,7 +17880,7 @@ GrowWindow: lda 18, s pha ; --- arg4 (GrafPortPtr, 4B) --- - lda 22, s + lda 24, s pha lda 24, s pha @@ -17059,22 +17892,24 @@ GrowWindow: ; HideWindow(GrafPortPtr) -> void ; tool 0x120E, set 0x0E (WindowManager) + .section .text.HideWindow,"ax" .globl HideWindow HideWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x120E jsl 0xe10000 rtl ; HiliteWindow(Boolean, GrafPortPtr) -> void ; tool 0x220E, set 0x0E (WindowManager) + .section .text.HiliteWindow,"ax" .globl HiliteWindow HiliteWindow: ; --- stash arg0 (in A) --- @@ -17083,7 +17918,7 @@ HiliteWindow: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -17093,38 +17928,41 @@ HiliteWindow: ; InvalRect(Rect) -> void ; tool 0x3A0E, set 0x0E (WindowManager) + .section .text.InvalRect,"ax" .globl InvalRect InvalRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3A0E jsl 0xe10000 rtl ; InvalRgn(Handle) -> void ; tool 0x3B0E, set 0x0E (WindowManager) + .section .text.InvalRgn,"ax" .globl InvalRgn InvalRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3B0E jsl 0xe10000 rtl ; MoveWindow(Integer, Integer, GrafPortPtr) -> void ; tool 0x190E, set 0x0E (WindowManager) + .section .text.MoveWindow,"ax" .globl MoveWindow MoveWindow: ; --- stash arg0 (in A) --- @@ -17136,7 +17974,7 @@ MoveWindow: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17146,6 +17984,7 @@ MoveWindow: ; NewWindow(ParamListPtr) -> WindowPtr ; tool 0x090E, set 0x0E (WindowManager) + .section .text.NewWindow,"ax" .globl NewWindow NewWindow: ; --- stash arg0 (in A/X) --- @@ -17155,10 +17994,10 @@ NewWindow: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x090E jsl 0xe10000 pla ; result lo -> A @@ -17167,6 +18006,7 @@ NewWindow: ; PinRect(Integer, Integer, Rect) -> Point ; tool 0x210E, set 0x0E (WindowManager) + .section .text.PinRect,"ax" .globl PinRect PinRect: ; --- stash arg0 (in A) --- @@ -17181,7 +18021,7 @@ PinRect: lda 10, s pha ; --- arg2 (Rect, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -17193,50 +18033,53 @@ PinRect: ; RefreshDesktop(Rect) -> void ; tool 0x390E, set 0x0E (WindowManager) + .section .text.RefreshDesktop,"ax" .globl RefreshDesktop RefreshDesktop: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x390E jsl 0xe10000 rtl ; SelectWindow(GrafPortPtr) -> void ; tool 0x110E, set 0x0E (WindowManager) + .section .text.SelectWindow,"ax" .globl SelectWindow SelectWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x110E jsl 0xe10000 rtl ; SendBehind(GrafPortPtr, GrafPortPtr) -> void ; tool 0x140E, set 0x0E (WindowManager) + .section .text.SendBehind,"ax" .globl SendBehind SendBehind: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17246,18 +18089,19 @@ SendBehind: ; SetContentDraw(VoidProcPtr, GrafPortPtr) -> void ; tool 0x490E, set 0x0E (WindowManager) + .section .text.SetContentDraw,"ax" .globl SetContentDraw SetContentDraw: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17267,6 +18111,7 @@ SetContentDraw: ; SetContentOrigin(Word, Word, GrafPortPtr) -> void ; tool 0x3F0E, set 0x0E (WindowManager) + .section .text.SetContentOrigin,"ax" .globl SetContentOrigin SetContentOrigin: ; --- stash arg0 (in A) --- @@ -17278,7 +18123,7 @@ SetContentOrigin: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17288,6 +18133,7 @@ SetContentOrigin: ; SetContentOrigin2(Word, Word, Word, GrafPortPtr) -> void ; tool 0x570E, set 0x0E (WindowManager) + .section .text.SetContentOrigin2,"ax" .globl SetContentOrigin2 SetContentOrigin2: ; --- stash arg0 (in A) --- @@ -17302,7 +18148,7 @@ SetContentOrigin2: lda 10, s pha ; --- arg3 (GrafPortPtr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -17312,6 +18158,7 @@ SetContentOrigin2: ; SetDataSize(Word, Word, GrafPortPtr) -> void ; tool 0x410E, set 0x0E (WindowManager) + .section .text.SetDataSize,"ax" .globl SetDataSize SetDataSize: ; --- stash arg0 (in A) --- @@ -17323,7 +18170,7 @@ SetDataSize: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17333,18 +18180,19 @@ SetDataSize: ; SetDefProc(LongProcPtr, GrafPortPtr) -> void ; tool 0x320E, set 0x0E (WindowManager) + .section .text.SetDefProc,"ax" .globl SetDefProc SetDefProc: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17354,18 +18202,19 @@ SetDefProc: ; SetFrameColor(WindColorPtr, GrafPortPtr) -> void ; tool 0x0F0E, set 0x0E (WindowManager) + .section .text.SetFrameColor,"ax" .globl SetFrameColor SetFrameColor: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17375,18 +18224,19 @@ SetFrameColor: ; SetInfoDraw(VoidProcPtr, GrafPortPtr) -> void ; tool 0x160E, set 0x0E (WindowManager) + .section .text.SetInfoDraw,"ax" .globl SetInfoDraw SetInfoDraw: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17396,18 +18246,19 @@ SetInfoDraw: ; SetInfoRefCon(LongWord, GrafPortPtr) -> void ; tool 0x360E, set 0x0E (WindowManager) + .section .text.SetInfoRefCon,"ax" .globl SetInfoRefCon SetInfoRefCon: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17417,6 +18268,7 @@ SetInfoRefCon: ; SetMaxGrow(Word, Word, GrafPortPtr) -> void ; tool 0x430E, set 0x0E (WindowManager) + .section .text.SetMaxGrow,"ax" .globl SetMaxGrow SetMaxGrow: ; --- stash arg0 (in A) --- @@ -17428,7 +18280,7 @@ SetMaxGrow: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17438,6 +18290,7 @@ SetMaxGrow: ; SetOriginMask(Word, GrafPortPtr) -> void ; tool 0x340E, set 0x0E (WindowManager) + .section .text.SetOriginMask,"ax" .globl SetOriginMask SetOriginMask: ; --- stash arg0 (in A) --- @@ -17446,7 +18299,7 @@ SetOriginMask: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -17456,6 +18309,7 @@ SetOriginMask: ; SetPage(Word, Word, GrafPortPtr) -> void ; tool 0x470E, set 0x0E (WindowManager) + .section .text.SetPage,"ax" .globl SetPage SetPage: ; --- stash arg0 (in A) --- @@ -17467,7 +18321,7 @@ SetPage: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17477,6 +18331,7 @@ SetPage: ; SetScroll(Word, Word, GrafPortPtr) -> void ; tool 0x450E, set 0x0E (WindowManager) + .section .text.SetScroll,"ax" .globl SetScroll SetScroll: ; --- stash arg0 (in A) --- @@ -17488,7 +18343,7 @@ SetScroll: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17498,22 +18353,24 @@ SetScroll: ; SetSysWindow(GrafPortPtr) -> void ; tool 0x4B0E, set 0x0E (WindowManager) + .section .text.SetSysWindow,"ax" .globl SetSysWindow SetSysWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4B0E jsl 0xe10000 rtl ; SetWFrame(Word, GrafPortPtr) -> void ; tool 0x2D0E, set 0x0E (WindowManager) + .section .text.SetWFrame,"ax" .globl SetWFrame SetWFrame: ; --- stash arg0 (in A) --- @@ -17522,7 +18379,7 @@ SetWFrame: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -17532,6 +18389,7 @@ SetWFrame: ; SetWindowIcons(FontHndl) -> FontHndl ; tool 0x4E0E, set 0x0E (WindowManager) + .section .text.SetWindowIcons,"ax" .globl SetWindowIcons SetWindowIcons: ; --- stash arg0 (in A/X) --- @@ -17541,10 +18399,10 @@ SetWindowIcons: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4E0E jsl 0xe10000 pla ; result lo -> A @@ -17553,18 +18411,19 @@ SetWindowIcons: ; SetWRefCon(Longint, GrafPortPtr) -> void ; tool 0x280E, set 0x0E (WindowManager) + .section .text.SetWRefCon,"ax" .globl SetWRefCon SetWRefCon: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17574,18 +18433,19 @@ SetWRefCon: ; SetWTitle(Pointer, GrafPortPtr) -> void ; tool 0x0D0E, set 0x0E (WindowManager) + .section .text.SetWTitle,"ax" .globl SetWTitle SetWTitle: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17595,18 +18455,19 @@ SetWTitle: ; SetZoomRect(Rect, GrafPortPtr) -> void ; tool 0x380E, set 0x0E (WindowManager) + .section .text.SetZoomRect,"ax" .globl SetZoomRect SetZoomRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17616,6 +18477,7 @@ SetZoomRect: ; ShowHide(Boolean, GrafPortPtr) -> void ; tool 0x230E, set 0x0E (WindowManager) + .section .text.ShowHide,"ax" .globl ShowHide ShowHide: ; --- stash arg0 (in A) --- @@ -17624,7 +18486,7 @@ ShowHide: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha @@ -17634,22 +18496,24 @@ ShowHide: ; ShowWindow(GrafPortPtr) -> void ; tool 0x130E, set 0x0E (WindowManager) + .section .text.ShowWindow,"ax" .globl ShowWindow ShowWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x130E jsl 0xe10000 rtl ; SizeWindow(Word, Word, GrafPortPtr) -> void ; tool 0x1C0E, set 0x0E (WindowManager) + .section .text.SizeWindow,"ax" .globl SizeWindow SizeWindow: ; --- stash arg0 (in A) --- @@ -17661,7 +18525,7 @@ SizeWindow: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -17671,34 +18535,36 @@ SizeWindow: ; StartDrawing(GrafPortPtr) -> void ; tool 0x4D0E, set 0x0E (WindowManager) + .section .text.StartDrawing,"ax" .globl StartDrawing StartDrawing: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x4D0E jsl 0xe10000 rtl ; StartInfoDrawing(Rect, GrafPortPtr) -> void ; tool 0x500E, set 0x0E (WindowManager) + .section .text.StartInfoDrawing,"ax" .globl StartInfoDrawing StartInfoDrawing: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17708,6 +18574,7 @@ StartInfoDrawing: ; TaskMaster(Word, WmTaskRecPtr) -> Word ; tool 0x1D0E, set 0x0E (WindowManager) + .section .text.TaskMaster,"ax" .globl TaskMaster TaskMaster: ; --- stash arg0 (in A) --- @@ -17718,7 +18585,7 @@ TaskMaster: lda 0xE0 pha ; --- arg1 (WmTaskRecPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17729,6 +18596,7 @@ TaskMaster: ; TrackGoAway(Integer, Integer, GrafPortPtr) -> Boolean ; tool 0x180E, set 0x0E (WindowManager) + .section .text.TrackGoAway,"ax" .globl TrackGoAway TrackGoAway: ; --- stash arg0 (in A) --- @@ -17742,7 +18610,7 @@ TrackGoAway: lda 8, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -17753,6 +18621,7 @@ TrackGoAway: ; TrackZoom(Integer, Integer, GrafPortPtr) -> Boolean ; tool 0x260E, set 0x0E (WindowManager) + .section .text.TrackZoom,"ax" .globl TrackZoom TrackZoom: ; --- stash arg0 (in A) --- @@ -17766,7 +18635,7 @@ TrackZoom: lda 8, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -17777,38 +18646,41 @@ TrackZoom: ; ValidRect(Rect) -> void ; tool 0x3C0E, set 0x0E (WindowManager) + .section .text.ValidRect,"ax" .globl ValidRect ValidRect: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3C0E jsl 0xe10000 rtl ; ValidRgn(Handle) -> void ; tool 0x3D0E, set 0x0E (WindowManager) + .section .text.ValidRgn,"ax" .globl ValidRgn ValidRgn: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x3D0E jsl 0xe10000 rtl ; WindDragRect(VoidProcPtr, Pattern, Integer, Integer, Rect, Rect, Rect, Word) -> LongWord ; tool 0x530E, set 0x0E (WindowManager) + .section .text.WindDragRect,"ax" .globl WindDragRect WindDragRect: ; --- stash arg0 (in A/X) --- @@ -17818,12 +18690,12 @@ WindDragRect: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Pattern, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha @@ -17834,17 +18706,17 @@ WindDragRect: lda 24, s pha ; --- arg4 (Rect, 4B) --- - lda 28, s + lda 30, s pha lda 30, s pha ; --- arg5 (Rect, 4B) --- - lda 36, s + lda 38, s pha lda 38, s pha ; --- arg6 (Rect, 4B) --- - lda 44, s + lda 46, s pha lda 46, s pha @@ -17859,22 +18731,24 @@ WindDragRect: ; ZoomWindow(GrafPortPtr) -> void ; tool 0x270E, set 0x0E (WindowManager) + .section .text.ZoomWindow,"ax" .globl ZoomWindow ZoomWindow: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x270E jsl 0xe10000 rtl ; AlertWindow(Word, Pointer, Ref) -> Word ; tool 0x590E, set 0x0E (WindowManager) + .section .text.AlertWindow,"ax" .globl AlertWindow AlertWindow: ; --- stash arg0 (in A) --- @@ -17885,12 +18759,12 @@ AlertWindow: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha ; --- arg2 (Ref, 4B) --- - lda 16, s + lda 18, s pha lda 18, s pha @@ -17901,6 +18775,7 @@ AlertWindow: ; CompileText(Word, Pointer, Pointer, Word) -> Handle ; tool 0x600E, set 0x0E (WindowManager) + .section .text.CompileText,"ax" .globl CompileText CompileText: ; --- stash arg0 (in A) --- @@ -17912,12 +18787,12 @@ CompileText: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha ; --- arg2 (Pointer, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -17932,22 +18807,24 @@ CompileText: ; DrawInfoBar(GrafPortPtr) -> void ; tool 0x550E, set 0x0E (WindowManager) + .section .text.DrawInfoBar,"ax" .globl DrawInfoBar DrawInfoBar: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x550E jsl 0xe10000 rtl ; ErrorWindow(Word, Pointer, Word) -> Word ; tool 0x620E, set 0x0E (WindowManager) + .section .text.ErrorWindow,"ax" .globl ErrorWindow ErrorWindow: ; --- stash arg0 (in A) --- @@ -17958,7 +18835,7 @@ ErrorWindow: lda 0xE0 pha ; --- arg1 (Pointer, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -17972,6 +18849,7 @@ ErrorWindow: ; GetWindowMgrGlobals(void) -> Ptr ; tool 0x580E, set 0x0E (WindowManager) + .section .text.GetWindowMgrGlobals,"ax" .globl GetWindowMgrGlobals GetWindowMgrGlobals: ; --- result space (4 bytes) --- @@ -17985,6 +18863,7 @@ GetWindowMgrGlobals: ; NewWindow2(Pointer, Long, VoidProcPtr, LongProcPtr, Word, Ref, Word) -> WindowPtr ; tool 0x610E, set 0x0E (WindowManager) + .section .text.NewWindow2,"ax" .globl NewWindow2 NewWindow2: ; --- stash arg0 (in A/X) --- @@ -17994,22 +18873,22 @@ NewWindow2: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Long, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg2 (VoidProcPtr, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha ; --- arg3 (LongProcPtr, 4B) --- - lda 28, s + lda 30, s pha lda 30, s pha @@ -18017,7 +18896,7 @@ NewWindow2: lda 36, s pha ; --- arg5 (Ref, 4B) --- - lda 40, s + lda 42, s pha lda 42, s pha @@ -18032,6 +18911,7 @@ NewWindow2: ; ResizeWindow(Boolean, Rect, GrafPortPtr) -> void ; tool 0x5C0E, set 0x0E (WindowManager) + .section .text.ResizeWindow,"ax" .globl ResizeWindow ResizeWindow: ; --- stash arg0 (in A) --- @@ -18040,12 +18920,12 @@ ResizeWindow: lda 0xE0 pha ; --- arg1 (Rect, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 14, s + lda 16, s pha lda 16, s pha @@ -18055,22 +18935,24 @@ ResizeWindow: ; StartFrameDrawing(GrafPortPtr) -> void ; tool 0x5A0E, set 0x0E (WindowManager) + .section .text.StartFrameDrawing,"ax" .globl StartFrameDrawing StartFrameDrawing: ; --- stash arg0 (in A/X) --- sta 0xE0 stx 0xE2 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x5A0E jsl 0xe10000 rtl ; TaskMasterDA(Word, WmTaskRecPtr) -> Word ; tool 0x5F0E, set 0x0E (WindowManager) + .section .text.TaskMasterDA,"ax" .globl TaskMasterDA TaskMasterDA: ; --- stash arg0 (in A) --- @@ -18081,7 +18963,7 @@ TaskMasterDA: lda 0xE0 pha ; --- arg1 (WmTaskRecPtr, 4B) --- - lda 8, s + lda 10, s pha lda 10, s pha @@ -18092,6 +18974,7 @@ TaskMasterDA: ; DoModalWindow(EventRecordPtr, VoidProcPtr, VoidProcPtr, VoidProcPtr, Word) -> LongWord ; tool 0x640E, set 0x0E (WindowManager) + .section .text.DoModalWindow,"ax" .globl DoModalWindow DoModalWindow: ; --- stash arg0 (in A/X) --- @@ -18101,22 +18984,22 @@ DoModalWindow: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (VoidProcPtr, 4B) --- - lda 12, s + lda 14, s pha lda 14, s pha ; --- arg2 (VoidProcPtr, 4B) --- - lda 20, s + lda 22, s pha lda 22, s pha ; --- arg3 (VoidProcPtr, 4B) --- - lda 28, s + lda 30, s pha lda 30, s pha @@ -18131,6 +19014,7 @@ DoModalWindow: ; FindCursorCtl(CtlRecHndlPtr, Integer, Integer, GrafPortPtr) -> Word ; tool 0x690E, set 0x0E (WindowManager) + .section .text.FindCursorCtl,"ax" .globl FindCursorCtl FindCursorCtl: ; --- stash arg0 (in A/X) --- @@ -18139,10 +19023,10 @@ FindCursorCtl: ; --- result space (2 bytes) --- pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ; --- arg1 (Integer, 2B) --- lda 10, s pha @@ -18150,7 +19034,7 @@ FindCursorCtl: lda 14, s pha ; --- arg3 (GrafPortPtr, 4B) --- - lda 18, s + lda 20, s pha lda 20, s pha @@ -18161,6 +19045,7 @@ FindCursorCtl: ; GetAuxWindInfo(GrafPortPtr) -> AuxWindInfoPtr ; tool 0x630E, set 0x0E (WindowManager) + .section .text.GetAuxWindInfo,"ax" .globl GetAuxWindInfo GetAuxWindInfo: ; --- stash arg0 (in A/X) --- @@ -18170,10 +19055,10 @@ GetAuxWindInfo: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x630E jsl 0xe10000 pla ; result lo -> A @@ -18182,6 +19067,7 @@ GetAuxWindInfo: ; HandleDiskInsert(Word, Word) -> LongWord ; tool 0x6B0E, set 0x0E (WindowManager) + .section .text.HandleDiskInsert,"ax" .globl HandleDiskInsert HandleDiskInsert: ; --- stash arg0 (in A) --- @@ -18203,6 +19089,7 @@ HandleDiskInsert: ; MWSetMenuProc(VoidProcPtr) -> VoidProcPtr ; tool 0x660E, set 0x0E (WindowManager) + .section .text.MWSetMenuProc,"ax" .globl MWSetMenuProc MWSetMenuProc: ; --- stash arg0 (in A/X) --- @@ -18212,10 +19099,10 @@ MWSetMenuProc: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x660E jsl 0xe10000 pla ; result lo -> A @@ -18224,6 +19111,7 @@ MWSetMenuProc: ; SetMenuProc(VoidProcPtr) -> VoidProcPtr ; tool 0x660E, set 0x0E (WindowManager) + .section .text.SetMenuProc,"ax" .globl SetMenuProc SetMenuProc: ; --- stash arg0 (in A/X) --- @@ -18233,10 +19121,10 @@ SetMenuProc: pea 0 pea 0 ; --- arg0 --- - lda 0xE0 - pha lda 0xE2 pha + lda 0xE0 + pha ldx #0x660E jsl 0xe10000 pla ; result lo -> A @@ -18245,6 +19133,7 @@ SetMenuProc: ; ResizeInfoBar(Word, Word, GrafPortPtr) -> void ; tool 0x6A0E, set 0x0E (WindowManager) + .section .text.ResizeInfoBar,"ax" .globl ResizeInfoBar ResizeInfoBar: ; --- stash arg0 (in A) --- @@ -18256,7 +19145,7 @@ ResizeInfoBar: lda 6, s pha ; --- arg2 (GrafPortPtr, 4B) --- - lda 10, s + lda 12, s pha lda 12, s pha @@ -18266,6 +19155,7 @@ ResizeInfoBar: ; UpdateWindow(Word, GrafPortPtr) -> void ; tool 0x6C0E, set 0x0E (WindowManager) + .section .text.UpdateWindow,"ax" .globl UpdateWindow UpdateWindow: ; --- stash arg0 (in A) --- @@ -18274,7 +19164,7 @@ UpdateWindow: lda 0xE0 pha ; --- arg1 (GrafPortPtr, 4B) --- - lda 6, s + lda 8, s pha lda 8, s pha diff --git a/runtime/src/libc.c b/runtime/src/libc.c index 795d7e6..e2fce58 100644 --- a/runtime/src/libc.c +++ b/runtime/src/libc.c @@ -28,6 +28,7 @@ typedef struct { u16 pCount; u16 refNum; void *pathname; + u16 requestAccess; } __GsosOpenParm; typedef struct { u16 pCount; @@ -229,13 +230,27 @@ int puts(const char *s) { return 0; } -// ---- input stubs ---- +// ---- input ---- // -// getchar reads from the keyboard; real input would route through -// the IIgs Event Manager. Returns -1 (EOF) for now. fgetc/fgets/ -// ungetc are defined further down alongside the FILE-table-backed -// fopen/fread/etc. -int getchar(void) { return -1; /* EOF */ } +// getchar polls the IIgs hardware keyboard register at $C000. Bit 7 +// is the "key ready" strobe; bits 0..6 are the ASCII code. Reading +// $C010 clears the strobe so the next keypress can be detected. This +// blocks until a key is pressed and returns the (7-bit) ASCII value. +// It works in any execution context (raw boot, ProDOS-16, GS/OS app) +// because $C000 is hardware I/O, not toolbox-mediated. +// +// Callers wanting non-blocking input or Event Manager integration +// should call ReadCh/GetNextEvent directly via iigs/toolbox.h. +int getchar(void) { + volatile unsigned char *kbd = (volatile unsigned char *)0xC000; + volatile unsigned char *strb = (volatile unsigned char *)0xC010; + while (((*kbd) & 0x80) == 0) { + // Spin until a key is ready. No yield — single-threaded. + } + int c = (*kbd) & 0x7F; + (void)*strb; // clear strobe + return c; +} // ---- minimal printf ---- @@ -1288,7 +1303,18 @@ FILE *fopen(const char *path, const char *mode) { // → NULL. if (!__gsosAvailable()) return (FILE *)0; if (__buildGSString(path) < 0) return (FILE *)0; - __GsosOpenParm op = { 2, 0, &__gsosPathBuf }; + // pCount=3 covers refNum + pathname + requestAccess. GS/OS 6.0.2 + // Open ($2010) requires requestAccess to be non-zero for any actual + // open; passing only pCount=2 (refNum + pathname) leaves the access + // word indeterminate and the Open silently fails with a "bad access" + // status. requestAccess values: $0001 = read, $0002 = write, + // $0003 = read+write. We pick read or read+write based on the + // mode string. The remaining optional params (resourceNumber, + // accessMode, fileType, auxType, storageType, createDate, modDate, + // optionList) are left out — GS/OS treats their absence as + // "default values". + u16 access = (u16)(wantWrite ? (wantRead ? 3 : 2) : 1); + __GsosOpenParm op = { 3, 0, &__gsosPathBuf, access }; if (gsosOpen(&op) != 0) return (FILE *)0; f->kind = FILE_KIND_GSOS; diff --git a/runtime/src/libgcc.s b/runtime/src/libgcc.s index 8128c08..3bdbe6f 100644 --- a/runtime/src/libgcc.s +++ b/runtime/src/libgcc.s @@ -95,7 +95,41 @@ __mulhi3: ; -------------------------------------------------------------------- .globl __umulhisi3 __umulhisi3: - sta 0xe0 ; multiplier in $e0/$e1 + ; Fast path: if both args fit in 8 bits, use a quarter-square + ; table for 8x8 → 16 (result hi half is always 0). Identity: + ; a*b = T[a+b] - T[|a-b|] where T[k] = floor(k²/4) + ; 511-entry, 2-byte table = 1022 bytes ROM. Fast path is ~55 + ; cyc vs ~150 cyc for the shift-and-add fallback at i ~ 50. + ; Hot in `i*i` patterns where i is a loop counter ≤ 255. + sta 0xe0 ; save arg0 + ora 0x4, s ; OR with arg1 + and #0xff00 ; isolate hi bytes + bne .Lumulhisi_slow ; if either hi byte nonzero, fallback + ; Both args fit in 8 bits — quarter-square path. + lda 0xe0 ; arg0 + clc + adc 0x4, s ; A = a + b + asl a ; A = 2*(a+b) — word index + tax + lda __umulhisi3_qsq, x ; T[a+b] + sta 0xe2 ; stash + lda 0xe0 ; arg0 + sec + sbc 0x4, s ; A = a - b + bpl .Lumulhisi_qsq_pos + ; A negative; negate to get |a-b|. + eor #0xffff + inc a +.Lumulhisi_qsq_pos: + asl a ; A = 2*|a-b| + tax + lda 0xe2 ; T[a+b] + sec + sbc __umulhisi3_qsq, x ; T[a+b] - T[|a-b|] + ldx #0 ; result hi half = 0 + rtl +.Lumulhisi_slow: + ; Multiplier already at $e0 from the fast-path check above. lda 0x4, s sta 0xe2 ; multiplicand lo in $e2/$e3 stz 0xe4 ; multiplicand hi (initially 0) in $e4/$e5 @@ -369,6 +403,29 @@ __mulsi3: ; Clear running product at $e8/$ea. stz 0xe8 stz 0xea + ; Asymmetric-size swap: the loop iterates based on the multiplier's + ; bit width. If a is large (a_hi != 0) but b is small (b_hi == 0), + ; swap so the small one becomes the multiplier — the early-exit + ; check (lda 0xe0; beq done) then fires sooner. Saves a lot for + ; djb2-style `h * 33` patterns where h grows but the constant + ; multiplier is small. Cost: ~12 cyc unconditional check; benefit: + ; ~10 cyc per saved iter × ~10 iters = 100 cyc. + lda 0xe2 + beq .Lmulsi_no_swap ; a_hi == 0, no need to swap (or already covered by u16 path below) + lda 0xe6 + bne .Lmulsi_no_swap ; b_hi != 0, both large, no benefit + ; Swap (a_lo, a_hi) ↔ (b_lo, b_hi). Both are at DP; XOR-swap or + ; load/store; we use load/store with A scratch since the values are + ; 16 bits each. + lda 0xe0 + ldx 0xe4 + stx 0xe0 + sta 0xe4 + lda 0xe2 + ldx 0xe6 + stx 0xe2 + sta 0xe6 +.Lmulsi_no_swap: ; Fast path: if multiplier's high half ($e2) is 0, we only ; need 16 loop iterations AND we can drop the multiplier-hi ; shift step entirely (lsr $e2 + bcc + ora #$8000) — that step @@ -380,6 +437,41 @@ __mulsi3: ; iteration. lda 0xe2 bne .Lmulsi_full + ; Quarter-square fast path: when BOTH args fit in 8 bits (e2==0 + ; already verified, e6==0, e0<256, e4<256), use the same T[k]=k^2/4 + ; table that __umulhisi3 uses to compute a*b = T[a+b] - T[|a-b|] + ; in ~50 cyc vs the u16 loop's ~150-250 cyc for small multipliers. + ; Common when dotProduct etc. sign-extend small i16 values to i32. + lda 0xe6 + bne .Lmulsi_u16_entry + lda 0xe0 + ora 0xe4 + and #0xff00 + bne .Lmulsi_u16_entry + ; T[a+b] -> $e8 (product lo). + lda 0xe0 + clc + adc 0xe4 + asl a + tax + lda __umulhisi3_qsq, x + sta 0xe8 + ; |a-b| as word index. + lda 0xe0 + sec + sbc 0xe4 + bpl .Lmulsi_qsq_pos + eor #0xffff + inc a +.Lmulsi_qsq_pos: + asl a + tax + lda 0xe8 + sec + sbc __umulhisi3_qsq, x + ldx #0 + rtl +.Lmulsi_u16_entry: ldy #0x10 .Lmulsi_u16_loop: ; Shift multiplier right; bit-out tested for add. Bottom of loop @@ -466,14 +558,14 @@ __ashlsi3: sta 0xe0 ; lo stx 0xe2 ; hi lda 0x4, s - tay ; count -> Y + tay ; count -> Y; sets Z if 0 + beq .Lashlsi_done ; count==0: skip loop .Lashlsi_loop: - cpy #0x0 - beq .Lashlsi_done + ; Per-bit: 7+7+2+3 = 19 cyc (was 25 with cpy/beq/bra). asl 0xe0 rol 0xe2 dey - bra .Lashlsi_loop + bne .Lashlsi_loop .Lashlsi_done: ldx 0xe2 lda 0xe0 @@ -489,13 +581,12 @@ __lshrsi3: stx 0xe2 lda 0x4, s tay -.Llshrsi_loop: - cpy #0x0 beq .Llshrsi_done +.Llshrsi_loop: lsr 0xe2 ror 0xe0 dey - bra .Llshrsi_loop + bne .Llshrsi_loop .Llshrsi_done: ldx 0xe2 lda 0xe0 @@ -512,9 +603,8 @@ __ashrsi3: stx 0xe2 lda 0x4, s tay -.Lashrsi_loop: - cpy #0x0 beq .Lashrsi_done +.Lashrsi_loop: ; CMP #$8000 sets C iff the unsigned value >= 0x8000, i.e. bit 15 ; is set — exactly the sign bit. lda 0xe2 @@ -522,7 +612,7 @@ __ashrsi3: ror 0xe2 ror 0xe0 dey - bra .Lashrsi_loop + bne .Lashrsi_loop .Lashrsi_done: ldx 0xe2 lda 0xe0 @@ -1279,3 +1369,75 @@ longjmp: lda #1 .Llj_done: rtl + +; -------------------------------------------------------------------- +; __umulhisi3_qsq: quarter-square lookup table. +; T[k] = floor(k² / 4) for k ∈ [0, 510]. Used by __umulhisi3's fast +; 8x8 path: a*b = T[a+b] - T[|a-b|]. 511 entries × 2 bytes = 1022 B. +; -------------------------------------------------------------------- +__umulhisi3_qsq: + .short 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0006, 0x0009, 0x000c + .short 0x0010, 0x0014, 0x0019, 0x001e, 0x0024, 0x002a, 0x0031, 0x0038 + .short 0x0040, 0x0048, 0x0051, 0x005a, 0x0064, 0x006e, 0x0079, 0x0084 + .short 0x0090, 0x009c, 0x00a9, 0x00b6, 0x00c4, 0x00d2, 0x00e1, 0x00f0 + .short 0x0100, 0x0110, 0x0121, 0x0132, 0x0144, 0x0156, 0x0169, 0x017c + .short 0x0190, 0x01a4, 0x01b9, 0x01ce, 0x01e4, 0x01fa, 0x0211, 0x0228 + .short 0x0240, 0x0258, 0x0271, 0x028a, 0x02a4, 0x02be, 0x02d9, 0x02f4 + .short 0x0310, 0x032c, 0x0349, 0x0366, 0x0384, 0x03a2, 0x03c1, 0x03e0 + .short 0x0400, 0x0420, 0x0441, 0x0462, 0x0484, 0x04a6, 0x04c9, 0x04ec + .short 0x0510, 0x0534, 0x0559, 0x057e, 0x05a4, 0x05ca, 0x05f1, 0x0618 + .short 0x0640, 0x0668, 0x0691, 0x06ba, 0x06e4, 0x070e, 0x0739, 0x0764 + .short 0x0790, 0x07bc, 0x07e9, 0x0816, 0x0844, 0x0872, 0x08a1, 0x08d0 + .short 0x0900, 0x0930, 0x0961, 0x0992, 0x09c4, 0x09f6, 0x0a29, 0x0a5c + .short 0x0a90, 0x0ac4, 0x0af9, 0x0b2e, 0x0b64, 0x0b9a, 0x0bd1, 0x0c08 + .short 0x0c40, 0x0c78, 0x0cb1, 0x0cea, 0x0d24, 0x0d5e, 0x0d99, 0x0dd4 + .short 0x0e10, 0x0e4c, 0x0e89, 0x0ec6, 0x0f04, 0x0f42, 0x0f81, 0x0fc0 + .short 0x1000, 0x1040, 0x1081, 0x10c2, 0x1104, 0x1146, 0x1189, 0x11cc + .short 0x1210, 0x1254, 0x1299, 0x12de, 0x1324, 0x136a, 0x13b1, 0x13f8 + .short 0x1440, 0x1488, 0x14d1, 0x151a, 0x1564, 0x15ae, 0x15f9, 0x1644 + .short 0x1690, 0x16dc, 0x1729, 0x1776, 0x17c4, 0x1812, 0x1861, 0x18b0 + .short 0x1900, 0x1950, 0x19a1, 0x19f2, 0x1a44, 0x1a96, 0x1ae9, 0x1b3c + .short 0x1b90, 0x1be4, 0x1c39, 0x1c8e, 0x1ce4, 0x1d3a, 0x1d91, 0x1de8 + .short 0x1e40, 0x1e98, 0x1ef1, 0x1f4a, 0x1fa4, 0x1ffe, 0x2059, 0x20b4 + .short 0x2110, 0x216c, 0x21c9, 0x2226, 0x2284, 0x22e2, 0x2341, 0x23a0 + .short 0x2400, 0x2460, 0x24c1, 0x2522, 0x2584, 0x25e6, 0x2649, 0x26ac + .short 0x2710, 0x2774, 0x27d9, 0x283e, 0x28a4, 0x290a, 0x2971, 0x29d8 + .short 0x2a40, 0x2aa8, 0x2b11, 0x2b7a, 0x2be4, 0x2c4e, 0x2cb9, 0x2d24 + .short 0x2d90, 0x2dfc, 0x2e69, 0x2ed6, 0x2f44, 0x2fb2, 0x3021, 0x3090 + .short 0x3100, 0x3170, 0x31e1, 0x3252, 0x32c4, 0x3336, 0x33a9, 0x341c + .short 0x3490, 0x3504, 0x3579, 0x35ee, 0x3664, 0x36da, 0x3751, 0x37c8 + .short 0x3840, 0x38b8, 0x3931, 0x39aa, 0x3a24, 0x3a9e, 0x3b19, 0x3b94 + .short 0x3c10, 0x3c8c, 0x3d09, 0x3d86, 0x3e04, 0x3e82, 0x3f01, 0x3f80 + .short 0x4000, 0x4080, 0x4101, 0x4182, 0x4204, 0x4286, 0x4309, 0x438c + .short 0x4410, 0x4494, 0x4519, 0x459e, 0x4624, 0x46aa, 0x4731, 0x47b8 + .short 0x4840, 0x48c8, 0x4951, 0x49da, 0x4a64, 0x4aee, 0x4b79, 0x4c04 + .short 0x4c90, 0x4d1c, 0x4da9, 0x4e36, 0x4ec4, 0x4f52, 0x4fe1, 0x5070 + .short 0x5100, 0x5190, 0x5221, 0x52b2, 0x5344, 0x53d6, 0x5469, 0x54fc + .short 0x5590, 0x5624, 0x56b9, 0x574e, 0x57e4, 0x587a, 0x5911, 0x59a8 + .short 0x5a40, 0x5ad8, 0x5b71, 0x5c0a, 0x5ca4, 0x5d3e, 0x5dd9, 0x5e74 + .short 0x5f10, 0x5fac, 0x6049, 0x60e6, 0x6184, 0x6222, 0x62c1, 0x6360 + .short 0x6400, 0x64a0, 0x6541, 0x65e2, 0x6684, 0x6726, 0x67c9, 0x686c + .short 0x6910, 0x69b4, 0x6a59, 0x6afe, 0x6ba4, 0x6c4a, 0x6cf1, 0x6d98 + .short 0x6e40, 0x6ee8, 0x6f91, 0x703a, 0x70e4, 0x718e, 0x7239, 0x72e4 + .short 0x7390, 0x743c, 0x74e9, 0x7596, 0x7644, 0x76f2, 0x77a1, 0x7850 + .short 0x7900, 0x79b0, 0x7a61, 0x7b12, 0x7bc4, 0x7c76, 0x7d29, 0x7ddc + .short 0x7e90, 0x7f44, 0x7ff9, 0x80ae, 0x8164, 0x821a, 0x82d1, 0x8388 + .short 0x8440, 0x84f8, 0x85b1, 0x866a, 0x8724, 0x87de, 0x8899, 0x8954 + .short 0x8a10, 0x8acc, 0x8b89, 0x8c46, 0x8d04, 0x8dc2, 0x8e81, 0x8f40 + .short 0x9000, 0x90c0, 0x9181, 0x9242, 0x9304, 0x93c6, 0x9489, 0x954c + .short 0x9610, 0x96d4, 0x9799, 0x985e, 0x9924, 0x99ea, 0x9ab1, 0x9b78 + .short 0x9c40, 0x9d08, 0x9dd1, 0x9e9a, 0x9f64, 0xa02e, 0xa0f9, 0xa1c4 + .short 0xa290, 0xa35c, 0xa429, 0xa4f6, 0xa5c4, 0xa692, 0xa761, 0xa830 + .short 0xa900, 0xa9d0, 0xaaa1, 0xab72, 0xac44, 0xad16, 0xade9, 0xaebc + .short 0xaf90, 0xb064, 0xb139, 0xb20e, 0xb2e4, 0xb3ba, 0xb491, 0xb568 + .short 0xb640, 0xb718, 0xb7f1, 0xb8ca, 0xb9a4, 0xba7e, 0xbb59, 0xbc34 + .short 0xbd10, 0xbdec, 0xbec9, 0xbfa6, 0xc084, 0xc162, 0xc241, 0xc320 + .short 0xc400, 0xc4e0, 0xc5c1, 0xc6a2, 0xc784, 0xc866, 0xc949, 0xca2c + .short 0xcb10, 0xcbf4, 0xccd9, 0xcdbe, 0xcea4, 0xcf8a, 0xd071, 0xd158 + .short 0xd240, 0xd328, 0xd411, 0xd4fa, 0xd5e4, 0xd6ce, 0xd7b9, 0xd8a4 + .short 0xd990, 0xda7c, 0xdb69, 0xdc56, 0xdd44, 0xde32, 0xdf21, 0xe010 + .short 0xe100, 0xe1f0, 0xe2e1, 0xe3d2, 0xe4c4, 0xe5b6, 0xe6a9, 0xe79c + .short 0xe890, 0xe984, 0xea79, 0xeb6e, 0xec64, 0xed5a, 0xee51, 0xef48 + .short 0xf040, 0xf138, 0xf231, 0xf32a, 0xf424, 0xf51e, 0xf619, 0xf714 + .short 0xf810, 0xf90c, 0xfa09, 0xfb06, 0xfc04, 0xfd02, 0xfe01 + diff --git a/screenshots/frame.png b/screenshots/frame.png new file mode 100644 index 0000000..052783d --- /dev/null +++ b/screenshots/frame.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:051573cbf726c8f39f6ad9ce3cf8fb49f5282be228845bb50b13887d0c0a5fc8 +size 2713 diff --git a/screenshots/heavyRelocs.png b/screenshots/heavyRelocs.png new file mode 100644 index 0000000..7c8cb7d --- /dev/null +++ b/screenshots/heavyRelocs.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a03562283da21b9f13cf2a3ff9587673514c31b6b5f6b1bcc40e7974e75d362 +size 1144 diff --git a/screenshots/helloBeep.png b/screenshots/helloBeep.png new file mode 100644 index 0000000..7c8cb7d --- /dev/null +++ b/screenshots/helloBeep.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a03562283da21b9f13cf2a3ff9587673514c31b6b5f6b1bcc40e7974e75d362 +size 1144 diff --git a/screenshots/helloText.png b/screenshots/helloText.png new file mode 100644 index 0000000..175a071 --- /dev/null +++ b/screenshots/helloText.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6493cceac2d2993468ca4d656bc7d7fe113104e2a625d716b7c017a4bf14698 +size 2053 diff --git a/screenshots/helloWindow.png b/screenshots/helloWindow.png new file mode 100644 index 0000000..fbe6ee7 --- /dev/null +++ b/screenshots/helloWindow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f317fd54d488e3f8990122da944c29080c9a5b27e82ab891e8f98aac71e0b08 +size 1898 diff --git a/screenshots/minicad.png b/screenshots/minicad.png new file mode 100644 index 0000000..60c19f3 --- /dev/null +++ b/screenshots/minicad.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81a59ee363dbe66546fe56bd7570757886ab0526a99be4839387c73c009849ce +size 3803 diff --git a/screenshots/orcaFrame.png b/screenshots/orcaFrame.png new file mode 100644 index 0000000..82fa727 --- /dev/null +++ b/screenshots/orcaFrame.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd3af6c9cf30cba535258a79097d70dc454052299c32923d278bbe6af2436a40 +size 1847 diff --git a/screenshots/orcaFrameLike.png b/screenshots/orcaFrameLike.png new file mode 100644 index 0000000..757cdeb --- /dev/null +++ b/screenshots/orcaFrameLike.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08243cbf6f9d31d3a29dc50b3e9f98e278777b13ab361e30fdd8687247cac256 +size 1203 diff --git a/screenshots/orcaMiniCadLike.png b/screenshots/orcaMiniCadLike.png new file mode 100644 index 0000000..9898b4c --- /dev/null +++ b/screenshots/orcaMiniCadLike.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a3378f00c133c0754db525b4b8d1215ba1ddcb515ff5b52a0ec5a561d1ba307 +size 2891 diff --git a/screenshots/orcaReversiLike.png b/screenshots/orcaReversiLike.png new file mode 100644 index 0000000..757cdeb --- /dev/null +++ b/screenshots/orcaReversiLike.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08243cbf6f9d31d3a29dc50b3e9f98e278777b13ab361e30fdd8687247cac256 +size 1203 diff --git a/screenshots/qdProbe.png b/screenshots/qdProbe.png new file mode 100644 index 0000000..d560a07 --- /dev/null +++ b/screenshots/qdProbe.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9f01c81966a4b6508f086ed8a9d3e54b3694e60643cec97ed33a516b5065823 +size 14278 diff --git a/screenshots/reversi.png b/screenshots/reversi.png new file mode 100644 index 0000000..d6048b4 --- /dev/null +++ b/screenshots/reversi.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f09749b0d2605f9f6bfac1e9f8629f84753ad0c3c65805bb228a415171973ba8 +size 3936 diff --git a/scripts/benchCyclesPrecise.sh b/scripts/benchCyclesPrecise.sh index 3a875c3..874fb3a 100755 --- a/scripts/benchCyclesPrecise.sh +++ b/scripts/benchCyclesPrecise.sh @@ -38,6 +38,12 @@ benchInputs() { dotProduct) echo 'dotProduct(va, vb, 4)';; popcount) echo 'popcount(0x12345678UL)';; crc32) echo 'crc32((const unsigned char *)"hello", 5)';; + globalArrSum) echo 'globalArrSum(50)';; + globalArrFill) echo '(globalArrFill(50), 0)';; + globalArr8Sum) echo 'globalArr8Sum(50)';; + bubbleSort) echo '(bubbleSort(bsBuf, 16), 0)';; + strLen) echo 'strLen("The quick brown fox jumps over the lazy dog!")';; + djb2Hash) echo 'djb2Hash("hello world")';; *) echo "/* unknown */";; esac } @@ -52,6 +58,12 @@ benchExtern() { dotProduct) echo 'extern long dotProduct(const short *a, const short *b, unsigned int n); static const short va[] = {1,2,3,4}; static const short vb[] = {5,6,7,8};';; popcount) echo 'extern int popcount(unsigned long x);';; crc32) echo 'extern unsigned long crc32(const unsigned char *p, unsigned int n);';; + globalArrSum) echo 'extern unsigned short globalArrSum(unsigned short n); extern unsigned short globalArr[100];';; + globalArrFill) echo 'extern void globalArrFill(unsigned short n); extern unsigned short globalArrF[100];';; + globalArr8Sum) echo 'extern unsigned short globalArr8Sum(unsigned short n); extern unsigned char globalArr8[100];';; + bubbleSort) echo 'extern void bubbleSort(short *a, unsigned short n); static short bsBuf[16] = {7,3,1,9,4,5,8,2,6,0,15,11,13,10,14,12};';; + strLen) echo 'extern unsigned short strLen(const char *s);';; + djb2Hash) echo 'extern unsigned long djb2Hash(const char *s);';; *) echo '';; esac } @@ -69,6 +81,12 @@ benchIters() { dotProduct) echo 200;; popcount) echo 500;; crc32) echo 200;; + globalArrSum) echo 100;; + globalArrFill) echo 100;; + globalArr8Sum) echo 100;; + bubbleSort) echo 50;; + strLen) echo 200;; + djb2Hash) echo 50;; *) echo 100;; esac } diff --git a/scripts/genToolbox.py b/scripts/genToolbox.py index c6f50ae..85f9b08 100644 --- a/scripts/genToolbox.py +++ b/scripts/genToolbox.py @@ -31,7 +31,7 @@ import re import sys from pathlib import Path -ORCA_DIR = Path("/tmp/orca-headers") +ORCA_DIR = Path("/home/scott/claude/llvm816/tools/orca-c/ORCACDefs") OUT_HEADER = Path("/home/scott/claude/llvm816/runtime/include/iigs/toolbox.h") OUT_ASM = Path("/home/scott/claude/llvm816/runtime/src/iigsToolbox.s") @@ -297,6 +297,11 @@ def emit(decls): # Generate asm body. sLines.append(f"; {name}({', '.join(argTypes) or 'void'}) -> {retType}") sLines.append(f"; tool 0x{tool:04X}, set 0x{tool & 0xFF:02X} ({TOOLSET_NAME.get(tool & 0xFF, '?')})") + # One section per wrapper so link816's --gc-sections can + # drop the ~880 wrappers the user's demo doesn't reference. + # Without this the entire 45 KB toolbox.s gets linked into + # every binary. + sLines.append(f"\t.section .text.{name},\"ax\"") sLines.append(f"\t.globl {name}") sLines.append(f"{name}:") @@ -310,6 +315,11 @@ def emit(decls): # scratch; stx scratch+2'. void-arg functions skip this entirely # — emitting a phantom `pha` for arg0 corrupts the dispatcher's # stack frame (caught when GetTick crashed under Loader). + # + # No PBR-bank workaround here anymore: the backend now emits a + # proper R_W65816_BANK16 relocation on the high half of &symbol + # so the OMF Loader patches it with our actual placement bank + # at load time. See feedback_pointer_constant_bank_zero.md. scratchDP = 0xE0 # libcall scratch zone if argInfo: sLines.append(f"\t; --- stash arg0 (in A{'/X' if firstArgIs32 else ''}) ---") @@ -323,8 +333,15 @@ def emit(decls): for _ in range((retSize + 1) // 2): sLines.append(f"\tpea 0") - # Push args in Pascal order (L-to-R, but each multi-byte value - # pushed lo-word first then hi-word per ORCA convention). + # Push args in Pascal order (L-to-R). For multi-byte values + # the toolbox expects HIGH word first then LOW word (matches + # ORCA-C's PushLong macro: `pea ^addr ; pea addr`). After + # the two pushes, memory at (S+1..S+4) is in little-endian + # long-value order (byte 0 low at lowest address) so a + # `pull long` / 32-bit indirect read sees the value + # correctly. Earlier "lo first then hi" emission left the + # high word at the wrong stack offset and the toolbox saw + # garbage (NewHandle returned NULL for a $900-byte request). # Tracker: how many bytes have we pushed beyond the original # caller-stack so all stack-arg loads need to add (pushed) to # their original offset. @@ -332,13 +349,14 @@ def emit(decls): # arg0 first (if any args). if argInfo: sLines.append(f"\t; --- arg0 ---") - sLines.append(f"\tlda 0x{scratchDP:02X}") - sLines.append(f"\tpha") - pushedBytes += 2 if firstArgIs32: + # HIGH word first (Long convention). sLines.append(f"\tlda 0x{scratchDP + 2:02X}") sLines.append(f"\tpha") pushedBytes += 2 + sLines.append(f"\tlda 0x{scratchDP:02X}") + sLines.append(f"\tpha") + pushedBytes += 2 # arg1, arg2, ... — each loaded from caller stack at original # offset + pushedBytes. @@ -357,10 +375,15 @@ def emit(decls): pushedBytes += 2 stackArgOffset += 2 elif size == 4: - # Load lo, push; load hi, push. - sLines.append(f"\tlda {stackArgOffset + pushedBytes}, s") + # Long: push HIGH word first, then LOW word (ORCA + # PushLong convention; same fix as the arg0 Long path). + # HI is at caller offset (stackArgOffset + 2); LO at + # stackArgOffset. After the HI PHA, both halves' + # current stack-rel offsets shift +2. + sLines.append(f"\tlda {stackArgOffset + pushedBytes + 2}, s") sLines.append(f"\tpha") pushedBytes += 2 + # LO at original offset stackArgOffset; current = +pushedBytes. sLines.append(f"\tlda {stackArgOffset + pushedBytes}, s") sLines.append(f"\tpha") pushedBytes += 2 diff --git a/scripts/installCadius.sh b/scripts/installCadius.sh new file mode 100755 index 0000000..81bbfb6 --- /dev/null +++ b/scripts/installCadius.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# installCadius.sh - clone, build, and install the Brutal Deluxe cadius +# ProDOS-disk tool into tools/cadius/cadius. Demo + runViaFinder +# scripts default to this location. +# +# Usage: bash scripts/installCadius.sh +# Idempotent: skips clone if source dir already present; skips build +# if the binary is already in place. + +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +SRC_DIR="$PROJECT_ROOT/tools/cadius-src" +DEST_DIR="$PROJECT_ROOT/tools/cadius" +DEST_BIN="$DEST_DIR/cadius" + +if [ -x "$DEST_BIN" ]; then + echo "cadius already installed at $DEST_BIN" + exit 0 +fi + +mkdir -p "$DEST_DIR" + +if [ ! -d "$SRC_DIR/.git" ]; then + rm -rf "$SRC_DIR" + git clone --depth 1 https://github.com/mach-kernel/cadius "$SRC_DIR" +fi + +(cd "$SRC_DIR" && make) + +cp "$SRC_DIR/bin/release/cadius" "$DEST_BIN" +chmod +x "$DEST_BIN" +echo "installed: $DEST_BIN" +"$DEST_BIN" 2>&1 | head -1 diff --git a/scripts/probeHelloWindow.sh b/scripts/probeHelloWindow.sh new file mode 100755 index 0000000..f7f9352 --- /dev/null +++ b/scripts/probeHelloWindow.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +# probeHelloWindow.sh - headless run of demos/helloWindow that dumps +# the step markers ($70..$72, written via MARK_AT = STA long, bank-0 +# explicit) and the gDiag[] capture buffer (discovered from the .map) +# so we can see what NewWindow ($090E) actually returns at the +# toolbox-dispatcher level. +# +# Captures: +# $70 = end-of-main marker ($99 = ran to completion) +# $71 = step marker (last value reached: $10..$19) +# $72 = NewWindow C-level result ($01/$02 = success, $EE = NULL) +# gDiag[0/1] = paramLength readback ($4C if parm ptr is good) +# gDiag[2/3] = result-space LOW word (window-ptr lo) +# gDiag[4/5] = result-space HIGH word (window-ptr hi) +# gDiag[6] = P byte at JSL return (bit 0 = carry) +# gDiag[7] = $AA if probe ran to completion + +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +OMF="$PROJECT_ROOT/demos/helloWindow.omf" +SRC="$PROJECT_ROOT/demos/helloWindow.c" +MAP="$PROJECT_ROOT/demos/helloWindow.map" +if [ ! -f "$OMF" ] || [ "$SRC" -nt "$OMF" ]; then + bash "$PROJECT_ROOT/demos/build.sh" helloWindow >/dev/null +fi + +GDIAG_HEX=$(awk '$2 == "gDiag" {print $1; exit}' "$MAP") +[ -n "$GDIAG_HEX" ] || { echo "gDiag not found in $MAP" >&2; exit 2; } +GDIAG=$((GDIAG_HEX)) +echo "gDiag at $(printf '0x%06x' $GDIAG)" + +CADIUS=${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius} +SYSDISK=${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po} + +[ -x "$CADIUS" ] || { echo "cadius not found: $CADIUS" >&2; exit 2; } +[ -f "$SYSDISK" ] || { echo "sysdisk not found: $SYSDISK" >&2; exit 2; } +command -v mame >/dev/null || { echo "mame not in PATH" >&2; exit 2; } + +WORK=$(mktemp -d -t probe.XXXXXX) +trap 'rm -rf "$WORK"' EXIT + +cp "$SYSDISK" "$WORK/disk.po" +"$CADIUS" CREATEVOLUME "$WORK/data.po" DATA 800KB >/dev/null +cp "$OMF" "$WORK/HELLO#B30000" +"$CADIUS" ADDFILE "$WORK/data.po" /DATA "$WORK/HELLO#B30000" >/dev/null + +cat > "$WORK/launch.lua" <> "$WORK/launch.lua" <<'LUA' +local cpu = manager.machine.devices[":maincpu"] +local mem = cpu.spaces["program"] +local nat = manager.machine.natkeyboard +local frame = 0 +local idx = 1 + +local function get_field(port, name) + local p = manager.machine.ioport.ports[port] + if p == nil then return nil end + return p.fields[name] +end +local key_cmd = get_field(":macadb:KEY3", "Command / Open Apple") +local function press(f) if f then f:set_value(1) end end +local function release(f) if f then f:set_value(0) end end + +local steps = { + {3300, function() nat:post("D") end}, + {3540, function() press(key_cmd) end}, + {3546, function() nat:post("o") end}, + {3600, function() release(key_cmd) end}, + {4200, function() nat:post("H") end}, + {4500, function() press(key_cmd) end}, + {4506, function() nat:post("o") end}, + {4560, function() release(key_cmd) end}, + {7000, function() nat:post(" ") end}, + {7500, function() nat:post(" ") end}, + {8000, function() nat:post(" ") end}, + {9000, function() + for a = 0x70, 0x7f do + print(string.format("MARK $%02x = %02x", a, mem:read_u8(a))) + end + print(string.format("MARK $96 (event type) = %02x", mem:read_u8(0x96))) + print(string.format("MARK $97 (loop iters lo) = %02x", mem:read_u8(0x97))) + print(string.format("MARK $93 (sizeof gWp) = %02x = %d", + mem:read_u8(0x93), mem:read_u8(0x93))) + print(string.format("A post-JSL = $%04x (lo=%02x hi=%02x)", + mem:read_u8(0x90) | (mem:read_u8(0x91)*256), + mem:read_u8(0x90), mem:read_u8(0x91))) + local pbr = mem:read_u8(0x73) + -- The OMF Loader places our segment at offset $0000 within bank + -- $PBR (not at $1000 like our text-base). The cRELOC mechanism + -- patches all symbolic abs-16 stores to (segPlacedBase + offsetRef) + -- = ($0000 + symbol_offset_within_segment) = link_addr - text_base. + -- So runtime_address(sym) = pbr*0x10000 + (link_addr - text_base). + local TEXT_BASE = 0x1000 + local base = pbr * 0x10000 + (GDIAG - TEXT_BASE) + print(string.format("PBR = $%02x; gDiag at $%06x", pbr, base)) + for i = 0, 15 do + print(string.format("gDiag[%d] = %02x", i, mem:read_u8(base + i))) + end + -- Cross-check: read sanity bytes at the same offset in bank 0 + -- and bank 8 to find where DBR-rel stores actually land. + -- Search every bank from $00..$FF for $5A at offset $6F5D. + for bank = 0, 0xff do + local v = mem:read_u8(bank*0x10000+0x6F5D) + if v == 0x5a then + print(string.format("*** bank %02x HAS $5A at $6F5D ***", bank)) + end + end + for _, bank in ipairs({0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) do + print(string.format("bank %02x: $%06x = %02x (gDiag+e) $%06x = %02x (s2) $%06x = %02x (s1)", + bank, + bank*0x10000+0x6F5C, mem:read_u8(bank*0x10000+0x6F5C), + bank*0x10000+0x6F5D, mem:read_u8(bank*0x10000+0x6F5D), + bank*0x10000+0x6F4E, mem:read_u8(bank*0x10000+0x6F4E))) + end + -- Dump the runtime operand bytes of the symbolic `sta gDiag+0` + -- at .bin offset $387. With text-base=$1000, that's runtime + -- $08:$1387 (PBR + .bin offset + text-base). If the Loader + -- re-applied the cRELOC with a different segPlacedBase, the + -- operand bytes will differ from what the linker wrote. + local probeBase = 0x081000 + for ofs = 0x380, 0x39f, 0x10 do + local row = string.format("$08:%04x:", ofs) + for j = 0, 15 do + row = row .. string.format(" %02x", mem:read_u8(probeBase + ofs - 0x1000 + j)) + end + print(row) + end + print(string.format("test $704E: $08=%02x $00=%02x", + mem:read_u8(0x08704E), mem:read_u8(0x00704E))) + print(string.format("test $7060: $08=%02x $00=%02x", + mem:read_u8(0x087060), mem:read_u8(0x007060))) + print(string.format("test $70FF: $08=%02x $00=%02x", + mem:read_u8(0x0870FF), mem:read_u8(0x0070FF))) + for b = 0, 0xff do + if mem:read_u8(b*0x10000+0x704E) == 0xAB then + print(string.format("*** $AB at bank %02x:$704e ***", b)) + end + end + manager.machine:exit() + end}, +} +emu.register_frame_done(function() + frame = frame + 1 + while idx <= #steps and frame >= steps[idx][1] do + steps[idx][2]() + idx = idx + 1 + end +end) +LUA + +OUT=$(timeout 220 mame apple2gs -rompath "$PROJECT_ROOT/tools/mame/roms" \ + -window -nothrottle -sound none \ + -seconds_to_run 180 -flop3 "$WORK/disk.po" -flop4 "$WORK/data.po" \ + -autoboot_script "$WORK/launch.lua" &1) + +echo "$OUT" | grep -E "^(MARK|gDiag|bank|PBR|\*\*\*|\\\$08|test|A post)" diff --git a/scripts/probeQdStartup.sh b/scripts/probeQdStartup.sh new file mode 100755 index 0000000..8d87689 --- /dev/null +++ b/scripts/probeQdStartup.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# probeQdStartup.sh - boot qdProbe.omf under GS/OS, dump the per-phase +# markers ($80..$86) plus SHR row 0/1/2 byte signatures. +# +# Tells us WHICH startup call (QDStartUp / EMStartUp / WindStartUp) +# happened, and whether any of them wipe the pre-existing SHR markers. + +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +CADIUS="${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius}" +SYSDISK="${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po}" +OMF="$PROJECT_ROOT/demos/qdProbe.omf" +[ -f "$OMF" ] || bash "$PROJECT_ROOT/demos/build.sh" qdProbe >/dev/null + +WORK=$(mktemp -d -t qdProbe.XXXXXX) +trap 'rm -rf "$WORK"' EXIT + +cp "$SYSDISK" "$WORK/disk.po" +"$CADIUS" CREATEVOLUME "$WORK/data.po" DATA 800KB >/dev/null +cp "$OMF" "$WORK/HELLO#B30000" +"$CADIUS" ADDFILE "$WORK/data.po" /DATA "$WORK/HELLO#B30000" >/dev/null + +cat > "$WORK/launch.lua" <<'LUA' +local cpu = manager.machine.devices[":maincpu"] +local mem = cpu.spaces["program"] +local nat = manager.machine.natkeyboard +local frame = 0; local idx = 1 +local function gf(p,n) local pp = manager.machine.ioport.ports[p]; return pp and pp.fields[n] end +local kcmd = gf(":macadb:KEY3", "Command / Open Apple") +local function press(f) if f then f:set_value(1) end end +local function release(f) if f then f:set_value(0) end end +local steps = { + {3300, function() nat:post("D") end}, + {3540, function() press(kcmd) end}, + {3546, function() nat:post("o") end}, + {3600, function() release(kcmd) end}, + {4200, function() nat:post("H") end}, + {4500, function() press(kcmd) end}, + {4506, function() nat:post("o") end}, + {4560, function() release(kcmd) end}, + {8500, function() + for a = 0x70, 0x87 do + local v = mem:read_u8(a) + if v ~= 0 then + print(string.format("DP[0x%02x]=%02x", a, v)) + end + end + -- SHR row sentinel sample (bytes 0..2 of rows 0/1/2) + local function rowSample(off) + local s = "" + for i=0,3 do s = s .. string.format(" %02x", mem:read_u8(0xE12000 + off + i)) end + return s + end + print("SHR-row0:" .. rowSample(0)) + print("SHR-row1:" .. rowSample(160)) + print("SHR-row2:" .. rowSample(320)) + print("SHR-row5:" .. rowSample(800)) + print("SHR-row10:" .. rowSample(1600)) + -- Count any other non-zero pixels (excluding our intentional rows 0/1/2). + local count = 0 + for o = 480, 31999 do + if mem:read_u8(0xE12000 + o) ~= 0 then count = count + 1 end + end + print(string.format("SHR-rest-nonzero=%d", count)) + local scb0 = mem:read_u8(0xE19D00) + print(string.format("SHR-SCB0=%02x", scb0)) + manager.machine:exit() + end}, +} +emu.register_frame_done(function() + frame = frame + 1 + while idx <= #steps and frame >= steps[idx][1] do + steps[idx][2](); idx = idx + 1 + end +end) +LUA + +timeout 200 mame apple2gs -rompath "$PROJECT_ROOT/tools/mame/roms" \ + -window -nothrottle -sound none \ + -seconds_to_run 180 -flop3 "$WORK/disk.po" -flop4 "$WORK/data.po" \ + -autoboot_script "$WORK/launch.lua" &1 | \ + grep -E "DP|SHR-|MAME" || true diff --git a/scripts/runInMameWithGsosStub.sh b/scripts/runInMameWithGsosStub.sh index 4083c86..39e077b 100755 --- a/scripts/runInMameWithGsosStub.sh +++ b/scripts/runInMameWithGsosStub.sh @@ -26,7 +26,11 @@ SECS=3 # 23-byte stub bytes (see runtime/src/iigsGsosStub.s for source). # Hand-assembled to avoid relying on llvm-mc tracking M-flag state. -STUB_HEX="0848 a309 85e4 a000 00e2 20a9 4291 e4c2 2068 28a9 0000 6b" +# `lda 7,s` (a3 07) reads the parm-block offset from its position in +# the new wrapper layout: PEA 0 + PHA leaves bytes at (S+1..S+4) as +# (off_lo, off_hi, bank, pad). After JSL (3 bytes) + stub PHP (1) + +# stub PHA (2), offset sits at (S+7, S+8). +STUB_HEX="0848 a307 85e4 a000 00e2 20a9 4291 e4c2 2068 28a9 0000 6b" LUA_CHECKS="" EXPECT_LIST=() diff --git a/scripts/runViaFinder.sh b/scripts/runViaFinder.sh index 51c820f..764d59c 100755 --- a/scripts/runViaFinder.sh +++ b/scripts/runViaFinder.sh @@ -37,7 +37,7 @@ done shift PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -CADIUS=${CADIUS:-/tmp/cadius/cadius} +CADIUS=${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius} SYSDISK=${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po} [ -x "$CADIUS" ] || { echo "cadius not found at $CADIUS" >&2; exit 2; } diff --git a/scripts/smokeTest.sh b/scripts/smokeTest.sh index 488e30d..d3c54ef 100755 --- a/scripts/smokeTest.sh +++ b/scripts/smokeTest.sh @@ -395,9 +395,10 @@ if [ -x "$CLANG" ]; then int mul(int a, int b) { return a * b; } EOF "$CLANG" --target=w65816 -O2 -S "$cFile4" -o "$sMulFile" - if ! grep -qF "jsl __mulhi3" "$sMulFile"; then + # Accept either jsl or jml — tail-call peephole may convert. + if ! grep -qE "(jsl|jml) __mulhi3" "$sMulFile"; then cat "$sMulFile" >&2 - die "expected jsl __mulhi3" + die "expected jsl or jml __mulhi3" fi # Note: the original SPAdj-miscompile guard (which asserted specific # offsets like `lda 6,s` for arg b after one PHA) was tied to the @@ -1203,12 +1204,14 @@ EOF expect_lo=$(printf '%02x' $((mulhi3_addr & 0xff))) expect_mid=$(printf '%02x' $(((mulhi3_addr >> 8) & 0xff))) expect_hi=$(printf '%02x' $(((mulhi3_addr >> 16) & 0xff))) - # Hexdump mul's first 32 bytes and look for the JSL pattern. + # Hexdump mul's first 32 bytes and look for the JSL (0x22) or JML + # (0x5C) pattern. Tail-call peephole may convert JSL→JML when mul's + # body is just `return a * b`. if ! od -An -tx1 -N 32 -j "$mul_off" "$binLinkFile" \ | tr -s ' \n' ' ' \ - | grep -qE " 22 ${expect_lo} ${expect_mid} ${expect_hi}( |$)"; then + | grep -qE " (22|5c) ${expect_lo} ${expect_mid} ${expect_hi}( |$)"; then od -An -tx1 -N 32 -j "$mul_off" "$binLinkFile" >&2 - die "link816: mul's JSL operand does not point at __mulhi3 (expected 22 ${expect_lo} ${expect_mid} ${expect_hi})" + die "link816: mul's JSL/JML operand does not point at __mulhi3 (expected 22/5c ${expect_lo} ${expect_mid} ${expect_hi})" fi # Soft-float runtime: compile runtime/src/softFloat.c, then link a @@ -2198,6 +2201,41 @@ EOF fi rm -f "$cU64File" "$oU64File" "$binU64File" + log "check: MAME runs mul16to32(0xFFFF,0xFFFF) → 0xFFFE0001 (PEA peephole JSL-uses-A)" + cMulSF="$(mktemp --suffix=.c)" + oMulSF="$(mktemp --suffix=.o)" + binMulSF="$(mktemp --suffix=.bin)" + # Both args same constant — clang's SDAG CSEs them. Before the + # PEA peephole fix, the second `lda #0xffff` got elided (the + # peephole treated JSL's implicit-def $a as "A dead" without + # checking implicit-use $a), leaving A uninitialized going + # into the callee → wrong product. + cat > "$cMulSF" <<'EOF' +__attribute__((noinline)) void switchToBank2(void) { + __asm__ volatile ("sep #0x20\n.byte 0xa9,0x02\npha\nplb\nrep #0x20\n"); +} +__attribute__((noinline)) unsigned long mul16to32(unsigned short a, unsigned short b) { + return (unsigned long)a * (unsigned long)b; +} +int main(void) { + unsigned long r = mul16to32(0xFFFF, 0xFFFF); // expect 0xFFFE0001 + switchToBank2(); + *(volatile unsigned long *)0x5000 = r; + while (1) {} +} +EOF + "$CLANG" --target=w65816 -O2 -ffunction-sections -c \ + "$cMulSF" -o "$oMulSF" + "$PROJECT_ROOT/tools/link816" -o "$binMulSF" --text-base 0x1000 \ + "$oCrt0F" "$oLibcF" "$oSfF" "$oSdF" "$oLibgccFile" "$oMulSF" \ + >/dev/null 2>&1 + if ! bash "$PROJECT_ROOT/scripts/runInMame.sh" "$binMulSF" --check \ + 0x025000=0001 0x025002=fffe \ + >/dev/null 2>&1; then + die "MAME: mul16to32(0xFFFF, 0xFFFF) != 0xFFFE0001 (PEA peephole regression)" + fi + rm -f "$cMulSF" "$oMulSF" "$binMulSF" + log "check: MAME runs addOff(p,1) p[0]+=p[1] → 12 (StackSlotCleanup killed-Y respect)" cAofFile="$(mktemp --suffix=.c)" oAofFile="$(mktemp --suffix=.o)" @@ -6180,7 +6218,7 @@ fi # # Manual repro after fix: # GSOS_FILE_SMOKE=1 bash scripts/smokeTest.sh -CADIUS=${CADIUS:-/tmp/cadius/cadius} +CADIUS=${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius} SYSDISK=${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po} if [ "${GSOS_FILE_SMOKE:-0}" = "1" ] \ && [ -x "$CLANG" ] && [ -x "$CADIUS" ] && [ -f "$SYSDISK" ] \ diff --git a/scripts/snapDemo.sh b/scripts/snapDemo.sh new file mode 100755 index 0000000..228be05 --- /dev/null +++ b/scripts/snapDemo.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +# snapDemo.sh - boot a demo OMF in MAME and capture multiple SHR +# snapshots while it runs. Useful for verifying that a demo's window +# is actually drawn (vs the headless test which only checks the $99 +# end-marker at $00:0070). +# +# Usage: bash scripts/snapDemo.sh [snap-frame-list] +# Default snap frames: 4800,5000,5200,5500,6000,6500. +# Optional env: SYSDISK=path/to/sys602.po (or other ProDOS .po). +# +# Snapshots land in a TMPDIR-rooted snapdir; the path is echoed at +# the end. The work disk image and Finder navigation script are +# cleaned up via trap. + +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +[ $# -ge 1 ] || { echo "usage: $0 [frames]" >&2; exit 2; } +BASE="$1" +FRAMES="${2:-4800,5000,5200,5500,6000,6500}" + +CADIUS="${CADIUS:-$PROJECT_ROOT/tools/cadius/cadius}" +SYSDISK="${SYSDISK:-$PROJECT_ROOT/tools/gsos/sys602.po}" +OMF="$PROJECT_ROOT/demos/${BASE}.omf" + +[ -x "$CADIUS" ] || { echo "cadius not found: $CADIUS" >&2; exit 2; } +[ -f "$SYSDISK" ] || { echo "sysdisk not found: $SYSDISK" >&2; exit 2; } +[ -f "$OMF" ] || { echo "OMF not found: $OMF (run demos/build.sh $BASE first)" >&2; exit 2; } +command -v mame >/dev/null || { echo "mame not in PATH" >&2; exit 2; } + +WORK=$(mktemp -d -t snapDemo.XXXXXX) +SNAPDIR=$(mktemp -d -t snapDemoOut.XXXXXX) +trap 'rm -rf "$WORK"' EXIT + +cp "$SYSDISK" "$WORK/disk.po" +"$CADIUS" CREATEVOLUME "$WORK/data.po" DATA 800KB >/dev/null +cp "$OMF" "$WORK/HELLO#B30000" +"$CADIUS" ADDFILE "$WORK/data.po" /DATA "$WORK/HELLO#B30000" >/dev/null + +# Build lua steps[] entries for each requested snap frame. +SNAP_STEPS="" +for f in ${FRAMES//,/ }; do + SNAP_STEPS="${SNAP_STEPS} {${f}, function() manager.machine.video:snapshot(); print(string.format(\"SNAP-FRAME=${f}\")) end}, +" +done + +cat > "$WORK/launch.lua" <= steps[idx][1] do + steps[idx][2](); idx = idx + 1 + end +end) +LUA + +timeout 200 mame apple2gs -rompath "$PROJECT_ROOT/tools/mame/roms" \ + -window -nothrottle -sound none \ + -snapshot_directory "$SNAPDIR" \ + -seconds_to_run 180 -flop3 "$WORK/disk.po" -flop4 "$WORK/data.po" \ + -autoboot_script "$WORK/launch.lua" &1 | \ + grep -E "MAME-READ|SHR-|SNAP-" || true +echo "snaps in: $SNAPDIR" +find "$SNAPDIR" -name '*.png' | sort diff --git a/src/link816/link816.cpp b/src/link816/link816.cpp index 2f3afc8..be6b8d4 100644 --- a/src/link816/link816.cpp +++ b/src/link816/link816.cpp @@ -116,6 +116,13 @@ static constexpr uint8_t R_W65816_IMM16 = 2; static constexpr uint8_t R_W65816_IMM24 = 3; static constexpr uint8_t R_W65816_PCREL8 = 4; static constexpr uint8_t R_W65816_PCREL16 = 5; +// Bank byte of a 24-bit absolute address. Patches 2 bytes: +// byte 0 = (target >> 16) & 0xFF, byte 1 = 0. Used for the high +// half of `&symbol` 32-bit pointers so the bank tracks the actual +// OMF Loader segment placement at runtime. cRELOC emission uses +// ByteCnt=2 BitShift=16 so the Loader patches with +// (segPlacedBase + offsetRef) >> 16. +static constexpr uint8_t R_W65816_BANK16 = 6; // ---------------------------------------------------------------- Helpers @@ -321,7 +328,8 @@ struct Layout { struct Imm24Site { uint32_t patchOff; // offset within text image (== patchAddr - textBase) uint32_t offsetRef; // offset within text image of target symbol - uint8_t byteCnt; // 2 = IMM16, 3 = IMM24 + uint8_t byteCnt; // 2 = IMM16 or BANK16, 3 = IMM24 + uint8_t bitShift; // 0 for IMM16/IMM24, 16 for BANK16 }; static std::vector gImm24Sites; static uint32_t gTextBaseForSites = 0; @@ -363,6 +371,27 @@ static void applyReloc(std::vector &buf, uint32_t off, // (3). Imm24Site struct is reused — emitOmf will // emit cRELOC ByteCnt=2 for this. s.byteCnt = 2; + s.bitShift = 0; + gImm24Sites.push_back(s); + } + } + break; + case R_W65816_BANK16: + // 2-byte patch: byte 0 = bank of target, byte 1 = 0 (pad). + // The Loader's cRELOC pass overwrites these bytes with + // (segPlacedBase + offsetRef) >> 16 at load time, so at runtime + // the value reflects the actually-placed bank. + buf[off] = static_cast((target >> 16) & 0xFF); + buf[off + 1] = 0; + if (gRecordSites) { + uint32_t targetBank = target & 0xFF0000; + uint32_t baseBank = gTextBaseForSites & 0xFF0000; + if (targetBank == baseBank) { + Imm24Site s; + s.patchOff = patchAddr - gTextBaseForSites; + s.offsetRef = target - gTextBaseForSites; + s.byteCnt = 2; + s.bitShift = 16; gImm24Sites.push_back(s); } } @@ -389,6 +418,7 @@ static void applyReloc(std::vector &buf, uint32_t off, s.patchOff = patchAddr - gTextBaseForSites; s.offsetRef = target - gTextBaseForSites; s.byteCnt = 3; + s.bitShift = 0; gImm24Sites.push_back(s); } } @@ -1487,23 +1517,28 @@ int main(int argc, char **argv) { if (!mapPath.empty()) linker.writeMap(mapPath); if (!debugOutPath.empty()) linker.writeDebugSidecar(debugOutPath); if (!relocOutPath.empty()) { - // Sidecar binary format (v2): + // Sidecar binary format (v3): // u32 count - // { u32 patchOff; u32 offsetRef; u8 byteCnt; u8 pad[3]; } × count + // { u32 patchOff; u32 offsetRef; u8 byteCnt; u8 bitShift; + // u8 pad[2]; } × count // Both offsets are within the segment image (== link-time addr - // minus textBase). byteCnt = 2 for IMM16, 3 for IMM24. - // Consumed by omfEmit --relocs to emit cRELOC opcodes. + // minus textBase). byteCnt = 2 for IMM16 or BANK16, 3 for IMM24. + // bitShift = 0 normally, 16 for BANK16 (so the Loader patches + // with the bank byte instead of the offset). v2 used pad[0]=0 + // for byteCnt 2/3, so v3 is backwards-compatible: pad[0] was + // always 0 then, equivalent to bitShift=0. std::ofstream rf(relocOutPath, std::ios::binary); if (!rf) die("cannot open '" + relocOutPath + "' for writing"); uint32_t count = (uint32_t)gImm24Sites.size(); rf.write(reinterpret_cast(&count), 4); for (const auto &s : gImm24Sites) { uint32_t po = s.patchOff, off = s.offsetRef; - uint8_t bc = s.byteCnt, pad[3] = {0, 0, 0}; + uint8_t bc = s.byteCnt, bs = s.bitShift, pad[2] = {0, 0}; rf.write(reinterpret_cast(&po), 4); rf.write(reinterpret_cast(&off), 4); rf.write(reinterpret_cast(&bc), 1); - rf.write(reinterpret_cast(pad), 3); + rf.write(reinterpret_cast(&bs), 1); + rf.write(reinterpret_cast(pad), 2); } } // Multi-segment: write per-segment images + manifest if there's diff --git a/src/link816/omfEmit.cpp b/src/link816/omfEmit.cpp index 30690c4..c9f5e0a 100644 --- a/src/link816/omfEmit.cpp +++ b/src/link816/omfEmit.cpp @@ -46,6 +46,7 @@ struct RelocSite { uint16_t patchOff; uint16_t offsetRef; uint8_t byteCnt; + uint8_t bitShift; // 0 for offset relocs, 16 for BANK16 }; } // close namespace std::vector gReloc24Sites; @@ -110,16 +111,33 @@ static std::vector emitOneSeg(const std::vector &image, uint32_t org, uint16_t segNum, uint16_t kind, - const std::string &name) { + const std::string &name, + uint32_t bssSize = 0, + uint32_t bssGap = 0) { std::vector body; - if (!image.empty()) { + // Combined image: caller's LCONST data + zero-padding to bss-start + // offset + bssSize zero bytes. We embed BSS-as-zeros in the LCONST + // rather than relying on RESSPC zero-fill, because the GS/OS Loader's + // ExpressLoad fast path doesn't reliably honor RESSPC for KIND=CODE + // segments — writes past image.size() (= into RESSPC) were silently + // lost (they went to GS/OS-owned memory). Embedding BSS as zeros + // forces the Loader to allocate enough memory and read it from the + // file. Caller passes bssGap = bytes of padding between LCONST and + // BSS so BSS lands at the link-layout address (link816 page-aligns + // bss-start up from rodata-end). + std::vector combined; + combined.reserve(image.size() + bssGap + bssSize); + combined.insert(combined.end(), image.begin(), image.end()); + combined.insert(combined.end(), bssGap, 0); + combined.insert(combined.end(), bssSize, 0); + if (!combined.empty()) { // LCONST opcode 0xF2: takes a NUMLEN-byte count followed by N // literal bytes. With NUMLEN=4 (standard for v2.1), the count // field is 4 bytes. Verified empirically against real /SYSTEM/ // START on GS/OS 6.0.2: every segment uses 0xF2 + 4-byte count. body.push_back(0xF2); // LCONST opcode - put32(body, static_cast(image.size())); - body.insert(body.end(), image.begin(), image.end()); + put32(body, static_cast(combined.size())); + body.insert(body.end(), combined.begin(), combined.end()); } // cRELOC opcodes (0xF5): one per IMM24 reloc site. Format per // Merlin32's BuildOMFFile: @@ -135,7 +153,7 @@ static std::vector emitOneSeg(const std::vector &image, for (const auto &s : ::gReloc24Sites) { body.push_back(0xF5); body.push_back(s.byteCnt); // ByteCnt (2 or 3) - body.push_back(0); // BitShift + body.push_back(s.bitShift); // BitShift (0 or 16) put16(body, s.patchOff); // OffsetPatch put16(body, s.offsetRef); // OffsetReference } @@ -161,7 +179,12 @@ static std::vector emitOneSeg(const std::vector &image, constexpr uint16_t DISPNAME = 44; const uint16_t DISPDATA = static_cast( DISPNAME + loadName.size() + segName.size()); - const uint32_t LENGTH = static_cast(image.size()); + // LENGTH = in-memory segment size = LCONST data size (BSS already + // appended as zeros to `combined` above). RESSPC = 0 because the + // BSS bytes are part of LCONST — the Loader's normal LCONST processing + // allocates and fills the memory. Tried RESSPC > 0 first, but the + // ExpressLoad fast path doesn't honor RESSPC for CODE-KIND segments. + const uint32_t LENGTH = static_cast(combined.size()); const uint32_t BYTECNT = DISPDATA + static_cast(body.size()); const uint32_t RESSPC = 0; // BANKSIZE = 0x10000 — segment fits in one 64KB bank. @@ -296,10 +319,12 @@ static std::vector emitDpStackSeg(uint32_t length, uint16_t segNum) { static std::vector emitOMF(const std::vector &image, uint32_t entryOffset, const std::string &name, - uint32_t stackSize = 0) { + uint32_t stackSize = 0, + uint32_t bssSize = 0, + uint32_t bssGap = 0) { if (stackSize == 0) { return emitOneSeg(image, entryOffset, /*org*/0, /*segNum*/1, - /*kind*/0x1000, name); + /*kind*/0x1000, name, bssSize, bssGap); } // DP/Stack segment ordering: Apple's `makedirect` reference utility // assigns the DP/Stack as SEGNUM 1 (its own object); when linked @@ -309,7 +334,7 @@ static std::vector emitOMF(const std::vector &image, // sets DP and SP appropriately when entering our code. auto dpSeg = emitDpStackSeg(stackSize, /*segNum*/1); auto codeSeg = emitOneSeg(image, entryOffset, /*org*/0, /*segNum*/2, - /*kind*/0x1000, name); + /*kind*/0x1000, name, bssSize, bssGap); std::vector out; out.insert(out.end(), dpSeg.begin(), dpSeg.end()); out.insert(out.end(), codeSeg.begin(), codeSeg.end()); @@ -356,13 +381,15 @@ static std::vector emitOmfExpressLoad( const std::vector &image, uint32_t entryOffset, const std::string &userSegName, - uint32_t stackSize = 0) { + uint32_t stackSize = 0, + uint32_t bssSize = 0, + uint32_t bssGap = 0) { // Step 1: build the user segment using KIND=0x1000 (CODE|PRIV). // Same KIND emitOMF uses for single-segment apps. Verified // Loader-launchable via the Finder smoke path. auto userSeg = emitOneSeg(image, entryOffset, /*org*/0, /*segNum*/2, - /*kind*/0x1000, userSegName); + /*kind*/0x1000, userSegName, bssSize, bssGap); // Step 2: figure out the file offsets we'll need to bake into the // load script. We don't know the ExpressLoad segment's total size @@ -431,8 +458,12 @@ static std::vector emitOmfExpressLoad( put16(elData, 2); // Header info entry for the user segment. + // data length = LCONST data size in the file. emitOneSeg embeds + // bssGap bytes of zero padding + bssSize bytes of BSS-as-zeros in + // the LCONST after the caller's image, so the on-disk data is + // image.size() + bssGap + bssSize bytes. put32(elData, userDataOff); // data offset in file - put32(elData, (uint32_t)image.size()); // data length + put32(elData, (uint32_t)image.size() + bssGap + bssSize); // data length // cRELOC opcodes (if any) are emitted by emitOneSeg directly after // the LCONST data and before the END opcode. Tell ExpressLoad // where they live so the Loader can apply them — without this the @@ -444,7 +475,7 @@ static std::vector emitOmfExpressLoad( } else { const uint32_t crelocBytesPerSite = 7; // 0xF5 + 1+1+2+2 const uint32_t crelocOff = - userDataOff + (uint32_t)image.size(); + userDataOff + (uint32_t)image.size() + bssGap + bssSize; const uint32_t crelocLen = crelocBytesPerSite * (uint32_t)gReloc24Sites.size(); put32(elData, crelocOff); @@ -700,8 +731,10 @@ int main(int argc, char **argv) { } // Load reloc list, if provided. - // Sidecar v2 layout: u32 count + 12 bytes per entry - // { u32 patchOff; u32 offsetRef; u8 byteCnt; u8 pad[3]; } + // Sidecar v3 layout: u32 count + 12 bytes per entry + // { u32 patchOff; u32 offsetRef; u8 byteCnt; u8 bitShift; u8 pad[2]; } + // v2 used pad[3]=0 — v3 keeps the same size by repurposing pad[0] as + // bitShift. v2 sidecars are read transparently (bitShift = pad[0]=0). if (!relocFile.empty()) { auto raw = readFile(relocFile); if (raw.size() < 4) die("--relocs file too small"); @@ -720,14 +753,18 @@ int main(int argc, char **argv) { uint32_t offRef = (uint32_t)raw[off+4] | ((uint32_t)raw[off+5] << 8) | ((uint32_t)raw[off+6] << 16) | ((uint32_t)raw[off+7] << 24); uint8_t byteCnt = raw[off+8]; + uint8_t bitShift = raw[off+9]; if (patchOff > 0xFFFF || offRef > 0xFFFF) die("reloc site out of 16-bit range — segment too large?"); if (byteCnt != 2 && byteCnt != 3) die("reloc site byteCnt=" + std::to_string(byteCnt) + " (must be 2 or 3)"); + if (bitShift != 0 && bitShift != 16) + die("reloc site bitShift=" + std::to_string(bitShift) + " (must be 0 or 16)"); RelocSite s; s.patchOff = (uint16_t)patchOff; s.offsetRef = (uint16_t)offRef; s.byteCnt = byteCnt; + s.bitShift = bitShift; gReloc24Sites.push_back(s); } } @@ -786,9 +823,25 @@ int main(int argc, char **argv) { name = (dot == std::string::npos) ? base_n : base_n.substr(0, dot); } + // Pull BSS info from the link816 .map. We embed BSS as zero bytes + // in the LCONST data so the OMF Loader allocates and fills the + // memory directly (RESSPC zero-fill was unreliable via ExpressLoad + // for KIND=CODE segs). link816 page-aligns __bss_start upward + // from rodata-end so there's typically a gap; we pad with zeros. + uint32_t bssSize = 0, bssStart = 0, bssGap = 0; + auto bssSizeIt = syms.find("__bss_size"); + auto bssStartIt = syms.find("__bss_start"); + if (bssSizeIt != syms.end()) bssSize = bssSizeIt->second; + if (bssStartIt != syms.end()) bssStart = bssStartIt->second; + if (bssStart >= base) { + uint32_t bssOffInImage = bssStart - base; + if (bssOffInImage > image.size()) + bssGap = bssOffInImage - (uint32_t)image.size(); + } + auto blob = expressload - ? emitOmfExpressLoad(image, entryOff, name, stackSize) - : emitOMF(image, entryOff, name, stackSize); + ? emitOmfExpressLoad(image, entryOff, name, stackSize, bssSize, bssGap) + : emitOMF(image, entryOff, name, stackSize, bssSize, bssGap); std::ofstream f(output, std::ios::binary); if (!f) die("cannot open '" + output + "' for writing"); f.write(reinterpret_cast(blob.data()), blob.size()); diff --git a/src/llvm/lib/Target/W65816/AsmParser/W65816AsmParser.cpp b/src/llvm/lib/Target/W65816/AsmParser/W65816AsmParser.cpp index 70deade..18d48f6 100644 --- a/src/llvm/lib/Target/W65816/AsmParser/W65816AsmParser.cpp +++ b/src/llvm/lib/Target/W65816/AsmParser/W65816AsmParser.cpp @@ -377,6 +377,16 @@ bool W65816AsmParser::parseInstruction(ParseInstructionInfo &Info, // If there are no operands, we're done (covers nop, rts, rtl, clc, etc. // and the implied-accumulator forms handled above). if (getLexer().is(AsmToken::EndOfStatement)) { + // Bare shorthand for accumulator-implied shift/rotate/inc/dec. + // The canonical 65816 syntax is `asl a` / `inc a`, but most + // assemblers accept the bare mnemonic. Inject the A register + // operand so the matcher routes to the ASL_A / INA / etc. def. + StringRef Lower = Name.lower(); + if (Lower == "asl" || Lower == "lsr" || Lower == "rol" || + Lower == "ror" || Lower == "inc" || Lower == "dec") { + SMLoc EOS = getLexer().getTok().getLoc(); + Operands.push_back(W65816Operand::createReg(W65816::A, EOS, EOS)); + } Parser.Lex(); return false; } diff --git a/src/llvm/lib/Target/W65816/CMakeLists.txt b/src/llvm/lib/Target/W65816/CMakeLists.txt index b192f7e..e2b7879 100644 --- a/src/llvm/lib/Target/W65816/CMakeLists.txt +++ b/src/llvm/lib/Target/W65816/CMakeLists.txt @@ -42,6 +42,7 @@ add_llvm_target(W65816CodeGen W65816StackRelToImg.cpp W65816StackSlotMerge.cpp W65816TargetMachine.cpp + W65816UnLSR.cpp W65816AsmPrinter.cpp W65816MCInstLower.cpp diff --git a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816AsmBackend.cpp b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816AsmBackend.cpp index c2ec7d9..c9e0875 100644 --- a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816AsmBackend.cpp +++ b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816AsmBackend.cpp @@ -65,6 +65,14 @@ public: case W65816::fixup_24: Width = 3; break; + case W65816::fixup_bank16: + // Patch 2 bytes with (bank, 0) where bank = (Value >> 16) & 0xFF. + // The OMF cRELOC at load time supersedes this static patch with + // the actual placed bank; this branch is the in-static-link + // value when target and patch are in the same segment. + Data[Offset] = static_cast((Value >> 16) & 0xff); + Data[Offset + 1] = 0; + return; default: // Generic FK_Data_* kinds are already handled by the generic code // in the object writer; nothing to patch here. @@ -107,6 +115,7 @@ public: {"fixup_24", 0, 24, 0}, {"fixup_8_pcrel", 0, 8, 0}, {"fixup_16_pcrel", 0, 16, 0}, + {"fixup_bank16", 0, 16, 0}, }; // clang-format on static_assert(std::size(Infos) == W65816::NumTargetFixupKinds, diff --git a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816ELFObjectWriter.cpp b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816ELFObjectWriter.cpp index cd63baa..7d76193 100644 --- a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816ELFObjectWriter.cpp +++ b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816ELFObjectWriter.cpp @@ -57,6 +57,7 @@ protected: case W65816::fixup_24: return 3; // R_W65816_IMM24 case W65816::fixup_8_pcrel: return 4; // R_W65816_PCREL8 case W65816::fixup_16_pcrel: return 5; // R_W65816_PCREL16 + case W65816::fixup_bank16: return 6; // R_W65816_BANK16 case FK_Data_1: return IsPCRel ? 4 : 1; case FK_Data_2: return IsPCRel ? 5 : 2; case FK_Data_4: return 3; // truncated to IMM24 (we have diff --git a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816FixupKinds.h b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816FixupKinds.h index d724bce..f0f0652 100644 --- a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816FixupKinds.h +++ b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816FixupKinds.h @@ -29,6 +29,11 @@ enum Fixups { fixup_8_pcrel, // 16-bit PC-relative fixup (long branch / BRL). fixup_16_pcrel, + // 16-bit fixup that materialises (bankByte, 0) of a 24-bit target + // address into 2 little-endian bytes. Used for the high half of a + // 32-bit pointer constant: `ldx #@bank(symbol)` so &symbol's bank + // byte tracks the OMF Loader's actual placement at runtime. + fixup_bank16, // Marker LastTargetFixupKind, diff --git a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCAsmInfo.cpp b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCAsmInfo.cpp index 2237658..940cdbb 100644 --- a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCAsmInfo.cpp +++ b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCAsmInfo.cpp @@ -27,6 +27,13 @@ W65816MCAsmInfo::W65816MCAsmInfo(const Triple &TT) { AlignmentIsInBytes = false; UsesELFSectionDirectiveForBSS = true; + // Recognize the 65xx-traditional `$XX` hex prefix and `%bbb` binary + // prefix. Without this the lexer emits a bare `$` Dollar token + // (which parseExpression treats as the current PC) and silently + // assembles `lda $42` to `lda 0` (caught hand-testing 2026-05-14). + // C-style `0x42` continues to work. + UseMotorolaIntegers = true; + SupportsDebugInformation = true; // C++ exceptions use the SJLJ model. Selecting SJLJ here makes diff --git a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCCodeEmitter.cpp b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCCodeEmitter.cpp index 27267c2..f8bbf2c 100644 --- a/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCCodeEmitter.cpp +++ b/src/llvm/lib/Target/W65816/MCTargetDesc/W65816MCCodeEmitter.cpp @@ -66,6 +66,9 @@ class W65816MCCodeEmitter : public MCCodeEmitter { unsigned encodeImm16(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups, const MCSubtargetInfo &STI) const; + unsigned encodeImm16Bank(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups, + const MCSubtargetInfo &STI) const; unsigned encodeAddr8(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups, const MCSubtargetInfo &STI) const; @@ -160,6 +163,12 @@ unsigned W65816MCCodeEmitter::encodeImm16(const MCInst &MI, unsigned OpIdx, return encodeOperand(MI, OpIdx, 2, W65816::fixup_16, Fixups); } +unsigned W65816MCCodeEmitter::encodeImm16Bank(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups, + const MCSubtargetInfo &STI) const { + return encodeOperand(MI, OpIdx, 2, W65816::fixup_bank16, Fixups); +} + unsigned W65816MCCodeEmitter::encodeAddr8(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups, const MCSubtargetInfo &STI) const { diff --git a/src/llvm/lib/Target/W65816/W65816.h b/src/llvm/lib/Target/W65816/W65816.h index 62f9086..69c8ce7 100644 --- a/src/llvm/lib/Target/W65816/W65816.h +++ b/src/llvm/lib/Target/W65816/W65816.h @@ -124,6 +124,14 @@ FunctionPass *createW65816SjLjFinalize(); // zext that a SDAG-level combine would key off. See W65816NarrowI32Mul.cpp. FunctionPass *createW65816NarrowI32Mul(); +// Post-LSR IR pass: detect pointer-walking loops over GlobalAddress +// bases and rewrite to forward-counter + indexed GEP form. LSR's +// transform is faster for pointer-arg loops (single ptr increment per +// iter via [dp],Y), but for global-array access the W65816 has cheap +// `lda , X` indexed addressing that we'd rather use. See +// W65816UnLSR.cpp. +FunctionPass *createW65816UnLSR(); + // Post-RA, pre-PEI pass: rewrite high-traffic i16 FrameIndex accesses // to use IMG8..15 DP slots ($C0..$CE) instead of stack-rel spills. // Picks K = (number of free IMG8..15) hottest FIs and rewrites their diff --git a/src/llvm/lib/Target/W65816/W65816AsmPrinter.cpp b/src/llvm/lib/Target/W65816/W65816AsmPrinter.cpp index d13d0dd..f063a4b 100644 --- a/src/llvm/lib/Target/W65816/W65816AsmPrinter.cpp +++ b/src/llvm/lib/Target/W65816/W65816AsmPrinter.cpp @@ -301,6 +301,25 @@ void W65816AsmPrinter::emitInstruction(const MachineInstr *MI) { EmitToStreamer(*OutStreamer, Ldx); return; } + case W65816::LDAi16imm_bank: { + // Bank-byte materialization for the HIGH half of a `&symbol` 32-bit + // pointer. At runtime crt0 sets $00:00BE = PBR (placement bank) + // and $00:00BF = 0 (pad), so `lda $BE` in 16-bit M reads the 16-bit + // value $00PBR — exactly the bank|pad word we want. + // + // Why not a fixup_bank16 reloc that the OMF Loader patches? Tried + // first; the Loader's cRELOC `BitShift=16` mechanism doesn't track + // the placed bank (segPlacedBase appears 16-bit-only in the formula + // it actually uses). `lda $BE` is also 2 bytes vs 3 for `lda #imm` + // so this is a size win too. The symbol operand on the pseudo is + // ignored — only the SDNode's value-type matters, which is i16 + // bank|pad. + MCInst Lda; + Lda.setOpcode(W65816::LDA_DP); + Lda.addOperand(MCOperand::createImm(0xBE)); + EmitToStreamer(*OutStreamer, Lda); + return; + } case W65816::LDAi16imm: { // Peek at the next non-debug MI for two peephole patterns: // (1) LDAi16imm 0 + STAabs $g -> STZ_Abs $g (saves 3B) @@ -322,23 +341,30 @@ void W65816AsmPrinter::emitInstruction(const MachineInstr *MI) { if (IsZero && It != MI->getParent()->end() && It->getOpcode() == W65816::STAabs && It->getOperand(0).isReg() && It->getOperand(0).isKill()) { - MCInst Stz; - Stz.setOpcode(W65816::STZ_Abs); - Stz.addOperand(lowerOperand(It->getOperand(1), MCInstLowering)); - EmitToStreamer(*OutStreamer, Stz); - SkipNextStaAbs = true; - return; + // Only collapse to STZ when the address fits in 16 bits. STZ + // has no long-form (24-bit) variant — STZ_Abs is DBR-relative + // 3-byte and would drop a non-zero bank byte. When the user + // writes `*(uint16 *)0xE19E00UL = 0` we MUST keep the + // LDA #0 + STA_Long pair so the bank-explicit form survives. + bool AddrFitsIn16 = !It->getOperand(1).isImm() || + (It->getOperand(1).getImm() & 0xFF0000) == 0; + if (AddrFitsIn16) { + MCInst Stz; + Stz.setOpcode(W65816::STZ_Abs); + Stz.addOperand(lowerOperand(It->getOperand(1), MCInstLowering)); + EmitToStreamer(*OutStreamer, Stz); + SkipNextStaAbs = true; + return; + } } // PEA peephole: LDAi16imm + PUSH16 -> PEA. Safe iff A is dead - // after the PUSH16 — the next instruction must redefine A (so the - // value PUSH16 read is genuinely dead). We use modifiesRegister - // which handles both explicit defs and implicit-defs (e.g. JSL - // clobbers A as part of the calling convention). Falls through - // to a normal LDA #imm; PHA pair if A might be live afterward. - // Note: physreg use-kill flags on PUSH16's implicit-$a are not - // reliably set at AsmPrinter time, so we can't gate on them - // directly; checking the next instruction's def-set is robust. + // after the PUSH16 — the next instruction must redefine A WITHOUT + // reading A first. JSL has implicit-def $a (caller-save) AND + // implicit-use $a when A is an arg (the W65816 calling convention). + // The peephole must NOT fire when the next op USES A: dropping + // the LDA would leave A undefined going into the callee. Same + // shape as the PEI peephole below. if (It != MI->getParent()->end() && It->getOpcode() == W65816::PUSH16) { auto It2 = std::next(It); while (It2 != MI->getParent()->end() && It2->isDebugInstr()) ++It2; @@ -346,7 +372,8 @@ void W65816AsmPrinter::emitInstruction(const MachineInstr *MI) { if (It2 != MI->getParent()->end()) { const TargetRegisterInfo *TRI = MI->getParent()->getParent()->getSubtarget().getRegisterInfo(); - if (It2->modifiesRegister(W65816::A, TRI)) + if (It2->modifiesRegister(W65816::A, TRI) && + !It2->readsRegister(W65816::A, TRI)) ADead = true; } else { // PUSH16 is the last instruction in the BB. A is dead at @@ -451,18 +478,35 @@ void W65816AsmPrinter::emitInstruction(const MachineInstr *MI) { return; } case W65816::LDAabs: { + // Same bank-byte detection as STAabs above. `*(uint16 *)0xE19E00UL` + // needs LDA_Long; `*(uint16 *)0x5000` stays DBR-relative. + const MachineOperand &AddrOp = MI->getOperand(1); + bool UseLong = false; + if (AddrOp.isImm() && (AddrOp.getImm() & 0xFF0000) != 0) + UseLong = true; MCInst Lda; - Lda.setOpcode(W65816::LDA_Abs); - Lda.addOperand(lowerOperand(MI->getOperand(1), MCInstLowering)); + Lda.setOpcode(UseLong ? W65816::LDA_Long : W65816::LDA_Abs); + Lda.addOperand(lowerOperand(AddrOp, MCInstLowering)); EmitToStreamer(*OutStreamer, Lda); return; } case W65816::STAabs: { // STAabs is (outs), (ins Acc16:$src, addr:$addr). The MC STA_Abs // takes only $addr; $src lives in the implicit A. + // + // If the address is an immediate with a non-zero bank byte (e.g. + // `*(uint16 *)0xE19E00UL = v` for an SHR palette write), emit + // STA_Long (4-byte, bank-explicit) instead of STA_Abs (3-byte, + // DBR-relative). Without this the bank byte gets dropped and + // the store lands in whatever bank DBR happens to be — wrong for + // any IIgs hardware region outside bank 0. + const MachineOperand &AddrOp = MI->getOperand(1); + bool UseLong = false; + if (AddrOp.isImm() && (AddrOp.getImm() & 0xFF0000) != 0) + UseLong = true; MCInst Sta; - Sta.setOpcode(W65816::STA_Abs); - Sta.addOperand(lowerOperand(MI->getOperand(1), MCInstLowering)); + Sta.setOpcode(UseLong ? W65816::STA_Long : W65816::STA_Abs); + Sta.addOperand(lowerOperand(AddrOp, MCInstLowering)); EmitToStreamer(*OutStreamer, Sta); return; } @@ -601,6 +645,36 @@ void W65816AsmPrinter::emitInstruction(const MachineInstr *MI) { EmitToStreamer(*OutStreamer, Rep); return; } + case W65816::LDA8absX: { + // i8 indexed-global load: SEP #0x20 ; LDA , X ; REP #0x20 + // X holds the index (set up by CopyToReg before this MI). + MCInst Sep; Sep.setOpcode(W65816::SEP); + Sep.addOperand(MCOperand::createImm(0x20)); + EmitToStreamer(*OutStreamer, Sep); + MCInst Lda; + Lda.setOpcode(W65816::LDA_AbsX); + Lda.addOperand(lowerOperand(MI->getOperand(0), MCInstLowering)); + EmitToStreamer(*OutStreamer, Lda); + MCInst Rep; Rep.setOpcode(W65816::REP); + Rep.addOperand(MCOperand::createImm(0x20)); + EmitToStreamer(*OutStreamer, Rep); + return; + } + case W65816::STA8absX: { + // i8 indexed-global store: SEP #0x20 ; STA , X ; REP #0x20 + // A holds the value, X holds the index. + MCInst Sep; Sep.setOpcode(W65816::SEP); + Sep.addOperand(MCOperand::createImm(0x20)); + EmitToStreamer(*OutStreamer, Sep); + MCInst Sta; + Sta.setOpcode(W65816::STA_AbsX); + Sta.addOperand(lowerOperand(MI->getOperand(0), MCInstLowering)); + EmitToStreamer(*OutStreamer, Sta); + MCInst Rep; Rep.setOpcode(W65816::REP); + Rep.addOperand(MCOperand::createImm(0x20)); + EmitToStreamer(*OutStreamer, Rep); + return; + } case W65816::STA8abs: case W65816::STA8long: { // STA_Abs / STA_Long are 16-bit when M=0, 8-bit when M=1. Pure-i8 diff --git a/src/llvm/lib/Target/W65816/W65816BranchExpand.cpp b/src/llvm/lib/Target/W65816/W65816BranchExpand.cpp index 7fc390b..fd6b5c0 100644 --- a/src/llvm/lib/Target/W65816/W65816BranchExpand.cpp +++ b/src/llvm/lib/Target/W65816/W65816BranchExpand.cpp @@ -245,6 +245,74 @@ static bool splitMultiBranchMBBs(MachineFunction &MF, // when the branches were emitted by the W65816 SELECT_CC inserter or // by codegenprepare on an `br i1 %c, label %X, label %X` IR shape. // Returns true if any MI was deleted. +// Invert a conditional branch when its taken-target equals the +// immediately-following MBB in layout order. Pattern: +// +// MBB ends with: +// Bxx CondTarget +// BRA UncondTarget +// next-laid-out MBB == CondTarget +// +// Rewrite to (no BRA, fall through to CondTarget which is the next MBB): +// +// Bxx_inverted UncondTarget +// +// +// Common pattern: tight loops `beq exit ; bra loop` where the exit +// block is placed right after the loop body. After this, the backedge +// becomes a single `bne loop` (3 cyc taken) instead of `beq exit + bra +// loop` (6 cyc when looping). sumOfSquares hits this 50× per call. +static bool invertCondToFallThrough(MachineFunction &MF, + const TargetInstrInfo *TII) { + bool Changed = false; + auto MBBIt = MF.begin(); + while (MBBIt != MF.end()) { + MachineBasicBlock &MBB = *MBBIt; + auto NextMBB = std::next(MBBIt); + ++MBBIt; + if (NextMBB == MF.end()) { + continue; + } + auto T = MBB.getFirstTerminator(); + if (T == MBB.end()) { + continue; + } + unsigned CondOpc = T->getOpcode(); + unsigned InvOpc = invertedConditional(CondOpc); + if (InvOpc == 0) { + continue; + } + if (T->getNumOperands() < 1 || !T->getOperand(0).isMBB()) { + continue; + } + MachineBasicBlock *CondTarget = T->getOperand(0).getMBB(); + auto N = std::next(T); + if (N == MBB.end()) { + continue; + } + unsigned UncondOpc = N->getOpcode(); + if (UncondOpc != W65816::BRA && UncondOpc != W65816::BRL) { + continue; + } + if (N->getNumOperands() < 1 || !N->getOperand(0).isMBB()) { + continue; + } + MachineBasicBlock *UncondTarget = N->getOperand(0).getMBB(); + if (CondTarget != &*NextMBB) { + continue; + } + if (CondTarget == UncondTarget) { + continue; + } + T->setDesc(TII->get(InvOpc)); + T->getOperand(0).setMBB(UncondTarget); + N->eraseFromParent(); + Changed = true; + } + return Changed; +} + + static bool dropDeadConditionalsToBRATarget(MachineFunction &MF) { bool Changed = false; for (auto &MBB : MF) { @@ -276,6 +344,10 @@ bool W65816BranchExpand::runOnMachineFunction(MachineFunction &MF) { const auto *TII = STI.getInstrInfo(); bool AnyChanged = false; + // Step -1: invert Bxx + BRA when cond target is the next MBB. Saves + // 3 cyc per backedge in tight loops (sumOfSquares 50 iters: -150 cyc). + AnyChanged |= invertCondToFallThrough(MF, TII); + // Step 0: drop dead conditionals (Bxx X immediately followed by BRA X // — both edges to the same MBB). Cheap and removes false-positive // candidates from the distance-based expansion below. diff --git a/src/llvm/lib/Target/W65816/W65816ISelLowering.cpp b/src/llvm/lib/Target/W65816/W65816ISelLowering.cpp index a261bb1..ad3ff9d 100644 --- a/src/llvm/lib/Target/W65816/W65816ISelLowering.cpp +++ b/src/llvm/lib/Target/W65816/W65816ISelLowering.cpp @@ -314,6 +314,23 @@ W65816TargetLowering::W65816TargetLowering(const TargetMachine &TM, setOperationAction(ISD::TRUNCATE, MVT::i8, Custom); setOperationAction(ISD::LOAD, MVT::i32, Custom); setOperationAction(ISD::STORE, MVT::i32, Custom); + // Also Custom for i16/i8 LOAD/STORE in ptr32 mode so LowerLoad/ + // LowerStore can fold Wide32(Wrapper, WrapperBank) of the same + // global (or a raw GlobalAddress) to a plain abs-16 access + // (DBR-relative). Without this, every `g` access for a + // same-segment global goes through the 14-byte [dp],y + // indirect-long path even though the bank is implicit in DBR. + setOperationAction(ISD::STORE, MVT::i16, Custom); + setOperationAction(ISD::STORE, MVT::i8, Custom); + setOperationAction(ISD::LOAD, MVT::i16, Custom); + setOperationAction(ISD::LOAD, MVT::i8, Custom); + // ZEXTLOAD i16-from-i8 also Custom — the DAG combiner folds + // (zext (load i8 @g)) into one zextload SDNode, so we need to + // apply the same global-address fold there. SEXTLOAD/EXTLOAD + // already have Expand actions from earlier setLoadExtAction + // calls; leave those alone (Custom would require parallel + // tablegen patterns we don't have). + setLoadExtAction(ISD::ZEXTLOAD, MVT::i16, MVT::i8, Custom); setOperationAction(ISD::SETCC, MVT::i32, Custom); setOperationAction(ISD::BR_CC, MVT::i32, Custom); setOperationAction(ISD::SELECT_CC, MVT::i32, Custom); @@ -536,6 +553,20 @@ static SDValue extractWide32Lo(SelectionDAG &DAG, const SDLoc &DL, SDValue X) { if (auto *C = dyn_cast(X)) { return DAG.getConstant(C->getZExtValue() & 0xFFFFu, DL, MVT::i16); } + // For un-lowered GlobalAddress / ExternalSymbol nodes (which reach + // here when the store-lowering runs before LowerOperation has split + // the constant into a Wide32 pair), emit a fresh Wrapper / WrapperBank + // pair directly. getTargetExtractSubreg on a GlobalAddress node + // produces a malformed result (no sub-reg info on a non-register). + if (auto *GA = dyn_cast(X)) { + SDValue T = DAG.getTargetGlobalAddress(GA->getGlobal(), DL, MVT::i16, + GA->getOffset()); + return DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, T); + } + if (auto *ES = dyn_cast(X)) { + SDValue T = DAG.getTargetExternalSymbol(ES->getSymbol(), MVT::i16); + return DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, T); + } if (SDValue Half = lookThroughRegSeq(X, llvm::sub_lo)) return Half; return DAG.getTargetExtractSubreg(llvm::sub_lo, DL, MVT::i16, X); @@ -544,6 +575,15 @@ static SDValue extractWide32Hi(SelectionDAG &DAG, const SDLoc &DL, SDValue X) { if (auto *C = dyn_cast(X)) { return DAG.getConstant((C->getZExtValue() >> 16) & 0xFFFFu, DL, MVT::i16); } + if (auto *GA = dyn_cast(X)) { + SDValue T = DAG.getTargetGlobalAddress(GA->getGlobal(), DL, MVT::i16, + GA->getOffset()); + return DAG.getNode(W65816ISD::WrapperBank, DL, MVT::i16, T); + } + if (auto *ES = dyn_cast(X)) { + SDValue T = DAG.getTargetExternalSymbol(ES->getSymbol(), MVT::i16); + return DAG.getNode(W65816ISD::WrapperBank, DL, MVT::i16, T); + } if (SDValue Half = lookThroughRegSeq(X, llvm::sub_hi)) return Half; return DAG.getTargetExtractSubreg(llvm::sub_hi, DL, MVT::i16, X); @@ -816,6 +856,58 @@ SDValue W65816TargetLowering::LowerLoad(SDValue Op, return DAG.getMergeValues({Val, NewChain}, DL); } + // Same fold as LowerStore: a Wide32 ptr built from Wrapper + + // WrapperBank of the same global, OR a raw GlobalAddress, lets us + // emit an abs-16 (DBR-relative) load (LDA / LDA8abs) instead of + // the slower [dp],Y indirect-long. Our globals are in the load + // segment that crt0 pins to DBR. + SDValue FoldedLo; + if (auto *GA = dyn_cast(Ptr)) { + FoldedLo = DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, + DAG.getTargetGlobalAddress(GA->getGlobal(), DL, MVT::i16, + GA->getOffset())); + } else if (auto *ES = dyn_cast(Ptr)) { + FoldedLo = DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, + DAG.getTargetExternalSymbol(ES->getSymbol(), MVT::i16)); + } else if (Ptr.getNode()->isMachineOpcode() && + Ptr.getMachineOpcode() == TargetOpcode::REG_SEQUENCE) { + SDValue PLo, PHi; + for (unsigned i = 1; i + 1 < Ptr.getNumOperands(); i += 2) { + if (auto *CIdx = dyn_cast(Ptr.getOperand(i + 1))) { + if (CIdx->getZExtValue() == llvm::sub_lo) PLo = Ptr.getOperand(i); + else if (CIdx->getZExtValue() == llvm::sub_hi) PHi = Ptr.getOperand(i); + } + } + if (PLo && PHi && + PLo.getOpcode() == W65816ISD::Wrapper && + PHi.getOpcode() == W65816ISD::WrapperBank) { + SDValue WLo = PLo.getOperand(0); + SDValue WHi = PHi.getOperand(0); + auto *GLo = dyn_cast(WLo); + auto *GHi = dyn_cast(WHi); + auto *ELo = dyn_cast(WLo); + auto *EHi = dyn_cast(WHi); + bool SameGlobal = (GLo && GHi && GLo->getGlobal() == GHi->getGlobal() && + GLo->getOffset() == GHi->getOffset()); + bool SameExtern = (ELo && EHi && + StringRef(ELo->getSymbol()) == EHi->getSymbol()); + if (SameGlobal || SameExtern) + FoldedLo = PLo; + } + } + if (FoldedLo) { + EVT MemVT = Ld->getMemoryVT(); + ISD::LoadExtType ExtType = Ld->getExtensionType(); + if (ExtType == ISD::NON_EXTLOAD && MemVT == Op.getValueType()) { + return DAG.getLoad(Op.getValueType(), DL, Chain, FoldedLo, + Ld->getPointerInfo(), + Ld->getAlign(), + Ld->getMemOperand()->getFlags()); + } + return DAG.getExtLoad(ExtType, DL, Op.getValueType(), Chain, FoldedLo, + MemVT, Ld->getMemOperand()); + } + // ptr16 mode: address is i16, let the default selection handle it. if (Ptr.getValueType() != MVT::i32) return SDValue(); @@ -823,8 +915,14 @@ SDValue W65816TargetLowering::LowerLoad(SDValue Op, EVT MemVT = Ld->getMemoryVT(); SDVTList VTs = DAG.getVTList(MVT::i16, MVT::Other); SDValue Ops[] = { Chain, Ptr }; + // memVT for the LD_PTR memintrinsic must match MMO's size (i8 vs + // i16) — getMemIntrinsicNode asserts memvt.getStoreSize() <= MMO + // size. Pre-fix this branch hardcoded i16 because only i32-result + // LOADs reached here. Now that LOAD i16/i8 are Custom too (so the + // global-fold can fire), byte loads via i32 ptrs land here with + // MemVT=i8 and a 1-byte MMO. SDValue LdNode = DAG.getMemIntrinsicNode(W65816ISD::LD_PTR, DL, VTs, Ops, - MVT::i16, Ld->getMemOperand()); + MemVT, Ld->getMemOperand()); SDValue Val = LdNode; // Byte memory access: mask the high byte for zextload, leave anyext. if (MemVT == MVT::i8) { @@ -1109,6 +1207,65 @@ SDValue W65816TargetLowering::LowerStore(SDValue Op, return StHi; } + // Optimization: if the store goes through a global address (raw + // GlobalAddress/ExternalSymbol, or a Wide32 built from Wrapper + + // WrapperBank of the same symbol), lower to a plain i16/i8 store + // through a single Wrapper@symbol so the tablegen pattern + // (store Acc8/Acc16, (W65816Wrapper tglobaladdr:$g)) + // selects STA8abs / STAabs (DBR-relative). Our globals live in + // the load segment that crt0 pins to DBR, so abs-16 reaches them. + // This avoids the 14-byte [dp],y indirect-long path AND re-enables + // the STZ peephole that the indirect path defeats. + SDValue FoldedLo; + if (auto *GA = dyn_cast(Ptr)) { + FoldedLo = DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, + DAG.getTargetGlobalAddress(GA->getGlobal(), DL, MVT::i16, + GA->getOffset())); + } else if (auto *ES = dyn_cast(Ptr)) { + FoldedLo = DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, + DAG.getTargetExternalSymbol(ES->getSymbol(), MVT::i16)); + } else if (Ptr.getNode()->isMachineOpcode() && + Ptr.getMachineOpcode() == TargetOpcode::REG_SEQUENCE) { + SDValue PLo, PHi; + for (unsigned i = 1; i + 1 < Ptr.getNumOperands(); i += 2) { + if (auto *CIdx = dyn_cast(Ptr.getOperand(i + 1))) { + if (CIdx->getZExtValue() == llvm::sub_lo) PLo = Ptr.getOperand(i); + else if (CIdx->getZExtValue() == llvm::sub_hi) PHi = Ptr.getOperand(i); + } + } + if (PLo && PHi && + PLo.getOpcode() == W65816ISD::Wrapper && + PHi.getOpcode() == W65816ISD::WrapperBank) { + SDValue WLo = PLo.getOperand(0); + SDValue WHi = PHi.getOperand(0); + auto *GLo = dyn_cast(WLo); + auto *GHi = dyn_cast(WHi); + auto *ELo = dyn_cast(WLo); + auto *EHi = dyn_cast(WHi); + bool SameGlobal = (GLo && GHi && GLo->getGlobal() == GHi->getGlobal() && + GLo->getOffset() == GHi->getOffset()); + bool SameExtern = (ELo && EHi && + StringRef(ELo->getSymbol()) == EHi->getSymbol()); + if (SameGlobal || SameExtern) + FoldedLo = PLo; + } + } + if (FoldedLo) { + // Preserve memVT — original may be a truncating store (e.g., + // i16 value into i8 memory). getStore picks memVT from Val's + // type, which can mismatch the original MachineMemOperand size. + if (MemVT == Val.getValueType()) { + return DAG.getStore(Chain, DL, Val, FoldedLo, + St->getPointerInfo(), St->getAlign(), + St->getMemOperand()->getFlags()); + } + return DAG.getTruncStore(Chain, DL, Val, FoldedLo, MemVT, + St->getMemOperand()); + } + + // No i32 ptr → nothing for us to do; let the default ISD::STORE + // path handle it. (Also avoids accidentally wrapping an i16 ptr + // store into ST_PTR below, whose ptr operand must be i32.) if (Ptr.getValueType() != MVT::i32) return SDValue(); @@ -1418,20 +1575,20 @@ SDValue W65816TargetLowering::LowerShift(SDValue Op, SelectionDAG &DAG) const { bool IsI32 = Op.getValueType() == MVT::i32; - // Inline i32 shift-by-small-constant. The libcall path is ~300+ cyc; - // unrolling N i16 ops (N <= 4) plus carry propagation runs in ~20-80 - // cyc. popcount, BigInt-style code, and CRC routines all hit this. - // Larger N falls through to the libcall — the unrolled cost grows - // linearly while the libcall is constant. Cutoff chosen empirically: - // N=4 expands to ~32 i16 ops, comparable to the libcall's overhead. - // SRA needs an arithmetic-fill shift on the high half (i16 SRA by 1 - // is tablegen-supported); the low half is filled from the high's - // departing bit just like SRL. + // Inline i32 shift-by-small-constant. The libcall path is ~140 cyc + // (post-tightening); unrolling N i16 ops plus carry propagation runs + // in ~30-90 cyc. popcount, djb2-style hashes, BigInt-style code, and + // CRC routines all hit this. Larger N falls through to the libcall — + // the unrolled cost grows linearly while the libcall is constant. + // Cutoff at N=5 chosen empirically: djb2's `(h << 5) + h` is the + // common one that benefits. SRA needs an arithmetic-fill shift on + // the high half (i16 SRA by 1 is tablegen-supported); the low half is + // filled from the high's departing bit just like SRL. if (IsI32) { if (auto *C = dyn_cast(Amount)) { uint64_t N = C->getZExtValue(); unsigned Op0 = Op.getOpcode(); - if (N >= 1 && N <= 4 && + if (N >= 1 && N <= 5 && (Op0 == ISD::SHL || Op0 == ISD::SRL || Op0 == ISD::SRA)) { SDLoc DL(Op); SDValue X = Op.getOperand(0); @@ -1505,14 +1662,16 @@ SDValue W65816TargetLowering::LowerGlobalAddress(SDValue Op, EVT PtrVT = Op.getValueType(); // i16 in ptr16 mode, i32 in ptr32 mode if (PtrVT == MVT::i32) { // i32 GlobalAddress: build Wide32 from (i16 offset, i16 bank). - // The i16 offset goes through W65816ISD::Wrapper as before — IMM16 - // cRELOC rewrites the offset under Loader. The bank half is set to - // 0 here, but crt0Gsos's $BE-init or a future per-pointer bank - // relocation can be threaded through. TODO: wire bank cRELOC. + // Lo = Wrapper(target) → fixup_16 (offset bytes) + // Hi = WrapperBank(target) → fixup_bank16 (bank byte + 0 pad) + // The linker / OMF Loader patch both halves so the runtime + // pointer reflects the actual placed segment, not the link-time + // text-base. Resolves the long-standing "ldx #0 is hardcoded" + // bug that broke toolbox-call pointer args. SDValue OffTgt = DAG.getTargetGlobalAddress(GA->getGlobal(), DL, MVT::i16, GA->getOffset()); SDValue Lo = DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, OffTgt); - SDValue Hi = DAG.getConstant(0, DL, MVT::i16); + SDValue Hi = DAG.getNode(W65816ISD::WrapperBank, DL, MVT::i16, OffTgt); return buildWide32(DAG, DL, Lo, Hi); } SDValue Tgt = DAG.getTargetGlobalAddress(GA->getGlobal(), DL, PtrVT, @@ -1528,7 +1687,7 @@ SDValue W65816TargetLowering::LowerExternalSymbol(SDValue Op, if (PtrVT == MVT::i32) { SDValue OffTgt = DAG.getTargetExternalSymbol(ES->getSymbol(), MVT::i16); SDValue Lo = DAG.getNode(W65816ISD::Wrapper, DL, MVT::i16, OffTgt); - SDValue Hi = DAG.getConstant(0, DL, MVT::i16); + SDValue Hi = DAG.getNode(W65816ISD::WrapperBank, DL, MVT::i16, OffTgt); return buildWide32(DAG, DL, Lo, Hi); } SDValue Tgt = DAG.getTargetExternalSymbol(ES->getSymbol(), PtrVT); @@ -2134,6 +2293,60 @@ W65816TargetLowering::PerformDAGCombine(SDNode *N, return DAG.getTruncStore(St->getChain(), DL, St->getValue(), I16Ptr, MemVT, St->getMemOperand()); } + // Global+i16-idx fast path for STORES (companion to the LOAD + // branch below). Ptr = REG_SEQUENCE(ADDC(Wrapper, idx), ADDE(...)). + // Rewrite to CopyToReg($a, val) + CopyToReg($x, idx) + STA_AbsX. + if ((MemVT == MVT::i16 || MemVT == MVT::i8) && + Ptr.getNode() && Ptr.isMachineOpcode() && + Ptr.getMachineOpcode() == TargetOpcode::REG_SEQUENCE) { + SDValue Lo = lookThroughRegSeq(Ptr, llvm::sub_lo); + if (Lo && Lo.getOpcode() == ISD::ADDC) { + auto lookThroughExtractSubLo = [](SDValue V) -> SDValue { + if (V.getNode() && V.isMachineOpcode() && + V.getMachineOpcode() == TargetOpcode::EXTRACT_SUBREG) { + SDValue Src = V.getOperand(0); + if (Src.isMachineOpcode() && + Src.getMachineOpcode() == TargetOpcode::REG_SEQUENCE) { + if (SDValue X = lookThroughRegSeq(Src, llvm::sub_lo)) + return X; + } + } + return V; + }; + SDValue A = lookThroughExtractSubLo(Lo.getOperand(0)); + SDValue B = lookThroughExtractSubLo(Lo.getOperand(1)); + auto isWrapperGlobal = [](SDValue V) { + if (V.getOpcode() != W65816ISD::Wrapper) return false; + unsigned Op = V.getOperand(0).getOpcode(); + return Op == ISD::TargetGlobalAddress || + Op == ISD::TargetExternalSymbol; + }; + SDValue Sym, Idx; + if (isWrapperGlobal(A)) { Sym = A.getOperand(0); Idx = B; } + else if (isWrapperGlobal(B)) { Sym = B.getOperand(0); Idx = A; } + if (Sym && Idx.getValueType() == MVT::i16) { + SelectionDAG &DAG = DCI.DAG; + SDLoc DL(N); + SDValue Chain = St->getChain(); + SDValue Val = St->getValue(); + // STA8absX copies $a register at i16 width (M=0); the SEP + // wraps narrow it. Promote i8 stored value to i16. + if (Val.getValueType() == MVT::i8) + Val = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i16, Val); + SDValue Glue; + SDValue C1 = DAG.getCopyToReg(Chain, DL, W65816::X, Idx, Glue); + Glue = C1.getValue(1); + SDValue C2 = DAG.getCopyToReg(C1, DL, W65816::A, Val, Glue); + Glue = C2.getValue(1); + SDVTList StaVTs = DAG.getVTList(MVT::Other, MVT::Glue); + unsigned Opc = (MemVT == MVT::i8) ? W65816::STA8absX + : W65816::STA_AbsX; + SDNode *Sta = DAG.getMachineNode(Opc, DL, StaVTs, + {Sym, C2, Glue}); + return SDValue(Sta, 0); + } + } + } } // i8 const-addr → STA8long (timm pattern); i16 const-addr → // STAabs (timm pattern, DBR-relative). Wrap as TargetConstant so @@ -2167,6 +2380,84 @@ W65816TargetLowering::PerformDAGCombine(SDNode *N, Ld->getChain(), I16Ptr, MemVT, Ld->getMemOperand()); } + // Global+i16-idx fast path: Ptr is REG_SEQUENCE produced by + // LowerI32Bin from `(add (Wrapper sym) (zext i16 idx))`. + // sub_lo = ADDC(Wrapper, idx) — operands are TargetExtractSubreg + // wrapping each side's Wide32 + // sub_hi = ADDE(0, 0, carry) — ignored (idx fits in 16 bits, + // so any carry stays in bank) + // Rewrite the LOAD to a CopyToReg($x, idx) + LDA_AbsX(sym) + // sequence. Saves ~45 bytes / ~70 cyc vs the 24-bit [dp],Y deref. + // Correct under the data-bank invariant (DBR = global's bank). + if ((MemVT == MVT::i16 || MemVT == MVT::i8) && + Ptr.getNode() && Ptr.isMachineOpcode() && + Ptr.getMachineOpcode() == TargetOpcode::REG_SEQUENCE) { + SDValue Lo = lookThroughRegSeq(Ptr, llvm::sub_lo); + if (Lo && Lo.getOpcode() == ISD::ADDC) { + auto lookThroughExtractSubLo = [](SDValue V) -> SDValue { + if (V.getNode() && V.isMachineOpcode() && + V.getMachineOpcode() == TargetOpcode::EXTRACT_SUBREG) { + SDValue Src = V.getOperand(0); + if (Src.isMachineOpcode() && + Src.getMachineOpcode() == TargetOpcode::REG_SEQUENCE) { + if (SDValue X = lookThroughRegSeq(Src, llvm::sub_lo)) + return X; + } + } + return V; + }; + SDValue A = lookThroughExtractSubLo(Lo.getOperand(0)); + SDValue B = lookThroughExtractSubLo(Lo.getOperand(1)); + auto isWrapperGlobal = [](SDValue V) { + if (V.getOpcode() != W65816ISD::Wrapper) return false; + unsigned Op = V.getOperand(0).getOpcode(); + return Op == ISD::TargetGlobalAddress || + Op == ISD::TargetExternalSymbol; + }; + SDValue Sym, Idx; + if (isWrapperGlobal(A)) { Sym = A.getOperand(0); Idx = B; } + else if (isWrapperGlobal(B)) { Sym = B.getOperand(0); Idx = A; } + if (Sym && Idx.getValueType() == MVT::i16) { + SelectionDAG &DAG = DCI.DAG; + SDLoc DL(N); + SDValue Chain = Ld->getChain(); + SDValue Glue; + SDValue NewChain = DAG.getCopyToReg(Chain, DL, W65816::X, Idx, + Glue); + Glue = NewChain.getValue(1); + SDVTList LdaVTs = DAG.getVTList(MVT::Other, MVT::Glue); + unsigned Opc = (MemVT == MVT::i8) ? W65816::LDA8absX + : W65816::LDA_AbsX; + SDNode *Lda = DAG.getMachineNode(Opc, DL, LdaVTs, + {Sym, NewChain, Glue}); + SDValue LdaChain = SDValue(Lda, 0); + SDValue LdaGlue = SDValue(Lda, 1); + // Read A as the original LOAD's result VT directly. For + // i8 LOAD with i8 VT: read i8. For i8 LOAD with i16 VT + // (zext/sext): read i16 (high byte is whatever was in $a + // before — wrong for zext, fine for sext, depends on the + // M=8 LDA behavior). M=8 LDA only writes the low byte of + // $a, leaving the high byte intact. Safe wrt liveness + // because we're reading $a immediately after SEP/REP + // around the load, but the high byte is now whatever + // pre-LDA value $a held — for zext we must mask it. + SDValue Val = DAG.getCopyFromReg(LdaChain, DL, W65816::A, + VT, LdaGlue); + SDValue Chain2 = Val.getValue(1); + if (MemVT == MVT::i8 && VT == MVT::i16) { + if (Ld->getExtensionType() == ISD::ZEXTLOAD) { + Val = DAG.getNode(ISD::AND, DL, MVT::i16, Val, + DAG.getConstant(0xFF, DL, MVT::i16)); + } else if (Ld->getExtensionType() == ISD::SEXTLOAD) { + Val = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, MVT::i16, + Val, DAG.getValueType(MVT::i8)); + } + // EXTLOAD: high byte don't-care, leave alone. + } + return DAG.getMergeValues({Val, Chain2}, DL); + } + } + } } // Only the i8 const-addr path has dedicated tablegen patterns // (LDA8long); skip i16 const-addr loads (no LDAabs imm pattern) diff --git a/src/llvm/lib/Target/W65816/W65816InstrFormats.td b/src/llvm/lib/Target/W65816/W65816InstrFormats.td index cca71c5..cbc7fd9 100644 --- a/src/llvm/lib/Target/W65816/W65816InstrFormats.td +++ b/src/llvm/lib/Target/W65816/W65816InstrFormats.td @@ -99,6 +99,18 @@ def imm16 : Operand { let DecoderMethod = "decodeImm16"; } +// Like imm16, but the encoder emits a fixup_bank16 instead of fixup_16 +// so the linker / OMF Loader patches the operand with (bankByte, 0) of +// the resolved symbol. Used for the high half of `&symbol` 32-bit +// pointer constants — see LDA_Imm16_Bank below. +def imm16_bank : Operand { + let ParserMatchClass = W65816ImmOp<"Imm16">; + let OperandType = "OPERAND_IMMEDIATE"; + let Type = i16; + let EncoderMethod = "encodeImm16Bank"; + let DecoderMethod = "decodeImm16"; +} + def addrDP : Operand { let ParserMatchClass = W65816AddrOp<"AddrDP">; let OperandType = "OPERAND_MEMORY"; @@ -183,6 +195,21 @@ class InstImm16 op, string mnem> let Inst{23-8} = imm; } +// Parallel to InstImm16 but the operand uses the imm16_bank class so +// the encoder attaches a fixup_bank16. Marked isCodeGenOnly so the +// asm matcher never picks it (hand-written .s can't currently express +// a "bank-of-symbol" reference; bring that in via syntax like +// `lda #^foo` later if needed). +class InstImm16Bank op, string mnem> + : W65816Inst<(outs), (ins imm16_bank:$imm), !strconcat(mnem, "\t#$imm")> { + let Size = 3; + let isCodeGenOnly = 1; + bits<16> imm; + bits<24> Inst; + let Inst{7-0} = op; + let Inst{23-8} = imm; +} + class InstDP op, string mnem> : W65816Inst<(outs), (ins addrDP:$addr), !strconcat(mnem, "\t$addr")> { let Size = 2; @@ -267,9 +294,15 @@ class InstDPY op, string mnem> // `(dp)` reads/writes through the pointer at DP+offset. 0x92/0xb2 // `(dp), y` same, then adds Y to form the data address. 0x91/0xb1 // `(dp, x)` adds X to dp first, then dereferences. 0x81/0xa1 +// +// `${addr}` (with curly braces) is the tablegen-recognized form of +// an operand placeholder; with bare `$addr ` you need a trailing +// space to delimit the placeholder from `)` / `]`, which then leaks +// into the printed output as `(0x42 )`. The curly form delimits +// cleanly and round-trips without the cosmetic space. class InstDPInd op, string mnem> : W65816Inst<(outs), (ins addrDP:$addr), - !strconcat(mnem, "\t($addr )")> { + !strconcat(mnem, "\t(${addr})")> { let Size = 2; bits<8> addr; bits<16> Inst; @@ -279,7 +312,7 @@ class InstDPInd op, string mnem> class InstDPIndY op, string mnem> : W65816Inst<(outs), (ins addrDP:$addr), - !strconcat(mnem, "\t($addr ), y")> { + !strconcat(mnem, "\t(${addr}), y")> { let Size = 2; bits<8> addr; bits<16> Inst; @@ -289,7 +322,7 @@ class InstDPIndY op, string mnem> class InstDPIndX op, string mnem> : W65816Inst<(outs), (ins addrDP:$addr), - !strconcat(mnem, "\t($addr , x)")> { + !strconcat(mnem, "\t(${addr}, x)")> { let Size = 2; bits<8> addr; bits<16> Inst; @@ -303,7 +336,35 @@ class InstDPIndX op, string mnem> // through a function-pointer slot. class InstAbsInd op, string mnem> : W65816Inst<(outs), (ins addrAbs:$addr), - !strconcat(mnem, "\t($addr )")> { + !strconcat(mnem, "\t(${addr})")> { + let Size = 3; + bits<16> addr; + bits<24> Inst; + let Inst{7-0} = op; + let Inst{23-8} = addr; +} + +// Absolute indexed-indirect-X: `JMP (addr, X)` (opcode 0x7C). Adds X +// to addr first, then reads the 16-bit pointer at that location and +// jumps there. Useful for jump tables when the base address is known +// at assembly time. +class InstAbsIndX op, string mnem> + : W65816Inst<(outs), (ins addrAbs:$addr), + !strconcat(mnem, "\t(${addr}, x)")> { + let Size = 3; + bits<16> addr; + bits<24> Inst; + let Inst{7-0} = op; + let Inst{23-8} = addr; +} + +// Absolute long-indirect: `JMP [addr]` (opcode 0xDC). Reads a 24-bit +// pointer from absolute address `addr` and jumps to that full bank+ +// offset address. Square brackets distinguish from the 16-bit +// indirect form. +class InstAbsIndLong op, string mnem> + : W65816Inst<(outs), (ins addrAbs:$addr), + !strconcat(mnem, "\t[${addr}]")> { let Size = 3; bits<16> addr; bits<24> Inst; @@ -317,7 +378,7 @@ class InstAbsInd op, string mnem> // syntax — round parens are reserved for 16-bit indirection. class InstDPIndLong op, string mnem> : W65816Inst<(outs), (ins addrDP:$addr), - !strconcat(mnem, "\t[$addr ]")> { + !strconcat(mnem, "\t[${addr}]")> { let Size = 2; bits<8> addr; bits<16> Inst; @@ -327,7 +388,7 @@ class InstDPIndLong op, string mnem> class InstDPIndLongY op, string mnem> : W65816Inst<(outs), (ins addrDP:$addr), - !strconcat(mnem, "\t[$addr ], y")> { + !strconcat(mnem, "\t[${addr}], y")> { let Size = 2; bits<8> addr; bits<16> Inst; diff --git a/src/llvm/lib/Target/W65816/W65816InstrInfo.td b/src/llvm/lib/Target/W65816/W65816InstrInfo.td index f678d8a..4416a1b 100644 --- a/src/llvm/lib/Target/W65816/W65816InstrInfo.td +++ b/src/llvm/lib/Target/W65816/W65816InstrInfo.td @@ -23,6 +23,13 @@ def SDT_W65816CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i16>, def SDT_W65816CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i16>, SDTCisVT<1, i16>]>; def SDT_W65816Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; +// Wrapper for the BANK byte of a 24-bit address (high half of a 32-bit +// pointer constant). Result is i16: low byte = bank, high byte = 0 +// pad. The MC encoder emits a fixup_bank16 so the linker / OMF Loader +// fills in the actual bank at load time, tracking whatever the GS/OS +// Loader chose for our segment. +def SDT_W65816WrapperBank : SDTypeProfile<1, 1, [SDTCisVT<0, i16>, + SDTCisVT<1, i16>]>; def SDT_W65816Cmp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>, SDTCisInt<0>]>; // (CMP allows both i16 and i8 operands.) @@ -47,6 +54,7 @@ def W65816callseq_end : [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; def W65816Wrapper : SDNode<"W65816ISD::Wrapper", SDT_W65816Wrapper>; +def W65816WrapperBank : SDNode<"W65816ISD::WrapperBank", SDT_W65816WrapperBank>; // Comparison: produces a Glue value (carrying processor flags). def W65816cmp : SDNode<"W65816ISD::CMP", SDT_W65816Cmp, [SDNPOutGlue]>; @@ -243,6 +251,20 @@ def : Pat<(i16 (W65816Wrapper tglobaladdr:$g)), def : Pat<(i16 (W65816Wrapper texternalsym:$s)), (LDAi16imm texternalsym:$s)>; +// Materialise the BANK byte of a global / external symbol into A. +// Same encoding as LDAi16imm (a plain `lda #imm`), but the AsmPrinter +// expansion attaches a fixup_bank16 to the immediate so the linker +// patches it with (bank, 0) of the resolved symbol — and OMF cRELOC +// updates it at Loader time to the actual placed bank. +let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isReMaterializable = 1 in +def LDAi16imm_bank : W65816Pseudo<(outs Acc16:$dst), (ins i16imm:$imm), + "# LDAi16imm_bank $dst, $imm", []>; + +def : Pat<(i16 (W65816WrapperBank tglobaladdr:$g)), + (LDAi16imm_bank tglobaladdr:$g)>; +def : Pat<(i16 (W65816WrapperBank texternalsym:$s)), + (LDAi16imm_bank texternalsym:$s)>; + // 8-bit add/sub of an immediate. let Constraints = "$src = $dst", hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { @@ -279,6 +301,16 @@ def LDA8abs : W65816Pseudo<(outs Acc8:$dst), (ins i32imm:$addr), // section (must appear after ANDi16imm is defined). def LDA8long : W65816Pseudo<(outs Acc8:$dst), (ins i32imm:$addr), "# LDA8long $dst, $addr", []>; +// LDA8absX: i8 indexed global load. Sibling of LDA_AbsX for the +// i16 case; produced by the PerformDAGCombine i8 path when a global +// array's byte-element access has been recovered into (load (add +// Wrapper, i16-idx)) form. AsmPrinter expands to: +// SEP #0x20 ; LDA , X ; REP #0x20 +// idx is in $x at entry (set up by CopyToReg); the loaded value +// arrives in $a implicitly (matches LDA_AbsX's shape). +let Defs = [A], Uses = [X] in +def LDA8absX : W65816Pseudo<(outs), (ins i32imm:$addr), + "# LDA8absX $addr", []>; } let mayStore = 1, hasSideEffects = 0, mayLoad = 0 in { def STA8abs : W65816Pseudo<(outs), (ins Acc8:$src, i32imm:$addr), @@ -290,6 +322,12 @@ def STA8abs : W65816Pseudo<(outs), (ins Acc8:$src, i32imm:$addr), // physical address. See the (store Acc8, (iPTR imm)) pattern. def STA8long : W65816Pseudo<(outs), (ins Acc8:$src, i32imm:$addr), "# STA8long $src, $addr", []>; +// STA8absX: i8 indexed global store (sibling of STA_AbsX for i16). +// AsmPrinter emits SEP/REP wrap around STA , X. +// $a holds the byte, $x holds the index. +let Uses = [A, X] in +def STA8absX : W65816Pseudo<(outs), (ins i32imm:$addr), + "# STA8absX $addr", []>; } def : Pat<(i8 (load (W65816Wrapper tglobaladdr:$g))), (LDA8abs tglobaladdr:$g)>; @@ -346,21 +384,15 @@ def : Pat<(store Acc16:$src, (W65816Wrapper tglobaladdr:$g)), (STAabs Acc16:$src, tglobaladdr:$g)>; def : Pat<(store Acc16:$src, (W65816Wrapper texternalsym:$s)), (STAabs Acc16:$src, texternalsym:$s)>; -// Store via a constant-int address (`*(volatile uint16 *)0x5000 = v`). -// Lowers to STAabs (0x8D, DBR-relative) — DELIBERATELY asymmetric with the -// i8 case (STA8long, bank-explicit). Rationale: most 65816 MMIO is i8 -// (e.g. `*(uint8*)0xC035`) where users expect bank=0 always. Const-int -// i16 is mostly used as a DBR-relative idiom in test code that switches -// DBR and verifies a write lands in the new bank. Switching i16 to -// bank-explicit broke 10+ existing tests with no real-world i16 MMIO -// use case to justify it. Users who need bank-explicit i16 should -// declare a global or split into two i8 stores. +// Const-int address stores route through STAabs; AsmPrinter detects +// at emit time whether the constant has a non-zero bank byte and +// emits STA_Long (4 bytes, bank-explicit) for those, STA_Abs (3 +// bytes, DBR-relative) for the bank-0 ones. Splitting the pattern +// in TableGen via ImmLeaf is brittle around `imm` vs `timm` (ptr32 +// codegen alternates between ConstantSDNode and TargetConstantSDNode); +// the AsmPrinter dispatch is simpler and uniform. def : Pat<(store Acc16:$src, (iPTR imm:$addr)), (STAabs Acc16:$src, (i32 imm:$addr))>; -// Under ptr32 the i16/i32 const-addr stores emerge with TargetConstant -// pointers (the PerformDAGCombine on STORE rewrites the ConstantSDNode -// into a TargetConstant to bypass LowerI32Constant's REG_SEQUENCE -// expansion). Match `timm` so STAabs fires. def : Pat<(store Acc16:$src, (iPTR timm:$addr)), (STAabs Acc16:$src, (i32 timm:$addr))>; @@ -1309,6 +1341,15 @@ def XBA : InstImplied<0xEB, "xba"> { let mayLoad = 0; let mayStore = 0; } def WAI : InstImplied<0xCB, "wai">; def STP : InstImplied<0xDB, "stp">; +// BRK / COP — software interrupts. Both are 2-byte instructions +// (opcode + signature byte). The CPU pushes the return address + +// status flags and vectors through the BRK/COP handler at +// $00FFE6/$00FFE4 (native mode). Signature byte is available to +// the handler via the pushed PC. We never select these from IR; +// they exist purely so hand-written runtime/inline asm can use them. +def BRK : InstImm8<0x00, "brk">; +def COP : InstImm8<0x02, "cop">; + // WDM (William D Mensch) — reserved 2-byte NOP-equivalent. Useful as // a debugger / emulator hook: MAME's apple2gs CPU traps on WDM and a // Lua plugin can dispatch on the operand byte. CPU-side, it acts as @@ -1337,12 +1378,17 @@ def PEI_DP : InstDP<0xD4, "pei">; // explicitly once we have 8-bit patterns. def LDA_Imm8 : InstImm8<0xA9, "lda"> { let MHigh = 1; let DecoderNamespace = "W65816MHigh"; let isCodeGenOnly = 1; let Defs = [A]; } def LDA_Imm16 : InstImm16<0xA9, "lda"> { let MLow = 1; let Defs = [A]; } +// Same opcode/encoding as LDA_Imm16, but the operand emits a fixup_bank16 +// so the linker / OMF Loader fills in (bankByte, 0) of the symbol. +// Used by the LDAi16imm_bank pseudo for materializing the high half of +// a 32-bit `&symbol` pointer constant. +def LDA_Imm16_Bank : InstImm16Bank<0xA9, "lda"> { let MLow = 1; let Defs = [A]; } def LDA_DP : InstDP<0xA5, "lda">; def LDA_Abs : InstAbs<0xAD, "lda">; def LDA_Long : InstAbsLong<0xAF, "lda">; -def LDA_DPX : InstDPX<0xB5, "lda">; -def LDA_AbsX : InstAbsX<0xBD, "lda">; -def LDA_AbsY : InstAbsY<0xB9, "lda">; +def LDA_DPX : InstDPX<0xB5, "lda"> { let Defs = [A]; let Uses = [X]; } +def LDA_AbsX : InstAbsX<0xBD, "lda"> { let Defs = [A]; let Uses = [X]; } +def LDA_AbsY : InstAbsY<0xB9, "lda"> { let Defs = [A]; let Uses = [Y]; } def LDA_DPInd : InstDPInd <0xB2, "lda">; def LDA_DPIndY : InstDPIndY<0xB1, "lda">; def LDA_DPIndX : InstDPIndX<0xA1, "lda">; @@ -1358,9 +1404,9 @@ def LDA_LongX : InstAbsLongX<0xBF, "lda">; def STA_DP : InstDP<0x85, "sta">; def STA_Abs : InstAbs<0x8D, "sta">; def STA_Long : InstAbsLong<0x8F, "sta">; -def STA_DPX : InstDPX<0x95, "sta">; -def STA_AbsX : InstAbsX<0x9D, "sta">; -def STA_AbsY : InstAbsY<0x99, "sta">; +def STA_DPX : InstDPX<0x95, "sta"> { let Uses = [A, X]; } +def STA_AbsX : InstAbsX<0x9D, "sta"> { let Uses = [A, X]; } +def STA_AbsY : InstAbsY<0x99, "sta"> { let Uses = [A, Y]; } def STA_DPInd : InstDPInd <0x92, "sta">; def STA_DPIndY : InstDPIndY<0x91, "sta">; def STA_DPIndX : InstDPIndX<0x81, "sta">; @@ -1412,6 +1458,13 @@ def ADC_Abs : InstAbs<0x6D, "adc">; def ADC_DPX : InstDPX<0x75, "adc">; def ADC_AbsX : InstAbsX<0x7D, "adc">; def ADC_AbsY : InstAbsY<0x79, "adc">; +def ADC_Long : InstAbsLong<0x6F, "adc">; +def ADC_LongX : InstAbsLongX<0x7F, "adc">; +def ADC_DPInd : InstDPInd<0x72, "adc">; +def ADC_DPIndY : InstDPIndY<0x71, "adc">; +def ADC_DPIndX : InstDPIndX<0x61, "adc">; +def ADC_DPIndLong : InstDPIndLong<0x67, "adc">; +def ADC_DPIndLongY : InstDPIndLongY<0x77, "adc">; //------------------------------------------------------------------------- SBC def SBC_Imm8 : InstImm8<0xE9, "sbc"> { let MHigh = 1; let DecoderNamespace = "W65816MHigh"; let isCodeGenOnly = 1; } @@ -1421,6 +1474,13 @@ def SBC_Abs : InstAbs<0xED, "sbc">; def SBC_DPX : InstDPX<0xF5, "sbc">; def SBC_AbsX : InstAbsX<0xFD, "sbc">; def SBC_AbsY : InstAbsY<0xF9, "sbc">; +def SBC_Long : InstAbsLong<0xEF, "sbc">; +def SBC_LongX : InstAbsLongX<0xFF, "sbc">; +def SBC_DPInd : InstDPInd<0xF2, "sbc">; +def SBC_DPIndY : InstDPIndY<0xF1, "sbc">; +def SBC_DPIndX : InstDPIndX<0xE1, "sbc">; +def SBC_DPIndLong : InstDPIndLong<0xE7, "sbc">; +def SBC_DPIndLongY : InstDPIndLongY<0xF7, "sbc">; //------------------------------------------------------------------------- CMP def CMP_Imm8 : InstImm8<0xC9, "cmp"> { let MHigh = 1; let mayLoad=0; let mayStore=0; let DecoderNamespace = "W65816MHigh"; let isCodeGenOnly = 1; } @@ -1430,6 +1490,13 @@ def CMP_Abs : InstAbs<0xCD, "cmp"> { let mayStore = 0; } def CMP_DPX : InstDPX<0xD5, "cmp"> { let mayStore = 0; } def CMP_AbsX : InstAbsX<0xDD, "cmp"> { let mayStore = 0; } def CMP_AbsY : InstAbsY<0xD9, "cmp"> { let mayStore = 0; } +def CMP_Long : InstAbsLong<0xCF, "cmp"> { let mayStore = 0; } +def CMP_LongX : InstAbsLongX<0xDF, "cmp"> { let mayStore = 0; } +def CMP_DPInd : InstDPInd<0xD2, "cmp"> { let mayStore = 0; } +def CMP_DPIndY : InstDPIndY<0xD1, "cmp"> { let mayStore = 0; } +def CMP_DPIndX : InstDPIndX<0xC1, "cmp"> { let mayStore = 0; } +def CMP_DPIndLong : InstDPIndLong<0xC7, "cmp"> { let mayStore = 0; } +def CMP_DPIndLongY : InstDPIndLongY<0xD7, "cmp"> { let mayStore = 0; } //---------------------------------------------------------------- CPX/CPY def CPX_Imm8 : InstImm8<0xE0, "cpx"> { let XHigh = 1; let mayLoad=0; let mayStore=0; let DecoderNamespace = "W65816XHigh"; let isCodeGenOnly = 1; } @@ -1446,21 +1513,53 @@ def AND_Imm8 : InstImm8<0x29, "and"> { let MHigh = 1; let mayLoad=0; let maySt def AND_Imm16 : InstImm16<0x29, "and"> { let MLow = 1; let mayLoad=0; let mayStore=0; } def AND_DP : InstDP<0x25, "and"> { let mayStore = 0; } def AND_Abs : InstAbs<0x2D, "and"> { let mayStore = 0; } +def AND_DPX : InstDPX<0x35, "and"> { let mayStore = 0; } +def AND_AbsX : InstAbsX<0x3D, "and"> { let mayStore = 0; } +def AND_AbsY : InstAbsY<0x39, "and"> { let mayStore = 0; } +def AND_Long : InstAbsLong<0x2F, "and"> { let mayStore = 0; } +def AND_LongX : InstAbsLongX<0x3F, "and"> { let mayStore = 0; } +def AND_DPInd : InstDPInd<0x32, "and"> { let mayStore = 0; } +def AND_DPIndY : InstDPIndY<0x31, "and"> { let mayStore = 0; } +def AND_DPIndX : InstDPIndX<0x21, "and"> { let mayStore = 0; } +def AND_DPIndLong : InstDPIndLong<0x27, "and"> { let mayStore = 0; } +def AND_DPIndLongY : InstDPIndLongY<0x37, "and"> { let mayStore = 0; } def ORA_Imm8 : InstImm8<0x09, "ora"> { let MHigh = 1; let mayLoad=0; let mayStore=0; let DecoderNamespace = "W65816MHigh"; let isCodeGenOnly = 1; } def ORA_Imm16 : InstImm16<0x09, "ora"> { let MLow = 1; let mayLoad=0; let mayStore=0; } def ORA_DP : InstDP<0x05, "ora"> { let mayStore = 0; } def ORA_Abs : InstAbs<0x0D, "ora"> { let mayStore = 0; } +def ORA_DPX : InstDPX<0x15, "ora"> { let mayStore = 0; } +def ORA_AbsX : InstAbsX<0x1D, "ora"> { let mayStore = 0; } +def ORA_AbsY : InstAbsY<0x19, "ora"> { let mayStore = 0; } +def ORA_Long : InstAbsLong<0x0F, "ora"> { let mayStore = 0; } +def ORA_LongX : InstAbsLongX<0x1F, "ora"> { let mayStore = 0; } +def ORA_DPInd : InstDPInd<0x12, "ora"> { let mayStore = 0; } +def ORA_DPIndY : InstDPIndY<0x11, "ora"> { let mayStore = 0; } +def ORA_DPIndX : InstDPIndX<0x01, "ora"> { let mayStore = 0; } +def ORA_DPIndLong : InstDPIndLong<0x07, "ora"> { let mayStore = 0; } +def ORA_DPIndLongY : InstDPIndLongY<0x17, "ora"> { let mayStore = 0; } def EOR_Imm8 : InstImm8<0x49, "eor"> { let MHigh = 1; let mayLoad=0; let mayStore=0; let DecoderNamespace = "W65816MHigh"; let isCodeGenOnly = 1; } def EOR_Imm16 : InstImm16<0x49, "eor"> { let MLow = 1; let mayLoad=0; let mayStore=0; } def EOR_DP : InstDP<0x45, "eor"> { let mayStore = 0; } def EOR_Abs : InstAbs<0x4D, "eor"> { let mayStore = 0; } +def EOR_DPX : InstDPX<0x55, "eor"> { let mayStore = 0; } +def EOR_AbsX : InstAbsX<0x5D, "eor"> { let mayStore = 0; } +def EOR_AbsY : InstAbsY<0x59, "eor"> { let mayStore = 0; } +def EOR_Long : InstAbsLong<0x4F, "eor"> { let mayStore = 0; } +def EOR_LongX : InstAbsLongX<0x5F, "eor"> { let mayStore = 0; } +def EOR_DPInd : InstDPInd<0x52, "eor"> { let mayStore = 0; } +def EOR_DPIndY : InstDPIndY<0x51, "eor"> { let mayStore = 0; } +def EOR_DPIndX : InstDPIndX<0x41, "eor"> { let mayStore = 0; } +def EOR_DPIndLong : InstDPIndLong<0x47, "eor"> { let mayStore = 0; } +def EOR_DPIndLongY : InstDPIndLongY<0x57, "eor"> { let mayStore = 0; } def BIT_Imm8 : InstImm8<0x89, "bit"> { let MHigh = 1; let mayLoad=0; let mayStore=0; let DecoderNamespace = "W65816MHigh"; let isCodeGenOnly = 1; } def BIT_Imm16 : InstImm16<0x89, "bit"> { let MLow = 1; let mayLoad=0; let mayStore=0; } def BIT_DP : InstDP<0x24, "bit"> { let mayStore = 0; } def BIT_Abs : InstAbs<0x2C, "bit"> { let mayStore = 0; } +def BIT_DPX : InstDPX<0x34, "bit"> { let mayStore = 0; } +def BIT_AbsX : InstAbsX<0x3C, "bit"> { let mayStore = 0; } //---------------------------------------------------------------- INC/DEC def INA : InstImplied<0x1A, "inc a"> { let mayLoad = 0; let mayStore = 0; } @@ -1485,14 +1584,22 @@ def ASL_A : InstImplied<0x0A, "asl a"> { let mayLoad = 0; let mayStore = 0; def LSR_A : InstImplied<0x4A, "lsr a"> { let mayLoad = 0; let mayStore = 0; } def ROL_A : InstImplied<0x2A, "rol a"> { let mayLoad = 0; let mayStore = 0; } def ROR_A : InstImplied<0x6A, "ror a"> { let mayLoad = 0; let mayStore = 0; } -def ASL_DP : InstDP<0x06, "asl">; -def ASL_Abs : InstAbs<0x0E, "asl">; -def LSR_DP : InstDP<0x46, "lsr">; -def LSR_Abs : InstAbs<0x4E, "lsr">; -def ROL_DP : InstDP<0x26, "rol">; -def ROL_Abs : InstAbs<0x2E, "rol">; -def ROR_DP : InstDP<0x66, "ror">; -def ROR_Abs : InstAbs<0x6E, "ror">; +def ASL_DP : InstDP<0x06, "asl">; +def ASL_Abs : InstAbs<0x0E, "asl">; +def ASL_DPX : InstDPX<0x16, "asl">; +def ASL_AbsX : InstAbsX<0x1E, "asl">; +def LSR_DP : InstDP<0x46, "lsr">; +def LSR_Abs : InstAbs<0x4E, "lsr">; +def LSR_DPX : InstDPX<0x56, "lsr">; +def LSR_AbsX : InstAbsX<0x5E, "lsr">; +def ROL_DP : InstDP<0x26, "rol">; +def ROL_Abs : InstAbs<0x2E, "rol">; +def ROL_DPX : InstDPX<0x36, "rol">; +def ROL_AbsX : InstAbsX<0x3E, "rol">; +def ROR_DP : InstDP<0x66, "ror">; +def ROR_Abs : InstAbs<0x6E, "ror">; +def ROR_DPX : InstDPX<0x76, "ror">; +def ROR_AbsX : InstAbsX<0x7E, "ror">; //---------------------------------------------------------------- Transfers // Defs/Uses metadata is critical: without it, machine-cp doesn't see @@ -1552,9 +1659,11 @@ def BVC : InstPCRel8<0x50, "bvc">; let isBranch = 1, isTerminator = 1, isBarrier = 1, mayLoad = 0, mayStore = 0 in { def BRA : InstPCRel8<0x80, "bra">; def BRL : InstPCRel16<0x82, "brl">; -def JMP_Abs : InstAbs<0x4C, "jmp">; -def JMP_AbsInd : InstAbsInd<0x6C, "jmp">; -def JML_Long : InstAbsLong<0x5C, "jml">; +def JMP_Abs : InstAbs<0x4C, "jmp">; +def JMP_AbsInd : InstAbsInd<0x6C, "jmp">; +def JMP_AbsIndX : InstAbsIndX<0x7C, "jmp">; +def JMP_AbsIndLong : InstAbsIndLong<0xDC, "jmp">; +def JML_Long : InstAbsLong<0x5C, "jml">; } //---------------------------------------------------------------- Calls @@ -1609,6 +1718,12 @@ def EOR_StackRel : InstStackRel<0x43, "eor">; // Stack-relative indirect indexed-Y: deref a pointer spilled at S+off. def LDA_StackRelIndY : InstStackRelIndY<0xB3, "lda">; def STA_StackRelIndY : InstStackRelIndY<0x93, "sta">; +def ADC_StackRelIndY : InstStackRelIndY<0x73, "adc">; +def SBC_StackRelIndY : InstStackRelIndY<0xF3, "sbc">; +def CMP_StackRelIndY : InstStackRelIndY<0xD3, "cmp">; +def AND_StackRelIndY : InstStackRelIndY<0x33, "and">; +def ORA_StackRelIndY : InstStackRelIndY<0x13, "ora">; +def EOR_StackRelIndY : InstStackRelIndY<0x53, "eor">; // Pseudo: conditional-increment of the hi half of an i32 spilled to a // pair of stack-rel slots. Emitted by W65816I32IncFold when the diff --git a/src/llvm/lib/Target/W65816/W65816NarrowI32Mul.cpp b/src/llvm/lib/Target/W65816/W65816NarrowI32Mul.cpp index e4357fd..f2e1292 100644 --- a/src/llvm/lib/Target/W65816/W65816NarrowI32Mul.cpp +++ b/src/llvm/lib/Target/W65816/W65816NarrowI32Mul.cpp @@ -25,6 +25,7 @@ //===---------------------------------------------------------------------===// #include "W65816.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/InitializePasses.h" @@ -151,7 +152,7 @@ bool W65816NarrowI32Mul::runOnFunction(Function &F) { }; FunctionCallee Callee = getUmulhisi3(*M); - SmallVector MaybeDead; + SmallPtrSet MaybeDeadSet; for (BinaryOperator *BO : Worklist) { IRBuilder<> B(BO); Value *AOp = BO->getOperand(0); @@ -162,12 +163,13 @@ bool W65816NarrowI32Mul::runOnFunction(Function &F) { BO->replaceAllUsesWith(Call); BO->eraseFromParent(); // If the original operands were zext/sext nodes, they may now be - // dead. Add them to the cleanup worklist. - if (auto *I = dyn_cast(AOp)) MaybeDead.push_back(I); - if (auto *I = dyn_cast(BOp)) MaybeDead.push_back(I); + // dead. Add to a SET — `mul %x, %x` would push the same node + // twice, and the cleanup loop would then double-free. + if (auto *I = dyn_cast(AOp)) MaybeDeadSet.insert(I); + if (auto *I = dyn_cast(BOp)) MaybeDeadSet.insert(I); } // Cleanup: any extension that's now use-less can be deleted. - for (Instruction *I : MaybeDead) { + for (Instruction *I : MaybeDeadSet) { if (I->use_empty() && (isa(I) || isa(I) || isa(I))) { I->eraseFromParent(); diff --git a/src/llvm/lib/Target/W65816/W65816StackRelToImg.cpp b/src/llvm/lib/Target/W65816/W65816StackRelToImg.cpp index d78d6ed..e3a1633 100644 --- a/src/llvm/lib/Target/W65816/W65816StackRelToImg.cpp +++ b/src/llvm/lib/Target/W65816/W65816StackRelToImg.cpp @@ -139,14 +139,16 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { // be from FP not SP and the PHP-wrap +1 adjustment differs. if (MF.getFrameInfo().hasVarSizedObjects()) return false; - // 2. Bail if the function has any non-IMG-safe call. + // 2. Bail if the function has any non-IMG-safe call (would clobber + // our IMG0..7 promotions) or is recursive (same). Tried allowing + // IMG8..15 + ImgCalleeSave fallback for these cases (gained 12 + // inst on evalAt), but broke sprintf and fib due to subtle + // interactions with ImgCalleeSave's slot allocation. Reverted. StringRef SelfName = MF.getName(); for (MachineBasicBlock &MBB : MF) { for (MachineInstr &MI : MBB) { if (!MI.isCall()) continue; if (!isImgSafeCall(MI)) return false; - // Skip self-recursion too — caller-save semantics would lose - // values across the recursive call. for (const MachineOperand &MO : MI.operands()) { StringRef Name; if (MO.isGlobal()) Name = MO.getGlobal()->getName(); @@ -156,6 +158,7 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { } } } + uint8_t imgBase = 0xD0; // 3. Count stack-rel accesses per offset. CRITICAL: the stack // pointer shifts during the function due to PHP/PLP (+1 byte) and @@ -287,11 +290,11 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { if (AccessCount.empty()) return false; - // 3b. Scan for existing DP-immediate usage in $D0..$DE. Regalloc / - // backend may have already used these slots (via STX_DP / STA_DP / - // LDA_DP with imm in 0xD0..0xDE) for spills or COPY-via-DP patterns. - // Don't double-use those slots. - auto dpImmInRange = [](const MachineInstr &MI) -> int { + // 3b. Scan for existing DP-immediate usage in [imgBase..imgBase+0xE]. + // Regalloc / backend may have already used these slots (via STX_DP / + // STA_DP / LDA_DP) for spills or COPY-via-DP patterns. Don't + // double-use those slots. + auto dpImmInRange = [&](const MachineInstr &MI) -> int { unsigned Op = MI.getOpcode(); switch (Op) { case W65816::LDA_DP: case W65816::STA_DP: @@ -302,8 +305,8 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { case W65816::STZ_DP: if (MI.getNumOperands() >= 1 && MI.getOperand(0).isImm()) { int64_t I = MI.getOperand(0).getImm(); - if (I >= 0xD0 && I <= 0xDE && (I & 1) == 0) - return static_cast((I - 0xD0) / 2); // 0..7 + if (I >= imgBase && I <= imgBase + 0xE && (I & 1) == 0) + return static_cast((I - imgBase) / 2); // 0..7 } break; } @@ -358,13 +361,14 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { // Skip already-used DP slots ($D0..$DE). while (NextDpIdx < 8 && UsedDp.test(NextDpIdx)) ++NextDpIdx; if (NextDpIdx >= 8) break; - OffsetToDp[Off] = static_cast(0xD0 + 2 * NextDpIdx); + OffsetToDp[Off] = static_cast(imgBase + 2 * NextDpIdx); ++NextDpIdx; } // 6. Rewrite each access site. (OffsetToDp may be empty — phases // 2-5 still run as standalone peepholes.) const W65816Subtarget &STI = MF.getSubtarget(); const W65816InstrInfo *TII = STI.getInstrInfo(); + const TargetRegisterInfo *TRI = STI.getRegisterInfo(); bool Changed = false; for (auto &P : OffsetToDp) { int64_t LogicalOff = P.first; @@ -767,20 +771,50 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { // ALSO: check A is dead after Stas.back(). Any A-use before A-redef // would see A=0 from the LDA; without the LDA, A is undef. bool aDead = false; - auto AScan = std::next(Stas.back()); - while (AScan != MBB.end()) { - if (AScan->isDebugInstr()) { ++AScan; continue; } - bool usesA = false, defsA = false; - for (const MachineOperand &MO : AScan->operands()) { - if (MO.isReg() && MO.getReg() == W65816::A) { - if (MO.isDef()) defsA = true; - else if (MO.isUse()) usesA = true; + // A-dead scan: walks forward from Stas.back(), looking for an + // A-redef before any A-use. If MBB ends without resolution, + // recurse one level into all successors — each successor must + // define A as its first A-touch. + auto scanAUntilEnd = [&](MachineBasicBlock::iterator Cur, + MachineBasicBlock &CurrMBB) -> int { + // Returns: 1=A dead (defined before any use), -1=A used, + // 0=unresolved (reached end of MBB). + while (Cur != CurrMBB.end()) { + if (Cur->isDebugInstr()) { ++Cur; continue; } + bool usesA = false, defsA = false; + for (const MachineOperand &MO : Cur->operands()) { + if (MO.isReg() && MO.getReg() == W65816::A) { + // isUse and isDef can BOTH be true on tied-def operands + // (the input side of an in-place modify like ASLA16 has + // isUse=true on the tied operand AND its def-mate + // produces a separate isDef operand). Check both flags + // independently — a tied-def instruction USES A before + // it DEFs A, so we must consider it a use. + if (MO.isUse()) usesA = true; + if (MO.isDef()) defsA = true; + } } + if (Cur->isCall()) defsA = true; // caller-save + // Use BEFORE def matters: if A is read by this instruction + // (even as part of a tied-def chain), the prior LDA #K's + // value is consumed and we can't drop it. + if (usesA) return -1; + if (defsA) return 1; + ++Cur; } - if (AScan->isCall()) defsA = true; - if (defsA) { aDead = true; break; } - if (usesA) break; // A used before redef - ++AScan; + return 0; + }; + int aResult = scanAUntilEnd(std::next(Stas.back()), MBB); + if (aResult == 1) { + aDead = true; + } else if (aResult == 0) { + // Unresolved in this MBB — check all successors. + bool allSuccDead = !MBB.succ_empty(); + for (MachineBasicBlock *Succ : MBB.successors()) { + int r = scanAUntilEnd(Succ->begin(), *Succ); + if (r != 1) { allSuccDead = false; break; } + } + if (allSuccDead) aDead = true; } if (!aDead) continue; // Rewrite all STAs to STZ. @@ -1216,5 +1250,214 @@ bool W65816StackRelToImg::runOnMachineFunction(MachineFunction &MF) { } } + // Phase 10: tail-call commutative libcalls in trivial wrapper functions. + // + // For functions whose entire body is essentially `helper(a, b); return;` + // where `helper` is a commutative libgcc multiply (__umulhisi3, __mulhi3), + // the codegen unnecessarily marshals args (PHA + LDA-from-shifted-offset). + // Since multiply is commutative, the caller's positions (A=a, 4,s=b) + // already satisfy the callee's contract. + // + // Pattern: + // REP 48 + // PHA ; pushes A (= arg0) + // LDA_StackRel ; reads arg1 (off = 4 + 2 = 6 post-PHA) + // JSLpseudo32 @helper + // PLY ; cleanup PHA + // RTL + // + // Replace with: + // REP 48 + // JML_Long @helper ; tail-call; helper's RTL returns to OUR caller + // + // 2 inst total — beats Calypsi's 4 for mul16to32. + { + if (MF.size() == 1) { // single MBB only — full function fits + MachineBasicBlock &MBB = MF.front(); + // Collect non-debug ops. + SmallVector Ops; + for (MachineInstr &MI : MBB) { + if (!MI.isDebugInstr()) Ops.push_back(&MI); + } + // Need exactly: REP, (PHA|PUSH16), LDA_StackRel, JSL, PLY, RTL. + if (Ops.size() == 6 && + Ops[0]->getOpcode() == W65816::REP && + (Ops[1]->getOpcode() == W65816::PHA || + Ops[1]->getOpcode() == W65816::PUSH16) && + Ops[2]->getOpcode() == W65816::LDA_StackRel && + Ops[3]->getOpcode() == W65816::JSLpseudo32 && + Ops[4]->getOpcode() == W65816::PLY && + Ops[5]->getOpcode() == W65816::RTL) { + // JSL target must be a commutative 16x16-multiply helper. + bool isCommutativeMul = false; + for (MachineOperand &MO : Ops[3]->operands()) { + StringRef Name; + if (MO.isGlobal()) Name = MO.getGlobal()->getName(); + else if (MO.isSymbol()) Name = MO.getSymbolName(); + else continue; + if (Name == "__umulhisi3" || Name == "__mulhi3") { + isCommutativeMul = true; + break; + } + break; + } + // LDA_StackRel offset should be 6 (caller's arg1 at 4,s, +2 for PHA). + bool offsetOK = Ops[2]->getNumOperands() >= 1 && + Ops[2]->getOperand(0).isImm() && + Ops[2]->getOperand(0).getImm() == 6; + if (isCommutativeMul && offsetOK) { + // Build JML_Long @helper to replace the JSL. + MachineOperand TargetMO = Ops[3]->getOperand(0); // copy + DebugLoc DL = Ops[3]->getDebugLoc(); + // Insert JML_Long before the JSL. + BuildMI(MBB, Ops[3], DL, TII->get(W65816::JML_Long)) + .add(TargetMO); + // Erase PHA, LDA_StackRel, JSL, PLY, RTL. + Ops[1]->eraseFromParent(); + Ops[2]->eraseFromParent(); + Ops[3]->eraseFromParent(); + Ops[4]->eraseFromParent(); + Ops[5]->eraseFromParent(); + Changed = true; + } + } + } + } + + // Phase 11: PHP-wrap-aware STZ peephole. + // + // SDAG emits `PHP ; LDA #0 ; PLP ; STA $X` to write 0 to a DP slot + // while preserving flags from an earlier flag-setter (typically an + // ORA-then-BEQ pattern). Since STZ_DP $X writes 0 without touching + // A or flags, the whole wrap collapses to `STZ_DP $X`. Saves 4 + // inst per occurrence. + // + // Safety: A must be dead after the STA. Use the same successor- + // aware scan as Phase 6. + { + auto scanAUntilEnd2 = [&](MachineBasicBlock::iterator Cur, + MachineBasicBlock &CurrMBB) -> int { + while (Cur != CurrMBB.end()) { + if (Cur->isDebugInstr()) { ++Cur; continue; } + bool usesA = false, defsA = false; + for (const MachineOperand &MO : Cur->operands()) { + if (MO.isReg() && MO.getReg() == W65816::A) { + if (MO.isDef()) defsA = true; + else if (MO.isUse()) usesA = true; + } + } + if (Cur->isCall()) defsA = true; + if (defsA) return 1; + if (usesA) return -1; + ++Cur; + } + return 0; + }; + for (MachineBasicBlock &MBB : MF) { + SmallVector Dead; + SmallVector, 4> NewStz; + for (auto It = MBB.begin(); It != MBB.end(); ++It) { + if (It->getOpcode() != W65816::PHP) continue; + auto Lda = std::next(It); + while (Lda != MBB.end() && Lda->isDebugInstr()) ++Lda; + if (Lda == MBB.end()) continue; + if (Lda->getOpcode() != W65816::LDA_Imm16 && + Lda->getOpcode() != W65816::LDAi16imm) + continue; + if (Lda->getNumOperands() < 2 || !Lda->getOperand(1).isImm()) continue; + if (Lda->getOperand(1).getImm() != 0) continue; + auto Plp = std::next(Lda); + while (Plp != MBB.end() && Plp->isDebugInstr()) ++Plp; + if (Plp == MBB.end() || Plp->getOpcode() != W65816::PLP) continue; + auto Sta = std::next(Plp); + while (Sta != MBB.end() && Sta->isDebugInstr()) ++Sta; + if (Sta == MBB.end() || Sta->getOpcode() != W65816::STA_DP) continue; + if (Sta->getNumOperands() < 1 || !Sta->getOperand(0).isImm()) continue; + int64_t StaAddr = Sta->getOperand(0).getImm(); + // Check A-dead after the STA. + bool aDead = false; + int r = scanAUntilEnd2(std::next(Sta), MBB); + if (r == 1) aDead = true; + else if (r == 0) { + bool allSuccDead = !MBB.succ_empty(); + for (MachineBasicBlock *Succ : MBB.successors()) { + int sr = scanAUntilEnd2(Succ->begin(), *Succ); + if (sr != 1) { allSuccDead = false; break; } + } + if (allSuccDead) aDead = true; + } + if (!aDead) continue; + Dead.push_back(&*It); // PHP + Dead.push_back(&*Lda); + Dead.push_back(&*Plp); + Dead.push_back(&*Sta); + NewStz.push_back({&*Sta, StaAddr}); + } + // Insert STZ_DP before each dead STA (Sta is in NewStz). + for (auto &P : NewStz) { + MachineInstr *Sta = P.first; + DebugLoc DL = Sta->getDebugLoc(); + BuildMI(MBB, Sta, DL, TII->get(W65816::STZ_DP)) + .addImm(P.second); + } + for (MachineInstr *MI : Dead) { + MI->eraseFromParent(); + Changed = true; + } + } + } + + // DP-shift-fold: `LDA_DP X ; LSRA16/ASLA16 ; STA_DP X (same X)` folds + // to `LSR_DP/ASL_DP X` (DP-RMW form) when A is dead after the STA. + // Same semantics, shorter and cheaper. popcount's i32 SRL by 1 hits + // the LSRA case once per iteration; the slot-A is dead after when the + // next op is an LDA-style $a-defining load. + for (MachineBasicBlock &MBB : MF) { + SmallVector ToErase; + for (auto It = MBB.begin(); It != MBB.end();) { + auto Lda = It++; + if (Lda->getOpcode() != W65816::LDA_DP) continue; + if (Lda->getNumOperands() < 1 || !Lda->getOperand(0).isImm()) continue; + int64_t DpAddr = Lda->getOperand(0).getImm(); + auto Shift = std::next(Lda); + while (Shift != MBB.end() && Shift->isDebugInstr()) ++Shift; + if (Shift == MBB.end()) continue; + unsigned ShiftOp = Shift->getOpcode(); + unsigned DpShiftOp = 0; + if (ShiftOp == W65816::LSRA16) { + DpShiftOp = W65816::LSR_DP; + } else if (ShiftOp == W65816::ASLA16) { + DpShiftOp = W65816::ASL_DP; + } else { + continue; + } + auto Sta = std::next(Shift); + while (Sta != MBB.end() && Sta->isDebugInstr()) ++Sta; + if (Sta == MBB.end() || Sta->getOpcode() != W65816::STA_DP) continue; + if (Sta->getNumOperands() < 1 || !Sta->getOperand(0).isImm()) continue; + if (Sta->getOperand(0).getImm() != DpAddr) continue; + // A is dead after Sta iff the next non-debug op defines $a without + // reading it. Conservative: bail if no clear def or if A is read. + auto Next = std::next(Sta); + while (Next != MBB.end() && Next->isDebugInstr()) ++Next; + if (Next == MBB.end()) continue; + if (Next->isBranch() || Next->isReturn() || Next->isCall() || + Next->isInlineAsm()) continue; + bool reads = Next->readsRegister(W65816::A, TRI); + bool defs = Next->modifiesRegister(W65816::A, TRI); + if (reads || !defs) continue; + // Apply: insert LSR_DP/ASL_DP at Lda's position, erase the triplet. + BuildMI(MBB, Lda, Lda->getDebugLoc(), TII->get(DpShiftOp)) + .addImm(DpAddr); + ToErase.push_back(&*Lda); + ToErase.push_back(&*Shift); + ToErase.push_back(&*Sta); + } + for (MachineInstr *MI : ToErase) { + MI->eraseFromParent(); + Changed = true; + } + } + return Changed; } diff --git a/src/llvm/lib/Target/W65816/W65816StackSlotCleanup.cpp b/src/llvm/lib/Target/W65816/W65816StackSlotCleanup.cpp index 56b42c5..0e41f9d 100644 --- a/src/llvm/lib/Target/W65816/W65816StackSlotCleanup.cpp +++ b/src/llvm/lib/Target/W65816/W65816StackSlotCleanup.cpp @@ -301,14 +301,15 @@ static bool tryEliminateLoadAfterStore(MachineBasicBlock &MBB, } }; // Walk past further STAfi pseudos (spill stores) — they preserve - // A's flags. Only walk past STAfi specifically; STA_DP and - // pointer-indirect stores have inserter-driven expansions that - // can introduce flag-touching ops, and walking past those broke - // a printf smoke test. + // A's flags. Also walk past STA_DP (plain `sta $dp` doesn't touch + // P). Don't walk past STA_DPIndLongY / STA8fi / etc., whose + // inserter expansions introduce SEP/REP and mutate the M flag + // (that's what broke printf historically). auto NextIt = std::next(MI.getIterator()); while (NextIt != MBB.end()) { if (NextIt->isDebugInstr()) { ++NextIt; continue; } if (NextIt->getOpcode() == W65816::STAfi) { ++NextIt; continue; } + if (NextIt->getOpcode() == W65816::STA_DP) { ++NextIt; continue; } break; } if (NextIt == MBB.end() || NextIt->isBranch() || NextIt->isReturn()) @@ -316,6 +317,34 @@ static bool tryEliminateLoadAfterStore(MachineBasicBlock &MBB, if (!NextIt->definesRegister(W65816::P, TRI) && !opSetsNZ(NextIt->getOpcode())) return false; + // Eliding the LDA leaves $a "dead per verifier" because STAfi's + // tablegen Defs = [A] is a stale over-approximation (the asm + // actually preserves A via PHA/lda/sta/PLA bracket for IMG/X/Y + // sources, and trivially for $a sources — see W65816InstrInfo.td + // and eliminateFrameIndex). Strip the stale implicit-def $a from + // walked-past STAfis (any source) and clear any kill flag on the + // source operand when source is $a, so the verifier sees $a as + // still alive through the chain. We're post-regalloc so this + // doesn't affect regalloc's decisions — only the verifier and any + // downstream passes that read the annotation. + auto stripStaleAdef = [](MachineInstr &MI2) { + if (MI2.getOpcode() != W65816::STAfi) return; + if (MI2.getNumOperands() < 1 || !MI2.getOperand(0).isReg()) return; + if (MI2.getOperand(0).getReg() == W65816::A) { + MI2.getOperand(0).setIsKill(false); + } + for (unsigned i = MI2.getNumOperands(); i-- > 0;) { + const MachineOperand &MO = MI2.getOperand(i); + if (MO.isReg() && MO.isImplicit() && MO.isDef() && + MO.getReg() == W65816::A) { + MI2.removeOperand(i); + return; + } + } + }; + for (auto FixIt = StaMI.getIterator(); FixIt != MI.getIterator(); ++FixIt) { + stripStaleAdef(*FixIt); + } MI.eraseFromParent(); return true; } @@ -1095,6 +1124,27 @@ bool W65816StackSlotCleanup::runOnMachineFunction(MachineFunction &MF) { break; } } + // LDAfi $a, slotB, 0 — final reload before a DPF0 stage. The + // LDAptr32 inserter emits this shape per pointer half: + // LDAfi $a, srcSlot ; STAfi $a, freshSlot ; [other STAfi] + // LDAfi $a, freshSlot ; STA_DP $E0 + // Pass -2c can elide the round-trip by retargeting the final LDAfi + // to read srcSlot (=SlotA) directly, dropping the LDA+STA pair. + // The final LDAfi is a pure A-write so dropping the earlier Lda1 + // can't break any intervening A-reader. + if (Opc == W65816::LDAfi) { + if (MI.getNumOperands() >= 3 && + MI.getOperand(0).isReg() && + MI.getOperand(0).getReg() == W65816::A && + MI.getOperand(1).isFI() && + MI.getOperand(1).getIndex() == SlotB && + MI.getOperand(2).isImm() && + MI.getOperand(2).getImm() == 0) { + OpfiTarget = &MI; + RewriteIdx = 1; + break; + } + } ++It2; } if (!OpfiTarget) continue; @@ -1757,6 +1807,186 @@ bool W65816StackSlotCleanup::runOnMachineFunction(MachineFunction &MF) { } } + // Pass 1h: collapse dead TAX/TXA bridge around DPF0 staging. When + // SpillToX bridges one of the LDAptr32 inserter's STAfi/LDAfi pairs + // (saving 6 cyc), then Pass -2c collapses the OTHER pair entirely, + // the TAX/TXA bridge becomes pure overhead. Pattern: + // + // LDAfi $a, slotA, 0 ; (1) load ptr_hi (originally for X-bridge) + // TAX ; (2) X = ptr_hi + // LDAfi $a, slotB, 0 ; (3) load ptr_lo (the Pass -2c rewrite target) + // STA_DP imm1 ; (4) $E0 = ptr_lo + // TXA ; (5) recover ptr_hi to A + // STA_DP imm2 ; (6) $E2 = ptr_hi + // + // Reorder to drop the bridge: + // + // LDAfi $a, slotB, 0 ; (3) load ptr_lo + // STA_DP imm1 ; (4) $E0 = ptr_lo + // LDAfi $a, slotA, 0 ; (1) load ptr_hi (moved down) + // STA_DP imm2 ; (6) $E2 = ptr_hi + // + // Saves 2 instructions (~6 cyc) per LDAptr32 expansion. Safe iff X + // is dead after TXA (no read before redef). Common in tight loops + // that deref two pointers per iter (memcmp, strcpy, dotProduct). + for (MachineBasicBlock &MBB : MF) { + SmallVector Ldas; + for (MachineInstr &MI : MBB) { + if (MI.getOpcode() == W65816::LDAfi) { + Ldas.push_back(&MI); + } + } + SmallPtrSet ErasedH; + for (MachineInstr *Lda1 : Ldas) { + if (ErasedH.count(Lda1)) { + continue; + } + int SlotA = matchAccSlotOp(*Lda1, W65816::LDAfi); + if (SlotA == NO_SLOT_MATCH) { + continue; + } + auto It = std::next(Lda1->getIterator()); + if (!advancePastDebug(MBB, It)) { + continue; + } + // Optional `ADCEfi $a (tied), slot, 0` between Lda1 and TAX. + // strcpy emits `LDAfi hi_part ; ADCEfi $a, $stack.9 ; TAX` to + // compute ptr_hi via carry-propagation from a prior ADCfi (lo). + // The ADCEfi's carry-in comes from an earlier ADCfi; intervening + // LDA/STA preserve C, so reordering this pair past STA_DP is safe. + MachineInstr *MaybeAdcE = nullptr; + if (It->getOpcode() == W65816::ADCEfi && + It->getNumOperands() >= 4 && + It->getOperand(0).isReg() && + It->getOperand(0).getReg() == W65816::A) { + MaybeAdcE = &*It; + ++It; + if (!advancePastDebug(MBB, It)) { + continue; + } + } + if (It->getOpcode() != W65816::TAX) { + continue; + } + MachineInstr *Tax = &*It; + ++It; + if (!advancePastDebug(MBB, It)) { + continue; + } + int SlotB = matchAccSlotOp(*It, W65816::LDAfi); + if (SlotB == NO_SLOT_MATCH || SlotB == SlotA) { + continue; + } + MachineInstr *Lda2 = &*It; + ++It; + if (!advancePastDebug(MBB, It)) { + continue; + } + if (It->getOpcode() != W65816::STA_DP) { + continue; + } + MachineInstr *Sta1 = &*It; + ++It; + if (!advancePastDebug(MBB, It)) { + continue; + } + if (It->getOpcode() != W65816::TXA) { + continue; + } + MachineInstr *Txa = &*It; + ++It; + if (!advancePastDebug(MBB, It)) { + continue; + } + if (It->getOpcode() != W65816::STA_DP) { + continue; + } + MachineInstr *Sta2 = &*It; + // Verify X is dead after Txa within this MBB. Tighter check + // than just "until branch/return": if we reach end of MBB or a + // branch without seeing an X-read or X-def, look at successor + // MBBs. X is dead iff no successor's livein set includes X. + // Critical for tight loops (strLen, byte-walk loops) where the + // loop terminator is a branch back to the same MBB. + bool XDeadAfter = true; + bool MustCheckSuccessors = false; + auto checkIt = std::next(Sta2->getIterator()); + while (checkIt != MBB.end()) { + if (checkIt->isDebugInstr()) { + ++checkIt; + continue; + } + if (checkIt->readsRegister(W65816::X, TRI)) { + XDeadAfter = false; + break; + } + if (checkIt->modifiesRegister(W65816::X, TRI)) { + // X redefined before any read — dead range ended. + break; + } + if (checkIt->isCall() || checkIt->isInlineAsm()) { + XDeadAfter = false; + break; + } + if (checkIt->isBranch() || checkIt->isReturn()) { + // Hit the terminator without redef — defer to successor + // liveins to determine if X is live-out. + MustCheckSuccessors = true; + break; + } + ++checkIt; + } + if (checkIt == MBB.end()) { + MustCheckSuccessors = true; + } + if (XDeadAfter && MustCheckSuccessors) { + // X is dead iff no successor lists it as a livein. + for (MachineBasicBlock *Succ : MBB.successors()) { + if (Succ->isLiveIn(W65816::X)) { + XDeadAfter = false; + break; + } + } + } + if (!XDeadAfter) { + continue; + } + // Apply: move Lda1 (and optional ADCEfi) to between Sta1 and + // Sta2, then erase Tax/Txa. Splicing both to Sta2's iterator + // preserves their relative order — second splice ends up nearer + // Sta2, so Lda1 first then MaybeAdcE. + MBB.splice(Sta2->getIterator(), &MBB, Lda1->getIterator()); + if (MaybeAdcE) { + MBB.splice(Sta2->getIterator(), &MBB, MaybeAdcE->getIterator()); + } + Tax->eraseFromParent(); + Txa->eraseFromParent(); + ErasedH.insert(Lda1); + Changed = true; + } + } + + // Pass 1z: re-run Pass 1's load-after-store elimination after Pass 1h. + // Pass 1h's splice may have created newly-adjacent STAfi+LDAfi pairs + // when the moved instructions exposed a producer (e.g., ADCfi) whose + // result was already in A at the LDAfi point. Common in strcpy's + // pointer-arithmetic: `ADCfi $a, lo_off ; STAfi $a, slot ; LDAfi $a, + // slot ; STA_DP` collapses to `ADCfi ; STAfi ; STA_DP` after the LDA + // is recognised as redundant. + for (MachineBasicBlock &MBB : MF) { + SmallVector Stores; + for (MachineInstr &MI : MBB) { + if (MI.getOpcode() == W65816::STAfi) { + Stores.push_back(&MI); + } + } + for (MachineInstr *StaMI : Stores) { + if (tryEliminateLoadAfterStore(MBB, *StaMI, TRI)) { + Changed = true; + } + } + } + // Pass 2: dead stores (STAfi to slot followed by another STAfi to // the same slot with no intervening read). This catches the // arg0_lo "preserve" spill that the regalloc emits even though the diff --git a/src/llvm/lib/Target/W65816/W65816TargetMachine.cpp b/src/llvm/lib/Target/W65816/W65816TargetMachine.cpp index c6281ac..01ef1aa 100644 --- a/src/llvm/lib/Target/W65816/W65816TargetMachine.cpp +++ b/src/llvm/lib/Target/W65816/W65816TargetMachine.cpp @@ -108,6 +108,7 @@ public: } bool addInstSelector() override; + void addIRPasses() override; void addPreRegAlloc() override; void addPostRegAlloc() override; void addPreEmitPass() override; @@ -139,6 +140,16 @@ TargetPassConfig *W65816TargetMachine::createPassConfig(PassManagerBase &PM) { return new W65816PassConfig(*this, PM); } +void W65816PassConfig::addIRPasses() { + TargetPassConfig::addIRPasses(); + // After LSR: undo LSR's pointer-walking transform for global-array + // loops, where the W65816's `lda , X` indexed addressing is + // cheaper than the 24-bit `[dp],Y` deref LSR produces. Doesn't + // affect pointer-arg loops (where LSR's transform is genuinely + // faster) — the pass only matches `phi ptr [GlobalAddress, ...]`. + addPass(createW65816UnLSR()); +} + void W65816PassConfig::addISelPrepare() { // SjLjEHPrepare ran in addPassesToHandleExceptions just before this; // our finalize pass inserts an actual setjmp at function entry + diff --git a/src/llvm/lib/Target/W65816/W65816UnLSR.cpp b/src/llvm/lib/Target/W65816/W65816UnLSR.cpp new file mode 100644 index 0000000..8451bec --- /dev/null +++ b/src/llvm/lib/Target/W65816/W65816UnLSR.cpp @@ -0,0 +1,313 @@ +//===-- W65816UnLSR.cpp - Undo LSR for global-array pointer-walks --------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// +// +// Post-LSR IR pass. LSR converts `for (i; i, X` is 3 bytes / 5 cyc DBR-relative. The +// LDA_AbsX SDAG combine recognizes `(load (add Wrapper, idx))` but +// LSR has destroyed that shape. +// +// This pass detects the shape and converts back: introduce a forward +// counter PHI (0, 1, 2, ...), replace loads/stores through the pointer +// PHI with indexed GEPs `getelementptr T, @global, %i`. The old pointer +// PHI becomes dead and is DCE'd. The existing count-down counter PHI +// stays as the loop control. +// +// Restrictions: +// * Pointer PHI's initial value must be a `GlobalAddress` (otherwise +// it might point at a non-DBR-bank object, and our combine doesn't +// fire / produces wrong code). +// * Pointer PHI must have exactly two incoming values (header + latch). +// * Pointer PHI's only uses must be the stride GEP and loads/stores. +// * Stride must be a positive constant. +// * The loop must have an existing trip-count counter so we don't +// introduce extra register pressure. +// +//===---------------------------------------------------------------------===// + +#include "W65816.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/Analysis/LoopInfo.h" +#include "llvm/Analysis/ScalarEvolution.h" +#include "llvm/InitializePasses.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/InstIterator.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" +#include "llvm/Support/Debug.h" + +using namespace llvm; + +#define DEBUG_TYPE "w65816-un-lsr" + +namespace llvm { +void initializeW65816UnLSRPass(PassRegistry &); +} + +namespace { + +class W65816UnLSR : public FunctionPass { +public: + static char ID; + W65816UnLSR() : FunctionPass(ID) {} + + StringRef getPassName() const override { + return "W65816 undo LSR pointer-walk for global-array access"; + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired(); + AU.setPreservesCFG(); + } + + bool runOnFunction(Function &F) override; + +private: + bool processLoop(Loop *L); +}; + +} // namespace + +char W65816UnLSR::ID = 0; + +INITIALIZE_PASS_BEGIN(W65816UnLSR, DEBUG_TYPE, + "W65816 undo LSR for global-array", false, false) +INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) +INITIALIZE_PASS_END(W65816UnLSR, DEBUG_TYPE, + "W65816 undo LSR for global-array", false, false) + +FunctionPass *llvm::createW65816UnLSR() { return new W65816UnLSR(); } + +bool W65816UnLSR::runOnFunction(Function &F) { + if (F.hasOptNone()) + return false; + LoopInfo &LI = getAnalysis().getLoopInfo(); + bool Changed = false; + for (Loop *L : LI) { + Changed |= processLoop(L); + // Recurse into nested loops. + SmallVector Worklist(L->begin(), L->end()); + while (!Worklist.empty()) { + Loop *Sub = Worklist.pop_back_val(); + Changed |= processLoop(Sub); + Worklist.append(Sub->begin(), Sub->end()); + } + } + return Changed; +} + +bool W65816UnLSR::processLoop(Loop *L) { + BasicBlock *Header = L->getHeader(); + BasicBlock *Latch = L->getLoopLatch(); + if (!Latch) + return false; + // Single-block loops are fine (header == latch). + + // Find a pointer PHI whose initial value is a GlobalAddress and whose + // latch-incoming is a constant-stride GEP off itself. + SmallVector Candidates; + for (PHINode &PN : Header->phis()) { + if (!PN.getType()->isPointerTy()) continue; + if (PN.getNumIncomingValues() != 2) continue; + Candidates.push_back(&PN); + } + + bool Changed = false; + for (PHINode *PtrPHI : Candidates) { + // Identify which incoming is from the preheader vs the latch. + Value *InitVal = nullptr; + Value *StepVal = nullptr; + for (unsigned i = 0; i < PtrPHI->getNumIncomingValues(); ++i) { + BasicBlock *Pred = PtrPHI->getIncomingBlock(i); + Value *Inc = PtrPHI->getIncomingValue(i); + if (L->contains(Pred)) + StepVal = Inc; + else + InitVal = Inc; + } + if (!InitVal || !StepVal) continue; + + // InitVal must be a GlobalAddress (GlobalVariable). Could relax to + // any constant base, but globals are the only case our combine + // handles correctly. + auto *InitGV = dyn_cast(InitVal); + if (!InitGV) continue; + + // StepVal must be a `getelementptr i8, %PtrPHI, ConstantInt`. + auto *StepGEP = dyn_cast(StepVal); + if (!StepGEP) continue; + if (StepGEP->getPointerOperand() != PtrPHI) continue; + if (StepGEP->getNumIndices() != 1) continue; + auto *StrideCI = dyn_cast(StepGEP->getOperand(1)); + if (!StrideCI) continue; + int64_t StrideBytes = StrideCI->getSExtValue(); + if (StrideBytes <= 0) continue; + // Determine element type for the indexed GEP. Walk all loads/ + // stores through PtrPHI; require they all access the same primitive + // type whose size equals StrideBytes (typical: i16 array → stride 2). + Type *ElemTy = nullptr; + SmallVector Accesses; + bool ok = true; + for (User *U : PtrPHI->users()) { + if (U == StepGEP) continue; + if (auto *LD = dyn_cast(U)) { + if (LD->getPointerOperand() != PtrPHI) { ok = false; break; } + Type *T = LD->getType(); + if (!T->isIntegerTy()) { ok = false; break; } + if (!ElemTy) ElemTy = T; + else if (ElemTy != T) { ok = false; break; } + Accesses.push_back(LD); + continue; + } + if (auto *ST = dyn_cast(U)) { + if (ST->getPointerOperand() != PtrPHI) { ok = false; break; } + Type *T = ST->getValueOperand()->getType(); + if (!T->isIntegerTy()) { ok = false; break; } + if (!ElemTy) ElemTy = T; + else if (ElemTy != T) { ok = false; break; } + Accesses.push_back(ST); + continue; + } + // Any other use → bail. + ok = false; + break; + } + if (!ok || !ElemTy || Accesses.empty()) continue; + Module &M = *Header->getModule(); + const DataLayout &DL = M.getDataLayout(); + uint64_t ElemBytes = DL.getTypeAllocSize(ElemTy); + if ((int64_t)ElemBytes != StrideBytes) continue; + + // We have a clean global-array pointer-walk. Build a forward + // counter PHI starting at 0, incrementing by 1. Replace the + // pointer-PHI's loads/stores with `GEP ElemTy, @global, %i`. + LLVMContext &Ctx = Header->getContext(); + IntegerType *I16 = Type::getInt16Ty(Ctx); + IRBuilder<> B(&Header->front()); + PHINode *Counter = B.CreatePHI(I16, 2, "unlsr.i"); + BasicBlock *Preheader = L->getLoopPreheader(); + if (!Preheader) continue; + Counter->addIncoming(ConstantInt::get(I16, 0), Preheader); + // Build the counter increment in the latch, just before the + // terminator. + IRBuilder<> BL(Latch->getTerminator()); + Value *CounterNext = BL.CreateAdd(Counter, ConstantInt::get(I16, 1), + "unlsr.i.next"); + Counter->addIncoming(CounterNext, Latch); + + // Replace each load/store with a GEP-then-load/store. + for (Instruction *Acc : Accesses) { + IRBuilder<> BA(Acc); + Value *Idx = Counter; + // GEP type is i16 elem, idx is i16. + Value *Addr = BA.CreateGEP(ElemTy, InitGV, Idx, "unlsr.addr"); + if (auto *LD = dyn_cast(Acc)) { + LD->setOperand(LoadInst::getPointerOperandIndex(), Addr); + } else if (auto *ST = dyn_cast(Acc)) { + ST->setOperand(StoreInst::getPointerOperandIndex(), Addr); + } + } + // Erase the now-unused step GEP and pointer PHI. + if (StepGEP->use_empty()) StepGEP->eraseFromParent(); + if (PtrPHI->use_empty()) PtrPHI->eraseFromParent(); + + // Try to eliminate the count-down LSR counter (`%lsr.iv = phi i16 + // [%n, preheader], [%lsr.iv.next, latch]; %lsr.iv.next = add %lsr.iv, + // -1; %exitcond = icmp eq %lsr.iv.next, 0`). Replace the exit + // comparison with `icmp eq %unlsr.i.next, %n`, then erase the + // count-down chain. Saves one i16 PHI + dec + cmp per loop. + for (PHINode &LSR : Header->phis()) { + if (&LSR == Counter) continue; + if (!LSR.getType()->isIntegerTy(16)) continue; + if (LSR.getNumIncomingValues() != 2) continue; + // Identify preheader vs latch incomings. + Value *LsrInit = nullptr; + Value *LsrStep = nullptr; + for (unsigned i = 0; i < LSR.getNumIncomingValues(); ++i) { + BasicBlock *Pred = LSR.getIncomingBlock(i); + if (L->contains(Pred)) LsrStep = LSR.getIncomingValue(i); + else LsrInit = LSR.getIncomingValue(i); + } + if (!LsrInit || !LsrStep) continue; + // %lsr.iv.next must be `add %lsr.iv, -1`. + auto *LsrStepBO = dyn_cast(LsrStep); + if (!LsrStepBO || LsrStepBO->getOpcode() != Instruction::Add) continue; + Value *OtherOp = nullptr; + if (LsrStepBO->getOperand(0) == &LSR) OtherOp = LsrStepBO->getOperand(1); + else if (LsrStepBO->getOperand(1) == &LSR) OtherOp = LsrStepBO->getOperand(0); + if (!OtherOp) continue; + auto *DecCI = dyn_cast(OtherOp); + if (!DecCI || !DecCI->isMinusOne()) continue; + // %lsr.iv.next typically has 2 uses: the icmp exit comparison and + // the PHI back-edge (LSR.users includes LsrStepBO as the latch + // incoming). Allow that; find the icmp among the uses. + ICmpInst *ExitCmp = nullptr; + bool extraUse = false; + for (User *U : LsrStepBO->users()) { + if (U == &LSR) continue; + if (auto *IC = dyn_cast(U)) { + if (ExitCmp) { extraUse = true; break; } + ExitCmp = IC; + continue; + } + extraUse = true; + break; + } + if (extraUse || !ExitCmp) continue; + if (ExitCmp->getPredicate() != ICmpInst::ICMP_EQ && + ExitCmp->getPredicate() != ICmpInst::ICMP_NE) continue; + Value *CmpOther = nullptr; + if (ExitCmp->getOperand(0) == LsrStepBO) + CmpOther = ExitCmp->getOperand(1); + else if (ExitCmp->getOperand(1) == LsrStepBO) + CmpOther = ExitCmp->getOperand(0); + if (!CmpOther) continue; + auto *CmpZero = dyn_cast(CmpOther); + if (!CmpZero || !CmpZero->isZero()) continue; + bool lsrOnlyIncrUse = true; + for (User *U : LSR.users()) { + if (U == LsrStepBO) continue; + lsrOnlyIncrUse = false; break; + } + if (!lsrOnlyIncrUse) continue; + // CounterNext was inserted just before the latch terminator, but + // ExitCmp may live higher in the block (originally placed there + // by LSR). Move CounterNext to just before ExitCmp so it + // dominates the cmp's use. + if (auto *CounterNextI = dyn_cast(CounterNext)) + CounterNextI->moveBefore(ExitCmp->getIterator()); + // Replace exit comparison: icmp eq %unlsr.i.next, %lsrInit. + ExitCmp->setOperand(0, CounterNext); + ExitCmp->setOperand(1, LsrInit); + // RAUW each value with undef before erasing — they have a mutual + // reference (PHI → BO via latch-incoming, BO → PHI via add operand). + Type *I16T = LSR.getType(); + LSR.replaceAllUsesWith(UndefValue::get(I16T)); + LsrStepBO->replaceAllUsesWith(UndefValue::get(I16T)); + LsrStepBO->eraseFromParent(); + LSR.eraseFromParent(); + break; + } + + Changed = true; + } + return Changed; +}